@k8slens/injectable 26.2.1 → 26.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +42 -29
- package/index.d.ts +12 -6
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -657,37 +657,40 @@ var privateInjectFor = ({
|
|
|
657
657
|
};
|
|
658
658
|
};
|
|
659
659
|
var createMinimalDi = (di, injectableToBeInstantiated, injectingInjectable, namespacedIdByInjectableMap, getScopedId, checkForNonMaybeCardinality) => {
|
|
660
|
-
const
|
|
661
|
-
register
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
deregister
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
});
|
|
674
|
-
},
|
|
675
|
-
get sourceNamespace() {
|
|
676
|
-
const nsId = namespacedIdByInjectableMap.get(injectingInjectable);
|
|
677
|
-
const lastColon = nsId ? nsId.lastIndexOf(":") : -1;
|
|
678
|
-
return lastColon > 0 ? nsId.slice(0, lastColon) : void 0;
|
|
679
|
-
},
|
|
680
|
-
hasRegistrations: di.hasRegistrations,
|
|
681
|
-
getNumberOfRegistrations: di.getNumberOfRegistrations,
|
|
682
|
-
getNumberOfInstances: di.getNumberOfInstances,
|
|
683
|
-
purge: (alias, ...keyParts) => di.scopedPurge(injectableToBeInstantiated, alias, ...keyParts),
|
|
684
|
-
registeredInLocalScope: (alias) => di.registeredInScopeOf(injectableToBeInstantiated, alias),
|
|
685
|
-
registeredInLocalScopeSubtree: (alias) => di.registeredInSubtreeOf(injectableToBeInstantiated, alias)
|
|
660
|
+
const register = (...injectables) => {
|
|
661
|
+
di.register({
|
|
662
|
+
injectables,
|
|
663
|
+
context: [{ injectable: injectableToBeInstantiated }],
|
|
664
|
+
source: injectableToBeInstantiated
|
|
665
|
+
});
|
|
666
|
+
};
|
|
667
|
+
const deregister = (...injectables) => {
|
|
668
|
+
di.deregister({
|
|
669
|
+
injectables,
|
|
670
|
+
context: [{ injectable: injectableToBeInstantiated }],
|
|
671
|
+
source: injectableToBeInstantiated
|
|
672
|
+
});
|
|
686
673
|
};
|
|
674
|
+
const injectingNamespacedId = namespacedIdByInjectableMap.get(injectingInjectable);
|
|
675
|
+
const lastColon = injectingNamespacedId ? injectingNamespacedId.lastIndexOf(":") : -1;
|
|
676
|
+
const sourceNamespace = lastColon > 0 ? injectingNamespacedId.slice(0, lastColon) : void 0;
|
|
677
|
+
const purge = (alias, ...keyParts) => di.scopedPurge(injectableToBeInstantiated, alias, ...keyParts);
|
|
678
|
+
const registeredInLocalScope = (alias) => di.registeredInScopeOf(injectableToBeInstantiated, alias);
|
|
679
|
+
const registeredInLocalScopeSubtree = (alias) => di.registeredInSubtreeOf(injectableToBeInstantiated, alias);
|
|
687
680
|
if (injectableToBeInstantiated.aliasType === injectableSymbol2) {
|
|
688
681
|
const registeredInjectable = injectableToBeInstantiated.overriddenInjectable || injectableToBeInstantiated;
|
|
689
682
|
return {
|
|
690
|
-
|
|
683
|
+
// Shared with the v1 shape below, down to registeredInLocalScopeSubtree:
|
|
684
|
+
// keep the two lists in step.
|
|
685
|
+
register,
|
|
686
|
+
deregister,
|
|
687
|
+
sourceNamespace,
|
|
688
|
+
hasRegistrations: di.hasRegistrations,
|
|
689
|
+
getNumberOfRegistrations: di.getNumberOfRegistrations,
|
|
690
|
+
getNumberOfInstances: di.getNumberOfInstances,
|
|
691
|
+
purge,
|
|
692
|
+
registeredInLocalScope,
|
|
693
|
+
registeredInLocalScopeSubtree,
|
|
691
694
|
// The identity of what is being instantiated, for instantiate-code
|
|
692
695
|
// shared across injectables (decorators, reusable factories). `id` is a
|
|
693
696
|
// plain read; the scope pair walks the registration tree per read,
|
|
@@ -760,7 +763,17 @@ var createMinimalDi = (di, injectableToBeInstantiated, injectingInjectable, name
|
|
|
760
763
|
injectingInjectable: injectableToBeInstantiated
|
|
761
764
|
});
|
|
762
765
|
return {
|
|
763
|
-
|
|
766
|
+
// Shared with the v2 shape above, down to registeredInLocalScopeSubtree:
|
|
767
|
+
// keep the two lists in step.
|
|
768
|
+
register,
|
|
769
|
+
deregister,
|
|
770
|
+
sourceNamespace,
|
|
771
|
+
hasRegistrations: di.hasRegistrations,
|
|
772
|
+
getNumberOfRegistrations: di.getNumberOfRegistrations,
|
|
773
|
+
getNumberOfInstances: di.getNumberOfInstances,
|
|
774
|
+
purge,
|
|
775
|
+
registeredInLocalScope,
|
|
776
|
+
registeredInLocalScopeSubtree,
|
|
764
777
|
inject: minimalInject,
|
|
765
778
|
injectMany: minimalInjectMany,
|
|
766
779
|
injectWithMeta: minimalInjectWithMeta,
|
|
@@ -2266,4 +2279,4 @@ var getKeyedSingletonCompositeKey = getCompositeKey;
|
|
|
2266
2279
|
registrationDecoratorToken,
|
|
2267
2280
|
toFlatInjectables
|
|
2268
2281
|
});
|
|
2269
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXguanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtLmpzIiwgIi4uL3NyYy9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5LmpzIiwgIi4uL3NyYy9nZXRJbmplY3RhYmxlL2dldEluamVjdGFibGUuanMiLCAiLi4vc3JjL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyLmpzIiwgIi4uL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9pbmplY3Rpb25Ub2tlblRhZy5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0SW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjIuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b2tlbnMuanMiLCAiLi4vc3JjL2NvbXBvc2l0ZS1tYXAvY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2Zhc3RGbG93LmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdEZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3dpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdE1hbnlGb3IuanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXRTY29wZWRJZEZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldE5hbWVzcGFjZWRJZEZvci5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0YWJsZUJ1bmNoL2dldEluamVjdGFibGVCdW5jaC5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0YWJsZUJ1bmNoL2lzSW5qZWN0YWJsZUJ1bmNoLmpzIiwgIi4uL3NyYy9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZS5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3RvRmxhdEluamVjdGFibGVzLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvZ2V0UmVsYXRlZFRva2Vucy5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldFJlbGF0ZWRJbmplY3RhYmxlc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3JlZ2lzdGVyLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHVyZ2VJbnN0YW5jZXMuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9kZXJlZ2lzdGVyLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvb3ZlcnJpZGUuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9jaGVja0Zvck5vTWF0Y2hlc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yVG9vTWFueU1hdGNoZXMuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9jaGVja0ZvclNpZGVFZmZlY3RzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JVbmRlY2xhcmVkQ29uc3VtcHRpb25Gb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci92YWxpZGF0ZS5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2Vhcmx5LW92ZXJyaWRlLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvd2l0aFByZUluamVjdENhbGxiYWNrc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2ZpcmVQdXJnZUNhbGxiYWNrc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvaW5qZWN0aW9uVG9rZW5SZXNvbHV0aW9uRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY3JlYXRlQ29udGFpbmVyLmpzIiwgIi4uL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9nZXRUeXBlZFNwZWNpZmllci5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IGNyZWF0ZUNvbnRhaW5lciBmcm9tICcuL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY3JlYXRlQ29udGFpbmVyJztcblxuaW1wb3J0IGdldEluamVjdGFibGUgZnJvbSAnLi9zcmMvZ2V0SW5qZWN0YWJsZS9nZXRJbmplY3RhYmxlJztcbmltcG9ydCBnZXRJbmplY3RhYmxlMiBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5pbXBvcnQgaXNJbmplY3RhYmxlIGZyb20gJy4vc3JjL2dldEluamVjdGFibGUvaXNJbmplY3RhYmxlJztcbmltcG9ydCBsaWZlY3ljbGVFbnVtIGZyb20gJy4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtJztcblxuaW1wb3J0IHtcbiAgZ2V0SW5qZWN0aW9uVG9rZW4sXG4gIGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4sXG59IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2dldEluamVjdGlvblRva2VuJztcblxuaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSAnLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4yL2dldEluamVjdGlvblRva2VuMic7XG5cbmltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuXG5pbXBvcnQgZ2V0SW5qZWN0YWJsZUJ1bmNoIGZyb20gJy4vc3JjL2dldEluamVjdGFibGVCdW5jaC9nZXRJbmplY3RhYmxlQnVuY2gnO1xuaW1wb3J0IGlzSW5qZWN0YWJsZUJ1bmNoIGZyb20gJy4vc3JjL2dldEluamVjdGFibGVCdW5jaC9pc0luamVjdGFibGVCdW5jaCc7XG5pbXBvcnQgdG9GbGF0SW5qZWN0YWJsZXMgZnJvbSAnLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3RvRmxhdEluamVjdGFibGVzJztcbmltcG9ydCB7IGdldENvbXBvc2l0ZUtleSB9IGZyb20gJy4vc3JjL2dldENvbXBvc2l0ZUtleS9nZXRDb21wb3NpdGVLZXknO1xuXG5leHBvcnQgeyBnZXRUeXBlZFNwZWNpZmllciB9IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2dldFR5cGVkU3BlY2lmaWVyJztcbmV4cG9ydCB7IGluamVjdGlvblRva2VuVGFnIH0gZnJvbSAnLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vaW5qZWN0aW9uVG9rZW5UYWcnO1xuXG5leHBvcnQgY29uc3QgZ2V0S2V5ZWRTaW5nbGV0b25Db21wb3NpdGVLZXkgPSBnZXRDb21wb3NpdGVLZXk7XG5cblxuXG5leHBvcnQge1xuICBkZXJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gIGRlcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbixcbiAgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICBwcmVJbmplY3RDYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbn0gZnJvbSAnLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3Rva2Vucyc7XG5cbmV4cG9ydCB7XG4gIGNyZWF0ZUNvbnRhaW5lcixcbiAgZ2V0SW5qZWN0YWJsZSxcbiAgZ2V0SW5qZWN0YWJsZTIsXG4gIGlzSW5qZWN0YWJsZSxcbiAgZ2V0SW5qZWN0YWJsZUJ1bmNoLFxuICBpc0luamVjdGFibGVCdW5jaCxcbiAgZ2V0SW5qZWN0aW9uVG9rZW4sXG4gIGdldEluamVjdGlvblRva2VuMixcbiAgZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbixcbiAgaXNJbmplY3Rpb25Ub2tlbixcbiAgbGlmZWN5Y2xlRW51bSxcbiAgdG9GbGF0SW5qZWN0YWJsZXMsXG59O1xuIiwgImV4cG9ydCBjb25zdCBub25TdG9yZWRJbnN0YW5jZUtleSA9IFN5bWJvbCgnbm9uLXN0b3JlZC1pbnN0YW5jZS1rZXknKTtcbmV4cG9ydCBjb25zdCBzdG9yZWRJbnN0YW5jZUtleSA9IFN5bWJvbCgnc3RvcmVkLWluc3RhbmNlLWtleScpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNpbmdsZXRvbjoge1xuICAgIGlkOiAnc2luZ2xldG9uJyxcblxuICAgIGdldEluc3RhbmNlS2V5OiAoKSA9PiBzdG9yZWRJbnN0YW5jZUtleSxcbiAgfSxcblxuICBrZXllZFNpbmdsZXRvbjogKHsgZ2V0SW5zdGFuY2VLZXkgfSkgPT4gKHtcbiAgICBpZDogJ2tleWVkU2luZ2xldG9uJyxcbiAgICBnZXRJbnN0YW5jZUtleSxcbiAgfSksXG5cbiAgdHJhbnNpZW50OiB7XG4gICAgaWQ6ICd0cmFuc2llbnQnLFxuICAgIGdldEluc3RhbmNlS2V5OiAoKSA9PiBub25TdG9yZWRJbnN0YW5jZUtleSxcbiAgfSxcbn07XG4iLCAiZXhwb3J0IGNvbnN0IGNvbXBvc2l0ZUtleVN5bWJvbCA9IFN5bWJvbCgnY29tcG9zaXRlLWtleScpO1xuZXhwb3J0IGNvbnN0IGdldENvbXBvc2l0ZUtleSA9ICguLi5rZXlzKSA9PiAoe1xuICBbY29tcG9zaXRlS2V5U3ltYm9sXTogdHJ1ZSxcbiAga2V5cyxcbn0pO1xuXG5leHBvcnQgY29uc3QgaXNDb21wb3NpdGVLZXkgPSB0aGluZyA9PlxuICB0aGluZyAmJiB0aGluZ1tjb21wb3NpdGVLZXlTeW1ib2xdID09PSB0cnVlO1xuIiwgImltcG9ydCBsaWZlY3ljbGVFbnVtIGZyb20gJy4uL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtJztcblxuZXhwb3J0IGNvbnN0IGluamVjdGFibGVTeW1ib2wgPSAnaW5qZWN0YWJsZSc7XG5cbmV4cG9ydCBkZWZhdWx0ICh7IGxpZmVjeWNsZSA9IGxpZmVjeWNsZUVudW0uc2luZ2xldG9uLCAuLi5pbmplY3RhYmxlIH0pID0+ICh7XG4gIGFsaWFzVHlwZTogaW5qZWN0YWJsZVN5bWJvbCxcbiAgbGlmZWN5Y2xlLFxuICAuLi5pbmplY3RhYmxlLFxufSk7XG4iLCAiaW1wb3J0IGxpZmVjeWNsZUVudW0gZnJvbSAnLi4vZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuLi9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvbGlmZWN5Y2xlRW51bSc7XG5pbXBvcnQgeyBnZXRDb21wb3NpdGVLZXkgfSBmcm9tICcuLi9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5JztcblxuZXhwb3J0IGNvbnN0IGluamVjdGFibGVTeW1ib2wyID0gJ2luamVjdGFibGUyJztcblxuLy8gSG9pc3RlZCBhbmQgc2hhcmVkIGFjcm9zcyBldmVyeSBub24tdHJhbnNpZW50IGdldEluamVjdGFibGUyIFx1MjAxNCBzYXZlcyBhXG4vLyBwZXItY2FsbCBsaWZlY3ljbGUgYWxsb2NhdGlvbiwgYW5kIHRoZSBgX2lzVjJEZWZhdWx0TGlmZWN5Y2xlYCB0YWcgbGV0c1xuLy8gcHJpdmF0ZUluamVjdEZvciBza2lwIHRoZSBnZXRJbnN0YW5jZUtleSBjYWxsICsga2V5LWFycmF5IGFsbG9jYXRpb24gd2hlblxuLy8gYSB2MiBpbmplY3RhYmxlIGlzIGluamVjdGVkIHdpdGggbm8gYXJncyAodGhlIGNvbW1vbiBjYXNlIGZvclxuLy8gbm9uLXBhcmFtZXRyaWMgdjIpLiBUaGUgdGFnIGlzIHRoZSAqb25seSogc2lnbmFsIHdlIHRydXN0IHRvIGJ5cGFzc1xuLy8gZ2V0SW5zdGFuY2VLZXkgYmVjYXVzZSB1c2VyLXByb3ZpZGVkIGdldEluc3RhbmNlS2V5IG1heSBsZWdpdGltYXRlbHlcbi8vIHJldHVybiBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc3RvcmVkSW5zdGFuY2VLZXlgIGZvciBlbXB0eSBhcmdzLlxuY29uc3QgdjJEZWZhdWx0TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRW51bS5rZXllZFNpbmdsZXRvbih7XG4gIGdldEluc3RhbmNlS2V5OiAoZGksIC4uLmFyZ3MpID0+IHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiBzdG9yZWRJbnN0YW5jZUtleTtcbiAgICByZXR1cm4gZ2V0Q29tcG9zaXRlS2V5KC4uLmFyZ3MpO1xuICB9LFxufSk7XG5cbnYyRGVmYXVsdExpZmVjeWNsZS5faXNWMkRlZmF1bHRMaWZlY3ljbGUgPSB0cnVlO1xuXG5leHBvcnQgZGVmYXVsdCAoeyBpbnN0YW50aWF0ZSwgdHJhbnNpZW50ID0gZmFsc2UsIC4uLnJlc3QgfSkgPT4gKHtcbiAgYWxpYXNUeXBlOiBpbmplY3RhYmxlU3ltYm9sMixcbiAgaW5zdGFudGlhdGUsXG4gIHRyYW5zaWVudCxcbiAgbGlmZWN5Y2xlOiB0cmFuc2llbnQgPyBsaWZlY3ljbGVFbnVtLnRyYW5zaWVudCA6IHYyRGVmYXVsdExpZmVjeWNsZSxcbiAgLi4ucmVzdCxcbn0pO1xuIiwgIi8vIFRoZSBpbml0aWFsIHRhZyBjYXJyaWVkIGJ5IGV2ZXJ5IGluamVjdGlvbiB0b2tlbiAodjEgYW5kIHYyKSwgcGVybWl0dGluZ1xuLy8gdGFnLWtleWVkIGRlY29yYXRvcnMgdG8gdGFyZ2V0IGFueSB0b2tlbiwgZS5nLlxuLy8gYGluamVjdGlvbkRlY29yYXRvclRva2VuLmZvcihpbmplY3Rpb25Ub2tlblRhZylgLlxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuVGFnID0gJ2luamVjdGlvblRva2VuJztcbiIsICJpbXBvcnQgeyBpbmplY3Rpb25Ub2tlblRhZyB9IGZyb20gJy4vaW5qZWN0aW9uVG9rZW5UYWcnO1xuXG5leHBvcnQgY29uc3QgaW5qZWN0aW9uVG9rZW5TeW1ib2wgPSAnaW5qZWN0aW9uLXRva2VuJztcblxuZXhwb3J0IGNvbnN0IGdldEluamVjdGlvblRva2VuID0gKHtcbiAgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3Rvcnk6IHNwZWNpZmljVG9rZW5GYWN0b3J5ID0gZ2V0U3BlY2lmaWNUb2tlbkJ5SWQsXG5cbiAgdGFyZ2V0LFxuXG4gIHRhZ3MsXG5cbiAgLi4ucmVzdFxufSkgPT4ge1xuICBjb25zdCBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eSA9IG5ldyBNYXAoKTtcblxuICAvLyBUaGUgZmFjdG9yeSBpcyBhc3N1bWVkIHB1cmUgYW5kIGRldGVybWluaXN0aWM6IGEgc3BlY2lmaWVyIGFsd2F5cyBtYXBzXG4gIC8vIHRvIHRoZSBzYW1lIHRva2VuLCBzbyBzaW5nbGUtc3BlY2lmaWVyIGNhbGxzIGFyZSBtZW1vaXplZCBieSBzcGVjaWZpZXJcbiAgLy8gdG8gc2tpcCBjb25zdHJ1Y3RpbmcgYSB0aHJvd2F3YXkgY2FuZGlkYXRlIG9uIHJlcGVhdCBgLmZvcigpYCBjYWxscy5cbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllciA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZW5lcmFsVG9rZW4gPSBPYmplY3QuYXNzaWduKHRhcmdldCA/PyB7fSwge1xuICAgIC4uLnJlc3QsXG5cbiAgICB0YWdzOiBbaW5qZWN0aW9uVG9rZW5UYWcsIC4uLih0YWdzID8/IFtdKV0sXG5cbiAgICBhbGlhc1R5cGU6IGluamVjdGlvblRva2VuU3ltYm9sLFxuXG4gICAgZm9yOiAoLi4uc3BlY2lmaWVycykgPT4ge1xuICAgICAgY29uc3QgbWVtb2l6ZWRUb2tlbiA9XG4gICAgICAgIHNwZWNpZmllcnMubGVuZ3RoID09PSAxXG4gICAgICAgICAgPyBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLmdldChzcGVjaWZpZXJzWzBdKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobWVtb2l6ZWRUb2tlbikge1xuICAgICAgICByZXR1cm4gbWVtb2l6ZWRUb2tlbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3BlY2lmaWNUb2tlbkNhbmRpZGF0ZSA9IHNwZWNpZmljVG9rZW5GYWN0b3J5KC4uLnNwZWNpZmllcnMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5nZXQoXG4gICAgICAgIHNwZWNpZmljVG9rZW5DYW5kaWRhdGUuc3BlY2lhbGl0eSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChleGlzdGluZ1NwZWNpZmljVG9rZW4pIHtcbiAgICAgICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgZXhpc3RpbmdTcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGlzdGluZ1NwZWNpZmljVG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlO1xuXG4gICAgICBzcGVjaWZpY1Rva2VuLmlkID0gYCR7Z2VuZXJhbFRva2VuLmlkfS8ke3NwZWNpZmljVG9rZW4uaWR9YDtcbiAgICAgIHNwZWNpZmljVG9rZW4uc3BlY2lmaWNUb2tlbk9mID0gZ2VuZXJhbFRva2VuO1xuICAgICAgc3BlY2lmaWNUb2tlbi5tYXhDYWNoZVNpemUgPSBnZW5lcmFsVG9rZW4ubWF4Q2FjaGVTaXplO1xuICAgICAgc3BlY2lmaWNUb2tlbi50YWdzID0gZ2VuZXJhbFRva2VuLnRhZ3M7XG5cbiAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWFsaXR5LnNldChzcGVjaWZpY1Rva2VuLnNwZWNpYWxpdHksIHNwZWNpZmljVG9rZW4pO1xuXG4gICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgc3BlY2lmaWNUb2tlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzcGVjaWZpY1Rva2VuO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBnZW5lcmFsVG9rZW47XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbiA9ICguLi5hcmdzKSA9PlxuICBnZXRJbmplY3Rpb25Ub2tlbiguLi5hcmdzKTtcblxuY29uc3QgZ2V0U3BlY2lmaWNUb2tlbkJ5SWQgPSBpZCA9PiBnZXRJbmplY3Rpb25Ub2tlbih7IGlkLCBzcGVjaWFsaXR5OiBpZCB9KTtcbiIsICJpbXBvcnQgeyBpbmplY3Rpb25Ub2tlblRhZyB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2luamVjdGlvblRva2VuVGFnJztcblxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuU3ltYm9sMiA9ICdpbmplY3Rpb24tdG9rZW4yJztcblxuY29uc3QgY2FyZGluYWxpdGllcyA9IFsnb25lJywgJ3plcm8tb3Itb25lJywgJ3plcm8tb3ItbWFueScsICdvbmUtb3ItbWFueSddO1xuXG5jb25zdCBidWlsZFRva2VuID0gKHtcbiAgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnksXG4gIHRhcmdldCxcbiAgdGFncyxcbiAgLi4ucmVzdFxufSkgPT4ge1xuICAvLyBBIHNwZWNpZmljIHRva2VuIG1heSBkZWNsYXJlIGl0cyBvd24gY2FyZGluYWxpdHkgXHUyMDE0IGl0cyBmYW1pbHkncyBnZW5lcmFsXG4gIC8vIHRva2VuIG9mdGVuIGhhcyBhIGRpZmZlcmVudCBvbmUgXHUyMDE0IGFuZCBpbmhlcml0cyB3aGVuIGl0IGRvZXMgbm90LCB3aGljaFxuICAvLyBpcyB3aHkgb25seSBnZW5lcmFsIHRva2VucyBhcmUgcmVxdWlyZWQgdG8gZGVjbGFyZS5cbiAgaWYgKHJlc3QuY2FyZGluYWxpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChyZXN0LnNwZWNpYWxpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gY3JlYXRlIGluamVjdGlvbiB0b2tlbiBcIiR7cmVzdC5pZH1cIiB3aXRob3V0IGNhcmRpbmFsaXR5LmAsXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmICghY2FyZGluYWxpdGllcy5pbmNsdWRlcyhyZXN0LmNhcmRpbmFsaXR5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUcmllZCB0byBjcmVhdGUgaW5qZWN0aW9uIHRva2VuIFwiJHtyZXN0LmlkfVwiIHdpdGggdW5rbm93biBjYXJkaW5hbGl0eSBcIiR7cmVzdC5jYXJkaW5hbGl0eX1cIi5gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eSA9IG5ldyBNYXAoKTtcblxuICAvLyBUaGUgZmFjdG9yeSBpcyBhc3N1bWVkIHB1cmUgYW5kIGRldGVybWluaXN0aWM6IGEgc3BlY2lmaWVyIGFsd2F5cyBtYXBzXG4gIC8vIHRvIHRoZSBzYW1lIHRva2VuLCBzbyBzaW5nbGUtc3BlY2lmaWVyIGNhbGxzIGFyZSBtZW1vaXplZCBieSBzcGVjaWZpZXJcbiAgLy8gdG8gc2tpcCBjb25zdHJ1Y3RpbmcgYSB0aHJvd2F3YXkgY2FuZGlkYXRlIG9uIHJlcGVhdCBgLmZvcigpYCBjYWxscy5cbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllciA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZW5lcmFsVG9rZW4gPSBPYmplY3QuYXNzaWduKHRhcmdldCA/PyB7fSwge1xuICAgIC4uLnJlc3QsXG5cbiAgICB0YWdzOiBbaW5qZWN0aW9uVG9rZW5UYWcsIC4uLih0YWdzID8/IFtdKV0sXG5cbiAgICBhbGlhc1R5cGU6IGluamVjdGlvblRva2VuU3ltYm9sMixcblxuICAgIC8vIE5vIGZhY3RvcnkgbWVhbnMgbm8gYC5mb3IoKWAgYXQgYWxsLCBtYXRjaGluZyB0aGUgdHlwZTogYSB0b2tlbiBpc24ndFxuICAgIC8vIHJlcXVpcmVkIHRvIGJlIHBhcnQgb2YgYSBmYW1pbHkuIEEgZmFjdG9yeSBhbHNvIG1ha2VzIHRoZSB0b2tlblxuICAgIC8vIGFic3RyYWN0OiBpdCdzIG9ubHkgZXZlciB1c2VmdWwgcmVzb2x2ZWQgdmlhIGEgcmVhbCBgLmZvcigpYCwgc28gaXRcbiAgICAvLyBjYW5ub3QgYmUgaW5qZWN0ZWQvcmVnaXN0ZXJlZCBkaXJlY3RseSBcdTIwMTQgc2VlIGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvclxuICAgIC8vIGFuZCByZWdpc3Rlci5qcydzIGBpbmplY3Rpb25Ub2tlbj8uYWJzdHJhY3RgIGNoZWNrLlxuICAgIC4uLihzcGVjaWZpY0luamVjdGlvblRva2VuRmFjdG9yeSAmJiB7XG4gICAgICBhYnN0cmFjdDogdHJ1ZSxcblxuICAgICAgZm9yOiAoLi4uc3BlY2lmaWVycykgPT4ge1xuICAgICAgICBjb25zdCBtZW1vaXplZFRva2VuID1cbiAgICAgICAgICBzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgPyBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLmdldChzcGVjaWZpZXJzWzBdKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVG9rZW4pIHtcbiAgICAgICAgICByZXR1cm4gbWVtb2l6ZWRUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW5DYW5kaWRhdGUgPSBzcGVjaWZpY0luamVjdGlvblRva2VuRmFjdG9yeShcbiAgICAgICAgICAuLi5zcGVjaWZpZXJzLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWNUb2tlbiA9IHNwZWNpZmljVG9rZW5zQnlTcGVjaWFsaXR5LmdldChcbiAgICAgICAgICBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlLnNwZWNpYWxpdHksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGV4aXN0aW5nU3BlY2lmaWNUb2tlbikge1xuICAgICAgICAgIGlmIChzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgZXhpc3RpbmdTcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdTcGVjaWZpY1Rva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BlY2lmaWNUb2tlbiA9IHNwZWNpZmljVG9rZW5DYW5kaWRhdGU7XG5cbiAgICAgICAgc3BlY2lmaWNUb2tlbi5pZCA9IGAke2dlbmVyYWxUb2tlbi5pZH0vJHtzcGVjaWZpY1Rva2VuLmlkfWA7XG4gICAgICAgIHNwZWNpZmljVG9rZW4uc3BlY2lmaWNUb2tlbk9mID0gZ2VuZXJhbFRva2VuO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLm1heENhY2hlU2l6ZSA9IGdlbmVyYWxUb2tlbi5tYXhDYWNoZVNpemU7XG4gICAgICAgIHNwZWNpZmljVG9rZW4udGFncyA9IGdlbmVyYWxUb2tlbi50YWdzO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLmNhcmRpbmFsaXR5ID1cbiAgICAgICAgICBzcGVjaWZpY1Rva2VuLmNhcmRpbmFsaXR5ID8/IGdlbmVyYWxUb2tlbi5jYXJkaW5hbGl0eTtcblxuICAgICAgICBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5zZXQoc3BlY2lmaWNUb2tlbi5zcGVjaWFsaXR5LCBzcGVjaWZpY1Rva2VuKTtcblxuICAgICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLnNldChzcGVjaWZpZXJzWzBdLCBzcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzcGVjaWZpY1Rva2VuO1xuICAgICAgfSxcbiAgICB9KSxcbiAgfSk7XG5cbiAgcmV0dXJuIGdlbmVyYWxUb2tlbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbmplY3Rpb25Ub2tlbjIgPSAoLi4uYXJncykgPT4ge1xuICAvLyBBIHNpbmdsZSwgbm9uLWN1cnJpZWQgY2FsbDogb3B0aW9ucyBnaXZlbiBkaXJlY3RseSwgZmFjdG9yeSBjdXJyaWVkIGFzXG4gIC8vIGl0cyBvd24gdHJhaWxpbmcgY2FsbCBcdTIwMTQgZ2V0SW5qZWN0aW9uVG9rZW4yKG9wdGlvbnMpKGZhY3RvcnkpLCBvclxuICAvLyBnZXRJbmplY3Rpb25Ub2tlbjIob3B0aW9ucykoKSBmb3IgYSBjb25jcmV0ZSB0b2tlbiB3aXRoIG5vIGAuZm9yKClgIGF0XG4gIC8vIGFsbC4gUGFzc2luZyBhIGZhY3RvcnkgYWxzbyBtYWtlcyB0aGUgdG9rZW4gYWJzdHJhY3QgXHUyMDE0IHNlZSBidWlsZFRva2VuLlxuICAvLyBUaGUgZXhwbGljaXQtU0YgZXNjYXBlIGhhdGNoIChnZXRJbmplY3Rpb25Ub2tlbjI8RiwgTUYsIFNGPihvcHRpb25zKSlcbiAgLy8gdXNlcyB0aGlzIGV4YWN0IHNhbWUgc2hhcGUsIGZhY3RvcnkganVzdCBvcHRpb25hbCBvbiB0aGUgdHJhaWxpbmcgY2FsbFxuICAvLyBpbnN0ZWFkIG9mIHJlcXVpcmVkIFx1MjAxNCBub3RoaW5nIGRpc3Rpbmd1aXNoZXMgdGhlbSBhdCBydW50aW1lLCBzaW5jZSBTRlxuICAvLyBiZWluZyBzcGVsbGVkIG91dCBleHBsaWNpdGx5IHZzIGluZmVycmVkIGZyb20gdGhlIGZhY3RvcnkgdmFsdWUgaXNcbiAgLy8gZXJhc2VkIGJ5IHRoZSB0aW1lIHRoaXMgY29kZSBydW5zLlxuICAvL1xuICAvLyBBIGBzcGVjaWFsaXR5YCBpbiBvcHRpb25zIGJ1aWxkcyBhIHNwZWNpZmljIHRva2VuIGRpcmVjdGx5IFx1MjAxNCB0aGlzIGlzIGhvd1xuICAvLyBnZXRTcGVjaWZpY0luamVjdGlvblRva2VuMiB1c2VkIHRvIGJlIGl0cyBvd24gZnVuY3Rpb247IGZvbGRlZCBpbiBoZXJlXG4gIC8vIHNpbmNlIGJ1aWxkVG9rZW4gYWxyZWFkeSB0aHJlYWRzIGBzcGVjaWFsaXR5YCB0aHJvdWdoIHZpYSBgLi4ucmVzdGBcbiAgLy8gcmVnYXJkbGVzcyBvZiB3aGljaCBjcmVhdG9yIGlzIGNhbGxlZC4gVW5saWtlIHRoZSBvbGRcbiAgLy8gZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbjIsIHRoaXMgYWxzbyBhY2NlcHRzIGEgZmFjdG9yeSwgc28gYSBzcGVjaWZpY1xuICAvLyB0b2tlbiBjYW4gaXRzZWxmIGJlIGEgZmFtaWx5IHJvb3QgZm9yIG5lc3RlZCBzcGVjaWZpY2l0eSBcdTIwMTQgc2VlIHRoZVxuICAvLyBjb21tZW50IG9uIGJ1aWxkVG9rZW4gZm9yIHdoeSB0aGF0IG1ha2VzIGl0IGFic3RyYWN0IHRvby5cbiAgaWYgKGFyZ3MubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRyaWVkIHRvIGNyZWF0ZSBpbmplY3Rpb24gdG9rZW4ke1xuICAgICAgICBhcmdzWzBdPy5pZCA/IGAgXCIke2FyZ3NbMF0uaWR9XCJgIDogJydcbiAgICAgIH0gd2l0aCAke1xuICAgICAgICBhcmdzLmxlbmd0aFxuICAgICAgfSBhcmd1bWVudHM7IGdldEluamVjdGlvblRva2VuMiB0YWtlcyBleGFjdGx5IG9uZSAob3B0aW9ucykuYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgW29wdGlvbnNdID0gYXJncztcblxuICByZXR1cm4gc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkgPT5cbiAgICBidWlsZFRva2VuKHsgLi4ub3B0aW9ucywgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkgfSk7XG59O1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuIH0gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0SW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4yL2dldEluamVjdGlvblRva2VuMic7XG5cbi8vIE1hY2hpbmVyeSB0b2tlbnMgY2Fycnkgbm8gdGFnczogdGFnIGRpc3BhdGNoIHJlYWRzIHRoZSB0YXJnZXQncyB0b2tlblxuLy8gY2hhaW4sIHNvIGEgZGVjb3JhdG9yIHJlZ2lzdGVyZWQgdW5kZXIgZS5nLlxuLy8gYGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbi5mb3IoJ2luamVjdGlvblRva2VuJylgIHdvdWxkIG90aGVyd2lzZSBiZVxuLy8gZm91bmQgdmlhIGl0cyBvd24gcmVnaXN0cmF0aW9uIHRva2VuIGR1cmluZyBpdHMgb3duIGluc3RhbnRpYXRpb24gXHUyMDE0XG4vLyBpbmZpbml0ZSByZWN1cnNpb24uIGAuZm9yKClgIGNoaWxkcmVuIGNvcHkgdGhlIGdlbmVyYWwgdG9rZW4ncyB0YWdzIGF0XG4vLyBjcmVhdGlvbiwgc28gdGhlIGV4ZW1wdGlvbiBwcm9wYWdhdGVzIHRvIHRoZW0uIChTYW1lIHJvbGUgdGhlIHJlbW92ZWRcbi8vIGBkZWNvcmFibGU6IGZhbHNlYCBmbGFnIGhhZC4pXG5jb25zdCB1bnRhZ2dlZCA9IHRva2VuID0+IHtcbiAgdG9rZW4udGFncyA9IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRva2VuO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4oe1xuICAgIGlkOiAncmVnaXN0cmF0aW9uLWNhbGxiYWNrLXRva2VuJyxcbiAgfSksXG4pO1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuKHtcbiAgICBpZDogJ2RlcmVnaXN0cmF0aW9uLWNhbGxiYWNrLXRva2VuJyxcbiAgfSksXG4pO1xuXG5leHBvcnQgY29uc3QgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdpbnN0YW50aWF0ZS1kZWNvcmF0b3ItdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG5cbmV4cG9ydCBjb25zdCBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnaW5qZWN0aW9uLWRlY29yYXRvci10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdpbnN0YW5jZS1wdXJnZS1jYWxsYmFjay10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdyZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRva2VuJyxcbiAgICBjYXJkaW5hbGl0eTogJ3plcm8tb3ItbWFueScsXG4gIH0pKHRhcmdldCA9PiBnZXRJbmplY3Rpb25Ub2tlbjIoeyBpZDogdGFyZ2V0LmlkLCBzcGVjaWFsaXR5OiB0YXJnZXQgfSkoKSksXG4pO1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnZGVyZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRva2VuJyxcbiAgICBjYXJkaW5hbGl0eTogJ3plcm8tb3ItbWFueScsXG4gIH0pKHRhcmdldCA9PiBnZXRJbmplY3Rpb25Ub2tlbjIoeyBpZDogdGFyZ2V0LmlkLCBzcGVjaWFsaXR5OiB0YXJnZXQgfSkoKSksXG4pO1xuXG5leHBvcnQgY29uc3QgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAncHJlLWluamVjdC1jYWxsYmFjay10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcbiIsICJjb25zdCBpc09iamVjdEtleSA9IGtleSA9PlxuICAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYga2V5ICE9PSBudWxsKSB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nO1xuXG5jb25zdCBtYWtlTm9kZSA9ICgpID0+ICh7XG4gIGxheWVyOiBuZXcgTWFwKCksXG4gIHdlYWtMYXllcjogbmV3IFdlYWtNYXAoKSxcbiAgY2hpbGRyZW46IG5ldyBNYXAoKSxcbiAgd2Vha0NoaWxkcmVuOiBuZXcgV2Vha01hcCgpLFxuICBoYXNXZWFrRW50cmllczogZmFsc2UsXG59KTtcblxuZXhwb3J0IGNsYXNzIENvbXBvc2l0ZU1hcCB7XG4gICNpbnRlcm5hbE1hcCA9IG1ha2VOb2RlKCk7XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlcyA9IFtdKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaW5pdGlhbFZhbHVlcykge1xuICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgI2xheWVyRm9yKG1hcEVudHJ5LCBrZXkpIHtcbiAgICByZXR1cm4gaXNPYmplY3RLZXkoa2V5KSA/IG1hcEVudHJ5LndlYWtMYXllciA6IG1hcEVudHJ5LmxheWVyO1xuICB9XG5cbiAgI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBrZXkpIHtcbiAgICByZXR1cm4gaXNPYmplY3RLZXkoa2V5KSA/IG1hcEVudHJ5LndlYWtDaGlsZHJlbiA6IG1hcEVudHJ5LmNoaWxkcmVuO1xuICB9XG5cbiAgI3NldChtYXBFbnRyeSwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IGtleVswXTtcbiAgICAgIHRoaXMuI2xheWVyRm9yKG1hcEVudHJ5LCBmaXJzdCkuc2V0KGZpcnN0LCB2YWx1ZSk7XG4gICAgICBpZiAoaXNPYmplY3RLZXkoZmlyc3QpKSBtYXBFbnRyeS5oYXNXZWFrRW50cmllcyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBrZXk7XG4gICAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCk7XG4gICAgICBsZXQgbmV4dE1hcEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGZpcnN0KTtcblxuICAgICAgaWYgKCFuZXh0TWFwRW50cnkpIHtcbiAgICAgICAgbmV4dE1hcEVudHJ5ID0gbWFrZU5vZGUoKTtcbiAgICAgICAgY2hpbGRNYXAuc2V0KGZpcnN0LCBuZXh0TWFwRW50cnkpO1xuICAgICAgICBpZiAoaXNPYmplY3RLZXkoZmlyc3QpKSBtYXBFbnRyeS5oYXNXZWFrRW50cmllcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuI3NldChuZXh0TWFwRW50cnksIHJlc3QsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBrZXkgdG8gYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignS2V5cyBtdXN0IGJlIGF0IGxlYXN0IGxlbmd0aCAxJyk7XG4gICAgfVxuXG4gICAgdGhpcy4jc2V0KHRoaXMuI2ludGVybmFsTWFwLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gICNnZXQobWFwRW50cnksIGtleSkge1xuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy4jbGF5ZXJGb3IobWFwRW50cnksIGtleVswXSkuZ2V0KGtleVswXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBrZXk7XG4gICAgICBjb25zdCBuZXh0TWFwRW50cnkgPSB0aGlzLiNjaGlsZHJlbkZvcihtYXBFbnRyeSwgZmlyc3QpLmdldChmaXJzdCk7XG5cbiAgICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLiNnZXQobmV4dE1hcEVudHJ5LCByZXN0KTtcbiAgICB9XG4gIH1cblxuICBnZXQoa2V5KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGtleSB0byBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNnZXQodGhpcy4jaW50ZXJuYWxNYXAsIGtleSk7XG4gIH1cblxuICAjaGFzKG1hcEVudHJ5LCBrZXkpIHtcbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2xheWVyRm9yKG1hcEVudHJ5LCBrZXlbMF0pLmhhcyhrZXlbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGZpcnN0KS5nZXQoZmlyc3QpO1xuXG4gICAgICBpZiAoIW5leHRNYXBFbnRyeSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLiNoYXMobmV4dE1hcEVudHJ5LCByZXN0KTtcbiAgICB9XG4gIH1cblxuICBoYXMoa2V5KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGtleSB0byBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2hhcyh0aGlzLiNpbnRlcm5hbE1hcCwga2V5KTtcbiAgfVxuXG4gICp2YWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBbLCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gICprZXlzKCkge1xuICAgIGZvciAoY29uc3QgW2tleV0gb2YgdGhpcy5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIGtleTtcbiAgICB9XG4gIH1cblxuICAqI2VudHJpZXMobWFwRW50cnksIGtleSkge1xuICAgIGZvciAoY29uc3QgW2xheWVyS2V5LCBsYXllclZhbHVlXSBvZiBtYXBFbnRyeS5sYXllci5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIFtbLi4ua2V5LCBsYXllcktleV0sIGxheWVyVmFsdWVdO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2xheWVyS2V5LCBsYXllck1hcEVudHJ5XSBvZiBtYXBFbnRyeS5jaGlsZHJlbi5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkKiB0aGlzLiNlbnRyaWVzKGxheWVyTWFwRW50cnksIFsuLi5rZXksIGxheWVyS2V5XSk7XG4gICAgfVxuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgeWllbGQqIHRoaXMuI2VudHJpZXModGhpcy4jaW50ZXJuYWxNYXAsIFtdKTtcbiAgfVxuXG4gICNjYW5QcnVuZShub2RlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICFub2RlLmhhc1dlYWtFbnRyaWVzICYmIG5vZGUubGF5ZXIuc2l6ZSA9PT0gMCAmJiBub2RlLmNoaWxkcmVuLnNpemUgPT09IDBcbiAgICApO1xuICB9XG5cbiAgI2RlbGV0ZShtYXBFbnRyeSwga2V5KSB7XG4gICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwga2V5WzBdKS5kZWxldGUoa2V5WzBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgIGNvbnN0IGNoaWxkTWFwID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGZpcnN0KTtcbiAgICBjb25zdCBuZXh0TWFwRW50cnkgPSBjaGlsZE1hcC5nZXQoZmlyc3QpO1xuXG4gICAgaWYgKCFuZXh0TWFwRW50cnkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy4jZGVsZXRlKG5leHRNYXBFbnRyeSwgcmVzdCk7XG5cbiAgICBpZiAoZGVsZXRlZCAmJiB0aGlzLiNjYW5QcnVuZShuZXh0TWFwRW50cnkpKSB7XG4gICAgICBjaGlsZE1hcC5kZWxldGUoZmlyc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgZGVsZXRlKGtleSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpIHx8IGtleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlKHRoaXMuI2ludGVybmFsTWFwLCBrZXkpO1xuICB9XG5cbiAgI2ZvckVhY2hJblN1YnRyZWUobWFwRW50cnksIG9uVmFsdWUpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG1hcEVudHJ5LmxheWVyLnZhbHVlcygpKSB7XG4gICAgICBvblZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkRW50cnkgb2YgbWFwRW50cnkuY2hpbGRyZW4udmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuI2ZvckVhY2hJblN1YnRyZWUoY2hpbGRFbnRyeSwgb25WYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgI2RlbGV0ZUJ5UHJlZml4KG1hcEVudHJ5LCBrZXlQcmVmaXgsIG9uVmFsdWUpIHtcbiAgICBpZiAoa2V5UHJlZml4Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5UHJlZml4WzBdO1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwga2V5KTtcbiAgICAgIGNvbnN0IGNoaWxkTWFwID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGtleSk7XG4gICAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAobGF5ZXIuaGFzKGtleSkpIHtcbiAgICAgICAgaWYgKG9uVmFsdWUpIG9uVmFsdWUobGF5ZXIuZ2V0KGtleSkpO1xuICAgICAgICBsYXllci5kZWxldGUoa2V5KTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkRW50cnkgPSBjaGlsZE1hcC5nZXQoa2V5KTtcblxuICAgICAgaWYgKGNoaWxkRW50cnkpIHtcbiAgICAgICAgaWYgKG9uVmFsdWUpIHRoaXMuI2ZvckVhY2hJblN1YnRyZWUoY2hpbGRFbnRyeSwgb25WYWx1ZSk7XG4gICAgICAgIGNoaWxkTWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IGtleVByZWZpeDtcbiAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCk7XG4gICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGZpcnN0KTtcblxuICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuI2RlbGV0ZUJ5UHJlZml4KG5leHRNYXBFbnRyeSwgcmVzdCwgb25WYWx1ZSk7XG5cbiAgICBpZiAoZGVsZXRlZCAmJiB0aGlzLiNjYW5QcnVuZShuZXh0TWFwRW50cnkpKSB7XG4gICAgICBjaGlsZE1hcC5kZWxldGUoZmlyc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgZGVsZXRlQnlQcmVmaXgoa2V5UHJlZml4LCBvblZhbHVlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleVByZWZpeCkgfHwga2V5UHJlZml4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNkZWxldGVCeVByZWZpeCh0aGlzLiNpbnRlcm5hbE1hcCwga2V5UHJlZml4LCBvblZhbHVlKTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuI2ludGVybmFsTWFwID0gbWFrZU5vZGUoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IENvbXBvc2l0ZU1hcCB9IGZyb20gJy4vY29tcG9zaXRlLW1hcCc7XG5cbmV4cG9ydCBjbGFzcyBMcnVDb21wb3NpdGVNYXAge1xuICAjaW5uZXIgPSBuZXcgQ29tcG9zaXRlTWFwKCk7XG4gICNtYXhTaXplO1xuICAjc2l6ZSA9IDA7XG4gICNoZWFkID0gbnVsbDtcbiAgI3RhaWwgPSBudWxsO1xuICAjb25FdmljdDtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplLCB7IG9uRXZpY3QgfSA9IHt9KSB7XG4gICAgdGhpcy4jbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgdGhpcy4jb25FdmljdCA9IG9uRXZpY3Q7XG4gIH1cblxuICAjYWRkVG9IZWFkKG5vZGUpIHtcbiAgICBub2RlLm5leHQgPSB0aGlzLiNoZWFkO1xuICAgIG5vZGUucHJldiA9IG51bGw7XG5cbiAgICBpZiAodGhpcy4jaGVhZCkge1xuICAgICAgdGhpcy4jaGVhZC5wcmV2ID0gbm9kZTtcbiAgICB9XG5cbiAgICB0aGlzLiNoZWFkID0gbm9kZTtcblxuICAgIGlmICghdGhpcy4jdGFpbCkge1xuICAgICAgdGhpcy4jdGFpbCA9IG5vZGU7XG4gICAgfVxuICB9XG5cbiAgI3JlbW92ZU5vZGUobm9kZSkge1xuICAgIGlmIChub2RlLnByZXYpIHtcbiAgICAgIG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNoZWFkID0gbm9kZS5uZXh0O1xuICAgIH1cblxuICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgIG5vZGUubmV4dC5wcmV2ID0gbm9kZS5wcmV2O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiN0YWlsID0gbm9kZS5wcmV2O1xuICAgIH1cblxuICAgIG5vZGUucHJldiA9IG51bGw7XG4gICAgbm9kZS5uZXh0ID0gbnVsbDtcbiAgfVxuXG4gICNwcm9tb3RlTm9kZShub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IHRoaXMuI2hlYWQpIHJldHVybjtcbiAgICB0aGlzLiNyZW1vdmVOb2RlKG5vZGUpO1xuICAgIHRoaXMuI2FkZFRvSGVhZChub2RlKTtcbiAgfVxuXG4gICNldmljdExydSgpIHtcbiAgICBjb25zdCBscnVOb2RlID0gdGhpcy4jdGFpbDtcbiAgICBjb25zdCBrZXkgPSBscnVOb2RlLmtleTtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy4jaW5uZXIuZ2V0KGtleSk7XG4gICAgdGhpcy4jcmVtb3ZlTm9kZShscnVOb2RlKTtcbiAgICB0aGlzLiNpbm5lci5kZWxldGUoa2V5KTtcbiAgICB0aGlzLiNzaXplLS07XG5cbiAgICBpZiAodGhpcy4jb25FdmljdCkgdGhpcy4jb25FdmljdCh3cmFwcGVyLnZhbHVlLCBrZXkpO1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLiNpbm5lci5nZXQoa2V5KTtcblxuICAgIGlmICh3cmFwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy4jcHJvbW90ZU5vZGUod3JhcHBlci5scnVOb2RlKTtcblxuICAgIHJldHVybiB3cmFwcGVyLnZhbHVlO1xuICB9XG5cbiAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuI2lubmVyLmdldChrZXkpO1xuXG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy4jcHJvbW90ZU5vZGUoZXhpc3RpbmcubHJ1Tm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbHJ1Tm9kZSA9IHsga2V5LCBwcmV2OiBudWxsLCBuZXh0OiBudWxsIH07XG4gICAgdGhpcy4jaW5uZXIuc2V0KGtleSwgeyB2YWx1ZSwgbHJ1Tm9kZSB9KTtcbiAgICB0aGlzLiNhZGRUb0hlYWQobHJ1Tm9kZSk7XG4gICAgdGhpcy4jc2l6ZSsrO1xuXG4gICAgaWYgKHRoaXMuI3NpemUgPiB0aGlzLiNtYXhTaXplKSB7XG4gICAgICB0aGlzLiNldmljdExydSgpO1xuICAgIH1cbiAgfVxuXG4gIGhhcyhrZXkpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5uZXIuaGFzKGtleSk7XG4gIH1cblxuICAqdmFsdWVzKCkge1xuICAgIGZvciAoY29uc3Qgd3JhcHBlciBvZiB0aGlzLiNpbm5lci52YWx1ZXMoKSkge1xuICAgICAgeWllbGQgd3JhcHBlci52YWx1ZTtcbiAgICB9XG4gIH1cblxuICAqa2V5cygpIHtcbiAgICB5aWVsZCogdGhpcy4jaW5uZXIua2V5cygpO1xuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB3cmFwcGVyXSBvZiB0aGlzLiNpbm5lci5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIFtrZXksIHdyYXBwZXIudmFsdWVdO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZUJ5UHJlZml4KGtleVByZWZpeCkge1xuICAgIHJldHVybiB0aGlzLiNpbm5lci5kZWxldGVCeVByZWZpeChrZXlQcmVmaXgsIHdyYXBwZXIgPT4ge1xuICAgICAgdGhpcy4jcmVtb3ZlTm9kZSh3cmFwcGVyLmxydU5vZGUpO1xuICAgICAgdGhpcy4jc2l6ZS0tO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy4jaW5uZXIuY2xlYXIoKTtcbiAgICB0aGlzLiNoZWFkID0gbnVsbDtcbiAgICB0aGlzLiN0YWlsID0gbnVsbDtcbiAgICB0aGlzLiNzaXplID0gMDtcbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0ICguLi5mdW5jdGlvbnMpID0+XG4gIHggPT4ge1xuICAgIGxldCB2YWwgPSB4O1xuXG4gICAgZnVuY3Rpb25zLmZvckVhY2goZiA9PiB7XG4gICAgICB2YWwgPSBmKHZhbCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmFsO1xuICB9O1xuIiwgImltcG9ydCB7IG5vblN0b3JlZEluc3RhbmNlS2V5LCBzdG9yZWRJbnN0YW5jZUtleSB9IGZyb20gJy4vbGlmZWN5Y2xlRW51bSc7XG5pbXBvcnQgeyBpc0NvbXBvc2l0ZUtleSB9IGZyb20gJy4uL2dldENvbXBvc2l0ZUtleS9nZXRDb21wb3NpdGVLZXknO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbCB9IGZyb20gJy4uL2dldEluamVjdGFibGUvZ2V0SW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcbmltcG9ydCB7IGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbiB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IENvbXBvc2l0ZU1hcCB9IGZyb20gJy4uL2NvbXBvc2l0ZS1tYXAvY29tcG9zaXRlLW1hcCc7XG5pbXBvcnQgeyBMcnVDb21wb3NpdGVNYXAgfSBmcm9tICcuLi9jb21wb3NpdGUtbWFwL2xydS1jb21wb3NpdGUtbWFwJztcbmltcG9ydCBmbG93IGZyb20gJy4vZmFzdEZsb3cnO1xuXG4vLyBQcmUtYWxsb2NhdGVkIGtleSBmb3Igc2luZ2xldG9uIGluc3RhbmNlIGxvb2t1cCBcdTIwMTQgYXZvaWRzIGFycmF5IGNyZWF0aW9uIHBlciBpbmplY3QoKVxuY29uc3Qgc2luZ2xldG9uQ29tcG9zaXRlS2V5ID0gW3N0b3JlZEluc3RhbmNlS2V5XTtcblxuLy8gRGV0ZWN0cyB0aGUga2V5ZWRTaW5nbGV0b24gc3RvcmFnZSBzaGFwZS4gU2luZ2xldG9ucyAoYW5kIHYyLWRlZmF1bHRcbi8vIGluamVjdGFibGVzIHRoYXQgaGF2ZSBvbmx5IGV2ZXIgYmVlbiBjYWxsZWQgd2l0aG91dCBhcmdzKSBzdG9yZSB0aGVcbi8vIGluc3RhbmNlIGRpcmVjdGx5OyBrZXllZFNpbmdsZXRvbiB3aXRoLWFyZ3Mgc3RvcmFnZSB1c2VzIGEgQ29tcG9zaXRlTWFwLlxuZXhwb3J0IGNvbnN0IGlzQ29tcG9zaXRlU3RvcmFnZSA9IHN0b3JlZCA9PlxuICBzdG9yZWQgaW5zdGFuY2VvZiBDb21wb3NpdGVNYXAgfHwgc3RvcmVkIGluc3RhbmNlb2YgTHJ1Q29tcG9zaXRlTWFwO1xuXG5leHBvcnQgY29uc3QgcHJpdmF0ZUluamVjdEZvciA9XG4gICh7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGluamVjdGFibGVTZXQsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZ2V0RGksXG4gICAgY2hlY2tGb3JOb01hdGNoZXMsXG4gICAgY2hlY2tGb3JUb29NYW55TWF0Y2hlcyxcbiAgICBjaGVja0ZvclNpZGVFZmZlY3RzLFxuICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbixcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgICBnZXRTY29wZWRJZCxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSkgPT5cbiAgKHsgd2l0aE1ldGEgfSkgPT5cbiAgKHsgYWxpYXMsIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICBjb25zdCBkaSA9IGdldERpKCk7XG5cbiAgICBsZXQgb3JpZ2luYWxJbmplY3RhYmxlO1xuXG4gICAgLy8gRmFzdCBwYXRoOiBhbGlhcyBpcyBpdHNlbGYgYW4gaW5qZWN0YWJsZSAodGhlIGRvbWluYW50IGNhc2UgXHUyMDE0IGV2ZXJ5XG4gICAgLy8gY2FsbCBmcm9tIHByaXZhdGVJbmplY3RNYW55IGxhbmRzIGhlcmUgYmVjYXVzZSBpdCBpdGVyYXRlcyByZXNvbHZlZFxuICAgIC8vIGluamVjdGFibGVzKS4gU2tpcCBnZXRSZWxhdGVkSW5qZWN0YWJsZXMgKHdoaWNoIHdvdWxkIGFsbG9jYXRlIGFcbiAgICAvLyBzaW5nbGUtZWxlbWVudCBbYWxpYXNdIGFycmF5KSwgdGhlIHNpbmdsZS1tYXRjaC9uby1tYXRjaCB2YWxpZGF0b3JzLFxuICAgIC8vIGFuZCB0aGUgYWJzdHJhY3QtdG9rZW4gY2hlY2sgKGluamVjdGFibGVzIGFyZSBuZXZlciBhYnN0cmFjdCkuXG4gICAgY29uc3QgYWxpYXNUeXBlID0gYWxpYXMuYWxpYXNUeXBlO1xuXG4gICAgaWYgKGFsaWFzVHlwZSA9PT0gaW5qZWN0YWJsZVN5bWJvbCB8fCBhbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgICBpZiAoIWluamVjdGFibGVTZXQuaGFzKGFsaWFzKSkge1xuICAgICAgICAvLyBSZXVzZSB0aGUgZXhpc3RpbmcgdGhyb3cgd2l0aCB0aGUgc2FtZSB3b3JkaW5nIGFzIHRoZSB0b2tlbiBwYXRoLlxuICAgICAgICBjaGVja0Zvck5vTWF0Y2hlcyhbXSwgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxJbmplY3RhYmxlID0gYWxpYXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbihhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG5cbiAgICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICAgIGNoZWNrRm9yVG9vTWFueU1hdGNoZXMocmVsYXRlZEluamVjdGFibGVzLCBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG4gICAgICBjaGVja0Zvck5vTWF0Y2hlcyhyZWxhdGVkSW5qZWN0YWJsZXMsIGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKTtcblxuICAgICAgb3JpZ2luYWxJbmplY3RhYmxlID0gcmVsYXRlZEluamVjdGFibGVzWzBdO1xuICAgIH1cblxuICAgIGFscmVhZHlJbmplY3RlZC5hZGQob3JpZ2luYWxJbmplY3RhYmxlKTtcblxuICAgIGNvbnN0IGluamVjdGFibGUgPVxuICAgICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLnNpemUgPiAwXG4gICAgICAgID8gb3ZlcnJpZGluZ0luamVjdGFibGVzLmdldChvcmlnaW5hbEluamVjdGFibGUpIHx8IG9yaWdpbmFsSW5qZWN0YWJsZVxuICAgICAgICA6IG9yaWdpbmFsSW5qZWN0YWJsZTtcblxuICAgIGNoZWNrRm9yU2lkZUVmZmVjdHMoaW5qZWN0YWJsZSwgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG5cbiAgICAvLyBCYWNrd2FyZCBjb21wYXQ6IG9sZC1zdHlsZSBzaW5nbGV0b25zIHRvbGVyYXRlZCBgaW5qZWN0KGFsaWFzLCB1bmRlZmluZWQpYC5cbiAgICAvLyBOb3JtYWxpemUgYWxsLXVuZGVmaW5lZCBhcmdzIHRvIFtdIHNvIGZhc3QtcGF0aCBhbmQgc2luZ2xldG9uIGd1YXJkIGJlaGF2ZVxuICAgIC8vIGFzIGlmIG5vIHBhcmFtZXRlciB3YXMgc3VwcGxpZWQuXG4gICAgaWYgKFxuICAgICAgaW5qZWN0YWJsZS5hbGlhc1R5cGUgIT09IGluamVjdGFibGVTeW1ib2wyICYmXG4gICAgICBpbmplY3RhYmxlLmxpZmVjeWNsZS5pZCA9PT0gJ3NpbmdsZXRvbicgJiZcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA+IDAgJiZcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmV2ZXJ5KHAgPT4gcCA9PT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IHBhdGg6IHNpbmdsZXRvbiBjYWNoZSBoaXQgXHUyMDE0IGF2b2lkIGNyZWF0aW5nIG1pbmltYWxEaSBlbnRpcmVseS5cbiAgICAvLyBUaGUgc3RvcmVkIHZhbHVlIGlzIG9uZSBvZjpcbiAgICAvLyAgIC0gdW5kZWZpbmVkOiBub3RoaW5nIGNhY2hlZCB5ZXRcbiAgICAvLyAgIC0gQ29tcG9zaXRlTWFwIC8gTHJ1Q29tcG9zaXRlTWFwOiBrZXllZFNpbmdsZXRvbiBjYWNoZSwgbG9vayB1cCBieVxuICAgIC8vICAgICBzaW5nbGV0b25Db21wb3NpdGVLZXkgZm9yIGEgbm8tYXJncyBjYWxsXG4gICAgLy8gICAtIGFueSBvdGhlciB2YWx1ZTogaW5zdGFuY2UgZGlyZWN0bHkgKHNpbmdsZXRvbiBsaWZlY3ljbGUsIG9yIHYyXG4gICAgLy8gICAgIGRlZmF1bHQgbGlmZWN5Y2xlIHRoYXQgaGFzIG9ubHkgZXZlciBiZWVuIGNhbGxlZCB3aXRoIG5vIGFyZ3MpXG4gICAgLy9cbiAgICAvLyBXZSBkaXNwYXRjaCBvbiBsaWZlY3ljbGUuaWQgZmlyc3Qgc28gcGxhaW4gc2luZ2xldG9ucyAodGhlIGRvbWluYW50XG4gICAgLy8gY2FzZSkgc2tpcCB0aGUgaW5zdGFuY2VvZiBjaGVja3MgZW50aXJlbHk7IG9ubHkga2V5ZWRTaW5nbGV0b24tc2hhcGVkXG4gICAgLy8gbGlmZWN5Y2xlcyBmYWxsIHRocm91Z2ggdG8gdGhlIHN0cnVjdHVyYWwgY2hlY2suXG4gICAgaWYgKGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgaW5qZWN0YWJsZS5vdmVycmlkZGVuSW5qZWN0YWJsZSB8fCBpbmplY3RhYmxlLFxuICAgICAgKTtcblxuICAgICAgbGV0IGV4aXN0aW5nSW5zdGFuY2U7XG5cbiAgICAgIGlmIChpbmplY3RhYmxlLmxpZmVjeWNsZS5pZCA9PT0gJ3NpbmdsZXRvbicpIHtcbiAgICAgICAgZXhpc3RpbmdJbnN0YW5jZSA9IHN0b3JlZDtcbiAgICAgIH0gZWxzZSBpZiAoaXNDb21wb3NpdGVTdG9yYWdlKHN0b3JlZCkpIHtcbiAgICAgICAgZXhpc3RpbmdJbnN0YW5jZSA9IHN0b3JlZC5nZXQoc2luZ2xldG9uQ29tcG9zaXRlS2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXN0aW5nSW5zdGFuY2UgPSBzdG9yZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICAgIGlmICghd2l0aE1ldGEpIHtcbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5zdGFuY2U6IGV4aXN0aW5nSW5zdGFuY2UsXG4gICAgICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0SW5zdGFuY2UoXG4gICAgICBkaSxcbiAgICAgIGluamVjdGFibGUsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICBnZXROYW1lc3BhY2VkSWQsXG4gICAgICBnZXRTY29wZWRJZCxcbiAgICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICk7XG5cbiAgICBpZiAoIXdpdGhNZXRhKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgIH07XG4gIH07XG5cbmNvbnN0IGNyZWF0ZU1pbmltYWxEaSA9IChcbiAgZGksXG4gIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gIGdldFNjb3BlZElkLFxuICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4pID0+IHtcbiAgLy8gQ2xvc3VyZS1jYXB0dXJlZCBtZXRob2RzIGFyZSBmaXhlZCB1cC1mcm9udCAoYHNoYXJlZGAgcGx1cyBpbmplY3QqKSxcbiAgLy8gc28gdXNlciBjb2RlIGNhbiBkZXRhY2ggdGhlbSBcdTIwMTQgYGNvbnN0IHsgcmVnaXN0ZXIgfSA9IGRpOyByZWdpc3RlciguLi4pYFxuICAvLyBhbmQgc2ltaWxhciBwYXR0ZXJucyBhcHBlYXIgaW4gdGVzdHMuIEEgY2xhc3Mtd2l0aC1wcm90b3R5cGUgZGlzcGF0Y2hlclxuICAvLyB3b3VsZCBiZSBjaGVhcGVyIHRvIGFsbG9jYXRlIGJ1dCBsb3NlcyB0aGF0IGRldGFjaC1mcmllbmRseSBiZWhhdmlvci5cbiAgY29uc3Qgc2hhcmVkID0ge1xuICAgIHJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIGRpLnJlZ2lzdGVyKHtcbiAgICAgICAgaW5qZWN0YWJsZXMsXG4gICAgICAgIGNvbnRleHQ6IFt7IGluamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkIH1dLFxuICAgICAgICBzb3VyY2U6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGRlcmVnaXN0ZXI6ICguLi5pbmplY3RhYmxlcykgPT4ge1xuICAgICAgZGkuZGVyZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbeyBpbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCB9XSxcbiAgICAgICAgc291cmNlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXQgc291cmNlTmFtZXNwYWNlKCkge1xuICAgICAgY29uc3QgbnNJZCA9IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG4gICAgICBjb25zdCBsYXN0Q29sb24gPSBuc0lkID8gbnNJZC5sYXN0SW5kZXhPZignOicpIDogLTE7XG5cbiAgICAgIHJldHVybiBsYXN0Q29sb24gPiAwID8gbnNJZC5zbGljZSgwLCBsYXN0Q29sb24pIDogdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICBoYXNSZWdpc3RyYXRpb25zOiBkaS5oYXNSZWdpc3RyYXRpb25zLFxuICAgIGdldE51bWJlck9mUmVnaXN0cmF0aW9uczogZGkuZ2V0TnVtYmVyT2ZSZWdpc3RyYXRpb25zLFxuICAgIGdldE51bWJlck9mSW5zdGFuY2VzOiBkaS5nZXROdW1iZXJPZkluc3RhbmNlcyxcblxuICAgIHB1cmdlOiAoYWxpYXMsIC4uLmtleVBhcnRzKSA9PlxuICAgICAgZGkuc2NvcGVkUHVyZ2UoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsIGFsaWFzLCAuLi5rZXlQYXJ0cyksXG5cbiAgICByZWdpc3RlcmVkSW5Mb2NhbFNjb3BlOiBhbGlhcyA9PlxuICAgICAgZGkucmVnaXN0ZXJlZEluU2NvcGVPZihpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCwgYWxpYXMpLFxuXG4gICAgcmVnaXN0ZXJlZEluTG9jYWxTY29wZVN1YnRyZWU6IGFsaWFzID0+XG4gICAgICBkaS5yZWdpc3RlcmVkSW5TdWJ0cmVlT2YoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsIGFsaWFzKSxcbiAgfTtcblxuICBpZiAoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQuYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgIC8vIEFuIGltcGVyYXRpdmUgb3ZlcnJpZGUgKGRpLm92ZXJyaWRlIC8gZGkuZWFybHlPdmVycmlkZSkgaW5zdGFudGlhdGVzIGFcbiAgICAvLyBzdGFuZC1pbiBvYmplY3QgdGhhdCB3YXMgbmV2ZXIgcmVnaXN0ZXJlZDsgdGhlIHJlZ2lzdHJhdGlvbiB0cmVlIG9ubHlcbiAgICAvLyBrbm93cyB0aGUgb3JpZ2luYWwsIHNvIHRoZSBzY29wZSB3YWxrIHN0YXJ0cyBmcm9tIGl0LlxuICAgIGNvbnN0IHJlZ2lzdGVyZWRJbmplY3RhYmxlID1cbiAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZDtcblxuICAgIC8vIFYyIG1pbmltYWxEaTogaW5qZWN0L2luamVjdE1hbnkvZXRjIGFyZSBmYWN0b3J5LXJldHVybmluZy4gRWFjaCBtZXRob2RcbiAgICAvLyBpcyBpbmxpbmVkIGRpcmVjdGx5IGFnYWluc3QgYGRpYCAobm8gbWluaW1hbEluamVjdCogaW50ZXJtZWRpYXJ5KSBzb1xuICAgIC8vIHdlIGRvbid0IGFsbG9jYXRlIGZvdXIgZXh0cmEgY2xvc3VyZXMgcGVyIG1pbmltYWxEaSBqdXN0IHRvIGZvcndhcmQuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNoYXJlZCxcblxuICAgICAgLy8gVGhlIGlkZW50aXR5IG9mIHdoYXQgaXMgYmVpbmcgaW5zdGFudGlhdGVkLCBmb3IgaW5zdGFudGlhdGUtY29kZVxuICAgICAgLy8gc2hhcmVkIGFjcm9zcyBpbmplY3RhYmxlcyAoZGVjb3JhdG9ycywgcmV1c2FibGUgZmFjdG9yaWVzKS4gYGlkYCBpcyBhXG4gICAgICAvLyBwbGFpbiByZWFkOyB0aGUgc2NvcGUgcGFpciB3YWxrcyB0aGUgcmVnaXN0cmF0aW9uIHRyZWUgcGVyIHJlYWQsXG4gICAgICAvLyBoZW5jZSBnZXR0ZXJzLlxuICAgICAgaWQ6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmlkLFxuXG4gICAgICBnZXQgc2NvcGVJZHMoKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IGdldFNjb3BlZElkKHJlZ2lzdGVyZWRJbmplY3RhYmxlKTtcblxuICAgICAgICBpZHMucG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIGlkcztcbiAgICAgIH0sXG5cbiAgICAgIGdldCBzY29wZWRJZCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFNjb3BlZElkKHJlZ2lzdGVyZWRJbmplY3RhYmxlKTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdDpcbiAgICAgICAgYWxpYXMgPT5cbiAgICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgICBkaS5pbmplY3Qoe1xuICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogcGFyYW1zLFxuICAgICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgICAgfSksXG5cbiAgICAgIGluamVjdE1hbnk6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KSxcblxuICAgICAgaW5qZWN0TWF5YmU6IGFsaWFzID0+IHtcbiAgICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCk7XG5cbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdFdpdGhNZXRhOlxuICAgICAgICBhbGlhcyA9PlxuICAgICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYW55V2l0aE1ldGE6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYXliZVdpdGhNZXRhOiBhbGlhcyA9PiB7XG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eShhbGlhcywgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQpO1xuXG4gICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFYxIG1pbmltYWxEaTogaW5qZWN0L2luamVjdE1hbnkvZXRjIHJldHVybiBpbnN0YW5jZXMgZGlyZWN0bHkuXG4gIGNvbnN0IG1pbmltYWxJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBkaS5pbmplY3RNYW55KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0V2l0aE1ldGEoe1xuICAgICAgYWxpYXMsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogYXJncyxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIH0pO1xuXG4gIGNvbnN0IG1pbmltYWxJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLnNoYXJlZCxcblxuICAgIGluamVjdDogbWluaW1hbEluamVjdCxcbiAgICBpbmplY3RNYW55OiBtaW5pbWFsSW5qZWN0TWFueSxcbiAgICBpbmplY3RXaXRoTWV0YTogbWluaW1hbEluamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnlXaXRoTWV0YTogbWluaW1hbEluamVjdE1hbnlXaXRoTWV0YSxcblxuICAgIGluamVjdEZhY3Rvcnk6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgbWluaW1hbEluamVjdChhbGlhcywgLi4ucGFyYW1zKSxcbiAgfTtcbn07XG5cbmNvbnN0IGluc3RhbnRpYXRlID0gKFxuICBkaSxcbiAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gIG1pbmltYWxEaSxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuKSA9PiB7XG4gIC8vIERlY29yYXRvcnMgYWx3YXlzIGxvb2sgdXAgYWdhaW5zdCB0aGUgb3JpZ2luYWwgaW5qZWN0YWJsZSBzbyB0aGF0IGFuXG4gIC8vIGltcGVyYXRpdmUgb3ZlcnJpZGUgKGRpLm92ZXJyaWRlIC8gZGkuZWFybHlPdmVycmlkZSkgaXMgd3JhcHBlZCBieSBhbnlcbiAgLy8gZGVjb3JhdG9ycyByZWdpc3RlcmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRhcmdldCBcdTIwMTQgY29tcG9zaW5nIGRlY29yYXRvcnNcbiAgLy8gcmVseSBvbiB0aGlzLlxuICBjb25zdCB0YXJnZXQgPVxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQ7XG5cbiAgY29uc3QgZGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzKHtcbiAgICBkZWNvcmF0b3JUb2tlbjogaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICAgIHRhcmdldCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgfSk7XG5cbiAgY29uc3QgZGVjb3JhdGVkID1cbiAgICBkZWNvcmF0b3JzLmxlbmd0aCA9PT0gMFxuICAgICAgPyBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5pbnN0YW50aWF0ZVxuICAgICAgOiBmbG93KC4uLmRlY29yYXRvcnMpKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmluc3RhbnRpYXRlKTtcblxuICAvLyBOZXctc3R5bGUgaW5qZWN0YWJsZTI6IGN1cnJpZWQgKGRpKSA9PiAoLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICBpZiAoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQuYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgIHJldHVybiBkZWNvcmF0ZWQobWluaW1hbERpKSguLi5pbnN0YW50aWF0aW9uUGFyYW1ldGVycyk7XG4gIH1cblxuICAvLyBPbGQtc3R5bGU6IChkaSwgLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICByZXR1cm4gZGVjb3JhdGVkKG1pbmltYWxEaSwgLi4uaW5zdGFudGlhdGlvblBhcmFtZXRlcnMpO1xufTtcblxuY29uc3QgZW5zdXJlSW5zdGFuY2VNYXAgPSAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBrZXkpID0+IHtcbiAgbGV0IGluc3RhbmNlTWFwID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChrZXkpO1xuXG4gIGlmICghaW5zdGFuY2VNYXApIHtcbiAgICBpbnN0YW5jZU1hcCA9IG5ldyBDb21wb3NpdGVNYXAoKTtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGtleSwgaW5zdGFuY2VNYXApO1xuICB9XG5cbiAgcmV0dXJuIGluc3RhbmNlTWFwO1xufTtcblxuY29uc3QgZ2V0SW5zdGFuY2UgPSAoXG4gIGRpLFxuICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICBnZXROYW1lc3BhY2VkSWQsXG4gIGdldFNjb3BlZElkLFxuICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuKSA9PiB7XG4gIGNvbnN0IGNhY2hlS2V5ID1cbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5vdmVycmlkZGVuSW5qZWN0YWJsZSB8fFxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkO1xuXG4gIGNvbnN0IGxpZmVjeWNsZUlkID0gaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQubGlmZWN5Y2xlLmlkO1xuXG4gIC8vIFNpbmdsZXRvbjogZmFzdCBwYXRoIGluIHByaXZhdGVJbmplY3RGb3IgYWxyZWFkeSBjaGVja2VkIGNhY2hlIGFuZCBtaXNzZWQuXG4gIC8vIFNraXAgcmVkdW5kYW50IGdldEluc3RhbmNlS2V5ICsgY2FjaGUgY2hlY2sgXHUyMDE0IGdvIHN0cmFpZ2h0IHRvIGluc3RhbnRpYXRpb24uXG4gIGlmIChsaWZlY3ljbGVJZCA9PT0gJ3NpbmdsZXRvbicpIHtcbiAgICBpZiAoaW5zdGFudGlhdGlvblBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IHNpbmdsZXRvbiBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICApfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaWxsZWdhbGx5IHRvIHNpbmdsZXRvbnMsIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzIHdlcmUgcHJvdmlkZWQ6IFwiJHtpbnN0YW50aWF0aW9uUGFyYW1ldGVyc31cIi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtaW5pbWFsRGkgPSBjcmVhdGVNaW5pbWFsRGkoXG4gICAgICBkaSxcbiAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGdldFNjb3BlZElkLFxuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICk7XG5cbiAgICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIG1pbmltYWxEaSxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgKTtcblxuICAgIC8vIFNpbmdsZXRvbnMgc3RvcmUgdGhlIGluc3RhbmNlIGRpcmVjdGx5IGluIHRoZSBtYXAgXHUyMDE0IG5vIHBlci1pbmplY3RhYmxlXG4gICAgLy8gQ29tcG9zaXRlTWFwIHdyYXBwZXIuIFNhdmVzIH41IG9iamVjdCBhbGxvY2F0aW9ucyBwZXIgZmlyc3QtaW5qZWN0LlxuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5zZXQoY2FjaGVLZXksIG5ld0luc3RhbmNlKTtcblxuICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgfVxuXG4gIC8vIFRyYW5zaWVudDogbmV2ZXIgY2FjaGVkIFx1MjAxNCBza2lwIGtleSByZXNvbHV0aW9uLCBjYWNoZSBjaGVjaywgYW5kIGNhY2hlIHN0b3JlLlxuICBpZiAobGlmZWN5Y2xlSWQgPT09ICd0cmFuc2llbnQnKSB7XG4gICAgY29uc3QgbWluaW1hbERpID0gY3JlYXRlTWluaW1hbERpKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICBnZXRTY29wZWRJZCxcbiAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGluc3RhbnRpYXRlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIG1pbmltYWxEaSxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFYyLWRlZmF1bHQgKyBuby1hcmdzIGZhc3QgcGF0aDogYmVoYXZlcyBsaWtlIGEgc2luZ2xldG9uLiBTa2lwXG4gIC8vIGdldEluc3RhbmNlS2V5ICsga2V5LWFycmF5IGFsbG9jYXRpb24gKyBDb21wb3NpdGVNYXAgYWxsb2NhdGlvbi4gVGhlXG4gIC8vIGluc3RhbmNlIGlzIHN0b3JlZCBkaXJlY3RseSB1bmRlciBjYWNoZUtleSwgbWF0Y2hpbmcgdGhlIHNpbmdsZXRvblxuICAvLyBzaGFwZS4gSWYgdGhlIHNhbWUgdjIgaW5qZWN0YWJsZSBpcyBsYXRlciBjYWxsZWQgd2l0aCBhcmdzIChyYXJlIG1peGVkXG4gIC8vIHVzYWdlKSwgdGhlIGtleWVkU2luZ2xldG9uIHBhdGggYmVsb3cgbWlncmF0ZXMgdGhlIGV4aXN0aW5nIGluc3RhbmNlXG4gIC8vIGludG8gYSBDb21wb3NpdGVNYXAgdW5kZXIgc2luZ2xldG9uQ29tcG9zaXRlS2V5IGJlZm9yZSBhZGRpbmcgdGhlIG5ld1xuICAvLyBrZXllZCBlbnRyeS5cbiAgaWYgKFxuICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCAmJlxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmxpZmVjeWNsZS5faXNWMkRlZmF1bHRMaWZlY3ljbGVcbiAgKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuZ2V0KGNhY2hlS2V5KTtcblxuICAgIGlmICghaXNDb21wb3NpdGVTdG9yYWdlKGV4aXN0aW5nKSkge1xuICAgICAgY29uc3QgbWluaW1hbERpID0gY3JlYXRlTWluaW1hbERpKFxuICAgICAgICBkaSxcbiAgICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgICAgZ2V0U2NvcGVkSWQsXG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gaW5zdGFudGlhdGUoXG4gICAgICAgIGRpLFxuICAgICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgbWluaW1hbERpLFxuICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgICApO1xuXG4gICAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGNhY2hlS2V5LCBuZXdJbnN0YW5jZSk7XG4gICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gICAgfVxuICAgIC8vIGV4aXN0aW5nIGlzIGEgQ29tcG9zaXRlTWFwIChtaXhlZCB1c2FnZSBwYXRoKSBcdTIwMTQgZmFsbCB0aHJvdWdoLlxuICB9XG5cbiAgLy8ga2V5ZWRTaW5nbGV0b24gLyBjdXN0b20gbGlmZWN5Y2xlOiBmdWxsIGtleSByZXNvbHV0aW9uICsgY2FjaGUgY2hlY2suXG4gIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICBkaSxcbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBnZXRTY29wZWRJZCxcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICk7XG5cbiAgY29uc3QgaW5zdGFuY2VLZXkgPSBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuZ2V0SW5zdGFuY2VLZXkoXG4gICAgbWluaW1hbERpLFxuICAgIC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICApO1xuXG4gIGNvbnN0IGluc3RhbmNlQ29tcG9zaXRlS2V5ID0gaXNDb21wb3NpdGVLZXkoaW5zdGFuY2VLZXkpXG4gICAgPyBpbnN0YW5jZUtleS5rZXlzXG4gICAgOiBbaW5zdGFuY2VLZXldO1xuXG4gIGxldCBleGlzdGluZ01hcCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoY2FjaGVLZXkpO1xuXG4gIC8vIE1peGVkLXVzYWdlIG1pZ3JhdGlvbjogb25seSB2Mi1kZWZhdWx0IGluamVjdGFibGVzIGNhbiBoYXZlIGFycml2ZWRcbiAgLy8gaGVyZSB3aXRoIGFuIGluc3RhbmNlIGluIHRoZSBzbG90IChmcm9tIGEgcHJpb3Igbm8tYXJncyBjYWxsKS4gRm9yXG4gIC8vIGV2ZXJ5IG90aGVyIGtleWVkU2luZ2xldG9uLCB0aGUgc2xvdCBpcyBlaXRoZXIgdW5kZWZpbmVkIG9yIGFcbiAgLy8gQ29tcG9zaXRlTWFwLCBzbyBza2lwIHRoZSBzdHJ1Y3R1cmFsIGNoZWNrLlxuICBpZiAoXG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQubGlmZWN5Y2xlLl9pc1YyRGVmYXVsdExpZmVjeWNsZSAmJlxuICAgIGV4aXN0aW5nTWFwICE9PSB1bmRlZmluZWQgJiZcbiAgICAhaXNDb21wb3NpdGVTdG9yYWdlKGV4aXN0aW5nTWFwKVxuICApIHtcbiAgICBjb25zdCBwcmV2aW91c0luc3RhbmNlID0gZXhpc3RpbmdNYXA7XG4gICAgZXhpc3RpbmdNYXAgPSBuZXcgQ29tcG9zaXRlTWFwKCk7XG4gICAgZXhpc3RpbmdNYXAuc2V0KHNpbmdsZXRvbkNvbXBvc2l0ZUtleSwgcHJldmlvdXNJbnN0YW5jZSk7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLnNldChjYWNoZUtleSwgZXhpc3RpbmdNYXApO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IGV4aXN0aW5nTWFwPy5nZXQoaW5zdGFuY2VDb21wb3NpdGVLZXkpO1xuXG4gIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2U7XG4gIH1cblxuICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgIGRpLFxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIG1pbmltYWxEaSxcbiAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgKTtcblxuICBpZiAoaW5zdGFuY2VDb21wb3NpdGVLZXlbMF0gIT09IG5vblN0b3JlZEluc3RhbmNlS2V5KSB7XG4gICAgZW5zdXJlSW5zdGFuY2VNYXAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBjYWNoZUtleSkuc2V0KFxuICAgICAgaW5zdGFuY2VDb21wb3NpdGVLZXksXG4gICAgICBuZXdJbnN0YW5jZSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5ld0luc3RhbmNlO1xufTtcbiIsICJpbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcbmltcG9ydCB7IGluamVjdGlvbkRlY29yYXRvclRva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG5leHBvcnQgY29uc3Qgd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3IgPVxuICAoeyBkZWNvcmF0b3JDYWNoZSwgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAgdG9CZURlY29yYXRlZCA9PlxuICAoeyBhbGlhcywgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsIGluamVjdGluZ0luamVjdGFibGUgfSkgPT4ge1xuICAgIC8vIFdoZW4gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uIGlzIG51bGwsIGEgZGVjb3JhdG9yIHdhcyByZWdpc3RlcmVkIG9yXG4gICAgLy8gZGVyZWdpc3RlcmVkIFx1MjAxNCBpbnZhbGlkYXRlIGFsbCBwZXItYWxpYXMgY2FjaGVkIGNvbXBvc2l0aW9ucy5cbiAgICBpZiAoZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uID09PSBudWxsKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSB0cnVlO1xuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcyA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBsZXQgZGVjb3JhdGVkID0gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5nZXQoYWxpYXMpO1xuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgICBkZWNvcmF0b3JUb2tlbjogaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgICAgIHRhcmdldDogYWxpYXMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBib3VuZEluamVjdCA9ICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgdG9CZURlY29yYXRlZCh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGRlY29yYXRlZCA9IGZsb3coLi4uZGVjb3JhdG9ycykoYm91bmRJbmplY3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb3JhdGVkID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5zZXQoYWxpYXMsIGRlY29yYXRlZCk7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRvQmVEZWNvcmF0ZWQoe1xuICAgICAgICBhbGlhcyxcbiAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdGVkKC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzKTtcbiAgfTtcbiIsICJleHBvcnQgY29uc3QgcHJpdmF0ZUluamVjdE1hbnlGb3IgPVxuICAoeyBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsIGdldEluamVjdCwgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwIH0pID0+XG4gICh7IHdpdGhNZXRhIH0pID0+XG4gICh7IGFsaWFzLCBpbnN0YW50aWF0aW9uUGFyYW1ldGVycywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgY29uc3QgaW5qZWN0ID0gZ2V0SW5qZWN0KCk7XG5cbiAgICBjb25zdCByZWxhdGVkSW5qZWN0YWJsZXMgPSBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpO1xuICAgIGNvbnN0IG4gPSByZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoO1xuXG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobik7XG5cbiAgICAvLyBUaGUgYXJnIG9iamVjdCBpcyByZXVzZWQgYWNyb3NzIGl0ZXJhdGlvbnMgXHUyMDE0IHByaXZhdGVJbmplY3RGb3JcbiAgICAvLyBkZXN0cnVjdHVyZXMgaXQgb24gZW50cnkgYW5kIG5ldmVyIHJldGFpbnMgYSByZWZlcmVuY2UsIHNvIG11dGF0aW5nXG4gICAgLy8gLmFsaWFzIGJldHdlZW4gY2FsbHMgaXMgc2FmZS5cbiAgICBjb25zdCBhcmcgPSB7XG4gICAgICBhbGlhczogdW5kZWZpbmVkLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBhbGlhcyxcbiAgICB9O1xuXG4gICAgaWYgKHdpdGhNZXRhKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCBpbmplY3RhYmxlID0gcmVsYXRlZEluamVjdGFibGVzW2ldO1xuICAgICAgICBhcmcuYWxpYXMgPSBpbmplY3RhYmxlO1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluamVjdChhcmcpO1xuICAgICAgICByZXN1bHRbaV0gPSB7XG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBhcmcuYWxpYXMgPSByZWxhdGVkSW5qZWN0YWJsZXNbaV07XG4gICAgICAgIHJlc3VsdFtpXSA9IGluamVjdChhcmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4iLCAiaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5TeW1ib2wgfSBmcm9tICcuL2dldEluamVjdGlvblRva2VuJztcbmltcG9ydCB7IGluamVjdGlvblRva2VuU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGlvblRva2VuID0+XG4gIG1heWJlSW5qZWN0aW9uVG9rZW4/LmFsaWFzVHlwZSA9PT0gaW5qZWN0aW9uVG9rZW5TeW1ib2wgfHxcbiAgbWF5YmVJbmplY3Rpb25Ub2tlbj8uYWxpYXNUeXBlID09PSBpbmplY3Rpb25Ub2tlblN5bWJvbDI7XG4iLCAiLy8gVGhlIGlkcyBvZiB0aGUgc2NvcGVzIGFuIGFsaWFzIHdhcyByZWdpc3RlcmVkIHVuZGVyLCBvdXRlcm1vc3QgZmlyc3QgYW5kXG4vLyB0aGUgaW1tZWRpYXRlIG93bmVyIGxhc3QuIEVtcHR5IGZvciBjb250YWluZXItbGV2ZWwgcmVnaXN0cmF0aW9ucywgYW5kIGZvclxuLy8gYW55dGhpbmcgbmV2ZXIgcmVnaXN0ZXJlZCAoaW5qZWN0aW9uIHRva2VucywgdGhlIGNvbnRhaW5lciByb290KS5cbmNvbnN0IGdldFNjb3BlSWRzRm9yID0gaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQgPT4gYWxpYXMgPT4ge1xuICBjb25zdCBpZHMgPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSBhbGlhcztcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5nZXQoY3VycmVudCk7XG5cbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IGNvbnRleHRbY29udGV4dC5sZW5ndGggLSAxXTtcblxuICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcicpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlkcy5wdXNoKHBhcmVudC5pbmplY3RhYmxlLmlkKTtcbiAgICBjdXJyZW50ID0gcGFyZW50LmluamVjdGFibGU7XG4gIH1cblxuICBpZHMucmV2ZXJzZSgpO1xuICByZXR1cm4gaWRzO1xufTtcblxuLy8gVGhlIHNjb3BlIGlkcyBmb2xsb3dlZCBieSB0aGUgYWxpYXMncyBvd24gaWQgXHUyMDE0IHRoZSBzZWdtZW50cyBvZiBpdHNcbi8vIG5hbWVzcGFjZWQgaWQsIHdoaWNoIGlzIHRoZXNlIGpvaW5lZC4gV2Fsa3MgdGhlIHJlZ2lzdHJhdGlvbiB0cmVlIG9uIGV2ZXJ5XG4vLyBjYWxsLCBzbyBjYWxsZXJzIHdhbnRpbmcgaXQgY2hlYXAgc2hvdWxkIGNhY2hlOyB0aGUgYXJyYXkgaXMgZnJlc2ggcGVyIGNhbGxcbi8vIGFuZCB0aGUgY2FsbGVyJ3MgdG8ga2VlcC5cbmV4cG9ydCBjb25zdCBnZXRTY29wZWRJZEZvciA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0ID0+IHtcbiAgY29uc3QgZ2V0U2NvcGVJZHMgPSBnZXRTY29wZUlkc0ZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG5cbiAgcmV0dXJuIGFsaWFzID0+IHtcbiAgICBjb25zdCBpZHMgPSBnZXRTY29wZUlkcyhhbGlhcyk7XG5cbiAgICBpZHMucHVzaChhbGlhcy5pZCk7XG5cbiAgICByZXR1cm4gaWRzO1xuICB9O1xufTtcbiIsICJpbXBvcnQgaXNJbmplY3Rpb25Ub2tlbiBmcm9tICcuLi9nZXRJbmplY3Rpb25Ub2tlbi9pc0luamVjdGlvblRva2VuJztcbmltcG9ydCB7IGdldFNjb3BlZElkRm9yIH0gZnJvbSAnLi9nZXRTY29wZWRJZEZvcic7XG5cbi8vIFRoZSBzY29wZWQgaWQgam9pbmVkIHdpdGggJzonLiBBbiBpbmplY3Rpb24gdG9rZW4gaXMgbmV2ZXIgcmVnaXN0ZXJlZCBhbmRcbi8vIHNvIGhhcyBubyBzY29wZXM7IGl0cyBpZCBpcyBwYXJlbnRoZXNpemVkIHRvIHRlbGwgaXQgYXBhcnQgZnJvbSBhblxuLy8gaW5qZWN0YWJsZSdzIHdoZXJlIGl0IHN0YW5kcyBpbiBhcyB0aGUgaW5qZWN0aW5nIHBhcnR5LlxuZXhwb3J0IGNvbnN0IGdldE5hbWVzcGFjZWRJZEZvciA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0ID0+IHtcbiAgY29uc3QgZ2V0U2NvcGVkSWQgPSBnZXRTY29wZWRJZEZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG5cbiAgcmV0dXJuIGFsaWFzID0+XG4gICAgaXNJbmplY3Rpb25Ub2tlbihhbGlhcylcbiAgICAgID8gYCgke2FsaWFzLmlkfSlgXG4gICAgICA6IGdldFNjb3BlZElkKGFsaWFzKS5qb2luKCc6Jyk7XG59O1xuIiwgImV4cG9ydCBjb25zdCBpbmplY3RhYmxlQnVuY2hTeW1ib2wgPSAnaW5qZWN0YWJsZS1idW5jaCc7XG5cbmV4cG9ydCBkZWZhdWx0IGJ1bmNoID0+XG4gIE9iamVjdC5hc3NpZ24oYnVuY2gsIHtcbiAgICBhbGlhc1R5cGU6IGluamVjdGFibGVCdW5jaFN5bWJvbCxcbiAgfSk7XG4iLCAiaW1wb3J0IHsgaW5qZWN0YWJsZUJ1bmNoU3ltYm9sIH0gZnJvbSAnLi9nZXRJbmplY3RhYmxlQnVuY2gnO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGFibGVCdW5jaCA9PlxuICBtYXliZUluamVjdGFibGVCdW5jaD8uYWxpYXNUeXBlID09PSBpbmplY3RhYmxlQnVuY2hTeW1ib2w7XG4iLCAiaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbCB9IGZyb20gJy4vZ2V0SW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcblxuZXhwb3J0IGRlZmF1bHQgbWF5YmVJbmplY3RhYmxlID0+XG4gIG1heWJlSW5qZWN0YWJsZT8uYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sIHx8XG4gIG1heWJlSW5qZWN0YWJsZT8uYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMjtcbiIsICJpbXBvcnQgaXNJbmplY3RhYmxlQnVuY2ggZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZUJ1bmNoL2lzSW5qZWN0YWJsZUJ1bmNoJztcbmltcG9ydCBpc0luamVjdGFibGUgZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZS9pc0luamVjdGFibGUnO1xuXG5jb25zdCBjb2xsZWN0RGVlcEJ1bmNoVmFsdWVzID0gKGJ1bmNoLCBvdXQpID0+IHtcbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhidW5jaCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0aGluZyA9IHZhbHVlc1tpXTtcblxuICAgIGlmIChpc0luamVjdGFibGVCdW5jaCh0aGluZykpIHtcbiAgICAgIGNvbGxlY3REZWVwQnVuY2hWYWx1ZXModGhpbmcsIG91dCk7XG4gICAgfSBlbHNlIGlmIChpc0luamVjdGFibGUodGhpbmcpKSB7XG4gICAgICBvdXQucHVzaCh0aGluZyk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RhYmxlcyA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5qZWN0YWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbmplY3RhYmxlID0gaW5qZWN0YWJsZXNbaV07XG5cbiAgICBpZiAoaXNJbmplY3RhYmxlQnVuY2goaW5qZWN0YWJsZSkpIHtcbiAgICAgIGNvbGxlY3REZWVwQnVuY2hWYWx1ZXMoaW5qZWN0YWJsZSwgcmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goaW5qZWN0YWJsZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAiLy8gVG9rZW4gaGllcmFyY2hpZXMgKHNwZWNpZmljVG9rZW5PZiBjaGFpbnMpIGFyZSBpbW11dGFibGUgXHUyMDE0IGNhY2hlIHBlciB0b2tlbi5cbmNvbnN0IHRva2VuQ2hhaW5DYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGVkVG9rZW5zID0gdG9rZW4gPT4ge1xuICBpZiAodG9rZW4gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlbXB0eUFycmF5O1xuICB9XG5cbiAgbGV0IGNhY2hlZCA9IHRva2VuQ2hhaW5DYWNoZS5nZXQodG9rZW4pO1xuXG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgY29uc3QgdG9rZW5zID0gW107XG4gIGxldCBjdXJyZW50ID0gdG9rZW47XG5cbiAgd2hpbGUgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHRva2Vucy5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LnNwZWNpZmljVG9rZW5PZjtcbiAgfVxuXG4gIHRva2VuQ2hhaW5DYWNoZS5zZXQodG9rZW4sIHRva2Vucyk7XG5cbiAgcmV0dXJuIHRva2Vucztcbn07XG5cbmV4cG9ydCBjb25zdCBpc1JlbGF0ZWRUb1Rva2VuID0gKHRva2VuLCBhbmNlc3RvcikgPT4ge1xuICBsZXQgY3VycmVudCA9IHRva2VuO1xuXG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IGFuY2VzdG9yKSByZXR1cm4gdHJ1ZTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5zcGVjaWZpY1Rva2VuT2Y7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBlbXB0eUFycmF5ID0gW107XG4iLCAiaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5cbi8vIENhY2hlZCBhcnJheSBwZXIgdG9rZW4gXHUyMDE0IGF2b2lkcyBzcHJlYWRpbmcgU2V0IHRvIEFycmF5IG9uIGV2ZXJ5IGluamVjdCgpIGNhbGwuXG4vLyBJbnZhbGlkYXRlZCBieSBzZXR0aW5nIHRvIG51bGwgd2hlbiB0aGUgU2V0IGlzIG11dGF0ZWQgKHJlZ2lzdGVyL2RlcmVnaXN0ZXIpLlxuY29uc3QgYXJyYXlDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5cbmNvbnN0IEVNUFRZID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbmNvbnN0IGdldENhY2hlZEFycmF5ID0gc2V0ID0+IHtcbiAgbGV0IGFyciA9IGFycmF5Q2FjaGUuZ2V0KHNldCk7XG5cbiAgaWYgKCFhcnIpIHtcbiAgICBhcnIgPSBbLi4uc2V0XTtcbiAgICBhcnJheUNhY2hlLnNldChzZXQsIGFycik7XG4gIH1cblxuICByZXR1cm4gYXJyO1xufTtcblxuZXhwb3J0IGNvbnN0IGludmFsaWRhdGVSZWxhdGVkSW5qZWN0YWJsZXNDYWNoZSA9IHNldCA9PiB7XG4gIGFycmF5Q2FjaGUuZGVsZXRlKHNldCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yID1cbiAgKHsgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLCBpbmplY3RhYmxlU2V0IH0pID0+XG4gIGFsaWFzID0+IHtcbiAgICBpZiAoaXNJbmplY3RhYmxlKGFsaWFzKSkge1xuICAgICAgcmV0dXJuIGluamVjdGFibGVTZXQuaGFzKGFsaWFzKSA/IFthbGlhc10gOiBFTVBUWTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGFsaWFzKTtcblxuICAgIGlmICghc2V0IHx8IHNldC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldENhY2hlZEFycmF5KHNldCk7XG4gIH07XG4iLCAiaW1wb3J0IHsgZ2V0TmFtZXNwYWNlZElkRm9yIH0gZnJvbSAnLi9nZXROYW1lc3BhY2VkSWRGb3InO1xuaW1wb3J0IHtcbiAgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbn0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHRvRmxhdEluamVjdGFibGVzIGZyb20gJy4vdG9GbGF0SW5qZWN0YWJsZXMnO1xuaW1wb3J0IHsgTHJ1Q29tcG9zaXRlTWFwIH0gZnJvbSAnLi4vY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcCc7XG5pbXBvcnQgeyBnZXRSZWxhdGVkVG9rZW5zLCBpc1JlbGF0ZWRUb1Rva2VuIH0gZnJvbSAnLi9nZXRSZWxhdGVkVG9rZW5zJztcbmltcG9ydCB7IGludmFsaWRhdGVSZWxhdGVkSW5qZWN0YWJsZXNDYWNoZSB9IGZyb20gJy4vZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yJztcbmltcG9ydCBmbG93IGZyb20gJy4vZmFzdEZsb3cnO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJGb3IgPVxuICAoe1xuICAgIHJlZ2lzdGVyU2luZ2xlLFxuICAgIGluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgcmVzb2x2ZUluamVjdGlvblRva2VuT2YsXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgfSkgPT5cbiAgKHsgaW5qZWN0YWJsZXMsIGNvbnRleHQsIHNvdXJjZSB9KSA9PiB7XG4gICAgY29uc3QgZmxhdEluamVjdGFibGVzID0gdG9GbGF0SW5qZWN0YWJsZXMoaW5qZWN0YWJsZXMpO1xuXG4gICAgLy8gUGhhc2UgMDogaW5zdGFudGlhdGlvbi1kZWNvcmF0b3ItdGFnZ2VkIGluamVjdGFibGVzLiBUaGV5IHJlZ2lzdGVyXG4gICAgLy8gICBmaXJzdCBzbyB0aGF0IGFueSBzYW1lLWJhdGNoIG92ZXJyaWRlcyBvZiAocmVnaXN0cmF0aW9uLSlkZWNvcmF0b3JzXG4gICAgLy8gICBhcmUgYWxyZWFkeSBpbiBwbGFjZSBieSB0aGUgdGltZSB0aG9zZSBkZWNvcmF0b3JzIGFyZSBpbnN0YW50aWF0ZWRcbiAgICAvLyAgIGluIHBoYXNlIDIuIFRoZXkgZ28gdGhyb3VnaCB0aGUgcmVnaXN0cmF0aW9uLWRlY29yYXRvciBwaXBlbGluZSBzb1xuICAgIC8vICAgcHJvZHVjdGlvbiBjb2RlIGNhbiBvcHQgdGhlbSBvdXQgdmlhIHRhZy90YXJnZXQta2V5ZWQgZGVjb3JhdG9ycy5cbiAgICAvLyBQaGFzZSAxOiByZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRhZ2dlZCBpbmplY3RhYmxlcy4gVGhleSByZWdpc3RlclxuICAgIC8vICAgZGlyZWN0bHkgdmlhIHJlZ2lzdGVyU2luZ2xlIChubyByZWN1cnNpdmUgZGVjb3JhdGlvbikgdG8gYXZvaWRcbiAgICAvLyAgIGJvb3RzdHJhcCBjaGFvcy5cbiAgICAvLyBQaGFzZSAyOiByZWd1bGFyIGluamVjdGFibGVzIHJlZ2lzdGVyIHRocm91Z2ggdGhlIGRlY29yYXRvciBwaXBlbGluZS5cbiAgICBjb25zdCBwaGFzZTBJbmplY3RhYmxlcyA9IFtdO1xuICAgIGNvbnN0IHJlZ2lzdGVyZWRSZWdpc3RyYXRpb25EZWNvcmF0b3JJbmplY3RhYmxlcyA9IFtdO1xuICAgIGNvbnN0IHBoYXNlMkluamVjdGFibGVzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZsYXRJbmplY3RhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5qZWN0YWJsZSA9IGZsYXRJbmplY3RhYmxlc1tpXTtcblxuICAgICAgLy8gUmVzb2x2ZWQgYmVmb3JlIGFueXRoaW5nIHJlYWRzIHRoZSB0b2tlbjogdGhlIHBoYXNlcyBiZWxvdyBzb3J0IGJ5IGl0LlxuICAgICAgcmVzb2x2ZUluamVjdGlvblRva2VuT2YoaW5qZWN0YWJsZSwgY29udGV4dCk7XG5cbiAgICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgICAgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0aW9uVG9rZW4sIHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuKSkge1xuICAgICAgICByZWdpc3RlclNpbmdsZShpbmplY3RhYmxlLCBjb250ZXh0KTtcbiAgICAgICAgcmVnaXN0ZXJlZFJlZ2lzdHJhdGlvbkRlY29yYXRvckluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICB9IGVsc2UgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0aW9uVG9rZW4sIGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbikpIHtcbiAgICAgICAgcGhhc2UwSW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBoYXNlMkluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJhdGNoSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgY29uc3QgcmVnaXN0ZXJlZEluamVjdGFibGVzID0gW107XG5cbiAgICBjb25zdCBmaXJlQ2FsbGJhY2tzRm9yID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgICBjb25zdCBjYWxsYmFja3MgPSBpbmplY3RNYW55KHtcbiAgICAgICAgYWxpYXM6IHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoZSB0b2tlbiBhcyByZXNvbHZlZCBmb3IgdGhpcyByZWdpc3RyYXRpb246IGFuIGBpbmplY3Rpb25Ub2tlbmAgZ2l2ZW5cbiAgICAgIC8vIGFzIGEgZnVuY3Rpb24gaXMgb3BhcXVlIHRvIGEgY2FsbGJhY2sgcmVhZGluZyB0aGUgaW5qZWN0YWJsZSBhbG9uZS5cbiAgICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjYWxsYmFja3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2pdKGluamVjdGFibGUsIGluamVjdGlvblRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJUaHJvdWdoUGlwZWxpbmUgPSBpbmplY3RhYmxlID0+IHtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgICAgICAgdGFyZ2V0OiBpbmplY3RhYmxlLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBzb3VyY2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUsIGNvbnRleHQpO1xuICAgICAgICByZWdpc3RlcmVkSW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgd2FzUmVnaXN0ZXJlZFRoaXNJbmplY3RhYmxlID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGJvdW5kUmVnaXN0ZXJTaW5nbGUgPSBpbmogPT4ge1xuICAgICAgICByZWdpc3RlclNpbmdsZShpbmosIGNvbnRleHQpO1xuICAgICAgICB3YXNSZWdpc3RlcmVkVGhpc0luamVjdGFibGUgPSB0cnVlO1xuXG4gICAgICAgIGlmICghYmF0Y2hJblByb2dyZXNzKSB7XG4gICAgICAgICAgZmlyZUNhbGxiYWNrc0ZvcihpbmopO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBkZWNvcmF0ZWRSZWdpc3RlciA9IGZsb3coLi4uZGVjb3JhdG9ycykoYm91bmRSZWdpc3RlclNpbmdsZSk7XG5cbiAgICAgIGRlY29yYXRlZFJlZ2lzdGVyKGluamVjdGFibGUpO1xuXG4gICAgICBpZiAod2FzUmVnaXN0ZXJlZFRoaXNJbmplY3RhYmxlKSB7XG4gICAgICAgIHJlZ2lzdGVyZWRJbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwaGFzZTBJbmplY3RhYmxlcy5mb3JFYWNoKHJlZ2lzdGVyVGhyb3VnaFBpcGVsaW5lKTtcbiAgICBwaGFzZTJJbmplY3RhYmxlcy5mb3JFYWNoKHJlZ2lzdGVyVGhyb3VnaFBpcGVsaW5lKTtcblxuICAgIGJhdGNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gaW5qZWN0TWFueSh7XG4gICAgICBhbGlhczogcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICB9KTtcblxuICAgIC8vIFNraXAgdGhlIHBlci1pbmplY3RhYmxlIGZvckVhY2ggbG9vcCBlbnRpcmVseSB3aGVuIG5vIHJlZ2lzdHJhdGlvblxuICAgIC8vIGNhbGxiYWNrcyBhcmUgd2lyZWQgdXAgXHUyMDE0IHRoaXMgYXZvaWRzIDMwaysgdHJpdmlhbCBmdW5jdGlvbiBjYWxsc1xuICAgIC8vIGR1cmluZyBhIDMway1pbmplY3RhYmxlIGJvb3RzdHJhcCB3aXRoIG5vIGNhbGxiYWNrcyAodGhlIHBlcmYtdGVzdFxuICAgIC8vIGNhc2UgYW5kIHRoZSBjb21tb24gY2FzZSkuXG4gICAgaWYgKGNhbGxiYWNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJlQmF0Y2hDYWxsYmFja3MgPSBpbmplY3RhYmxlID0+IHtcbiAgICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjYWxsYmFja3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2pdKGluamVjdGFibGUsIGluamVjdGlvblRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVnaXN0ZXJlZFJlZ2lzdHJhdGlvbkRlY29yYXRvckluamVjdGFibGVzLmZvckVhY2goZmlyZUJhdGNoQ2FsbGJhY2tzKTtcbiAgICByZWdpc3RlcmVkSW5qZWN0YWJsZXMuZm9yRWFjaChmaXJlQmF0Y2hDYWxsYmFja3MpO1xuICB9O1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJTaW5nbGVGb3IgPSAoe1xuICBpbmplY3RhYmxlU2V0LFxuICBpbmplY3RhYmxlSWRTZXQsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxuICBjaGlsZHJlbkJ5UGFyZW50TWFwLFxuICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gIHJlc29sdmVJbmplY3Rpb25Ub2tlbk9mLFxuICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxufSkgPT4ge1xuICBjb25zdCBnZXROYW1lc3BhY2VkSWQgPSBnZXROYW1lc3BhY2VkSWRGb3IoaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQpO1xuXG4gIHJldHVybiAoaW5qZWN0YWJsZSwgaW5qZWN0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGluamVjdGFibGVJZCA9IGluamVjdGFibGUuaWQ7XG5cbiAgICBpZiAoIWluamVjdGFibGVJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byByZWdpc3RlciBpbmplY3RhYmxlIHdpdGhvdXQgSUQuJyk7XG4gICAgfVxuXG4gICAgLy8gQSByZWdpc3RyYXRpb24gZGVjb3JhdG9yIG1heSBoYW5kIGluIGFuIGluamVjdGFibGUgdGhlIGJhdGNoIG5ldmVyIHNhdyxcbiAgICAvLyBzbyB0aGUgdG9rZW4gaXMgcmVzb2x2ZWQgaGVyZSB0b287IHJlc29sdmluZyB0d2ljZSBpcyBoYXJtbGVzcy5cbiAgICByZXNvbHZlSW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlLCBpbmplY3Rpb25Db250ZXh0KTtcblxuICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgIC8vIEJ1aWxkIHJldmVyc2UgaW5kZXg6IGZvciBlYWNoIHBhcmVudCBpbiB0aGUgY29udGV4dCwgcmVjb3JkIHRoaXMgaW5qZWN0YWJsZSBhcyBhIGNoaWxkLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5qZWN0aW9uQ29udGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGFyZW50ID0gaW5qZWN0aW9uQ29udGV4dFtpXS5pbmplY3RhYmxlO1xuICAgICAgbGV0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudE1hcC5nZXQocGFyZW50KTtcblxuICAgICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgICBjaGlsZHJlbiA9IG5ldyBTZXQoKTtcbiAgICAgICAgY2hpbGRyZW5CeVBhcmVudE1hcC5zZXQocGFyZW50LCBjaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkcmVuLmFkZChpbmplY3RhYmxlKTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IHBhdGg6IGNvbnRhaW5lci1sZXZlbCByZWdpc3RyYXRpb24gKHRoZSBkb21pbmFudCBjYXNlKSB5aWVsZHMgYVxuICAgIC8vIG5hbWVzcGFjZWQgaWQgZXF1YWwgdG8gdGhlIGJhcmUgaWQgXHUyMDE0IHNraXAgdGhlIE1hcCByb3VuZHRyaXAgKyBwYXJlbnRcbiAgICAvLyB3YWxrIGluc2lkZSBnZXROYW1lc3BhY2VkSWQsIGFuZCBza2lwIHJlY29yZGluZyB0aGUgcmVnaXN0cmF0aW9uXG4gICAgLy8gY29udGV4dCBhbHRvZ2V0aGVyIChgZ2V0TmFtZXNwYWNlZElkRm9yYCBhbmQgYGRlcmVnaXN0ZXJgIGJvdGggdHJlYXRcbiAgICAvLyBhIG1pc3NpbmcgZW50cnkgYXMgXCJubyBuZXN0ZWQgY29udGV4dFwiIGFscmVhZHkpLlxuICAgIGNvbnN0IGltbWVkaWF0ZVBhcmVudCA9XG4gICAgICBpbmplY3Rpb25Db250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgPyBpbmplY3Rpb25Db250ZXh0W2luamVjdGlvbkNvbnRleHQubGVuZ3RoIC0gMV1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBpc0NvbnRhaW5lckxldmVsID1cbiAgICAgICFpbW1lZGlhdGVQYXJlbnQgfHwgaW1tZWRpYXRlUGFyZW50LmluamVjdGFibGUuYWxpYXNUeXBlID09PSAnY29udGFpbmVyJztcblxuICAgIGlmICghaXNDb250YWluZXJMZXZlbCkge1xuICAgICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQuc2V0KGluamVjdGFibGUsIGluamVjdGlvbkNvbnRleHQpO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWVzcGFjZWRJZCA9IGlzQ29udGFpbmVyTGV2ZWxcbiAgICAgID8gaW5qZWN0YWJsZUlkXG4gICAgICA6IGdldE5hbWVzcGFjZWRJZChpbmplY3RhYmxlKTtcblxuICAgIGlmIChuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byByZWdpc3RlciBzYW1lIGluamVjdGFibGUgbXVsdGlwbGUgdGltZXM6IFwiJHtuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KFxuICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICl9XCJgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaW5qZWN0YWJsZUlkU2V0LmhhcyhuYW1lc3BhY2VkSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byByZWdpc3RlciBtdWx0aXBsZSBpbmplY3RhYmxlcyBmb3IgSUQgXCIke25hbWVzcGFjZWRJZH1cImAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHVwcGVyQm91bmRlZENhcmRpbmFsaXR5ID1cbiAgICAgIGluamVjdGlvblRva2VuPy5jYXJkaW5hbGl0eSA9PT0gJ29uZScgfHxcbiAgICAgIGluamVjdGlvblRva2VuPy5jYXJkaW5hbGl0eSA9PT0gJ3plcm8tb3Itb25lJ1xuICAgICAgICA/IGluamVjdGlvblRva2VuLmNhcmRpbmFsaXR5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKHVwcGVyQm91bmRlZENhcmRpbmFsaXR5KSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGluamVjdGlvblRva2VuO1xuICAgICAgY29uc3QgcmVnaXN0ZXJlZCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQodG9rZW4pO1xuXG4gICAgICBpZiAocmVnaXN0ZXJlZCkge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiByZWdpc3RlcmVkKSB7XG4gICAgICAgICAgLy8gRXhhY3QgcmVnaXN0cmF0aW9ucyBvbmx5OiB0aGUgaW5kZXggYWxzbyBob2xkcyBgLmZvcigpYFxuICAgICAgICAgIC8vIGRlc2NlbmRhbnRzIG9mIHRoZSB0b2tlbiwgYW5kIHNwZWNpYWxpemF0aW9uIG11c3Qgbm90IGJlXG4gICAgICAgICAgLy8gb3V0bGF3ZWQgYnkgdGhlIGJhc2UgdG9rZW4ncyBib3VuZC5cbiAgICAgICAgICBpZiAoZ2V0SW5qZWN0aW9uVG9rZW5PZihtZW1iZXIpID09PSB0b2tlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgaW5qZWN0YWJsZSBcIiR7bmFtZXNwYWNlZElkfVwiIHdpdGggaW5qZWN0aW9uIHRva2VuIFwiJHtcbiAgICAgICAgICAgICAgICB0b2tlbi5pZFxuICAgICAgICAgICAgICB9XCIsIGJ1dCBpdHMgY2FyZGluYWxpdHkgXCIke3VwcGVyQm91bmRlZENhcmRpbmFsaXR5fVwiIGFsbG93cyBhdCBtb3N0IG9uZSByZWdpc3RyYXRpb24gYW5kIFwiJHtuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KFxuICAgICAgICAgICAgICAgIG1lbWJlcixcbiAgICAgICAgICAgICAgKX1cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5qZWN0YWJsZUlkU2V0LmFkZChuYW1lc3BhY2VkSWQpO1xuICAgIGluamVjdGFibGVTZXQuYWRkKGluamVjdGFibGUpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5zZXQoaW5qZWN0YWJsZSwgbmFtZXNwYWNlZElkKTtcbiAgICBpZiAoaW5qZWN0aW9uVG9rZW4/LmFic3RyYWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byByZWdpc3RlciBpbmplY3RhYmxlIFwiJHtuYW1lc3BhY2VkSWR9XCIgd2l0aCBpbmplY3Rpb24gdG9rZW4gXCIke2luamVjdGlvblRva2VuLmlkfVwiLCBidXQgaXQgaXMgYWJzdHJhY3QuIFVzZSBcIi5mb3Ioc3BlY2lmaWVyKVwiIGZvciBhIGNvbmNyZXRlIHRva2VuLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1heENhY2hlU2l6ZSA9IGluamVjdGFibGUubWF4Q2FjaGVTaXplID8/IGluamVjdGlvblRva2VuPy5tYXhDYWNoZVNpemU7XG5cbiAgICAvLyBMUlUgaXMgb25seSBtZWFuaW5nZnVsIGZvciBrZXllZCBsaWZlY3ljbGVzIFx1MjAxNCBzaW5nbGV0b25zIGhvbGQgb25lXG4gICAgLy8gaW5zdGFuY2UgYW5kIHdvdWxkIG5ldmVyIG92ZXJmbG93LiBGb3Iga2V5ZWQgbGlmZWN5Y2xlcyB3aXRoIGEgc2l6ZVxuICAgIC8vIGNhcCwgYWxsb2NhdGUgZWFnZXJseSBzbyB0aGUgZXZpY3Rpb24gY2FsbGJhY2sgaXMgd2lyZWQgYmVmb3JlIGFueVxuICAgIC8vIHN0b3JlLiBGb3IgZXZlcnl0aGluZyBlbHNlLCB0aGUgbWFwIGlzIGFsbG9jYXRlZCBsYXppbHkgb24gZmlyc3RcbiAgICAvLyBzdG9yZSAoc2luZ2xldG9ucyBzdG9yZSB0aGUgaW5zdGFuY2UgZGlyZWN0bHk7IGtleWVkU2luZ2xldG9uIHN0b3Jlc1xuICAgIC8vIGEgQ29tcG9zaXRlTWFwIFx1MjAxNCBzZWUgcHJpdmF0ZUluamVjdEZvci5qcykuXG4gICAgaWYgKG1heENhY2hlU2l6ZSA+IDAgJiYgaW5qZWN0YWJsZS5saWZlY3ljbGUuaWQgIT09ICdzaW5nbGV0b24nKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZU1hcCA9IG5ldyBMcnVDb21wb3NpdGVNYXAobWF4Q2FjaGVTaXplLCB7XG4gICAgICAgIG9uRXZpY3Q6IChpbnN0YW5jZSwga2V5QXJyYXkpID0+XG4gICAgICAgICAgZmlyZVB1cmdlQ2FsbGJhY2tzKGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSksXG4gICAgICB9KTtcblxuICAgICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLnNldChpbmplY3RhYmxlLCBpbnN0YW5jZU1hcCk7XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5zID0gZ2V0UmVsYXRlZFRva2VucyhpbmplY3Rpb25Ub2tlbik7XG5cbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbdF07XG4gICAgICBsZXQgaW5qZWN0YWJsZXNTZXQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KHRva2VuKTtcblxuICAgICAgaWYgKCFpbmplY3RhYmxlc1NldCkge1xuICAgICAgICBpbmplY3RhYmxlc1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLnNldCh0b2tlbiwgaW5qZWN0YWJsZXNTZXQpO1xuICAgICAgfVxuXG4gICAgICBpbmplY3RhYmxlc1NldC5hZGQoaW5qZWN0YWJsZSk7XG4gICAgICBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUoaW5qZWN0YWJsZXNTZXQpO1xuICAgIH1cbiAgfTtcbn07XG4iLCAiaW1wb3J0IHsgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgaXNDb21wb3NpdGVTdG9yYWdlIH0gZnJvbSAnLi9wcml2YXRlSW5qZWN0Rm9yJztcblxuY29uc3Qgc2luZ2xldG9uS2V5QXJyYXkgPSBbc3RvcmVkSW5zdGFuY2VLZXldO1xuXG5jb25zdCBrZXlBcnJheVN0YXJ0c1dpdGggPSAoa2V5QXJyYXksIHByZWZpeCkgPT4ge1xuICBpZiAocHJlZml4Lmxlbmd0aCA+IGtleUFycmF5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChrZXlBcnJheVtpXSAhPT0gcHJlZml4W2ldKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5jb25zdCBldmljdCA9IChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpID0+IHtcbiAgZm9yIChjb25zdCBpbmplY3RhYmxlIG9mIGluamVjdGFibGVzSW5TY29wZSkge1xuICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgaWYgKHN0b3JlZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICghaXNDb21wb3NpdGVTdG9yYWdlKHN0b3JlZCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAga2V5UGFydHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIGtleUFycmF5U3RhcnRzV2l0aChzaW5nbGV0b25LZXlBcnJheSwga2V5UGFydHMpXG4gICAgICApIHtcbiAgICAgICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChrZXlQYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHN0b3JlZC5jbGVhcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZWQuZGVsZXRlQnlQcmVmaXgoa2V5UGFydHMpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gUHVyZ2VzIHRoZSBzdG9yZWQgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gc2V0IG9mIGluamVjdGFibGVzLiBTaGFyZWQgYnkgdGhlXG4vLyBjb250YWluZXItd2lkZSBwdXJnZSBhbmQgdGhlIHNjb3BlLXJlc3RyaWN0ZWQgb25lLCBzbyB0aGF0IGJvdGggZmlyZVxuLy8gaW5zdGFuY2UtcHVyZ2UgY2FsbGJhY2tzIHRoZSBzYW1lIHdheS5cbmV4cG9ydCBjb25zdCBwdXJnZVN0b3JlZEluc3RhbmNlc0ZvciA9XG4gICh7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pID0+XG4gIChpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKSA9PiB7XG4gICAgLy8gTm90aGluZyBjYW4gb2JzZXJ2ZSB0aGlzIHB1cmdlLCBzbyBza2lwIGdhdGhlcmluZyB0aGUgc25hcHNob3QgYW5kIGdvXG4gICAgLy8gc3RyYWlnaHQgdG8gZXZpY3Rpb24gXHUyMDE0IHRoZSBzYW1lIHJ1bGUgdGhlIGluamVjdCB3aXJpbmcgZm9sbG93cywgd2hlcmUgYVxuICAgIC8vIGNvbnRhaW5lciB3aXRoIG5vIGRlY29yYXRvcnMgcGF5cyBmb3Igbm9uZS5cbiAgICBpZiAoIWFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCgpKSB7XG4gICAgICBldmljdChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFBoYXNlIDEgXHUyMDE0IEdhdGhlciBzbmFwc2hvdCB0dXBsZXMgd2l0aG91dCBtdXRhdGluZyBjYWNoZXMuIFRoZSBzdG9yZWRcbiAgICAvLyB2YWx1ZSBpcyBkaXNwYXRjaGVkIHN0cnVjdHVyYWxseTogYSBDb21wb3NpdGVNYXAtc2hhcGUgc3RvcmVzIGtleWVkXG4gICAgLy8gZW50cmllczsgYW55dGhpbmcgZWxzZSBpcyBhIGRpcmVjdGx5LXN0b3JlZCBpbnN0YW5jZSAoc2luZ2xldG9uIG9yXG4gICAgLy8gdjItZGVmYXVsdC1uby1hcmdzKS5cbiAgICBjb25zdCB0dXBsZXMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgaW5qZWN0YWJsZSBvZiBpbmplY3RhYmxlc0luU2NvcGUpIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgICBpZiAoc3RvcmVkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoIWlzQ29tcG9zaXRlU3RvcmFnZShzdG9yZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXlQYXJ0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgIWtleUFycmF5U3RhcnRzV2l0aChzaW5nbGV0b25LZXlBcnJheSwga2V5UGFydHMpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHR1cGxlcy5wdXNoKHtcbiAgICAgICAgICBpbmplY3RhYmxlLFxuICAgICAgICAgIGluc3RhbmNlOiBzdG9yZWQsXG4gICAgICAgICAga2V5QXJyYXk6IHNpbmdsZXRvbktleUFycmF5LFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgW2tleUFycmF5LCBpbnN0YW5jZV0gb2Ygc3RvcmVkLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoa2V5UGFydHMubGVuZ3RoID4gMCAmJiAha2V5QXJyYXlTdGFydHNXaXRoKGtleUFycmF5LCBrZXlQYXJ0cykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0dXBsZXMucHVzaCh7IGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQaGFzZSAyIFx1MjAxNCBGaXJlIGNhbGxiYWNrcy4gQ2FjaGVzIHN0YXkgcG9wdWxhdGVkIHNvIHBlZXItY29vcmRpbmF0aW9uXG4gICAgLy8gaW5zaWRlIGEgY2FsbGJhY2sgd29ya3MgKGBkaS5pbmplY3QocGVlcilgIHJldHVybnMgdGhlIGNhY2hlZCBpbnN0YW5jZSkuXG4gICAgZm9yIChjb25zdCB7IGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSB9IG9mIHR1cGxlcykge1xuICAgICAgZmlyZVB1cmdlQ2FsbGJhY2tzKGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSk7XG4gICAgfVxuXG4gICAgLy8gUGhhc2UgMyBcdTIwMTQgRXZpY3QuIFN3ZWVwcyBib3RoIHRoZSBvcmlnaW5hbCBzbmFwc2hvdCBlbnRyaWVzIGFuZCBhbnl0aGluZ1xuICAgIC8vIHJlLXBvcHVsYXRlZCBieSBwaGFzZSAyIGNhbGxiYWNrcy4gQ2FsbGJhY2tzIGRvIE5PVCByZS1maXJlIGhlcmUuXG4gICAgZXZpY3QoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IHB1cmdlSW5zdGFuY2VzRm9yID0gKHtcbiAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxufSkgPT4ge1xuICBjb25zdCBwdXJnZVN0b3JlZEluc3RhbmNlcyA9IHB1cmdlU3RvcmVkSW5zdGFuY2VzRm9yKHtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxuICAgIGFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCxcbiAgfSk7XG5cbiAgcmV0dXJuIChhbGlhcywgLi4ua2V5UGFydHMpID0+XG4gICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoXG4gICAgICBhbGlhcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gWy4uLmluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5rZXlzKCldXG4gICAgICAgIDogZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKSxcbiAgICAgIGtleVBhcnRzLFxuICAgICk7XG59O1xuIiwgImltcG9ydCB7XG4gIGRlcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgZGVyZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIHByZUluamVjdENhbGxiYWNrVG9rZW4sXG59IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB0b0ZsYXRJbmplY3RhYmxlcyBmcm9tICcuL3RvRmxhdEluamVjdGFibGVzJztcbmltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0UmVsYXRlZFRva2VucywgaXNSZWxhdGVkVG9Ub2tlbiB9IGZyb20gJy4vZ2V0UmVsYXRlZFRva2Vucyc7XG5pbXBvcnQgeyBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUgfSBmcm9tICcuL2dldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcic7XG5pbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0ZXJGb3IgPVxuICAoe1xuICAgIGluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAvLyBUb2RvOiBnZXQgcmlkIG9mIGZ1bmN0aW9uIHVzYWdlLlxuICAgIGdldERpLFxuICAgIGRlY29yYXRvckNhY2hlLFxuICAgIHN5bmNJbmplY3RXaXJpbmcsXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgICBmb3JnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICB9KSA9PlxuICAoeyBpbmplY3RhYmxlcywgY29udGV4dCwgc291cmNlIH0pID0+IHtcbiAgICAvLyBDb2xsZWN0IGNhbGxiYWNrcyBmaXJzdCAod2hpbGUgYWxsIGluamVjdGFibGVzIGFyZSBzdGlsbCByZWdpc3RlcmVkKVxuICAgIGNvbnN0IGNhbGxiYWNrcyA9IGluamVjdE1hbnkoe1xuICAgICAgYWxpYXM6IGRlcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGZsYXRJbmplY3RhYmxlcyA9IHRvRmxhdEluamVjdGFibGVzKGluamVjdGFibGVzKTtcblxuICAgIC8vIEZpcmUgY2FsbGJhY2tzIGZvciBhbGwgaW5qZWN0YWJsZXMgYmVpbmcgZGVyZWdpc3RlcmVkIChvcmlnaW5hbCBiYXRjaCBzZW1hbnRpY3MpLFxuICAgIC8vIGVhY2ggd2l0aCB0aGUgdG9rZW4gaXQgd2FzIHJlZ2lzdGVyZWQgdW5kZXIuXG4gICAgZmxhdEluamVjdGFibGVzLmZvckVhY2goaW5qZWN0YWJsZSA9PiB7XG4gICAgICBjb25zdCBpbmplY3Rpb25Ub2tlbiA9IGdldEluamVjdGlvblRva2VuT2YoaW5qZWN0YWJsZSk7XG5cbiAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IHtcbiAgICAgICAgY2FsbGJhY2soaW5qZWN0YWJsZSwgaW5qZWN0aW9uVG9rZW4pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBkaSA9IGdldERpKCk7XG5cbiAgICBjb25zdCBkZXJlZ2lzdGVyU2luZ2xlID0gZGVyZWdpc3RlclNpbmdsZUZvcih7XG4gICAgICBpbmplY3RhYmxlU2V0LFxuICAgICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG4gICAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgICBwdXJnZUluc3RhbmNlcyxcbiAgICAgIGluamVjdGFibGVJZFNldCxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gICAgICBkaSxcbiAgICAgIGdldEluamVjdGlvblRva2VuT2YsXG4gICAgICBmb3JnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICAgIH0pO1xuXG4gICAgbGV0IGluamVjdFdpcmluZ0NoYW5nZWQgPSBmYWxzZTtcblxuICAgIGZsYXRJbmplY3RhYmxlcy5mb3JFYWNoKGluamVjdGFibGUgPT4ge1xuICAgICAgY29uc3QgaW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUpO1xuXG4gICAgICBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3Rpb25Ub2tlbiwgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4pKSB7XG4gICAgICAgIGRlY29yYXRvckNhY2hlLmluamVjdGlvbiA9IG51bGw7XG4gICAgICAgIGluamVjdFdpcmluZ0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3Rpb25Ub2tlbiwgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbikpIHtcbiAgICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID0gbnVsbDtcbiAgICAgICAgaW5qZWN0V2lyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiBkZXJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuLFxuICAgICAgICB0YXJnZXQ6IGluamVjdGFibGUsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVyZWdpc3RlclNpbmdsZShpbmplY3RhYmxlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWNvcmF0ZWREZXJlZ2lzdGVyID0gZmxvdyguLi5kZWNvcmF0b3JzKShkZXJlZ2lzdGVyU2luZ2xlKTtcblxuICAgICAgZGVjb3JhdGVkRGVyZWdpc3RlcihpbmplY3RhYmxlKTtcbiAgICB9KTtcblxuICAgIC8vIFJlY29tcHV0ZWQgZnJvbSB0aGUgcmVnaXN0cmF0aW9uIGluZGV4IGFmdGVyIHRoZSByZW1vdmFscywgc28gYVxuICAgIC8vIGRlcmVnaXN0cmF0aW9uIGRlY29yYXRvciB0aGF0IHByZXZlbnRlZCB0aGUgcmVtb3ZhbCBpcyBoYW5kbGVkIHRvby5cbiAgICBpZiAoaW5qZWN0V2lyaW5nQ2hhbmdlZCkge1xuICAgICAgc3luY0luamVjdFdpcmluZygpO1xuICAgIH1cbiAgfTtcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0ZXJTaW5nbGVGb3IgPVxuICAoe1xuICAgIGluamVjdGFibGVTZXQsXG4gICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBwdXJnZUluc3RhbmNlcyxcbiAgICBpbmplY3RhYmxlSWRTZXQsXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gICAgZGksXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgICBmb3JnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICB9KSA9PlxuICBpbmplY3RhYmxlID0+IHtcbiAgICBpZiAoaXNJbmplY3Rpb25Ub2tlbihpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gZGVyZWdpc3RlciB1c2luZyBpbmplY3Rpb24gdG9rZW4gXCIke2luamVjdGFibGUuaWR9XCIsIGJ1dCBkZXJlZ2lzdHJhdGlvbiB1c2luZyB0b2tlbiBpcyBpbGxlZ2FsLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghaW5qZWN0YWJsZVNldC5oYXMoaW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGRlcmVnaXN0ZXIgbm9uLXJlZ2lzdGVyZWQgaW5qZWN0YWJsZSBcIiR7aW5qZWN0YWJsZS5pZH1cIi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDYXNjYWRlIGRlcmVnaXN0ZXIgY2hpbGRyZW4gdXNpbmcgdGhlIHJldmVyc2UgaW5kZXggKE8oMSkgbG9va3VwKS5cbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KGluamVjdGFibGUpO1xuXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQuZGVsZXRlKGNoaWxkKTtcblxuICAgICAgICBpZiAoaW5qZWN0YWJsZVNldC5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgZGkuZGVyZWdpc3Rlcih7XG4gICAgICAgICAgICBpbmplY3RhYmxlczogW2NoaWxkXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAuZGVsZXRlKGluamVjdGFibGUpO1xuICAgIH1cblxuICAgIHB1cmdlSW5zdGFuY2VzKGluamVjdGFibGUpO1xuICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICBjb25zdCBuYW1lc3BhY2VkSWQgPSBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGFibGUpO1xuICAgIGluamVjdGFibGVJZFNldC5kZWxldGUobmFtZXNwYWNlZElkKTtcbiAgICBpbmplY3RhYmxlU2V0LmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZGVsZXRlKGluamVjdGFibGUpO1xuXG4gICAgY29uc3QgdG9rZW5zID0gZ2V0UmVsYXRlZFRva2VucyhnZXRJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUpKTtcblxuICAgIHRva2Vucy5mb3JFYWNoKHRva2VuID0+IHtcbiAgICAgIGNvbnN0IHRva2VuU2V0ID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldCh0b2tlbik7XG4gICAgICB0b2tlblNldC5kZWxldGUoaW5qZWN0YWJsZSk7XG4gICAgICBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUodG9rZW5TZXQpO1xuICAgIH0pO1xuXG4gICAgLy8gUmVzb2x2ZWQgcGVyIHJlZ2lzdHJhdGlvbiwgc28gYSBsYXRlciByZWdpc3RyYXRpb24sIGluIGFub3RoZXIgc2NvcGUsXG4gICAgLy8gcmVzb2x2ZXMgYWZyZXNoLlxuICAgIGZvcmdldEluamVjdGlvblRva2VuT2YoaW5qZWN0YWJsZSk7XG5cbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuZGVsZXRlKGluamVjdGFibGUpO1xuICB9O1xuIiwgImV4cG9ydCBjb25zdCBvdmVycmlkZUZvciA9XG4gICh7IGdldFJlbGF0ZWRJbmplY3RhYmxlcywgZWFybHlPdmVycmlkZSB9KSA9PlxuICAoYWxpYXMsIGluc3RhbnRpYXRlU3R1YikgPT4ge1xuICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGFsaWFzLmFsaWFzVHlwZSA9PT0gJ2luamVjdGlvbi10b2tlbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUcmllZCB0byBvdmVycmlkZSBzaW5nbGUgaW1wbGVtZW50YXRpb24gb2YgaW5qZWN0aW9uIHRva2VuIFwiJHthbGlhcy5pZH1cIiwgYnV0IGZvdW5kIG5vIHJlZ2lzdGVyZWQgaW1wbGVtZW50YXRpb25zLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIFwiJHthbGlhcy5pZH1cIiB3aGljaCBpcyBub3QgcmVnaXN0ZXJlZC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBlYXJseU92ZXJyaWRlKGFsaWFzLCBpbnN0YW50aWF0ZVN0dWIpO1xuICB9O1xuXG5leHBvcnQgY29uc3QgdW5vdmVycmlkZUZvciA9XG4gICh7IG92ZXJyaWRpbmdJbmplY3RhYmxlcywgZ2V0UmVsYXRlZEluamVjdGFibGVzLCBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgYWxpYXMgPT4ge1xuICAgIGNvbnN0IFtpbmplY3RhYmxlXSA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICBpZiAoIWluamVjdGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIHVub3ZlcnJpZGUgXCIke2FsaWFzLmlkfVwiLCBidXQgaXQgd2FzIG5vdCByZWdpc3RlcmVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghb3ZlcnJpZGluZ0luamVjdGFibGVzLmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gdW5vdmVycmlkZSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdCB3YXMgbm90IG92ZXJyaWRkZW4uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JOb01hdGNoZXNGb3IgPVxuICAoeyBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKHJlbGF0ZWRJbmplY3RhYmxlcywgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IG5vbi1yZWdpc3RlcmVkIGluamVjdGFibGUgXCIke1xuICAgICAgICAgIGFsaWFzLmlkXG4gICAgICAgIH1cIiBmcm9tIFwiJHtnZXROYW1lc3BhY2VkSWQoaW5qZWN0aW5nSW5qZWN0YWJsZSl9XCIuYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0ZvclRvb01hbnlNYXRjaGVzRm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gIChyZWxhdGVkSW5qZWN0YWJsZXMsIGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKSA9PiB7XG4gICAgaWYgKHJlbGF0ZWRJbmplY3RhYmxlcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3Qgc2luZ2xlIGluamVjdGFibGUgZm9yIGluamVjdGlvbiB0b2tlbiBcIiR7XG4gICAgICAgICAgYWxpYXMuaWRcbiAgICAgICAgfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiIGJ1dCBmb3VuZCBtdWx0aXBsZSBpbmplY3RhYmxlczogXCIke3JlbGF0ZWRJbmplY3RhYmxlc1xuICAgICAgICAgIC5tYXAoZ2V0TmFtZXNwYWNlZElkKVxuICAgICAgICAgIC5qb2luKCdcIiwgXCInKX1cImAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JTaWRlRWZmZWN0c0ZvciA9XG4gICh7IGdldFNpZGVFZmZlY3RzQXJlUHJldmVudGVkLCBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKGluamVjdGFibGUsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAoZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQoaW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGluamVjdCBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICl9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIgd2hlbiBzaWRlLWVmZmVjdHMgYXJlIHByZXZlbnRlZC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiZXhwb3J0IGNvbnN0IGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvciA9XG4gICh7IGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAoYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAoYWxpYXMuYWJzdHJhY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGluamVjdCBpbmplY3Rpb24gdG9rZW4gXCIke2FsaWFzLmlkfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaXQgaXMgYWJzdHJhY3QuIFVzZSBcIi5mb3Ioc3BlY2lmaWVyKVwiIGZvciBhIGNvbmNyZXRlIHRva2VuLmAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gIChhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChhbGlhcy5jYXJkaW5hbGl0eSAhPT0gJ3plcm8tb3Itb25lJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0TWF5YmUgXCIke2FsaWFzLmlkfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaXRzIGNhcmRpbmFsaXR5IGlzIFwiJHtcbiAgICAgICAgICBhbGlhcy5jYXJkaW5hbGl0eVxuICAgICAgICB9XCIgaW5zdGVhZCBvZiBcInplcm8tb3Itb25lXCIuYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImltcG9ydCBpc0luamVjdGFibGUgZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZS9pc0luamVjdGFibGUnO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5cbi8vIERlY2xhcmVkIHNldHMgYXJlIGRlcml2ZWQgb25jZSBwZXIgaW5qZWN0YWJsZTogYSBgY29uc3VtcHRpb25zYCBhcnJheSBpc1xuLy8gZml4ZWQgYXQgY3JlYXRpb24sIGFuZCBpbmplY3RhYmxlIGlkZW50aXR5IG91dGxpdmVzIGFueSBzaW5nbGUgY29udGFpbmVyLlxuY29uc3QgZGVjbGFyZWRTZXRzQnlJbmplY3RhYmxlID0gbmV3IFdlYWtNYXAoKTtcblxuY29uc3QgZ2V0RGVjbGFyZWRTZXQgPSBpbmplY3RhYmxlID0+IHtcbiAgbGV0IGRlY2xhcmVkID0gZGVjbGFyZWRTZXRzQnlJbmplY3RhYmxlLmdldChpbmplY3RhYmxlKTtcblxuICBpZiAoIWRlY2xhcmVkKSB7XG4gICAgZGVjbGFyZWQgPSBuZXcgU2V0KGluamVjdGFibGUuY29uc3VtcHRpb25zID8/IFtdKTtcbiAgICBkZWNsYXJlZFNldHNCeUluamVjdGFibGUuc2V0KGluamVjdGFibGUsIGRlY2xhcmVkKTtcbiAgfVxuXG4gIHJldHVybiBkZWNsYXJlZDtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvciA9XG4gICh7IGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAoeyBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgLy8gT25seSBpbmplY3RhYmxlMiBkZWNsYXJlcyBjb25zdW1wdGlvbnMuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBleGVtcHQgYnlcbiAgICAvLyB0aGlzIG9uZSBjaGVjazogdGhlIGNvbnRhaW5lciByb290LCB2MSBpbmplY3RhYmxlcywgYW5kIHRoZSB0b2tlbiB0aGF0XG4gICAgLy8gc3RhbmRzIGluIGFzIHRoZSBpbmplY3RpbmcgcGFydHkgZm9yIGluamVjdE1hbnkncyBlbGVtZW50IGluamVjdHMuXG4gICAgaWYgKGluamVjdGluZ0luamVjdGFibGUuYWxpYXNUeXBlICE9PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluamVjdGluZyBhbiBpbmplY3RhYmxlIGJ5IHJlZmVyZW5jZSBhbHJlYWR5IGltcGxpZXMgYSBkZXBlbmRlbmN5IG9uXG4gICAgLy8gd2hhdGV2ZXIgcGFja2FnZSBpdCBsaXZlcyBpbiwgc28gb25seSB0b2tlbnMgYXJlIGRlY2xhcmVkLlxuICAgIGlmIChpc0luamVjdGFibGUoYWxpYXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVjbGFyZWQgPSBnZXREZWNsYXJlZFNldChpbmplY3RpbmdJbmplY3RhYmxlKTtcblxuICAgIC8vIERlY2xhcmluZyBhIGdlbmVyYWwgdG9rZW4gY292ZXJzIGV2ZXJ5IGAuZm9yKClgIGRlcml2YXRpdmUgb2YgaXQsIHdoaWNoXG4gICAgLy8gaXMgd2hhdCBtYWtlcyBydW50aW1lIHNwZWNpZmllcnMgZGVjbGFyYWJsZSBhdCBhbGwuIFRoZSB3YWxrIGlzIHVwd2FyZHNcbiAgICAvLyBvbmx5OiBkZWNsYXJpbmcgYSBzcGVjaWZpYyB0b2tlbiBkb2VzIG5vdCBjb3ZlciBpdHMgZ2VuZXJhbCB0b2tlbi5cbiAgICBsZXQgY2FuZGlkYXRlID0gYWxpYXM7XG5cbiAgICB3aGlsZSAoY2FuZGlkYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChkZWNsYXJlZC5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5zcGVjaWZpY1Rva2VuT2Y7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRyaWVkIHRvIGluamVjdCBcIiR7YWxpYXMuaWR9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgKX1cIiwgYnV0IGl0IGlzIG5vdCBhIGRlY2xhcmVkIGNvbnN1bXB0aW9uLmAsXG4gICAgKTtcbiAgfTtcbiIsICJpbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcblxuY29uc3QgaXNUb2tlbjIgPSBhbGlhcyA9PiBhbGlhcy5hbGlhc1R5cGUgPT09ICdpbmplY3Rpb24tdG9rZW4yJztcblxuLy8gUmVhZC1vbmx5OiByZWFkcyB0aGUgcmVnaXN0cmF0aW9uIHN0YXRlIGRpcmVjdGx5IGFuZCBob2xkcyBub3RoaW5nIG9mIGl0c1xuLy8gb3duLCBzbyByZWdpc3RlcmluZyBhZnRlciB2YWxpZGF0aW5nIHdvcmtzIGFuZCB2YWxpZGF0aW5nIGFnYWluIHJlZmxlY3RzIGl0LlxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRm9yID1cbiAgKHtcbiAgICBjb250YWluZXJJZCxcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICB9KSA9PlxuICAoKSA9PiB7XG4gICAgY29uc3QgdmVyaWZpZWRJZHMgPSBbXTtcbiAgICBjb25zdCB1bnZlcmlmaWVkSWRzID0gW107XG4gICAgY29uc3QgdW52ZXJpZmlhYmxlQ29uc3VtcHRpb25zID0gW107XG4gICAgY29uc3QgdmlvbGF0aW9ucyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBpbmplY3RhYmxlIG9mIGluamVjdGFibGVTZXQpIHtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZWRJZCA9IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG5cbiAgICAgIC8vIE9ubHkgaW5qZWN0YWJsZTIgZGVjbGFyZXMgY29uc3VtcHRpb25zOyB2MSBpbmplY3RhYmxlcyBhcmUgYmV5b25kXG4gICAgICAvLyB3aGF0IHRoaXMgY2FuIGNoZWNrLlxuICAgICAgaWYgKGluamVjdGFibGUuYWxpYXNUeXBlICE9PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgICAgICB1bnZlcmlmaWVkSWRzLnB1c2gobmFtZXNwYWNlZElkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZlcmlmaWVkSWRzLnB1c2gobmFtZXNwYWNlZElkKTtcblxuICAgICAgLy8gQW4gb3ZlcnJpZGRlbiBpbmplY3RhYmxlJ3Mgb3duIGluc3RhbnRpYXRlIG5ldmVyIHJ1bnMsIHNvIGl0c1xuICAgICAgLy8gZGVjbGFyYXRpb25zIHNheSBub3RoaW5nIGFib3V0IHdoYXQgdGhpcyBjb250YWluZXIgbmVlZHMuXG4gICAgICBpZiAob3ZlcnJpZGluZ0luamVjdGFibGVzLmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBjb25zdW1wdGlvbiBvZiBpbmplY3RhYmxlLmNvbnN1bXB0aW9ucyA/PyBbXSkge1xuICAgICAgICBpZiAoIWlzVG9rZW4yKGNvbnN1bXB0aW9uKSkge1xuICAgICAgICAgIC8vIEEgdjEgdG9rZW4gY2FycmllcyBubyBjYXJkaW5hbGl0eSwgc28gdGhlcmUgaXMgbm8gYXJpdHkgdG8gY2hlY2suXG4gICAgICAgICAgdW52ZXJpZmlhYmxlQ29uc3VtcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgaW5qZWN0YWJsZUlkOiBuYW1lc3BhY2VkSWQsXG4gICAgICAgICAgICBjb25zdW1wdGlvbklkOiBjb25zdW1wdGlvbi5pZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBjYXJkaW5hbGl0eSB9ID0gY29uc3VtcHRpb247XG5cbiAgICAgICAgaWYgKGNhcmRpbmFsaXR5ICE9PSAnb25lJyAmJiBjYXJkaW5hbGl0eSAhPT0gJ29uZS1vci1tYW55Jykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGluZGV4IGhvbGRzIGV2ZXJ5IHJlZ2lzdHJhdGlvbiBtYWRlIGFnYWluc3QgdGhlIHRva2VuIG9yIGFueSBvZlxuICAgICAgICAvLyBpdHMgYC5mb3IoKWAgZGVyaXZhdGl2ZXMsIHdoaWNoIGlzIGhvdyBhIGdlbmVyYWwtdG9rZW4gZGVjbGFyYXRpb25cbiAgICAgICAgLy8gaXMgc2F0aXNmaWVkIGJ5IGFuIGltcGxlbWVudGF0aW9uIG9mIG9uZSBvZiBpdHMgc3BlY2lmaWMgdG9rZW5zLlxuICAgICAgICBjb25zdCByZWdpc3RlcmVkID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChjb25zdW1wdGlvbik7XG5cbiAgICAgICAgLy8gT25seSB0aGUgbG93ZXIgYm91bmQgaXMgY2hlY2tlZCBoZXJlOiB0aGUgdXBwZXIgYm91bmQgY2Fubm90IGJlXG4gICAgICAgIC8vIGV4Y2VlZGVkLCBzaW5jZSByZWdpc3RlcmluZyByZWplY3RzIHRoZSBzZWNvbmQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgIGlmIChyZWdpc3RlcmVkID09PSB1bmRlZmluZWQgfHwgcmVnaXN0ZXJlZC5zaXplID09PSAwKSB7XG4gICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYEluamVjdGFibGUgXCIke25hbWVzcGFjZWRJZH1cIiBjb25zdW1lcyBpbmplY3Rpb24gdG9rZW4gXCIke2NvbnN1bXB0aW9uLmlkfVwiIHdpdGggY2FyZGluYWxpdHkgXCIke2NhcmRpbmFsaXR5fVwiLCBidXQgaXQgaGFzIG5vIHJlZ2lzdHJhdGlvbnMuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZpb2xhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gdmFsaWRhdGUgY29udGFpbmVyIFwiJHtjb250YWluZXJJZH1cIiwgYnV0IGZvdW5kIHZpb2xhdGlvbnM6XFxuJHt2aW9sYXRpb25zXG4gICAgICAgICAgLm1hcCh2aW9sYXRpb24gPT4gYCAtICR7dmlvbGF0aW9ufWApXG4gICAgICAgICAgLmpvaW4oJ1xcbicpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNvcnRlZCA9IGlkcyA9PiBbLi4uaWRzXS5zb3J0KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmVyaWZpZWRJbmplY3RhYmxlczoge1xuICAgICAgICBjb3VudDogdmVyaWZpZWRJZHMubGVuZ3RoLFxuICAgICAgICBpZHM6IHNvcnRlZCh2ZXJpZmllZElkcyksXG4gICAgICB9LFxuXG4gICAgICB1bnZlcmlmaWVkSW5qZWN0YWJsZXM6IHtcbiAgICAgICAgY291bnQ6IHVudmVyaWZpZWRJZHMubGVuZ3RoLFxuICAgICAgICBpZHM6IHNvcnRlZCh1bnZlcmlmaWVkSWRzKSxcbiAgICAgIH0sXG5cbiAgICAgIHVudmVyaWZpYWJsZUNvbnN1bXB0aW9ucyxcbiAgICB9O1xuICB9O1xuIiwgImltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5pbXBvcnQgeyBpbmplY3Rpb25Ub2tlblN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3Rpb25Ub2tlbjIvZ2V0SW5qZWN0aW9uVG9rZW4yJztcblxuY29uc3QgdGFyZ2V0SXNWMiA9IGluamVjdGFibGUgPT5cbiAgaW5qZWN0YWJsZS5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyIHx8XG4gIGluamVjdGFibGUuYWxpYXNUeXBlID09PSBpbmplY3Rpb25Ub2tlblN5bWJvbDI7XG5cbi8vIHYxLXNoYXBlIHN0dWI6IChkaSwgLi4ucGFyYW1zKSA9PiBpbnN0YW5jZS4gV3JhcHMgZm9yIHYyIHRhcmdldHMuXG5jb25zdCBhc1YxU2hhcGUgPSAoc3R1YiwgaXNWMlRhcmdldCkgPT5cbiAgaXNWMlRhcmdldFxuICAgID8gZGkgPT5cbiAgICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgICBzdHViKGRpLCAuLi5wYXJhbXMpXG4gICAgOiBzdHViO1xuXG4vLyB2Mi1zaGFwZSBzdHViOiAoZGkpID0+ICguLi5wYXJhbXMpID0+IGluc3RhbmNlLiBVbndyYXBzIGZvciB2MSB0YXJnZXRzLlxuY29uc3QgYXNWMlNoYXBlID0gKHN0dWIsIGlzVjJUYXJnZXQpID0+XG4gIGlzVjJUYXJnZXQgPyBzdHViIDogKGRpLCAuLi5wYXJhbXMpID0+IHN0dWIoZGkpKC4uLnBhcmFtcyk7XG5cbmNvbnN0IGVhcmx5T3ZlcnJpZGVJbXBsRm9yID1cbiAgbm9ybWFsaXplID0+XG4gICh7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KSA9PlxuICAoYWxpYXMsIGluc3RhbnRpYXRlU3R1YikgPT4ge1xuICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIHNpbmdsZSBpbXBsZW1lbnRhdGlvbiBvZiBpbmplY3Rpb24gdG9rZW4gXCIke1xuICAgICAgICAgIGFsaWFzLmlkXG4gICAgICAgIH1cIiwgYnV0IGZvdW5kIG11bHRpcGxlIHJlZ2lzdGVyZWQgaW1wbGVtZW50YXRpb25zOiBcIiR7cmVsYXRlZEluamVjdGFibGVzXG4gICAgICAgICAgLm1hcChnZXROYW1lc3BhY2VkSWQpXG4gICAgICAgICAgLmpvaW4oJ1wiLCBcIicpfVwiLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID09PSAwICYmIGlzSW5qZWN0aW9uVG9rZW4oYWxpYXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBlYXJseS1vdmVycmlkZSBhbiBpbmplY3Rpb24gdG9rZW4gXCIke2FsaWFzLmlkfVwiLCBidXQgdGhhdCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbEluamVjdGFibGUgPSByZWxhdGVkSW5qZWN0YWJsZXNbMF0gfHwgYWxpYXM7XG5cbiAgICBpZiAoYWxyZWFkeUluamVjdGVkLmhhcyhhbGlhcykgfHwgYWxyZWFkeUluamVjdGVkLmhhcyhvcmlnaW5hbEluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBvdmVycmlkZSBpbmplY3RhYmxlIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgb3JpZ2luYWxJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaXQgd2FzIGFscmVhZHkgaW5qZWN0ZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLnNldChvcmlnaW5hbEluamVjdGFibGUsIHtcbiAgICAgIC4uLm9yaWdpbmFsSW5qZWN0YWJsZSxcbiAgICAgIG92ZXJyaWRkZW5JbmplY3RhYmxlOiBvcmlnaW5hbEluamVjdGFibGUsXG4gICAgICBjYXVzZXNTaWRlRWZmZWN0czogZmFsc2UsXG4gICAgICBpbnN0YW50aWF0ZTogbm9ybWFsaXplKGluc3RhbnRpYXRlU3R1YiwgdGFyZ2V0SXNWMihvcmlnaW5hbEluamVjdGFibGUpKSxcbiAgICB9KTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IGVhcmx5T3ZlcnJpZGVGb3IgPSBlYXJseU92ZXJyaWRlSW1wbEZvcihhc1YxU2hhcGUpO1xuZXhwb3J0IGNvbnN0IGVhcmx5T3ZlcnJpZGUyRm9yID0gZWFybHlPdmVycmlkZUltcGxGb3IoYXNWMlNoYXBlKTtcbiIsICJpbXBvcnQgeyBwcmVJbmplY3RDYWxsYmFja1Rva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG4vLyBOb24td3JhcHBpbmcgZW50cnkgaG9vazogZmlyZXMgZXZlcnkgcHJlLWluamVjdCBjYWxsYmFjayBhcHBsaWNhYmxlIHRvIHRoZVxuLy8gYWxpYXMsIHRoZW4gY2FsbHMgdGhyb3VnaC4gRmlyZXMgYmVmb3JlIGFueSByZXNvbHV0aW9uIG9yIGZhaWx1cmUgY2hlY2ssXG4vLyBzbyBhIGNhbGxiYWNrIGNhbiByZWdpc3RlciBpbXBsZW1lbnRhdGlvbnMgdGhhdCB0aGUgc2FtZSBvcGVyYXRpb24gdGhlblxuLy8gb2JzZXJ2ZXMuIGBraW5kYCBpcyBiYWtlZCBpbiBhdCB3cmFwIHRpbWU6ICdpbmplY3QnIGZvciB0aGUgaW5qZWN0XG4vLyB2YXJpYW50cywgJ2luamVjdE1hbnknIGZvciB0aGUgaW5qZWN0TWFueSB2YXJpYW50cyAod2l0aE1ldGEgdmFyaWFudHNcbi8vIHJlcG9ydCB0aGVpciBiYXNlIGtpbmQpLiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGluamVjdGluZyBwYXJ0eTogdGhlXG4vLyBpbmplY3RhYmxlIHdob3NlIGluc3RhbnRpYXRlIG1hZGUgdGhlIGNhbGwsIG9yIHRoZSBjb250YWluZXIgcm9vdCBmb3Jcbi8vIGluamVjdHMgbWFkZSBkaXJlY3RseSBvbiBgZGlgLlxuZXhwb3J0IGNvbnN0IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3IgPVxuICAoeyBkZWNvcmF0b3JDYWNoZSwgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAga2luZCA9PlxuICB0b0JlQ2FsbGVkID0+XG4gIGFyZ3MgPT4ge1xuICAgIC8vIFdoZW4gZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0IGlzIG51bGwsIGEgY2FsbGJhY2sgd2FzIHJlZ2lzdGVyZWQgb3JcbiAgICAvLyBkZXJlZ2lzdGVyZWQgXHUyMDE0IGludmFsaWRhdGUgYWxsIHBlci1hbGlhcyBjYWNoZWQgY2FsbGJhY2sgbGlzdHMuXG4gICAgaWYgKGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9PT0gbnVsbCkge1xuICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID0gdHJ1ZTtcbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdEJ5QWxpYXMgPSBuZXcgTWFwKCk7XG4gICAgfVxuXG4gICAgbGV0IGNhbGxiYWNrcyA9IGRlY29yYXRvckNhY2hlLnByZUluamVjdEJ5QWxpYXMuZ2V0KGFyZ3MuYWxpYXMpO1xuXG4gICAgaWYgKGNhbGxiYWNrcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBhcHBsaWNhYmxlID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgICBkZWNvcmF0b3JUb2tlbjogcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbiAgICAgICAgdGFyZ2V0OiBhcmdzLmFsaWFzLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBhcmdzLmluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcblxuICAgICAgY2FsbGJhY2tzID0gYXBwbGljYWJsZS5sZW5ndGggPiAwID8gYXBwbGljYWJsZSA6IG51bGw7XG5cbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdEJ5QWxpYXMuc2V0KGFyZ3MuYWxpYXMsIGNhbGxiYWNrcyk7XG4gICAgfVxuXG4gICAgaWYgKGNhbGxiYWNrcyAhPT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBjYWxsYmFja3MpIHtcbiAgICAgICAgY2FsbGJhY2soYXJncy5hbGlhcywga2luZCwgYXJncy5pbmplY3RpbmdJbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9CZUNhbGxlZChhcmdzKTtcbiAgfTtcbiIsICJpbXBvcnQgeyBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbiB9IGZyb20gJy4vdG9rZW5zJztcblxuZXhwb3J0IGNvbnN0IGZpcmVQdXJnZUNhbGxiYWNrc0ZvciA9XG4gICh7IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzIH0pID0+XG4gIChpbmplY3RhYmxlLCBpbnN0YW5jZSwga2V5QXJyYXkpID0+IHtcbiAgICBjb25zdCBwYXlsb2FkID0geyBpbnN0YW5jZSB9O1xuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgZGVjb3JhdG9yVG9rZW46IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuLFxuICAgICAgdGFyZ2V0OiBpbmplY3RhYmxlLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogaW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgY2Igb2YgY2FsbGJhY2tzKSB7XG4gICAgICBjYihwYXlsb2FkKSguLi5rZXlBcnJheSk7XG4gICAgfVxuICB9O1xuIiwgImltcG9ydCB7IGdldFJlbGF0ZWRUb2tlbnMgfSBmcm9tICcuL2dldFJlbGF0ZWRUb2tlbnMnO1xuXG4vLyBSZXR1cm5zIGV2ZXJ5IGRlY29yYXRvci9jYWxsYmFjayBpbnN0YW5jZSB0aGF0IGFwcGxpZXMgdG8gYHRhcmdldGAgZm9yIHRoZVxuLy8gZ2l2ZW4gYGRlY29yYXRvclRva2VuYC4gVGhyZWUgbG9va3VwIGRpbWVuc2lvbnMgYXJlIHVuaWZpZWQ6XG4vL1xuLy8gICAxLiBEaXJlY3Q6ICAgZGVjb3JhdG9yVG9rZW4uZm9yKHRhcmdldCkuXG4vLyAgIDIuIENoYWluOiAgICB3YWxrIGBzcGVjaWZpY1Rva2VuT2ZgIGFuY2VzdG9ycyBvZiB0aGUgY29udHJhY3QgdG9rZW4gXHUyMDE0XG4vLyAgICAgICAgICAgICAgICBgdGFyZ2V0LmluamVjdGlvblRva2VuYCBmb3IgaW5qZWN0YWJsZSB0YXJnZXRzLFxuLy8gICAgICAgICAgICAgICAgYHRhcmdldC5zcGVjaWZpY1Rva2VuT2ZgIGZvciB0b2tlbiB0YXJnZXRzIFx1MjAxNCBhbmQgbG9vayB1cFxuLy8gICAgICAgICAgICAgICAgYGRlY29yYXRvclRva2VuLmZvcihhbmNlc3RvcilgIGZvciBlYWNoLiBUaGlzIGlzIHN5bW1ldHJpY1xuLy8gICAgICAgICAgICAgICAgd2l0aCB0aGUgcmVnaXN0cmF0aW9uLXRpbWUgY2hhaW4gaW5kZXhpbmcgaW5cbi8vICAgICAgICAgICAgICAgIGBnZXRSZWxhdGVkVG9rZW5zYDogYSBjb250cmlidXRvciByZWdpc3RlcmVkIHVuZGVyXG4vLyAgICAgICAgICAgICAgICBgc29tZVRva2VuLmZvcihzcGVjaWZpZXIpYCBpcyBhbHJlYWR5IHJldHJpZXZhYmxlIHZpYVxuLy8gICAgICAgICAgICAgICAgYGluamVjdE1hbnkoc29tZVRva2VuKWAsIGFuZCBhIGRlY29yYXRvciB0YXJnZXRpbmcgdGhlXG4vLyAgICAgICAgICAgICAgICBwYXJlbnQgY29udHJhY3Qgc2hvdWxkIGZpcmUgZm9yIHRoZSBjaGlsZCBzcGVjaWFsaXphdGlvbi5cbi8vICAgMy4gVGFnczogICAgIGZvciBldmVyeSB0YWcgb2YgdGhlIHRhcmdldCBhbmQgb2YgZXZlcnkgdG9rZW4gaW4gaXRzXG4vLyAgICAgICAgICAgICAgICBjaGFpbiwgbG9vayB1cCBgZGVjb3JhdG9yVG9rZW4uZm9yKHRhZylgLiBUYWdzIGFyZSBkZWR1cGVkXG4vLyAgICAgICAgICAgICAgICBhY3Jvc3MgdGhlc2Ugc291cmNlczogYC5mb3IoKWAgY2hpbGRyZW4gaW5oZXJpdCB0aGUgZ2VuZXJhbFxuLy8gICAgICAgICAgICAgICAgdG9rZW4ncyB0YWdzLCBzbyB0aGUgc2FtZSB0YWcgdHlwaWNhbGx5IG9jY3VycyBvbiBldmVyeVxuLy8gICAgICAgICAgICAgICAgY2hhaW4gbGV2ZWwuIFRoaXMgbWFrZXMgYSB0YWcgb24gYSB0b2tlbiBmaXJlIGV2ZXJ5d2hlcmVcbi8vICAgICAgICAgICAgICAgIGAuZm9yKHRva2VuKWAgd291bGQuXG4vL1xuLy8gSW5qZWN0YWJsZXMgd2l0aG91dCBhbiBgaW5qZWN0aW9uVG9rZW5gIHNraXAgdGhlIGNoYWluIGRpbWVuc2lvbi5cbi8vXG4vLyBGYXN0IHBhdGg6IGlmIG5vIGluamVjdGFibGUgaXMgcmVnaXN0ZXJlZCB1bmRlciB0aGUgYWJzdHJhY3QgYGRlY29yYXRvclRva2VuYFxuLy8gaXRzZWxmLCBub25lIG9mIHRoZSB0aHJlZSBsb29rdXAgZGltZW5zaW9ucyBjYW4gZXZlciBtYXRjaC4gYHJlZ2lzdGVyLmpzYFxuLy8gaW5kZXhlcyBldmVyeSBzcGVjaWZpYyBkZWNvcmF0b3IgYnkgd2Fsa2luZyBgZ2V0UmVsYXRlZFRva2VucyhpbmplY3Rpb25Ub2tlbilgLFxuLy8gd2hpY2ggdGVybWluYXRlcyBhdCB0aGUgYWJzdHJhY3QgdG9rZW4gXHUyMDE0IHNvIHRoZSBhYnN0cmFjdCBzZXQgaXMgbm9uLWVtcHR5XG4vLyBpZmYgYXQgbGVhc3Qgb25lIGRlY29yYXRvciBvZiB0aGlzIHR5cGUgaXMgcmVnaXN0ZXJlZCBhbnl3aGVyZS5cbmNvbnN0IEVNUFRZID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbmV4cG9ydCBjb25zdCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9yc0ZvciA9XG4gICh7IGluamVjdE1hbnksIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbiwgZ2V0SW5qZWN0aW9uVG9rZW5PZiB9KSA9PlxuICAoeyBkZWNvcmF0b3JUb2tlbiwgdGFyZ2V0LCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICBjb25zdCByZWdpc3RlcmVkID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChkZWNvcmF0b3JUb2tlbik7XG5cbiAgICBpZiAoIXJlZ2lzdGVyZWQgfHwgcmVnaXN0ZXJlZC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0ID0gW107XG5cbiAgICAvLyBNb3N0IGRpc3BhdGNoIGtleXMgaGF2ZSBubyByZWdpc3RyYXRpb25zIFx1MjAxNCBjaGVja2luZyB0aGUgcmVnaXN0cmF0aW9uXG4gICAgLy8gaW5kZXggZGlyZWN0bHkgc2tpcHMgdGhlIGluamVjdE1hbnkgbWFjaGluZXJ5IGZvciB0aGVtLiBgLmZvcigpYCBpdHNlbGZcbiAgICAvLyBpcyBjaGVhcCBvbiByZXBlYXQgY2FsbHMgKG1lbW9pemVkIGJ5IHNwZWNpZmllcikuXG4gICAgY29uc3QgZGlzcGF0Y2ggPSBhbGlhcyA9PiB7XG4gICAgICBjb25zdCByZWdpc3RlcmVkRm9yQWxpYXMgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGFsaWFzKTtcblxuICAgICAgaWYgKHJlZ2lzdGVyZWRGb3JBbGlhcyAmJiByZWdpc3RlcmVkRm9yQWxpYXMuc2l6ZSA+IDApIHtcbiAgICAgICAgb3V0LnB1c2goXG4gICAgICAgICAgLi4uaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRpc3BhdGNoKGRlY29yYXRvclRva2VuLmZvcih0YXJnZXQpKTtcblxuICAgIGNvbnN0IGNoYWluID0gZ2V0UmVsYXRlZFRva2VucyhcbiAgICAgIGdldEluamVjdGlvblRva2VuT2YodGFyZ2V0KSA/PyB0YXJnZXQuc3BlY2lmaWNUb2tlbk9mLFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHQgb2YgY2hhaW4pIHtcbiAgICAgIGRpc3BhdGNoKGRlY29yYXRvclRva2VuLmZvcih0KSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0VGFncyA9IHRhcmdldC50YWdzO1xuXG4gICAgaWYgKHRhcmdldFRhZ3MpIHtcbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhcmdldFRhZ3MpIHtcbiAgICAgICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHRhZykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlZHVwIHdpdGhvdXQgYWxsb2NhdGlvbnM6IGAuZm9yKClgIGNoaWxkcmVuIHNoYXJlIHRoZSBnZW5lcmFsIHRva2VuJ3NcbiAgICAvLyB0YWdzIGFycmF5LCBzbyBhIGNoYWluIGNhcnJpZXMgYXQgbW9zdCBvbmUgZGlzdGluY3QgdGFncyBhcnJheSBcdTIwMTQgc2tpcFxuICAgIC8vIHJlcGVhdHMgYnkgcmVmZXJlbmNlLCBhbmQgc2tpcCB0YWdzIGFscmVhZHkgZGlzcGF0Y2hlZCB2aWEgdGFyZ2V0LnRhZ3NcbiAgICAvLyB3aXRoIGluZGV4T2YgKHRoZSBhcnJheXMgYXJlIHRpbnkpLlxuICAgIGxldCBwcm9jZXNzZWRDaGFpblRhZ3MgPSB0YXJnZXRUYWdzO1xuXG4gICAgZm9yIChjb25zdCB0IG9mIGNoYWluKSB7XG4gICAgICBjb25zdCBjaGFpblRhZ3MgPSB0LnRhZ3M7XG5cbiAgICAgIGlmICghY2hhaW5UYWdzIHx8IGNoYWluVGFncyA9PT0gcHJvY2Vzc2VkQ2hhaW5UYWdzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzZWRDaGFpblRhZ3MgPSBjaGFpblRhZ3M7XG5cbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIGNoYWluVGFncykge1xuICAgICAgICBpZiAodGFyZ2V0VGFncyAmJiB0YXJnZXRUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BhdGNoKGRlY29yYXRvclRva2VuLmZvcih0YWcpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xuICB9O1xuIiwgImltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0U2NvcGVkSWRGb3IgfSBmcm9tICcuL2dldFNjb3BlZElkRm9yJztcblxuLy8gQW4gYGluamVjdGlvblRva2VuYCBtYXkgYmUgZ2l2ZW4gYXMgYSBmdW5jdGlvbiBvZiB0aGUgc2NvcGUgdGhlIGluamVjdGFibGVcbi8vIGVuZHMgdXAgcmVnaXN0ZXJlZCB1bmRlciwgYCh7IHNjb3BlSWRzIH0pID0+IHNvbWVUb2tlbi5mb3IoLi4uKWAsIGZvclxuLy8gdG9rZW5zIGtleWVkIGJ5IHNvbWV0aGluZyBvbmx5IHRoZSByZWdpc3RyYXRpb24ga25vd3MuIEEgdG9rZW4gY29tcG9uZW50IGlzXG4vLyBjYWxsYWJsZSB0b28sIHNvIGEgcmVzb2x2ZXIgaXMgdG9sZCBhcGFydCBieSBub3QgYmVpbmcgYSB0b2tlbiBpdHNlbGYuXG5leHBvcnQgY29uc3QgaXNJbmplY3Rpb25Ub2tlblJlc29sdmVyID0gbWF5YmVSZXNvbHZlciA9PlxuICB0eXBlb2YgbWF5YmVSZXNvbHZlciA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNJbmplY3Rpb25Ub2tlbihtYXliZVJlc29sdmVyKTtcblxuLy8gVGhlIHJlc29sdmVkIHRva2VuIGxpdmVzIHdpdGggdGhlIGNvbnRhaW5lciwgbm90IG9uIHRoZSBpbmplY3RhYmxlOiB0aGUgc2FtZVxuLy8gaW5qZWN0YWJsZSBvYmplY3QgcmVnaXN0ZXJzIGludG8gZGlmZmVyZW50IHNjb3BlcyBpbiBkaWZmZXJlbnQgY29udGFpbmVyc1xuLy8gKGFuZCwgYWZ0ZXIgZGVyZWdpc3RyYXRpb24sIGluIGRpZmZlcmVudCBzY29wZXMgb2YgdGhlIHNhbWUgb25lKSwgYW5kIGVhY2hcbi8vIHJlZ2lzdHJhdGlvbiByZXNvbHZlcyBvbiBpdHMgb3duLlxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuUmVzb2x1dGlvbkZvciA9ICh7XG4gIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxufSkgPT4ge1xuICBjb25zdCBnZXRTY29wZWRJZCA9IGdldFNjb3BlZElkRm9yKGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0KTtcbiAgY29uc3QgcmVzb2x2ZWRUb2tlbkJ5SW5qZWN0YWJsZSA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgY29uc3QgcmVzb2x2ZUluamVjdGlvblRva2VuT2YgPSAoaW5qZWN0YWJsZSwgcmVnaXN0cmF0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVyID0gaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbjtcblxuICAgIGlmICghaXNJbmplY3Rpb25Ub2tlblJlc29sdmVyKHJlc29sdmVyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG93bmVyID0gcmVnaXN0cmF0aW9uQ29udGV4dFtyZWdpc3RyYXRpb25Db250ZXh0Lmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gVGhlIG93bmVyJ3Mgc2NvcGVkIGlkIGlzIGV4YWN0bHkgd2hhdCB0aGUgaW5qZWN0YWJsZSdzIG93biBgZGkuc2NvcGVJZHNgXG4gICAgLy8gd2lsbCByZWFkIGFzIG9uY2UgaW5zdGFudGlhdGVkOiB0aGUgb3duZXIncyBzY29wZXMsIHRoZW4gdGhlIG93bmVyLlxuICAgIGNvbnN0IHNjb3BlSWRzID1cbiAgICAgICFvd25lciB8fCBvd25lci5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcidcbiAgICAgICAgPyBbXVxuICAgICAgICA6IGdldFNjb3BlZElkKG93bmVyLmluamVjdGFibGUpO1xuXG4gICAgY29uc3QgdG9rZW4gPSByZXNvbHZlcih7IHNjb3BlSWRzIH0pO1xuXG4gICAgaWYgKCFpc0luamVjdGlvblRva2VuKHRva2VuKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgaW5qZWN0YWJsZSBcIiR7aW5qZWN0YWJsZS5pZH1cIiwgYnV0IGl0cyBpbmplY3Rpb24gdG9rZW4gcmVzb2x2ZXIgcmV0dXJuZWQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGFuIGluamVjdGlvbiB0b2tlbi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXNvbHZlZFRva2VuQnlJbmplY3RhYmxlLnNldChpbmplY3RhYmxlLCB0b2tlbik7XG4gIH07XG5cbiAgY29uc3QgZ2V0SW5qZWN0aW9uVG9rZW5PZiA9IGFsaWFzT3JJbmplY3RhYmxlID0+IHtcbiAgICBjb25zdCB0b2tlbk9yUmVzb2x2ZXIgPSBhbGlhc09ySW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbjtcblxuICAgIHJldHVybiBpc0luamVjdGlvblRva2VuUmVzb2x2ZXIodG9rZW5PclJlc29sdmVyKVxuICAgICAgPyByZXNvbHZlZFRva2VuQnlJbmplY3RhYmxlLmdldChhbGlhc09ySW5qZWN0YWJsZSlcbiAgICAgIDogdG9rZW5PclJlc29sdmVyO1xuICB9O1xuXG4gIGNvbnN0IGZvcmdldEluamVjdGlvblRva2VuT2YgPSBpbmplY3RhYmxlID0+IHtcbiAgICByZXNvbHZlZFRva2VuQnlJbmplY3RhYmxlLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgfTtcblxuICByZXR1cm4geyByZXNvbHZlSW5qZWN0aW9uVG9rZW5PZiwgZ2V0SW5qZWN0aW9uVG9rZW5PZiwgZm9yZ2V0SW5qZWN0aW9uVG9rZW5PZiB9O1xufTtcbiIsICJpbXBvcnQgeyBwcml2YXRlSW5qZWN0Rm9yIH0gZnJvbSAnLi9wcml2YXRlSW5qZWN0Rm9yJztcbmltcG9ydCB7IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yIH0gZnJvbSAnLi93aXRoSW5qZWN0aW9uRGVjb3JhdG9yc0Zvcic7XG5pbXBvcnQgeyBwcml2YXRlSW5qZWN0TWFueUZvciBhcyBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueUZvciB9IGZyb20gJy4vcHJpdmF0ZUluamVjdE1hbnlGb3InO1xuaW1wb3J0IHsgcmVnaXN0ZXJGb3IsIHJlZ2lzdGVyU2luZ2xlRm9yIH0gZnJvbSAnLi9yZWdpc3Rlcic7XG5pbXBvcnQgeyBwdXJnZUluc3RhbmNlc0ZvciwgcHVyZ2VTdG9yZWRJbnN0YW5jZXNGb3IgfSBmcm9tICcuL3B1cmdlSW5zdGFuY2VzJztcbmltcG9ydCB7IGRlcmVnaXN0ZXJGb3IgfSBmcm9tICcuL2RlcmVnaXN0ZXInO1xuaW1wb3J0IHsgb3ZlcnJpZGVGb3IsIHVub3ZlcnJpZGVGb3IgfSBmcm9tICcuL292ZXJyaWRlJztcbmltcG9ydCB7IGdldE5hbWVzcGFjZWRJZEZvciB9IGZyb20gJy4vZ2V0TmFtZXNwYWNlZElkRm9yJztcbmltcG9ydCB7IGdldFNjb3BlZElkRm9yIH0gZnJvbSAnLi9nZXRTY29wZWRJZEZvcic7XG5pbXBvcnQgeyBjaGVja0Zvck5vTWF0Y2hlc0ZvciB9IGZyb20gJy4vY2hlY2tGb3JOb01hdGNoZXNGb3InO1xuaW1wb3J0IHsgY2hlY2tGb3JUb29NYW55TWF0Y2hlc0ZvciB9IGZyb20gJy4vY2hlY2tGb3JUb29NYW55TWF0Y2hlcyc7XG5pbXBvcnQgeyBjaGVja0ZvclNpZGVFZmZlY3RzRm9yIH0gZnJvbSAnLi9jaGVja0ZvclNpZGVFZmZlY3RzRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvciB9IGZyb20gJy4vY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eUZvciB9IGZyb20gJy4vY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yJztcbmltcG9ydCB7IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yIH0gZnJvbSAnLi9jaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvcic7XG5pbXBvcnQgeyB2YWxpZGF0ZUZvciB9IGZyb20gJy4vdmFsaWRhdGUnO1xuaW1wb3J0IHsgZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yIH0gZnJvbSAnLi9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3InO1xuaW1wb3J0IHsgZWFybHlPdmVycmlkZUZvciwgZWFybHlPdmVycmlkZTJGb3IgfSBmcm9tICcuL2Vhcmx5LW92ZXJyaWRlJztcbmltcG9ydCB7XG4gIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbixcbiAgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbn0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHsgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvciB9IGZyb20gJy4vd2l0aFByZUluamVjdENhbGxiYWNrc0Zvcic7XG5pbXBvcnQgeyBpc1JlbGF0ZWRUb1Rva2VuIH0gZnJvbSAnLi9nZXRSZWxhdGVkVG9rZW5zJztcbmltcG9ydCB7IGZpcmVQdXJnZUNhbGxiYWNrc0ZvciB9IGZyb20gJy4vZmlyZVB1cmdlQ2FsbGJhY2tzRm9yJztcbmltcG9ydCB7IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yIH0gZnJvbSAnLi9nZXRBcHBsaWNhYmxlRGVjb3JhdG9yc0Zvcic7XG5pbXBvcnQgeyBpbmplY3Rpb25Ub2tlblJlc29sdXRpb25Gb3IgfSBmcm9tICcuL2luamVjdGlvblRva2VuUmVzb2x1dGlvbkZvcic7XG5pbXBvcnQgeyBpc0NvbXBvc2l0ZVN0b3JhZ2UgfSBmcm9tICcuL3ByaXZhdGVJbmplY3RGb3InO1xuXG5leHBvcnQgZGVmYXVsdCBjb250YWluZXJJZCA9PiB7XG4gIGNvbnN0IGluamVjdGFibGVTZXQgPSBuZXcgU2V0KCk7XG5cbiAgY29uc3QgZGVjb3JhdG9yQ2FjaGUgPSB7XG4gICAgaW5qZWN0aW9uOiBudWxsLFxuICAgIGluamVjdGlvbkJ5QWxpYXM6IG5ldyBNYXAoKSxcbiAgICBwcmVJbmplY3Q6IG51bGwsXG4gICAgcHJlSW5qZWN0QnlBbGlhczogbmV3IE1hcCgpLFxuICB9O1xuICBjb25zdCBvdmVycmlkaW5nSW5qZWN0YWJsZXMgPSBuZXcgTWFwKCk7XG4gIGxldCBzaWRlRWZmZWN0c0FyZVByZXZlbnRlZCA9IHRydWU7XG4gIGNvbnN0IGFscmVhZHlJbmplY3RlZCA9IG5ldyBTZXQoKTtcbiAgY29uc3QgaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGluamVjdGFibGVJZFNldCA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwID0gbmV3IE1hcCgpO1xuICBjb25zdCBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudE1hcCA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZXROYW1lc3BhY2VkSWQgPSBnZXROYW1lc3BhY2VkSWRGb3IoaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQpO1xuICBjb25zdCBnZXRTY29wZWRJZCA9IGdldFNjb3BlZElkRm9yKGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0KTtcblxuICBjb25zdCB7IHJlc29sdmVJbmplY3Rpb25Ub2tlbk9mLCBnZXRJbmplY3Rpb25Ub2tlbk9mLCBmb3JnZXRJbmplY3Rpb25Ub2tlbk9mIH0gPVxuICAgIGluamVjdGlvblRva2VuUmVzb2x1dGlvbkZvcih7IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0IH0pO1xuXG4gIGNvbnN0IGdldFJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcih7XG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIGluamVjdGFibGVTZXQsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbnRhaW5lclJvb3RDb250ZXh0SXRlbSA9IHtcbiAgICBpbmplY3RhYmxlOiB7IGlkOiBjb250YWluZXJJZCwgYWxpYXNUeXBlOiAnY29udGFpbmVyJyB9LFxuICB9O1xuXG4gIGNvbnN0IHJvb3RJbmplY3RhYmxlID0gY29udGFpbmVyUm9vdENvbnRleHRJdGVtLmluamVjdGFibGU7XG5cbiAgY29uc3QgY2hlY2tGb3JBYnN0cmFjdFRva2VuID0gY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yKHsgZ2V0TmFtZXNwYWNlZElkIH0pO1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yVW5rbm93bk1ldGEgPVxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yKHtcbiAgICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICAgIC8vIEVsZW1lbnRzIGdvIHRocm91Z2ggdGhlIGVsZW1lbnQgc2xvdCwgbm90IGBwcml2YXRlRGkuaW5qZWN0YDogZW50cnlcbiAgICAgIC8vIHdyYXBwZXJzIChvbmNlLXBlci1vcGVyYXRpb24gaG9va3MpIG11c3Qgbm90IHJlLWZpcmUgcGVyIGVsZW1lbnQsXG4gICAgICAvLyB3aGlsZSBpbmplY3Rpb24gZGVjb3JhdG9ycyBzdGlsbCBhcHBseSBwZXIgZWxlbWVudC5cbiAgICAgIGdldEluamVjdDogKCkgPT4gZWxlbWVudEluamVjdCxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogZmFsc2UsXG4gICAgfSk7XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogdHJ1ZSxcbiAgICB9KTtcblxuICBjb25zdCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yKHtcbiAgICBpbmplY3RNYW55OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgfSk7XG5cbiAgY29uc3QgZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQgPSBpbmplY3RhYmxlID0+XG4gICAgc2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQgJiZcbiAgICBpbmplY3RhYmxlLmNhdXNlc1NpZGVFZmZlY3RzICYmXG4gICAgIWluamVjdGFibGVzV2l0aFBlcm1pdHRlZFNpZGVFZmZlY3RzLmhhcyhpbmplY3RhYmxlKTtcblxuICBjb25zdCBjaGVja0ZvclNpZGVFZmZlY3RzID0gY2hlY2tGb3JTaWRlRWZmZWN0c0Zvcih7XG4gICAgZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0Zvck5vTWF0Y2hlcyA9IGNoZWNrRm9yTm9NYXRjaGVzRm9yKHtcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IGNoZWNrRm9yVG9vTWFueU1hdGNoZXMgPSBjaGVja0ZvclRvb01hbnlNYXRjaGVzRm9yKHtcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSA9IGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eUZvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbiA9IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yKHtcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIC8vIEVuZm9yY2VtZW50IHdyYXBzIHRoZSBzbG90cyByYXRoZXIgdGhhbiBsaXZpbmcgaW5zaWRlIHRoZSBvcGVyYXRpb25cbiAgLy8gZnVuY3Rpb25zLCBzbyB0aGF0IHRoZSBtYWNoaW5lcnkgXHUyMDE0IGRlY29yYXRvciBhbmQgY2FsbGJhY2sgZGlzcGF0Y2gsIHB1cmdlXG4gIC8vIGNhbGxiYWNrcyBcdTIwMTQgc3RheXMgZXhlbXB0OiBpdCBob2xkcyB0aGUgcmF3IG9wZXJhdGlvbnMgY2FwdHVyZWQgYXRcbiAgLy8gY29uc3RydWN0aW9uIGFuZCBuZXZlciByZWFkcyB0aGVzZSBzbG90cy5cbiAgY29uc3Qgd2l0aENvbnN1bXB0aW9uRW5mb3JjZW1lbnQgPSB0b0JlQ2FsbGVkID0+IGFyZ3MgPT4ge1xuICAgIGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uKGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRvQmVDYWxsZWQoYXJncyk7XG4gIH07XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdFVua25vd25NZXRhID0gcHJpdmF0ZUluamVjdEZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGluamVjdGFibGVTZXQsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZ2V0RGk6ICgpID0+IHByaXZhdGVEaSxcbiAgICBjaGVja0Zvck5vTWF0Y2hlcyxcbiAgICBjaGVja0ZvclRvb01hbnlNYXRjaGVzLFxuICAgIGNoZWNrRm9yU2lkZUVmZmVjdHMsXG4gICAgY2hlY2tGb3JBYnN0cmFjdFRva2VuLFxuICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICAgIGdldFNjb3BlZElkLFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0ID0gbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdFVua25vd25NZXRhKHtcbiAgICB3aXRoTWV0YTogZmFsc2UsXG4gIH0pO1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdFVua25vd25NZXRhKHtcbiAgICAgIHdpdGhNZXRhOiB0cnVlLFxuICAgIH0pO1xuXG4gIGNvbnN0IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzID0gd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3Ioe1xuICAgIGRlY29yYXRvckNhY2hlLFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICAvLyBJbmplY3Rpb24gZGVjb3JhdG9ycyBhcHBseSBvbmx5IG9uIHRoZSBwZXItaW5qZWN0YWJsZSBpbmplY3QgcGF0aC5cbiAgLy8gaW5qZWN0TWFueSByZXNvbHZlcyByZWxhdGVkIGluamVjdGFibGVzIGFuZCBjYWxscyB0aGUgKGRlY29yYXRlZCkgaW5qZWN0XG4gIC8vIG9uIGVhY2gsIHNvIGRlY29yYXRvcnMgc3RpbGwgZmlyZSBwZXIgZWxlbWVudCBcdTIwMTQgYnV0IHRoZSB0b2tlbi1sZXZlbFxuICAvLyBpbmplY3RNYW55IGlzIG5ldmVyIHdyYXBwZWQuXG4gIGNvbnN0IGRlY29yYXRlZFByaXZhdGVJbmplY3QgPSB3aXRoSW5qZWN0aW9uRGVjb3JhdG9ycyhcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICApO1xuXG4gIGNvbnN0IGRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSA9IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzKFxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSxcbiAgKTtcblxuICBjb25zdCB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzID0gd2l0aFByZUluamVjdENhbGxiYWNrc0Zvcih7XG4gICAgZGVjb3JhdG9yQ2FjaGUsXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gIH0pO1xuXG4gIGNvbnN0IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3QgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzKCdpbmplY3QnKTtcblxuICBjb25zdCB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0TWFueSA9XG4gICAgd2l0aFByZUluamVjdENhbGxiYWNrcygnaW5qZWN0TWFueScpO1xuXG4gIGNvbnN0IHByZUluamVjdE5vbkRlY29yYXRlZEluamVjdCA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3QoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdCxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3REZWNvcmF0ZWRJbmplY3QgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIGRlY29yYXRlZFByaXZhdGVJbmplY3QsXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0Tm9uRGVjb3JhdGVkSW5qZWN0V2l0aE1ldGEgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3REZWNvcmF0ZWRJbmplY3RXaXRoTWV0YSA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3QoXG4gICAgZGVjb3JhdGVkUHJpdmF0ZUluamVjdFdpdGhNZXRhLFxuICApO1xuXG4gIGNvbnN0IHByZUluamVjdEluamVjdE1hbnkgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0TWFueShcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3RJbmplY3RNYW55V2l0aE1ldGEgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0TWFueShcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhLFxuICApO1xuXG4gIC8vIFRoZSBpbmplY3QgdXNlZCBmb3IgaW5qZWN0TWFueSBlbGVtZW50czogZGVjb3JhdGVkIHBlciBlbGVtZW50IHdoZW5cbiAgLy8gaW5qZWN0aW9uIGRlY29yYXRvcnMgZXhpc3QsIGJ1dCBuZXZlciB3cmFwcGVkIGJ5IGVudHJ5LWxldmVsIGhvb2tzXG4gIC8vIChwcmUtaW5qZWN0IGNhbGxiYWNrcyBmaXJlIG9uY2UgcGVyIG9wZXJhdGlvbiwgbm90IHBlciBlbGVtZW50KS5cbiAgbGV0IGVsZW1lbnRJbmplY3QgPSBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0O1xuXG4gIC8vIFdpcmVzIHRoZSBkZWNvcmF0ZWQgYW5kIHByZS1pbmplY3QtaG9va2VkIHZhcmlhbnRzIGluIG9ubHkgd2hpbGUgYXRcbiAgLy8gbGVhc3Qgb25lIG1hdGNoaW5nIGNvbnRyaWJ1dG9yIGlzIHJlZ2lzdGVyZWQsIHNvIHRoZSBjb21tb24gYmFyZSBjYXNlXG4gIC8vIHBheXMgbm8gd3JhcHBlciBmcmFtZSBhdCBhbGwuIEV2ZXJ5IHJlYWRlciBvZiB0aGUgcHJpdmF0ZURpIHNsb3RzIChhbmRcbiAgLy8gYGVsZW1lbnRJbmplY3RgLCB2aWEgdGhlIGdldEluamVjdCB0aHVuaykgcmVhZHMgdGhlbSBhdCBjYWxsIHRpbWUuXG4gIGNvbnN0IHN5bmNJbmplY3RXaXJpbmcgPSAoKSA9PiB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZERlY29yYXRvcnMgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KFxuICAgICAgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgKTtcblxuICAgIGNvbnN0IGRlY29yYXRvcnNBY3RpdmUgPVxuICAgICAgcmVnaXN0ZXJlZERlY29yYXRvcnMgIT09IHVuZGVmaW5lZCAmJiByZWdpc3RlcmVkRGVjb3JhdG9ycy5zaXplID4gMDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyZWRQcmVJbmplY3RDYWxsYmFja3MgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KFxuICAgICAgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbiAgICApO1xuXG4gICAgY29uc3QgcHJlSW5qZWN0QWN0aXZlID1cbiAgICAgIHJlZ2lzdGVyZWRQcmVJbmplY3RDYWxsYmFja3MgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcmVnaXN0ZXJlZFByZUluamVjdENhbGxiYWNrcy5zaXplID4gMDtcblxuICAgIGVsZW1lbnRJbmplY3QgPSBkZWNvcmF0b3JzQWN0aXZlXG4gICAgICA/IGRlY29yYXRlZFByaXZhdGVJbmplY3RcbiAgICAgIDogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdDtcblxuICAgIHByaXZhdGVEaS5pbmplY3QgPSBwcmVJbmplY3RBY3RpdmVcbiAgICAgID8gZGVjb3JhdG9yc0FjdGl2ZVxuICAgICAgICA/IHByZUluamVjdERlY29yYXRlZEluamVjdFxuICAgICAgICA6IHByZUluamVjdE5vbkRlY29yYXRlZEluamVjdFxuICAgICAgOiBlbGVtZW50SW5qZWN0O1xuXG4gICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhID0gcHJlSW5qZWN0QWN0aXZlXG4gICAgICA/IGRlY29yYXRvcnNBY3RpdmVcbiAgICAgICAgPyBwcmVJbmplY3REZWNvcmF0ZWRJbmplY3RXaXRoTWV0YVxuICAgICAgICA6IHByZUluamVjdE5vbkRlY29yYXRlZEluamVjdFdpdGhNZXRhXG4gICAgICA6IGRlY29yYXRvcnNBY3RpdmVcbiAgICAgID8gZGVjb3JhdGVkUHJpdmF0ZUluamVjdFdpdGhNZXRhXG4gICAgICA6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YTtcblxuICAgIHByaXZhdGVEaS5pbmplY3RNYW55ID0gcHJlSW5qZWN0QWN0aXZlXG4gICAgICA/IHByZUluamVjdEluamVjdE1hbnlcbiAgICAgIDogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnk7XG5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueVdpdGhNZXRhID0gcHJlSW5qZWN0QWN0aXZlXG4gICAgICA/IHByZUluamVjdEluamVjdE1hbnlXaXRoTWV0YVxuICAgICAgOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhO1xuXG4gICAgLy8gYGVsZW1lbnRJbmplY3RgIGlzIGRlbGliZXJhdGVseSBsZWZ0IHVud3JhcHBlZDogZW5mb3JjZW1lbnQgaXMgcGVyXG4gICAgLy8gaW5qZWN0IG9wZXJhdGlvbiwgYW5kIGFuIGluamVjdE1hbnkncyBlbGVtZW50cyB3ZXJlIGFscmVhZHkgY292ZXJlZCBieVxuICAgIC8vIHRoZSBjaGVjayBvbiB0aGUgb3BlcmF0aW9uIGl0c2VsZi5cbiAgICBwcml2YXRlRGkuaW5qZWN0ID0gd2l0aENvbnN1bXB0aW9uRW5mb3JjZW1lbnQocHJpdmF0ZURpLmluamVjdCk7XG4gICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhID0gd2l0aENvbnN1bXB0aW9uRW5mb3JjZW1lbnQoXG4gICAgICBwcml2YXRlRGkuaW5qZWN0V2l0aE1ldGEsXG4gICAgKTtcbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KHByaXZhdGVEaS5pbmplY3RNYW55KTtcbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueVdpdGhNZXRhID0gd2l0aENvbnN1bXB0aW9uRW5mb3JjZW1lbnQoXG4gICAgICBwcml2YXRlRGkuaW5qZWN0TWFueVdpdGhNZXRhLFxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgZmlyZVB1cmdlQ2FsbGJhY2tzID0gZmlyZVB1cmdlQ2FsbGJhY2tzRm9yKHtcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSk7XG5cbiAgY29uc3QgcmF3UmVnaXN0ZXJTaW5nbGUgPSByZWdpc3RlclNpbmdsZUZvcih7XG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICBpbmplY3RhYmxlSWRTZXQsXG4gICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gICAgcmVzb2x2ZUluamVjdGlvblRva2VuT2YsXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgfSk7XG5cbiAgY29uc3QgcmVnaXN0ZXJTaW5nbGUgPSAoaW5qZWN0YWJsZSwgY29udGV4dCkgPT4ge1xuICAgIHJhd1JlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUsIGNvbnRleHQpO1xuXG4gICAgY29uc3QgaW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUpO1xuXG4gICAgbGV0IHdpcmluZ0NoYW5nZWQgPSBmYWxzZTtcblxuICAgIGlmIChpc1JlbGF0ZWRUb1Rva2VuKGluamVjdGlvblRva2VuLCBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbikpIHtcbiAgICAgIGRlY29yYXRvckNhY2hlLmluamVjdGlvbiA9IG51bGw7XG4gICAgICB3aXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3Rpb25Ub2tlbiwgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbikpIHtcbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgICB3aXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAod2lyaW5nQ2hhbmdlZCkge1xuICAgICAgc3luY0luamVjdFdpcmluZygpO1xuICAgIH1cbiAgfTtcblxuICAvLyBDYWxsYmFja3MgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgc3BlY2lmaWMgdGFyZ2V0IGFsc28gbGFuZCB1bmRlciB0aGVcbiAgLy8gYWJzdHJhY3QgdG9rZW4sIHNvIGFuIGVtcHR5IHNldCBoZXJlIG1lYW5zIG5vIHB1cmdlIGNhbGxiYWNrIGNhbiBhcHBseS5cbiAgY29uc3QgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KFxuICAgICAgaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gICAgKTtcblxuICAgIHJldHVybiByZWdpc3RlcmVkICE9PSB1bmRlZmluZWQgJiYgcmVnaXN0ZXJlZC5zaXplID4gMDtcbiAgfTtcblxuICBjb25zdCBwdXJnZUluc3RhbmNlcyA9IHB1cmdlSW5zdGFuY2VzRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlU3RvcmVkSW5zdGFuY2VzID0gcHVyZ2VTdG9yZWRJbnN0YW5jZXNGb3Ioe1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gICAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxuICB9KTtcblxuICBjb25zdCBkZXJlZ2lzdGVyID0gZGVyZWdpc3RlckZvcih7XG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAvLyBUb2RvOiBnZXQgcmlkIG9mIGZ1bmN0aW9uIHVzYWdlLlxuICAgIGdldERpOiAoKSA9PiBwcml2YXRlRGksXG4gICAgZGVjb3JhdG9yQ2FjaGUsXG4gICAgc3luY0luamVjdFdpcmluZyxcbiAgICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICAgIGZvcmdldEluamVjdGlvblRva2VuT2YsXG4gIH0pO1xuXG4gIGNvbnN0IHByaXZhdGVSZWdpc3RlciA9IHJlZ2lzdGVyRm9yKHtcbiAgICByZWdpc3RlclNpbmdsZSxcbiAgICBpbmplY3RNYW55OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgICByZXNvbHZlSW5qZWN0aW9uVG9rZW5PZixcbiAgICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlID0gZWFybHlPdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlMiA9IGVhcmx5T3ZlcnJpZGUyRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVGb3Ioe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBlYXJseU92ZXJyaWRlLFxuICB9KTtcblxuICBjb25zdCBvdmVycmlkZTIgPSBvdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGVhcmx5T3ZlcnJpZGU6IGVhcmx5T3ZlcnJpZGUyLFxuICB9KTtcblxuICBjb25zdCB1bm92ZXJyaWRlID0gdW5vdmVycmlkZUZvcih7XG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlQWxsQnV0T3ZlcnJpZGVzID0gKCkgPT4ge1xuICAgIGluamVjdGFibGVTZXQuY2xlYXIoKTtcbiAgICBhbHJlYWR5SW5qZWN0ZWQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlSWRTZXQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5jbGVhcigpO1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5jbGVhcigpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAuY2xlYXIoKTtcbiAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSBudWxsO1xuICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgc3luY0luamVjdFdpcmluZygpO1xuICB9O1xuXG4gIC8vIFRoZSBpbW1lZGlhdGUgcGFyZW50IGlzIHRoZSBsYXN0IHJlZ2lzdHJhdGlvbiBjb250ZXh0IGl0ZW07IGEgbWlzc2luZ1xuICAvLyBlbnRyeSBvciBhIGNvbnRhaW5lci1sZXZlbCBwYXJlbnQgbm9ybWFsaXplcyB0byByb290SW5qZWN0YWJsZSBzbyB0aGF0XG4gIC8vIHNjb3BlIGNvbXBhcmlzb25zIHdvcmsgdW5pZm9ybWx5IGZvciByb290IGFuZCBuZXN0ZWQgc2NvcGVzLlxuICBjb25zdCBnZXRJbW1lZGlhdGVTY29wZU9mID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmdldChpbmplY3RhYmxlKTtcbiAgICBjb25zdCBpbW1lZGlhdGVQYXJlbnQgPSBjb250ZXh0Py5bY29udGV4dC5sZW5ndGggLSAxXT8uaW5qZWN0YWJsZTtcblxuICAgIHJldHVybiAhaW1tZWRpYXRlUGFyZW50IHx8IGltbWVkaWF0ZVBhcmVudC5hbGlhc1R5cGUgPT09ICdjb250YWluZXInXG4gICAgICA/IHJvb3RJbmplY3RhYmxlXG4gICAgICA6IGltbWVkaWF0ZVBhcmVudDtcbiAgfTtcblxuICBjb25zdCBwcml2YXRlRGkgPSB7XG4gICAgLy8gU3dhcHBlZCBieSBzeW5jSW5qZWN0V2lyaW5nOiB0aGUgZGVjb3JhdGVkIHZhcmlhbnRzIGFyZSB3aXJlZFxuICAgIC8vIGluIG9ubHkgd2hpbGUgYXQgbGVhc3Qgb25lIGluamVjdGlvbiBkZWNvcmF0b3IgaXMgcmVnaXN0ZXJlZCwgc28gdGhlXG4gICAgLy8gY29tbW9uIG5vLWRlY29yYXRvciBjYXNlIHBheXMgbm8gd3JhcHBlciBmcmFtZSBhdCBhbGwuXG4gICAgaW5qZWN0OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICAgIGluamVjdFdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhLFxuXG4gICAgaW5qZWN0RmFjdG9yeTpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3QoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICByZWdpc3RlcjogcHJpdmF0ZVJlZ2lzdGVyLFxuICAgIGRlcmVnaXN0ZXIsXG4gICAgb3ZlcnJpZGUsXG4gICAgb3ZlcnJpZGUyLFxuICAgIGVhcmx5T3ZlcnJpZGUsXG4gICAgZWFybHlPdmVycmlkZTIsXG4gICAgdW5vdmVycmlkZSxcblxuICAgIHJlc2V0OiAoKSA9PiB7XG4gICAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuY2xlYXIoKTtcbiAgICB9LFxuXG4gICAgcGVybWl0U2lkZUVmZmVjdHM6IGFsaWFzID0+IHtcbiAgICAgIGlmIChhbGlhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNpZGVFZmZlY3RzQXJlUHJldmVudGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5mb3JFYWNoKGluamVjdGFibGUgPT5cbiAgICAgICAgaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMuYWRkKGluamVjdGFibGUpLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgcHVyZ2U6IHB1cmdlSW5zdGFuY2VzLFxuXG4gICAgc2NvcGVkUHVyZ2U6IChzY29wZUluamVjdGFibGUsIGFsaWFzLCAuLi5rZXlQYXJ0cykgPT4ge1xuICAgICAgLy8gV2l0aG91dCBhbiBhbGlhcywgdGhlIHNjb3BlJ3Mgb3duIGluc3RhbmNlcyBhbmQgdGhvc2Ugb2Ygd2hhdGV2ZXIgaXRcbiAgICAgIC8vIHJlZ2lzdGVyZWQgZGlyZWN0bHkuXG4gICAgICBpZiAoYWxpYXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KHNjb3BlSW5qZWN0YWJsZSk7XG5cbiAgICAgICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoXG4gICAgICAgICAgY2hpbGRyZW4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBbc2NvcGVJbmplY3RhYmxlXVxuICAgICAgICAgICAgOiBbc2NvcGVJbmplY3RhYmxlLCAuLi5jaGlsZHJlbl0sXG4gICAgICAgICAga2V5UGFydHMsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG4gICAgICBjb25zdCBhbGxvd2VkQ2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50TWFwLmdldChzY29wZUluamVjdGFibGUpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluamVjdGFibGUgPSBpbmplY3RhYmxlc1tpXTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5qZWN0YWJsZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmXG4gICAgICAgICAgIWFsbG93ZWRDaGlsZHJlbj8uaGFzKGluamVjdGFibGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUcmllZCB0byBwdXJnZSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICAgICl9XCIgZnJvbSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgc2NvcGVJbmplY3RhYmxlLFxuICAgICAgICAgICAgKX1cIiwgYnV0IGl0IGlzIG5vdCB3aXRoaW4gaXRzIHJlZ2lzdHJhdGlvbiBjb250ZXh0IHRyZWUuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1cmdlU3RvcmVkSW5zdGFuY2VzKGluamVjdGFibGVzLCBrZXlQYXJ0cyk7XG4gICAgfSxcblxuICAgIHB1cmdlQWxsQnV0T3ZlcnJpZGVzLFxuICAgIGhhc1JlZ2lzdHJhdGlvbnM6IGFsaWFzID0+ICEhZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5sZW5ndGgsXG4gICAgZ2V0TnVtYmVyT2ZSZWdpc3RyYXRpb25zOiBhbGlhcyA9PiBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpLmxlbmd0aCxcblxuICAgIHJlZ2lzdGVyZWRJblNjb3BlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKFxuICAgICAgICBpbmplY3RhYmxlID0+IGdldEltbWVkaWF0ZVNjb3BlT2YoaW5qZWN0YWJsZSkgPT09IHNjb3BlSW5qZWN0YWJsZSxcbiAgICAgICksXG5cbiAgICByZWdpc3RlcmVkSW5TdWJ0cmVlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKGluamVjdGFibGUgPT4ge1xuICAgICAgICBsZXQgc2NvcGUgPSBnZXRJbW1lZGlhdGVTY29wZU9mKGluamVjdGFibGUpO1xuXG4gICAgICAgIHdoaWxlIChzY29wZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmIHNjb3BlICE9PSByb290SW5qZWN0YWJsZSkge1xuICAgICAgICAgIHNjb3BlID0gZ2V0SW1tZWRpYXRlU2NvcGVPZihzY29wZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2NvcGUgPT09IHNjb3BlSW5qZWN0YWJsZTtcbiAgICAgIH0pLFxuXG4gICAgZ2V0TnVtYmVyT2ZJbnN0YW5jZXM6ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaW5qZWN0YWJsZSwgc3RvcmVkXSBvZiBpbnN0YW5jZXNCeUluamVjdGFibGVNYXApIHtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcbiAgICAgICAgaWYgKCFuYW1lc3BhY2VkSWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChpc0NvbXBvc2l0ZVN0b3JhZ2Uoc3RvcmVkKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgXyBvZiBzdG9yZWQudmFsdWVzKCkpIGNvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudCA+IDApIHJlc3VsdFtuYW1lc3BhY2VkSWRdID0gY291bnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG5cbiAgLy8gVGhlIHNsb3RzIHN0YXJ0IG91dCBob2xkaW5nIHRoZSBiYXJlIG9wZXJhdGlvbnM7IHdpcmUgdGhlbSBvbmNlIHVwLWZyb250XG4gIC8vIHNvIGVuZm9yY2VtZW50IGFwcGxpZXMgZXZlbiBpbiBhIGNvbnRhaW5lciB3aGVyZSBub3RoaW5nIGlzIHJlZ2lzdGVyZWQuXG4gIHN5bmNJbmplY3RXaXJpbmcoKTtcblxuICBjb25zdCBwdWJsaWNJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdCh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiByb290SW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICBjb25zdCBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljRGkgPSB7XG4gICAgLi4ucHJpdmF0ZURpLFxuXG4gICAgaW5qZWN0OiBwdWJsaWNJbmplY3QsXG4gICAgaW5qZWN0V2l0aE1ldGE6IHB1YmxpY0luamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnk6IHB1YmxpY0luamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEsXG5cbiAgICBpbmplY3QyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdChhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnkyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICAvLyBSZXNvbHZlcyBwZXIgY2FsbCBsaWtlIGluamVjdE1hbnksIGJ1dCB1bndyYXBzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb3JcbiAgICAvLyB1bmRlZmluZWQgXHUyMDE0IHRoZSAnemVyby1vci1vbmUnIHVwcGVyIGJvdW5kIGd1YXJhbnRlZXMgYXQgbW9zdCBvbmUuXG4gICAgaW5qZWN0TWF5YmUyOiBhbGlhcyA9PiB7XG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHkoYWxpYXMsIHJvb3RJbmplY3RhYmxlKTtcblxuICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIGluamVjdFdpdGhNZXRhMjpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3RXaXRoTWV0YShhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnlXaXRoTWV0YTI6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgcHVibGljSW5qZWN0TWFueVdpdGhNZXRhKGFsaWFzLCAuLi5wYXJhbXMpLFxuXG4gICAgLy8gaW5qZWN0TWF5YmUyIG92ZXIgdGhlIHdpdGgtbWV0YSBwbGFuZTogdW53cmFwcyB0byB0aGUgc2luZ2xlXG4gICAgLy8gbWV0YS13cmFwcGVkIGluc3RhbmNlIG9yIHVuZGVmaW5lZC5cbiAgICBpbmplY3RNYXliZVdpdGhNZXRhMjogYWxpYXMgPT4ge1xuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCByb290SW5qZWN0YWJsZSk7XG5cbiAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5yZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbY29udGFpbmVyUm9vdENvbnRleHRJdGVtXSxcbiAgICAgICAgc291cmNlOiByb290SW5qZWN0YWJsZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBkZXJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5kZXJlZ2lzdGVyKHtcbiAgICAgICAgaW5qZWN0YWJsZXMsXG4gICAgICAgIGNvbnRleHQ6IFtjb250YWluZXJSb290Q29udGV4dEl0ZW1dLFxuICAgICAgICBzb3VyY2U6IHJvb3RJbmplY3RhYmxlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGU6IGFsaWFzID0+XG4gICAgICBwcml2YXRlRGkucmVnaXN0ZXJlZEluU2NvcGVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuXG4gICAgdmFsaWRhdGU6IHZhbGlkYXRlRm9yKHtcbiAgICAgIGNvbnRhaW5lcklkLFxuICAgICAgaW5qZWN0YWJsZVNldCxcbiAgICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICB9KSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGVTdWJ0cmVlOiBhbGlhcyA9PlxuICAgICAgcHJpdmF0ZURpLnJlZ2lzdGVyZWRJblN1YnRyZWVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuICB9O1xuXG4gIHJldHVybiBwdWJsaWNEaTtcbn07XG4iLCAiaW1wb3J0IHsgaWRlbnRpdHksIGNvbnN0YW50IH0gZnJvbSAnbG9kYXNoL2ZwJztcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVkU3BlY2lmaWVyID0gY29uc3RhbnQoaWRlbnRpdHkpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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QUFBQSxRQUNqQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSxZQUFZLElBQUksZ0JBQWdCO0FBQzlCLGdCQUFVLFdBQVc7QUFBQSxRQUNuQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSx3QkFBd0IsV0FDdEIsVUFBVSxvQkFBb0IsZ0JBQWdCLEtBQUs7QUFBQSxJQUVyRCxVQUFVLFlBQVk7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUVELCtCQUErQixXQUM3QixVQUFVLHNCQUFzQixnQkFBZ0IsS0FBSztBQUFBLEVBQ3pEO0FBRUEsU0FBTztBQUNUOzs7QUNub0JBLGdCQUFtQztBQUU1QixJQUFNLHdCQUFvQixvQkFBUyxrQkFBUTs7O0F6Q3NCM0MsSUFBTSxnQ0FBZ0M7IiwKICAibmFtZXMiOiBbImluc3RhbnRpYXRlIiwgImNoaWxkTWFwIiwgImRlbGV0ZWQiLCAibWluaW1hbERpIiwgIm5ld0luc3RhbmNlIiwgImNhbGxiYWNrcyIsICJFTVBUWSJdCn0K
|
|
2282
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXguanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtLmpzIiwgIi4uL3NyYy9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5LmpzIiwgIi4uL3NyYy9nZXRJbmplY3RhYmxlL2dldEluamVjdGFibGUuanMiLCAiLi4vc3JjL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyLmpzIiwgIi4uL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9pbmplY3Rpb25Ub2tlblRhZy5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0SW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjIuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b2tlbnMuanMiLCAiLi4vc3JjL2NvbXBvc2l0ZS1tYXAvY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2Zhc3RGbG93LmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdEZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3dpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdE1hbnlGb3IuanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXRTY29wZWRJZEZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldE5hbWVzcGFjZWRJZEZvci5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0YWJsZUJ1bmNoL2dldEluamVjdGFibGVCdW5jaC5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0YWJsZUJ1bmNoL2lzSW5qZWN0YWJsZUJ1bmNoLmpzIiwgIi4uL3NyYy9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZS5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3RvRmxhdEluamVjdGFibGVzLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvZ2V0UmVsYXRlZFRva2Vucy5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldFJlbGF0ZWRJbmplY3RhYmxlc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3JlZ2lzdGVyLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHVyZ2VJbnN0YW5jZXMuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9kZXJlZ2lzdGVyLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvb3ZlcnJpZGUuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9jaGVja0Zvck5vTWF0Y2hlc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yVG9vTWFueU1hdGNoZXMuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9jaGVja0ZvclNpZGVFZmZlY3RzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JVbmRlY2xhcmVkQ29uc3VtcHRpb25Gb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci92YWxpZGF0ZS5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2Vhcmx5LW92ZXJyaWRlLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvd2l0aFByZUluamVjdENhbGxiYWNrc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2ZpcmVQdXJnZUNhbGxiYWNrc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvaW5qZWN0aW9uVG9rZW5SZXNvbHV0aW9uRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY3JlYXRlQ29udGFpbmVyLmpzIiwgIi4uL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9nZXRUeXBlZFNwZWNpZmllci5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IGNyZWF0ZUNvbnRhaW5lciBmcm9tICcuL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY3JlYXRlQ29udGFpbmVyJztcblxuaW1wb3J0IGdldEluamVjdGFibGUgZnJvbSAnLi9zcmMvZ2V0SW5qZWN0YWJsZS9nZXRJbmplY3RhYmxlJztcbmltcG9ydCBnZXRJbmplY3RhYmxlMiBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5pbXBvcnQgaXNJbmplY3RhYmxlIGZyb20gJy4vc3JjL2dldEluamVjdGFibGUvaXNJbmplY3RhYmxlJztcbmltcG9ydCBsaWZlY3ljbGVFbnVtIGZyb20gJy4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtJztcblxuaW1wb3J0IHtcbiAgZ2V0SW5qZWN0aW9uVG9rZW4sXG4gIGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4sXG59IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2dldEluamVjdGlvblRva2VuJztcblxuaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSAnLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4yL2dldEluamVjdGlvblRva2VuMic7XG5cbmltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuXG5pbXBvcnQgZ2V0SW5qZWN0YWJsZUJ1bmNoIGZyb20gJy4vc3JjL2dldEluamVjdGFibGVCdW5jaC9nZXRJbmplY3RhYmxlQnVuY2gnO1xuaW1wb3J0IGlzSW5qZWN0YWJsZUJ1bmNoIGZyb20gJy4vc3JjL2dldEluamVjdGFibGVCdW5jaC9pc0luamVjdGFibGVCdW5jaCc7XG5pbXBvcnQgdG9GbGF0SW5qZWN0YWJsZXMgZnJvbSAnLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3RvRmxhdEluamVjdGFibGVzJztcbmltcG9ydCB7IGdldENvbXBvc2l0ZUtleSB9IGZyb20gJy4vc3JjL2dldENvbXBvc2l0ZUtleS9nZXRDb21wb3NpdGVLZXknO1xuXG5leHBvcnQgeyBnZXRUeXBlZFNwZWNpZmllciB9IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2dldFR5cGVkU3BlY2lmaWVyJztcbmV4cG9ydCB7IGluamVjdGlvblRva2VuVGFnIH0gZnJvbSAnLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vaW5qZWN0aW9uVG9rZW5UYWcnO1xuXG5leHBvcnQgY29uc3QgZ2V0S2V5ZWRTaW5nbGV0b25Db21wb3NpdGVLZXkgPSBnZXRDb21wb3NpdGVLZXk7XG5cblxuXG5leHBvcnQge1xuICBkZXJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gIGRlcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbixcbiAgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICBwcmVJbmplY3RDYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbn0gZnJvbSAnLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3Rva2Vucyc7XG5cbmV4cG9ydCB7XG4gIGNyZWF0ZUNvbnRhaW5lcixcbiAgZ2V0SW5qZWN0YWJsZSxcbiAgZ2V0SW5qZWN0YWJsZTIsXG4gIGlzSW5qZWN0YWJsZSxcbiAgZ2V0SW5qZWN0YWJsZUJ1bmNoLFxuICBpc0luamVjdGFibGVCdW5jaCxcbiAgZ2V0SW5qZWN0aW9uVG9rZW4sXG4gIGdldEluamVjdGlvblRva2VuMixcbiAgZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbixcbiAgaXNJbmplY3Rpb25Ub2tlbixcbiAgbGlmZWN5Y2xlRW51bSxcbiAgdG9GbGF0SW5qZWN0YWJsZXMsXG59O1xuIiwgImV4cG9ydCBjb25zdCBub25TdG9yZWRJbnN0YW5jZUtleSA9IFN5bWJvbCgnbm9uLXN0b3JlZC1pbnN0YW5jZS1rZXknKTtcbmV4cG9ydCBjb25zdCBzdG9yZWRJbnN0YW5jZUtleSA9IFN5bWJvbCgnc3RvcmVkLWluc3RhbmNlLWtleScpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNpbmdsZXRvbjoge1xuICAgIGlkOiAnc2luZ2xldG9uJyxcblxuICAgIGdldEluc3RhbmNlS2V5OiAoKSA9PiBzdG9yZWRJbnN0YW5jZUtleSxcbiAgfSxcblxuICBrZXllZFNpbmdsZXRvbjogKHsgZ2V0SW5zdGFuY2VLZXkgfSkgPT4gKHtcbiAgICBpZDogJ2tleWVkU2luZ2xldG9uJyxcbiAgICBnZXRJbnN0YW5jZUtleSxcbiAgfSksXG5cbiAgdHJhbnNpZW50OiB7XG4gICAgaWQ6ICd0cmFuc2llbnQnLFxuICAgIGdldEluc3RhbmNlS2V5OiAoKSA9PiBub25TdG9yZWRJbnN0YW5jZUtleSxcbiAgfSxcbn07XG4iLCAiZXhwb3J0IGNvbnN0IGNvbXBvc2l0ZUtleVN5bWJvbCA9IFN5bWJvbCgnY29tcG9zaXRlLWtleScpO1xuZXhwb3J0IGNvbnN0IGdldENvbXBvc2l0ZUtleSA9ICguLi5rZXlzKSA9PiAoe1xuICBbY29tcG9zaXRlS2V5U3ltYm9sXTogdHJ1ZSxcbiAga2V5cyxcbn0pO1xuXG5leHBvcnQgY29uc3QgaXNDb21wb3NpdGVLZXkgPSB0aGluZyA9PlxuICB0aGluZyAmJiB0aGluZ1tjb21wb3NpdGVLZXlTeW1ib2xdID09PSB0cnVlO1xuIiwgImltcG9ydCBsaWZlY3ljbGVFbnVtIGZyb20gJy4uL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtJztcblxuZXhwb3J0IGNvbnN0IGluamVjdGFibGVTeW1ib2wgPSAnaW5qZWN0YWJsZSc7XG5cbmV4cG9ydCBkZWZhdWx0ICh7IGxpZmVjeWNsZSA9IGxpZmVjeWNsZUVudW0uc2luZ2xldG9uLCAuLi5pbmplY3RhYmxlIH0pID0+ICh7XG4gIGFsaWFzVHlwZTogaW5qZWN0YWJsZVN5bWJvbCxcbiAgbGlmZWN5Y2xlLFxuICAuLi5pbmplY3RhYmxlLFxufSk7XG4iLCAiaW1wb3J0IGxpZmVjeWNsZUVudW0gZnJvbSAnLi4vZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuLi9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvbGlmZWN5Y2xlRW51bSc7XG5pbXBvcnQgeyBnZXRDb21wb3NpdGVLZXkgfSBmcm9tICcuLi9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5JztcblxuZXhwb3J0IGNvbnN0IGluamVjdGFibGVTeW1ib2wyID0gJ2luamVjdGFibGUyJztcblxuLy8gSG9pc3RlZCBhbmQgc2hhcmVkIGFjcm9zcyBldmVyeSBub24tdHJhbnNpZW50IGdldEluamVjdGFibGUyIFx1MjAxNCBzYXZlcyBhXG4vLyBwZXItY2FsbCBsaWZlY3ljbGUgYWxsb2NhdGlvbiwgYW5kIHRoZSBgX2lzVjJEZWZhdWx0TGlmZWN5Y2xlYCB0YWcgbGV0c1xuLy8gcHJpdmF0ZUluamVjdEZvciBza2lwIHRoZSBnZXRJbnN0YW5jZUtleSBjYWxsICsga2V5LWFycmF5IGFsbG9jYXRpb24gd2hlblxuLy8gYSB2MiBpbmplY3RhYmxlIGlzIGluamVjdGVkIHdpdGggbm8gYXJncyAodGhlIGNvbW1vbiBjYXNlIGZvclxuLy8gbm9uLXBhcmFtZXRyaWMgdjIpLiBUaGUgdGFnIGlzIHRoZSAqb25seSogc2lnbmFsIHdlIHRydXN0IHRvIGJ5cGFzc1xuLy8gZ2V0SW5zdGFuY2VLZXkgYmVjYXVzZSB1c2VyLXByb3ZpZGVkIGdldEluc3RhbmNlS2V5IG1heSBsZWdpdGltYXRlbHlcbi8vIHJldHVybiBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc3RvcmVkSW5zdGFuY2VLZXlgIGZvciBlbXB0eSBhcmdzLlxuY29uc3QgdjJEZWZhdWx0TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRW51bS5rZXllZFNpbmdsZXRvbih7XG4gIGdldEluc3RhbmNlS2V5OiAoZGksIC4uLmFyZ3MpID0+IHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiBzdG9yZWRJbnN0YW5jZUtleTtcbiAgICByZXR1cm4gZ2V0Q29tcG9zaXRlS2V5KC4uLmFyZ3MpO1xuICB9LFxufSk7XG5cbnYyRGVmYXVsdExpZmVjeWNsZS5faXNWMkRlZmF1bHRMaWZlY3ljbGUgPSB0cnVlO1xuXG5leHBvcnQgZGVmYXVsdCAoeyBpbnN0YW50aWF0ZSwgdHJhbnNpZW50ID0gZmFsc2UsIC4uLnJlc3QgfSkgPT4gKHtcbiAgYWxpYXNUeXBlOiBpbmplY3RhYmxlU3ltYm9sMixcbiAgaW5zdGFudGlhdGUsXG4gIHRyYW5zaWVudCxcbiAgbGlmZWN5Y2xlOiB0cmFuc2llbnQgPyBsaWZlY3ljbGVFbnVtLnRyYW5zaWVudCA6IHYyRGVmYXVsdExpZmVjeWNsZSxcbiAgLi4ucmVzdCxcbn0pO1xuIiwgIi8vIFRoZSBpbml0aWFsIHRhZyBjYXJyaWVkIGJ5IGV2ZXJ5IGluamVjdGlvbiB0b2tlbiAodjEgYW5kIHYyKSwgcGVybWl0dGluZ1xuLy8gdGFnLWtleWVkIGRlY29yYXRvcnMgdG8gdGFyZ2V0IGFueSB0b2tlbiwgZS5nLlxuLy8gYGluamVjdGlvbkRlY29yYXRvclRva2VuLmZvcihpbmplY3Rpb25Ub2tlblRhZylgLlxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuVGFnID0gJ2luamVjdGlvblRva2VuJztcbiIsICJpbXBvcnQgeyBpbmplY3Rpb25Ub2tlblRhZyB9IGZyb20gJy4vaW5qZWN0aW9uVG9rZW5UYWcnO1xuXG5leHBvcnQgY29uc3QgaW5qZWN0aW9uVG9rZW5TeW1ib2wgPSAnaW5qZWN0aW9uLXRva2VuJztcblxuZXhwb3J0IGNvbnN0IGdldEluamVjdGlvblRva2VuID0gKHtcbiAgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3Rvcnk6IHNwZWNpZmljVG9rZW5GYWN0b3J5ID0gZ2V0U3BlY2lmaWNUb2tlbkJ5SWQsXG5cbiAgdGFyZ2V0LFxuXG4gIHRhZ3MsXG5cbiAgLi4ucmVzdFxufSkgPT4ge1xuICBjb25zdCBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eSA9IG5ldyBNYXAoKTtcblxuICAvLyBUaGUgZmFjdG9yeSBpcyBhc3N1bWVkIHB1cmUgYW5kIGRldGVybWluaXN0aWM6IGEgc3BlY2lmaWVyIGFsd2F5cyBtYXBzXG4gIC8vIHRvIHRoZSBzYW1lIHRva2VuLCBzbyBzaW5nbGUtc3BlY2lmaWVyIGNhbGxzIGFyZSBtZW1vaXplZCBieSBzcGVjaWZpZXJcbiAgLy8gdG8gc2tpcCBjb25zdHJ1Y3RpbmcgYSB0aHJvd2F3YXkgY2FuZGlkYXRlIG9uIHJlcGVhdCBgLmZvcigpYCBjYWxscy5cbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllciA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZW5lcmFsVG9rZW4gPSBPYmplY3QuYXNzaWduKHRhcmdldCA/PyB7fSwge1xuICAgIC4uLnJlc3QsXG5cbiAgICB0YWdzOiBbaW5qZWN0aW9uVG9rZW5UYWcsIC4uLih0YWdzID8/IFtdKV0sXG5cbiAgICBhbGlhc1R5cGU6IGluamVjdGlvblRva2VuU3ltYm9sLFxuXG4gICAgZm9yOiAoLi4uc3BlY2lmaWVycykgPT4ge1xuICAgICAgY29uc3QgbWVtb2l6ZWRUb2tlbiA9XG4gICAgICAgIHNwZWNpZmllcnMubGVuZ3RoID09PSAxXG4gICAgICAgICAgPyBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLmdldChzcGVjaWZpZXJzWzBdKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobWVtb2l6ZWRUb2tlbikge1xuICAgICAgICByZXR1cm4gbWVtb2l6ZWRUb2tlbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3BlY2lmaWNUb2tlbkNhbmRpZGF0ZSA9IHNwZWNpZmljVG9rZW5GYWN0b3J5KC4uLnNwZWNpZmllcnMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5nZXQoXG4gICAgICAgIHNwZWNpZmljVG9rZW5DYW5kaWRhdGUuc3BlY2lhbGl0eSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChleGlzdGluZ1NwZWNpZmljVG9rZW4pIHtcbiAgICAgICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgZXhpc3RpbmdTcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGlzdGluZ1NwZWNpZmljVG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlO1xuXG4gICAgICBzcGVjaWZpY1Rva2VuLmlkID0gYCR7Z2VuZXJhbFRva2VuLmlkfS8ke3NwZWNpZmljVG9rZW4uaWR9YDtcbiAgICAgIHNwZWNpZmljVG9rZW4uc3BlY2lmaWNUb2tlbk9mID0gZ2VuZXJhbFRva2VuO1xuICAgICAgc3BlY2lmaWNUb2tlbi5tYXhDYWNoZVNpemUgPSBnZW5lcmFsVG9rZW4ubWF4Q2FjaGVTaXplO1xuICAgICAgc3BlY2lmaWNUb2tlbi50YWdzID0gZ2VuZXJhbFRva2VuLnRhZ3M7XG5cbiAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWFsaXR5LnNldChzcGVjaWZpY1Rva2VuLnNwZWNpYWxpdHksIHNwZWNpZmljVG9rZW4pO1xuXG4gICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgc3BlY2lmaWNUb2tlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzcGVjaWZpY1Rva2VuO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBnZW5lcmFsVG9rZW47XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbiA9ICguLi5hcmdzKSA9PlxuICBnZXRJbmplY3Rpb25Ub2tlbiguLi5hcmdzKTtcblxuY29uc3QgZ2V0U3BlY2lmaWNUb2tlbkJ5SWQgPSBpZCA9PiBnZXRJbmplY3Rpb25Ub2tlbih7IGlkLCBzcGVjaWFsaXR5OiBpZCB9KTtcbiIsICJpbXBvcnQgeyBpbmplY3Rpb25Ub2tlblRhZyB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2luamVjdGlvblRva2VuVGFnJztcblxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuU3ltYm9sMiA9ICdpbmplY3Rpb24tdG9rZW4yJztcblxuY29uc3QgY2FyZGluYWxpdGllcyA9IFsnb25lJywgJ3plcm8tb3Itb25lJywgJ3plcm8tb3ItbWFueScsICdvbmUtb3ItbWFueSddO1xuXG5jb25zdCBidWlsZFRva2VuID0gKHtcbiAgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnksXG4gIHRhcmdldCxcbiAgdGFncyxcbiAgLi4ucmVzdFxufSkgPT4ge1xuICAvLyBBIHNwZWNpZmljIHRva2VuIG1heSBkZWNsYXJlIGl0cyBvd24gY2FyZGluYWxpdHkgXHUyMDE0IGl0cyBmYW1pbHkncyBnZW5lcmFsXG4gIC8vIHRva2VuIG9mdGVuIGhhcyBhIGRpZmZlcmVudCBvbmUgXHUyMDE0IGFuZCBpbmhlcml0cyB3aGVuIGl0IGRvZXMgbm90LCB3aGljaFxuICAvLyBpcyB3aHkgb25seSBnZW5lcmFsIHRva2VucyBhcmUgcmVxdWlyZWQgdG8gZGVjbGFyZS5cbiAgaWYgKHJlc3QuY2FyZGluYWxpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChyZXN0LnNwZWNpYWxpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gY3JlYXRlIGluamVjdGlvbiB0b2tlbiBcIiR7cmVzdC5pZH1cIiB3aXRob3V0IGNhcmRpbmFsaXR5LmAsXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmICghY2FyZGluYWxpdGllcy5pbmNsdWRlcyhyZXN0LmNhcmRpbmFsaXR5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUcmllZCB0byBjcmVhdGUgaW5qZWN0aW9uIHRva2VuIFwiJHtyZXN0LmlkfVwiIHdpdGggdW5rbm93biBjYXJkaW5hbGl0eSBcIiR7cmVzdC5jYXJkaW5hbGl0eX1cIi5gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eSA9IG5ldyBNYXAoKTtcblxuICAvLyBUaGUgZmFjdG9yeSBpcyBhc3N1bWVkIHB1cmUgYW5kIGRldGVybWluaXN0aWM6IGEgc3BlY2lmaWVyIGFsd2F5cyBtYXBzXG4gIC8vIHRvIHRoZSBzYW1lIHRva2VuLCBzbyBzaW5nbGUtc3BlY2lmaWVyIGNhbGxzIGFyZSBtZW1vaXplZCBieSBzcGVjaWZpZXJcbiAgLy8gdG8gc2tpcCBjb25zdHJ1Y3RpbmcgYSB0aHJvd2F3YXkgY2FuZGlkYXRlIG9uIHJlcGVhdCBgLmZvcigpYCBjYWxscy5cbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllciA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZW5lcmFsVG9rZW4gPSBPYmplY3QuYXNzaWduKHRhcmdldCA/PyB7fSwge1xuICAgIC4uLnJlc3QsXG5cbiAgICB0YWdzOiBbaW5qZWN0aW9uVG9rZW5UYWcsIC4uLih0YWdzID8/IFtdKV0sXG5cbiAgICBhbGlhc1R5cGU6IGluamVjdGlvblRva2VuU3ltYm9sMixcblxuICAgIC8vIE5vIGZhY3RvcnkgbWVhbnMgbm8gYC5mb3IoKWAgYXQgYWxsLCBtYXRjaGluZyB0aGUgdHlwZTogYSB0b2tlbiBpc24ndFxuICAgIC8vIHJlcXVpcmVkIHRvIGJlIHBhcnQgb2YgYSBmYW1pbHkuIEEgZmFjdG9yeSBhbHNvIG1ha2VzIHRoZSB0b2tlblxuICAgIC8vIGFic3RyYWN0OiBpdCdzIG9ubHkgZXZlciB1c2VmdWwgcmVzb2x2ZWQgdmlhIGEgcmVhbCBgLmZvcigpYCwgc28gaXRcbiAgICAvLyBjYW5ub3QgYmUgaW5qZWN0ZWQvcmVnaXN0ZXJlZCBkaXJlY3RseSBcdTIwMTQgc2VlIGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvclxuICAgIC8vIGFuZCByZWdpc3Rlci5qcydzIGBpbmplY3Rpb25Ub2tlbj8uYWJzdHJhY3RgIGNoZWNrLlxuICAgIC4uLihzcGVjaWZpY0luamVjdGlvblRva2VuRmFjdG9yeSAmJiB7XG4gICAgICBhYnN0cmFjdDogdHJ1ZSxcblxuICAgICAgZm9yOiAoLi4uc3BlY2lmaWVycykgPT4ge1xuICAgICAgICBjb25zdCBtZW1vaXplZFRva2VuID1cbiAgICAgICAgICBzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgPyBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLmdldChzcGVjaWZpZXJzWzBdKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVG9rZW4pIHtcbiAgICAgICAgICByZXR1cm4gbWVtb2l6ZWRUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW5DYW5kaWRhdGUgPSBzcGVjaWZpY0luamVjdGlvblRva2VuRmFjdG9yeShcbiAgICAgICAgICAuLi5zcGVjaWZpZXJzLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWNUb2tlbiA9IHNwZWNpZmljVG9rZW5zQnlTcGVjaWFsaXR5LmdldChcbiAgICAgICAgICBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlLnNwZWNpYWxpdHksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGV4aXN0aW5nU3BlY2lmaWNUb2tlbikge1xuICAgICAgICAgIGlmIChzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgZXhpc3RpbmdTcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdTcGVjaWZpY1Rva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BlY2lmaWNUb2tlbiA9IHNwZWNpZmljVG9rZW5DYW5kaWRhdGU7XG5cbiAgICAgICAgc3BlY2lmaWNUb2tlbi5pZCA9IGAke2dlbmVyYWxUb2tlbi5pZH0vJHtzcGVjaWZpY1Rva2VuLmlkfWA7XG4gICAgICAgIHNwZWNpZmljVG9rZW4uc3BlY2lmaWNUb2tlbk9mID0gZ2VuZXJhbFRva2VuO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLm1heENhY2hlU2l6ZSA9IGdlbmVyYWxUb2tlbi5tYXhDYWNoZVNpemU7XG4gICAgICAgIHNwZWNpZmljVG9rZW4udGFncyA9IGdlbmVyYWxUb2tlbi50YWdzO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLmNhcmRpbmFsaXR5ID1cbiAgICAgICAgICBzcGVjaWZpY1Rva2VuLmNhcmRpbmFsaXR5ID8/IGdlbmVyYWxUb2tlbi5jYXJkaW5hbGl0eTtcblxuICAgICAgICBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5zZXQoc3BlY2lmaWNUb2tlbi5zcGVjaWFsaXR5LCBzcGVjaWZpY1Rva2VuKTtcblxuICAgICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLnNldChzcGVjaWZpZXJzWzBdLCBzcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzcGVjaWZpY1Rva2VuO1xuICAgICAgfSxcbiAgICB9KSxcbiAgfSk7XG5cbiAgcmV0dXJuIGdlbmVyYWxUb2tlbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbmplY3Rpb25Ub2tlbjIgPSAoLi4uYXJncykgPT4ge1xuICAvLyBBIHNpbmdsZSwgbm9uLWN1cnJpZWQgY2FsbDogb3B0aW9ucyBnaXZlbiBkaXJlY3RseSwgZmFjdG9yeSBjdXJyaWVkIGFzXG4gIC8vIGl0cyBvd24gdHJhaWxpbmcgY2FsbCBcdTIwMTQgZ2V0SW5qZWN0aW9uVG9rZW4yKG9wdGlvbnMpKGZhY3RvcnkpLCBvclxuICAvLyBnZXRJbmplY3Rpb25Ub2tlbjIob3B0aW9ucykoKSBmb3IgYSBjb25jcmV0ZSB0b2tlbiB3aXRoIG5vIGAuZm9yKClgIGF0XG4gIC8vIGFsbC4gUGFzc2luZyBhIGZhY3RvcnkgYWxzbyBtYWtlcyB0aGUgdG9rZW4gYWJzdHJhY3QgXHUyMDE0IHNlZSBidWlsZFRva2VuLlxuICAvLyBUaGUgZXhwbGljaXQtU0YgZXNjYXBlIGhhdGNoIChnZXRJbmplY3Rpb25Ub2tlbjI8RiwgTUYsIFNGPihvcHRpb25zKSlcbiAgLy8gdXNlcyB0aGlzIGV4YWN0IHNhbWUgc2hhcGUsIGZhY3RvcnkganVzdCBvcHRpb25hbCBvbiB0aGUgdHJhaWxpbmcgY2FsbFxuICAvLyBpbnN0ZWFkIG9mIHJlcXVpcmVkIFx1MjAxNCBub3RoaW5nIGRpc3Rpbmd1aXNoZXMgdGhlbSBhdCBydW50aW1lLCBzaW5jZSBTRlxuICAvLyBiZWluZyBzcGVsbGVkIG91dCBleHBsaWNpdGx5IHZzIGluZmVycmVkIGZyb20gdGhlIGZhY3RvcnkgdmFsdWUgaXNcbiAgLy8gZXJhc2VkIGJ5IHRoZSB0aW1lIHRoaXMgY29kZSBydW5zLlxuICAvL1xuICAvLyBBIGBzcGVjaWFsaXR5YCBpbiBvcHRpb25zIGJ1aWxkcyBhIHNwZWNpZmljIHRva2VuIGRpcmVjdGx5IFx1MjAxNCB0aGlzIGlzIGhvd1xuICAvLyBnZXRTcGVjaWZpY0luamVjdGlvblRva2VuMiB1c2VkIHRvIGJlIGl0cyBvd24gZnVuY3Rpb247IGZvbGRlZCBpbiBoZXJlXG4gIC8vIHNpbmNlIGJ1aWxkVG9rZW4gYWxyZWFkeSB0aHJlYWRzIGBzcGVjaWFsaXR5YCB0aHJvdWdoIHZpYSBgLi4ucmVzdGBcbiAgLy8gcmVnYXJkbGVzcyBvZiB3aGljaCBjcmVhdG9yIGlzIGNhbGxlZC4gVW5saWtlIHRoZSBvbGRcbiAgLy8gZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbjIsIHRoaXMgYWxzbyBhY2NlcHRzIGEgZmFjdG9yeSwgc28gYSBzcGVjaWZpY1xuICAvLyB0b2tlbiBjYW4gaXRzZWxmIGJlIGEgZmFtaWx5IHJvb3QgZm9yIG5lc3RlZCBzcGVjaWZpY2l0eSBcdTIwMTQgc2VlIHRoZVxuICAvLyBjb21tZW50IG9uIGJ1aWxkVG9rZW4gZm9yIHdoeSB0aGF0IG1ha2VzIGl0IGFic3RyYWN0IHRvby5cbiAgaWYgKGFyZ3MubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRyaWVkIHRvIGNyZWF0ZSBpbmplY3Rpb24gdG9rZW4ke1xuICAgICAgICBhcmdzWzBdPy5pZCA/IGAgXCIke2FyZ3NbMF0uaWR9XCJgIDogJydcbiAgICAgIH0gd2l0aCAke1xuICAgICAgICBhcmdzLmxlbmd0aFxuICAgICAgfSBhcmd1bWVudHM7IGdldEluamVjdGlvblRva2VuMiB0YWtlcyBleGFjdGx5IG9uZSAob3B0aW9ucykuYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgW29wdGlvbnNdID0gYXJncztcblxuICByZXR1cm4gc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkgPT5cbiAgICBidWlsZFRva2VuKHsgLi4ub3B0aW9ucywgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkgfSk7XG59O1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuIH0gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0SW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4yL2dldEluamVjdGlvblRva2VuMic7XG5cbi8vIE1hY2hpbmVyeSB0b2tlbnMgY2Fycnkgbm8gdGFnczogdGFnIGRpc3BhdGNoIHJlYWRzIHRoZSB0YXJnZXQncyB0b2tlblxuLy8gY2hhaW4sIHNvIGEgZGVjb3JhdG9yIHJlZ2lzdGVyZWQgdW5kZXIgZS5nLlxuLy8gYGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbi5mb3IoJ2luamVjdGlvblRva2VuJylgIHdvdWxkIG90aGVyd2lzZSBiZVxuLy8gZm91bmQgdmlhIGl0cyBvd24gcmVnaXN0cmF0aW9uIHRva2VuIGR1cmluZyBpdHMgb3duIGluc3RhbnRpYXRpb24gXHUyMDE0XG4vLyBpbmZpbml0ZSByZWN1cnNpb24uIGAuZm9yKClgIGNoaWxkcmVuIGNvcHkgdGhlIGdlbmVyYWwgdG9rZW4ncyB0YWdzIGF0XG4vLyBjcmVhdGlvbiwgc28gdGhlIGV4ZW1wdGlvbiBwcm9wYWdhdGVzIHRvIHRoZW0uIChTYW1lIHJvbGUgdGhlIHJlbW92ZWRcbi8vIGBkZWNvcmFibGU6IGZhbHNlYCBmbGFnIGhhZC4pXG5jb25zdCB1bnRhZ2dlZCA9IHRva2VuID0+IHtcbiAgdG9rZW4udGFncyA9IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRva2VuO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4oe1xuICAgIGlkOiAncmVnaXN0cmF0aW9uLWNhbGxiYWNrLXRva2VuJyxcbiAgfSksXG4pO1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuKHtcbiAgICBpZDogJ2RlcmVnaXN0cmF0aW9uLWNhbGxiYWNrLXRva2VuJyxcbiAgfSksXG4pO1xuXG5leHBvcnQgY29uc3QgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdpbnN0YW50aWF0ZS1kZWNvcmF0b3ItdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG5cbmV4cG9ydCBjb25zdCBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnaW5qZWN0aW9uLWRlY29yYXRvci10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdpbnN0YW5jZS1wdXJnZS1jYWxsYmFjay10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdyZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRva2VuJyxcbiAgICBjYXJkaW5hbGl0eTogJ3plcm8tb3ItbWFueScsXG4gIH0pKHRhcmdldCA9PiBnZXRJbmplY3Rpb25Ub2tlbjIoeyBpZDogdGFyZ2V0LmlkLCBzcGVjaWFsaXR5OiB0YXJnZXQgfSkoKSksXG4pO1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnZGVyZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRva2VuJyxcbiAgICBjYXJkaW5hbGl0eTogJ3plcm8tb3ItbWFueScsXG4gIH0pKHRhcmdldCA9PiBnZXRJbmplY3Rpb25Ub2tlbjIoeyBpZDogdGFyZ2V0LmlkLCBzcGVjaWFsaXR5OiB0YXJnZXQgfSkoKSksXG4pO1xuXG5leHBvcnQgY29uc3QgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAncHJlLWluamVjdC1jYWxsYmFjay10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcbiIsICJjb25zdCBpc09iamVjdEtleSA9IGtleSA9PlxuICAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYga2V5ICE9PSBudWxsKSB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nO1xuXG5jb25zdCBtYWtlTm9kZSA9ICgpID0+ICh7XG4gIGxheWVyOiBuZXcgTWFwKCksXG4gIHdlYWtMYXllcjogbmV3IFdlYWtNYXAoKSxcbiAgY2hpbGRyZW46IG5ldyBNYXAoKSxcbiAgd2Vha0NoaWxkcmVuOiBuZXcgV2Vha01hcCgpLFxuICBoYXNXZWFrRW50cmllczogZmFsc2UsXG59KTtcblxuZXhwb3J0IGNsYXNzIENvbXBvc2l0ZU1hcCB7XG4gICNpbnRlcm5hbE1hcCA9IG1ha2VOb2RlKCk7XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlcyA9IFtdKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaW5pdGlhbFZhbHVlcykge1xuICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgI2xheWVyRm9yKG1hcEVudHJ5LCBrZXkpIHtcbiAgICByZXR1cm4gaXNPYmplY3RLZXkoa2V5KSA/IG1hcEVudHJ5LndlYWtMYXllciA6IG1hcEVudHJ5LmxheWVyO1xuICB9XG5cbiAgI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBrZXkpIHtcbiAgICByZXR1cm4gaXNPYmplY3RLZXkoa2V5KSA/IG1hcEVudHJ5LndlYWtDaGlsZHJlbiA6IG1hcEVudHJ5LmNoaWxkcmVuO1xuICB9XG5cbiAgI3NldChtYXBFbnRyeSwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IGtleVswXTtcbiAgICAgIHRoaXMuI2xheWVyRm9yKG1hcEVudHJ5LCBmaXJzdCkuc2V0KGZpcnN0LCB2YWx1ZSk7XG4gICAgICBpZiAoaXNPYmplY3RLZXkoZmlyc3QpKSBtYXBFbnRyeS5oYXNXZWFrRW50cmllcyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBrZXk7XG4gICAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCk7XG4gICAgICBsZXQgbmV4dE1hcEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGZpcnN0KTtcblxuICAgICAgaWYgKCFuZXh0TWFwRW50cnkpIHtcbiAgICAgICAgbmV4dE1hcEVudHJ5ID0gbWFrZU5vZGUoKTtcbiAgICAgICAgY2hpbGRNYXAuc2V0KGZpcnN0LCBuZXh0TWFwRW50cnkpO1xuICAgICAgICBpZiAoaXNPYmplY3RLZXkoZmlyc3QpKSBtYXBFbnRyeS5oYXNXZWFrRW50cmllcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuI3NldChuZXh0TWFwRW50cnksIHJlc3QsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBrZXkgdG8gYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignS2V5cyBtdXN0IGJlIGF0IGxlYXN0IGxlbmd0aCAxJyk7XG4gICAgfVxuXG4gICAgdGhpcy4jc2V0KHRoaXMuI2ludGVybmFsTWFwLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gICNnZXQobWFwRW50cnksIGtleSkge1xuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy4jbGF5ZXJGb3IobWFwRW50cnksIGtleVswXSkuZ2V0KGtleVswXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBrZXk7XG4gICAgICBjb25zdCBuZXh0TWFwRW50cnkgPSB0aGlzLiNjaGlsZHJlbkZvcihtYXBFbnRyeSwgZmlyc3QpLmdldChmaXJzdCk7XG5cbiAgICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLiNnZXQobmV4dE1hcEVudHJ5LCByZXN0KTtcbiAgICB9XG4gIH1cblxuICBnZXQoa2V5KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGtleSB0byBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNnZXQodGhpcy4jaW50ZXJuYWxNYXAsIGtleSk7XG4gIH1cblxuICAjaGFzKG1hcEVudHJ5LCBrZXkpIHtcbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2xheWVyRm9yKG1hcEVudHJ5LCBrZXlbMF0pLmhhcyhrZXlbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGZpcnN0KS5nZXQoZmlyc3QpO1xuXG4gICAgICBpZiAoIW5leHRNYXBFbnRyeSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLiNoYXMobmV4dE1hcEVudHJ5LCByZXN0KTtcbiAgICB9XG4gIH1cblxuICBoYXMoa2V5KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGtleSB0byBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2hhcyh0aGlzLiNpbnRlcm5hbE1hcCwga2V5KTtcbiAgfVxuXG4gICp2YWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBbLCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gICprZXlzKCkge1xuICAgIGZvciAoY29uc3QgW2tleV0gb2YgdGhpcy5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIGtleTtcbiAgICB9XG4gIH1cblxuICAqI2VudHJpZXMobWFwRW50cnksIGtleSkge1xuICAgIGZvciAoY29uc3QgW2xheWVyS2V5LCBsYXllclZhbHVlXSBvZiBtYXBFbnRyeS5sYXllci5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIFtbLi4ua2V5LCBsYXllcktleV0sIGxheWVyVmFsdWVdO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2xheWVyS2V5LCBsYXllck1hcEVudHJ5XSBvZiBtYXBFbnRyeS5jaGlsZHJlbi5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkKiB0aGlzLiNlbnRyaWVzKGxheWVyTWFwRW50cnksIFsuLi5rZXksIGxheWVyS2V5XSk7XG4gICAgfVxuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgeWllbGQqIHRoaXMuI2VudHJpZXModGhpcy4jaW50ZXJuYWxNYXAsIFtdKTtcbiAgfVxuXG4gICNjYW5QcnVuZShub2RlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICFub2RlLmhhc1dlYWtFbnRyaWVzICYmIG5vZGUubGF5ZXIuc2l6ZSA9PT0gMCAmJiBub2RlLmNoaWxkcmVuLnNpemUgPT09IDBcbiAgICApO1xuICB9XG5cbiAgI2RlbGV0ZShtYXBFbnRyeSwga2V5KSB7XG4gICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwga2V5WzBdKS5kZWxldGUoa2V5WzBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgIGNvbnN0IGNoaWxkTWFwID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGZpcnN0KTtcbiAgICBjb25zdCBuZXh0TWFwRW50cnkgPSBjaGlsZE1hcC5nZXQoZmlyc3QpO1xuXG4gICAgaWYgKCFuZXh0TWFwRW50cnkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy4jZGVsZXRlKG5leHRNYXBFbnRyeSwgcmVzdCk7XG5cbiAgICBpZiAoZGVsZXRlZCAmJiB0aGlzLiNjYW5QcnVuZShuZXh0TWFwRW50cnkpKSB7XG4gICAgICBjaGlsZE1hcC5kZWxldGUoZmlyc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgZGVsZXRlKGtleSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpIHx8IGtleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlKHRoaXMuI2ludGVybmFsTWFwLCBrZXkpO1xuICB9XG5cbiAgI2ZvckVhY2hJblN1YnRyZWUobWFwRW50cnksIG9uVmFsdWUpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG1hcEVudHJ5LmxheWVyLnZhbHVlcygpKSB7XG4gICAgICBvblZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkRW50cnkgb2YgbWFwRW50cnkuY2hpbGRyZW4udmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuI2ZvckVhY2hJblN1YnRyZWUoY2hpbGRFbnRyeSwgb25WYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgI2RlbGV0ZUJ5UHJlZml4KG1hcEVudHJ5LCBrZXlQcmVmaXgsIG9uVmFsdWUpIHtcbiAgICBpZiAoa2V5UHJlZml4Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5UHJlZml4WzBdO1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwga2V5KTtcbiAgICAgIGNvbnN0IGNoaWxkTWFwID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGtleSk7XG4gICAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAobGF5ZXIuaGFzKGtleSkpIHtcbiAgICAgICAgaWYgKG9uVmFsdWUpIG9uVmFsdWUobGF5ZXIuZ2V0KGtleSkpO1xuICAgICAgICBsYXllci5kZWxldGUoa2V5KTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkRW50cnkgPSBjaGlsZE1hcC5nZXQoa2V5KTtcblxuICAgICAgaWYgKGNoaWxkRW50cnkpIHtcbiAgICAgICAgaWYgKG9uVmFsdWUpIHRoaXMuI2ZvckVhY2hJblN1YnRyZWUoY2hpbGRFbnRyeSwgb25WYWx1ZSk7XG4gICAgICAgIGNoaWxkTWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IGtleVByZWZpeDtcbiAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCk7XG4gICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGZpcnN0KTtcblxuICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuI2RlbGV0ZUJ5UHJlZml4KG5leHRNYXBFbnRyeSwgcmVzdCwgb25WYWx1ZSk7XG5cbiAgICBpZiAoZGVsZXRlZCAmJiB0aGlzLiNjYW5QcnVuZShuZXh0TWFwRW50cnkpKSB7XG4gICAgICBjaGlsZE1hcC5kZWxldGUoZmlyc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgZGVsZXRlQnlQcmVmaXgoa2V5UHJlZml4LCBvblZhbHVlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleVByZWZpeCkgfHwga2V5UHJlZml4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNkZWxldGVCeVByZWZpeCh0aGlzLiNpbnRlcm5hbE1hcCwga2V5UHJlZml4LCBvblZhbHVlKTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuI2ludGVybmFsTWFwID0gbWFrZU5vZGUoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IENvbXBvc2l0ZU1hcCB9IGZyb20gJy4vY29tcG9zaXRlLW1hcCc7XG5cbmV4cG9ydCBjbGFzcyBMcnVDb21wb3NpdGVNYXAge1xuICAjaW5uZXIgPSBuZXcgQ29tcG9zaXRlTWFwKCk7XG4gICNtYXhTaXplO1xuICAjc2l6ZSA9IDA7XG4gICNoZWFkID0gbnVsbDtcbiAgI3RhaWwgPSBudWxsO1xuICAjb25FdmljdDtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplLCB7IG9uRXZpY3QgfSA9IHt9KSB7XG4gICAgdGhpcy4jbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgdGhpcy4jb25FdmljdCA9IG9uRXZpY3Q7XG4gIH1cblxuICAjYWRkVG9IZWFkKG5vZGUpIHtcbiAgICBub2RlLm5leHQgPSB0aGlzLiNoZWFkO1xuICAgIG5vZGUucHJldiA9IG51bGw7XG5cbiAgICBpZiAodGhpcy4jaGVhZCkge1xuICAgICAgdGhpcy4jaGVhZC5wcmV2ID0gbm9kZTtcbiAgICB9XG5cbiAgICB0aGlzLiNoZWFkID0gbm9kZTtcblxuICAgIGlmICghdGhpcy4jdGFpbCkge1xuICAgICAgdGhpcy4jdGFpbCA9IG5vZGU7XG4gICAgfVxuICB9XG5cbiAgI3JlbW92ZU5vZGUobm9kZSkge1xuICAgIGlmIChub2RlLnByZXYpIHtcbiAgICAgIG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNoZWFkID0gbm9kZS5uZXh0O1xuICAgIH1cblxuICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgIG5vZGUubmV4dC5wcmV2ID0gbm9kZS5wcmV2O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiN0YWlsID0gbm9kZS5wcmV2O1xuICAgIH1cblxuICAgIG5vZGUucHJldiA9IG51bGw7XG4gICAgbm9kZS5uZXh0ID0gbnVsbDtcbiAgfVxuXG4gICNwcm9tb3RlTm9kZShub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IHRoaXMuI2hlYWQpIHJldHVybjtcbiAgICB0aGlzLiNyZW1vdmVOb2RlKG5vZGUpO1xuICAgIHRoaXMuI2FkZFRvSGVhZChub2RlKTtcbiAgfVxuXG4gICNldmljdExydSgpIHtcbiAgICBjb25zdCBscnVOb2RlID0gdGhpcy4jdGFpbDtcbiAgICBjb25zdCBrZXkgPSBscnVOb2RlLmtleTtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy4jaW5uZXIuZ2V0KGtleSk7XG4gICAgdGhpcy4jcmVtb3ZlTm9kZShscnVOb2RlKTtcbiAgICB0aGlzLiNpbm5lci5kZWxldGUoa2V5KTtcbiAgICB0aGlzLiNzaXplLS07XG5cbiAgICBpZiAodGhpcy4jb25FdmljdCkgdGhpcy4jb25FdmljdCh3cmFwcGVyLnZhbHVlLCBrZXkpO1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLiNpbm5lci5nZXQoa2V5KTtcblxuICAgIGlmICh3cmFwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy4jcHJvbW90ZU5vZGUod3JhcHBlci5scnVOb2RlKTtcblxuICAgIHJldHVybiB3cmFwcGVyLnZhbHVlO1xuICB9XG5cbiAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuI2lubmVyLmdldChrZXkpO1xuXG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy4jcHJvbW90ZU5vZGUoZXhpc3RpbmcubHJ1Tm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbHJ1Tm9kZSA9IHsga2V5LCBwcmV2OiBudWxsLCBuZXh0OiBudWxsIH07XG4gICAgdGhpcy4jaW5uZXIuc2V0KGtleSwgeyB2YWx1ZSwgbHJ1Tm9kZSB9KTtcbiAgICB0aGlzLiNhZGRUb0hlYWQobHJ1Tm9kZSk7XG4gICAgdGhpcy4jc2l6ZSsrO1xuXG4gICAgaWYgKHRoaXMuI3NpemUgPiB0aGlzLiNtYXhTaXplKSB7XG4gICAgICB0aGlzLiNldmljdExydSgpO1xuICAgIH1cbiAgfVxuXG4gIGhhcyhrZXkpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5uZXIuaGFzKGtleSk7XG4gIH1cblxuICAqdmFsdWVzKCkge1xuICAgIGZvciAoY29uc3Qgd3JhcHBlciBvZiB0aGlzLiNpbm5lci52YWx1ZXMoKSkge1xuICAgICAgeWllbGQgd3JhcHBlci52YWx1ZTtcbiAgICB9XG4gIH1cblxuICAqa2V5cygpIHtcbiAgICB5aWVsZCogdGhpcy4jaW5uZXIua2V5cygpO1xuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB3cmFwcGVyXSBvZiB0aGlzLiNpbm5lci5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIFtrZXksIHdyYXBwZXIudmFsdWVdO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZUJ5UHJlZml4KGtleVByZWZpeCkge1xuICAgIHJldHVybiB0aGlzLiNpbm5lci5kZWxldGVCeVByZWZpeChrZXlQcmVmaXgsIHdyYXBwZXIgPT4ge1xuICAgICAgdGhpcy4jcmVtb3ZlTm9kZSh3cmFwcGVyLmxydU5vZGUpO1xuICAgICAgdGhpcy4jc2l6ZS0tO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy4jaW5uZXIuY2xlYXIoKTtcbiAgICB0aGlzLiNoZWFkID0gbnVsbDtcbiAgICB0aGlzLiN0YWlsID0gbnVsbDtcbiAgICB0aGlzLiNzaXplID0gMDtcbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0ICguLi5mdW5jdGlvbnMpID0+XG4gIHggPT4ge1xuICAgIGxldCB2YWwgPSB4O1xuXG4gICAgZnVuY3Rpb25zLmZvckVhY2goZiA9PiB7XG4gICAgICB2YWwgPSBmKHZhbCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmFsO1xuICB9O1xuIiwgImltcG9ydCB7IG5vblN0b3JlZEluc3RhbmNlS2V5LCBzdG9yZWRJbnN0YW5jZUtleSB9IGZyb20gJy4vbGlmZWN5Y2xlRW51bSc7XG5pbXBvcnQgeyBpc0NvbXBvc2l0ZUtleSB9IGZyb20gJy4uL2dldENvbXBvc2l0ZUtleS9nZXRDb21wb3NpdGVLZXknO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbCB9IGZyb20gJy4uL2dldEluamVjdGFibGUvZ2V0SW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcbmltcG9ydCB7IGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbiB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IENvbXBvc2l0ZU1hcCB9IGZyb20gJy4uL2NvbXBvc2l0ZS1tYXAvY29tcG9zaXRlLW1hcCc7XG5pbXBvcnQgeyBMcnVDb21wb3NpdGVNYXAgfSBmcm9tICcuLi9jb21wb3NpdGUtbWFwL2xydS1jb21wb3NpdGUtbWFwJztcbmltcG9ydCBmbG93IGZyb20gJy4vZmFzdEZsb3cnO1xuXG4vLyBQcmUtYWxsb2NhdGVkIGtleSBmb3Igc2luZ2xldG9uIGluc3RhbmNlIGxvb2t1cCBcdTIwMTQgYXZvaWRzIGFycmF5IGNyZWF0aW9uIHBlciBpbmplY3QoKVxuY29uc3Qgc2luZ2xldG9uQ29tcG9zaXRlS2V5ID0gW3N0b3JlZEluc3RhbmNlS2V5XTtcblxuLy8gRGV0ZWN0cyB0aGUga2V5ZWRTaW5nbGV0b24gc3RvcmFnZSBzaGFwZS4gU2luZ2xldG9ucyAoYW5kIHYyLWRlZmF1bHRcbi8vIGluamVjdGFibGVzIHRoYXQgaGF2ZSBvbmx5IGV2ZXIgYmVlbiBjYWxsZWQgd2l0aG91dCBhcmdzKSBzdG9yZSB0aGVcbi8vIGluc3RhbmNlIGRpcmVjdGx5OyBrZXllZFNpbmdsZXRvbiB3aXRoLWFyZ3Mgc3RvcmFnZSB1c2VzIGEgQ29tcG9zaXRlTWFwLlxuZXhwb3J0IGNvbnN0IGlzQ29tcG9zaXRlU3RvcmFnZSA9IHN0b3JlZCA9PlxuICBzdG9yZWQgaW5zdGFuY2VvZiBDb21wb3NpdGVNYXAgfHwgc3RvcmVkIGluc3RhbmNlb2YgTHJ1Q29tcG9zaXRlTWFwO1xuXG5leHBvcnQgY29uc3QgcHJpdmF0ZUluamVjdEZvciA9XG4gICh7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGluamVjdGFibGVTZXQsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZ2V0RGksXG4gICAgY2hlY2tGb3JOb01hdGNoZXMsXG4gICAgY2hlY2tGb3JUb29NYW55TWF0Y2hlcyxcbiAgICBjaGVja0ZvclNpZGVFZmZlY3RzLFxuICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbixcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgICBnZXRTY29wZWRJZCxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSkgPT5cbiAgKHsgd2l0aE1ldGEgfSkgPT5cbiAgKHsgYWxpYXMsIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICBjb25zdCBkaSA9IGdldERpKCk7XG5cbiAgICBsZXQgb3JpZ2luYWxJbmplY3RhYmxlO1xuXG4gICAgLy8gRmFzdCBwYXRoOiBhbGlhcyBpcyBpdHNlbGYgYW4gaW5qZWN0YWJsZSAodGhlIGRvbWluYW50IGNhc2UgXHUyMDE0IGV2ZXJ5XG4gICAgLy8gY2FsbCBmcm9tIHByaXZhdGVJbmplY3RNYW55IGxhbmRzIGhlcmUgYmVjYXVzZSBpdCBpdGVyYXRlcyByZXNvbHZlZFxuICAgIC8vIGluamVjdGFibGVzKS4gU2tpcCBnZXRSZWxhdGVkSW5qZWN0YWJsZXMgKHdoaWNoIHdvdWxkIGFsbG9jYXRlIGFcbiAgICAvLyBzaW5nbGUtZWxlbWVudCBbYWxpYXNdIGFycmF5KSwgdGhlIHNpbmdsZS1tYXRjaC9uby1tYXRjaCB2YWxpZGF0b3JzLFxuICAgIC8vIGFuZCB0aGUgYWJzdHJhY3QtdG9rZW4gY2hlY2sgKGluamVjdGFibGVzIGFyZSBuZXZlciBhYnN0cmFjdCkuXG4gICAgY29uc3QgYWxpYXNUeXBlID0gYWxpYXMuYWxpYXNUeXBlO1xuXG4gICAgaWYgKGFsaWFzVHlwZSA9PT0gaW5qZWN0YWJsZVN5bWJvbCB8fCBhbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgICBpZiAoIWluamVjdGFibGVTZXQuaGFzKGFsaWFzKSkge1xuICAgICAgICAvLyBSZXVzZSB0aGUgZXhpc3RpbmcgdGhyb3cgd2l0aCB0aGUgc2FtZSB3b3JkaW5nIGFzIHRoZSB0b2tlbiBwYXRoLlxuICAgICAgICBjaGVja0Zvck5vTWF0Y2hlcyhbXSwgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxJbmplY3RhYmxlID0gYWxpYXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbihhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG5cbiAgICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICAgIGNoZWNrRm9yVG9vTWFueU1hdGNoZXMocmVsYXRlZEluamVjdGFibGVzLCBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG4gICAgICBjaGVja0Zvck5vTWF0Y2hlcyhyZWxhdGVkSW5qZWN0YWJsZXMsIGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKTtcblxuICAgICAgb3JpZ2luYWxJbmplY3RhYmxlID0gcmVsYXRlZEluamVjdGFibGVzWzBdO1xuICAgIH1cblxuICAgIGFscmVhZHlJbmplY3RlZC5hZGQob3JpZ2luYWxJbmplY3RhYmxlKTtcblxuICAgIGNvbnN0IGluamVjdGFibGUgPVxuICAgICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLnNpemUgPiAwXG4gICAgICAgID8gb3ZlcnJpZGluZ0luamVjdGFibGVzLmdldChvcmlnaW5hbEluamVjdGFibGUpIHx8IG9yaWdpbmFsSW5qZWN0YWJsZVxuICAgICAgICA6IG9yaWdpbmFsSW5qZWN0YWJsZTtcblxuICAgIGNoZWNrRm9yU2lkZUVmZmVjdHMoaW5qZWN0YWJsZSwgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG5cbiAgICAvLyBCYWNrd2FyZCBjb21wYXQ6IG9sZC1zdHlsZSBzaW5nbGV0b25zIHRvbGVyYXRlZCBgaW5qZWN0KGFsaWFzLCB1bmRlZmluZWQpYC5cbiAgICAvLyBOb3JtYWxpemUgYWxsLXVuZGVmaW5lZCBhcmdzIHRvIFtdIHNvIGZhc3QtcGF0aCBhbmQgc2luZ2xldG9uIGd1YXJkIGJlaGF2ZVxuICAgIC8vIGFzIGlmIG5vIHBhcmFtZXRlciB3YXMgc3VwcGxpZWQuXG4gICAgaWYgKFxuICAgICAgaW5qZWN0YWJsZS5hbGlhc1R5cGUgIT09IGluamVjdGFibGVTeW1ib2wyICYmXG4gICAgICBpbmplY3RhYmxlLmxpZmVjeWNsZS5pZCA9PT0gJ3NpbmdsZXRvbicgJiZcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA+IDAgJiZcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmV2ZXJ5KHAgPT4gcCA9PT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IHBhdGg6IHNpbmdsZXRvbiBjYWNoZSBoaXQgXHUyMDE0IGF2b2lkIGNyZWF0aW5nIG1pbmltYWxEaSBlbnRpcmVseS5cbiAgICAvLyBUaGUgc3RvcmVkIHZhbHVlIGlzIG9uZSBvZjpcbiAgICAvLyAgIC0gdW5kZWZpbmVkOiBub3RoaW5nIGNhY2hlZCB5ZXRcbiAgICAvLyAgIC0gQ29tcG9zaXRlTWFwIC8gTHJ1Q29tcG9zaXRlTWFwOiBrZXllZFNpbmdsZXRvbiBjYWNoZSwgbG9vayB1cCBieVxuICAgIC8vICAgICBzaW5nbGV0b25Db21wb3NpdGVLZXkgZm9yIGEgbm8tYXJncyBjYWxsXG4gICAgLy8gICAtIGFueSBvdGhlciB2YWx1ZTogaW5zdGFuY2UgZGlyZWN0bHkgKHNpbmdsZXRvbiBsaWZlY3ljbGUsIG9yIHYyXG4gICAgLy8gICAgIGRlZmF1bHQgbGlmZWN5Y2xlIHRoYXQgaGFzIG9ubHkgZXZlciBiZWVuIGNhbGxlZCB3aXRoIG5vIGFyZ3MpXG4gICAgLy9cbiAgICAvLyBXZSBkaXNwYXRjaCBvbiBsaWZlY3ljbGUuaWQgZmlyc3Qgc28gcGxhaW4gc2luZ2xldG9ucyAodGhlIGRvbWluYW50XG4gICAgLy8gY2FzZSkgc2tpcCB0aGUgaW5zdGFuY2VvZiBjaGVja3MgZW50aXJlbHk7IG9ubHkga2V5ZWRTaW5nbGV0b24tc2hhcGVkXG4gICAgLy8gbGlmZWN5Y2xlcyBmYWxsIHRocm91Z2ggdG8gdGhlIHN0cnVjdHVyYWwgY2hlY2suXG4gICAgaWYgKGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgaW5qZWN0YWJsZS5vdmVycmlkZGVuSW5qZWN0YWJsZSB8fCBpbmplY3RhYmxlLFxuICAgICAgKTtcblxuICAgICAgbGV0IGV4aXN0aW5nSW5zdGFuY2U7XG5cbiAgICAgIGlmIChpbmplY3RhYmxlLmxpZmVjeWNsZS5pZCA9PT0gJ3NpbmdsZXRvbicpIHtcbiAgICAgICAgZXhpc3RpbmdJbnN0YW5jZSA9IHN0b3JlZDtcbiAgICAgIH0gZWxzZSBpZiAoaXNDb21wb3NpdGVTdG9yYWdlKHN0b3JlZCkpIHtcbiAgICAgICAgZXhpc3RpbmdJbnN0YW5jZSA9IHN0b3JlZC5nZXQoc2luZ2xldG9uQ29tcG9zaXRlS2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXN0aW5nSW5zdGFuY2UgPSBzdG9yZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICAgIGlmICghd2l0aE1ldGEpIHtcbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5zdGFuY2U6IGV4aXN0aW5nSW5zdGFuY2UsXG4gICAgICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0SW5zdGFuY2UoXG4gICAgICBkaSxcbiAgICAgIGluamVjdGFibGUsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICBnZXROYW1lc3BhY2VkSWQsXG4gICAgICBnZXRTY29wZWRJZCxcbiAgICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICk7XG5cbiAgICBpZiAoIXdpdGhNZXRhKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgIH07XG4gIH07XG5cbmNvbnN0IGNyZWF0ZU1pbmltYWxEaSA9IChcbiAgZGksXG4gIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gIGdldFNjb3BlZElkLFxuICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4pID0+IHtcbiAgLy8gQ2xvc3VyZS1jYXB0dXJlZCBtZXRob2RzIGFyZSBmaXhlZCB1cC1mcm9udCAodGhlIHNoYXJlZCBvbmVzIHBsdXNcbiAgLy8gaW5qZWN0KiksIHNvIHVzZXIgY29kZSBjYW4gZGV0YWNoIHRoZW0gXHUyMDE0IGBjb25zdCB7IHJlZ2lzdGVyIH0gPSBkaTtcbiAgLy8gcmVnaXN0ZXIoLi4uKWAgYW5kIHNpbWlsYXIgcGF0dGVybnMgYXBwZWFyIGluIHRlc3RzLiBBXG4gIC8vIGNsYXNzLXdpdGgtcHJvdG90eXBlIGRpc3BhdGNoZXIgd291bGQgYmUgY2hlYXBlciB0byBhbGxvY2F0ZSBidXQgbG9zZXNcbiAgLy8gdGhhdCBkZXRhY2gtZnJpZW5kbHkgYmVoYXZpb3IuXG4gIC8vXG4gIC8vIEJvdGggc2hhcGVzIGJlbG93IGFyZSB3cml0dGVuIG91dCBhcyBvYmplY3QgbGl0ZXJhbHMgcmF0aGVyIHRoYW4gc3ByZWFkXG4gIC8vIGZyb20gYSBzaGFyZWQgb2JqZWN0OiBzcHJlYWRpbmcgYW4gb2JqZWN0IHRoYXQgaGFzIGEgZ2V0dGVyIHRha2VzIFY4J3NcbiAgLy8gc2xvdyBwYXRoLCB3aGljaCBtYWRlIGJ1aWxkaW5nIHRoaXMgb2JqZWN0IHNldmVyYWwgdGltZXMgYXMgY29zdGx5IGFzXG4gIC8vIHRoZSBsaXRlcmFsLCBvbmNlIHBlciBpbnN0YW50aWF0aW9uLlxuICBjb25zdCByZWdpc3RlciA9ICguLi5pbmplY3RhYmxlcykgPT4ge1xuICAgIGRpLnJlZ2lzdGVyKHtcbiAgICAgIGluamVjdGFibGVzLFxuICAgICAgY29udGV4dDogW3sgaW5qZWN0YWJsZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQgfV0sXG4gICAgICBzb3VyY2U6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGRlcmVnaXN0ZXIgPSAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICBkaS5kZXJlZ2lzdGVyKHtcbiAgICAgIGluamVjdGFibGVzLFxuICAgICAgY29udGV4dDogW3sgaW5qZWN0YWJsZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQgfV0sXG4gICAgICBzb3VyY2U6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIENvbXB1dGVkIG9uY2UgcGVyIGNhbGwsIHVwIGZyb250OiB0aGUgZ2V0dGVyIGl0IHVzZWQgdG8gYmUgd2FzIHJlYWQgb25jZVxuICAvLyBwZXIgY2FsbCB0b28sIHdoZW4gdGhlIHNoYXJlZCBvYmplY3Qgd2FzIHNwcmVhZC5cbiAgY29uc3QgaW5qZWN0aW5nTmFtZXNwYWNlZElkID1cbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGluZ0luamVjdGFibGUpO1xuXG4gIGNvbnN0IGxhc3RDb2xvbiA9IGluamVjdGluZ05hbWVzcGFjZWRJZFxuICAgID8gaW5qZWN0aW5nTmFtZXNwYWNlZElkLmxhc3RJbmRleE9mKCc6JylcbiAgICA6IC0xO1xuXG4gIGNvbnN0IHNvdXJjZU5hbWVzcGFjZSA9XG4gICAgbGFzdENvbG9uID4gMCA/IGluamVjdGluZ05hbWVzcGFjZWRJZC5zbGljZSgwLCBsYXN0Q29sb24pIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHB1cmdlID0gKGFsaWFzLCAuLi5rZXlQYXJ0cykgPT5cbiAgICBkaS5zY29wZWRQdXJnZShpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCwgYWxpYXMsIC4uLmtleVBhcnRzKTtcblxuICBjb25zdCByZWdpc3RlcmVkSW5Mb2NhbFNjb3BlID0gYWxpYXMgPT5cbiAgICBkaS5yZWdpc3RlcmVkSW5TY29wZU9mKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLCBhbGlhcyk7XG5cbiAgY29uc3QgcmVnaXN0ZXJlZEluTG9jYWxTY29wZVN1YnRyZWUgPSBhbGlhcyA9PlxuICAgIGRpLnJlZ2lzdGVyZWRJblN1YnRyZWVPZihpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCwgYWxpYXMpO1xuXG4gIGlmIChpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgLy8gQW4gaW1wZXJhdGl2ZSBvdmVycmlkZSAoZGkub3ZlcnJpZGUgLyBkaS5lYXJseU92ZXJyaWRlKSBpbnN0YW50aWF0ZXMgYVxuICAgIC8vIHN0YW5kLWluIG9iamVjdCB0aGF0IHdhcyBuZXZlciByZWdpc3RlcmVkOyB0aGUgcmVnaXN0cmF0aW9uIHRyZWUgb25seVxuICAgIC8vIGtub3dzIHRoZSBvcmlnaW5hbCwgc28gdGhlIHNjb3BlIHdhbGsgc3RhcnRzIGZyb20gaXQuXG4gICAgY29uc3QgcmVnaXN0ZXJlZEluamVjdGFibGUgPVxuICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQub3ZlcnJpZGRlbkluamVjdGFibGUgfHxcbiAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkO1xuXG4gICAgLy8gVjIgbWluaW1hbERpOiBpbmplY3QvaW5qZWN0TWFueS9ldGMgYXJlIGZhY3RvcnktcmV0dXJuaW5nLiBFYWNoIG1ldGhvZFxuICAgIC8vIGlzIGlubGluZWQgZGlyZWN0bHkgYWdhaW5zdCBgZGlgIChubyBtaW5pbWFsSW5qZWN0KiBpbnRlcm1lZGlhcnkpIHNvXG4gICAgLy8gd2UgZG9uJ3QgYWxsb2NhdGUgZm91ciBleHRyYSBjbG9zdXJlcyBwZXIgbWluaW1hbERpIGp1c3QgdG8gZm9yd2FyZC5cbiAgICByZXR1cm4ge1xuICAgICAgLy8gU2hhcmVkIHdpdGggdGhlIHYxIHNoYXBlIGJlbG93LCBkb3duIHRvIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGVTdWJ0cmVlOlxuICAgICAgLy8ga2VlcCB0aGUgdHdvIGxpc3RzIGluIHN0ZXAuXG4gICAgICByZWdpc3RlcixcbiAgICAgIGRlcmVnaXN0ZXIsXG4gICAgICBzb3VyY2VOYW1lc3BhY2UsXG4gICAgICBoYXNSZWdpc3RyYXRpb25zOiBkaS5oYXNSZWdpc3RyYXRpb25zLFxuICAgICAgZ2V0TnVtYmVyT2ZSZWdpc3RyYXRpb25zOiBkaS5nZXROdW1iZXJPZlJlZ2lzdHJhdGlvbnMsXG4gICAgICBnZXROdW1iZXJPZkluc3RhbmNlczogZGkuZ2V0TnVtYmVyT2ZJbnN0YW5jZXMsXG4gICAgICBwdXJnZSxcbiAgICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGUsXG4gICAgICByZWdpc3RlcmVkSW5Mb2NhbFNjb3BlU3VidHJlZSxcblxuICAgICAgLy8gVGhlIGlkZW50aXR5IG9mIHdoYXQgaXMgYmVpbmcgaW5zdGFudGlhdGVkLCBmb3IgaW5zdGFudGlhdGUtY29kZVxuICAgICAgLy8gc2hhcmVkIGFjcm9zcyBpbmplY3RhYmxlcyAoZGVjb3JhdG9ycywgcmV1c2FibGUgZmFjdG9yaWVzKS4gYGlkYCBpcyBhXG4gICAgICAvLyBwbGFpbiByZWFkOyB0aGUgc2NvcGUgcGFpciB3YWxrcyB0aGUgcmVnaXN0cmF0aW9uIHRyZWUgcGVyIHJlYWQsXG4gICAgICAvLyBoZW5jZSBnZXR0ZXJzLlxuICAgICAgaWQ6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmlkLFxuXG4gICAgICBnZXQgc2NvcGVJZHMoKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IGdldFNjb3BlZElkKHJlZ2lzdGVyZWRJbmplY3RhYmxlKTtcblxuICAgICAgICBpZHMucG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIGlkcztcbiAgICAgIH0sXG5cbiAgICAgIGdldCBzY29wZWRJZCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFNjb3BlZElkKHJlZ2lzdGVyZWRJbmplY3RhYmxlKTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdDpcbiAgICAgICAgYWxpYXMgPT5cbiAgICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgICBkaS5pbmplY3Qoe1xuICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogcGFyYW1zLFxuICAgICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgICAgfSksXG5cbiAgICAgIGluamVjdE1hbnk6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KSxcblxuICAgICAgaW5qZWN0TWF5YmU6IGFsaWFzID0+IHtcbiAgICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCk7XG5cbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdFdpdGhNZXRhOlxuICAgICAgICBhbGlhcyA9PlxuICAgICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYW55V2l0aE1ldGE6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYXliZVdpdGhNZXRhOiBhbGlhcyA9PiB7XG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eShhbGlhcywgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQpO1xuXG4gICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFYxIG1pbmltYWxEaTogaW5qZWN0L2luamVjdE1hbnkvZXRjIHJldHVybiBpbnN0YW5jZXMgZGlyZWN0bHkuXG4gIGNvbnN0IG1pbmltYWxJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBkaS5pbmplY3RNYW55KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0V2l0aE1ldGEoe1xuICAgICAgYWxpYXMsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogYXJncyxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIH0pO1xuXG4gIGNvbnN0IG1pbmltYWxJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICByZXR1cm4ge1xuICAgIC8vIFNoYXJlZCB3aXRoIHRoZSB2MiBzaGFwZSBhYm92ZSwgZG93biB0byByZWdpc3RlcmVkSW5Mb2NhbFNjb3BlU3VidHJlZTpcbiAgICAvLyBrZWVwIHRoZSB0d28gbGlzdHMgaW4gc3RlcC5cbiAgICByZWdpc3RlcixcbiAgICBkZXJlZ2lzdGVyLFxuICAgIHNvdXJjZU5hbWVzcGFjZSxcbiAgICBoYXNSZWdpc3RyYXRpb25zOiBkaS5oYXNSZWdpc3RyYXRpb25zLFxuICAgIGdldE51bWJlck9mUmVnaXN0cmF0aW9uczogZGkuZ2V0TnVtYmVyT2ZSZWdpc3RyYXRpb25zLFxuICAgIGdldE51bWJlck9mSW5zdGFuY2VzOiBkaS5nZXROdW1iZXJPZkluc3RhbmNlcyxcbiAgICBwdXJnZSxcbiAgICByZWdpc3RlcmVkSW5Mb2NhbFNjb3BlLFxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGVTdWJ0cmVlLFxuXG4gICAgaW5qZWN0OiBtaW5pbWFsSW5qZWN0LFxuICAgIGluamVjdE1hbnk6IG1pbmltYWxJbmplY3RNYW55LFxuICAgIGluamVjdFdpdGhNZXRhOiBtaW5pbWFsSW5qZWN0V2l0aE1ldGEsXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBtaW5pbWFsSW5qZWN0TWFueVdpdGhNZXRhLFxuXG4gICAgaW5qZWN0RmFjdG9yeTpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBtaW5pbWFsSW5qZWN0KGFsaWFzLCAuLi5wYXJhbXMpLFxuICB9O1xufTtcblxuY29uc3QgaW5zdGFudGlhdGUgPSAoXG4gIGRpLFxuICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgbWluaW1hbERpLFxuICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4pID0+IHtcbiAgLy8gRGVjb3JhdG9ycyBhbHdheXMgbG9vayB1cCBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBpbmplY3RhYmxlIHNvIHRoYXQgYW5cbiAgLy8gaW1wZXJhdGl2ZSBvdmVycmlkZSAoZGkub3ZlcnJpZGUgLyBkaS5lYXJseU92ZXJyaWRlKSBpcyB3cmFwcGVkIGJ5IGFueVxuICAvLyBkZWNvcmF0b3JzIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGUgb3JpZ2luYWwgdGFyZ2V0IFx1MjAxNCBjb21wb3NpbmcgZGVjb3JhdG9yc1xuICAvLyByZWx5IG9uIHRoaXMuXG4gIGNvbnN0IHRhcmdldCA9XG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQub3ZlcnJpZGRlbkluamVjdGFibGUgfHxcbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZDtcblxuICBjb25zdCBkZWNvcmF0b3JzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgIGRlY29yYXRvclRva2VuOiBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgdGFyZ2V0LFxuICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICB9KTtcblxuICBjb25zdCBkZWNvcmF0ZWQgPVxuICAgIGRlY29yYXRvcnMubGVuZ3RoID09PSAwXG4gICAgICA/IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmluc3RhbnRpYXRlXG4gICAgICA6IGZsb3coLi4uZGVjb3JhdG9ycykoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQuaW5zdGFudGlhdGUpO1xuXG4gIC8vIE5ldy1zdHlsZSBpbmplY3RhYmxlMjogY3VycmllZCAoZGkpID0+ICguLi5wYXJhbXMpID0+IGluc3RhbmNlXG4gIGlmIChpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgcmV0dXJuIGRlY29yYXRlZChtaW5pbWFsRGkpKC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzKTtcbiAgfVxuXG4gIC8vIE9sZC1zdHlsZTogKGRpLCAuLi5wYXJhbXMpID0+IGluc3RhbmNlXG4gIHJldHVybiBkZWNvcmF0ZWQobWluaW1hbERpLCAuLi5pbnN0YW50aWF0aW9uUGFyYW1ldGVycyk7XG59O1xuXG5jb25zdCBlbnN1cmVJbnN0YW5jZU1hcCA9IChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGtleSkgPT4ge1xuICBsZXQgaW5zdGFuY2VNYXAgPSBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuZ2V0KGtleSk7XG5cbiAgaWYgKCFpbnN0YW5jZU1hcCkge1xuICAgIGluc3RhbmNlTWFwID0gbmV3IENvbXBvc2l0ZU1hcCgpO1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5zZXQoa2V5LCBpbnN0YW5jZU1hcCk7XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2VNYXA7XG59O1xuXG5jb25zdCBnZXRJbnN0YW5jZSA9IChcbiAgZGksXG4gIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gIGdldE5hbWVzcGFjZWRJZCxcbiAgZ2V0U2NvcGVkSWQsXG4gIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4pID0+IHtcbiAgY29uc3QgY2FjaGVLZXkgPVxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQ7XG5cbiAgY29uc3QgbGlmZWN5Y2xlSWQgPSBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuaWQ7XG5cbiAgLy8gU2luZ2xldG9uOiBmYXN0IHBhdGggaW4gcHJpdmF0ZUluamVjdEZvciBhbHJlYWR5IGNoZWNrZWQgY2FjaGUgYW5kIG1pc3NlZC5cbiAgLy8gU2tpcCByZWR1bmRhbnQgZ2V0SW5zdGFuY2VLZXkgKyBjYWNoZSBjaGVjayBcdTIwMTQgZ28gc3RyYWlnaHQgdG8gaW5zdGFudGlhdGlvbi5cbiAgaWYgKGxpZmVjeWNsZUlkID09PSAnc2luZ2xldG9uJykge1xuICAgIGlmIChpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3Qgc2luZ2xldG9uIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgICl9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpbGxlZ2FsbHkgdG8gc2luZ2xldG9ucywgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMgd2VyZSBwcm92aWRlZDogXCIke2luc3RhbnRpYXRpb25QYXJhbWV0ZXJzfVwiLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICAgIGRpLFxuICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgICAgZ2V0U2NvcGVkSWQsXG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgKTtcblxuICAgIGNvbnN0IG5ld0luc3RhbmNlID0gaW5zdGFudGlhdGUoXG4gICAgICBkaSxcbiAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgbWluaW1hbERpLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgICApO1xuXG4gICAgLy8gU2luZ2xldG9ucyBzdG9yZSB0aGUgaW5zdGFuY2UgZGlyZWN0bHkgaW4gdGhlIG1hcCBcdTIwMTQgbm8gcGVyLWluamVjdGFibGVcbiAgICAvLyBDb21wb3NpdGVNYXAgd3JhcHBlci4gU2F2ZXMgfjUgb2JqZWN0IGFsbG9jYXRpb25zIHBlciBmaXJzdC1pbmplY3QuXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLnNldChjYWNoZUtleSwgbmV3SW5zdGFuY2UpO1xuXG4gICAgcmV0dXJuIG5ld0luc3RhbmNlO1xuICB9XG5cbiAgLy8gVHJhbnNpZW50OiBuZXZlciBjYWNoZWQgXHUyMDE0IHNraXAga2V5IHJlc29sdXRpb24sIGNhY2hlIGNoZWNrLCBhbmQgY2FjaGUgc3RvcmUuXG4gIGlmIChsaWZlY3ljbGVJZCA9PT0gJ3RyYW5zaWVudCcpIHtcbiAgICBjb25zdCBtaW5pbWFsRGkgPSBjcmVhdGVNaW5pbWFsRGkoXG4gICAgICBkaSxcbiAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGdldFNjb3BlZElkLFxuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICk7XG5cbiAgICByZXR1cm4gaW5zdGFudGlhdGUoXG4gICAgICBkaSxcbiAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgbWluaW1hbERpLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgICApO1xuICB9XG5cbiAgLy8gVjItZGVmYXVsdCArIG5vLWFyZ3MgZmFzdCBwYXRoOiBiZWhhdmVzIGxpa2UgYSBzaW5nbGV0b24uIFNraXBcbiAgLy8gZ2V0SW5zdGFuY2VLZXkgKyBrZXktYXJyYXkgYWxsb2NhdGlvbiArIENvbXBvc2l0ZU1hcCBhbGxvY2F0aW9uLiBUaGVcbiAgLy8gaW5zdGFuY2UgaXMgc3RvcmVkIGRpcmVjdGx5IHVuZGVyIGNhY2hlS2V5LCBtYXRjaGluZyB0aGUgc2luZ2xldG9uXG4gIC8vIHNoYXBlLiBJZiB0aGUgc2FtZSB2MiBpbmplY3RhYmxlIGlzIGxhdGVyIGNhbGxlZCB3aXRoIGFyZ3MgKHJhcmUgbWl4ZWRcbiAgLy8gdXNhZ2UpLCB0aGUga2V5ZWRTaW5nbGV0b24gcGF0aCBiZWxvdyBtaWdyYXRlcyB0aGUgZXhpc3RpbmcgaW5zdGFuY2VcbiAgLy8gaW50byBhIENvbXBvc2l0ZU1hcCB1bmRlciBzaW5nbGV0b25Db21wb3NpdGVLZXkgYmVmb3JlIGFkZGluZyB0aGUgbmV3XG4gIC8vIGtleWVkIGVudHJ5LlxuICBpZiAoXG4gICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMubGVuZ3RoID09PSAwICYmXG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQubGlmZWN5Y2xlLl9pc1YyRGVmYXVsdExpZmVjeWNsZVxuICApIHtcbiAgICBjb25zdCBleGlzdGluZyA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoY2FjaGVLZXkpO1xuXG4gICAgaWYgKCFpc0NvbXBvc2l0ZVN0b3JhZ2UoZXhpc3RpbmcpKSB7XG4gICAgICBjb25zdCBtaW5pbWFsRGkgPSBjcmVhdGVNaW5pbWFsRGkoXG4gICAgICAgIGRpLFxuICAgICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgICAgICBnZXRTY29wZWRJZCxcbiAgICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICAgKTtcblxuICAgICAgY29uc3QgbmV3SW5zdGFuY2UgPSBpbnN0YW50aWF0ZShcbiAgICAgICAgZGksXG4gICAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICBtaW5pbWFsRGksXG4gICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICAgICAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgICAgICk7XG5cbiAgICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5zZXQoY2FjaGVLZXksIG5ld0luc3RhbmNlKTtcbiAgICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgICB9XG4gICAgLy8gZXhpc3RpbmcgaXMgYSBDb21wb3NpdGVNYXAgKG1peGVkIHVzYWdlIHBhdGgpIFx1MjAxNCBmYWxsIHRocm91Z2guXG4gIH1cblxuICAvLyBrZXllZFNpbmdsZXRvbiAvIGN1c3RvbSBsaWZlY3ljbGU6IGZ1bGwga2V5IHJlc29sdXRpb24gKyBjYWNoZSBjaGVjay5cbiAgY29uc3QgbWluaW1hbERpID0gY3JlYXRlTWluaW1hbERpKFxuICAgIGRpLFxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldFNjb3BlZElkLFxuICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgKTtcblxuICBjb25zdCBpbnN0YW5jZUtleSA9IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmxpZmVjeWNsZS5nZXRJbnN0YW5jZUtleShcbiAgICBtaW5pbWFsRGksXG4gICAgLi4uaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICk7XG5cbiAgY29uc3QgaW5zdGFuY2VDb21wb3NpdGVLZXkgPSBpc0NvbXBvc2l0ZUtleShpbnN0YW5jZUtleSlcbiAgICA/IGluc3RhbmNlS2V5LmtleXNcbiAgICA6IFtpbnN0YW5jZUtleV07XG5cbiAgbGV0IGV4aXN0aW5nTWFwID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChjYWNoZUtleSk7XG5cbiAgLy8gTWl4ZWQtdXNhZ2UgbWlncmF0aW9uOiBvbmx5IHYyLWRlZmF1bHQgaW5qZWN0YWJsZXMgY2FuIGhhdmUgYXJyaXZlZFxuICAvLyBoZXJlIHdpdGggYW4gaW5zdGFuY2UgaW4gdGhlIHNsb3QgKGZyb20gYSBwcmlvciBuby1hcmdzIGNhbGwpLiBGb3JcbiAgLy8gZXZlcnkgb3RoZXIga2V5ZWRTaW5nbGV0b24sIHRoZSBzbG90IGlzIGVpdGhlciB1bmRlZmluZWQgb3IgYVxuICAvLyBDb21wb3NpdGVNYXAsIHNvIHNraXAgdGhlIHN0cnVjdHVyYWwgY2hlY2suXG4gIGlmIChcbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuX2lzVjJEZWZhdWx0TGlmZWN5Y2xlICYmXG4gICAgZXhpc3RpbmdNYXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICFpc0NvbXBvc2l0ZVN0b3JhZ2UoZXhpc3RpbmdNYXApXG4gICkge1xuICAgIGNvbnN0IHByZXZpb3VzSW5zdGFuY2UgPSBleGlzdGluZ01hcDtcbiAgICBleGlzdGluZ01hcCA9IG5ldyBDb21wb3NpdGVNYXAoKTtcbiAgICBleGlzdGluZ01hcC5zZXQoc2luZ2xldG9uQ29tcG9zaXRlS2V5LCBwcmV2aW91c0luc3RhbmNlKTtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGNhY2hlS2V5LCBleGlzdGluZ01hcCk7XG4gIH1cblxuICBjb25zdCBleGlzdGluZ0luc3RhbmNlID0gZXhpc3RpbmdNYXA/LmdldChpbnN0YW5jZUNvbXBvc2l0ZUtleSk7XG5cbiAgaWYgKGV4aXN0aW5nSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZTtcbiAgfVxuXG4gIGNvbnN0IG5ld0luc3RhbmNlID0gaW5zdGFudGlhdGUoXG4gICAgZGksXG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgbWluaW1hbERpLFxuICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICApO1xuXG4gIGlmIChpbnN0YW5jZUNvbXBvc2l0ZUtleVswXSAhPT0gbm9uU3RvcmVkSW5zdGFuY2VLZXkpIHtcbiAgICBlbnN1cmVJbnN0YW5jZU1hcChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGNhY2hlS2V5KS5zZXQoXG4gICAgICBpbnN0YW5jZUNvbXBvc2l0ZUtleSxcbiAgICAgIG5ld0luc3RhbmNlLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbmV3SW5zdGFuY2U7XG59O1xuIiwgImltcG9ydCBmbG93IGZyb20gJy4vZmFzdEZsb3cnO1xuaW1wb3J0IHsgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4gfSBmcm9tICcuL3Rva2Vucyc7XG5cbmV4cG9ydCBjb25zdCB3aXRoSW5qZWN0aW9uRGVjb3JhdG9yc0ZvciA9XG4gICh7IGRlY29yYXRvckNhY2hlLCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyB9KSA9PlxuICB0b0JlRGVjb3JhdGVkID0+XG4gICh7IGFsaWFzLCBpbnN0YW50aWF0aW9uUGFyYW1ldGVycywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgLy8gV2hlbiBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gaXMgbnVsbCwgYSBkZWNvcmF0b3Igd2FzIHJlZ2lzdGVyZWQgb3JcbiAgICAvLyBkZXJlZ2lzdGVyZWQgXHUyMDE0IGludmFsaWRhdGUgYWxsIHBlci1hbGlhcyBjYWNoZWQgY29tcG9zaXRpb25zLlxuICAgIGlmIChkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPT09IG51bGwpIHtcbiAgICAgIGRlY29yYXRvckNhY2hlLmluamVjdGlvbiA9IHRydWU7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb25CeUFsaWFzID0gbmV3IE1hcCgpO1xuICAgIH1cblxuICAgIGxldCBkZWNvcmF0ZWQgPSBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb25CeUFsaWFzLmdldChhbGlhcyk7XG5cbiAgICBpZiAoZGVjb3JhdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbixcbiAgICAgICAgdGFyZ2V0OiBhbGlhcyxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGJvdW5kSW5qZWN0ID0gKC4uLnBhcmFtcykgPT5cbiAgICAgICAgICB0b0JlRGVjb3JhdGVkKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgZGVjb3JhdGVkID0gZmxvdyguLi5kZWNvcmF0b3JzKShib3VuZEluamVjdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvcmF0ZWQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb25CeUFsaWFzLnNldChhbGlhcywgZGVjb3JhdGVkKTtcbiAgICB9XG5cbiAgICBpZiAoZGVjb3JhdGVkID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdG9CZURlY29yYXRlZCh7XG4gICAgICAgIGFsaWFzLFxuICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWNvcmF0ZWQoLi4uaW5zdGFudGlhdGlvblBhcmFtZXRlcnMpO1xuICB9O1xuIiwgImV4cG9ydCBjb25zdCBwcml2YXRlSW5qZWN0TWFueUZvciA9XG4gICh7IGdldFJlbGF0ZWRJbmplY3RhYmxlcywgZ2V0SW5qZWN0LCBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAgfSkgPT5cbiAgKHsgd2l0aE1ldGEgfSkgPT5cbiAgKHsgYWxpYXMsIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICBjb25zdCBpbmplY3QgPSBnZXRJbmplY3QoKTtcblxuICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG4gICAgY29uc3QgbiA9IHJlbGF0ZWRJbmplY3RhYmxlcy5sZW5ndGg7XG5cbiAgICBpZiAobiA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheShuKTtcblxuICAgIC8vIFRoZSBhcmcgb2JqZWN0IGlzIHJldXNlZCBhY3Jvc3MgaXRlcmF0aW9ucyBcdTIwMTQgcHJpdmF0ZUluamVjdEZvclxuICAgIC8vIGRlc3RydWN0dXJlcyBpdCBvbiBlbnRyeSBhbmQgbmV2ZXIgcmV0YWlucyBhIHJlZmVyZW5jZSwgc28gbXV0YXRpbmdcbiAgICAvLyAuYWxpYXMgYmV0d2VlbiBjYWxscyBpcyBzYWZlLlxuICAgIGNvbnN0IGFyZyA9IHtcbiAgICAgIGFsaWFzOiB1bmRlZmluZWQsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGFsaWFzLFxuICAgIH07XG5cbiAgICBpZiAod2l0aE1ldGEpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluamVjdGFibGUgPSByZWxhdGVkSW5qZWN0YWJsZXNbaV07XG4gICAgICAgIGFyZy5hbGlhcyA9IGluamVjdGFibGU7XG4gICAgICAgIGNvbnN0IGluc3RhbmNlID0gaW5qZWN0KGFyZyk7XG4gICAgICAgIHJlc3VsdFtpXSA9IHtcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBtZXRhOiB7IGlkOiBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGFibGUpIH0sXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGFyZy5hbGlhcyA9IHJlbGF0ZWRJbmplY3RhYmxlc1tpXTtcbiAgICAgICAgcmVzdWx0W2ldID0gaW5qZWN0KGFyZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiIsICJpbXBvcnQgeyBpbmplY3Rpb25Ub2tlblN5bWJvbCB9IGZyb20gJy4vZ2V0SW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5TeW1ib2wyIH0gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4yL2dldEluamVjdGlvblRva2VuMic7XG5cbmV4cG9ydCBkZWZhdWx0IG1heWJlSW5qZWN0aW9uVG9rZW4gPT5cbiAgbWF5YmVJbmplY3Rpb25Ub2tlbj8uYWxpYXNUeXBlID09PSBpbmplY3Rpb25Ub2tlblN5bWJvbCB8fFxuICBtYXliZUluamVjdGlvblRva2VuPy5hbGlhc1R5cGUgPT09IGluamVjdGlvblRva2VuU3ltYm9sMjtcbiIsICIvLyBUaGUgaWRzIG9mIHRoZSBzY29wZXMgYW4gYWxpYXMgd2FzIHJlZ2lzdGVyZWQgdW5kZXIsIG91dGVybW9zdCBmaXJzdCBhbmRcbi8vIHRoZSBpbW1lZGlhdGUgb3duZXIgbGFzdC4gRW1wdHkgZm9yIGNvbnRhaW5lci1sZXZlbCByZWdpc3RyYXRpb25zLCBhbmQgZm9yXG4vLyBhbnl0aGluZyBuZXZlciByZWdpc3RlcmVkIChpbmplY3Rpb24gdG9rZW5zLCB0aGUgY29udGFpbmVyIHJvb3QpLlxuY29uc3QgZ2V0U2NvcGVJZHNGb3IgPSBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCA9PiBhbGlhcyA9PiB7XG4gIGNvbnN0IGlkcyA9IFtdO1xuICBsZXQgY3VycmVudCA9IGFsaWFzO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3QgY29udGV4dCA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmdldChjdXJyZW50KTtcblxuICAgIGlmICghY29udGV4dCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50ID0gY29udGV4dFtjb250ZXh0Lmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKCFwYXJlbnQgfHwgcGFyZW50LmluamVjdGFibGUuYWxpYXNUeXBlID09PSAnY29udGFpbmVyJykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWRzLnB1c2gocGFyZW50LmluamVjdGFibGUuaWQpO1xuICAgIGN1cnJlbnQgPSBwYXJlbnQuaW5qZWN0YWJsZTtcbiAgfVxuXG4gIGlkcy5yZXZlcnNlKCk7XG4gIHJldHVybiBpZHM7XG59O1xuXG4vLyBUaGUgc2NvcGUgaWRzIGZvbGxvd2VkIGJ5IHRoZSBhbGlhcydzIG93biBpZCBcdTIwMTQgdGhlIHNlZ21lbnRzIG9mIGl0c1xuLy8gbmFtZXNwYWNlZCBpZCwgd2hpY2ggaXMgdGhlc2Ugam9pbmVkLiBXYWxrcyB0aGUgcmVnaXN0cmF0aW9uIHRyZWUgb24gZXZlcnlcbi8vIGNhbGwsIHNvIGNhbGxlcnMgd2FudGluZyBpdCBjaGVhcCBzaG91bGQgY2FjaGU7IHRoZSBhcnJheSBpcyBmcmVzaCBwZXIgY2FsbFxuLy8gYW5kIHRoZSBjYWxsZXIncyB0byBrZWVwLlxuZXhwb3J0IGNvbnN0IGdldFNjb3BlZElkRm9yID0gaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQgPT4ge1xuICBjb25zdCBnZXRTY29wZUlkcyA9IGdldFNjb3BlSWRzRm9yKGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0KTtcblxuICByZXR1cm4gYWxpYXMgPT4ge1xuICAgIGNvbnN0IGlkcyA9IGdldFNjb3BlSWRzKGFsaWFzKTtcblxuICAgIGlkcy5wdXNoKGFsaWFzLmlkKTtcblxuICAgIHJldHVybiBpZHM7XG4gIH07XG59O1xuIiwgImltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0U2NvcGVkSWRGb3IgfSBmcm9tICcuL2dldFNjb3BlZElkRm9yJztcblxuLy8gVGhlIHNjb3BlZCBpZCBqb2luZWQgd2l0aCAnOicuIEFuIGluamVjdGlvbiB0b2tlbiBpcyBuZXZlciByZWdpc3RlcmVkIGFuZFxuLy8gc28gaGFzIG5vIHNjb3BlczsgaXRzIGlkIGlzIHBhcmVudGhlc2l6ZWQgdG8gdGVsbCBpdCBhcGFydCBmcm9tIGFuXG4vLyBpbmplY3RhYmxlJ3Mgd2hlcmUgaXQgc3RhbmRzIGluIGFzIHRoZSBpbmplY3RpbmcgcGFydHkuXG5leHBvcnQgY29uc3QgZ2V0TmFtZXNwYWNlZElkRm9yID0gaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQgPT4ge1xuICBjb25zdCBnZXRTY29wZWRJZCA9IGdldFNjb3BlZElkRm9yKGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0KTtcblxuICByZXR1cm4gYWxpYXMgPT5cbiAgICBpc0luamVjdGlvblRva2VuKGFsaWFzKVxuICAgICAgPyBgKCR7YWxpYXMuaWR9KWBcbiAgICAgIDogZ2V0U2NvcGVkSWQoYWxpYXMpLmpvaW4oJzonKTtcbn07XG4iLCAiZXhwb3J0IGNvbnN0IGluamVjdGFibGVCdW5jaFN5bWJvbCA9ICdpbmplY3RhYmxlLWJ1bmNoJztcblxuZXhwb3J0IGRlZmF1bHQgYnVuY2ggPT5cbiAgT2JqZWN0LmFzc2lnbihidW5jaCwge1xuICAgIGFsaWFzVHlwZTogaW5qZWN0YWJsZUJ1bmNoU3ltYm9sLFxuICB9KTtcbiIsICJpbXBvcnQgeyBpbmplY3RhYmxlQnVuY2hTeW1ib2wgfSBmcm9tICcuL2dldEluamVjdGFibGVCdW5jaCc7XG5cbmV4cG9ydCBkZWZhdWx0IG1heWJlSW5qZWN0YWJsZUJ1bmNoID0+XG4gIG1heWJlSW5qZWN0YWJsZUJ1bmNoPy5hbGlhc1R5cGUgPT09IGluamVjdGFibGVCdW5jaFN5bWJvbDtcbiIsICJpbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sIH0gZnJvbSAnLi9nZXRJbmplY3RhYmxlJztcbmltcG9ydCB7IGluamVjdGFibGVTeW1ib2wyIH0gZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZTIvZ2V0SW5qZWN0YWJsZTInO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGFibGUgPT5cbiAgbWF5YmVJbmplY3RhYmxlPy5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wgfHxcbiAgbWF5YmVJbmplY3RhYmxlPy5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyO1xuIiwgImltcG9ydCBpc0luamVjdGFibGVCdW5jaCBmcm9tICcuLi9nZXRJbmplY3RhYmxlQnVuY2gvaXNJbmplY3RhYmxlQnVuY2gnO1xuaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5cbmNvbnN0IGNvbGxlY3REZWVwQnVuY2hWYWx1ZXMgPSAoYnVuY2gsIG91dCkgPT4ge1xuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGJ1bmNoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRoaW5nID0gdmFsdWVzW2ldO1xuXG4gICAgaWYgKGlzSW5qZWN0YWJsZUJ1bmNoKHRoaW5nKSkge1xuICAgICAgY29sbGVjdERlZXBCdW5jaFZhbHVlcyh0aGluZywgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGlzSW5qZWN0YWJsZSh0aGluZykpIHtcbiAgICAgIG91dC5wdXNoKHRoaW5nKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdGFibGVzID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmplY3RhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGluamVjdGFibGUgPSBpbmplY3RhYmxlc1tpXTtcblxuICAgIGlmIChpc0luamVjdGFibGVCdW5jaChpbmplY3RhYmxlKSkge1xuICAgICAgY29sbGVjdERlZXBCdW5jaFZhbHVlcyhpbmplY3RhYmxlLCByZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaChpbmplY3RhYmxlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsICIvLyBUb2tlbiBoaWVyYXJjaGllcyAoc3BlY2lmaWNUb2tlbk9mIGNoYWlucykgYXJlIGltbXV0YWJsZSBcdTIwMTQgY2FjaGUgcGVyIHRva2VuLlxuY29uc3QgdG9rZW5DaGFpbkNhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuZXhwb3J0IGNvbnN0IGdldFJlbGF0ZWRUb2tlbnMgPSB0b2tlbiA9PiB7XG4gIGlmICh0b2tlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGVtcHR5QXJyYXk7XG4gIH1cblxuICBsZXQgY2FjaGVkID0gdG9rZW5DaGFpbkNhY2hlLmdldCh0b2tlbik7XG5cbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cblxuICBjb25zdCB0b2tlbnMgPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSB0b2tlbjtcblxuICB3aGlsZSAoY3VycmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdG9rZW5zLnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQuc3BlY2lmaWNUb2tlbk9mO1xuICB9XG5cbiAgdG9rZW5DaGFpbkNhY2hlLnNldCh0b2tlbiwgdG9rZW5zKTtcblxuICByZXR1cm4gdG9rZW5zO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVsYXRlZFRvVG9rZW4gPSAodG9rZW4sIGFuY2VzdG9yKSA9PiB7XG4gIGxldCBjdXJyZW50ID0gdG9rZW47XG5cbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gYW5jZXN0b3IpIHJldHVybiB0cnVlO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LnNwZWNpZmljVG9rZW5PZjtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IGVtcHR5QXJyYXkgPSBbXTtcbiIsICJpbXBvcnQgaXNJbmplY3RhYmxlIGZyb20gJy4uL2dldEluamVjdGFibGUvaXNJbmplY3RhYmxlJztcblxuLy8gQ2FjaGVkIGFycmF5IHBlciB0b2tlbiBcdTIwMTQgYXZvaWRzIHNwcmVhZGluZyBTZXQgdG8gQXJyYXkgb24gZXZlcnkgaW5qZWN0KCkgY2FsbC5cbi8vIEludmFsaWRhdGVkIGJ5IHNldHRpbmcgdG8gbnVsbCB3aGVuIHRoZSBTZXQgaXMgbXV0YXRlZCAocmVnaXN0ZXIvZGVyZWdpc3RlcikuXG5jb25zdCBhcnJheUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuY29uc3QgRU1QVFkgPSBPYmplY3QuZnJlZXplKFtdKTtcblxuY29uc3QgZ2V0Q2FjaGVkQXJyYXkgPSBzZXQgPT4ge1xuICBsZXQgYXJyID0gYXJyYXlDYWNoZS5nZXQoc2V0KTtcblxuICBpZiAoIWFycikge1xuICAgIGFyciA9IFsuLi5zZXRdO1xuICAgIGFycmF5Q2FjaGUuc2V0KHNldCwgYXJyKTtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59O1xuXG5leHBvcnQgY29uc3QgaW52YWxpZGF0ZVJlbGF0ZWRJbmplY3RhYmxlc0NhY2hlID0gc2V0ID0+IHtcbiAgYXJyYXlDYWNoZS5kZWxldGUoc2V0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3IgPVxuICAoeyBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sIGluamVjdGFibGVTZXQgfSkgPT5cbiAgYWxpYXMgPT4ge1xuICAgIGlmIChpc0luamVjdGFibGUoYWxpYXMpKSB7XG4gICAgICByZXR1cm4gaW5qZWN0YWJsZVNldC5oYXMoYWxpYXMpID8gW2FsaWFzXSA6IEVNUFRZO1xuICAgIH1cblxuICAgIGNvbnN0IHNldCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQoYWxpYXMpO1xuXG4gICAgaWYgKCFzZXQgfHwgc2V0LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0Q2FjaGVkQXJyYXkoc2V0KTtcbiAgfTtcbiIsICJpbXBvcnQgeyBnZXROYW1lc3BhY2VkSWRGb3IgfSBmcm9tICcuL2dldE5hbWVzcGFjZWRJZEZvcic7XG5pbXBvcnQge1xuICBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gIHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuLFxufSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgdG9GbGF0SW5qZWN0YWJsZXMgZnJvbSAnLi90b0ZsYXRJbmplY3RhYmxlcyc7XG5pbXBvcnQgeyBMcnVDb21wb3NpdGVNYXAgfSBmcm9tICcuLi9jb21wb3NpdGUtbWFwL2xydS1jb21wb3NpdGUtbWFwJztcbmltcG9ydCB7IGdldFJlbGF0ZWRUb2tlbnMsIGlzUmVsYXRlZFRvVG9rZW4gfSBmcm9tICcuL2dldFJlbGF0ZWRUb2tlbnMnO1xuaW1wb3J0IHsgaW52YWxpZGF0ZVJlbGF0ZWRJbmplY3RhYmxlc0NhY2hlIH0gZnJvbSAnLi9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3InO1xuaW1wb3J0IGZsb3cgZnJvbSAnLi9mYXN0Rmxvdyc7XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckZvciA9XG4gICh7XG4gICAgcmVnaXN0ZXJTaW5nbGUsXG4gICAgaW5qZWN0TWFueSxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgICByZXNvbHZlSW5qZWN0aW9uVG9rZW5PZixcbiAgICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICB9KSA9PlxuICAoeyBpbmplY3RhYmxlcywgY29udGV4dCwgc291cmNlIH0pID0+IHtcbiAgICBjb25zdCBmbGF0SW5qZWN0YWJsZXMgPSB0b0ZsYXRJbmplY3RhYmxlcyhpbmplY3RhYmxlcyk7XG5cbiAgICAvLyBQaGFzZSAwOiBpbnN0YW50aWF0aW9uLWRlY29yYXRvci10YWdnZWQgaW5qZWN0YWJsZXMuIFRoZXkgcmVnaXN0ZXJcbiAgICAvLyAgIGZpcnN0IHNvIHRoYXQgYW55IHNhbWUtYmF0Y2ggb3ZlcnJpZGVzIG9mIChyZWdpc3RyYXRpb24tKWRlY29yYXRvcnNcbiAgICAvLyAgIGFyZSBhbHJlYWR5IGluIHBsYWNlIGJ5IHRoZSB0aW1lIHRob3NlIGRlY29yYXRvcnMgYXJlIGluc3RhbnRpYXRlZFxuICAgIC8vICAgaW4gcGhhc2UgMi4gVGhleSBnbyB0aHJvdWdoIHRoZSByZWdpc3RyYXRpb24tZGVjb3JhdG9yIHBpcGVsaW5lIHNvXG4gICAgLy8gICBwcm9kdWN0aW9uIGNvZGUgY2FuIG9wdCB0aGVtIG91dCB2aWEgdGFnL3RhcmdldC1rZXllZCBkZWNvcmF0b3JzLlxuICAgIC8vIFBoYXNlIDE6IHJlZ2lzdHJhdGlvbi1kZWNvcmF0b3ItdGFnZ2VkIGluamVjdGFibGVzLiBUaGV5IHJlZ2lzdGVyXG4gICAgLy8gICBkaXJlY3RseSB2aWEgcmVnaXN0ZXJTaW5nbGUgKG5vIHJlY3Vyc2l2ZSBkZWNvcmF0aW9uKSB0byBhdm9pZFxuICAgIC8vICAgYm9vdHN0cmFwIGNoYW9zLlxuICAgIC8vIFBoYXNlIDI6IHJlZ3VsYXIgaW5qZWN0YWJsZXMgcmVnaXN0ZXIgdGhyb3VnaCB0aGUgZGVjb3JhdG9yIHBpcGVsaW5lLlxuICAgIGNvbnN0IHBoYXNlMEluamVjdGFibGVzID0gW107XG4gICAgY29uc3QgcmVnaXN0ZXJlZFJlZ2lzdHJhdGlvbkRlY29yYXRvckluamVjdGFibGVzID0gW107XG4gICAgY29uc3QgcGhhc2UySW5qZWN0YWJsZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmxhdEluamVjdGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbmplY3RhYmxlID0gZmxhdEluamVjdGFibGVzW2ldO1xuXG4gICAgICAvLyBSZXNvbHZlZCBiZWZvcmUgYW55dGhpbmcgcmVhZHMgdGhlIHRva2VuOiB0aGUgcGhhc2VzIGJlbG93IHNvcnQgYnkgaXQuXG4gICAgICByZXNvbHZlSW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlLCBjb250ZXh0KTtcblxuICAgICAgY29uc3QgaW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUpO1xuXG4gICAgICBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3Rpb25Ub2tlbiwgcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4pKSB7XG4gICAgICAgIHJlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUsIGNvbnRleHQpO1xuICAgICAgICByZWdpc3RlcmVkUmVnaXN0cmF0aW9uRGVjb3JhdG9ySW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3Rpb25Ub2tlbiwgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuKSkge1xuICAgICAgICBwaGFzZTBJbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGhhc2UySW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgYmF0Y2hJblByb2dyZXNzID0gdHJ1ZTtcbiAgICBjb25zdCByZWdpc3RlcmVkSW5qZWN0YWJsZXMgPSBbXTtcblxuICAgIGNvbnN0IGZpcmVDYWxsYmFja3NGb3IgPSBpbmplY3RhYmxlID0+IHtcbiAgICAgIGNvbnN0IGNhbGxiYWNrcyA9IGluamVjdE1hbnkoe1xuICAgICAgICBhbGlhczogcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IFtdLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBzb3VyY2UsXG4gICAgICB9KTtcblxuICAgICAgLy8gVGhlIHRva2VuIGFzIHJlc29sdmVkIGZvciB0aGlzIHJlZ2lzdHJhdGlvbjogYW4gYGluamVjdGlvblRva2VuYCBnaXZlblxuICAgICAgLy8gYXMgYSBmdW5jdGlvbiBpcyBvcGFxdWUgdG8gYSBjYWxsYmFjayByZWFkaW5nIHRoZSBpbmplY3RhYmxlIGFsb25lLlxuICAgICAgY29uc3QgaW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUpO1xuXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNhbGxiYWNrcy5sZW5ndGg7IGorKykge1xuICAgICAgICBjYWxsYmFja3Nbal0oaW5qZWN0YWJsZSwgaW5qZWN0aW9uVG9rZW4pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCByZWdpc3RlclRocm91Z2hQaXBlbGluZSA9IGluamVjdGFibGUgPT4ge1xuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzKHtcbiAgICAgICAgZGVjb3JhdG9yVG9rZW46IHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuLFxuICAgICAgICB0YXJnZXQ6IGluamVjdGFibGUsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVnaXN0ZXJTaW5nbGUoaW5qZWN0YWJsZSwgY29udGV4dCk7XG4gICAgICAgIHJlZ2lzdGVyZWRJbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCB3YXNSZWdpc3RlcmVkVGhpc0luamVjdGFibGUgPSBmYWxzZTtcblxuICAgICAgY29uc3QgYm91bmRSZWdpc3RlclNpbmdsZSA9IGluaiA9PiB7XG4gICAgICAgIHJlZ2lzdGVyU2luZ2xlKGluaiwgY29udGV4dCk7XG4gICAgICAgIHdhc1JlZ2lzdGVyZWRUaGlzSW5qZWN0YWJsZSA9IHRydWU7XG5cbiAgICAgICAgaWYgKCFiYXRjaEluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICBmaXJlQ2FsbGJhY2tzRm9yKGluaik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGRlY29yYXRlZFJlZ2lzdGVyID0gZmxvdyguLi5kZWNvcmF0b3JzKShib3VuZFJlZ2lzdGVyU2luZ2xlKTtcblxuICAgICAgZGVjb3JhdGVkUmVnaXN0ZXIoaW5qZWN0YWJsZSk7XG5cbiAgICAgIGlmICh3YXNSZWdpc3RlcmVkVGhpc0luamVjdGFibGUpIHtcbiAgICAgICAgcmVnaXN0ZXJlZEluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHBoYXNlMEluamVjdGFibGVzLmZvckVhY2gocmVnaXN0ZXJUaHJvdWdoUGlwZWxpbmUpO1xuICAgIHBoYXNlMkluamVjdGFibGVzLmZvckVhY2gocmVnaXN0ZXJUaHJvdWdoUGlwZWxpbmUpO1xuXG4gICAgYmF0Y2hJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgICBjb25zdCBjYWxsYmFja3MgPSBpbmplY3RNYW55KHtcbiAgICAgIGFsaWFzOiByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IFtdLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgIH0pO1xuXG4gICAgLy8gU2tpcCB0aGUgcGVyLWluamVjdGFibGUgZm9yRWFjaCBsb29wIGVudGlyZWx5IHdoZW4gbm8gcmVnaXN0cmF0aW9uXG4gICAgLy8gY2FsbGJhY2tzIGFyZSB3aXJlZCB1cCBcdTIwMTQgdGhpcyBhdm9pZHMgMzBrKyB0cml2aWFsIGZ1bmN0aW9uIGNhbGxzXG4gICAgLy8gZHVyaW5nIGEgMzBrLWluamVjdGFibGUgYm9vdHN0cmFwIHdpdGggbm8gY2FsbGJhY2tzICh0aGUgcGVyZi10ZXN0XG4gICAgLy8gY2FzZSBhbmQgdGhlIGNvbW1vbiBjYXNlKS5cbiAgICBpZiAoY2FsbGJhY2tzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZpcmVCYXRjaENhbGxiYWNrcyA9IGluamVjdGFibGUgPT4ge1xuICAgICAgY29uc3QgaW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUpO1xuXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNhbGxiYWNrcy5sZW5ndGg7IGorKykge1xuICAgICAgICBjYWxsYmFja3Nbal0oaW5qZWN0YWJsZSwgaW5qZWN0aW9uVG9rZW4pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZWdpc3RlcmVkUmVnaXN0cmF0aW9uRGVjb3JhdG9ySW5qZWN0YWJsZXMuZm9yRWFjaChmaXJlQmF0Y2hDYWxsYmFja3MpO1xuICAgIHJlZ2lzdGVyZWRJbmplY3RhYmxlcy5mb3JFYWNoKGZpcmVCYXRjaENhbGxiYWNrcyk7XG4gIH07XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlclNpbmdsZUZvciA9ICh7XG4gIGluamVjdGFibGVTZXQsXG4gIGluamVjdGFibGVJZFNldCxcbiAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG4gIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgcmVzb2x2ZUluamVjdGlvblRva2VuT2YsXG4gIGdldEluamVjdGlvblRva2VuT2YsXG59KSA9PiB7XG4gIGNvbnN0IGdldE5hbWVzcGFjZWRJZCA9IGdldE5hbWVzcGFjZWRJZEZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG5cbiAgcmV0dXJuIChpbmplY3RhYmxlLCBpbmplY3Rpb25Db250ZXh0KSA9PiB7XG4gICAgY29uc3QgaW5qZWN0YWJsZUlkID0gaW5qZWN0YWJsZS5pZDtcblxuICAgIGlmICghaW5qZWN0YWJsZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIHRvIHJlZ2lzdGVyIGluamVjdGFibGUgd2l0aG91dCBJRC4nKTtcbiAgICB9XG5cbiAgICAvLyBBIHJlZ2lzdHJhdGlvbiBkZWNvcmF0b3IgbWF5IGhhbmQgaW4gYW4gaW5qZWN0YWJsZSB0aGUgYmF0Y2ggbmV2ZXIgc2F3LFxuICAgIC8vIHNvIHRoZSB0b2tlbiBpcyByZXNvbHZlZCBoZXJlIHRvbzsgcmVzb2x2aW5nIHR3aWNlIGlzIGhhcm1sZXNzLlxuICAgIHJlc29sdmVJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUsIGluamVjdGlvbkNvbnRleHQpO1xuXG4gICAgY29uc3QgaW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUpO1xuXG4gICAgLy8gQnVpbGQgcmV2ZXJzZSBpbmRleDogZm9yIGVhY2ggcGFyZW50IGluIHRoZSBjb250ZXh0LCByZWNvcmQgdGhpcyBpbmplY3RhYmxlIGFzIGEgY2hpbGQuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmplY3Rpb25Db250ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBpbmplY3Rpb25Db250ZXh0W2ldLmluamVjdGFibGU7XG4gICAgICBsZXQgY2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50TWFwLmdldChwYXJlbnQpO1xuXG4gICAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICAgIGNoaWxkcmVuID0gbmV3IFNldCgpO1xuICAgICAgICBjaGlsZHJlbkJ5UGFyZW50TWFwLnNldChwYXJlbnQsIGNoaWxkcmVuKTtcbiAgICAgIH1cblxuICAgICAgY2hpbGRyZW4uYWRkKGluamVjdGFibGUpO1xuICAgIH1cblxuICAgIC8vIEZhc3QgcGF0aDogY29udGFpbmVyLWxldmVsIHJlZ2lzdHJhdGlvbiAodGhlIGRvbWluYW50IGNhc2UpIHlpZWxkcyBhXG4gICAgLy8gbmFtZXNwYWNlZCBpZCBlcXVhbCB0byB0aGUgYmFyZSBpZCBcdTIwMTQgc2tpcCB0aGUgTWFwIHJvdW5kdHJpcCArIHBhcmVudFxuICAgIC8vIHdhbGsgaW5zaWRlIGdldE5hbWVzcGFjZWRJZCwgYW5kIHNraXAgcmVjb3JkaW5nIHRoZSByZWdpc3RyYXRpb25cbiAgICAvLyBjb250ZXh0IGFsdG9nZXRoZXIgKGBnZXROYW1lc3BhY2VkSWRGb3JgIGFuZCBgZGVyZWdpc3RlcmAgYm90aCB0cmVhdFxuICAgIC8vIGEgbWlzc2luZyBlbnRyeSBhcyBcIm5vIG5lc3RlZCBjb250ZXh0XCIgYWxyZWFkeSkuXG4gICAgY29uc3QgaW1tZWRpYXRlUGFyZW50ID1cbiAgICAgIGluamVjdGlvbkNvbnRleHQubGVuZ3RoID4gMFxuICAgICAgICA/IGluamVjdGlvbkNvbnRleHRbaW5qZWN0aW9uQ29udGV4dC5sZW5ndGggLSAxXVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGlzQ29udGFpbmVyTGV2ZWwgPVxuICAgICAgIWltbWVkaWF0ZVBhcmVudCB8fCBpbW1lZGlhdGVQYXJlbnQuaW5qZWN0YWJsZS5hbGlhc1R5cGUgPT09ICdjb250YWluZXInO1xuXG4gICAgaWYgKCFpc0NvbnRhaW5lckxldmVsKSB7XG4gICAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5zZXQoaW5qZWN0YWJsZSwgaW5qZWN0aW9uQ29udGV4dCk7XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZXNwYWNlZElkID0gaXNDb250YWluZXJMZXZlbFxuICAgICAgPyBpbmplY3RhYmxlSWRcbiAgICAgIDogZ2V0TmFtZXNwYWNlZElkKGluamVjdGFibGUpO1xuXG4gICAgaWYgKG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5oYXMoaW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIHJlZ2lzdGVyIHNhbWUgaW5qZWN0YWJsZSBtdWx0aXBsZSB0aW1lczogXCIke25hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgKX1cImAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpbmplY3RhYmxlSWRTZXQuaGFzKG5hbWVzcGFjZWRJZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIHJlZ2lzdGVyIG11bHRpcGxlIGluamVjdGFibGVzIGZvciBJRCBcIiR7bmFtZXNwYWNlZElkfVwiYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdXBwZXJCb3VuZGVkQ2FyZGluYWxpdHkgPVxuICAgICAgaW5qZWN0aW9uVG9rZW4/LmNhcmRpbmFsaXR5ID09PSAnb25lJyB8fFxuICAgICAgaW5qZWN0aW9uVG9rZW4/LmNhcmRpbmFsaXR5ID09PSAnemVyby1vci1vbmUnXG4gICAgICAgID8gaW5qZWN0aW9uVG9rZW4uY2FyZGluYWxpdHlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAodXBwZXJCb3VuZGVkQ2FyZGluYWxpdHkpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gaW5qZWN0aW9uVG9rZW47XG4gICAgICBjb25zdCByZWdpc3RlcmVkID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldCh0b2tlbik7XG5cbiAgICAgIGlmIChyZWdpc3RlcmVkKSB7XG4gICAgICAgIGZvciAoY29uc3QgbWVtYmVyIG9mIHJlZ2lzdGVyZWQpIHtcbiAgICAgICAgICAvLyBFeGFjdCByZWdpc3RyYXRpb25zIG9ubHk6IHRoZSBpbmRleCBhbHNvIGhvbGRzIGAuZm9yKClgXG4gICAgICAgICAgLy8gZGVzY2VuZGFudHMgb2YgdGhlIHRva2VuLCBhbmQgc3BlY2lhbGl6YXRpb24gbXVzdCBub3QgYmVcbiAgICAgICAgICAvLyBvdXRsYXdlZCBieSB0aGUgYmFzZSB0b2tlbidzIGJvdW5kLlxuICAgICAgICAgIGlmIChnZXRJbmplY3Rpb25Ub2tlbk9mKG1lbWJlcikgPT09IHRva2VuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBUcmllZCB0byByZWdpc3RlciBpbmplY3RhYmxlIFwiJHtuYW1lc3BhY2VkSWR9XCIgd2l0aCBpbmplY3Rpb24gdG9rZW4gXCIke1xuICAgICAgICAgICAgICAgIHRva2VuLmlkXG4gICAgICAgICAgICAgIH1cIiwgYnV0IGl0cyBjYXJkaW5hbGl0eSBcIiR7dXBwZXJCb3VuZGVkQ2FyZGluYWxpdHl9XCIgYWxsb3dzIGF0IG1vc3Qgb25lIHJlZ2lzdHJhdGlvbiBhbmQgXCIke25hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoXG4gICAgICAgICAgICAgICAgbWVtYmVyLFxuICAgICAgICAgICAgICApfVwiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbmplY3RhYmxlSWRTZXQuYWRkKG5hbWVzcGFjZWRJZCk7XG4gICAgaW5qZWN0YWJsZVNldC5hZGQoaW5qZWN0YWJsZSk7XG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLnNldChpbmplY3RhYmxlLCBuYW1lc3BhY2VkSWQpO1xuICAgIGlmIChpbmplY3Rpb25Ub2tlbj8uYWJzdHJhY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIHJlZ2lzdGVyIGluamVjdGFibGUgXCIke25hbWVzcGFjZWRJZH1cIiB3aXRoIGluamVjdGlvbiB0b2tlbiBcIiR7aW5qZWN0aW9uVG9rZW4uaWR9XCIsIGJ1dCBpdCBpcyBhYnN0cmFjdC4gVXNlIFwiLmZvcihzcGVjaWZpZXIpXCIgZm9yIGEgY29uY3JldGUgdG9rZW4uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbWF4Q2FjaGVTaXplID0gaW5qZWN0YWJsZS5tYXhDYWNoZVNpemUgPz8gaW5qZWN0aW9uVG9rZW4/Lm1heENhY2hlU2l6ZTtcblxuICAgIC8vIExSVSBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIGtleWVkIGxpZmVjeWNsZXMgXHUyMDE0IHNpbmdsZXRvbnMgaG9sZCBvbmVcbiAgICAvLyBpbnN0YW5jZSBhbmQgd291bGQgbmV2ZXIgb3ZlcmZsb3cuIEZvciBrZXllZCBsaWZlY3ljbGVzIHdpdGggYSBzaXplXG4gICAgLy8gY2FwLCBhbGxvY2F0ZSBlYWdlcmx5IHNvIHRoZSBldmljdGlvbiBjYWxsYmFjayBpcyB3aXJlZCBiZWZvcmUgYW55XG4gICAgLy8gc3RvcmUuIEZvciBldmVyeXRoaW5nIGVsc2UsIHRoZSBtYXAgaXMgYWxsb2NhdGVkIGxhemlseSBvbiBmaXJzdFxuICAgIC8vIHN0b3JlIChzaW5nbGV0b25zIHN0b3JlIHRoZSBpbnN0YW5jZSBkaXJlY3RseTsga2V5ZWRTaW5nbGV0b24gc3RvcmVzXG4gICAgLy8gYSBDb21wb3NpdGVNYXAgXHUyMDE0IHNlZSBwcml2YXRlSW5qZWN0Rm9yLmpzKS5cbiAgICBpZiAobWF4Q2FjaGVTaXplID4gMCAmJiBpbmplY3RhYmxlLmxpZmVjeWNsZS5pZCAhPT0gJ3NpbmdsZXRvbicpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlTWFwID0gbmV3IExydUNvbXBvc2l0ZU1hcChtYXhDYWNoZVNpemUsIHtcbiAgICAgICAgb25FdmljdDogKGluc3RhbmNlLCBrZXlBcnJheSkgPT5cbiAgICAgICAgICBmaXJlUHVyZ2VDYWxsYmFja3MoaW5qZWN0YWJsZSwgaW5zdGFuY2UsIGtleUFycmF5KSxcbiAgICAgIH0pO1xuXG4gICAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGluamVjdGFibGUsIGluc3RhbmNlTWFwKTtcbiAgICB9XG5cbiAgICBjb25zdCB0b2tlbnMgPSBnZXRSZWxhdGVkVG9rZW5zKGluamVjdGlvblRva2VuKTtcblxuICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG9rZW5zLmxlbmd0aDsgdCsrKSB7XG4gICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1t0XTtcbiAgICAgIGxldCBpbmplY3RhYmxlc1NldCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQodG9rZW4pO1xuXG4gICAgICBpZiAoIWluamVjdGFibGVzU2V0KSB7XG4gICAgICAgIGluamVjdGFibGVzU2V0ID0gbmV3IFNldCgpO1xuICAgICAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uc2V0KHRva2VuLCBpbmplY3RhYmxlc1NldCk7XG4gICAgICB9XG5cbiAgICAgIGluamVjdGFibGVzU2V0LmFkZChpbmplY3RhYmxlKTtcbiAgICAgIGludmFsaWRhdGVSZWxhdGVkSW5qZWN0YWJsZXNDYWNoZShpbmplY3RhYmxlc1NldCk7XG4gICAgfVxuICB9O1xufTtcbiIsICJpbXBvcnQgeyBzdG9yZWRJbnN0YW5jZUtleSB9IGZyb20gJy4vbGlmZWN5Y2xlRW51bSc7XG5pbXBvcnQgeyBpc0NvbXBvc2l0ZVN0b3JhZ2UgfSBmcm9tICcuL3ByaXZhdGVJbmplY3RGb3InO1xuXG5jb25zdCBzaW5nbGV0b25LZXlBcnJheSA9IFtzdG9yZWRJbnN0YW5jZUtleV07XG5cbmNvbnN0IGtleUFycmF5U3RhcnRzV2l0aCA9IChrZXlBcnJheSwgcHJlZml4KSA9PiB7XG4gIGlmIChwcmVmaXgubGVuZ3RoID4ga2V5QXJyYXkubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJlZml4Lmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGtleUFycmF5W2ldICE9PSBwcmVmaXhbaV0pIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmNvbnN0IGV2aWN0ID0gKGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCwgaW5qZWN0YWJsZXNJblNjb3BlLCBrZXlQYXJ0cykgPT4ge1xuICBmb3IgKGNvbnN0IGluamVjdGFibGUgb2YgaW5qZWN0YWJsZXNJblNjb3BlKSB7XG4gICAgY29uc3Qgc3RvcmVkID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcbiAgICBpZiAoc3RvcmVkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgaWYgKCFpc0NvbXBvc2l0ZVN0b3JhZ2Uoc3RvcmVkKSkge1xuICAgICAgaWYgKFxuICAgICAgICBrZXlQYXJ0cy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAga2V5QXJyYXlTdGFydHNXaXRoKHNpbmdsZXRvbktleUFycmF5LCBrZXlQYXJ0cylcbiAgICAgICkge1xuICAgICAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuZGVsZXRlKGluamVjdGFibGUpO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGtleVBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgc3RvcmVkLmNsZWFyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0b3JlZC5kZWxldGVCeVByZWZpeChrZXlQYXJ0cyk7XG4gICAgfVxuICB9XG59O1xuXG4vLyBQdXJnZXMgdGhlIHN0b3JlZCBpbnN0YW5jZXMgb2YgYSBnaXZlbiBzZXQgb2YgaW5qZWN0YWJsZXMuIFNoYXJlZCBieSB0aGVcbi8vIGNvbnRhaW5lci13aWRlIHB1cmdlIGFuZCB0aGUgc2NvcGUtcmVzdHJpY3RlZCBvbmUsIHNvIHRoYXQgYm90aCBmaXJlXG4vLyBpbnN0YW5jZS1wdXJnZSBjYWxsYmFja3MgdGhlIHNhbWUgd2F5LlxuZXhwb3J0IGNvbnN0IHB1cmdlU3RvcmVkSW5zdGFuY2VzRm9yID1cbiAgKHtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxuICAgIGFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCxcbiAgfSkgPT5cbiAgKGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpID0+IHtcbiAgICAvLyBOb3RoaW5nIGNhbiBvYnNlcnZlIHRoaXMgcHVyZ2UsIHNvIHNraXAgZ2F0aGVyaW5nIHRoZSBzbmFwc2hvdCBhbmQgZ29cbiAgICAvLyBzdHJhaWdodCB0byBldmljdGlvbiBcdTIwMTQgdGhlIHNhbWUgcnVsZSB0aGUgaW5qZWN0IHdpcmluZyBmb2xsb3dzLCB3aGVyZSBhXG4gICAgLy8gY29udGFpbmVyIHdpdGggbm8gZGVjb3JhdG9ycyBwYXlzIGZvciBub25lLlxuICAgIGlmICghYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkKCkpIHtcbiAgICAgIGV2aWN0KGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCwgaW5qZWN0YWJsZXNJblNjb3BlLCBrZXlQYXJ0cyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUGhhc2UgMSBcdTIwMTQgR2F0aGVyIHNuYXBzaG90IHR1cGxlcyB3aXRob3V0IG11dGF0aW5nIGNhY2hlcy4gVGhlIHN0b3JlZFxuICAgIC8vIHZhbHVlIGlzIGRpc3BhdGNoZWQgc3RydWN0dXJhbGx5OiBhIENvbXBvc2l0ZU1hcC1zaGFwZSBzdG9yZXMga2V5ZWRcbiAgICAvLyBlbnRyaWVzOyBhbnl0aGluZyBlbHNlIGlzIGEgZGlyZWN0bHktc3RvcmVkIGluc3RhbmNlIChzaW5nbGV0b24gb3JcbiAgICAvLyB2Mi1kZWZhdWx0LW5vLWFyZ3MpLlxuICAgIGNvbnN0IHR1cGxlcyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBpbmplY3RhYmxlIG9mIGluamVjdGFibGVzSW5TY29wZSkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcbiAgICAgIGlmIChzdG9yZWQgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG5cbiAgICAgIGlmICghaXNDb21wb3NpdGVTdG9yYWdlKHN0b3JlZCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGtleVBhcnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAha2V5QXJyYXlTdGFydHNXaXRoKHNpbmdsZXRvbktleUFycmF5LCBrZXlQYXJ0cylcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdHVwbGVzLnB1c2goe1xuICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICAgaW5zdGFuY2U6IHN0b3JlZCxcbiAgICAgICAgICBrZXlBcnJheTogc2luZ2xldG9uS2V5QXJyYXksXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBba2V5QXJyYXksIGluc3RhbmNlXSBvZiBzdG9yZWQuZW50cmllcygpKSB7XG4gICAgICAgIGlmIChrZXlQYXJ0cy5sZW5ndGggPiAwICYmICFrZXlBcnJheVN0YXJ0c1dpdGgoa2V5QXJyYXksIGtleVBhcnRzKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHR1cGxlcy5wdXNoKHsgaW5qZWN0YWJsZSwgaW5zdGFuY2UsIGtleUFycmF5IH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBoYXNlIDIgXHUyMDE0IEZpcmUgY2FsbGJhY2tzLiBDYWNoZXMgc3RheSBwb3B1bGF0ZWQgc28gcGVlci1jb29yZGluYXRpb25cbiAgICAvLyBpbnNpZGUgYSBjYWxsYmFjayB3b3JrcyAoYGRpLmluamVjdChwZWVyKWAgcmV0dXJucyB0aGUgY2FjaGVkIGluc3RhbmNlKS5cbiAgICBmb3IgKGNvbnN0IHsgaW5qZWN0YWJsZSwgaW5zdGFuY2UsIGtleUFycmF5IH0gb2YgdHVwbGVzKSB7XG4gICAgICBmaXJlUHVyZ2VDYWxsYmFja3MoaW5qZWN0YWJsZSwgaW5zdGFuY2UsIGtleUFycmF5KTtcbiAgICB9XG5cbiAgICAvLyBQaGFzZSAzIFx1MjAxNCBFdmljdC4gU3dlZXBzIGJvdGggdGhlIG9yaWdpbmFsIHNuYXBzaG90IGVudHJpZXMgYW5kIGFueXRoaW5nXG4gICAgLy8gcmUtcG9wdWxhdGVkIGJ5IHBoYXNlIDIgY2FsbGJhY2tzLiBDYWxsYmFja3MgZG8gTk9UIHJlLWZpcmUgaGVyZS5cbiAgICBldmljdChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpO1xuICB9O1xuXG5leHBvcnQgY29uc3QgcHVyZ2VJbnN0YW5jZXNGb3IgPSAoe1xuICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxuICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG59KSA9PiB7XG4gIGNvbnN0IHB1cmdlU3RvcmVkSW5zdGFuY2VzID0gcHVyZ2VTdG9yZWRJbnN0YW5jZXNGb3Ioe1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gICAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxuICB9KTtcblxuICByZXR1cm4gKGFsaWFzLCAuLi5rZXlQYXJ0cykgPT5cbiAgICBwdXJnZVN0b3JlZEluc3RhbmNlcyhcbiAgICAgIGFsaWFzID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBbLi4uaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmtleXMoKV1cbiAgICAgICAgOiBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpLFxuICAgICAga2V5UGFydHMsXG4gICAgKTtcbn07XG4iLCAiaW1wb3J0IHtcbiAgZGVyZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICBkZXJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuLFxuICBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbixcbiAgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbn0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHRvRmxhdEluamVjdGFibGVzIGZyb20gJy4vdG9GbGF0SW5qZWN0YWJsZXMnO1xuaW1wb3J0IGlzSW5qZWN0aW9uVG9rZW4gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vaXNJbmplY3Rpb25Ub2tlbic7XG5pbXBvcnQgeyBnZXRSZWxhdGVkVG9rZW5zLCBpc1JlbGF0ZWRUb1Rva2VuIH0gZnJvbSAnLi9nZXRSZWxhdGVkVG9rZW5zJztcbmltcG9ydCB7IGludmFsaWRhdGVSZWxhdGVkSW5qZWN0YWJsZXNDYWNoZSB9IGZyb20gJy4vZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yJztcbmltcG9ydCBmbG93IGZyb20gJy4vZmFzdEZsb3cnO1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RlckZvciA9XG4gICh7XG4gICAgaW5qZWN0TWFueSxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgcHVyZ2VJbnN0YW5jZXMsXG4gICAgaW5qZWN0YWJsZUlkU2V0LFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBjaGlsZHJlbkJ5UGFyZW50TWFwLFxuICAgIC8vIFRvZG86IGdldCByaWQgb2YgZnVuY3Rpb24gdXNhZ2UuXG4gICAgZ2V0RGksXG4gICAgZGVjb3JhdG9yQ2FjaGUsXG4gICAgc3luY0luamVjdFdpcmluZyxcbiAgICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICAgIGZvcmdldEluamVjdGlvblRva2VuT2YsXG4gIH0pID0+XG4gICh7IGluamVjdGFibGVzLCBjb250ZXh0LCBzb3VyY2UgfSkgPT4ge1xuICAgIC8vIENvbGxlY3QgY2FsbGJhY2tzIGZpcnN0ICh3aGlsZSBhbGwgaW5qZWN0YWJsZXMgYXJlIHN0aWxsIHJlZ2lzdGVyZWQpXG4gICAgY29uc3QgY2FsbGJhY2tzID0gaW5qZWN0TWFueSh7XG4gICAgICBhbGlhczogZGVyZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IFtdLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZmxhdEluamVjdGFibGVzID0gdG9GbGF0SW5qZWN0YWJsZXMoaW5qZWN0YWJsZXMpO1xuXG4gICAgLy8gRmlyZSBjYWxsYmFja3MgZm9yIGFsbCBpbmplY3RhYmxlcyBiZWluZyBkZXJlZ2lzdGVyZWQgKG9yaWdpbmFsIGJhdGNoIHNlbWFudGljcyksXG4gICAgLy8gZWFjaCB3aXRoIHRoZSB0b2tlbiBpdCB3YXMgcmVnaXN0ZXJlZCB1bmRlci5cbiAgICBmbGF0SW5qZWN0YWJsZXMuZm9yRWFjaChpbmplY3RhYmxlID0+IHtcbiAgICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgICAgY2FsbGJhY2tzLmZvckVhY2goY2FsbGJhY2sgPT4ge1xuICAgICAgICBjYWxsYmFjayhpbmplY3RhYmxlLCBpbmplY3Rpb25Ub2tlbik7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRpID0gZ2V0RGkoKTtcblxuICAgIGNvbnN0IGRlcmVnaXN0ZXJTaW5nbGUgPSBkZXJlZ2lzdGVyU2luZ2xlRm9yKHtcbiAgICAgIGluamVjdGFibGVTZXQsXG4gICAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgICAgaW5qZWN0YWJsZUlkU2V0LFxuICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAgIGRpLFxuICAgICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgICAgIGZvcmdldEluamVjdGlvblRva2VuT2YsXG4gICAgfSk7XG5cbiAgICBsZXQgaW5qZWN0V2lyaW5nQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgZmxhdEluamVjdGFibGVzLmZvckVhY2goaW5qZWN0YWJsZSA9PiB7XG4gICAgICBjb25zdCBpbmplY3Rpb25Ub2tlbiA9IGdldEluamVjdGlvblRva2VuT2YoaW5qZWN0YWJsZSk7XG5cbiAgICAgIGlmIChpc1JlbGF0ZWRUb1Rva2VuKGluamVjdGlvblRva2VuLCBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbikpIHtcbiAgICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uID0gbnVsbDtcbiAgICAgICAgaW5qZWN0V2lyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1JlbGF0ZWRUb1Rva2VuKGluamVjdGlvblRva2VuLCBwcmVJbmplY3RDYWxsYmFja1Rva2VuKSkge1xuICAgICAgICBkZWNvcmF0b3JDYWNoZS5wcmVJbmplY3QgPSBudWxsO1xuICAgICAgICBpbmplY3RXaXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzKHtcbiAgICAgICAgZGVjb3JhdG9yVG9rZW46IGRlcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgICAgIHRhcmdldDogaW5qZWN0YWJsZSxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZXJlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRlZERlcmVnaXN0ZXIgPSBmbG93KC4uLmRlY29yYXRvcnMpKGRlcmVnaXN0ZXJTaW5nbGUpO1xuXG4gICAgICBkZWNvcmF0ZWREZXJlZ2lzdGVyKGluamVjdGFibGUpO1xuICAgIH0pO1xuXG4gICAgLy8gUmVjb21wdXRlZCBmcm9tIHRoZSByZWdpc3RyYXRpb24gaW5kZXggYWZ0ZXIgdGhlIHJlbW92YWxzLCBzbyBhXG4gICAgLy8gZGVyZWdpc3RyYXRpb24gZGVjb3JhdG9yIHRoYXQgcHJldmVudGVkIHRoZSByZW1vdmFsIGlzIGhhbmRsZWQgdG9vLlxuICAgIGlmIChpbmplY3RXaXJpbmdDaGFuZ2VkKSB7XG4gICAgICBzeW5jSW5qZWN0V2lyaW5nKCk7XG4gICAgfVxuICB9O1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RlclNpbmdsZUZvciA9XG4gICh7XG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICBkaSxcbiAgICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICAgIGZvcmdldEluamVjdGlvblRva2VuT2YsXG4gIH0pID0+XG4gIGluamVjdGFibGUgPT4ge1xuICAgIGlmIChpc0luamVjdGlvblRva2VuKGluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBkZXJlZ2lzdGVyIHVzaW5nIGluamVjdGlvbiB0b2tlbiBcIiR7aW5qZWN0YWJsZS5pZH1cIiwgYnV0IGRlcmVnaXN0cmF0aW9uIHVzaW5nIHRva2VuIGlzIGlsbGVnYWwuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpbmplY3RhYmxlU2V0LmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gZGVyZWdpc3RlciBub24tcmVnaXN0ZXJlZCBpbmplY3RhYmxlIFwiJHtpbmplY3RhYmxlLmlkfVwiLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENhc2NhZGUgZGVyZWdpc3RlciBjaGlsZHJlbiB1c2luZyB0aGUgcmV2ZXJzZSBpbmRleCAoTygxKSBsb29rdXApLlxuICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudE1hcC5nZXQoaW5qZWN0YWJsZSk7XG5cbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIGNoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5kZWxldGUoY2hpbGQpO1xuXG4gICAgICAgIGlmIChpbmplY3RhYmxlU2V0LmhhcyhjaGlsZCkpIHtcbiAgICAgICAgICBkaS5kZXJlZ2lzdGVyKHtcbiAgICAgICAgICAgIGluamVjdGFibGVzOiBbY2hpbGRdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY2hpbGRyZW5CeVBhcmVudE1hcC5kZWxldGUoaW5qZWN0YWJsZSk7XG4gICAgfVxuXG4gICAgcHVyZ2VJbnN0YW5jZXMoaW5qZWN0YWJsZSk7XG4gICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQuZGVsZXRlKGluamVjdGFibGUpO1xuICAgIGNvbnN0IG5hbWVzcGFjZWRJZCA9IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgaW5qZWN0YWJsZUlkU2V0LmRlbGV0ZShuYW1lc3BhY2VkSWQpO1xuICAgIGluamVjdGFibGVTZXQuZGVsZXRlKGluamVjdGFibGUpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5kZWxldGUoaW5qZWN0YWJsZSk7XG5cbiAgICBjb25zdCB0b2tlbnMgPSBnZXRSZWxhdGVkVG9rZW5zKGdldEluamVjdGlvblRva2VuT2YoaW5qZWN0YWJsZSkpO1xuXG4gICAgdG9rZW5zLmZvckVhY2godG9rZW4gPT4ge1xuICAgICAgY29uc3QgdG9rZW5TZXQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KHRva2VuKTtcbiAgICAgIHRva2VuU2V0LmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICAgIGludmFsaWRhdGVSZWxhdGVkSW5qZWN0YWJsZXNDYWNoZSh0b2tlblNldCk7XG4gICAgfSk7XG5cbiAgICAvLyBSZXNvbHZlZCBwZXIgcmVnaXN0cmF0aW9uLCBzbyBhIGxhdGVyIHJlZ2lzdHJhdGlvbiwgaW4gYW5vdGhlciBzY29wZSxcbiAgICAvLyByZXNvbHZlcyBhZnJlc2guXG4gICAgZm9yZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcy5kZWxldGUoaW5qZWN0YWJsZSk7XG4gIH07XG4iLCAiZXhwb3J0IGNvbnN0IG92ZXJyaWRlRm9yID1cbiAgKHsgZ2V0UmVsYXRlZEluamVjdGFibGVzLCBlYXJseU92ZXJyaWRlIH0pID0+XG4gIChhbGlhcywgaW5zdGFudGlhdGVTdHViKSA9PiB7XG4gICAgY29uc3QgcmVsYXRlZEluamVjdGFibGVzID0gZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKTtcblxuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoYWxpYXMuYWxpYXNUeXBlID09PSAnaW5qZWN0aW9uLXRva2VuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIHNpbmdsZSBpbXBsZW1lbnRhdGlvbiBvZiBpbmplY3Rpb24gdG9rZW4gXCIke2FsaWFzLmlkfVwiLCBidXQgZm91bmQgbm8gcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbnMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gb3ZlcnJpZGUgXCIke2FsaWFzLmlkfVwiIHdoaWNoIGlzIG5vdCByZWdpc3RlcmVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGVhcmx5T3ZlcnJpZGUoYWxpYXMsIGluc3RhbnRpYXRlU3R1Yik7XG4gIH07XG5cbmV4cG9ydCBjb25zdCB1bm92ZXJyaWRlRm9yID1cbiAgKHsgb3ZlcnJpZGluZ0luamVjdGFibGVzLCBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsIGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICBhbGlhcyA9PiB7XG4gICAgY29uc3QgW2luamVjdGFibGVdID0gZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKTtcblxuICAgIGlmICghaW5qZWN0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gdW5vdmVycmlkZSBcIiR7YWxpYXMuaWR9XCIsIGJ1dCBpdCB3YXMgbm90IHJlZ2lzdGVyZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFvdmVycmlkaW5nSW5qZWN0YWJsZXMuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byB1bm92ZXJyaWRlIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgKX1cIiwgYnV0IGl0IHdhcyBub3Qgb3ZlcnJpZGRlbi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuZGVsZXRlKGluamVjdGFibGUpO1xuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0Zvck5vTWF0Y2hlc0ZvciA9XG4gICh7IGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAocmVsYXRlZEluamVjdGFibGVzLCBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3Qgbm9uLXJlZ2lzdGVyZWQgaW5qZWN0YWJsZSBcIiR7XG4gICAgICAgICAgYWxpYXMuaWRcbiAgICAgICAgfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChpbmplY3RpbmdJbmplY3RhYmxlKX1cIi5gLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiZXhwb3J0IGNvbnN0IGNoZWNrRm9yVG9vTWFueU1hdGNoZXNGb3IgPVxuICAoeyBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKHJlbGF0ZWRJbmplY3RhYmxlcywgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGluamVjdCBzaW5nbGUgaW5qZWN0YWJsZSBmb3IgaW5qZWN0aW9uIHRva2VuIFwiJHtcbiAgICAgICAgICBhbGlhcy5pZFxuICAgICAgICB9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIgYnV0IGZvdW5kIG11bHRpcGxlIGluamVjdGFibGVzOiBcIiR7cmVsYXRlZEluamVjdGFibGVzXG4gICAgICAgICAgLm1hcChnZXROYW1lc3BhY2VkSWQpXG4gICAgICAgICAgLmpvaW4oJ1wiLCBcIicpfVwiYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0ZvclNpZGVFZmZlY3RzRm9yID1cbiAgKHsgZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQsIGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAoaW5qZWN0YWJsZSwgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChnZXRTaWRlRWZmZWN0c0FyZVByZXZlbnRlZChpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgKX1cIiBmcm9tIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgICAgKX1cIiB3aGVuIHNpZGUtZWZmZWN0cyBhcmUgcHJldmVudGVkLmAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gIChhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChhbGlhcy5hYnN0cmFjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IGluamVjdGlvbiB0b2tlbiBcIiR7YWxpYXMuaWR9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdCBpcyBhYnN0cmFjdC4gVXNlIFwiLmZvcihzcGVjaWZpZXIpXCIgZm9yIGEgY29uY3JldGUgdG9rZW4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHlGb3IgPVxuICAoeyBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKSA9PiB7XG4gICAgaWYgKGFsaWFzLmNhcmRpbmFsaXR5ICE9PSAnemVyby1vci1vbmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3RNYXliZSBcIiR7YWxpYXMuaWR9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdHMgY2FyZGluYWxpdHkgaXMgXCIke1xuICAgICAgICAgIGFsaWFzLmNhcmRpbmFsaXR5XG4gICAgICAgIH1cIiBpbnN0ZWFkIG9mIFwiemVyby1vci1vbmVcIi5gLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcblxuLy8gRGVjbGFyZWQgc2V0cyBhcmUgZGVyaXZlZCBvbmNlIHBlciBpbmplY3RhYmxlOiBhIGBjb25zdW1wdGlvbnNgIGFycmF5IGlzXG4vLyBmaXhlZCBhdCBjcmVhdGlvbiwgYW5kIGluamVjdGFibGUgaWRlbnRpdHkgb3V0bGl2ZXMgYW55IHNpbmdsZSBjb250YWluZXIuXG5jb25zdCBkZWNsYXJlZFNldHNCeUluamVjdGFibGUgPSBuZXcgV2Vha01hcCgpO1xuXG5jb25zdCBnZXREZWNsYXJlZFNldCA9IGluamVjdGFibGUgPT4ge1xuICBsZXQgZGVjbGFyZWQgPSBkZWNsYXJlZFNldHNCeUluamVjdGFibGUuZ2V0KGluamVjdGFibGUpO1xuXG4gIGlmICghZGVjbGFyZWQpIHtcbiAgICBkZWNsYXJlZCA9IG5ldyBTZXQoaW5qZWN0YWJsZS5jb25zdW1wdGlvbnMgPz8gW10pO1xuICAgIGRlY2xhcmVkU2V0c0J5SW5qZWN0YWJsZS5zZXQoaW5qZWN0YWJsZSwgZGVjbGFyZWQpO1xuICB9XG5cbiAgcmV0dXJuIGRlY2xhcmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gICh7IGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICAvLyBPbmx5IGluamVjdGFibGUyIGRlY2xhcmVzIGNvbnN1bXB0aW9ucy4gRXZlcnl0aGluZyBlbHNlIGlzIGV4ZW1wdCBieVxuICAgIC8vIHRoaXMgb25lIGNoZWNrOiB0aGUgY29udGFpbmVyIHJvb3QsIHYxIGluamVjdGFibGVzLCBhbmQgdGhlIHRva2VuIHRoYXRcbiAgICAvLyBzdGFuZHMgaW4gYXMgdGhlIGluamVjdGluZyBwYXJ0eSBmb3IgaW5qZWN0TWFueSdzIGVsZW1lbnQgaW5qZWN0cy5cbiAgICBpZiAoaW5qZWN0aW5nSW5qZWN0YWJsZS5hbGlhc1R5cGUgIT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0aW5nIGFuIGluamVjdGFibGUgYnkgcmVmZXJlbmNlIGFscmVhZHkgaW1wbGllcyBhIGRlcGVuZGVuY3kgb25cbiAgICAvLyB3aGF0ZXZlciBwYWNrYWdlIGl0IGxpdmVzIGluLCBzbyBvbmx5IHRva2VucyBhcmUgZGVjbGFyZWQuXG4gICAgaWYgKGlzSW5qZWN0YWJsZShhbGlhcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNsYXJlZCA9IGdldERlY2xhcmVkU2V0KGluamVjdGluZ0luamVjdGFibGUpO1xuXG4gICAgLy8gRGVjbGFyaW5nIGEgZ2VuZXJhbCB0b2tlbiBjb3ZlcnMgZXZlcnkgYC5mb3IoKWAgZGVyaXZhdGl2ZSBvZiBpdCwgd2hpY2hcbiAgICAvLyBpcyB3aGF0IG1ha2VzIHJ1bnRpbWUgc3BlY2lmaWVycyBkZWNsYXJhYmxlIGF0IGFsbC4gVGhlIHdhbGsgaXMgdXB3YXJkc1xuICAgIC8vIG9ubHk6IGRlY2xhcmluZyBhIHNwZWNpZmljIHRva2VuIGRvZXMgbm90IGNvdmVyIGl0cyBnZW5lcmFsIHRva2VuLlxuICAgIGxldCBjYW5kaWRhdGUgPSBhbGlhcztcblxuICAgIHdoaWxlIChjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGRlY2xhcmVkLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2FuZGlkYXRlID0gY2FuZGlkYXRlLnNwZWNpZmljVG9rZW5PZjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVHJpZWQgdG8gaW5qZWN0IFwiJHthbGlhcy5pZH1cIiBmcm9tIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICApfVwiLCBidXQgaXQgaXMgbm90IGEgZGVjbGFyZWQgY29uc3VtcHRpb24uYCxcbiAgICApO1xuICB9O1xuIiwgImltcG9ydCB7IGluamVjdGFibGVTeW1ib2wyIH0gZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZTIvZ2V0SW5qZWN0YWJsZTInO1xuXG5jb25zdCBpc1Rva2VuMiA9IGFsaWFzID0+IGFsaWFzLmFsaWFzVHlwZSA9PT0gJ2luamVjdGlvbi10b2tlbjInO1xuXG4vLyBSZWFkLW9ubHk6IHJlYWRzIHRoZSByZWdpc3RyYXRpb24gc3RhdGUgZGlyZWN0bHkgYW5kIGhvbGRzIG5vdGhpbmcgb2YgaXRzXG4vLyBvd24sIHNvIHJlZ2lzdGVyaW5nIGFmdGVyIHZhbGlkYXRpbmcgd29ya3MgYW5kIHZhbGlkYXRpbmcgYWdhaW4gcmVmbGVjdHMgaXQuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVGb3IgPVxuICAoe1xuICAgIGNvbnRhaW5lcklkLFxuICAgIGluamVjdGFibGVTZXQsXG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gIH0pID0+XG4gICgpID0+IHtcbiAgICBjb25zdCB2ZXJpZmllZElkcyA9IFtdO1xuICAgIGNvbnN0IHVudmVyaWZpZWRJZHMgPSBbXTtcbiAgICBjb25zdCB1bnZlcmlmaWFibGVDb25zdW1wdGlvbnMgPSBbXTtcbiAgICBjb25zdCB2aW9sYXRpb25zID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGluamVjdGFibGUgb2YgaW5qZWN0YWJsZVNldCkge1xuICAgICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcblxuICAgICAgLy8gT25seSBpbmplY3RhYmxlMiBkZWNsYXJlcyBjb25zdW1wdGlvbnM7IHYxIGluamVjdGFibGVzIGFyZSBiZXlvbmRcbiAgICAgIC8vIHdoYXQgdGhpcyBjYW4gY2hlY2suXG4gICAgICBpZiAoaW5qZWN0YWJsZS5hbGlhc1R5cGUgIT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgICAgIHVudmVyaWZpZWRJZHMucHVzaChuYW1lc3BhY2VkSWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmVyaWZpZWRJZHMucHVzaChuYW1lc3BhY2VkSWQpO1xuXG4gICAgICAvLyBBbiBvdmVycmlkZGVuIGluamVjdGFibGUncyBvd24gaW5zdGFudGlhdGUgbmV2ZXIgcnVucywgc28gaXRzXG4gICAgICAvLyBkZWNsYXJhdGlvbnMgc2F5IG5vdGhpbmcgYWJvdXQgd2hhdCB0aGlzIGNvbnRhaW5lciBuZWVkcy5cbiAgICAgIGlmIChvdmVycmlkaW5nSW5qZWN0YWJsZXMuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNvbnN1bXB0aW9uIG9mIGluamVjdGFibGUuY29uc3VtcHRpb25zID8/IFtdKSB7XG4gICAgICAgIGlmICghaXNUb2tlbjIoY29uc3VtcHRpb24pKSB7XG4gICAgICAgICAgLy8gQSB2MSB0b2tlbiBjYXJyaWVzIG5vIGNhcmRpbmFsaXR5LCBzbyB0aGVyZSBpcyBubyBhcml0eSB0byBjaGVjay5cbiAgICAgICAgICB1bnZlcmlmaWFibGVDb25zdW1wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBpbmplY3RhYmxlSWQ6IG5hbWVzcGFjZWRJZCxcbiAgICAgICAgICAgIGNvbnN1bXB0aW9uSWQ6IGNvbnN1bXB0aW9uLmlkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGNhcmRpbmFsaXR5IH0gPSBjb25zdW1wdGlvbjtcblxuICAgICAgICBpZiAoY2FyZGluYWxpdHkgIT09ICdvbmUnICYmIGNhcmRpbmFsaXR5ICE9PSAnb25lLW9yLW1hbnknKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgaW5kZXggaG9sZHMgZXZlcnkgcmVnaXN0cmF0aW9uIG1hZGUgYWdhaW5zdCB0aGUgdG9rZW4gb3IgYW55IG9mXG4gICAgICAgIC8vIGl0cyBgLmZvcigpYCBkZXJpdmF0aXZlcywgd2hpY2ggaXMgaG93IGEgZ2VuZXJhbC10b2tlbiBkZWNsYXJhdGlvblxuICAgICAgICAvLyBpcyBzYXRpc2ZpZWQgYnkgYW4gaW1wbGVtZW50YXRpb24gb2Ygb25lIG9mIGl0cyBzcGVjaWZpYyB0b2tlbnMuXG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGNvbnN1bXB0aW9uKTtcblxuICAgICAgICAvLyBPbmx5IHRoZSBsb3dlciBib3VuZCBpcyBjaGVja2VkIGhlcmU6IHRoZSB1cHBlciBib3VuZCBjYW5ub3QgYmVcbiAgICAgICAgLy8gZXhjZWVkZWQsIHNpbmNlIHJlZ2lzdGVyaW5nIHJlamVjdHMgdGhlIHNlY29uZCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgaWYgKHJlZ2lzdGVyZWQgPT09IHVuZGVmaW5lZCB8fCByZWdpc3RlcmVkLnNpemUgPT09IDApIHtcbiAgICAgICAgICB2aW9sYXRpb25zLnB1c2goXG4gICAgICAgICAgICBgSW5qZWN0YWJsZSBcIiR7bmFtZXNwYWNlZElkfVwiIGNvbnN1bWVzIGluamVjdGlvbiB0b2tlbiBcIiR7Y29uc3VtcHRpb24uaWR9XCIgd2l0aCBjYXJkaW5hbGl0eSBcIiR7Y2FyZGluYWxpdHl9XCIsIGJ1dCBpdCBoYXMgbm8gcmVnaXN0cmF0aW9ucy5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmlvbGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byB2YWxpZGF0ZSBjb250YWluZXIgXCIke2NvbnRhaW5lcklkfVwiLCBidXQgZm91bmQgdmlvbGF0aW9uczpcXG4ke3Zpb2xhdGlvbnNcbiAgICAgICAgICAubWFwKHZpb2xhdGlvbiA9PiBgIC0gJHt2aW9sYXRpb259YClcbiAgICAgICAgICAuam9pbignXFxuJyl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ydGVkID0gaWRzID0+IFsuLi5pZHNdLnNvcnQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJpZmllZEluamVjdGFibGVzOiB7XG4gICAgICAgIGNvdW50OiB2ZXJpZmllZElkcy5sZW5ndGgsXG4gICAgICAgIGlkczogc29ydGVkKHZlcmlmaWVkSWRzKSxcbiAgICAgIH0sXG5cbiAgICAgIHVudmVyaWZpZWRJbmplY3RhYmxlczoge1xuICAgICAgICBjb3VudDogdW52ZXJpZmllZElkcy5sZW5ndGgsXG4gICAgICAgIGlkczogc29ydGVkKHVudmVyaWZpZWRJZHMpLFxuICAgICAgfSxcblxuICAgICAgdW52ZXJpZmlhYmxlQ29uc3VtcHRpb25zLFxuICAgIH07XG4gIH07XG4iLCAiaW1wb3J0IGlzSW5qZWN0aW9uVG9rZW4gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vaXNJbmplY3Rpb25Ub2tlbic7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcbmltcG9ydCB7IGluamVjdGlvblRva2VuU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5jb25zdCB0YXJnZXRJc1YyID0gaW5qZWN0YWJsZSA9PlxuICBpbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gaW5qZWN0YWJsZVN5bWJvbDIgfHxcbiAgaW5qZWN0YWJsZS5hbGlhc1R5cGUgPT09IGluamVjdGlvblRva2VuU3ltYm9sMjtcblxuLy8gdjEtc2hhcGUgc3R1YjogKGRpLCAuLi5wYXJhbXMpID0+IGluc3RhbmNlLiBXcmFwcyBmb3IgdjIgdGFyZ2V0cy5cbmNvbnN0IGFzVjFTaGFwZSA9IChzdHViLCBpc1YyVGFyZ2V0KSA9PlxuICBpc1YyVGFyZ2V0XG4gICAgPyBkaSA9PlxuICAgICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIHN0dWIoZGksIC4uLnBhcmFtcylcbiAgICA6IHN0dWI7XG5cbi8vIHYyLXNoYXBlIHN0dWI6IChkaSkgPT4gKC4uLnBhcmFtcykgPT4gaW5zdGFuY2UuIFVud3JhcHMgZm9yIHYxIHRhcmdldHMuXG5jb25zdCBhc1YyU2hhcGUgPSAoc3R1YiwgaXNWMlRhcmdldCkgPT5cbiAgaXNWMlRhcmdldCA/IHN0dWIgOiAoZGksIC4uLnBhcmFtcykgPT4gc3R1YihkaSkoLi4ucGFyYW1zKTtcblxuY29uc3QgZWFybHlPdmVycmlkZUltcGxGb3IgPVxuICBub3JtYWxpemUgPT5cbiAgKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pID0+XG4gIChhbGlhcywgaW5zdGFudGlhdGVTdHViKSA9PiB7XG4gICAgY29uc3QgcmVsYXRlZEluamVjdGFibGVzID0gZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKTtcblxuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gb3ZlcnJpZGUgc2luZ2xlIGltcGxlbWVudGF0aW9uIG9mIGluamVjdGlvbiB0b2tlbiBcIiR7XG4gICAgICAgICAgYWxpYXMuaWRcbiAgICAgICAgfVwiLCBidXQgZm91bmQgbXVsdGlwbGUgcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbnM6IFwiJHtyZWxhdGVkSW5qZWN0YWJsZXNcbiAgICAgICAgICAubWFwKGdldE5hbWVzcGFjZWRJZClcbiAgICAgICAgICAuam9pbignXCIsIFwiJyl9XCIuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHJlbGF0ZWRJbmplY3RhYmxlcy5sZW5ndGggPT09IDAgJiYgaXNJbmplY3Rpb25Ub2tlbihhbGlhcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGVhcmx5LW92ZXJyaWRlIGFuIGluamVjdGlvbiB0b2tlbiBcIiR7YWxpYXMuaWR9XCIsIGJ1dCB0aGF0IGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsSW5qZWN0YWJsZSA9IHJlbGF0ZWRJbmplY3RhYmxlc1swXSB8fCBhbGlhcztcblxuICAgIGlmIChhbHJlYWR5SW5qZWN0ZWQuaGFzKGFsaWFzKSB8fCBhbHJlYWR5SW5qZWN0ZWQuaGFzKG9yaWdpbmFsSW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIGluamVjdGFibGUgXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBvcmlnaW5hbEluamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdCB3YXMgYWxyZWFkeSBpbmplY3RlZC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuc2V0KG9yaWdpbmFsSW5qZWN0YWJsZSwge1xuICAgICAgLi4ub3JpZ2luYWxJbmplY3RhYmxlLFxuICAgICAgb3ZlcnJpZGRlbkluamVjdGFibGU6IG9yaWdpbmFsSW5qZWN0YWJsZSxcbiAgICAgIGNhdXNlc1NpZGVFZmZlY3RzOiBmYWxzZSxcbiAgICAgIGluc3RhbnRpYXRlOiBub3JtYWxpemUoaW5zdGFudGlhdGVTdHViLCB0YXJnZXRJc1YyKG9yaWdpbmFsSW5qZWN0YWJsZSkpLFxuICAgIH0pO1xuICB9O1xuXG5leHBvcnQgY29uc3QgZWFybHlPdmVycmlkZUZvciA9IGVhcmx5T3ZlcnJpZGVJbXBsRm9yKGFzVjFTaGFwZSk7XG5leHBvcnQgY29uc3QgZWFybHlPdmVycmlkZTJGb3IgPSBlYXJseU92ZXJyaWRlSW1wbEZvcihhc1YyU2hhcGUpO1xuIiwgImltcG9ydCB7IHByZUluamVjdENhbGxiYWNrVG9rZW4gfSBmcm9tICcuL3Rva2Vucyc7XG5cbi8vIE5vbi13cmFwcGluZyBlbnRyeSBob29rOiBmaXJlcyBldmVyeSBwcmUtaW5qZWN0IGNhbGxiYWNrIGFwcGxpY2FibGUgdG8gdGhlXG4vLyBhbGlhcywgdGhlbiBjYWxscyB0aHJvdWdoLiBGaXJlcyBiZWZvcmUgYW55IHJlc29sdXRpb24gb3IgZmFpbHVyZSBjaGVjayxcbi8vIHNvIGEgY2FsbGJhY2sgY2FuIHJlZ2lzdGVyIGltcGxlbWVudGF0aW9ucyB0aGF0IHRoZSBzYW1lIG9wZXJhdGlvbiB0aGVuXG4vLyBvYnNlcnZlcy4gYGtpbmRgIGlzIGJha2VkIGluIGF0IHdyYXAgdGltZTogJ2luamVjdCcgZm9yIHRoZSBpbmplY3Rcbi8vIHZhcmlhbnRzLCAnaW5qZWN0TWFueScgZm9yIHRoZSBpbmplY3RNYW55IHZhcmlhbnRzICh3aXRoTWV0YSB2YXJpYW50c1xuLy8gcmVwb3J0IHRoZWlyIGJhc2Uga2luZCkuIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgaW5qZWN0aW5nIHBhcnR5OiB0aGVcbi8vIGluamVjdGFibGUgd2hvc2UgaW5zdGFudGlhdGUgbWFkZSB0aGUgY2FsbCwgb3IgdGhlIGNvbnRhaW5lciByb290IGZvclxuLy8gaW5qZWN0cyBtYWRlIGRpcmVjdGx5IG9uIGBkaWAuXG5leHBvcnQgY29uc3Qgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvciA9XG4gICh7IGRlY29yYXRvckNhY2hlLCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyB9KSA9PlxuICBraW5kID0+XG4gIHRvQmVDYWxsZWQgPT5cbiAgYXJncyA9PiB7XG4gICAgLy8gV2hlbiBkZWNvcmF0b3JDYWNoZS5wcmVJbmplY3QgaXMgbnVsbCwgYSBjYWxsYmFjayB3YXMgcmVnaXN0ZXJlZCBvclxuICAgIC8vIGRlcmVnaXN0ZXJlZCBcdTIwMTQgaW52YWxpZGF0ZSBhbGwgcGVyLWFsaWFzIGNhY2hlZCBjYWxsYmFjayBsaXN0cy5cbiAgICBpZiAoZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID09PSBudWxsKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5wcmVJbmplY3QgPSB0cnVlO1xuICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0QnlBbGlhcyA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBsZXQgY2FsbGJhY2tzID0gZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0QnlBbGlhcy5nZXQoYXJncy5hbGlhcyk7XG5cbiAgICBpZiAoY2FsbGJhY2tzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFwcGxpY2FibGUgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiBwcmVJbmplY3RDYWxsYmFja1Rva2VuLFxuICAgICAgICB0YXJnZXQ6IGFyZ3MuYWxpYXMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGFyZ3MuaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgIH0pO1xuXG4gICAgICBjYWxsYmFja3MgPSBhcHBsaWNhYmxlLmxlbmd0aCA+IDAgPyBhcHBsaWNhYmxlIDogbnVsbDtcblxuICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0QnlBbGlhcy5zZXQoYXJncy5hbGlhcywgY2FsbGJhY2tzKTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2tzICE9PSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgICBjYWxsYmFjayhhcmdzLmFsaWFzLCBraW5kLCBhcmdzLmluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b0JlQ2FsbGVkKGFyZ3MpO1xuICB9O1xuIiwgImltcG9ydCB7IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG5leHBvcnQgY29uc3QgZmlyZVB1cmdlQ2FsbGJhY2tzRm9yID1cbiAgKHsgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAgKGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSkgPT4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IGluc3RhbmNlIH07XG5cbiAgICBjb25zdCBjYWxsYmFja3MgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICBkZWNvcmF0b3JUb2tlbjogaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gICAgICB0YXJnZXQ6IGluamVjdGFibGUsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlLFxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBjYiBvZiBjYWxsYmFja3MpIHtcbiAgICAgIGNiKHBheWxvYWQpKC4uLmtleUFycmF5KTtcbiAgICB9XG4gIH07XG4iLCAiaW1wb3J0IHsgZ2V0UmVsYXRlZFRva2VucyB9IGZyb20gJy4vZ2V0UmVsYXRlZFRva2Vucyc7XG5cbi8vIFJldHVybnMgZXZlcnkgZGVjb3JhdG9yL2NhbGxiYWNrIGluc3RhbmNlIHRoYXQgYXBwbGllcyB0byBgdGFyZ2V0YCBmb3IgdGhlXG4vLyBnaXZlbiBgZGVjb3JhdG9yVG9rZW5gLiBUaHJlZSBsb29rdXAgZGltZW5zaW9ucyBhcmUgdW5pZmllZDpcbi8vXG4vLyAgIDEuIERpcmVjdDogICBkZWNvcmF0b3JUb2tlbi5mb3IodGFyZ2V0KS5cbi8vICAgMi4gQ2hhaW46ICAgIHdhbGsgYHNwZWNpZmljVG9rZW5PZmAgYW5jZXN0b3JzIG9mIHRoZSBjb250cmFjdCB0b2tlbiBcdTIwMTRcbi8vICAgICAgICAgICAgICAgIGB0YXJnZXQuaW5qZWN0aW9uVG9rZW5gIGZvciBpbmplY3RhYmxlIHRhcmdldHMsXG4vLyAgICAgICAgICAgICAgICBgdGFyZ2V0LnNwZWNpZmljVG9rZW5PZmAgZm9yIHRva2VuIHRhcmdldHMgXHUyMDE0IGFuZCBsb29rIHVwXG4vLyAgICAgICAgICAgICAgICBgZGVjb3JhdG9yVG9rZW4uZm9yKGFuY2VzdG9yKWAgZm9yIGVhY2guIFRoaXMgaXMgc3ltbWV0cmljXG4vLyAgICAgICAgICAgICAgICB3aXRoIHRoZSByZWdpc3RyYXRpb24tdGltZSBjaGFpbiBpbmRleGluZyBpblxuLy8gICAgICAgICAgICAgICAgYGdldFJlbGF0ZWRUb2tlbnNgOiBhIGNvbnRyaWJ1dG9yIHJlZ2lzdGVyZWQgdW5kZXJcbi8vICAgICAgICAgICAgICAgIGBzb21lVG9rZW4uZm9yKHNwZWNpZmllcilgIGlzIGFscmVhZHkgcmV0cmlldmFibGUgdmlhXG4vLyAgICAgICAgICAgICAgICBgaW5qZWN0TWFueShzb21lVG9rZW4pYCwgYW5kIGEgZGVjb3JhdG9yIHRhcmdldGluZyB0aGVcbi8vICAgICAgICAgICAgICAgIHBhcmVudCBjb250cmFjdCBzaG91bGQgZmlyZSBmb3IgdGhlIGNoaWxkIHNwZWNpYWxpemF0aW9uLlxuLy8gICAzLiBUYWdzOiAgICAgZm9yIGV2ZXJ5IHRhZyBvZiB0aGUgdGFyZ2V0IGFuZCBvZiBldmVyeSB0b2tlbiBpbiBpdHNcbi8vICAgICAgICAgICAgICAgIGNoYWluLCBsb29rIHVwIGBkZWNvcmF0b3JUb2tlbi5mb3IodGFnKWAuIFRhZ3MgYXJlIGRlZHVwZWRcbi8vICAgICAgICAgICAgICAgIGFjcm9zcyB0aGVzZSBzb3VyY2VzOiBgLmZvcigpYCBjaGlsZHJlbiBpbmhlcml0IHRoZSBnZW5lcmFsXG4vLyAgICAgICAgICAgICAgICB0b2tlbidzIHRhZ3MsIHNvIHRoZSBzYW1lIHRhZyB0eXBpY2FsbHkgb2NjdXJzIG9uIGV2ZXJ5XG4vLyAgICAgICAgICAgICAgICBjaGFpbiBsZXZlbC4gVGhpcyBtYWtlcyBhIHRhZyBvbiBhIHRva2VuIGZpcmUgZXZlcnl3aGVyZVxuLy8gICAgICAgICAgICAgICAgYC5mb3IodG9rZW4pYCB3b3VsZC5cbi8vXG4vLyBJbmplY3RhYmxlcyB3aXRob3V0IGFuIGBpbmplY3Rpb25Ub2tlbmAgc2tpcCB0aGUgY2hhaW4gZGltZW5zaW9uLlxuLy9cbi8vIEZhc3QgcGF0aDogaWYgbm8gaW5qZWN0YWJsZSBpcyByZWdpc3RlcmVkIHVuZGVyIHRoZSBhYnN0cmFjdCBgZGVjb3JhdG9yVG9rZW5gXG4vLyBpdHNlbGYsIG5vbmUgb2YgdGhlIHRocmVlIGxvb2t1cCBkaW1lbnNpb25zIGNhbiBldmVyIG1hdGNoLiBgcmVnaXN0ZXIuanNgXG4vLyBpbmRleGVzIGV2ZXJ5IHNwZWNpZmljIGRlY29yYXRvciBieSB3YWxraW5nIGBnZXRSZWxhdGVkVG9rZW5zKGluamVjdGlvblRva2VuKWAsXG4vLyB3aGljaCB0ZXJtaW5hdGVzIGF0IHRoZSBhYnN0cmFjdCB0b2tlbiBcdTIwMTQgc28gdGhlIGFic3RyYWN0IHNldCBpcyBub24tZW1wdHlcbi8vIGlmZiBhdCBsZWFzdCBvbmUgZGVjb3JhdG9yIG9mIHRoaXMgdHlwZSBpcyByZWdpc3RlcmVkIGFueXdoZXJlLlxuY29uc3QgRU1QVFkgPSBPYmplY3QuZnJlZXplKFtdKTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yID1cbiAgKHsgaW5qZWN0TWFueSwgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLCBnZXRJbmplY3Rpb25Ub2tlbk9mIH0pID0+XG4gICh7IGRlY29yYXRvclRva2VuLCB0YXJnZXQsIGluamVjdGluZ0luamVjdGFibGUgfSkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGRlY29yYXRvclRva2VuKTtcblxuICAgIGlmICghcmVnaXN0ZXJlZCB8fCByZWdpc3RlcmVkLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXQgPSBbXTtcblxuICAgIC8vIE1vc3QgZGlzcGF0Y2gga2V5cyBoYXZlIG5vIHJlZ2lzdHJhdGlvbnMgXHUyMDE0IGNoZWNraW5nIHRoZSByZWdpc3RyYXRpb25cbiAgICAvLyBpbmRleCBkaXJlY3RseSBza2lwcyB0aGUgaW5qZWN0TWFueSBtYWNoaW5lcnkgZm9yIHRoZW0uIGAuZm9yKClgIGl0c2VsZlxuICAgIC8vIGlzIGNoZWFwIG9uIHJlcGVhdCBjYWxscyAobWVtb2l6ZWQgYnkgc3BlY2lmaWVyKS5cbiAgICBjb25zdCBkaXNwYXRjaCA9IGFsaWFzID0+IHtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyZWRGb3JBbGlhcyA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQoYWxpYXMpO1xuXG4gICAgICBpZiAocmVnaXN0ZXJlZEZvckFsaWFzICYmIHJlZ2lzdGVyZWRGb3JBbGlhcy5zaXplID4gMCkge1xuICAgICAgICBvdXQucHVzaChcbiAgICAgICAgICAuLi5pbmplY3RNYW55KHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHRhcmdldCkpO1xuXG4gICAgY29uc3QgY2hhaW4gPSBnZXRSZWxhdGVkVG9rZW5zKFxuICAgICAgZ2V0SW5qZWN0aW9uVG9rZW5PZih0YXJnZXQpID8/IHRhcmdldC5zcGVjaWZpY1Rva2VuT2YsXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgdCBvZiBjaGFpbikge1xuICAgICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHQpKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRUYWdzID0gdGFyZ2V0LnRhZ3M7XG5cbiAgICBpZiAodGFyZ2V0VGFncykge1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFyZ2V0VGFncykge1xuICAgICAgICBkaXNwYXRjaChkZWNvcmF0b3JUb2tlbi5mb3IodGFnKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVkdXAgd2l0aG91dCBhbGxvY2F0aW9uczogYC5mb3IoKWAgY2hpbGRyZW4gc2hhcmUgdGhlIGdlbmVyYWwgdG9rZW4nc1xuICAgIC8vIHRhZ3MgYXJyYXksIHNvIGEgY2hhaW4gY2FycmllcyBhdCBtb3N0IG9uZSBkaXN0aW5jdCB0YWdzIGFycmF5IFx1MjAxNCBza2lwXG4gICAgLy8gcmVwZWF0cyBieSByZWZlcmVuY2UsIGFuZCBza2lwIHRhZ3MgYWxyZWFkeSBkaXNwYXRjaGVkIHZpYSB0YXJnZXQudGFnc1xuICAgIC8vIHdpdGggaW5kZXhPZiAodGhlIGFycmF5cyBhcmUgdGlueSkuXG4gICAgbGV0IHByb2Nlc3NlZENoYWluVGFncyA9IHRhcmdldFRhZ3M7XG5cbiAgICBmb3IgKGNvbnN0IHQgb2YgY2hhaW4pIHtcbiAgICAgIGNvbnN0IGNoYWluVGFncyA9IHQudGFncztcblxuICAgICAgaWYgKCFjaGFpblRhZ3MgfHwgY2hhaW5UYWdzID09PSBwcm9jZXNzZWRDaGFpblRhZ3MpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3NlZENoYWluVGFncyA9IGNoYWluVGFncztcblxuICAgICAgZm9yIChjb25zdCB0YWcgb2YgY2hhaW5UYWdzKSB7XG4gICAgICAgIGlmICh0YXJnZXRUYWdzICYmIHRhcmdldFRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHRhZykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH07XG4iLCAiaW1wb3J0IGlzSW5qZWN0aW9uVG9rZW4gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vaXNJbmplY3Rpb25Ub2tlbic7XG5pbXBvcnQgeyBnZXRTY29wZWRJZEZvciB9IGZyb20gJy4vZ2V0U2NvcGVkSWRGb3InO1xuXG4vLyBBbiBgaW5qZWN0aW9uVG9rZW5gIG1heSBiZSBnaXZlbiBhcyBhIGZ1bmN0aW9uIG9mIHRoZSBzY29wZSB0aGUgaW5qZWN0YWJsZVxuLy8gZW5kcyB1cCByZWdpc3RlcmVkIHVuZGVyLCBgKHsgc2NvcGVJZHMgfSkgPT4gc29tZVRva2VuLmZvciguLi4pYCwgZm9yXG4vLyB0b2tlbnMga2V5ZWQgYnkgc29tZXRoaW5nIG9ubHkgdGhlIHJlZ2lzdHJhdGlvbiBrbm93cy4gQSB0b2tlbiBjb21wb25lbnQgaXNcbi8vIGNhbGxhYmxlIHRvbywgc28gYSByZXNvbHZlciBpcyB0b2xkIGFwYXJ0IGJ5IG5vdCBiZWluZyBhIHRva2VuIGl0c2VsZi5cbmV4cG9ydCBjb25zdCBpc0luamVjdGlvblRva2VuUmVzb2x2ZXIgPSBtYXliZVJlc29sdmVyID0+XG4gIHR5cGVvZiBtYXliZVJlc29sdmVyID09PSAnZnVuY3Rpb24nICYmICFpc0luamVjdGlvblRva2VuKG1heWJlUmVzb2x2ZXIpO1xuXG4vLyBUaGUgcmVzb2x2ZWQgdG9rZW4gbGl2ZXMgd2l0aCB0aGUgY29udGFpbmVyLCBub3Qgb24gdGhlIGluamVjdGFibGU6IHRoZSBzYW1lXG4vLyBpbmplY3RhYmxlIG9iamVjdCByZWdpc3RlcnMgaW50byBkaWZmZXJlbnQgc2NvcGVzIGluIGRpZmZlcmVudCBjb250YWluZXJzXG4vLyAoYW5kLCBhZnRlciBkZXJlZ2lzdHJhdGlvbiwgaW4gZGlmZmVyZW50IHNjb3BlcyBvZiB0aGUgc2FtZSBvbmUpLCBhbmQgZWFjaFxuLy8gcmVnaXN0cmF0aW9uIHJlc29sdmVzIG9uIGl0cyBvd24uXG5leHBvcnQgY29uc3QgaW5qZWN0aW9uVG9rZW5SZXNvbHV0aW9uRm9yID0gKHtcbiAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG59KSA9PiB7XG4gIGNvbnN0IGdldFNjb3BlZElkID0gZ2V0U2NvcGVkSWRGb3IoaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQpO1xuICBjb25zdCByZXNvbHZlZFRva2VuQnlJbmplY3RhYmxlID0gbmV3IFdlYWtNYXAoKTtcblxuICBjb25zdCByZXNvbHZlSW5qZWN0aW9uVG9rZW5PZiA9IChpbmplY3RhYmxlLCByZWdpc3RyYXRpb25Db250ZXh0KSA9PiB7XG4gICAgY29uc3QgcmVzb2x2ZXIgPSBpbmplY3RhYmxlLmluamVjdGlvblRva2VuO1xuXG4gICAgaWYgKCFpc0luamVjdGlvblRva2VuUmVzb2x2ZXIocmVzb2x2ZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3duZXIgPSByZWdpc3RyYXRpb25Db250ZXh0W3JlZ2lzdHJhdGlvbkNvbnRleHQubGVuZ3RoIC0gMV07XG5cbiAgICAvLyBUaGUgb3duZXIncyBzY29wZWQgaWQgaXMgZXhhY3RseSB3aGF0IHRoZSBpbmplY3RhYmxlJ3Mgb3duIGBkaS5zY29wZUlkc2BcbiAgICAvLyB3aWxsIHJlYWQgYXMgb25jZSBpbnN0YW50aWF0ZWQ6IHRoZSBvd25lcidzIHNjb3BlcywgdGhlbiB0aGUgb3duZXIuXG4gICAgY29uc3Qgc2NvcGVJZHMgPVxuICAgICAgIW93bmVyIHx8IG93bmVyLmluamVjdGFibGUuYWxpYXNUeXBlID09PSAnY29udGFpbmVyJ1xuICAgICAgICA/IFtdXG4gICAgICAgIDogZ2V0U2NvcGVkSWQob3duZXIuaW5qZWN0YWJsZSk7XG5cbiAgICBjb25zdCB0b2tlbiA9IHJlc29sdmVyKHsgc2NvcGVJZHMgfSk7XG5cbiAgICBpZiAoIWlzSW5qZWN0aW9uVG9rZW4odG9rZW4pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byByZWdpc3RlciBpbmplY3RhYmxlIFwiJHtpbmplY3RhYmxlLmlkfVwiLCBidXQgaXRzIGluamVjdGlvbiB0b2tlbiByZXNvbHZlciByZXR1cm5lZCBzb21ldGhpbmcgdGhhdCBpcyBub3QgYW4gaW5qZWN0aW9uIHRva2VuLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJlc29sdmVkVG9rZW5CeUluamVjdGFibGUuc2V0KGluamVjdGFibGUsIHRva2VuKTtcbiAgfTtcblxuICBjb25zdCBnZXRJbmplY3Rpb25Ub2tlbk9mID0gYWxpYXNPckluamVjdGFibGUgPT4ge1xuICAgIGNvbnN0IHRva2VuT3JSZXNvbHZlciA9IGFsaWFzT3JJbmplY3RhYmxlLmluamVjdGlvblRva2VuO1xuXG4gICAgcmV0dXJuIGlzSW5qZWN0aW9uVG9rZW5SZXNvbHZlcih0b2tlbk9yUmVzb2x2ZXIpXG4gICAgICA/IHJlc29sdmVkVG9rZW5CeUluamVjdGFibGUuZ2V0KGFsaWFzT3JJbmplY3RhYmxlKVxuICAgICAgOiB0b2tlbk9yUmVzb2x2ZXI7XG4gIH07XG5cbiAgY29uc3QgZm9yZ2V0SW5qZWN0aW9uVG9rZW5PZiA9IGluamVjdGFibGUgPT4ge1xuICAgIHJlc29sdmVkVG9rZW5CeUluamVjdGFibGUuZGVsZXRlKGluamVjdGFibGUpO1xuICB9O1xuXG4gIHJldHVybiB7IHJlc29sdmVJbmplY3Rpb25Ub2tlbk9mLCBnZXRJbmplY3Rpb25Ub2tlbk9mLCBmb3JnZXRJbmplY3Rpb25Ub2tlbk9mIH07XG59O1xuIiwgImltcG9ydCB7IHByaXZhdGVJbmplY3RGb3IgfSBmcm9tICcuL3ByaXZhdGVJbmplY3RGb3InO1xuaW1wb3J0IHsgd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3IgfSBmcm9tICcuL3dpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yJztcbmltcG9ydCB7IHByaXZhdGVJbmplY3RNYW55Rm9yIGFzIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yIH0gZnJvbSAnLi9wcml2YXRlSW5qZWN0TWFueUZvcic7XG5pbXBvcnQgeyByZWdpc3RlckZvciwgcmVnaXN0ZXJTaW5nbGVGb3IgfSBmcm9tICcuL3JlZ2lzdGVyJztcbmltcG9ydCB7IHB1cmdlSW5zdGFuY2VzRm9yLCBwdXJnZVN0b3JlZEluc3RhbmNlc0ZvciB9IGZyb20gJy4vcHVyZ2VJbnN0YW5jZXMnO1xuaW1wb3J0IHsgZGVyZWdpc3RlckZvciB9IGZyb20gJy4vZGVyZWdpc3Rlcic7XG5pbXBvcnQgeyBvdmVycmlkZUZvciwgdW5vdmVycmlkZUZvciB9IGZyb20gJy4vb3ZlcnJpZGUnO1xuaW1wb3J0IHsgZ2V0TmFtZXNwYWNlZElkRm9yIH0gZnJvbSAnLi9nZXROYW1lc3BhY2VkSWRGb3InO1xuaW1wb3J0IHsgZ2V0U2NvcGVkSWRGb3IgfSBmcm9tICcuL2dldFNjb3BlZElkRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yTm9NYXRjaGVzRm9yIH0gZnJvbSAnLi9jaGVja0Zvck5vTWF0Y2hlc0Zvcic7XG5pbXBvcnQgeyBjaGVja0ZvclRvb01hbnlNYXRjaGVzRm9yIH0gZnJvbSAnLi9jaGVja0ZvclRvb01hbnlNYXRjaGVzJztcbmltcG9ydCB7IGNoZWNrRm9yU2lkZUVmZmVjdHNGb3IgfSBmcm9tICcuL2NoZWNrRm9yU2lkZUVmZmVjdHNGb3InO1xuaW1wb3J0IHsgY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yIH0gZnJvbSAnLi9jaGVja0ZvckFic3RyYWN0VG9rZW5Gb3InO1xuaW1wb3J0IHsgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yIH0gZnJvbSAnLi9jaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHlGb3InO1xuaW1wb3J0IHsgY2hlY2tGb3JVbmRlY2xhcmVkQ29uc3VtcHRpb25Gb3IgfSBmcm9tICcuL2NoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yJztcbmltcG9ydCB7IHZhbGlkYXRlRm9yIH0gZnJvbSAnLi92YWxpZGF0ZSc7XG5pbXBvcnQgeyBnZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3IgfSBmcm9tICcuL2dldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcic7XG5pbXBvcnQgeyBlYXJseU92ZXJyaWRlRm9yLCBlYXJseU92ZXJyaWRlMkZvciB9IGZyb20gJy4vZWFybHktb3ZlcnJpZGUnO1xuaW1wb3J0IHtcbiAgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuLFxuICBwcmVJbmplY3RDYWxsYmFja1Rva2VuLFxufSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9yIH0gZnJvbSAnLi93aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9yJztcbmltcG9ydCB7IGlzUmVsYXRlZFRvVG9rZW4gfSBmcm9tICcuL2dldFJlbGF0ZWRUb2tlbnMnO1xuaW1wb3J0IHsgZmlyZVB1cmdlQ2FsbGJhY2tzRm9yIH0gZnJvbSAnLi9maXJlUHVyZ2VDYWxsYmFja3NGb3InO1xuaW1wb3J0IHsgZ2V0QXBwbGljYWJsZURlY29yYXRvcnNGb3IgfSBmcm9tICcuL2dldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yJztcbmltcG9ydCB7IGluamVjdGlvblRva2VuUmVzb2x1dGlvbkZvciB9IGZyb20gJy4vaW5qZWN0aW9uVG9rZW5SZXNvbHV0aW9uRm9yJztcbmltcG9ydCB7IGlzQ29tcG9zaXRlU3RvcmFnZSB9IGZyb20gJy4vcHJpdmF0ZUluamVjdEZvcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNvbnRhaW5lcklkID0+IHtcbiAgY29uc3QgaW5qZWN0YWJsZVNldCA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBkZWNvcmF0b3JDYWNoZSA9IHtcbiAgICBpbmplY3Rpb246IG51bGwsXG4gICAgaW5qZWN0aW9uQnlBbGlhczogbmV3IE1hcCgpLFxuICAgIHByZUluamVjdDogbnVsbCxcbiAgICBwcmVJbmplY3RCeUFsaWFzOiBuZXcgTWFwKCksXG4gIH07XG4gIGNvbnN0IG92ZXJyaWRpbmdJbmplY3RhYmxlcyA9IG5ldyBNYXAoKTtcbiAgbGV0IHNpZGVFZmZlY3RzQXJlUHJldmVudGVkID0gdHJ1ZTtcbiAgY29uc3QgYWxyZWFkeUluamVjdGVkID0gbmV3IFNldCgpO1xuICBjb25zdCBpbmplY3RhYmxlc1dpdGhQZXJtaXR0ZWRTaWRlRWZmZWN0cyA9IG5ldyBTZXQoKTtcbiAgY29uc3QgaW5qZWN0YWJsZUlkU2V0ID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0ID0gbmV3IE1hcCgpO1xuICBjb25zdCBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbiA9IG5ldyBNYXAoKTtcbiAgY29uc3QgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwID0gbmV3IE1hcCgpO1xuICBjb25zdCBjaGlsZHJlbkJ5UGFyZW50TWFwID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0IGdldE5hbWVzcGFjZWRJZCA9IGdldE5hbWVzcGFjZWRJZEZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG4gIGNvbnN0IGdldFNjb3BlZElkID0gZ2V0U2NvcGVkSWRGb3IoaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQpO1xuXG4gIGNvbnN0IHsgcmVzb2x2ZUluamVjdGlvblRva2VuT2YsIGdldEluamVjdGlvblRva2VuT2YsIGZvcmdldEluamVjdGlvblRva2VuT2YgfSA9XG4gICAgaW5qZWN0aW9uVG9rZW5SZXNvbHV0aW9uRm9yKHsgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQgfSk7XG5cbiAgY29uc3QgZ2V0UmVsYXRlZEluamVjdGFibGVzID0gZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yKHtcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgfSk7XG5cbiAgY29uc3QgY29udGFpbmVyUm9vdENvbnRleHRJdGVtID0ge1xuICAgIGluamVjdGFibGU6IHsgaWQ6IGNvbnRhaW5lcklkLCBhbGlhc1R5cGU6ICdjb250YWluZXInIH0sXG4gIH07XG5cbiAgY29uc3Qgcm9vdEluamVjdGFibGUgPSBjb250YWluZXJSb290Q29udGV4dEl0ZW0uaW5qZWN0YWJsZTtcblxuICBjb25zdCBjaGVja0ZvckFic3RyYWN0VG9rZW4gPSBjaGVja0ZvckFic3RyYWN0VG9rZW5Gb3IoeyBnZXROYW1lc3BhY2VkSWQgfSk7XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3Ioe1xuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgICAgLy8gRWxlbWVudHMgZ28gdGhyb3VnaCB0aGUgZWxlbWVudCBzbG90LCBub3QgYHByaXZhdGVEaS5pbmplY3RgOiBlbnRyeVxuICAgICAgLy8gd3JhcHBlcnMgKG9uY2UtcGVyLW9wZXJhdGlvbiBob29rcykgbXVzdCBub3QgcmUtZmlyZSBwZXIgZWxlbWVudCxcbiAgICAgIC8vIHdoaWxlIGluamVjdGlvbiBkZWNvcmF0b3JzIHN0aWxsIGFwcGx5IHBlciBlbGVtZW50LlxuICAgICAgZ2V0SW5qZWN0OiAoKSA9PiBlbGVtZW50SW5qZWN0LFxuICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIH0pO1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55ID1cbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueUZvclVua25vd25NZXRhKHtcbiAgICAgIHdpdGhNZXRhOiBmYWxzZSxcbiAgICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhID1cbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueUZvclVua25vd25NZXRhKHtcbiAgICAgIHdpdGhNZXRhOiB0cnVlLFxuICAgIH0pO1xuXG4gIGNvbnN0IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnNGb3Ioe1xuICAgIGluamVjdE1hbnk6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55LFxuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICB9KTtcblxuICBjb25zdCBnZXRTaWRlRWZmZWN0c0FyZVByZXZlbnRlZCA9IGluamVjdGFibGUgPT5cbiAgICBzaWRlRWZmZWN0c0FyZVByZXZlbnRlZCAmJlxuICAgIGluamVjdGFibGUuY2F1c2VzU2lkZUVmZmVjdHMgJiZcbiAgICAhaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMuaGFzKGluamVjdGFibGUpO1xuXG4gIGNvbnN0IGNoZWNrRm9yU2lkZUVmZmVjdHMgPSBjaGVja0ZvclNpZGVFZmZlY3RzRm9yKHtcbiAgICBnZXRTaWRlRWZmZWN0c0FyZVByZXZlbnRlZCxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IGNoZWNrRm9yTm9NYXRjaGVzID0gY2hlY2tGb3JOb01hdGNoZXNGb3Ioe1xuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgfSk7XG5cbiAgY29uc3QgY2hlY2tGb3JUb29NYW55TWF0Y2hlcyA9IGNoZWNrRm9yVG9vTWFueU1hdGNoZXNGb3Ioe1xuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgfSk7XG5cbiAgY29uc3QgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5ID0gY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yKHtcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uID0gY2hlY2tGb3JVbmRlY2xhcmVkQ29uc3VtcHRpb25Gb3Ioe1xuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgfSk7XG5cbiAgLy8gRW5mb3JjZW1lbnQgd3JhcHMgdGhlIHNsb3RzIHJhdGhlciB0aGFuIGxpdmluZyBpbnNpZGUgdGhlIG9wZXJhdGlvblxuICAvLyBmdW5jdGlvbnMsIHNvIHRoYXQgdGhlIG1hY2hpbmVyeSBcdTIwMTQgZGVjb3JhdG9yIGFuZCBjYWxsYmFjayBkaXNwYXRjaCwgcHVyZ2VcbiAgLy8gY2FsbGJhY2tzIFx1MjAxNCBzdGF5cyBleGVtcHQ6IGl0IGhvbGRzIHRoZSByYXcgb3BlcmF0aW9ucyBjYXB0dXJlZCBhdFxuICAvLyBjb25zdHJ1Y3Rpb24gYW5kIG5ldmVyIHJlYWRzIHRoZXNlIHNsb3RzLlxuICBjb25zdCB3aXRoQ29uc3VtcHRpb25FbmZvcmNlbWVudCA9IHRvQmVDYWxsZWQgPT4gYXJncyA9PiB7XG4gICAgY2hlY2tGb3JVbmRlY2xhcmVkQ29uc3VtcHRpb24oYXJncyk7XG5cbiAgICByZXR1cm4gdG9CZUNhbGxlZChhcmdzKTtcbiAgfTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0VW5rbm93bk1ldGEgPSBwcml2YXRlSW5qZWN0Rm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBhbHJlYWR5SW5qZWN0ZWQsXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBnZXREaTogKCkgPT4gcHJpdmF0ZURpLFxuICAgIGNoZWNrRm9yTm9NYXRjaGVzLFxuICAgIGNoZWNrRm9yVG9vTWFueU1hdGNoZXMsXG4gICAgY2hlY2tGb3JTaWRlRWZmZWN0cyxcbiAgICBjaGVja0ZvckFic3RyYWN0VG9rZW4sXG4gICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gICAgZ2V0U2NvcGVkSWQsXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gIH0pO1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3QgPSBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0VW5rbm93bk1ldGEoe1xuICAgIHdpdGhNZXRhOiBmYWxzZSxcbiAgfSk7XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdFdpdGhNZXRhID1cbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0VW5rbm93bk1ldGEoe1xuICAgICAgd2l0aE1ldGE6IHRydWUsXG4gICAgfSk7XG5cbiAgY29uc3Qgd2l0aEluamVjdGlvbkRlY29yYXRvcnMgPSB3aXRoSW5qZWN0aW9uRGVjb3JhdG9yc0Zvcih7XG4gICAgZGVjb3JhdG9yQ2FjaGUsXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gIH0pO1xuXG4gIC8vIEluamVjdGlvbiBkZWNvcmF0b3JzIGFwcGx5IG9ubHkgb24gdGhlIHBlci1pbmplY3RhYmxlIGluamVjdCBwYXRoLlxuICAvLyBpbmplY3RNYW55IHJlc29sdmVzIHJlbGF0ZWQgaW5qZWN0YWJsZXMgYW5kIGNhbGxzIHRoZSAoZGVjb3JhdGVkKSBpbmplY3RcbiAgLy8gb24gZWFjaCwgc28gZGVjb3JhdG9ycyBzdGlsbCBmaXJlIHBlciBlbGVtZW50IFx1MjAxNCBidXQgdGhlIHRva2VuLWxldmVsXG4gIC8vIGluamVjdE1hbnkgaXMgbmV2ZXIgd3JhcHBlZC5cbiAgY29uc3QgZGVjb3JhdGVkUHJpdmF0ZUluamVjdCA9IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzKFxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3QsXG4gICk7XG5cbiAgY29uc3QgZGVjb3JhdGVkUHJpdmF0ZUluamVjdFdpdGhNZXRhID0gd2l0aEluamVjdGlvbkRlY29yYXRvcnMoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdFdpdGhNZXRhLFxuICApO1xuXG4gIGNvbnN0IHdpdGhQcmVJbmplY3RDYWxsYmFja3MgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9yKHtcbiAgICBkZWNvcmF0b3JDYWNoZSxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSk7XG5cbiAgY29uc3Qgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdCA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3MoJ2luamVjdCcpO1xuXG4gIGNvbnN0IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3RNYW55ID1cbiAgICB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzKCdpbmplY3RNYW55Jyk7XG5cbiAgY29uc3QgcHJlSW5qZWN0Tm9uRGVjb3JhdGVkSW5qZWN0ID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdChcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICApO1xuXG4gIGNvbnN0IHByZUluamVjdERlY29yYXRlZEluamVjdCA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3QoXG4gICAgZGVjb3JhdGVkUHJpdmF0ZUluamVjdCxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3ROb25EZWNvcmF0ZWRJbmplY3RXaXRoTWV0YSA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3QoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdFdpdGhNZXRhLFxuICApO1xuXG4gIGNvbnN0IHByZUluamVjdERlY29yYXRlZEluamVjdFdpdGhNZXRhID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdChcbiAgICBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0SW5qZWN0TWFueSA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3RNYW55KFxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55LFxuICApO1xuXG4gIGNvbnN0IHByZUluamVjdEluamVjdE1hbnlXaXRoTWV0YSA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3RNYW55KFxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55V2l0aE1ldGEsXG4gICk7XG5cbiAgLy8gVGhlIGluamVjdCB1c2VkIGZvciBpbmplY3RNYW55IGVsZW1lbnRzOiBkZWNvcmF0ZWQgcGVyIGVsZW1lbnQgd2hlblxuICAvLyBpbmplY3Rpb24gZGVjb3JhdG9ycyBleGlzdCwgYnV0IG5ldmVyIHdyYXBwZWQgYnkgZW50cnktbGV2ZWwgaG9va3NcbiAgLy8gKHByZS1pbmplY3QgY2FsbGJhY2tzIGZpcmUgb25jZSBwZXIgb3BlcmF0aW9uLCBub3QgcGVyIGVsZW1lbnQpLlxuICBsZXQgZWxlbWVudEluamVjdCA9IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3Q7XG5cbiAgLy8gV2lyZXMgdGhlIGRlY29yYXRlZCBhbmQgcHJlLWluamVjdC1ob29rZWQgdmFyaWFudHMgaW4gb25seSB3aGlsZSBhdFxuICAvLyBsZWFzdCBvbmUgbWF0Y2hpbmcgY29udHJpYnV0b3IgaXMgcmVnaXN0ZXJlZCwgc28gdGhlIGNvbW1vbiBiYXJlIGNhc2VcbiAgLy8gcGF5cyBubyB3cmFwcGVyIGZyYW1lIGF0IGFsbC4gRXZlcnkgcmVhZGVyIG9mIHRoZSBwcml2YXRlRGkgc2xvdHMgKGFuZFxuICAvLyBgZWxlbWVudEluamVjdGAsIHZpYSB0aGUgZ2V0SW5qZWN0IHRodW5rKSByZWFkcyB0aGVtIGF0IGNhbGwgdGltZS5cbiAgY29uc3Qgc3luY0luamVjdFdpcmluZyA9ICgpID0+IHtcbiAgICBjb25zdCByZWdpc3RlcmVkRGVjb3JhdG9ycyA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQoXG4gICAgICBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbixcbiAgICApO1xuXG4gICAgY29uc3QgZGVjb3JhdG9yc0FjdGl2ZSA9XG4gICAgICByZWdpc3RlcmVkRGVjb3JhdG9ycyAhPT0gdW5kZWZpbmVkICYmIHJlZ2lzdGVyZWREZWNvcmF0b3JzLnNpemUgPiAwO1xuXG4gICAgY29uc3QgcmVnaXN0ZXJlZFByZUluamVjdENhbGxiYWNrcyA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQoXG4gICAgICBwcmVJbmplY3RDYWxsYmFja1Rva2VuLFxuICAgICk7XG5cbiAgICBjb25zdCBwcmVJbmplY3RBY3RpdmUgPVxuICAgICAgcmVnaXN0ZXJlZFByZUluamVjdENhbGxiYWNrcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICByZWdpc3RlcmVkUHJlSW5qZWN0Q2FsbGJhY2tzLnNpemUgPiAwO1xuXG4gICAgZWxlbWVudEluamVjdCA9IGRlY29yYXRvcnNBY3RpdmVcbiAgICAgID8gZGVjb3JhdGVkUHJpdmF0ZUluamVjdFxuICAgICAgOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0O1xuXG4gICAgcHJpdmF0ZURpLmluamVjdCA9IHByZUluamVjdEFjdGl2ZVxuICAgICAgPyBkZWNvcmF0b3JzQWN0aXZlXG4gICAgICAgID8gcHJlSW5qZWN0RGVjb3JhdGVkSW5qZWN0XG4gICAgICAgIDogcHJlSW5qZWN0Tm9uRGVjb3JhdGVkSW5qZWN0XG4gICAgICA6IGVsZW1lbnRJbmplY3Q7XG5cbiAgICBwcml2YXRlRGkuaW5qZWN0V2l0aE1ldGEgPSBwcmVJbmplY3RBY3RpdmVcbiAgICAgID8gZGVjb3JhdG9yc0FjdGl2ZVxuICAgICAgICA/IHByZUluamVjdERlY29yYXRlZEluamVjdFdpdGhNZXRhXG4gICAgICAgIDogcHJlSW5qZWN0Tm9uRGVjb3JhdGVkSW5qZWN0V2l0aE1ldGFcbiAgICAgIDogZGVjb3JhdG9yc0FjdGl2ZVxuICAgICAgPyBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGFcbiAgICAgIDogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdFdpdGhNZXRhO1xuXG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnkgPSBwcmVJbmplY3RBY3RpdmVcbiAgICAgID8gcHJlSW5qZWN0SW5qZWN0TWFueVxuICAgICAgOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueTtcblxuICAgIHByaXZhdGVEaS5pbmplY3RNYW55V2l0aE1ldGEgPSBwcmVJbmplY3RBY3RpdmVcbiAgICAgID8gcHJlSW5qZWN0SW5qZWN0TWFueVdpdGhNZXRhXG4gICAgICA6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55V2l0aE1ldGE7XG5cbiAgICAvLyBgZWxlbWVudEluamVjdGAgaXMgZGVsaWJlcmF0ZWx5IGxlZnQgdW53cmFwcGVkOiBlbmZvcmNlbWVudCBpcyBwZXJcbiAgICAvLyBpbmplY3Qgb3BlcmF0aW9uLCBhbmQgYW4gaW5qZWN0TWFueSdzIGVsZW1lbnRzIHdlcmUgYWxyZWFkeSBjb3ZlcmVkIGJ5XG4gICAgLy8gdGhlIGNoZWNrIG9uIHRoZSBvcGVyYXRpb24gaXRzZWxmLlxuICAgIHByaXZhdGVEaS5pbmplY3QgPSB3aXRoQ29uc3VtcHRpb25FbmZvcmNlbWVudChwcml2YXRlRGkuaW5qZWN0KTtcbiAgICBwcml2YXRlRGkuaW5qZWN0V2l0aE1ldGEgPSB3aXRoQ29uc3VtcHRpb25FbmZvcmNlbWVudChcbiAgICAgIHByaXZhdGVEaS5pbmplY3RXaXRoTWV0YSxcbiAgICApO1xuICAgIHByaXZhdGVEaS5pbmplY3RNYW55ID0gd2l0aENvbnN1bXB0aW9uRW5mb3JjZW1lbnQocHJpdmF0ZURpLmluamVjdE1hbnkpO1xuICAgIHByaXZhdGVEaS5pbmplY3RNYW55V2l0aE1ldGEgPSB3aXRoQ29uc3VtcHRpb25FbmZvcmNlbWVudChcbiAgICAgIHByaXZhdGVEaS5pbmplY3RNYW55V2l0aE1ldGEsXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBmaXJlUHVyZ2VDYWxsYmFja3MgPSBmaXJlUHVyZ2VDYWxsYmFja3NGb3Ioe1xuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICBjb25zdCByYXdSZWdpc3RlclNpbmdsZSA9IHJlZ2lzdGVyU2luZ2xlRm9yKHtcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBjaGlsZHJlbkJ5UGFyZW50TWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICByZXNvbHZlSW5qZWN0aW9uVG9rZW5PZixcbiAgICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICB9KTtcblxuICBjb25zdCByZWdpc3RlclNpbmdsZSA9IChpbmplY3RhYmxlLCBjb250ZXh0KSA9PiB7XG4gICAgcmF3UmVnaXN0ZXJTaW5nbGUoaW5qZWN0YWJsZSwgY29udGV4dCk7XG5cbiAgICBjb25zdCBpbmplY3Rpb25Ub2tlbiA9IGdldEluamVjdGlvblRva2VuT2YoaW5qZWN0YWJsZSk7XG5cbiAgICBsZXQgd2lyaW5nQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0aW9uVG9rZW4sIGluamVjdGlvbkRlY29yYXRvclRva2VuKSkge1xuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uID0gbnVsbDtcbiAgICAgIHdpcmluZ0NoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc1JlbGF0ZWRUb1Rva2VuKGluamVjdGlvblRva2VuLCBwcmVJbmplY3RDYWxsYmFja1Rva2VuKSkge1xuICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID0gbnVsbDtcbiAgICAgIHdpcmluZ0NoYW5nZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmICh3aXJpbmdDaGFuZ2VkKSB7XG4gICAgICBzeW5jSW5qZWN0V2lyaW5nKCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIENhbGxiYWNrcyByZWdpc3RlcmVkIGFnYWluc3QgYSBzcGVjaWZpYyB0YXJnZXQgYWxzbyBsYW5kIHVuZGVyIHRoZVxuICAvLyBhYnN0cmFjdCB0b2tlbiwgc28gYW4gZW1wdHkgc2V0IGhlcmUgbWVhbnMgbm8gcHVyZ2UgY2FsbGJhY2sgY2FuIGFwcGx5LlxuICBjb25zdCBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQgPSAoKSA9PiB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQoXG4gICAgICBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbixcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlZ2lzdGVyZWQgIT09IHVuZGVmaW5lZCAmJiByZWdpc3RlcmVkLnNpemUgPiAwO1xuICB9O1xuXG4gIGNvbnN0IHB1cmdlSW5zdGFuY2VzID0gcHVyZ2VJbnN0YW5jZXNGb3Ioe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxuICAgIGFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCxcbiAgfSk7XG5cbiAgY29uc3QgcHVyZ2VTdG9yZWRJbnN0YW5jZXMgPSBwdXJnZVN0b3JlZEluc3RhbmNlc0Zvcih7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pO1xuXG4gIGNvbnN0IGRlcmVnaXN0ZXIgPSBkZXJlZ2lzdGVyRm9yKHtcbiAgICBpbmplY3RNYW55OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgcHVyZ2VJbnN0YW5jZXMsXG4gICAgaW5qZWN0YWJsZUlkU2V0LFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBjaGlsZHJlbkJ5UGFyZW50TWFwLFxuICAgIC8vIFRvZG86IGdldCByaWQgb2YgZnVuY3Rpb24gdXNhZ2UuXG4gICAgZ2V0RGk6ICgpID0+IHByaXZhdGVEaSxcbiAgICBkZWNvcmF0b3JDYWNoZSxcbiAgICBzeW5jSW5qZWN0V2lyaW5nLFxuICAgIGdldEluamVjdGlvblRva2VuT2YsXG4gICAgZm9yZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgfSk7XG5cbiAgY29uc3QgcHJpdmF0ZVJlZ2lzdGVyID0gcmVnaXN0ZXJGb3Ioe1xuICAgIHJlZ2lzdGVyU2luZ2xlLFxuICAgIGluamVjdE1hbnk6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55LFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICAgIHJlc29sdmVJbmplY3Rpb25Ub2tlbk9mLFxuICAgIGdldEluamVjdGlvblRva2VuT2YsXG4gIH0pO1xuXG4gIGNvbnN0IGVhcmx5T3ZlcnJpZGUgPSBlYXJseU92ZXJyaWRlRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IGVhcmx5T3ZlcnJpZGUyID0gZWFybHlPdmVycmlkZTJGb3Ioe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBhbHJlYWR5SW5qZWN0ZWQsXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgfSk7XG5cbiAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGVhcmx5T3ZlcnJpZGUsXG4gIH0pO1xuXG4gIGNvbnN0IG92ZXJyaWRlMiA9IG92ZXJyaWRlRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgZWFybHlPdmVycmlkZTogZWFybHlPdmVycmlkZTIsXG4gIH0pO1xuXG4gIGNvbnN0IHVub3ZlcnJpZGUgPSB1bm92ZXJyaWRlRm9yKHtcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgfSk7XG5cbiAgY29uc3QgcHVyZ2VBbGxCdXRPdmVycmlkZXMgPSAoKSA9PiB7XG4gICAgaW5qZWN0YWJsZVNldC5jbGVhcigpO1xuICAgIGFscmVhZHlJbmplY3RlZC5jbGVhcigpO1xuICAgIGluamVjdGFibGVJZFNldC5jbGVhcigpO1xuICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmNsZWFyKCk7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmNsZWFyKCk7XG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmNsZWFyKCk7XG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmNsZWFyKCk7XG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcC5jbGVhcigpO1xuICAgIGRlY29yYXRvckNhY2hlLmluamVjdGlvbiA9IG51bGw7XG4gICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID0gbnVsbDtcbiAgICBzeW5jSW5qZWN0V2lyaW5nKCk7XG4gIH07XG5cbiAgLy8gVGhlIGltbWVkaWF0ZSBwYXJlbnQgaXMgdGhlIGxhc3QgcmVnaXN0cmF0aW9uIGNvbnRleHQgaXRlbTsgYSBtaXNzaW5nXG4gIC8vIGVudHJ5IG9yIGEgY29udGFpbmVyLWxldmVsIHBhcmVudCBub3JtYWxpemVzIHRvIHJvb3RJbmplY3RhYmxlIHNvIHRoYXRcbiAgLy8gc2NvcGUgY29tcGFyaXNvbnMgd29yayB1bmlmb3JtbHkgZm9yIHJvb3QgYW5kIG5lc3RlZCBzY29wZXMuXG4gIGNvbnN0IGdldEltbWVkaWF0ZVNjb3BlT2YgPSBpbmplY3RhYmxlID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQuZ2V0KGluamVjdGFibGUpO1xuICAgIGNvbnN0IGltbWVkaWF0ZVBhcmVudCA9IGNvbnRleHQ/Lltjb250ZXh0Lmxlbmd0aCAtIDFdPy5pbmplY3RhYmxlO1xuXG4gICAgcmV0dXJuICFpbW1lZGlhdGVQYXJlbnQgfHwgaW1tZWRpYXRlUGFyZW50LmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcidcbiAgICAgID8gcm9vdEluamVjdGFibGVcbiAgICAgIDogaW1tZWRpYXRlUGFyZW50O1xuICB9O1xuXG4gIGNvbnN0IHByaXZhdGVEaSA9IHtcbiAgICAvLyBTd2FwcGVkIGJ5IHN5bmNJbmplY3RXaXJpbmc6IHRoZSBkZWNvcmF0ZWQgdmFyaWFudHMgYXJlIHdpcmVkXG4gICAgLy8gaW4gb25seSB3aGlsZSBhdCBsZWFzdCBvbmUgaW5qZWN0aW9uIGRlY29yYXRvciBpcyByZWdpc3RlcmVkLCBzbyB0aGVcbiAgICAvLyBjb21tb24gbm8tZGVjb3JhdG9yIGNhc2UgcGF5cyBubyB3cmFwcGVyIGZyYW1lIGF0IGFsbC5cbiAgICBpbmplY3Q6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3QsXG4gICAgaW5qZWN0V2l0aE1ldGE6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSxcbiAgICBpbmplY3RNYW55OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgICBpbmplY3RNYW55V2l0aE1ldGE6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55V2l0aE1ldGEsXG5cbiAgICBpbmplY3RGYWN0b3J5OlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdChhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIHJlZ2lzdGVyOiBwcml2YXRlUmVnaXN0ZXIsXG4gICAgZGVyZWdpc3RlcixcbiAgICBvdmVycmlkZSxcbiAgICBvdmVycmlkZTIsXG4gICAgZWFybHlPdmVycmlkZSxcbiAgICBlYXJseU92ZXJyaWRlMixcbiAgICB1bm92ZXJyaWRlLFxuXG4gICAgcmVzZXQ6ICgpID0+IHtcbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcy5jbGVhcigpO1xuICAgIH0sXG5cbiAgICBwZXJtaXRTaWRlRWZmZWN0czogYWxpYXMgPT4ge1xuICAgICAgaWYgKGFsaWFzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpLmZvckVhY2goaW5qZWN0YWJsZSA9PlxuICAgICAgICBpbmplY3RhYmxlc1dpdGhQZXJtaXR0ZWRTaWRlRWZmZWN0cy5hZGQoaW5qZWN0YWJsZSksXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBwdXJnZTogcHVyZ2VJbnN0YW5jZXMsXG5cbiAgICBzY29wZWRQdXJnZTogKHNjb3BlSW5qZWN0YWJsZSwgYWxpYXMsIC4uLmtleVBhcnRzKSA9PiB7XG4gICAgICAvLyBXaXRob3V0IGFuIGFsaWFzLCB0aGUgc2NvcGUncyBvd24gaW5zdGFuY2VzIGFuZCB0aG9zZSBvZiB3aGF0ZXZlciBpdFxuICAgICAgLy8gcmVnaXN0ZXJlZCBkaXJlY3RseS5cbiAgICAgIGlmIChhbGlhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudE1hcC5nZXQoc2NvcGVJbmplY3RhYmxlKTtcblxuICAgICAgICBwdXJnZVN0b3JlZEluc3RhbmNlcyhcbiAgICAgICAgICBjaGlsZHJlbiA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IFtzY29wZUluamVjdGFibGVdXG4gICAgICAgICAgICA6IFtzY29wZUluamVjdGFibGUsIC4uLmNoaWxkcmVuXSxcbiAgICAgICAgICBrZXlQYXJ0cyxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGluamVjdGFibGVzID0gZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKTtcbiAgICAgIGNvbnN0IGFsbG93ZWRDaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KHNjb3BlSW5qZWN0YWJsZSk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5qZWN0YWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5qZWN0YWJsZSA9IGluamVjdGFibGVzW2ldO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpbmplY3RhYmxlICE9PSBzY29wZUluamVjdGFibGUgJiZcbiAgICAgICAgICAhYWxsb3dlZENoaWxkcmVuPy5oYXMoaW5qZWN0YWJsZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFRyaWVkIHRvIHB1cmdlIFwiJHtuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KFxuICAgICAgICAgICAgICBpbmplY3RhYmxlLFxuICAgICAgICAgICAgKX1cIiBmcm9tIFwiJHtuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KFxuICAgICAgICAgICAgICBzY29wZUluamVjdGFibGUsXG4gICAgICAgICAgICApfVwiLCBidXQgaXQgaXMgbm90IHdpdGhpbiBpdHMgcmVnaXN0cmF0aW9uIGNvbnRleHQgdHJlZS5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoaW5qZWN0YWJsZXMsIGtleVBhcnRzKTtcbiAgICB9LFxuXG4gICAgcHVyZ2VBbGxCdXRPdmVycmlkZXMsXG4gICAgaGFzUmVnaXN0cmF0aW9uczogYWxpYXMgPT4gISFnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpLmxlbmd0aCxcbiAgICBnZXROdW1iZXJPZlJlZ2lzdHJhdGlvbnM6IGFsaWFzID0+IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcykubGVuZ3RoLFxuXG4gICAgcmVnaXN0ZXJlZEluU2NvcGVPZjogKHNjb3BlSW5qZWN0YWJsZSwgYWxpYXMpID0+XG4gICAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpLnNvbWUoXG4gICAgICAgIGluamVjdGFibGUgPT4gZ2V0SW1tZWRpYXRlU2NvcGVPZihpbmplY3RhYmxlKSA9PT0gc2NvcGVJbmplY3RhYmxlLFxuICAgICAgKSxcblxuICAgIHJlZ2lzdGVyZWRJblN1YnRyZWVPZjogKHNjb3BlSW5qZWN0YWJsZSwgYWxpYXMpID0+XG4gICAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpLnNvbWUoaW5qZWN0YWJsZSA9PiB7XG4gICAgICAgIGxldCBzY29wZSA9IGdldEltbWVkaWF0ZVNjb3BlT2YoaW5qZWN0YWJsZSk7XG5cbiAgICAgICAgd2hpbGUgKHNjb3BlICE9PSBzY29wZUluamVjdGFibGUgJiYgc2NvcGUgIT09IHJvb3RJbmplY3RhYmxlKSB7XG4gICAgICAgICAgc2NvcGUgPSBnZXRJbW1lZGlhdGVTY29wZU9mKHNjb3BlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzY29wZSA9PT0gc2NvcGVJbmplY3RhYmxlO1xuICAgICAgfSksXG5cbiAgICBnZXROdW1iZXJPZkluc3RhbmNlczogKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtpbmplY3RhYmxlLCBzdG9yZWRdIG9mIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCkge1xuICAgICAgICBjb25zdCBuYW1lc3BhY2VkSWQgPSBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGFibGUpO1xuICAgICAgICBpZiAoIW5hbWVzcGFjZWRJZCkgY29udGludWU7XG5cbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgaWYgKGlzQ29tcG9zaXRlU3RvcmFnZShzdG9yZWQpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBfIG9mIHN0b3JlZC52YWx1ZXMoKSkgY291bnQrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb3VudCA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvdW50ID4gMCkgcmVzdWx0W25hbWVzcGFjZWRJZF0gPSBjb3VudDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfTtcblxuICAvLyBUaGUgc2xvdHMgc3RhcnQgb3V0IGhvbGRpbmcgdGhlIGJhcmUgb3BlcmF0aW9uczsgd2lyZSB0aGVtIG9uY2UgdXAtZnJvbnRcbiAgLy8gc28gZW5mb3JjZW1lbnQgYXBwbGllcyBldmVuIGluIGEgY29udGFpbmVyIHdoZXJlIG5vdGhpbmcgaXMgcmVnaXN0ZXJlZC5cbiAgc3luY0luamVjdFdpcmluZygpO1xuXG4gIGNvbnN0IHB1YmxpY0luamVjdCA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBwcml2YXRlRGkuaW5qZWN0KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiByb290SW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICBjb25zdCBwdWJsaWNJbmplY3RNYW55ID0gKGFsaWFzLCAuLi5hcmdzKSA9PlxuICAgIHByaXZhdGVEaS5pbmplY3RNYW55KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiByb290SW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICBjb25zdCBwdWJsaWNJbmplY3RXaXRoTWV0YSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBwcml2YXRlRGkuaW5qZWN0V2l0aE1ldGEoe1xuICAgICAgYWxpYXMsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogYXJncyxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHJvb3RJbmplY3RhYmxlLFxuICAgIH0pO1xuXG4gIGNvbnN0IHB1YmxpY0luamVjdE1hbnlXaXRoTWV0YSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiByb290SW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICBjb25zdCBwdWJsaWNEaSA9IHtcbiAgICAuLi5wcml2YXRlRGksXG5cbiAgICBpbmplY3Q6IHB1YmxpY0luamVjdCxcbiAgICBpbmplY3RXaXRoTWV0YTogcHVibGljSW5qZWN0V2l0aE1ldGEsXG4gICAgaW5qZWN0TWFueTogcHVibGljSW5qZWN0TWFueSxcbiAgICBpbmplY3RNYW55V2l0aE1ldGE6IHB1YmxpY0luamVjdE1hbnlXaXRoTWV0YSxcblxuICAgIGluamVjdDI6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgcHVibGljSW5qZWN0KGFsaWFzLCAuLi5wYXJhbXMpLFxuXG4gICAgaW5qZWN0TWFueTI6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgcHVibGljSW5qZWN0TWFueShhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIC8vIFJlc29sdmVzIHBlciBjYWxsIGxpa2UgaW5qZWN0TWFueSwgYnV0IHVud3JhcHMgdG8gdGhlIHNpbmdsZSBpbnN0YW5jZSBvclxuICAgIC8vIHVuZGVmaW5lZCBcdTIwMTQgdGhlICd6ZXJvLW9yLW9uZScgdXBwZXIgYm91bmQgZ3VhcmFudGVlcyBhdCBtb3N0IG9uZS5cbiAgICBpbmplY3RNYXliZTI6IGFsaWFzID0+IHtcbiAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eShhbGlhcywgcm9vdEluamVjdGFibGUpO1xuXG4gICAgICByZXR1cm4gKC4uLnBhcmFtcykgPT4gcHVibGljSW5qZWN0TWFueShhbGlhcywgLi4ucGFyYW1zKVswXTtcbiAgICB9LFxuXG4gICAgaW5qZWN0V2l0aE1ldGEyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdFdpdGhNZXRhKGFsaWFzLCAuLi5wYXJhbXMpLFxuXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhMjpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICAvLyBpbmplY3RNYXliZTIgb3ZlciB0aGUgd2l0aC1tZXRhIHBsYW5lOiB1bndyYXBzIHRvIHRoZSBzaW5nbGVcbiAgICAvLyBtZXRhLXdyYXBwZWQgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkLlxuICAgIGluamVjdE1heWJlV2l0aE1ldGEyOiBhbGlhcyA9PiB7XG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHkoYWxpYXMsIHJvb3RJbmplY3RhYmxlKTtcblxuICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHB1YmxpY0luamVjdE1hbnlXaXRoTWV0YShhbGlhcywgLi4ucGFyYW1zKVswXTtcbiAgICB9LFxuXG4gICAgcmVnaXN0ZXI6ICguLi5pbmplY3RhYmxlcykgPT4ge1xuICAgICAgcHJpdmF0ZURpLnJlZ2lzdGVyKHtcbiAgICAgICAgaW5qZWN0YWJsZXMsXG4gICAgICAgIGNvbnRleHQ6IFtjb250YWluZXJSb290Q29udGV4dEl0ZW1dLFxuICAgICAgICBzb3VyY2U6IHJvb3RJbmplY3RhYmxlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGRlcmVnaXN0ZXI6ICguLi5pbmplY3RhYmxlcykgPT4ge1xuICAgICAgcHJpdmF0ZURpLmRlcmVnaXN0ZXIoe1xuICAgICAgICBpbmplY3RhYmxlcyxcbiAgICAgICAgY29udGV4dDogW2NvbnRhaW5lclJvb3RDb250ZXh0SXRlbV0sXG4gICAgICAgIHNvdXJjZTogcm9vdEluamVjdGFibGUsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgcmVnaXN0ZXJlZEluTG9jYWxTY29wZTogYWxpYXMgPT5cbiAgICAgIHByaXZhdGVEaS5yZWdpc3RlcmVkSW5TY29wZU9mKHJvb3RJbmplY3RhYmxlLCBhbGlhcyksXG5cbiAgICB2YWxpZGF0ZTogdmFsaWRhdGVGb3Ioe1xuICAgICAgY29udGFpbmVySWQsXG4gICAgICBpbmplY3RhYmxlU2V0LFxuICAgICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIH0pLFxuXG4gICAgcmVnaXN0ZXJlZEluTG9jYWxTY29wZVN1YnRyZWU6IGFsaWFzID0+XG4gICAgICBwcml2YXRlRGkucmVnaXN0ZXJlZEluU3VidHJlZU9mKHJvb3RJbmplY3RhYmxlLCBhbGlhcyksXG4gIH07XG5cbiAgcmV0dXJuIHB1YmxpY0RpO1xufTtcbiIsICJpbXBvcnQgeyBpZGVudGl0eSwgY29uc3RhbnQgfSBmcm9tICdsb2Rhc2gvZnAnO1xuXG5leHBvcnQgY29uc3QgZ2V0VHlwZWRTcGVjaWZpZXIgPSBjb25zdGFudChpZGVudGl0eSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QUNBTyxJQUFNLHVCQUF1QixPQUFPLHlCQUF5QjtBQUM3RCxJQUFNLG9CQUFvQixPQUFPLHFCQUFxQjtBQUU3RCxJQUFPLHdCQUFRO0FBQUEsRUFDYixXQUFXO0FBQUEsSUFDVCxJQUFJO0FBQUEsSUFFSixnQkFBZ0IsTUFBTTtBQUFBLEVBQ3hCO0FBQUEsRUFFQSxnQkFBZ0IsQ0FBQyxFQUFFLGVBQWUsT0FBTztBQUFBLElBQ3ZDLElBQUk7QUFBQSxJQUNKO0FBQUEsRUFDRjtBQUFBLEVBRUEsV0FBVztBQUFBLElBQ1QsSUFBSTtBQUFBLElBQ0osZ0JBQWdCLE1BQU07QUFBQSxFQUN4QjtBQUNGOzs7QUNuQk8sSUFBTSxxQkFBcUIsT0FBTyxlQUFlO0FBQ2pELElBQU0sa0JBQWtCLElBQUksVUFBVTtBQUFBLEVBQzNDLENBQUMsa0JBQWtCLEdBQUc7QUFBQSxFQUN0QjtBQUNGO0FBRU8sSUFBTSxpQkFBaUIsV0FDNUIsU0FBUyxNQUFNLGtCQUFrQixNQUFNOzs7QUNMbEMsSUFBTSxtQkFBbUI7QUFFaEMsSUFBTyx3QkFBUSxDQUFDLEVBQUUsWUFBWSxzQkFBYyxXQUFXLEdBQUcsV0FBVyxPQUFPO0FBQUEsRUFDMUUsV0FBVztBQUFBLEVBQ1g7QUFBQSxFQUNBLEdBQUc7QUFDTDs7O0FDSk8sSUFBTSxvQkFBb0I7QUFTakMsSUFBTSxxQkFBcUIsc0JBQWMsZUFBZTtBQUFBLEVBQ3RELGdCQUFnQixDQUFDLE9BQU8sU0FBUztBQUMvQixRQUFJLEtBQUssV0FBVyxFQUFHLFFBQU87QUFDOUIsV0FB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SSxXQUFXLGlCQUFpQixPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUM7QUFBQSxJQUM1RDtBQUFBLElBRUEsaUJBQ0UsV0FDQSxJQUFJLFdBQ0YscUJBQXFCLE9BQU8sR0FBRyxNQUFNO0FBQUEsSUFFekMscUJBQ0UsV0FDQSxJQUFJLFdBQ0YseUJBQXlCLE9BQU8sR0FBRyxNQUFNO0FBQUE7QUFBQTtBQUFBLElBSTdDLHNCQUFzQixXQUFTO0FBQzdCLGtDQUE0QixPQUFPLGNBQWM7QUFFakQsYUFBTyxJQUFJLFdBQVcseUJBQXlCLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUFBLElBQ3BFO0FBQUEsSUFFQSxVQUFVLElBQUksZ0JBQWdCO0FBQzVCLGdCQUFVLFNBQVM7QUFBQSxRQUNqQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSxZQUFZLElBQUksZ0JBQWdCO0FBQzlCLGdCQUFVLFdBQVc7QUFBQSxRQUNuQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSx3QkFBd0IsV0FDdEIsVUFBVSxvQkFBb0IsZ0JBQWdCLEtBQUs7QUFBQSxJQUVyRCxVQUFVLFlBQVk7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUVELCtCQUErQixXQUM3QixVQUFVLHNCQUFzQixnQkFBZ0IsS0FBSztBQUFBLEVBQ3pEO0FBRUEsU0FBTztBQUNUOzs7QUNub0JBLGdCQUFtQztBQUU1QixJQUFNLHdCQUFvQixvQkFBUyxrQkFBUTs7O0F6Q3NCM0MsSUFBTSxnQ0FBZ0M7IiwKICAibmFtZXMiOiBbImluc3RhbnRpYXRlIiwgImNoaWxkTWFwIiwgImRlbGV0ZWQiLCAibWluaW1hbERpIiwgIm5ld0luc3RhbmNlIiwgImNhbGxiYWNrcyIsICJFTVBUWSJdCn0K
|
package/index.d.ts
CHANGED
|
@@ -858,6 +858,12 @@ export interface ConsumptionDi<Cons extends Consumption = never>
|
|
|
858
858
|
injectMaybeWithMeta: ConsumptionInjectMaybeWithMeta2<Cons>;
|
|
859
859
|
}
|
|
860
860
|
|
|
861
|
+
// `consumptions` is inferred as a readonly tuple, and `di` is narrowed to its
|
|
862
|
+
// elements. Inferred as the union of its elements instead, TypeScript would
|
|
863
|
+
// drop every token assignable to another one declared alongside it, as two
|
|
864
|
+
// tokens typed with `any` are, taking the dropped one's `.for()` descendants
|
|
865
|
+
// out of what `di` accepts.
|
|
866
|
+
//
|
|
861
867
|
// With injectionToken: F is the injectable's actual factory (kept narrow so
|
|
862
868
|
// `di.inject2(injectable)` returns the narrow factory), TF is the token's
|
|
863
869
|
// factory contract. The `F extends TF` constraint verifies the implementation
|
|
@@ -865,11 +871,11 @@ export interface ConsumptionDi<Cons extends Consumption = never>
|
|
|
865
871
|
export function getInjectable2<
|
|
866
872
|
F extends TF,
|
|
867
873
|
TF extends Factory,
|
|
868
|
-
const Cons extends Consumption =
|
|
874
|
+
const Cons extends ReadonlyArray<Consumption> = [],
|
|
869
875
|
>(options: {
|
|
870
876
|
readonly id: string;
|
|
871
|
-
readonly consumptions?:
|
|
872
|
-
readonly instantiate: (di: ConsumptionDi<Cons>) => F;
|
|
877
|
+
readonly consumptions?: Cons;
|
|
878
|
+
readonly instantiate: (di: ConsumptionDi<Cons[number]>) => F;
|
|
873
879
|
readonly injectionToken: InjectionTokenOf<Token2<TF, any, undefined, any>>;
|
|
874
880
|
readonly transient?: boolean;
|
|
875
881
|
readonly causesSideEffects?: boolean;
|
|
@@ -881,11 +887,11 @@ export function getInjectable2<
|
|
|
881
887
|
// useInject / useInject2 still get precise parameter and return types.
|
|
882
888
|
export function getInjectable2<
|
|
883
889
|
F extends Factory,
|
|
884
|
-
const Cons extends Consumption =
|
|
890
|
+
const Cons extends ReadonlyArray<Consumption> = [],
|
|
885
891
|
>(options: {
|
|
886
892
|
readonly id: string;
|
|
887
|
-
readonly consumptions?:
|
|
888
|
-
readonly instantiate: (di: ConsumptionDi<Cons>) => F;
|
|
893
|
+
readonly consumptions?: Cons;
|
|
894
|
+
readonly instantiate: (di: ConsumptionDi<Cons[number]>) => F;
|
|
889
895
|
readonly transient?: boolean;
|
|
890
896
|
readonly causesSideEffects?: boolean;
|
|
891
897
|
readonly tags?: string[];
|