From 94411d3652a631fb7a4ed1d94041b4a183d0bac1 Mon Sep 17 00:00:00 2001 From: Benjamin Matuszewski Date: Mon, 27 Nov 2017 15:40:46 +0100 Subject: [PATCH] retranspiled --- client/index.js | 4 ++-- common/Example.js | 8 ++++---- common/TrainingSet.js | 6 +++--- common/XmmProcessor.js | 9 ++++----- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/client/index.js b/client/index.js index 68f3321..dfeba50 100644 --- a/client/index.js +++ b/client/index.js @@ -1,2 +1,2 @@ -'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _Example=require('../common/Example');Object.defineProperty(exports,'Example',{enumerable:true,get:function get(){return _interopRequireDefault(_Example).default;}});var _TrainingData=require('../common/TrainingData');Object.defineProperty(exports,'TrainingData',{enumerable:true,get:function get(){return _interopRequireDefault(_TrainingData).default;}});var _ProcessedSensors=require('./ProcessedSensors');Object.defineProperty(exports,'ProcessedSensors',{enumerable:true,get:function get(){return _interopRequireDefault(_ProcessedSensors).default;}});var _XmmProcessor=require('../common/XmmProcessor');Object.defineProperty(exports,'XmmProcessor',{enumerable:true,get:function get(){return _interopRequireDefault(_XmmProcessor).default;}});function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImRlZmF1bHQiXSwibWFwcGluZ3MiOiJvT0FBU0EsTyx1TEFDQUEsTywrTEFDQUEsTyx1TEFDQUEsTyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgYXMgRXhhbXBsZSB9IGZyb20gJy4uL2NvbW1vbi9FeGFtcGxlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVHJhaW5pbmdEYXRhIH0gZnJvbSAnLi4vY29tbW9uL1RyYWluaW5nRGF0YSc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIFByb2Nlc3NlZFNlbnNvcnMgfSBmcm9tICcuL1Byb2Nlc3NlZFNlbnNvcnMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBYbW1Qcm9jZXNzb3IgfSBmcm9tICcuLi9jb21tb24vWG1tUHJvY2Vzc29yJztcbiJdfQ== \ No newline at end of file +'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _Example=require('../common/Example');Object.defineProperty(exports,'Example',{enumerable:true,get:function get(){return _interopRequireDefault(_Example).default;}});var _TrainingSet=require('../common/TrainingSet');Object.defineProperty(exports,'TrainingSet',{enumerable:true,get:function get(){return _interopRequireDefault(_TrainingSet).default;}});var _ProcessedSensors=require('./ProcessedSensors');Object.defineProperty(exports,'ProcessedSensors',{enumerable:true,get:function get(){return _interopRequireDefault(_ProcessedSensors).default;}});var _XmmProcessor=require('../common/XmmProcessor');Object.defineProperty(exports,'XmmProcessor',{enumerable:true,get:function get(){return _interopRequireDefault(_XmmProcessor).default;}});function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};} +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImRlZmF1bHQiXSwibWFwcGluZ3MiOiJvT0FBU0EsTyxtTEFDQUEsTywrTEFDQUEsTyx1TEFDQUEsTyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgYXMgRXhhbXBsZSB9IGZyb20gJy4uL2NvbW1vbi9FeGFtcGxlJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgVHJhaW5pbmdTZXQgfSBmcm9tICcuLi9jb21tb24vVHJhaW5pbmdTZXQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQcm9jZXNzZWRTZW5zb3JzIH0gZnJvbSAnLi9Qcm9jZXNzZWRTZW5zb3JzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgWG1tUHJvY2Vzc29yIH0gZnJvbSAnLi4vY29tbW9uL1htbVByb2Nlc3Nvcic7XG4iXX0= \ No newline at end of file diff --git a/common/Example.js b/common/Example.js index 9d594d5..75cf2fd 100644 --- a/common/Example.js +++ b/common/Example.js @@ -1,4 +1,4 @@ -'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _from=require('babel-runtime/core-js/array/from');var _from2=_interopRequireDefault(_from);var _classCallCheck2=require('babel-runtime/helpers/classCallCheck');var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=require('babel-runtime/helpers/createClass');var _createClass3=_interopRequireDefault(_createClass2);var _rapidMixAdapters=require('rapid-mix-adapters');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}// source : https://stackoverflow.com/questions/15251879/how-to-check-if-a-variable-is-a-typed-array-in-javascript +'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _from=require('babel-runtime/core-js/array/from');var _from2=_interopRequireDefault(_from);var _classCallCheck2=require('babel-runtime/helpers/classCallCheck');var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=require('babel-runtime/helpers/createClass');var _createClass3=_interopRequireDefault(_createClass2);var _rapidMixAdapters=require('rapid-mix-adapters');var _rapidMixAdapters2=_interopRequireDefault(_rapidMixAdapters);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}// source : https://stackoverflow.com/questions/15251879/how-to-check-if-a-variable-is-a-typed-array-in-javascript var isArray=function isArray(v){return v.constructor===Float32Array||v.constructor===Float64Array||Array.isArray(v);};/** * Class that represents a training example (e.g. time serie of vectors * that represents a gesture). @@ -23,7 +23,7 @@ var isArray=function isArray(v){return v.constructor===Float32Array||v.construct * const rapidMixJsonExample = example.toJSON(); * * trainingSet.addExample(rapidMixJsonExample); - */var Example=function(){function Example(){var inputDimension=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var outputDimension=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;(0,_classCallCheck3.default)(this,Example);if(inputDimension!==null){this.fixedDimensions=true;this.inputDimension=inputDimension;this.outputDimension=outputDimension!==null?outputDimension:0;}else{this.fixedDimensions=false;}this.label=_rapidMixAdapters.constants.rapidMixDefaultLabel;this.clear();this.addElement=this.addElement.bind(this);}/** + */var Example=function(){function Example(){var inputDimension=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var outputDimension=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;(0,_classCallCheck3.default)(this,Example);if(inputDimension!==null){this.fixedDimensions=true;this.inputDimension=inputDimension;this.outputDimension=outputDimension!==null?outputDimension:0;}else{this.fixedDimensions=false;}this.label=_rapidMixAdapters2.default.RAPID_MIX_DEFAULT_LABEL;this.clear();this.addElement=this.addElement.bind(this);}/** * Clear the internal variables so that we are ready to record a new example. */(0,_createClass3.default)(Example,[{key:'clear',value:function clear(){if(!this.fixedDimensions){this.inputDimension=null;this.outputDimension=null;}this.input=[];this.output=[];}/** * Set the example's current label. @@ -42,8 +42,8 @@ var isArray=function isArray(v){return v.constructor===Float32Array||v.construct * Get the example in RapidMix JSON format. * * @returns {Object} A RapidMix compliant example object. - */},{key:'toJSON',value:function toJSON(){return{docType:'rapid-mix:example',docVersion:_rapidMixAdapters.constants.rapidMixDocVersion,payload:{label:this.label,// inputDimension: this.inputDimension, + */},{key:'toJSON',value:function toJSON(){return{docType:'rapid-mix:example',docVersion:rapidMixConstants.rapidMixDocVersion,payload:{label:this.label,// inputDimension: this.inputDimension, // outputDimension: this.outputDimension, input:this.input.slice(0),output:this.output.slice(0)}};}/** @private */},{key:'_validateInputAndUpdateDimensions',value:function _validateInputAndUpdateDimensions(inputVector,outputVector){if(!isArray(inputVector)||outputVector&&!isArray(outputVector)){throw new Error('inputVector and outputVector must be arrays');}if(!this.inputDimension||!this.outputDimension){this.inputDimension=inputVector.length;this.outputDimension=outputVector?outputVector.length:0;// this._empty = false; }else if(inputVector.length!=this.inputDimension||outputVector.length!=this.outputDimension){throw new Error('dimensions mismatch');}}}]);return Example;}();exports.default=Example; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImlzQXJyYXkiLCJ2IiwiY29uc3RydWN0b3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJBcnJheSIsIkV4YW1wbGUiLCJpbnB1dERpbWVuc2lvbiIsIm91dHB1dERpbWVuc2lvbiIsImZpeGVkRGltZW5zaW9ucyIsImxhYmVsIiwicmFwaWRNaXhEZWZhdWx0TGFiZWwiLCJjbGVhciIsImFkZEVsZW1lbnQiLCJiaW5kIiwiaW5wdXQiLCJvdXRwdXQiLCJpbnB1dFZlY3RvciIsIm91dHB1dFZlY3RvciIsIl92YWxpZGF0ZUlucHV0QW5kVXBkYXRlRGltZW5zaW9ucyIsInB1c2giLCJkb2NUeXBlIiwiZG9jVmVyc2lvbiIsInJhcGlkTWl4RG9jVmVyc2lvbiIsInBheWxvYWQiLCJzbGljZSIsIkVycm9yIiwibGVuZ3RoIl0sIm1hcHBpbmdzIjoiK1pBQUEsb0QsbUZBRUE7QUFDQSxHQUFNQSxTQUFVLFFBQVZBLFFBQVUsR0FBSyxDQUNuQixNQUFPQyxHQUFFQyxXQUFGLEdBQWtCQyxZQUFsQixFQUNBRixFQUFFQyxXQUFGLEdBQWtCRSxZQURsQixFQUVBQyxNQUFNTCxPQUFOLENBQWNDLENBQWQsQ0FGUCxDQUdELENBSkQsQ0FNQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BeUJNSyxRLFlBQ0osa0JBQTJELElBQS9DQyxlQUErQywyREFBOUIsSUFBOEIsSUFBeEJDLGdCQUF3QiwyREFBTixJQUFNLDRDQUN6RCxHQUFJRCxpQkFBbUIsSUFBdkIsQ0FBNkIsQ0FDM0IsS0FBS0UsZUFBTCxDQUF1QixJQUF2QixDQUNBLEtBQUtGLGNBQUwsQ0FBc0JBLGNBQXRCLENBQ0EsS0FBS0MsZUFBTCxDQUF1QkEsa0JBQW9CLElBQXBCLENBQTJCQSxlQUEzQixDQUE2QyxDQUFwRSxDQUNELENBSkQsSUFJTyxDQUNMLEtBQUtDLGVBQUwsQ0FBdUIsS0FBdkIsQ0FDRCxDQUVELEtBQUtDLEtBQUwsQ0FBYSw0QkFBa0JDLG9CQUEvQixDQUNBLEtBQUtDLEtBQUwsR0FFQSxLQUFLQyxVQUFMLENBQWtCLEtBQUtBLFVBQUwsQ0FBZ0JDLElBQWhCLENBQXFCLElBQXJCLENBQWxCLENBQ0QsQ0FFRDs7MkVBR1EsQ0FDTixHQUFJLENBQUMsS0FBS0wsZUFBVixDQUEyQixDQUN6QixLQUFLRixjQUFMLENBQXNCLElBQXRCLENBQ0EsS0FBS0MsZUFBTCxDQUF1QixJQUF2QixDQUNELENBRUQsS0FBS08sS0FBTCxDQUFhLEVBQWIsQ0FDQSxLQUFLQyxNQUFMLENBQWMsRUFBZCxDQUNELENBRUQ7Ozs7K0NBS1NOLEssQ0FBTyxDQUNkLEtBQUtBLEtBQUwsQ0FBYUEsS0FBYixDQUNELENBRUQ7Ozs7Ozs7OzttREFVV08sVyxDQUFrQyxJQUFyQkMsYUFBcUIsMkRBQU4sSUFBTSxDQUMzQyxLQUFLQyxpQ0FBTCxDQUF1Q0YsV0FBdkMsQ0FBb0RDLFlBQXBELEVBRUEsR0FBSUQsc0JBQXVCZCxhQUF2QixFQUNBYyxzQkFBdUJiLGFBRDNCLENBRUVhLFlBQWMsbUJBQVdBLFdBQVgsQ0FBZCxDQUVGLEdBQUlDLHVCQUF3QmYsYUFBeEIsRUFDQWUsdUJBQXdCZCxhQUQ1QixDQUVFYyxhQUFlLG1CQUFXQSxZQUFYLENBQWYsQ0FFRixLQUFLSCxLQUFMLENBQVdLLElBQVgsQ0FBZ0JILFdBQWhCLEVBRUEsR0FBSSxLQUFLVCxlQUFMLENBQXVCLENBQTNCLENBQ0UsS0FBS1EsTUFBTCxDQUFZSSxJQUFaLENBQWlCRixZQUFqQixFQUNILENBRUQ7Ozs7NENBS1MsQ0FDUCxNQUFPLENBQ0xHLFFBQVMsbUJBREosQ0FFTEMsV0FBWSw0QkFBa0JDLGtCQUZ6QixDQUdMQyxRQUFTLENBQ1BkLE1BQU8sS0FBS0EsS0FETCxDQUVQO0FBQ0E7QUFDQUssTUFBTyxLQUFLQSxLQUFMLENBQVdVLEtBQVgsQ0FBaUIsQ0FBakIsQ0FKQSxDQUtQVCxPQUFRLEtBQUtBLE1BQUwsQ0FBWVMsS0FBWixDQUFrQixDQUFsQixDQUxELENBSEosQ0FBUCxDQVdELENBRUQsZSw0RkFDa0NSLFcsQ0FBYUMsWSxDQUFjLENBQzNELEdBQUksQ0FBQ2xCLFFBQVFpQixXQUFSLENBQUQsRUFBMEJDLGNBQWdCLENBQUNsQixRQUFRa0IsWUFBUixDQUEvQyxDQUF1RSxDQUNyRSxLQUFNLElBQUlRLE1BQUosQ0FBVSw2Q0FBVixDQUFOLENBQ0QsQ0FFRCxHQUFJLENBQUMsS0FBS25CLGNBQU4sRUFBd0IsQ0FBQyxLQUFLQyxlQUFsQyxDQUFtRCxDQUNqRCxLQUFLRCxjQUFMLENBQXNCVSxZQUFZVSxNQUFsQyxDQUNBLEtBQUtuQixlQUFMLENBQXVCVSxhQUFlQSxhQUFhUyxNQUE1QixDQUFxQyxDQUE1RCxDQUNBO0FBQ0QsQ0FKRCxJQUlPLElBQUlWLFlBQVlVLE1BQVosRUFBc0IsS0FBS3BCLGNBQTNCLEVBQ0RXLGFBQWFTLE1BQWIsRUFBdUIsS0FBS25CLGVBRC9CLENBQ2dELENBQ3JELEtBQU0sSUFBSWtCLE1BQUosQ0FBVSxxQkFBVixDQUFOLENBQ0QsQ0FDRixDLHVDQUdZcEIsTyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbnN0YW50cyBhcyByYXBpZE1peENvbnN0YW50cyB9IGZyb20gJ3JhcGlkLW1peC1hZGFwdGVycyc7XG5cbi8vIHNvdXJjZSA6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE1MjUxODc5L2hvdy10by1jaGVjay1pZi1hLXZhcmlhYmxlLWlzLWEtdHlwZWQtYXJyYXktaW4tamF2YXNjcmlwdFxuY29uc3QgaXNBcnJheSA9IHYgPT4ge1xuICByZXR1cm4gdi5jb25zdHJ1Y3RvciA9PT0gRmxvYXQzMkFycmF5IHx8XG4gICAgICAgICB2LmNvbnN0cnVjdG9yID09PSBGbG9hdDY0QXJyYXkgfHxcbiAgICAgICAgIEFycmF5LmlzQXJyYXkodik7XG59O1xuXG4vKipcbiAqIENsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHRyYWluaW5nIGV4YW1wbGUgKGUuZy4gdGltZSBzZXJpZSBvZiB2ZWN0b3JzXG4gKiB0aGF0IHJlcHJlc2VudHMgYSBnZXN0dXJlKS5cbiAqIElmIG5vIHBhcmFtZXRlcnMgYXJlIGdpdmVuLCB0aGUgZGltZW5zaW9ucyB3aWxsIGJlIGd1ZXNzZWQgZnJvbSB0aGUgZmlyc3RcbiAqIGFkZGVkIGVsZW1lbnQgYWZ0ZXIgaW5zdGFudGlhdGlvbiBvZiB0aGUgY2xhc3MgYW5kIGFmdGVyIGVhY2ggY2FsbCB0byBjbGVhci5cbiAqIElmIHBhcmFtZXRlcnMgYXJlIGdpdmVuLCB0aGV5IHdpbGwgYmUgdXNlZCB0byBzdHJpY3RseSBjaGVjayBhbnkgbmV3IGVsZW1lbnQsXG4gKiBhbnl0aW1lLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW5wdXREaW1lbnNpb249bnVsbF0gLSBJZiBkZWZpbmVkLCBkZWZpbml0aXZlIGlucHV0IGRpbWVuc2lvblxuICogICAgdGhhdCB3aWxsIGJlIGNoZWNrZWQgdG8gdmFsaWRhdGUgYW55IG5ldyBlbGVtZW50IGFkZGVkLlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvdXRwdXREaW1lbnNpb249bnVsbF0gLSBJZiBkZWZpbmVkLCBkZWZpbml0aXZlIG91dHB1dCBkaW1lbnNpb25cbiAqICAgIHRoYXQgd2lsbCBiZSBjaGVja2VkIHRvIHZhbGlkYXRlIGFueSBuZXcgZWxlbWVudCBhZGRlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0ICogYXMgbWFubyBmcm9tICdtYW5vLWpzL2NsaWVudCc7XG4gKlxuICogY29uc3QgZXhhbXBsZSA9IG5ldyBtYW5vLkV4YW1wbGUoKTtcbiAqIGNvbnN0IHRyYWluaW5nU2V0ID0gbmV3IG1hbm8uVHJhaW5pbmdTZXQoKTtcbiAqXG4gKiBleGFtcGxlLnNldExhYmVsKCd0ZXN0Jyk7XG4gKiBleGFtcGxlLmFkZEVsZW1lbnQoWzAsIDEsIDIsIDNdKTtcbiAqIGNvbnN0IHJhcGlkTWl4SnNvbkV4YW1wbGUgPSBleGFtcGxlLnRvSlNPTigpO1xuICpcbiAqIHRyYWluaW5nU2V0LmFkZEV4YW1wbGUocmFwaWRNaXhKc29uRXhhbXBsZSk7XG4gKi9cbmNsYXNzIEV4YW1wbGUge1xuICBjb25zdHJ1Y3RvcihpbnB1dERpbWVuc2lvbiA9IG51bGwsIG91dHB1dERpbWVuc2lvbiA9IG51bGwpIHtcbiAgICBpZiAoaW5wdXREaW1lbnNpb24gIT09IG51bGwpIHtcbiAgICAgIHRoaXMuZml4ZWREaW1lbnNpb25zID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5wdXREaW1lbnNpb24gPSBpbnB1dERpbWVuc2lvbjtcbiAgICAgIHRoaXMub3V0cHV0RGltZW5zaW9uID0gb3V0cHV0RGltZW5zaW9uICE9PSBudWxsID8gb3V0cHV0RGltZW5zaW9uIDogMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maXhlZERpbWVuc2lvbnMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmxhYmVsID0gcmFwaWRNaXhDb25zdGFudHMucmFwaWRNaXhEZWZhdWx0TGFiZWw7XG4gICAgdGhpcy5jbGVhcigpO1xuXG4gICAgdGhpcy5hZGRFbGVtZW50ID0gdGhpcy5hZGRFbGVtZW50LmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgdGhlIGludGVybmFsIHZhcmlhYmxlcyBzbyB0aGF0IHdlIGFyZSByZWFkeSB0byByZWNvcmQgYSBuZXcgZXhhbXBsZS5cbiAgICovXG4gIGNsZWFyKCkge1xuICAgIGlmICghdGhpcy5maXhlZERpbWVuc2lvbnMpIHtcbiAgICAgIHRoaXMuaW5wdXREaW1lbnNpb24gPSBudWxsO1xuICAgICAgdGhpcy5vdXRwdXREaW1lbnNpb24gPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuaW5wdXQgPSBbXTtcbiAgICB0aGlzLm91dHB1dCA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZXhhbXBsZSdzIGN1cnJlbnQgbGFiZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCAtIFRoZSBuZXcgbGFiZWwgdG8gYXNzaWduIHRvIHRoZSBjbGFzcy5cbiAgICovXG4gIHNldExhYmVsKGxhYmVsKSB7XG4gICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBlbGVtZW50IHRvIHRoZSBjdXJyZW50IGV4YW1wbGUuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXkuTnVtYmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl9IGlucHV0VmVjdG9yIC0gVGhlIGlucHV0XG4gICAqIHBhcnQgb2YgdGhlIGVsZW1lbnQgdG8gYWRkLlxuICAgKiBAcGFyYW0ge0FycmF5Lk51bWJlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fSBbb3V0cHV0VmVjdG9yPW51bGxdIC0gVGhlXG4gICAqIG91dHB1dCBwYXJ0IG9mIHRoZSBlbGVtZW50IHRvIGFkZC5cbiAgICpcbiAgICogQHRocm93cyBBbiBlcnJvciBpZiBpbnB1dFZlY3RvciBvciBvdXRwdXRWZWN0b3IgZGltZW5zaW9ucyBtaXNtYXRjaC5cbiAgICovXG4gIGFkZEVsZW1lbnQoaW5wdXRWZWN0b3IsIG91dHB1dFZlY3RvciA9IG51bGwpIHtcbiAgICB0aGlzLl92YWxpZGF0ZUlucHV0QW5kVXBkYXRlRGltZW5zaW9ucyhpbnB1dFZlY3Rvciwgb3V0cHV0VmVjdG9yKTtcblxuICAgIGlmIChpbnB1dFZlY3RvciBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fFxuICAgICAgICBpbnB1dFZlY3RvciBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSlcbiAgICAgIGlucHV0VmVjdG9yID0gQXJyYXkuZnJvbShpbnB1dFZlY3Rvcik7XG5cbiAgICBpZiAob3V0cHV0VmVjdG9yIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8XG4gICAgICAgIG91dHB1dFZlY3RvciBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSlcbiAgICAgIG91dHB1dFZlY3RvciA9IEFycmF5LmZyb20ob3V0cHV0VmVjdG9yKTtcblxuICAgIHRoaXMuaW5wdXQucHVzaChpbnB1dFZlY3Rvcik7XG5cbiAgICBpZiAodGhpcy5vdXRwdXREaW1lbnNpb24gPiAwKVxuICAgICAgdGhpcy5vdXRwdXQucHVzaChvdXRwdXRWZWN0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZXhhbXBsZSBpbiBSYXBpZE1peCBKU09OIGZvcm1hdC5cbiAgICpcbiAgICogQHJldHVybnMge09iamVjdH0gQSBSYXBpZE1peCBjb21wbGlhbnQgZXhhbXBsZSBvYmplY3QuXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRvY1R5cGU6ICdyYXBpZC1taXg6ZXhhbXBsZScsXG4gICAgICBkb2NWZXJzaW9uOiByYXBpZE1peENvbnN0YW50cy5yYXBpZE1peERvY1ZlcnNpb24sXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGxhYmVsOiB0aGlzLmxhYmVsLFxuICAgICAgICAvLyBpbnB1dERpbWVuc2lvbjogdGhpcy5pbnB1dERpbWVuc2lvbixcbiAgICAgICAgLy8gb3V0cHV0RGltZW5zaW9uOiB0aGlzLm91dHB1dERpbWVuc2lvbixcbiAgICAgICAgaW5wdXQ6IHRoaXMuaW5wdXQuc2xpY2UoMCksXG4gICAgICAgIG91dHB1dDogdGhpcy5vdXRwdXQuc2xpY2UoMCksXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAcHJpdmF0ZSAqL1xuICBfdmFsaWRhdGVJbnB1dEFuZFVwZGF0ZURpbWVuc2lvbnMoaW5wdXRWZWN0b3IsIG91dHB1dFZlY3Rvcikge1xuICAgIGlmICghaXNBcnJheShpbnB1dFZlY3RvcikgfHwgKG91dHB1dFZlY3RvciAmJiAhaXNBcnJheShvdXRwdXRWZWN0b3IpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnB1dFZlY3RvciBhbmQgb3V0cHV0VmVjdG9yIG11c3QgYmUgYXJyYXlzJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlucHV0RGltZW5zaW9uIHx8ICF0aGlzLm91dHB1dERpbWVuc2lvbikge1xuICAgICAgdGhpcy5pbnB1dERpbWVuc2lvbiA9IGlucHV0VmVjdG9yLmxlbmd0aDtcbiAgICAgIHRoaXMub3V0cHV0RGltZW5zaW9uID0gb3V0cHV0VmVjdG9yID8gb3V0cHV0VmVjdG9yLmxlbmd0aCA6IDA7XG4gICAgICAvLyB0aGlzLl9lbXB0eSA9IGZhbHNlO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRWZWN0b3IubGVuZ3RoICE9IHRoaXMuaW5wdXREaW1lbnNpb24gfHxcbiAgICAgICAgICAgICAgb3V0cHV0VmVjdG9yLmxlbmd0aCAhPSB0aGlzLm91dHB1dERpbWVuc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkaW1lbnNpb25zIG1pc21hdGNoJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV4YW1wbGU7XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImlzQXJyYXkiLCJ2IiwiY29uc3RydWN0b3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJBcnJheSIsIkV4YW1wbGUiLCJpbnB1dERpbWVuc2lvbiIsIm91dHB1dERpbWVuc2lvbiIsImZpeGVkRGltZW5zaW9ucyIsImxhYmVsIiwiUkFQSURfTUlYX0RFRkFVTFRfTEFCRUwiLCJjbGVhciIsImFkZEVsZW1lbnQiLCJiaW5kIiwiaW5wdXQiLCJvdXRwdXQiLCJpbnB1dFZlY3RvciIsIm91dHB1dFZlY3RvciIsIl92YWxpZGF0ZUlucHV0QW5kVXBkYXRlRGltZW5zaW9ucyIsInB1c2giLCJkb2NUeXBlIiwiZG9jVmVyc2lvbiIsInJhcGlkTWl4Q29uc3RhbnRzIiwicmFwaWRNaXhEb2NWZXJzaW9uIiwicGF5bG9hZCIsInNsaWNlIiwiRXJyb3IiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiIrWkFBQSxvRCxvSkFFQTtBQUNBLEdBQU1BLFNBQVUsUUFBVkEsUUFBVSxHQUFLLENBQ25CLE1BQU9DLEdBQUVDLFdBQUYsR0FBa0JDLFlBQWxCLEVBQ0FGLEVBQUVDLFdBQUYsR0FBa0JFLFlBRGxCLEVBRUFDLE1BQU1MLE9BQU4sQ0FBY0MsQ0FBZCxDQUZQLENBR0QsQ0FKRCxDQU1BOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUF5Qk1LLFEsWUFDSixrQkFBMkQsSUFBL0NDLGVBQStDLDJEQUE5QixJQUE4QixJQUF4QkMsZ0JBQXdCLDJEQUFOLElBQU0sNENBQ3pELEdBQUlELGlCQUFtQixJQUF2QixDQUE2QixDQUMzQixLQUFLRSxlQUFMLENBQXVCLElBQXZCLENBQ0EsS0FBS0YsY0FBTCxDQUFzQkEsY0FBdEIsQ0FDQSxLQUFLQyxlQUFMLENBQXVCQSxrQkFBb0IsSUFBcEIsQ0FBMkJBLGVBQTNCLENBQTZDLENBQXBFLENBQ0QsQ0FKRCxJQUlPLENBQ0wsS0FBS0MsZUFBTCxDQUF1QixLQUF2QixDQUNELENBRUQsS0FBS0MsS0FBTCxDQUFhLDJCQUFpQkMsdUJBQTlCLENBQ0EsS0FBS0MsS0FBTCxHQUVBLEtBQUtDLFVBQUwsQ0FBa0IsS0FBS0EsVUFBTCxDQUFnQkMsSUFBaEIsQ0FBcUIsSUFBckIsQ0FBbEIsQ0FDRCxDQUVEOzsyRUFHUSxDQUNOLEdBQUksQ0FBQyxLQUFLTCxlQUFWLENBQTJCLENBQ3pCLEtBQUtGLGNBQUwsQ0FBc0IsSUFBdEIsQ0FDQSxLQUFLQyxlQUFMLENBQXVCLElBQXZCLENBQ0QsQ0FFRCxLQUFLTyxLQUFMLENBQWEsRUFBYixDQUNBLEtBQUtDLE1BQUwsQ0FBYyxFQUFkLENBQ0QsQ0FFRDs7OzsrQ0FLU04sSyxDQUFPLENBQ2QsS0FBS0EsS0FBTCxDQUFhQSxLQUFiLENBQ0QsQ0FFRDs7Ozs7Ozs7O21EQVVXTyxXLENBQWtDLElBQXJCQyxhQUFxQiwyREFBTixJQUFNLENBQzNDLEtBQUtDLGlDQUFMLENBQXVDRixXQUF2QyxDQUFvREMsWUFBcEQsRUFFQSxHQUFJRCxzQkFBdUJkLGFBQXZCLEVBQ0FjLHNCQUF1QmIsYUFEM0IsQ0FFRWEsWUFBYyxtQkFBV0EsV0FBWCxDQUFkLENBRUYsR0FBSUMsdUJBQXdCZixhQUF4QixFQUNBZSx1QkFBd0JkLGFBRDVCLENBRUVjLGFBQWUsbUJBQVdBLFlBQVgsQ0FBZixDQUVGLEtBQUtILEtBQUwsQ0FBV0ssSUFBWCxDQUFnQkgsV0FBaEIsRUFFQSxHQUFJLEtBQUtULGVBQUwsQ0FBdUIsQ0FBM0IsQ0FDRSxLQUFLUSxNQUFMLENBQVlJLElBQVosQ0FBaUJGLFlBQWpCLEVBQ0gsQ0FFRDs7Ozs0Q0FLUyxDQUNQLE1BQU8sQ0FDTEcsUUFBUyxtQkFESixDQUVMQyxXQUFZQyxrQkFBa0JDLGtCQUZ6QixDQUdMQyxRQUFTLENBQ1BmLE1BQU8sS0FBS0EsS0FETCxDQUVQO0FBQ0E7QUFDQUssTUFBTyxLQUFLQSxLQUFMLENBQVdXLEtBQVgsQ0FBaUIsQ0FBakIsQ0FKQSxDQUtQVixPQUFRLEtBQUtBLE1BQUwsQ0FBWVUsS0FBWixDQUFrQixDQUFsQixDQUxELENBSEosQ0FBUCxDQVdELENBRUQsZSw0RkFDa0NULFcsQ0FBYUMsWSxDQUFjLENBQzNELEdBQUksQ0FBQ2xCLFFBQVFpQixXQUFSLENBQUQsRUFBMEJDLGNBQWdCLENBQUNsQixRQUFRa0IsWUFBUixDQUEvQyxDQUF1RSxDQUNyRSxLQUFNLElBQUlTLE1BQUosQ0FBVSw2Q0FBVixDQUFOLENBQ0QsQ0FFRCxHQUFJLENBQUMsS0FBS3BCLGNBQU4sRUFBd0IsQ0FBQyxLQUFLQyxlQUFsQyxDQUFtRCxDQUNqRCxLQUFLRCxjQUFMLENBQXNCVSxZQUFZVyxNQUFsQyxDQUNBLEtBQUtwQixlQUFMLENBQXVCVSxhQUFlQSxhQUFhVSxNQUE1QixDQUFxQyxDQUE1RCxDQUNBO0FBQ0QsQ0FKRCxJQUlPLElBQUlYLFlBQVlXLE1BQVosRUFBc0IsS0FBS3JCLGNBQTNCLEVBQ0RXLGFBQWFVLE1BQWIsRUFBdUIsS0FBS3BCLGVBRC9CLENBQ2dELENBQ3JELEtBQU0sSUFBSW1CLE1BQUosQ0FBVSxxQkFBVixDQUFOLENBQ0QsQ0FDRixDLHVDQUdZckIsTyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByYXBpZE1peEFkYXB0ZXJzIGZyb20gJ3JhcGlkLW1peC1hZGFwdGVycyc7XG5cbi8vIHNvdXJjZSA6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE1MjUxODc5L2hvdy10by1jaGVjay1pZi1hLXZhcmlhYmxlLWlzLWEtdHlwZWQtYXJyYXktaW4tamF2YXNjcmlwdFxuY29uc3QgaXNBcnJheSA9IHYgPT4ge1xuICByZXR1cm4gdi5jb25zdHJ1Y3RvciA9PT0gRmxvYXQzMkFycmF5IHx8XG4gICAgICAgICB2LmNvbnN0cnVjdG9yID09PSBGbG9hdDY0QXJyYXkgfHxcbiAgICAgICAgIEFycmF5LmlzQXJyYXkodik7XG59O1xuXG4vKipcbiAqIENsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHRyYWluaW5nIGV4YW1wbGUgKGUuZy4gdGltZSBzZXJpZSBvZiB2ZWN0b3JzXG4gKiB0aGF0IHJlcHJlc2VudHMgYSBnZXN0dXJlKS5cbiAqIElmIG5vIHBhcmFtZXRlcnMgYXJlIGdpdmVuLCB0aGUgZGltZW5zaW9ucyB3aWxsIGJlIGd1ZXNzZWQgZnJvbSB0aGUgZmlyc3RcbiAqIGFkZGVkIGVsZW1lbnQgYWZ0ZXIgaW5zdGFudGlhdGlvbiBvZiB0aGUgY2xhc3MgYW5kIGFmdGVyIGVhY2ggY2FsbCB0byBjbGVhci5cbiAqIElmIHBhcmFtZXRlcnMgYXJlIGdpdmVuLCB0aGV5IHdpbGwgYmUgdXNlZCB0byBzdHJpY3RseSBjaGVjayBhbnkgbmV3IGVsZW1lbnQsXG4gKiBhbnl0aW1lLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW5wdXREaW1lbnNpb249bnVsbF0gLSBJZiBkZWZpbmVkLCBkZWZpbml0aXZlIGlucHV0IGRpbWVuc2lvblxuICogICAgdGhhdCB3aWxsIGJlIGNoZWNrZWQgdG8gdmFsaWRhdGUgYW55IG5ldyBlbGVtZW50IGFkZGVkLlxuICogQHBhcmFtIHtOdW1iZXJ9IFtvdXRwdXREaW1lbnNpb249bnVsbF0gLSBJZiBkZWZpbmVkLCBkZWZpbml0aXZlIG91dHB1dCBkaW1lbnNpb25cbiAqICAgIHRoYXQgd2lsbCBiZSBjaGVja2VkIHRvIHZhbGlkYXRlIGFueSBuZXcgZWxlbWVudCBhZGRlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0ICogYXMgbWFubyBmcm9tICdtYW5vLWpzL2NsaWVudCc7XG4gKlxuICogY29uc3QgZXhhbXBsZSA9IG5ldyBtYW5vLkV4YW1wbGUoKTtcbiAqIGNvbnN0IHRyYWluaW5nU2V0ID0gbmV3IG1hbm8uVHJhaW5pbmdTZXQoKTtcbiAqXG4gKiBleGFtcGxlLnNldExhYmVsKCd0ZXN0Jyk7XG4gKiBleGFtcGxlLmFkZEVsZW1lbnQoWzAsIDEsIDIsIDNdKTtcbiAqIGNvbnN0IHJhcGlkTWl4SnNvbkV4YW1wbGUgPSBleGFtcGxlLnRvSlNPTigpO1xuICpcbiAqIHRyYWluaW5nU2V0LmFkZEV4YW1wbGUocmFwaWRNaXhKc29uRXhhbXBsZSk7XG4gKi9cbmNsYXNzIEV4YW1wbGUge1xuICBjb25zdHJ1Y3RvcihpbnB1dERpbWVuc2lvbiA9IG51bGwsIG91dHB1dERpbWVuc2lvbiA9IG51bGwpIHtcbiAgICBpZiAoaW5wdXREaW1lbnNpb24gIT09IG51bGwpIHtcbiAgICAgIHRoaXMuZml4ZWREaW1lbnNpb25zID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5wdXREaW1lbnNpb24gPSBpbnB1dERpbWVuc2lvbjtcbiAgICAgIHRoaXMub3V0cHV0RGltZW5zaW9uID0gb3V0cHV0RGltZW5zaW9uICE9PSBudWxsID8gb3V0cHV0RGltZW5zaW9uIDogMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maXhlZERpbWVuc2lvbnMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmxhYmVsID0gcmFwaWRNaXhBZGFwdGVycy5SQVBJRF9NSVhfREVGQVVMVF9MQUJFTDtcbiAgICB0aGlzLmNsZWFyKCk7XG5cbiAgICB0aGlzLmFkZEVsZW1lbnQgPSB0aGlzLmFkZEVsZW1lbnQuYmluZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgaW50ZXJuYWwgdmFyaWFibGVzIHNvIHRoYXQgd2UgYXJlIHJlYWR5IHRvIHJlY29yZCBhIG5ldyBleGFtcGxlLlxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgaWYgKCF0aGlzLmZpeGVkRGltZW5zaW9ucykge1xuICAgICAgdGhpcy5pbnB1dERpbWVuc2lvbiA9IG51bGw7XG4gICAgICB0aGlzLm91dHB1dERpbWVuc2lvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5pbnB1dCA9IFtdO1xuICAgIHRoaXMub3V0cHV0ID0gW107XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBleGFtcGxlJ3MgY3VycmVudCBsYWJlbC5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGxhYmVsIC0gVGhlIG5ldyBsYWJlbCB0byBhc3NpZ24gdG8gdGhlIGNsYXNzLlxuICAgKi9cbiAgc2V0TGFiZWwobGFiZWwpIHtcbiAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGVsZW1lbnQgdG8gdGhlIGN1cnJlbnQgZXhhbXBsZS5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheS5OdW1iZXJ8RmxvYXQzMkFycmF5fEZsb2F0NjRBcnJheX0gaW5wdXRWZWN0b3IgLSBUaGUgaW5wdXRcbiAgICogcGFydCBvZiB0aGUgZWxlbWVudCB0byBhZGQuXG4gICAqIEBwYXJhbSB7QXJyYXkuTnVtYmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl9IFtvdXRwdXRWZWN0b3I9bnVsbF0gLSBUaGVcbiAgICogb3V0cHV0IHBhcnQgb2YgdGhlIGVsZW1lbnQgdG8gYWRkLlxuICAgKlxuICAgKiBAdGhyb3dzIEFuIGVycm9yIGlmIGlucHV0VmVjdG9yIG9yIG91dHB1dFZlY3RvciBkaW1lbnNpb25zIG1pc21hdGNoLlxuICAgKi9cbiAgYWRkRWxlbWVudChpbnB1dFZlY3Rvciwgb3V0cHV0VmVjdG9yID0gbnVsbCkge1xuICAgIHRoaXMuX3ZhbGlkYXRlSW5wdXRBbmRVcGRhdGVEaW1lbnNpb25zKGlucHV0VmVjdG9yLCBvdXRwdXRWZWN0b3IpO1xuXG4gICAgaWYgKGlucHV0VmVjdG9yIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8XG4gICAgICAgIGlucHV0VmVjdG9yIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KVxuICAgICAgaW5wdXRWZWN0b3IgPSBBcnJheS5mcm9tKGlucHV0VmVjdG9yKTtcblxuICAgIGlmIChvdXRwdXRWZWN0b3IgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHxcbiAgICAgICAgb3V0cHV0VmVjdG9yIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KVxuICAgICAgb3V0cHV0VmVjdG9yID0gQXJyYXkuZnJvbShvdXRwdXRWZWN0b3IpO1xuXG4gICAgdGhpcy5pbnB1dC5wdXNoKGlucHV0VmVjdG9yKTtcblxuICAgIGlmICh0aGlzLm91dHB1dERpbWVuc2lvbiA+IDApXG4gICAgICB0aGlzLm91dHB1dC5wdXNoKG91dHB1dFZlY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBleGFtcGxlIGluIFJhcGlkTWl4IEpTT04gZm9ybWF0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBBIFJhcGlkTWl4IGNvbXBsaWFudCBleGFtcGxlIG9iamVjdC5cbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZG9jVHlwZTogJ3JhcGlkLW1peDpleGFtcGxlJyxcbiAgICAgIGRvY1ZlcnNpb246IHJhcGlkTWl4Q29uc3RhbnRzLnJhcGlkTWl4RG9jVmVyc2lvbixcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgbGFiZWw6IHRoaXMubGFiZWwsXG4gICAgICAgIC8vIGlucHV0RGltZW5zaW9uOiB0aGlzLmlucHV0RGltZW5zaW9uLFxuICAgICAgICAvLyBvdXRwdXREaW1lbnNpb246IHRoaXMub3V0cHV0RGltZW5zaW9uLFxuICAgICAgICBpbnB1dDogdGhpcy5pbnB1dC5zbGljZSgwKSxcbiAgICAgICAgb3V0cHV0OiB0aGlzLm91dHB1dC5zbGljZSgwKSxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqIEBwcml2YXRlICovXG4gIF92YWxpZGF0ZUlucHV0QW5kVXBkYXRlRGltZW5zaW9ucyhpbnB1dFZlY3Rvciwgb3V0cHV0VmVjdG9yKSB7XG4gICAgaWYgKCFpc0FycmF5KGlucHV0VmVjdG9yKSB8fCAob3V0cHV0VmVjdG9yICYmICFpc0FycmF5KG91dHB1dFZlY3RvcikpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lucHV0VmVjdG9yIGFuZCBvdXRwdXRWZWN0b3IgbXVzdCBiZSBhcnJheXMnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaW5wdXREaW1lbnNpb24gfHwgIXRoaXMub3V0cHV0RGltZW5zaW9uKSB7XG4gICAgICB0aGlzLmlucHV0RGltZW5zaW9uID0gaW5wdXRWZWN0b3IubGVuZ3RoO1xuICAgICAgdGhpcy5vdXRwdXREaW1lbnNpb24gPSBvdXRwdXRWZWN0b3IgPyBvdXRwdXRWZWN0b3IubGVuZ3RoIDogMDtcbiAgICAgIC8vIHRoaXMuX2VtcHR5ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpbnB1dFZlY3Rvci5sZW5ndGggIT0gdGhpcy5pbnB1dERpbWVuc2lvbiB8fFxuICAgICAgICAgICAgICBvdXRwdXRWZWN0b3IubGVuZ3RoICE9IHRoaXMub3V0cHV0RGltZW5zaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RpbWVuc2lvbnMgbWlzbWF0Y2gnKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXhhbXBsZTtcbiJdfQ== \ No newline at end of file diff --git a/common/TrainingSet.js b/common/TrainingSet.js index 4483067..acbcd8d 100644 --- a/common/TrainingSet.js +++ b/common/TrainingSet.js @@ -1,4 +1,4 @@ -'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _classCallCheck2=require('babel-runtime/helpers/classCallCheck');var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=require('babel-runtime/helpers/createClass');var _createClass3=_interopRequireDefault(_createClass2);var _rapidMixAdapters=require('rapid-mix-adapters');var _Example=require('./Example');var _Example2=_interopRequireDefault(_Example);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}// source : https://stackoverflow.com/questions/15251879/how-to-check-if-a-variable-is-a-typed-array-in-javascript +'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _classCallCheck2=require('babel-runtime/helpers/classCallCheck');var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=require('babel-runtime/helpers/createClass');var _createClass3=_interopRequireDefault(_createClass2);var _rapidMixAdapters=require('rapid-mix-adapters');var _rapidMixAdapters2=_interopRequireDefault(_rapidMixAdapters);var _Example=require('./Example');var _Example2=_interopRequireDefault(_Example);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}// source : https://stackoverflow.com/questions/15251879/how-to-check-if-a-variable-is-a-typed-array-in-javascript var isArray=function isArray(v){return v.constructor===Float32Array||v.constructor===Float64Array||Array.isArray(v);};/** * Manage and format a set of recorded examples, maintain a RapidMix compliant * training set. @@ -46,7 +46,7 @@ var isArray=function isArray(v){return v.constructor===Float32Array||v.construct * Return the RapidMix compliant training set in JSON format. * * @return {JSON} - Training set. - */},{key:'toJSON',value:function toJSON(){return{docType:'rapid-mix:training-set',docVersion:_rapidMixAdapters.constants.rapidMixDocVersion,payload:{inputDimension:this.inputDimension,outputDimension:this.outputDimension,data:this.data}};}/** + */},{key:'toJSON',value:function toJSON(){return{docType:'rapid-mix:training-set',docVersion:_rapidMixAdapters2.default.RAPID_MIX_DOC_VERSION,payload:{inputDimension:this.inputDimension,outputDimension:this.outputDimension,data:this.data}};}/** * Return an array of the current training set labels. * * @return {Array.String} - Training set sorted labels. @@ -61,4 +61,4 @@ var isArray=function isArray(v){return v.constructor===Float32Array||v.construct */},{key:'removeExampleAtIndex',value:function removeExampleAtIndex(index){this.data.splice(index,1);}/** @private */},{key:'_checkDimensions',value:function _checkDimensions(inputVector,outputVector){if(!isArray(inputVector)||outputVector&&!isArray(outputVector)){throw new Error('inputFrame and outputFrame must be arrays');}// set this back to true where appropriate if we add removeExample etc methods if(!this.inputDimension||!this.outputDimension){this.inputDimension=inputVector.length;this.outputDimension=outputVector?outputVector.length:0;// this._empty = false; }else if(inputVector.length!=this.inputDimension||outputVector.length!=this.outputDimension){throw new Error('dimensions mismatch');}}},{key:'length',get:function get(){return this.data.length;}}]);return TrainingSet;}();exports.default=TrainingSet; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImlzQXJyYXkiLCJ2IiwiY29uc3RydWN0b3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJBcnJheSIsIlRyYWluaW5nU2V0IiwiaW5wdXREaW1lbnNpb24iLCJvdXRwdXREaW1lbnNpb24iLCJjb2x1bW5OYW1lcyIsImZpeGVkRGltZW5zaW9ucyIsImNsZWFyIiwiZGF0YSIsImV4YW1wbGUiLCJlIiwicGF5bG9hZCIsIl9jaGVja0RpbWVuc2lvbnMiLCJpbnB1dCIsIm91dHB1dCIsImxlbmd0aCIsIkVycm9yIiwicHVzaCIsImxhYmVsIiwidHJhaW5pbmdTZXQiLCJleGFtcGxlcyIsImkiLCJzZXQiLCJkb2NUeXBlIiwiZG9jVmVyc2lvbiIsInJhcGlkTWl4RG9jVmVyc2lvbiIsImxhYmVscyIsImluZGV4T2YiLCJzb3J0IiwiZmlsdGVyIiwiZGF0dW0iLCJpbmRleCIsInNwbGljZSIsImlucHV0VmVjdG9yIiwib3V0cHV0VmVjdG9yIl0sIm1hcHBpbmdzIjoiZ1VBQUEsb0RBQ0Esa0Msa0lBRUE7QUFDQSxHQUFNQSxTQUFVLFFBQVZBLFFBQVUsR0FBSyxDQUNuQixNQUFPQyxHQUFFQyxXQUFGLEdBQWtCQyxZQUFsQixFQUNBRixFQUFFQyxXQUFGLEdBQWtCRSxZQURsQixFQUVBQyxNQUFNTCxPQUFOLENBQWNDLENBQWQsQ0FGUCxDQUdELENBSkQsQ0FNQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUEyQk1LLFksWUFDSixzQkFBNkUsSUFBakVDLGVBQWlFLDJEQUFoRCxJQUFnRCxJQUExQ0MsZ0JBQTBDLDJEQUF4QixJQUF3QixJQUFsQkMsWUFBa0IsMkRBQUosRUFBSSxnREFDM0UsR0FBSUYsaUJBQW1CLElBQXZCLENBQTZCLENBQzNCLEtBQUtHLGVBQUwsQ0FBdUIsSUFBdkIsQ0FDQSxLQUFLSCxjQUFMLENBQXNCQSxjQUF0QixDQUNBLEtBQUtDLGVBQUwsQ0FBdUJBLGtCQUFvQixJQUFwQixDQUEy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WixLQUFOLEdBQWdCQSxLQUF6QixFQUFqQixDQUFaLENBQ0QsQ0FFRDs7Ozt1RUFLcUJhLEssQ0FBTyxDQUMxQixLQUFLdkIsSUFBTCxDQUFVd0IsTUFBVixDQUFpQkQsS0FBakIsQ0FBd0IsQ0FBeEIsRUFDRCxDQUVELGUsMERBQ2lCRSxXLENBQWFDLFksQ0FBYyxDQUMxQyxHQUFJLENBQUN0QyxRQUFRcUMsV0FBUixDQUFELEVBQTBCQyxjQUFnQixDQUFDdEMsUUFBUXNDLFlBQVIsQ0FBL0MsQ0FBdUUsQ0FDckUsS0FBTSxJQUFJbEIsTUFBSixDQUFVLDJDQUFWLENBQU4sQ0FDRCxDQUNEO0FBQ0EsR0FBSSxDQUFDLEtBQUtiLGNBQU4sRUFBd0IsQ0FBQyxLQUFLQyxlQUFsQyxDQUFtRCxDQUNqRCxLQUFLRCxjQUFMLENBQXNCOEIsWUFBWWxCLE1BQWxDLENBQ0EsS0FBS1gsZUFBTCxDQUF1QjhCLGFBQWVBLGFBQWFuQixNQUE1QixDQUFxQyxDQUE1RCxDQUNBO0FBQ0QsQ0FKRCxJQUlPLElBQUlrQixZQUFZbEIsTUFBWixFQUFzQixLQUFLWixjQUEzQixFQUNBK0IsYUFBYW5CLE1BQWIsRUFBdUIsS0FBS1gsZUFEaEMsQ0FDaUQsQ0FDdEQsS0FBTSxJQUFJWSxNQUFKLENBQVUscUJBQVYsQ0FBTixDQUNELENBQ0YsQyxrQ0E5SVksQ0FDWCxNQUFPLE1BQUtSLElBQUwsQ0FBVU8sTUFBakIsQ0FDRCxDLDJDQStJWWIsVyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbnN0YW50cyBhcyByYXBpZE1peENvbnN0YW50cyB9IGZyb20gJ3JhcGlkLW1peC1hZGFwdGVycyc7XG5pbXBvcnQgRXhhbXBsZSBmcm9tICcuL0V4YW1wbGUnO1xuXG4vLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTI1MTg3OS9ob3ctdG8tY2hlY2staWYtYS12YXJpYWJsZS1pcy1hLXR5cGVkLWFycmF5LWluLWphdmFzY3JpcHRcbmNvbnN0IGlzQXJyYXkgPSB2ID0+IHtcbiAgcmV0dXJuIHYuY29uc3RydWN0b3IgPT09IEZsb2F0MzJBcnJheSB8fFxuICAgICAgICAgdi5jb25zdHJ1Y3RvciA9PT0gRmxvYXQ2NEFycmF5IHx8XG4gICAgICAgICBBcnJheS5pc0FycmF5KHYpO1xufTtcblxuLyoqXG4gKiBNYW5hZ2UgYW5kIGZvcm1hdCBhIHNldCBvZiByZWNvcmRlZCBleGFtcGxlcywgbWFpbnRhaW4gYSBSYXBpZE1peCBjb21wbGlhbnRcbiAqIHRyYWluaW5nIHNldC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gW2lucHV0RGltZW5zaW9uPW51bGxdIC0gSW5wdXQgZGltZW5zaW9uXG4gKiAgKGlmIGBudWxsYCwgaXMgZ3Vlc3NlZCBmcm9tIHRoZSBmaXJzdCByZWNvcmRlZCBlbGVtZW50KVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvdXRwdXREaW1lbnNpb249bnVsbF0gLSBPdXRwdXQgZGltZW5zaW9uLlxuICogIChpZiBgbnVsbGAsIGlzIGd1ZXNzZWQgZnJvbSB0aGUgZmlyc3QgcmVjb3JkZWQgZWxlbWVudCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCAqIGFzIG1hbm8gZnJvbSAnbWFuby1qcy9jbGllbnQnO1xuICpcbiAqIGNvbnN0IGV4YW1wbGUgPSBuZXcgbWFuby5FeGFtcGxlKCk7XG4gKiBjb25zdCB0cmFpbmluZ1NldCA9IG5ldyBtYW5vLlRyYWluaW5nU2V0KCk7XG4gKiBjb25zdCB4bW1Qcm9jZXNzb3IgPSBuZXcgbWFuby5YbW1Qcm9jZXNzc29yKCk7XG4gKlxuICogZXhhbXBsZS5zZXRMYWJlbCgndGVzdCcpO1xuICogZXhhbXBsZS5hZGRFbGVtZW50KFswLCAxLCAyLCAzXSk7XG4gKiBjb25zdCByYXBpZE1peEpzb25FeGFtcGxlID0gZXhhbXBsZS50b0pTT04oKTtcbiAqXG4gKiB0cmFpbmluZ1NldC5hZGRFeGFtcGxlKHJhcGlkTWl4SnNvbkV4YW1wbGUpO1xuICogY29uc3QgcmFwaWRNaXhKc29uVHJhaW5pbmdTZXQgPSB0cmFpbmluZ1NldC50b0pTT04oKTtcbiAqXG4gKiB4bW1Qcm9jZXNzb3JcbiAqICAgLnRyYWluKHJhcGlkTWl4SnNvblRyYWluaW5nU2V0KVxuICogICAudGhlbigoKSA9PiB7IC4uLiB9KTtcbiAqL1xuY2xhc3MgVHJhaW5pbmdTZXQge1xuICBjb25zdHJ1Y3RvcihpbnB1dERpbWVuc2lvbiA9IG51bGwsIG91dHB1dERpbWVuc2lvbiA9IG51bGwsIGNvbHVtbk5hbWVzID0gW10pIHtcbiAgICBpZiAoaW5wdXREaW1lbnNpb24gIT09IG51bGwpIHtcbiAgICAgIHRoaXMuZml4ZWREaW1lbnNpb25zID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5wdXREaW1lbnNpb24gPSBpbnB1dERpbWVuc2lvbjtcbiAgICAgIHRoaXMub3V0cHV0RGltZW5zaW9uID0gb3V0cHV0RGltZW5zaW9uICE9PSBudWxsID8gb3V0cHV0RGltZW5zaW9uIDogMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maXhlZERpbWVuc2lvbnMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbHVtbk5hbWVzID0gY29sdW1uTmFtZXM7XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGV4YW1wbGVzLlxuICAgKi9cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgdHJhaW5pbmcgc2V0LlxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgaWYgKCF0aGlzLmZpeGVkRGltZW5zaW9ucykge1xuICAgICAgdGhpcy5pbnB1dERpbWVuc2lvbiA9IG51bGw7XG4gICAgICB0aGlzLm91dHB1dERpbWVuc2lvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhID0gW107XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGV4YW1wbGUgdG8gdGhlIHRyYWluaW5nIHNldC5cbiAgICpcbiAgICogQHBhcmFtIHtKU09OfSBleGFtcGxlIC0gQSBSYXBpZE1peCBmb3JtYXR0ZWQgZXhhbXBsZS5cbiAgICovXG4gIGFkZEV4YW1wbGUoZXhhbXBsZSkge1xuICAgIGNvbnN0IGUgPSBleGFtcGxlLnBheWxvYWQ7XG4gICAgdGhpcy5fY2hlY2tEaW1lbnNpb25zKGUuaW5wdXRbMF0sIGUub3V0cHV0WzBdKTtcblxuICAgIGlmIChlLmlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleGFtcGxlcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGlucHV0IHZlY3RvcicpO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YS5wdXNoKHtcbiAgICAgIGxhYmVsOiBlLmxhYmVsLFxuICAgICAgaW5wdXQ6IGUuaW5wdXQsXG4gICAgICBvdXRwdXQ6IGUub3V0cHV0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbGwgZXhhbXBsZXMgZnJvbSBhbm90aGVyIFJhcGlkTWl4IEpTT04gdHJhaW5pbmcgc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge0pTT059IHRyYWluaW5nU2V0IC0gQSBSYXBpZE1peCBjb21wbGlhbnQgdHJhaW5pbmcgc2V0LlxuICAgKi9cbiAgYWRkVHJhaW5pbmdTZXQodHJhaW5pbmdTZXQpIHtcbiAgICBjb25zdCBleGFtcGxlcyA9IHRyYWluaW5nU2V0LnBheWxvYWQuZGF0YTtcbiAgICBsZXQgZSA9IGV4YW1wbGVzWzBdO1xuICAgIHRoaXMuX2NoZWNrRGltZW5zaW9ucyhlLmlucHV0WzBdLCBlLm91dHB1dFswXSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4YW1wbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBlID0gZXhhbXBsZXNbaV07XG5cbiAgICAgIHRoaXMuZGF0YS5wdXNoKHtcbiAgICAgICAgbGFiZWw6IGUubGFiZWwsXG4gICAgICAgIGlucHV0OiBlLmlucHV0LFxuICAgICAgICBvdXRwdXQ6IGUub3V0cHV0LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgZnJvbSBhbm90aGVyIFJhcGlkTWl4IEpTT04gdHJhaW5pbmcgc2V0LiBJZiBgbnVsbGAsIGNsZWFyIHRoZVxuICAgKiB0cmFpbmluZ1NldC5cbiAgICpcbiAgICogQHBhcmFtIHtKU09OfSB0cmFpbmluZ1NldCAtIEEgUmFwaWRNaXggY29tcGxpYW50IHRyYWluaW5nIHNldC5cbiAgICovXG4gIHNldFRyYWluaW5nU2V0KHRyYWluaW5nU2V0ID0gbnVsbCkge1xuICAgIGlmICh0cmFpbmluZ1NldCA9PT0gbnVsbClcbiAgICAgIHJldHVybiB0aGlzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBzZXQgPSB0cmFpbmluZ1NldC5wYXlsb2FkO1xuXG4gICAgdGhpcy5pbnB1dERpbWVuc2lvbiA9IHNldC5pbnB1dERpbWVuc2lvbjtcbiAgICB0aGlzLm91dHB1dERpbWVuc2lvbiA9IHNldC5vdXRwdXREaW1lbnNpb247XG4gICAgdGhpcy5kYXRhID0gc2V0LmRhdGE7XG4gICAgdGhpcy5jb2x1bW5OYW1lcyA9IHNldC5jb2x1bW5OYW1lcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIFJhcGlkTWl4IGNvbXBsaWFudCB0cmFpbmluZyBzZXQgaW4gSlNPTiBmb3JtYXQuXG4gICAqXG4gICAqIEByZXR1cm4ge0pTT059IC0gVHJhaW5pbmcgc2V0LlxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkb2NUeXBlOiAncmFwaWQtbWl4OnRyYWluaW5nLXNldCcsXG4gICAgICBkb2NWZXJzaW9uOiByYXBpZE1peENvbnN0YW50cy5yYXBpZE1peERvY1ZlcnNpb24sXG4gICAgICBwYXlsb2FkOiB7XG4gICAgICAgIGlucHV0RGltZW5zaW9uOiB0aGlzLmlucHV0RGltZW5zaW9uLFxuICAgICAgICBvdXRwdXREaW1lbnNpb246IHRoaXMub3V0cHV0RGltZW5zaW9uLFxuICAgICAgICBkYXRhOiB0aGlzLmRhdGEsXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgdHJhaW5pbmcgc2V0IGxhYmVscy5cbiAgICpcbiAgICogQHJldHVybiB7QXJyYXkuU3RyaW5nfSAtIFRyYWluaW5nIHNldCBzb3J0ZWQgbGFiZWxzLlxuICAgKi9cbiAgZ2V0TGFiZWxzKCkge1xuICAgIGNvbnN0IGxhYmVscyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5kYXRhW2ldLmxhYmVsO1xuXG4gICAgICBpZiAobGFiZWxzLmluZGV4T2YobGFiZWwpID09PSAtMSlcbiAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpO1xuICAgIH1cblxuICAgIHJldHVybiBsYWJlbHMuc29ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbGwgZXhhbXBsZXMgb2YgYSBjZXJ0YWluIGxhYmVsLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbGFiZWwgLSBUaGUgbGFiZWwgb2YgdGhlIHJlY29yZGluZ3MgdG8gYmUgcmVtb3ZlZC5cbiAgICovXG4gIHJlbW92ZUV4YW1wbGVzQnlMYWJlbChsYWJlbCkge1xuICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5maWx0ZXIoZGF0dW0gPT4gZGF0dW0ubGFiZWwgIT09IGxhYmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXhhbXBsZSBhdCBpbmRleC5cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBleGFtcGxlIHRvIHJlbW92ZS5cbiAgICovXG4gIHJlbW92ZUV4YW1wbGVBdEluZGV4KGluZGV4KSB7XG4gICAgdGhpcy5kYXRhLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvKiogQHByaXZhdGUgKi9cbiAgX2NoZWNrRGltZW5zaW9ucyhpbnB1dFZlY3Rvciwgb3V0cHV0VmVjdG9yKcKge1xuICAgIGlmICghaXNBcnJheShpbnB1dFZlY3RvcikgfHwgKG91dHB1dFZlY3RvciAmJiAhaXNBcnJheShvdXRwdXRWZWN0b3IpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnB1dEZyYW1lIGFuZCBvdXRwdXRGcmFtZSBtdXN0IGJlIGFycmF5cycpO1xuICAgIH1cbiAgICAvLyBzZXQgdGhpcyBiYWNrIHRvIHRydWUgd2hlcmUgYXBwcm9wcmlhdGUgaWYgd2UgYWRkIHJlbW92ZUV4YW1wbGUgZXRjIG1ldGhvZHNcbiAgICBpZiAoIXRoaXMuaW5wdXREaW1lbnNpb24gfHwgIXRoaXMub3V0cHV0RGltZW5zaW9uKSB7XG4gICAgICB0aGlzLmlucHV0RGltZW5zaW9uID0gaW5wdXRWZWN0b3IubGVuZ3RoO1xuICAgICAgdGhpcy5vdXRwdXREaW1lbnNpb24gPSBvdXRwdXRWZWN0b3IgPyBvdXRwdXRWZWN0b3IubGVuZ3RoIDogMDtcbiAgICAgIC8vIHRoaXMuX2VtcHR5ID0gZmFsc2U7XG4gICAgfSBlbHNlIGlmIChpbnB1dFZlY3Rvci5sZW5ndGggIT0gdGhpcy5pbnB1dERpbWVuc2lvbiB8fFxuICAgICAgICAgICAgICAgb3V0cHV0VmVjdG9yLmxlbmd0aCAhPSB0aGlzLm91dHB1dERpbWVuc2lvbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdkaW1lbnNpb25zIG1pc21hdGNoJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRyYWluaW5nU2V0O1xuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbImlzQXJyYXkiLCJ2IiwiY29uc3RydWN0b3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJBcnJheSIsIlRyYWluaW5nU2V0IiwiaW5wdXREaW1lbnNpb24iLCJvdXRwdXREaW1lbnNpb24iLCJjb2x1bW5OYW1lcyIsImZpeGVkRGltZW5zaW9ucyIsImNsZWFyIiwiZGF0YSIsImV4YW1wbGUiLCJlIiwicGF5bG9hZCIsIl9jaGVja0RpbWVuc2lvbnMiLCJpbnB1dCIsIm91dHB1dCIsImxlbmd0aCIsIkVycm9yIiwicHVzaCIsImxhYmVsIiwidHJhaW5pbmdTZXQiLCJleGFtcGxlcyIsImkiLCJzZXQiLCJkb2NUeXBlIiwiZG9jVmVyc2lvbiIsIlJBUElEX01JWF9ET0NfVkVSU0lPTiIsImxhYmVscyIsImluZGV4T2YiLCJzb3J0IiwiZmlsdGVyIiwiZGF0dW0iLCJpbmRleCIsInNwbGljZSIsImlucHV0VmVjdG9yIiwib3V0cHV0VmVjdG9yIl0sIm1hcHBpbmdzIjoiZ1VBQUEsb0QsaUVBQ0Esa0Msa0lBRUE7QUFDQSxHQUFNQSxTQUFVLFFBQVZBLFFBQVUsR0FBSyxDQUNuQixNQUFPQyxHQUFFQyxXQUFGLEdBQWtCQyxZQUFsQixFQUNBRixFQUFFQyxXQUFGLEdBQWtCRSxZQURsQixFQUVBQyxNQUFNTCxPQUFOLENBQWNDLENBQWQsQ0FGUCxDQUdELENBSkQsQ0FNQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUEyQk1LLFksWUFDSixzQkFBNkUsSUFBakVDLGVBQWlFLDJEQUFoRCxJQUFnRCxJQUExQ0MsZ0JBQTBDLDJEQUF4QixJQUF3QixJQUFsQkMsWUFBa0IsMkRBQUosRUFBSSxnREFDM0UsR0FBSUYsaUJBQW1CLElBQXZCLENBQTZCLENBQzNCLEtBQUtHLGVBQUwsQ0FBdUIsSUFBdkIsQ0FDQSxLQUFLSCxjQUFMLENBQXNCQSxjQUF0QixDQUNBLEtBQUtDLGVBQUwsQ0FBdUJBLGtCQUFvQixJQUFwQixDQUEyQkEsZUFBM0IsQ0FBNkMsQ0FBcEUsQ0FDRCxDQUpELElBSU8sQ0FDTCxLQUFLRSxlQUFMLENBQXVCLEtBQXZCLENBQ0QsQ0FFRCxLQUFLRCxXQUFMLENBQW1CQSxXQUFuQixDQUNBLEtBQUtFLEtBQUwsR0FDRCxDQUVEOzt5REFPQTs7MkJBR1EsQ0FDTixHQUFJLENBQUMsS0FBS0QsZUFBVixDQUEyQixDQUN6QixLQUFLSCxjQUFMLENBQXNCLElBQXRCLENBQ0EsS0FBS0MsZUFBTCxDQUF1QixJQUF2QixDQUNELENBRUQsS0FBS0ksSUFBTCxDQUFZLEVBQVosQ0FDRCxDQUVEOzs7O21EQUtXQyxPLENBQVMsQ0FDbEIsR0FBTUMsR0FBSUQsUUFBUUUsT0FBbEIsQ0FDQSxLQUFLQyxnQkFBTCxDQUFzQkYsRUFBRUcsS0FBRixDQUFRLENBQVIsQ0FBdEIsQ0FBa0NILEVBQUVJLE1BQUYsQ0FBUyxDQUFULENBQWxDLEVBRUEsR0FBSUosRUFBRUcsS0FBRixDQUFRRSxNQUFSLEdBQW1CLENBQXZCLENBQTBCLENBQ3hCLEtBQU0sSUFBSUMsTUFBSixDQUFVLGlEQUFWLENBQU4sQ0FDRCxDQUVELEtBQUtSLElBQUwsQ0FBVVMsSUFBVixDQUFlLENBQ2JDLE1BQU9SLEVBQUVRLEtBREksQ0FFYkwsTUFBT0gsRUFBRUcsS0FGSSxDQUdiQyxPQUFRSixFQUFFSSxNQUhHLENBQWYsRUFLRCxDQUVEOzs7OzJEQUtlSyxXLENBQWEsQ0FDMUIsR0FBTUMsVUFBV0QsWUFBWVIsT0FBWixDQUFvQkgsSUFBckMsQ0FDQSxHQUFJRSxHQUFJVSxTQUFTLENBQVQsQ0FBUixDQUNBLEtBQUtSLGdCQUFMLENBQXNCRixFQUFFRyxLQUFGLENBQVEsQ0FBUixDQUF0QixDQUFrQ0gsRUFBRUksTUFBRixDQUFTLENBQVQsQ0FBbEMsRUFFQSxJQUFLLEdBQUlPLEdBQUksQ0FBYixDQUFnQkEsRUFBSUQsU0FBU0wsTUFBN0IsQ0FBcUNNLEdBQXJDLENBQTBDLENBQ3hDWCxFQUFJVSxTQUFTQyxDQUFULENBQUosQ0FFQSxLQUFLYixJQUFMLENBQVVTLElBQVYsQ0FBZSxDQUNiQyxNQUFPUixFQUFFUSxLQURJLENBRWJMLE1BQU9ILEVBQUVHLEtBRkksQ0FHYkMsT0FBUUosRUFBRUksTUFIRyxDQUFmLEVBS0QsQ0FDRixDQUVEOzs7Ozs0REFNbUMsSUFBcEJLLFlBQW9CLDJEQUFOLElBQU0sQ0FDakMsR0FBSUEsY0FBZ0IsSUFBcEIsQ0FDRSxNQUFPLE1BQUtaLEtBQUwsRUFBUCxDQUVGLEdBQU1lLEtBQU1ILFlBQVlSLE9BQXhCLENBRUEsS0FBS1IsY0FBTCxDQUFzQm1CLElBQUluQixjQUExQixDQUNBLEtBQUtDLGVBQUwsQ0FBdUJrQixJQUFJbEIsZUFBM0IsQ0FDQSxLQUFLSSxJQUFMLENBQVljLElBQUlkLElBQWhCLENBQ0EsS0FBS0gsV0FBTCxDQUFtQmlCLElBQUlqQixXQUF2QixDQUNELENBRUQ7Ozs7NENBS1MsQ0FDUCxNQUFPLENBQ0xrQixRQUFTLHdCQURKLENBRUxDLFdBQVksMkJBQWlCQyxxQkFGeEIsQ0FHTGQsUUFBUyxDQUNQUixlQUFnQixLQUFLQSxjQURkLENBRVBDLGdCQUFpQixLQUFLQSxlQUZmLENBR1BJLEtBQU0sS0FBS0EsSUFISixDQUhKLENBQVAsQ0FTRCxDQUVEOzs7O2tEQUtZLENBQ1YsR0FBTWtCLFFBQVMsRUFBZixDQUVBLElBQUssR0FBSUwsR0FBSSxDQUFiLENBQWdCQSxFQUFJLEtBQUtiLElBQUwsQ0FBVU8sTUFBOUIsQ0FBc0NNLEdBQXRDLENBQTJDLENBQ3pDLEdBQU1ILE9BQVEsS0FBS1YsSUFBTCxDQUFVYSxDQUFWLEVBQWFILEtBQTNCLENBRUEsR0FBSVEsT0FBT0MsT0FBUCxDQUFlVCxLQUFmLElBQTBCLENBQUMsQ0FBL0IsQ0FDRVEsT0FBT1QsSUFBUCxDQUFZQyxLQUFaLEVBQ0gsQ0FFRCxNQUFPUSxRQUFPRSxJQUFQLEVBQVAsQ0FDRCxDQUVEOzs7O3lFQUtzQlYsSyxDQUFPLENBQzNCLEtBQUtWLElBQUwsQ0FBWSxLQUFLQSxJQUFMLENBQVVxQixNQUFWLENBQWlCLHNCQUFTQyxPQUFNWixLQUFOLEdBQWdCQSxLQUF6QixFQUFqQixDQUFaLENBQ0QsQ0FFRDs7Ozt1RUFLcUJhLEssQ0FBTyxDQUMxQixLQUFLdkIsSUFBTCxDQUFVd0IsTUFBVixDQUFpQkQsS0FBakIsQ0FBd0IsQ0FBeEIsRUFDRCxDQUVELGUsMERBQ2lCRSxXLENBQWFDLFksQ0FBYyxDQUMxQyxHQUFJLENBQUN0QyxRQUFRcUMsV0FBUixDQUFELEVBQTBCQyxjQUFnQixDQUFDdEMsUUFBUXNDLFlBQVIsQ0FBL0MsQ0FBdUUsQ0FDckUsS0FBTSxJQUFJbEIsTUFBSixDQUFVLDJDQUFWLENBQU4sQ0FDRCxDQUNEO0FBQ0EsR0FBSSxDQUFDLEtBQUtiLGNBQU4sRUFBd0IsQ0FBQyxLQUFLQyxlQUFsQyxDQUFtRCxDQUNqRCxLQUFLRCxjQUFMLENBQXNCOEIsWUFBWWxCLE1BQWxDLENBQ0EsS0FBS1gsZUFBTCxDQUF1QjhCLGFBQWVBLGFBQWFuQixNQUE1QixDQUFxQyxDQUE1RCxDQUNBO0FBQ0QsQ0FKRCxJQUlPLElBQUlrQixZQUFZbEIsTUFBWixFQUFzQixLQUFLWixjQUEzQixFQUNBK0IsYUFBYW5CLE1BQWIsRUFBdUIsS0FBS1gsZUFEaEMsQ0FDaUQsQ0FDdEQsS0FBTSxJQUFJWSxNQUFKLENBQVUscUJBQVYsQ0FBTixDQUNELENBQ0YsQyxrQ0E5SVksQ0FDWCxNQUFPLE1BQUtSLElBQUwsQ0FBVU8sTUFBakIsQ0FDRCxDLDJDQStJWWIsVyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByYXBpZE1peEFkYXB0ZXJzIGZyb20gJ3JhcGlkLW1peC1hZGFwdGVycyc7XG5pbXBvcnQgRXhhbXBsZSBmcm9tICcuL0V4YW1wbGUnO1xuXG4vLyBzb3VyY2UgOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNTI1MTg3OS9ob3ctdG8tY2hlY2staWYtYS12YXJpYWJsZS1pcy1hLXR5cGVkLWFycmF5LWluLWphdmFzY3JpcHRcbmNvbnN0IGlzQXJyYXkgPSB2ID0+IHtcbiAgcmV0dXJuIHYuY29uc3RydWN0b3IgPT09IEZsb2F0MzJBcnJheSB8fFxuICAgICAgICAgdi5jb25zdHJ1Y3RvciA9PT0gRmxvYXQ2NEFycmF5IHx8XG4gICAgICAgICBBcnJheS5pc0FycmF5KHYpO1xufTtcblxuLyoqXG4gKiBNYW5hZ2UgYW5kIGZvcm1hdCBhIHNldCBvZiByZWNvcmRlZCBleGFtcGxlcywgbWFpbnRhaW4gYSBSYXBpZE1peCBjb21wbGlhbnRcbiAqIHRyYWluaW5nIHNldC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gW2lucHV0RGltZW5zaW9uPW51bGxdIC0gSW5wdXQgZGltZW5zaW9uXG4gKiAgKGlmIGBudWxsYCwgaXMgZ3Vlc3NlZCBmcm9tIHRoZSBmaXJzdCByZWNvcmRlZCBlbGVtZW50KVxuICogQHBhcmFtIHtOdW1iZXJ9IFtvdXRwdXREaW1lbnNpb249bnVsbF0gLSBPdXRwdXQgZGltZW5zaW9uLlxuICogIChpZiBgbnVsbGAsIGlzIGd1ZXNzZWQgZnJvbSB0aGUgZmlyc3QgcmVjb3JkZWQgZWxlbWVudCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCAqIGFzIG1hbm8gZnJvbSAnbWFuby1qcy9jbGllbnQnO1xuICpcbiAqIGNvbnN0IGV4YW1wbGUgPSBuZXcgbWFuby5FeGFtcGxlKCk7XG4gKiBjb25zdCB0cmFpbmluZ1NldCA9IG5ldyBtYW5vLlRyYWluaW5nU2V0KCk7XG4gKiBjb25zdCB4bW1Qcm9jZXNzb3IgPSBuZXcgbWFuby5YbW1Qcm9jZXNzc29yKCk7XG4gKlxuICogZXhhbXBsZS5zZXRMYWJlbCgndGVzdCcpO1xuICogZXhhbXBsZS5hZGRFbGVtZW50KFswLCAxLCAyLCAzXSk7XG4gKiBjb25zdCByYXBpZE1peEpzb25FeGFtcGxlID0gZXhhbXBsZS50b0pTT04oKTtcbiAqXG4gKiB0cmFpbmluZ1NldC5hZGRFeGFtcGxlKHJhcGlkTWl4SnNvbkV4YW1wbGUpO1xuICogY29uc3QgcmFwaWRNaXhKc29uVHJhaW5pbmdTZXQgPSB0cmFpbmluZ1NldC50b0pTT04oKTtcbiAqXG4gKiB4bW1Qcm9jZXNzb3JcbiAqICAgLnRyYWluKHJhcGlkTWl4SnNvblRyYWluaW5nU2V0KVxuICogICAudGhlbigoKSA9PiB7IC4uLiB9KTtcbiAqL1xuY2xhc3MgVHJhaW5pbmdTZXQge1xuICBjb25zdHJ1Y3RvcihpbnB1dERpbWVuc2lvbiA9IG51bGwsIG91dHB1dERpbWVuc2lvbiA9IG51bGwsIGNvbHVtbk5hbWVzID0gW10pIHtcbiAgICBpZiAoaW5wdXREaW1lbnNpb24gIT09IG51bGwpIHtcbiAgICAgIHRoaXMuZml4ZWREaW1lbnNpb25zID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5wdXREaW1lbnNpb24gPSBpbnB1dERpbWVuc2lvbjtcbiAgICAgIHRoaXMub3V0cHV0RGltZW5zaW9uID0gb3V0cHV0RGltZW5zaW9uICE9PSBudWxsID8gb3V0cHV0RGltZW5zaW9uIDogMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maXhlZERpbWVuc2lvbnMgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbHVtbk5hbWVzID0gY29sdW1uTmFtZXM7XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbnVtYmVyIG9mIGV4YW1wbGVzLlxuICAgKi9cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciB0aGUgdHJhaW5pbmcgc2V0LlxuICAgKi9cbiAgY2xlYXIoKSB7XG4gICAgaWYgKCF0aGlzLmZpeGVkRGltZW5zaW9ucykge1xuICAgICAgdGhpcy5pbnB1dERpbWVuc2lvbiA9IG51bGw7XG4gICAgICB0aGlzLm91dHB1dERpbWVuc2lvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhID0gW107XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGV4YW1wbGUgdG8gdGhlIHRyYWluaW5nIHNldC5cbiAgICpcbiAgICogQHBhcmFtIHtKU09OfSBleGFtcGxlIC0gQSBSYXBpZE1peCBmb3JtYXR0ZWQgZXhhbXBsZS5cbiAgICovXG4gIGFkZEV4YW1wbGUoZXhhbXBsZSkge1xuICAgIGNvbnN0IGUgPSBleGFtcGxlLnBheWxvYWQ7XG4gICAgdGhpcy5fY2hlY2tEaW1lbnNpb25zKGUuaW5wdXRbMF0sIGUub3V0cHV0WzBdKTtcblxuICAgIGlmIChlLmlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdleGFtcGxlcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGlucHV0IHZlY3RvcicpO1xuICAgIH1cblxuICAgIHRoaXMuZGF0YS5wdXNoKHtcbiAgICAgIGxhYmVsOiBlLmxhYmVsLFxuICAgICAgaW5wdXQ6IGUuaW5wdXQsXG4gICAgICBvdXRwdXQ6IGUub3V0cHV0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbGwgZXhhbXBsZXMgZnJvbSBhbm90aGVyIFJhcGlkTWl4IEpTT04gdHJhaW5pbmcgc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge0pTT059IHRyYWluaW5nU2V0IC0gQSBSYXBpZE1peCBjb21wbGlhbnQgdHJhaW5pbmcgc2V0LlxuICAgKi9cbiAgYWRkVHJhaW5pbmdTZXQodHJhaW5pbmdTZXQpIHtcbiAgICBjb25zdCBleGFtcGxlcyA9IHRyYWluaW5nU2V0LnBheWxvYWQuZGF0YTtcbiAgICBsZXQgZSA9IGV4YW1wbGVzWzBdO1xuICAgIHRoaXMuX2NoZWNrRGltZW5zaW9ucyhlLmlucHV0WzBdLCBlLm91dHB1dFswXSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4YW1wbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBlID0gZXhhbXBsZXNbaV07XG5cbiAgICAgIHRoaXMuZGF0YS5wdXNoKHtcbiAgICAgICAgbGFiZWw6IGUubGFiZWwsXG4gICAgICAgIGlucHV0OiBlLmlucHV0LFxuICAgICAgICBvdXRwdXQ6IGUub3V0cHV0LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgZnJvbSBhbm90aGVyIFJhcGlkTWl4IEpTT04gdHJhaW5pbmcgc2V0LiBJZiBgbnVsbGAsIGNsZWFyIHRoZVxuICAgKiB0cmFpbmluZ1NldC5cbiAgICpcbiAgICogQHBhcmFtIHtKU09OfSB0cmFpbmluZ1NldCAtIEEgUmFwaWRNaXggY29tcGxpYW50IHRyYWluaW5nIHNldC5cbiAgICovXG4gIHNldFRyYWluaW5nU2V0KHRyYWluaW5nU2V0ID0gbnVsbCkge1xuICAgIGlmICh0cmFpbmluZ1NldCA9PT0gbnVsbClcbiAgICAgIHJldHVybiB0aGlzLmNsZWFyKCk7XG5cbiAgICBjb25zdCBzZXQgPSB0cmFpbmluZ1NldC5wYXlsb2FkO1xuXG4gICAgdGhpcy5pbnB1dERpbWVuc2lvbiA9IHNldC5pbnB1dERpbWVuc2lvbjtcbiAgICB0aGlzLm91dHB1dERpbWVuc2lvbiA9IHNldC5vdXRwdXREaW1lbnNpb247XG4gICAgdGhpcy5kYXRhID0gc2V0LmRhdGE7XG4gICAgdGhpcy5jb2x1bW5OYW1lcyA9IHNldC5jb2x1bW5OYW1lcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIFJhcGlkTWl4IGNvbXBsaWFudCB0cmFpbmluZyBzZXQgaW4gSlNPTiBmb3JtYXQuXG4gICAqXG4gICAqIEByZXR1cm4ge0pTT059IC0gVHJhaW5pbmcgc2V0LlxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkb2NUeXBlOiAncmFwaWQtbWl4OnRyYWluaW5nLXNldCcsXG4gICAgICBkb2NWZXJzaW9uOiByYXBpZE1peEFkYXB0ZXJzLlJBUElEX01JWF9ET0NfVkVSU0lPTixcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgaW5wdXREaW1lbnNpb246IHRoaXMuaW5wdXREaW1lbnNpb24sXG4gICAgICAgIG91dHB1dERpbWVuc2lvbjogdGhpcy5vdXRwdXREaW1lbnNpb24sXG4gICAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgY3VycmVudCB0cmFpbmluZyBzZXQgbGFiZWxzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtBcnJheS5TdHJpbmd9IC0gVHJhaW5pbmcgc2V0IHNvcnRlZCBsYWJlbHMuXG4gICAqL1xuICBnZXRMYWJlbHMoKSB7XG4gICAgY29uc3QgbGFiZWxzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmRhdGFbaV0ubGFiZWw7XG5cbiAgICAgIGlmIChsYWJlbHMuaW5kZXhPZihsYWJlbCkgPT09IC0xKVxuICAgICAgICBsYWJlbHMucHVzaChsYWJlbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhYmVscy5zb3J0KCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBleGFtcGxlcyBvZiBhIGNlcnRhaW4gbGFiZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBsYWJlbCAtIFRoZSBsYWJlbCBvZiB0aGUgcmVjb3JkaW5ncyB0byBiZSByZW1vdmVkLlxuICAgKi9cbiAgcmVtb3ZlRXhhbXBsZXNCeUxhYmVsKGxhYmVsKSB7XG4gICAgdGhpcy5kYXRhID0gdGhpcy5kYXRhLmZpbHRlcihkYXR1bSA9PiBkYXR1bS5sYWJlbCAhPT0gbGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBleGFtcGxlIGF0IGluZGV4LlxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGV4YW1wbGUgdG8gcmVtb3ZlLlxuICAgKi9cbiAgcmVtb3ZlRXhhbXBsZUF0SW5kZXgoaW5kZXgpIHtcbiAgICB0aGlzLmRhdGEuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIC8qKiBAcHJpdmF0ZSAqL1xuICBfY2hlY2tEaW1lbnNpb25zKGlucHV0VmVjdG9yLCBvdXRwdXRWZWN0b3IpwqB7XG4gICAgaWYgKCFpc0FycmF5KGlucHV0VmVjdG9yKSB8fCAob3V0cHV0VmVjdG9yICYmICFpc0FycmF5KG91dHB1dFZlY3RvcikpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lucHV0RnJhbWUgYW5kIG91dHB1dEZyYW1lIG11c3QgYmUgYXJyYXlzJyk7XG4gICAgfVxuICAgIC8vIHNldCB0aGlzIGJhY2sgdG8gdHJ1ZSB3aGVyZSBhcHByb3ByaWF0ZSBpZiB3ZSBhZGQgcmVtb3ZlRXhhbXBsZSBldGMgbWV0aG9kc1xuICAgIGlmICghdGhpcy5pbnB1dERpbWVuc2lvbiB8fCAhdGhpcy5vdXRwdXREaW1lbnNpb24pIHtcbiAgICAgIHRoaXMuaW5wdXREaW1lbnNpb24gPSBpbnB1dFZlY3Rvci5sZW5ndGg7XG4gICAgICB0aGlzLm91dHB1dERpbWVuc2lvbiA9IG91dHB1dFZlY3RvciA/IG91dHB1dFZlY3Rvci5sZW5ndGggOiAwO1xuICAgICAgLy8gdGhpcy5fZW1wdHkgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGlucHV0VmVjdG9yLmxlbmd0aCAhPSB0aGlzLmlucHV0RGltZW5zaW9uIHx8XG4gICAgICAgICAgICAgICBvdXRwdXRWZWN0b3IubGVuZ3RoICE9IHRoaXMub3V0cHV0RGltZW5zaW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RpbWVuc2lvbnMgbWlzbWF0Y2gnKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhaW5pbmdTZXQ7XG4iXX0= \ No newline at end of file diff --git a/common/XmmProcessor.js b/common/XmmProcessor.js index 6759889..47782dc 100644 --- a/common/XmmProcessor.js +++ b/common/XmmProcessor.js @@ -1,5 +1,4 @@ -'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _isInteger=require('babel-runtime/core-js/number/is-integer');var _isInteger2=_interopRequireDefault(_isInteger);var _keys=require('babel-runtime/core-js/object/keys');var _keys2=_interopRequireDefault(_keys);var _getIterator2=require('babel-runtime/core-js/get-iterator');var _getIterator3=_interopRequireDefault(_getIterator2);var _from=require('babel-runtime/core-js/array/from');var _from2=_interopRequireDefault(_from);var _stringify=require('babel-runtime/core-js/json/stringify');var _stringify2=_interopRequireDefault(_stringify);var _promise=require('babel-runtime/core-js/promise');var _promise2=_interopRequireDefault(_promise);var _classCallCheck2=require('babel-runtime/helpers/classCallCheck');var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=require('babel-runtime/helpers/createClass');var _createClass3=_interopRequireDefault(_createClass2);var _xmlhttprequest=require('xmlhttprequest');var _xmmClient=require('xmm-client');var Xmm=_interopRequireWildcard(_xmmClient);var _rapidMixAdapters=require('rapid-mix-adapters');function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}// import { translators as rapidMixTranslators } from 'rapid-mix-adapters'; -var isNode=new Function("try {return this===global;}catch(e){return false;}");var knownTargets={xmm:['gmm','gmr','hhmm','hhmr']};var defaultXmmConfig={modelType:'gmm',gaussians:1,absoluteRegularization:0.01,relativeRegularization:0.01,covarianceMode:'full',hierarchical:true,states:1,transitionMode:'leftright',regressionEstimator:'full',likelihoodWindow:10};/** +'use strict';Object.defineProperty(exports,"__esModule",{value:true});var _isInteger=require('babel-runtime/core-js/number/is-integer');var _isInteger2=_interopRequireDefault(_isInteger);var _keys=require('babel-runtime/core-js/object/keys');var _keys2=_interopRequireDefault(_keys);var _getIterator2=require('babel-runtime/core-js/get-iterator');var _getIterator3=_interopRequireDefault(_getIterator2);var _from=require('babel-runtime/core-js/array/from');var _from2=_interopRequireDefault(_from);var _stringify=require('babel-runtime/core-js/json/stringify');var _stringify2=_interopRequireDefault(_stringify);var _promise=require('babel-runtime/core-js/promise');var _promise2=_interopRequireDefault(_promise);var _classCallCheck2=require('babel-runtime/helpers/classCallCheck');var _classCallCheck3=_interopRequireDefault(_classCallCheck2);var _createClass2=require('babel-runtime/helpers/createClass');var _createClass3=_interopRequireDefault(_createClass2);var _xmlhttprequest=require('xmlhttprequest');var _xmmClient=require('xmm-client');var Xmm=_interopRequireWildcard(_xmmClient);var _rapidMixAdapters=require('rapid-mix-adapters');var _rapidMixAdapters2=_interopRequireDefault(_rapidMixAdapters);function _interopRequireWildcard(obj){if(obj&&obj.__esModule){return obj;}else{var newObj={};if(obj!=null){for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];}}newObj.default=obj;return newObj;}}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}var isNode=new Function("try {return this===global;}catch(e){return false;}");var knownTargets={xmm:['gmm','gmr','hhmm','hhmr']};var defaultXmmConfig={modelType:'gmm',gaussians:1,absoluteRegularization:0.01,relativeRegularization:0.01,covarianceMode:'full',hierarchical:true,states:1,transitionMode:'leftright',regressionEstimator:'full',likelihoodWindow:10};/** * Representation of a gesture model. A instance of `XmmProcessor` can * train a model from examples and can perform classification and/or * regression depending on the chosen algorithm. @@ -48,7 +47,7 @@ var isNode=new Function("try {return this===global;}catch(e){return false;}");va * @return {Promise} - Promise that resolves on the API response (RapidMix API * response format), when the model is updated. */},{key:'train',value:function train(trainingSet){var _this=this;// REST request / response - RapidMix -return new _promise2.default(function(resolve,reject){var trainingData={docType:'rapid-mix:ml:http-request',docVersion:_rapidMixAdapters.constants.rapidMixDocVersion,configuration:_this.getConfig(),trainingSet:trainingSet};var xhr=isNode()?new _xmlhttprequest.XMLHttpRequest():new XMLHttpRequest();xhr.open('post',_this.url,true);xhr.responseType='json';xhr.setRequestHeader('Access-Control-Allow-Origin','*');xhr.setRequestHeader('Content-Type','application/json');var errorMsg='an error occured while training the model. ';if(isNode()){// XMLHttpRequest module only supports xhr v1 +return new _promise2.default(function(resolve,reject){var trainingData={docType:'rapid-mix:ml:http-request',docVersion:_rapidMixAdapters2.default.RAPID_MIX_DOC_VERSION,configuration:_this.getConfig(),trainingSet:trainingSet};var xhr=isNode()?new _xmlhttprequest.XMLHttpRequest():new XMLHttpRequest();xhr.open('post',_this.url,true);xhr.responseType='json';xhr.setRequestHeader('Access-Control-Allow-Origin','*');xhr.setRequestHeader('Content-Type','application/json');var errorMsg='an error occured while training the model. ';if(isNode()){// XMLHttpRequest module only supports xhr v1 xhr.onreadystatechange=function(){if(xhr.readyState===4){if(xhr.status===200){var body=JSON.parse(xhr.responseText);_this._decoder.setModel(body.model.payload);_this._model=body.model;resolve(body);}else{throw new Error(errorMsg+('response : '+xhr.status+' - '+xhr.responseText));}}};}else{// use xhr v2 xhr.onload=function(){if(xhr.status===200){var body=xhr.response;_this._decoder.setModel(body.model.payload);_this._model=body.model;resolve(body);}else{throw new Error(errorMsg+('response : '+xhr.status+' - '+xhr.response));}};xhr.onerror=function(){throw new Error(errorMsg+('response : '+xhr.status+' - '+xhr.response));};}xhr.send((0,_stringify2.default)(trainingData));});}/** * Perform the calssification or the regression of the given vector. @@ -59,7 +58,7 @@ xhr.onload=function(){if(xhr.status===200){var body=xhr.response;_this._decoder. * RapidMix compliant configuration object. * * @return {Object} - RapidMix Configuration object. - */},{key:'getConfig',value:function getConfig(){return{docType:'rapid-mix:ml:configuration',docVersion:_rapidMixAdapters.constants.rapidMixDocVersion,target:{name:'xmm:'+this._modelType,version:'1.0.0'},payload:this._config};}/** + */},{key:'getConfig',value:function getConfig(){return{docType:'rapid-mix:ml:configuration',docVersion:_rapidMixAdapters2.default.RAPID_MIX_DOC_VERSION,target:{name:'xmm:'+this._modelType,version:'1.0.0'},payload:this._config};}/** * Set the model configuration parameters (or a subset of them). * * @param {Object} config - RapidMix configuration object (or payload), or subset of parameters. @@ -73,4 +72,4 @@ if(config.docType==='rapid-mix:ml:configuration'&&config.docVersion&&config.payl * * @param {Object} model - RapidMix Model object. */},{key:'setModel',value:function setModel(model){if(!model){this.model=null;this._decoder.setModel(null);return;}var targets=model.target.name.split(':');var lib=targets[0];var algo=targets[1];if(lib==='xmm'){this._modelType=algo==='hhmm'?algo:'gmm';this._setDecoder();this._model=model;this._decoder.setModel(model.payload);}else{throw new Error('Invalid type '+lib);}}}]);return XmmProcessor;}();exports.default=XmmProcessor; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIlhtbSIsImlzTm9kZSIsIkZ1bmN0aW9uIiwia25vd25UYXJnZXRzIiwieG1tIiwiZGVmYXVsdFhtbUNvbmZpZyIsIm1vZGVsVHlwZSIsImdhdXNzaWFucyIsImFic29sdXRlUmVndWxhcml6YXRpb24iLCJyZWxhdGl2ZVJlZ3VsYXJpemF0aW9uIiwiY292YXJpYW5jZU1vZGUiLCJoaWVyYXJjaGljYWwiLCJzdGF0ZXMiLCJ0cmFuc2l0aW9uTW9kZSIsInJlZ3Jlc3Npb25Fc3RpbWF0b3IiLCJsaWtlbGlob29kV2luZG93IiwiWG1tUHJvY2Vzc29yIiwidXJsIiwiX2NvbmZpZyIsIl9kZWNvZGVyIiwiX21vZGVsIiwiX21vZGVsVHlwZSIsIl9saWtlbGlob29kV2luZG93Iiwic2V0Q29uZmlnIiwiX3NldERlY29kZXIiLCJIaG1tRGVjb2RlciIsIkdtbURlY29kZXIiLCJyZXNldCIsInRyYWluaW5nU2V0IiwicmVzb2x2ZSIsInJlamVjdCIsInRyYWluaW5nRGF0YSIsImRvY1R5cGUiLCJkb2NWZXJzaW9uIiwicmFwaWRNaXhEb2NWZXJzaW9uIiwiY29uZmlndXJhdGlvbiIsImdldENvbmZpZyIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInJlc3BvbnNlVHlwZSIsInNldFJlcXVlc3RIZWFkZXIiLCJlcnJvck1zZyIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJzdGF0dXMiLCJib2R5IiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0Iiwic2V0TW9kZWwiLCJtb2RlbCIsInBheWxvYWQiLCJFcnJvciIsIm9ubG9hZCIsInJlc3BvbnNlIiwib25lcnJvciIsInNlbmQiLCJ2ZWN0b3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJmaWx0ZXIiLCJ0YXJnZXQiLCJuYW1lIiwidmVyc2lvbiIsImNvbmZpZyIsInNwbGl0IiwibGVuZ3RoIiwiaW5kZXhPZiIsInZhbCIsIm5ld01vZGVsIiwia2V5Iiwic2V0TGlrZWxpaG9vZFdpbmRvdyIsInRhcmdldHMiLCJsaWIiLCJhbGdvIl0sIm1hcHBpbmdzIjoibThCQUFBLDhDQUNBLHFDLEdBQVlBLEkscUNBQ1osb0QsNlRBQ0E7QUFFQSxHQUFNQyxRQUFTLEdBQUlDLFNBQUosQ0FBYSxvREFBYixDQUFmLENBRUEsR0FBTUMsY0FBZSxDQUNuQkMsSUFBSyxDQUFFLEtBQUYsQ0FBUyxLQUFULENBQWdCLE1BQWhCLENBQXdCLE1BQXhCLENBRGMsQ0FBckIsQ0FJQSxHQUFNQyxrQkFBbUIsQ0FDdkJDLFVBQVcsS0FEWSxDQUV2QkMsVUFBVyxDQUZZLENBR3ZCQyx1QkFBd0IsSUFIRCxDQUl2QkMsdUJBQXdCLElBSkQsQ0FLdkJDLGVBQWdCLE1BTE8sQ0FNdkJDLGFBQWMsSUFOUyxDQU92QkMsT0FBUSxDQVBlLENBUXZCQyxlQUFnQixXQVJPLENBU3ZCQyxvQkFBcUIsTUFURSxDQVV2QkMsaUJBQWtCLEVBVkssQ0FBekIsQ0FhQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01Bd0NNQyxhLFlBQ0osdUJBRVEsb0VBQUosRUFBSSxlQUROQyxHQUNNLENBRE5BLEdBQ00sc0JBREEsb0NBQ0EsMERBQ04sS0FBS0EsR0FBTCxDQUFXQSxHQUFYLENBRUEsS0FBS0MsT0FBTCxDQUFlLEVBQWYsQ0FDQSxLQUFLQyxRQUFMLENBQWdCLElBQWhCLENBQ0EsS0FBS0MsTUFBTCxDQUFjLElBQWQsQ0FDQSxLQUFLQyxVQUFMLENBQWtCLElBQWxCLENBQ0EsS0FBS0MsaUJBQUwsQ0FBeUIsSUFBekIsQ0FFQSxLQUFLQyxTQUFMLENBQWVsQixnQkFBZixFQUNBLEtBQUttQixXQUFMLEdBQ0QsQyx1RkFFYSxDQUNaLE9BQVEsS0FBS0gsVUFBYixFQUNFLElBQUssTUFBTCxDQUNFLEtBQUtGLFFBQUwsQ0FBZ0IsR0FBSW5CLEtBQUl5QixXQUFSLENBQW9CLEtBQUtILGlCQUF6QixDQUFoQixDQUNBLE1BQ0YsSUFBSyxLQUFMLENBQ0EsUUFD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QUE4Qix3QkFBaUJGLElBQWpCLENBQTlCLEVBQXVEQSxLQUFNLENBQWpFLENBQW9FLENBQ3pFLEtBQUsvQyxpQkFBTCxDQUF5QitDLElBQXpCLENBRUEsR0FBSSxLQUFLbEQsUUFBTCxHQUFrQixJQUF0QixDQUE0QixDQUMxQixLQUFLQSxRQUFMLENBQWNxRCxtQkFBZCxDQUFrQyxLQUFLbEQsaUJBQXZDLEVBQ0QsQ0FDRixDQUNGLENBbERvQiwrTEFtRHRCLENBRUQ7Ozs7Z0RBS1csQ0FDVCxNQUFPLE1BQUtGLE1BQVosQ0FDRCxDQUVEOzs7OytDQUtTK0IsSyxDQUFPLENBQ2QsR0FBSSxDQUFDQSxLQUFMLENBQVksQ0FDVixLQUFLQSxLQUFMLENBQWEsSUFBYixDQUNBLEtBQUtoQyxRQUFMLENBQWMrQixRQUFkLENBQXVCLElBQXZCLEVBQ0EsT0FDRCxDQUVELEdBQU11QixTQUFVdEIsTUFBTVcsTUFBTixDQUFhQyxJQUFiLENBQWtCRyxLQUFsQixDQUF3QixHQUF4QixDQUFoQixDQUNBLEdBQU1RLEtBQU1ELFFBQVEsQ0FBUixDQUFaLENBQ0EsR0FBTUUsTUFBT0YsUUFBUSxDQUFSLENBQWIsQ0FFQSxHQUFJQyxNQUFRLEtBQVosQ0FBbUIsQ0FDakIsS0FBS3JELFVBQUwsQ0FBa0JzRCxPQUFTLE1BQVQsQ0FBa0JBLElBQWxCLENBQXlCLEtBQTNDLENBRUEsS0FBS25ELFdBQUwsR0FFQSxLQUFLSixNQUFMLENBQWMrQixLQUFkLENBQ0EsS0FBS2hDLFFBQUwsQ0FBYytCLFFBQWQsQ0FBdUJDLE1BQU1DLE9BQTdCLEVBQ0QsQ0FQRCxJQU9PLENBQ0wsS0FBTSxJQUFJQyxNQUFKLGlCQUEwQnFCLEdBQTFCLENBQU4sQ0FDRCxDQUNGLEMsNENBR1kxRCxZIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgWE1MSHR0cFJlcXVlc3QgYXMgWEhSIH0gZnJvbSAneG1saHR0cHJlcXVlc3QnO1xuaW1wb3J0ICogYXMgWG1tIGZyb20gJ3htbS1jbGllbnQnO1xuaW1wb3J0IHsgY29uc3RhbnRzIGFzIHJhcGlkTWl4Q29uc3RhbnRzIH0gZnJvbSAncmFwaWQtbWl4LWFkYXB0ZXJzJztcbi8vIGltcG9ydCB7IHRyYW5zbGF0b3JzIGFzIHJhcGlkTWl4VHJhbnNsYXRvcnMgfSBmcm9tICdyYXBpZC1taXgtYWRhcHRlcnMnO1xuXG5jb25zdCBpc05vZGUgPSBuZXcgRnVuY3Rpb24oXCJ0cnkge3JldHVybiB0aGlzPT09Z2xvYmFsO31jYXRjaChlKXtyZXR1cm4gZmFsc2U7fVwiKTtcblxuY29uc3Qga25vd25UYXJnZXRzID0ge1xuICB4bW06IFsgJ2dtbScsICdnbXInLCAnaGhtbScsICdoaG1yJyBdXG59O1xuXG5jb25zdCBkZWZhdWx0WG1tQ29uZmlnID0ge1xuICBtb2RlbFR5cGU6ICdnbW0nLFxuICBnYXVzc2lhbnM6IDEsXG4gIGFic29sdXRlUmVndWxhcml6YXRpb246IDAuMDEsXG4gIHJlbGF0aXZlUmVndWxhcml6YXRpb246IDAuMDEsXG4gIGNvdmFyaWFuY2VNb2RlOiAnZnVsbCcsXG4gIGhpZXJhcmNoaWNhbDogdHJ1ZSxcbiAgc3RhdGVzOiAxLFxuICB0cmFuc2l0aW9uTW9kZTogJ2xlZnRyaWdodCcsXG4gIHJlZ3Jlc3Npb25Fc3RpbWF0b3I6ICdmdWxsJyxcbiAgbGlrZWxpaG9vZFdpbmRvdzogMTAsXG59O1xuXG4vKipcbiAqIFJlcHJlc2VudGF0aW9uIG9mIGEgZ2VzdHVyZSBtb2RlbC4gQSBpbnN0YW5jZSBvZiBgWG1tUHJvY2Vzc29yYCBjYW5cbiAqIHRyYWluIGEgbW9kZWwgZnJvbSBleGFtcGxlcyBhbmQgY2FuIHBlcmZvcm0gY2xhc3NpZmljYXRpb24gYW5kL29yXG4gKiByZWdyZXNzaW9uIGRlcGVuZGluZyBvbiB0aGUgY2hvc2VuIGFsZ29yaXRobS5cbiAqXG4gKiBUaGUgdHJhaW5pbmcgaXMgY3VycmVudGx5IGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIHJlbW90ZSBzZXJ2ZXItc2lkZVxuICogQVBJLCB0aGF0IG11c3QgYmUgYWJsZSB0byBwcm9jZXNzIHJhcGlkTWl4IGNvbXBsaWFudCBKU09OIGZvcm1hdHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPdmVycmlkZSBkZWZhdWx0IHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy51cmw9J2h0dHBzOi8vY29tby5pcmNhbS5mci9hcGkvdjEvdHJhaW4nXSAtIFVybFxuICogIG9mIHRoZSB0cmFpbmluZyBlbmQgcG9pbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCAqIGFzIG1hbm8gZnJvbSAnbWFuby1qcy9jbGllbnQnO1xuICpcbiAqIGNvbnN0IHByb2Nlc3NlZFNlbnNvcnMgPSBuZXcgbWFuby5Qcm9jZXNzZWRTZW5zb3JzKCk7XG4gKiBjb25zdCBleGFtcGxlID0gbmV3IG1hbm8uRXhhbXBsZSgpO1xuICogY29uc3QgdHJhaW5pbmdTZXQgPSBuZXcgbWFuby5UcmFpbmluZ1NldCgpO1xuICogY29uc3QgeG1tUHJvY2Vzc29yID0gbmV3IG1hbm8uWG1tUHJvY2Vzc3NvcigpO1xuICpcbiAqIGV4YW1wbGUuc2V0TGFiZWwoJ3Rlc3QnKTtcbiAqIHByb2Nlc3NlZFNlbnNvcnMuYWRkTGlzdGVuZXIoZXhhbXBsZS5hZGRFbGVtZW50KTtcbiAqXG4gKiAvLyBsYXRlclxuICogcHJvY2Vzc2VkU2Vuc29ycy5yZW1vdmVMaXN0ZW5lcihleGFtcGxlLmFkZEVsZW1lbnQpO1xuICogY29uc3QgcmFwaWRNaXhKc29uRXhhbXBsZSA9IGV4YW1wbGUudG9KU09OKCk7XG4gKlxuICogdHJhaW5pbmdTZXQuYWRkRXhhbXBsZShyYXBpZE1peEpzb25FeGFtcGxlKTtcbiAqIGNvbnN0IHJhcGlkTWl4SnNvblRyYWluaW5nU2V0ID0gdHJhaW5pbmdTZXQudG9KU09OKCk7XG4gKlxuICogeG1tUHJvY2Vzc29yXG4gKiAgIC50cmFpbihyYXBpZE1peEpzb25UcmFpbmluZ1NldClcbiAqICAgLnRoZW4oKCkgPT4ge1xuICogICAgIC8vIHN0YXJ0IGRlY29kaW5nXG4gKiAgICAgcHJvY2Vzc2VkU2Vuc29ycy5hZGRMaXN0ZW5lcihkYXRhID0+IHtcbiAqICAgICAgIGNvbnN0IHJlc3VsdHMgPSB4bW1Qcm9jZXNzb3IucnVuKGRhdGEpO1xuICogICAgICAgY29uc29sZS5sb2cocmVzdWx0cyk7XG4gKiAgICAgfSk7XG4gKiAgIH0pO1xuICovXG5jbGFzcyBYbW1Qcm9jZXNzb3Ige1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgdXJsID0gJ2h0dHBzOi8vY29tby5pcmNhbS5mci9hcGkvdjEvdHJhaW4nLFxuICB9ID0ge30pIHtcbiAgICB0aGlzLnVybCA9IHVybDtcblxuICAgIHRoaXMuX2NvbmZpZyA9IHt9O1xuICAgIHRoaXMuX2RlY29kZXIgPSBudWxsO1xuICAgIHRoaXMuX21vZGVsID0gbnVsbDtcbiAgICB0aGlzLl9tb2RlbFR5cGUgPSBudWxsO1xuICAgIHRoaXMuX2xpa2VsaWhvb2RXaW5kb3cgPSBudWxsO1xuXG4gICAgdGhpcy5zZXRDb25maWcoZGVmYXVsdFhtbUNvbmZpZyk7XG4gICAgdGhpcy5fc2V0RGVjb2RlcigpO1xuICB9XG5cbiAgX3NldERlY29kZXIoKSB7XG4gICAgc3dpdGNoICh0aGlzLl9tb2RlbFR5cGUpIHtcbiAgICAgIGNhc2UgJ2hobW0nOlxuICAgICAgICB0aGlzLl9kZWNvZGVyID0gbmV3IFhtbS5IaG1tRGVjb2Rlcih0aGlzLl9saWtlbGlob29kV2luZG93KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdnbW0nOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5fZGVjb2RlciA9IG5ldyBYbW0uR21tRGVjb2Rlcih0aGlzLl9saWtlbGlob29kV2luZG93KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBtb2RlbCdzIHRlbXBvcmFsIGRlY29kaW5nIHN0YXRlLiBJcyBvbmx5IHZhbGlkIG9uIGBoaG1tYCBkZWNvZGVyLlxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgaWYgKHRoaXMuX2RlY29kZXIucmVzZXQpXG4gICAgICB0aGlzLl9kZWNvZGVyLnJlc2V0KCk7XG4gIH1cblxuICAvKipcbiAgICogVHJhaW4gdGhlIG1vZGVsIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gYFRyYWluaW5nU2V0YC4gSW4gdGhpcyBpbXBsbWVudGF0aW9uXG4gICAqIHRoZSB0cmFpbmluZyBpcyBwZXJmb3JtZWQgc2VydmVyLXNpZGUgYW5kIHJlbHkgb24gYW4gWEhSIGNhbGwuXG4gICAqXG4gICAqIEBwYXJhbSB7SlNPTn0gdHJhaW5pbmdTZXQgLSBSYXBpZE1peCBjb21wbGlhbnQgSlNPTiBmb3JtYXR0ZWQgdHJhaW5pbmcgc2V0XG4gICAqIEByZXR1cm4ge1Byb21pc2V9IC0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uIHRoZSBBUEkgcmVzcG9uc2UgKFJhcGlkTWl4IEFQSVxuICAgKiAgcmVzcG9uc2UgZm9ybWF0KSwgd2hlbiB0aGUgbW9kZWwgaXMgdXBkYXRlZC5cbiAgICovXG4gIHRyYWluKHRyYWluaW5nU2V0KSB7XG4gICAgLy8gUkVTVCByZXF1ZXN0IC8gcmVzcG9uc2UgLSBSYXBpZE1peFxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCB0cmFpbmluZ0RhdGEgPSB7XG4gICAgICAgIGRvY1R5cGU6ICdyYXBpZC1taXg6bWw6aHR0cC1yZXF1ZXN0JyxcbiAgICAgICAgZG9jVmVyc2lvbjogcmFwaWRNaXhDb25zdGFudHMucmFwaWRNaXhEb2NWZXJzaW9uLFxuICAgICAgICBjb25maWd1cmF0aW9uOiB0aGlzLmdldENvbmZpZygpLFxuICAgICAgICB0cmFpbmluZ1NldDogdHJhaW5pbmdTZXRcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHhociA9IGlzTm9kZSgpID8gbmV3IFhIUigpIDogbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cbiAgICAgIHhoci5vcGVuKCdwb3N0JywgdGhpcy51cmwsIHRydWUpO1xuICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdqc29uJztcbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCAnKicpO1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG5cbiAgICAgIGNvbnN0IGVycm9yTXNnID0gJ2FuIGVycm9yIG9jY3VyZWQgd2hpbGUgdHJhaW5pbmcgdGhlIG1vZGVsLiAnO1xuXG4gICAgICBpZiAoaXNOb2RlKCkpIHsgLy8gWE1MSHR0cFJlcXVlc3QgbW9kdWxlIG9ubHkgc3VwcG9ydHMgeGhyIHYxXG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICB0aGlzLl9kZWNvZGVyLnNldE1vZGVsKGJvZHkubW9kZWwucGF5bG9hZCk7XG4gICAgICAgICAgICAgIHRoaXMuX21vZGVsID0gYm9keS5tb2RlbDtcbiAgICAgICAgICAgICAgcmVzb2x2ZShib2R5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyArIGByZXNwb25zZSA6ICR7eGhyLnN0YXR1c30gLSAke3hoci5yZXNwb25zZVRleHR9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyAvLyB1c2UgeGhyIHYyXG4gICAgICAgIHhoci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IHhoci5yZXNwb25zZTtcbiAgICAgICAgICAgIHRoaXMuX2RlY29kZXIuc2V0TW9kZWwoYm9keS5tb2RlbC5wYXlsb2FkKTtcbiAgICAgICAgICAgIHRoaXMuX21vZGVsID0gYm9keS5tb2RlbDtcbiAgICAgICAgICAgIHJlc29sdmUoYm9keSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyArIGByZXNwb25zZSA6ICR7eGhyLnN0YXR1c30gLSAke3hoci5yZXNwb25zZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgeGhyLm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTXNnICsgYHJlc3BvbnNlIDogJHt4aHIuc3RhdHVzfSAtICR7eGhyLnJlc3BvbnNlfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHhoci5zZW5kKEpTT04uc3RyaW5naWZ5KHRyYWluaW5nRGF0YSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gdGhlIGNhbHNzaWZpY2F0aW9uIG9yIHRoZSByZWdyZXNzaW9uIG9mIHRoZSBnaXZlbiB2ZWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSB7RmxvYXQzMkFycmF5fEFycmF5fSB2ZWN0b3IgLSBJbnB1dCB2ZWN0b3IgZm9yIHRoZSBkZWNvZGluZy5cbiAgICogQHJldHVybiB7T2JqZWN0fSByZXN1bHRzIC0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlY29kaW5nIHJlc3VsdHMuXG4gICAqL1xuICBydW4odmVjdG9yKSB7XG4gICAgaWYgKHZlY3RvciBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fCB2ZWN0b3IgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpIHtcbiAgICAgIHZlY3RvciA9IEFycmF5LmZyb20odmVjdG9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZGVjb2Rlci5maWx0ZXIodmVjdG9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSYXBpZE1peCBjb21wbGlhbnQgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gLSBSYXBpZE1peCBDb25maWd1cmF0aW9uIG9iamVjdC5cbiAgICovXG4gIGdldENvbmZpZygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZG9jVHlwZTogJ3JhcGlkLW1peDptbDpjb25maWd1cmF0aW9uJyxcbiAgICAgIGRvY1ZlcnNpb246IHJhcGlkTWl4Q29uc3RhbnRzLnJhcGlkTWl4RG9jVmVyc2lvbixcbiAgICAgIHRhcmdldDoge1xuICAgICAgICBuYW1lOiBgeG1tOiR7dGhpcy5fbW9kZWxUeXBlfWAsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCdcbiAgICAgIH0sXG4gICAgICBwYXlsb2FkOiB0aGlzLl9jb25maWcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG1vZGVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAob3IgYSBzdWJzZXQgb2YgdGhlbSkuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgLSBSYXBpZE1peCBjb25maWd1cmF0aW9uIG9iamVjdCAob3IgcGF5bG9hZCksIG9yIHN1YnNldCBvZiBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgc2V0Q29uZmlnKGNvbmZpZyA9IHt9KSB7XG4gICAgaWYgKCFjb25maWcpXG4gICAgICByZXR1cm47XG5cbiAgICAvLyByZXBsYWNlIGxhdGVyIGJ5IGlzVmFsaWRSYXBpZE1peENvbmZpZ3VyYXRpb24gKG1vZGVsVHlwZSBzaG91bGRuJ3QgYmUgYWxsb3dlZCBpbiBwYXlsb2FkKVxuICAgIGlmIChjb25maWcuZG9jVHlwZSA9PT0gJ3JhcGlkLW1peDptbDpjb25maWd1cmF0aW9uJyAmJiBjb25maWcuZG9jVmVyc2lvbiAmJiBjb25maWcucGF5bG9hZCAmJlxuICAgICAgICBjb25maWcudGFyZ2V0ICYmIGNvbmZpZy50YXJnZXQubmFtZSAmJiBjb25maWcudGFyZ2V0Lm5hbWUuc3BsaXQoJzonKVswXSA9PT0gJ3htbScpIHtcblxuICAgICAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldC5uYW1lLnNwbGl0KCc6Jyk7XG4gICAgICBjb25maWcgPSBjb25maWcucGF5bG9hZDtcbiAgICAgIGlmICh0YXJnZXQubGVuZ3RoID4gMSAmJiBrbm93blRhcmdldHMueG1tLmluZGV4T2YodGFyZ2V0WzFdKSA+IC0xKSB7XG4gICAgICAgIGlmICh0aGlzLl9tb2RlbFR5cGUgIT09IHRhcmdldFsxXSkge1xuICAgICAgICAgIHRoaXMuX21vZGVsVHlwZSA9IHRhcmdldFsxXTtcbiAgICAgICAgICB0aGlzLl9zZXREZWNvZGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLm1vZGVsVHlwZSAmJiBrbm93blRhcmdldHNbJ3htbSddLmluZGV4T2YoY29uZmlnLm1vZGVsVHlwZSkgPiAtMSkge1xuICAgICAgY29uc3QgdmFsID0gY29uZmlnLm1vZGVsVHlwZTtcbiAgICAgIGNvbnN0IG5ld01vZGVsID0gKHZhbCA9PT0gJ2dtcicpID8gJ2dtbScgOiAoKHZhbCA9PT0gJ2hobXInKSA/ICdoaG1tJyA6IHZhbCk7XG5cbiAgICAgIGlmIChuZXdNb2RlbCAhPT0gdGhpcy5fbW9kZWxUeXBlKSB7XG4gICAgICAgIHRoaXMuX21vZGVsVHlwZSA9IG5ld01vZGVsO1xuICAgICAgICB0aGlzLl9zZXREZWNvZGVyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcbiAgICAgIGNvbnN0IHZhbCA9IGNvbmZpZ1trZXldO1xuXG4gICAgICBpZiAoKGtleSA9PT0gJ2dhdXNzaWFucycgJiYgTnVtYmVyLmlzSW50ZWdlcih2YWwpICYmIHZhbCA+IDApIHx8XG4gICAgICAgICAgKGtleSA9PT0gJ2Fic29sdXRlUmVndWxhcml6YXRpb24nICYmIHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIHZhbCA+IDApIHx8XG4gICAgICAgICAgKGtleSA9PT0gJ3JlbGF0aXZlUmVndWxhcml6YXRpb24nICYmIHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIHZhbCA+IDApIHx8XG4gICAgICAgICAgKGtleSA9PT0gJ2NvdmFyaWFuY2VNb2RlJyAmJiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgWydmdWxsJywgJ2RpYWdvbmFsJ10uaW5kZXhPZih2YWwpID4gLTEpIHx8XG4gICAgICAgICAgKGtleSA9PT0gJ2hpZXJhcmNoaWNhbCcgJiYgdHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB8fFxuICAgICAgICAgIChrZXkgPT09ICdzdGF0ZXMnICYmIE51bWJlci5pc0ludGVnZXIodmFsKSAmJiB2YWwgPiAwKSB8fFxuICAgICAgICAgIChrZXkgPT09ICd0cmFuc2l0aW9uTW9kZScgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIFsnbGVmdHJpZ2h0JywgJ2VyZ29kaWMnXS5pbmRleE9mKHZhbCkgPiAtMSkgfHxcbiAgICAgICAgICAoa2V5ID09PSAncmVncmVzc2lvbkVzdGltYXRvcicgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIFsnZnVsbCcsICd3aW5kb3dlZCcsICdsaWtlbGllc3QnXS5pbmRleE9mKHZhbCkgPiAtMSkpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnW2tleV0gPSB2YWw7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2xpa2VsaWhvb2RXaW5kb3cnICYmIE51bWJlci5pc0ludGVnZXIodmFsKSAmJiB2YWwgPiAwKSB7XG4gICAgICAgIHRoaXMuX2xpa2VsaWhvb2RXaW5kb3cgPSB2YWw7XG5cbiAgICAgICAgaWYgKHRoaXMuX2RlY29kZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9kZWNvZGVyLnNldExpa2VsaWhvb2RXaW5kb3codGhpcy5fbGlrZWxpaG9vZFdpbmRvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIG1vZGVsIGluIFJhcGlkTWl4IG1vZGVsIGZvcm1hdC5cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fSAtIEN1cnJlbnQgUmFwaWRNaXggTW9kZWwgb2JqZWN0LlxuICAgKi9cbiAgZ2V0TW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZ2l2ZW4gUmFwaWRNaXggbW9kZWwgb2JqZWN0IGZvciB0aGUgZGVjb2RpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCAtIFJhcGlkTWl4IE1vZGVsIG9iamVjdC5cbiAgICovXG4gIHNldE1vZGVsKG1vZGVsKSB7XG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgdGhpcy5tb2RlbCA9IG51bGw7XG4gICAgICB0aGlzLl9kZWNvZGVyLnNldE1vZGVsKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBtb2RlbC50YXJnZXQubmFtZS5zcGxpdCgnOicpO1xuICAgIGNvbnN0IGxpYiA9IHRhcmdldHNbMF07XG4gICAgY29uc3QgYWxnbyA9IHRhcmdldHNbMV07XG5cbiAgICBpZiAobGliID09PSAneG1tJykge1xuICAgICAgdGhpcy5fbW9kZWxUeXBlID0gYWxnbyA9PT0gJ2hobW0nID8gYWxnbyA6ICdnbW0nO1xuXG4gICAgICB0aGlzLl9zZXREZWNvZGVyKCk7XG5cbiAgICAgIHRoaXMuX21vZGVsID0gbW9kZWw7XG4gICAgICB0aGlzLl9kZWNvZGVyLnNldE1vZGVsKG1vZGVsLnBheWxvYWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHlwZSAke2xpYn1gKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgWG1tUHJvY2Vzc29yO1xuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LmpzIl0sIm5hbWVzIjpbIlhtbSIsImlzTm9kZSIsIkZ1bmN0aW9uIiwia25vd25UYXJnZXRzIiwieG1tIiwiZGVmYXVsdFhtbUNvbmZpZyIsIm1vZGVsVHlwZSIsImdhdXNzaWFucyIsImFic29sdXRlUmVndWxhcml6YXRpb24iLCJyZWxhdGl2ZVJlZ3VsYXJpemF0aW9uIiwiY292YXJpYW5jZU1vZGUiLCJoaWVyYXJjaGljYWwiLCJzdGF0ZXMiLCJ0cmFuc2l0aW9uTW9kZSIsInJlZ3Jlc3Npb25Fc3RpbWF0b3IiLCJsaWtlbGlob29kV2luZG93IiwiWG1tUHJvY2Vzc29yIiwidXJsIiwiX2NvbmZpZyIsIl9kZWNvZGVyIiwiX21vZGVsIiwiX21vZGVsVHlwZSIsIl9saWtlbGlob29kV2luZG93Iiwic2V0Q29uZmlnIiwiX3NldERlY29kZXIiLCJIaG1tRGVjb2RlciIsIkdtbURlY29kZXIiLCJyZXNldCIsInRyYWluaW5nU2V0IiwicmVzb2x2ZSIsInJlamVjdCIsInRyYWluaW5nRGF0YSIsImRvY1R5cGUiLCJkb2NWZXJzaW9uIiwiUkFQSURfTUlYX0RPQ19WRVJTSU9OIiwiY29uZmlndXJhdGlvbiIsImdldENvbmZpZyIsInhociIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInJlc3BvbnNlVHlwZSIsInNldFJlcXVlc3RIZWFkZXIiLCJlcnJvck1zZyIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlYWR5U3RhdGUiLCJzdGF0dXMiLCJib2R5IiwiSlNPTiIsInBhcnNlIiwicmVzcG9uc2VUZXh0Iiwic2V0TW9kZWwiLCJtb2RlbCIsInBheWxvYWQiLCJFcnJvciIsIm9ubG9hZCIsInJlc3BvbnNlIiwib25lcnJvciIsInNlbmQiLCJ2ZWN0b3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJmaWx0ZXIiLCJ0YXJnZXQiLCJuYW1lIiwidmVyc2lvbiIsImNvbmZpZyIsInNwbGl0IiwibGVuZ3RoIiwiaW5kZXhPZiIsInZhbCIsIm5ld01vZGVsIiwia2V5Iiwic2V0TGlrZWxpaG9vZFdpbmRvdyIsInRhcmdldHMiLCJsaWIiLCJhbGdvIl0sIm1hcHBpbmdzIjoibThCQUFBLDhDQUNBLHFDLEdBQVlBLEkscUNBQ1osb0QsOFhBRUEsR0FBTUMsUUFBUyxHQUFJQyxTQUFKLENBQWEsb0RBQWIsQ0FBZixDQUVBLEdBQU1DLGNBQWUsQ0FDbkJDLElBQUssQ0FBRSxLQUFGLENBQVMsS0FBVCxDQUFnQixNQUFoQixDQUF3QixNQUF4QixDQURjLENBQXJCLENBSUEsR0FBTUMsa0JBQW1CLENBQ3ZCQyxVQUFXLEtBRFksQ0FFdkJDLFVBQVcsQ0FGWSxDQUd2QkMsdUJBQXdCLElBSEQsQ0FJdkJDLHVCQUF3QixJQUpELENBS3ZCQyxlQUFnQixNQUxPLENBTXZCQyxhQUFjLElBTlMsQ0FPdkJDLE9BQVEsQ0FQZSxDQVF2QkMsZUFBZ0IsV0FSTyxDQVN2QkMsb0JBQXFCLE1BVEUsQ0FVdkJDLGlCQUFrQixFQVZLLENBQXpCLENBYUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQXdDTUMsYSxZQUNKLHVCQUVRLG9FQUFKLEVBQUksZUFETkMsR0FDTSxDQUROQSxHQUNNLHNCQURBLG9DQUNBLDBEQUNOLEtBQUtBLEdBQUwsQ0FBV0EsR0FBWCxDQUVBLEtBQUtDLE9BQUwsQ0FBZSxFQUFmLENBQ0EsS0FBS0MsUUFBTCxDQUFnQixJQUFoQixDQUNBLEtBQUtDLE1BQUwsQ0FBYyxJQUFkLENBQ0EsS0FBS0MsVUFBTCxDQUFrQixJQUFsQixDQUNBLEtBQUtDLGlCQUFMLENBQXlCLElBQXpCLENBRUEsS0FBS0MsU0FBTCxDQUFlbEIsZ0JBQWYsRUFDQSxLQUFLbUIsV0FBTCxHQUNELEMsdUZBRWEsQ0FDWixPQUFRLEtBQUtILFVBQWIsRUFDRSxJQUFLLE1BQUwsQ0FDRSxLQUFLRixRQUFMLENBQWdCLEdBQUluQixLQUFJeUIsV0FBUixDQUFvQixLQUFLSCxpQkFBekIsQ0FBaEIsQ0FDQSxNQUNGLElBQUssS0FBTCxDQUNBLFFBQ0Us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OEIsd0JBQWlCRixJQUFqQixDQUE5QixFQUF1REEsS0FBTSxDQUFqRSxDQUFvRSxDQUN6RSxLQUFLL0MsaUJBQUwsQ0FBeUIrQyxJQUF6QixDQUVBLEdBQUksS0FBS2xELFFBQUwsR0FBa0IsSUFBdEIsQ0FBNEIsQ0FDMUIsS0FBS0EsUUFBTCxDQUFjcUQsbUJBQWQsQ0FBa0MsS0FBS2xELGlCQUF2QyxFQUNELENBQ0YsQ0FDRixDQWxEb0IsK0xBbUR0QixDQUVEOzs7O2dEQUtXLENBQ1QsTUFBTyxNQUFLRixNQUFaLENBQ0QsQ0FFRDs7OzsrQ0FLUytCLEssQ0FBTyxDQUNkLEdBQUksQ0FBQ0EsS0FBTCxDQUFZLENBQ1YsS0FBS0EsS0FBTCxDQUFhLElBQWIsQ0FDQSxLQUFLaEMsUUFBTCxDQUFjK0IsUUFBZCxDQUF1QixJQUF2QixFQUNBLE9BQ0QsQ0FFRCxHQUFNdUIsU0FBVXRCLE1BQU1XLE1BQU4sQ0FBYUMsSUFBYixDQUFrQkcsS0FBbEIsQ0FBd0IsR0FBeEIsQ0FBaEIsQ0FDQSxHQUFNUSxLQUFNRCxRQUFRLENBQVIsQ0FBWixDQUNBLEdBQU1FLE1BQU9GLFFBQVEsQ0FBUixDQUFiLENBRUEsR0FBSUMsTUFBUSxLQUFaLENBQW1CLENBQ2pCLEtBQUtyRCxVQUFMLENBQWtCc0QsT0FBUyxNQUFULENBQWtCQSxJQUFsQixDQUF5QixLQUEzQyxDQUVBLEtBQUtuRCxXQUFMLEdBQ0EsS0FBS0osTUFBTCxDQUFjK0IsS0FBZCxDQUNBLEtBQUtoQyxRQUFMLENBQWMrQixRQUFkLENBQXVCQyxNQUFNQyxPQUE3QixFQUNELENBTkQsSUFNTyxDQUNMLEtBQU0sSUFBSUMsTUFBSixpQkFBMEJxQixHQUExQixDQUFOLENBQ0QsQ0FDRixDLDRDQUdZMUQsWSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFhNTEh0dHBSZXF1ZXN0IGFzIFhIUiB9IGZyb20gJ3htbGh0dHByZXF1ZXN0JztcbmltcG9ydCAqIGFzIFhtbSBmcm9tICd4bW0tY2xpZW50JztcbmltcG9ydCByYXBpZE1peEFkYXB0ZXJzIGZyb20gJ3JhcGlkLW1peC1hZGFwdGVycyc7XG5cbmNvbnN0IGlzTm9kZSA9IG5ldyBGdW5jdGlvbihcInRyeSB7cmV0dXJuIHRoaXM9PT1nbG9iYWw7fWNhdGNoKGUpe3JldHVybiBmYWxzZTt9XCIpO1xuXG5jb25zdCBrbm93blRhcmdldHMgPSB7XG4gIHhtbTogWyAnZ21tJywgJ2dtcicsICdoaG1tJywgJ2hobXInIF1cbn07XG5cbmNvbnN0IGRlZmF1bHRYbW1Db25maWcgPSB7XG4gIG1vZGVsVHlwZTogJ2dtbScsXG4gIGdhdXNzaWFuczogMSxcbiAgYWJzb2x1dGVSZWd1bGFyaXphdGlvbjogMC4wMSxcbiAgcmVsYXRpdmVSZWd1bGFyaXphdGlvbjogMC4wMSxcbiAgY292YXJpYW5jZU1vZGU6ICdmdWxsJyxcbiAgaGllcmFyY2hpY2FsOiB0cnVlLFxuICBzdGF0ZXM6IDEsXG4gIHRyYW5zaXRpb25Nb2RlOiAnbGVmdHJpZ2h0JyxcbiAgcmVncmVzc2lvbkVzdGltYXRvcjogJ2Z1bGwnLFxuICBsaWtlbGlob29kV2luZG93OiAxMCxcbn07XG5cbi8qKlxuICogUmVwcmVzZW50YXRpb24gb2YgYSBnZXN0dXJlIG1vZGVsLiBBIGluc3RhbmNlIG9mIGBYbW1Qcm9jZXNzb3JgIGNhblxuICogdHJhaW4gYSBtb2RlbCBmcm9tIGV4YW1wbGVzIGFuZCBjYW4gcGVyZm9ybSBjbGFzc2lmaWNhdGlvbiBhbmQvb3JcbiAqIHJlZ3Jlc3Npb24gZGVwZW5kaW5nIG9uIHRoZSBjaG9zZW4gYWxnb3JpdGhtLlxuICpcbiAqIFRoZSB0cmFpbmluZyBpcyBjdXJyZW50bHkgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgcmVtb3RlIHNlcnZlci1zaWRlXG4gKiBBUEksIHRoYXQgbXVzdCBiZSBhYmxlIHRvIHByb2Nlc3MgcmFwaWRNaXggY29tcGxpYW50IEpTT04gZm9ybWF0cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE92ZXJyaWRlIGRlZmF1bHQgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnVybD0naHR0cHM6Ly9jb21vLmlyY2FtLmZyL2FwaS92MS90cmFpbiddIC0gVXJsXG4gKiAgb2YgdGhlIHRyYWluaW5nIGVuZCBwb2ludC5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0ICogYXMgbWFubyBmcm9tICdtYW5vLWpzL2NsaWVudCc7XG4gKlxuICogY29uc3QgcHJvY2Vzc2VkU2Vuc29ycyA9IG5ldyBtYW5vLlByb2Nlc3NlZFNlbnNvcnMoKTtcbiAqIGNvbnN0IGV4YW1wbGUgPSBuZXcgbWFuby5FeGFtcGxlKCk7XG4gKiBjb25zdCB0cmFpbmluZ1NldCA9IG5ldyBtYW5vLlRyYWluaW5nU2V0KCk7XG4gKiBjb25zdCB4bW1Qcm9jZXNzb3IgPSBuZXcgbWFuby5YbW1Qcm9jZXNzc29yKCk7XG4gKlxuICogZXhhbXBsZS5zZXRMYWJlbCgndGVzdCcpO1xuICogcHJvY2Vzc2VkU2Vuc29ycy5hZGRMaXN0ZW5lcihleGFtcGxlLmFkZEVsZW1lbnQpO1xuICpcbiAqIC8vIGxhdGVyXG4gKiBwcm9jZXNzZWRTZW5zb3JzLnJlbW92ZUxpc3RlbmVyKGV4YW1wbGUuYWRkRWxlbWVudCk7XG4gKiBjb25zdCByYXBpZE1peEpzb25FeGFtcGxlID0gZXhhbXBsZS50b0pTT04oKTtcbiAqXG4gKiB0cmFpbmluZ1NldC5hZGRFeGFtcGxlKHJhcGlkTWl4SnNvbkV4YW1wbGUpO1xuICogY29uc3QgcmFwaWRNaXhKc29uVHJhaW5pbmdTZXQgPSB0cmFpbmluZ1NldC50b0pTT04oKTtcbiAqXG4gKiB4bW1Qcm9jZXNzb3JcbiAqICAgLnRyYWluKHJhcGlkTWl4SnNvblRyYWluaW5nU2V0KVxuICogICAudGhlbigoKSA9PiB7XG4gKiAgICAgLy8gc3RhcnQgZGVjb2RpbmdcbiAqICAgICBwcm9jZXNzZWRTZW5zb3JzLmFkZExpc3RlbmVyKGRhdGEgPT4ge1xuICogICAgICAgY29uc3QgcmVzdWx0cyA9IHhtbVByb2Nlc3Nvci5ydW4oZGF0YSk7XG4gKiAgICAgICBjb25zb2xlLmxvZyhyZXN1bHRzKTtcbiAqICAgICB9KTtcbiAqICAgfSk7XG4gKi9cbmNsYXNzIFhtbVByb2Nlc3NvciB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICB1cmwgPSAnaHR0cHM6Ly9jb21vLmlyY2FtLmZyL2FwaS92MS90cmFpbicsXG4gIH0gPSB7fSkge1xuICAgIHRoaXMudXJsID0gdXJsO1xuXG4gICAgdGhpcy5fY29uZmlnID0ge307XG4gICAgdGhpcy5fZGVjb2RlciA9IG51bGw7XG4gICAgdGhpcy5fbW9kZWwgPSBudWxsO1xuICAgIHRoaXMuX21vZGVsVHlwZSA9IG51bGw7XG4gICAgdGhpcy5fbGlrZWxpaG9vZFdpbmRvdyA9IG51bGw7XG5cbiAgICB0aGlzLnNldENvbmZpZyhkZWZhdWx0WG1tQ29uZmlnKTtcbiAgICB0aGlzLl9zZXREZWNvZGVyKCk7XG4gIH1cblxuICBfc2V0RGVjb2RlcigpIHtcbiAgICBzd2l0Y2ggKHRoaXMuX21vZGVsVHlwZSkge1xuICAgICAgY2FzZSAnaGhtbSc6XG4gICAgICAgIHRoaXMuX2RlY29kZXIgPSBuZXcgWG1tLkhobW1EZWNvZGVyKHRoaXMuX2xpa2VsaWhvb2RXaW5kb3cpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2dtbSc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLl9kZWNvZGVyID0gbmV3IFhtbS5HbW1EZWNvZGVyKHRoaXMuX2xpa2VsaWhvb2RXaW5kb3cpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIG1vZGVsJ3MgdGVtcG9yYWwgZGVjb2Rpbmcgc3RhdGUuIElzIG9ubHkgdmFsaWQgb24gYGhobW1gIGRlY29kZXIuXG4gICAqL1xuICByZXNldCgpIHtcbiAgICBpZiAodGhpcy5fZGVjb2Rlci5yZXNldClcbiAgICAgIHRoaXMuX2RlY29kZXIucmVzZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFpbiB0aGUgbW9kZWwgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBgVHJhaW5pbmdTZXRgLiBJbiB0aGlzIGltcGxtZW50YXRpb25cbiAgICogdGhlIHRyYWluaW5nIGlzIHBlcmZvcm1lZCBzZXJ2ZXItc2lkZSBhbmQgcmVseSBvbiBhbiBYSFIgY2FsbC5cbiAgICpcbiAgICogQHBhcmFtIHtKU09OfSB0cmFpbmluZ1NldCAtIFJhcGlkTWl4IGNvbXBsaWFudCBKU09OIGZvcm1hdHRlZCB0cmFpbmluZyBzZXRcbiAgICogQHJldHVybiB7UHJvbWlzZX0gLSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgb24gdGhlIEFQSSByZXNwb25zZSAoUmFwaWRNaXggQVBJXG4gICAqICByZXNwb25zZSBmb3JtYXQpLCB3aGVuIHRoZSBtb2RlbCBpcyB1cGRhdGVkLlxuICAgKi9cbiAgdHJhaW4odHJhaW5pbmdTZXQpIHtcbiAgICAvLyBSRVNUIHJlcXVlc3QgLyByZXNwb25zZSAtIFJhcGlkTWl4XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRyYWluaW5nRGF0YSA9IHtcbiAgICAgICAgZG9jVHlwZTogJ3JhcGlkLW1peDptbDpodHRwLXJlcXVlc3QnLFxuICAgICAgICBkb2NWZXJzaW9uOiByYXBpZE1peEFkYXB0ZXJzLlJBUElEX01JWF9ET0NfVkVSU0lPTixcbiAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5nZXRDb25maWcoKSxcbiAgICAgICAgdHJhaW5pbmdTZXQ6IHRyYWluaW5nU2V0XG4gICAgICB9O1xuXG4gICAgICBjb25zdCB4aHIgPSBpc05vZGUoKSA/IG5ldyBYSFIoKSA6IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG4gICAgICB4aHIub3BlbigncG9zdCcsIHRoaXMudXJsLCB0cnVlKTtcbiAgICAgIHhoci5yZXNwb25zZVR5cGUgPSAnanNvbic7XG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonKTtcbiAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuXG4gICAgICBjb25zdCBlcnJvck1zZyA9ICdhbiBlcnJvciBvY2N1cmVkIHdoaWxlIHRyYWluaW5nIHRoZSBtb2RlbC4gJztcblxuICAgICAgaWYgKGlzTm9kZSgpKSB7IC8vIFhNTEh0dHBSZXF1ZXN0IG1vZHVsZSBvbmx5IHN1cHBvcnRzIHhociB2MVxuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCkge1xuICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICBjb25zdCBib2R5ID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgdGhpcy5fZGVjb2Rlci5zZXRNb2RlbChib2R5Lm1vZGVsLnBheWxvYWQpO1xuICAgICAgICAgICAgICB0aGlzLl9tb2RlbCA9IGJvZHkubW9kZWw7XG4gICAgICAgICAgICAgIHJlc29sdmUoYm9keSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cgKyBgcmVzcG9uc2UgOiAke3hoci5zdGF0dXN9IC0gJHt4aHIucmVzcG9uc2VUZXh0fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHsgLy8gdXNlIHhociB2MlxuICAgICAgICB4aHIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSB4aHIucmVzcG9uc2U7XG4gICAgICAgICAgICB0aGlzLl9kZWNvZGVyLnNldE1vZGVsKGJvZHkubW9kZWwucGF5bG9hZCk7XG4gICAgICAgICAgICB0aGlzLl9tb2RlbCA9IGJvZHkubW9kZWw7XG4gICAgICAgICAgICByZXNvbHZlKGJvZHkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNc2cgKyBgcmVzcG9uc2UgOiAke3hoci5zdGF0dXN9IC0gJHt4aHIucmVzcG9uc2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHhoci5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1zZyArIGByZXNwb25zZSA6ICR7eGhyLnN0YXR1c30gLSAke3hoci5yZXNwb25zZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB4aHIuc2VuZChKU09OLnN0cmluZ2lmeSh0cmFpbmluZ0RhdGEpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIHRoZSBjYWxzc2lmaWNhdGlvbiBvciB0aGUgcmVncmVzc2lvbiBvZiB0aGUgZ2l2ZW4gdmVjdG9yLlxuICAgKlxuICAgKiBAcGFyYW0ge0Zsb2F0MzJBcnJheXxBcnJheX0gdmVjdG9yIC0gSW5wdXQgdmVjdG9yIGZvciB0aGUgZGVjb2RpbmcuXG4gICAqIEByZXR1cm4ge09iamVjdH0gcmVzdWx0cyAtIE9iamVjdCBjb250YWluaW5nIHRoZSBkZWNvZGluZyByZXN1bHRzLlxuICAgKi9cbiAgcnVuKHZlY3Rvcikge1xuICAgIGlmICh2ZWN0b3IgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHwgdmVjdG9yIGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5KSB7XG4gICAgICB2ZWN0b3IgPSBBcnJheS5mcm9tKHZlY3Rvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2RlY29kZXIuZmlsdGVyKHZlY3Rvcik7XG4gIH1cblxuICAvKipcbiAgICogUmFwaWRNaXggY29tcGxpYW50IGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9IC0gUmFwaWRNaXggQ29uZmlndXJhdGlvbiBvYmplY3QuXG4gICAqL1xuICBnZXRDb25maWcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRvY1R5cGU6ICdyYXBpZC1taXg6bWw6Y29uZmlndXJhdGlvbicsXG4gICAgICBkb2NWZXJzaW9uOiByYXBpZE1peEFkYXB0ZXJzLlJBUElEX01JWF9ET0NfVkVSU0lPTixcbiAgICAgIHRhcmdldDoge1xuICAgICAgICBuYW1lOiBgeG1tOiR7dGhpcy5fbW9kZWxUeXBlfWAsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCdcbiAgICAgIH0sXG4gICAgICBwYXlsb2FkOiB0aGlzLl9jb25maWcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG1vZGVsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAob3IgYSBzdWJzZXQgb2YgdGhlbSkuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgLSBSYXBpZE1peCBjb25maWd1cmF0aW9uIG9iamVjdCAob3IgcGF5bG9hZCksIG9yIHN1YnNldCBvZiBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgc2V0Q29uZmlnKGNvbmZpZyA9IHt9KSB7XG4gICAgaWYgKCFjb25maWcpXG4gICAgICByZXR1cm47XG5cbiAgICAvLyByZXBsYWNlIGxhdGVyIGJ5IGlzVmFsaWRSYXBpZE1peENvbmZpZ3VyYXRpb24gKG1vZGVsVHlwZSBzaG91bGRuJ3QgYmUgYWxsb3dlZCBpbiBwYXlsb2FkKVxuICAgIGlmIChjb25maWcuZG9jVHlwZSA9PT0gJ3JhcGlkLW1peDptbDpjb25maWd1cmF0aW9uJyAmJiBjb25maWcuZG9jVmVyc2lvbiAmJiBjb25maWcucGF5bG9hZCAmJlxuICAgICAgICBjb25maWcudGFyZ2V0ICYmIGNvbmZpZy50YXJnZXQubmFtZSAmJiBjb25maWcudGFyZ2V0Lm5hbWUuc3BsaXQoJzonKVswXSA9PT0gJ3htbScpIHtcblxuICAgICAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldC5uYW1lLnNwbGl0KCc6Jyk7XG4gICAgICBjb25maWcgPSBjb25maWcucGF5bG9hZDtcbiAgICAgIGlmICh0YXJnZXQubGVuZ3RoID4gMSAmJiBrbm93blRhcmdldHMueG1tLmluZGV4T2YodGFyZ2V0WzFdKSA+IC0xKSB7XG4gICAgICAgIGlmICh0aGlzLl9tb2RlbFR5cGUgIT09IHRhcmdldFsxXSkge1xuICAgICAgICAgIHRoaXMuX21vZGVsVHlwZSA9IHRhcmdldFsxXTtcbiAgICAgICAgICB0aGlzLl9zZXREZWNvZGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLm1vZGVsVHlwZSAmJiBrbm93blRhcmdldHNbJ3htbSddLmluZGV4T2YoY29uZmlnLm1vZGVsVHlwZSkgPiAtMSkge1xuICAgICAgY29uc3QgdmFsID0gY29uZmlnLm1vZGVsVHlwZTtcbiAgICAgIGNvbnN0IG5ld01vZGVsID0gKHZhbCA9PT0gJ2dtcicpID8gJ2dtbScgOiAoKHZhbCA9PT0gJ2hobXInKSA/ICdoaG1tJyA6IHZhbCk7XG5cbiAgICAgIGlmIChuZXdNb2RlbCAhPT0gdGhpcy5fbW9kZWxUeXBlKSB7XG4gICAgICAgIHRoaXMuX21vZGVsVHlwZSA9IG5ld01vZGVsO1xuICAgICAgICB0aGlzLl9zZXREZWNvZGVyKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKGNvbmZpZykpIHtcbiAgICAgIGNvbnN0IHZhbCA9IGNvbmZpZ1trZXldO1xuXG4gICAgICBpZiAoKGtleSA9PT0gJ2dhdXNzaWFucycgJiYgTnVtYmVyLmlzSW50ZWdlcih2YWwpICYmIHZhbCA+IDApIHx8XG4gICAgICAgICAgKGtleSA9PT0gJ2Fic29sdXRlUmVndWxhcml6YXRpb24nICYmIHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIHZhbCA+IDApIHx8XG4gICAgICAgICAgKGtleSA9PT0gJ3JlbGF0aXZlUmVndWxhcml6YXRpb24nICYmIHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmIHZhbCA+IDApIHx8XG4gICAgICAgICAgKGtleSA9PT0gJ2NvdmFyaWFuY2VNb2RlJyAmJiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgWydmdWxsJywgJ2RpYWdvbmFsJ10uaW5kZXhPZih2YWwpID4gLTEpIHx8XG4gICAgICAgICAgKGtleSA9PT0gJ2hpZXJhcmNoaWNhbCcgJiYgdHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB8fFxuICAgICAgICAgIChrZXkgPT09ICdzdGF0ZXMnICYmIE51bWJlci5pc0ludGVnZXIodmFsKSAmJiB2YWwgPiAwKSB8fFxuICAgICAgICAgIChrZXkgPT09ICd0cmFuc2l0aW9uTW9kZScgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIFsnbGVmdHJpZ2h0JywgJ2VyZ29kaWMnXS5pbmRleE9mKHZhbCkgPiAtMSkgfHxcbiAgICAgICAgICAoa2V5ID09PSAncmVncmVzc2lvbkVzdGltYXRvcicgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgIFsnZnVsbCcsICd3aW5kb3dlZCcsICdsaWtlbGllc3QnXS5pbmRleE9mKHZhbCkgPiAtMSkpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnW2tleV0gPSB2YWw7XG4gICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2xpa2VsaWhvb2RXaW5kb3cnICYmIE51bWJlci5pc0ludGVnZXIodmFsKSAmJiB2YWwgPiAwKSB7XG4gICAgICAgIHRoaXMuX2xpa2VsaWhvb2RXaW5kb3cgPSB2YWw7XG5cbiAgICAgICAgaWYgKHRoaXMuX2RlY29kZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9kZWNvZGVyLnNldExpa2VsaWhvb2RXaW5kb3codGhpcy5fbGlrZWxpaG9vZFdpbmRvdyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIG1vZGVsIGluIFJhcGlkTWl4IG1vZGVsIGZvcm1hdC5cbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fSAtIEN1cnJlbnQgUmFwaWRNaXggTW9kZWwgb2JqZWN0LlxuICAgKi9cbiAgZ2V0TW9kZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZ2l2ZW4gUmFwaWRNaXggbW9kZWwgb2JqZWN0IGZvciB0aGUgZGVjb2RpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCAtIFJhcGlkTWl4IE1vZGVsIG9iamVjdC5cbiAgICovXG4gIHNldE1vZGVsKG1vZGVsKSB7XG4gICAgaWYgKCFtb2RlbCkge1xuICAgICAgdGhpcy5tb2RlbCA9IG51bGw7XG4gICAgICB0aGlzLl9kZWNvZGVyLnNldE1vZGVsKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBtb2RlbC50YXJnZXQubmFtZS5zcGxpdCgnOicpO1xuICAgIGNvbnN0IGxpYiA9IHRhcmdldHNbMF07XG4gICAgY29uc3QgYWxnbyA9IHRhcmdldHNbMV07XG5cbiAgICBpZiAobGliID09PSAneG1tJykge1xuICAgICAgdGhpcy5fbW9kZWxUeXBlID0gYWxnbyA9PT0gJ2hobW0nID8gYWxnbyA6ICdnbW0nO1xuXG4gICAgICB0aGlzLl9zZXREZWNvZGVyKCk7XG4gICAgICB0aGlzLl9tb2RlbCA9IG1vZGVsO1xuICAgICAgdGhpcy5fZGVjb2Rlci5zZXRNb2RlbChtb2RlbC5wYXlsb2FkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHR5cGUgJHtsaWJ9YCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFhtbVByb2Nlc3NvcjtcbiJdfQ== \ No newline at end of file