canvas-credit-score
Version:
Canvas实现类似支付宝的信用评分
8 lines • 52.7 kB
JavaScript
/*!
* canvas-credit-score.js v1.2.3
* (c) 2019-2019 crper(crper@outlook.com)
* Released under the MIT License.
*/
"use strict";function _typeof(t){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function _defineProperties(t,e){for(var i=0;i<e.length;i++){var o=e[i];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function _createClass(t,e,i){return e&&_defineProperties(t.prototype,e),i&&_defineProperties(t,i),t}function _defineProperty(t,e,i){return e in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}function ownKeys(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),i.push.apply(i,o)}return i}function _objectSpread2(t){for(var e=1;e<arguments.length;e++){var i=null!=arguments[e]?arguments[e]:{};e%2?ownKeys(i,!0).forEach(function(e){_defineProperty(t,e,i[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):ownKeys(i).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(i,e))})}return t}function getRadian(t){return Math.PI/180*t}function getDegrees(t){return 180/Math.PI*t}function getRadiusPoint(t,e,i,o){return{x1:t+i*Math.cos(o),y1:e+i*Math.sin(o)}}function randomHexColor(){for(var t=Math.floor(16777216*Math.random()).toString(16);t.length<6;)t="0"+t;return"#"+t}function isObject(t){return t&&"object"===_typeof(t)&&!Array.isArray(t)}function mergeDeep(t){for(var e=arguments.length,i=new Array(e>1?e-1:0),o=1;o<e;o++)i[o-1]=arguments[o];if(!i.length)return t;var s=i.shift();if(isObject(t)&&isObject(s))for(var n in s)isObject(s[n])?(t[n]||Object.assign(t,_defineProperty({},n,{})),mergeDeep(t[n],s[n])):Object.assign(t,_defineProperty({},n,s[n]));return mergeDeep.apply(void 0,[t].concat(i))}var utils={getRadian:getRadian,getDegrees:getDegrees,getRadiusPoint:getRadiusPoint,randomHexColor:randomHexColor,isObject:isObject,mergeDeep:mergeDeep},CreditScore=function(){function t(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{arrowImg:""};_classCallCheck(this,t),_defineProperty(this,"canvas",void 0),_defineProperty(this,"ctx",void 0),_defineProperty(this,"ratio",void 0),_defineProperty(this,"options",void 0),_defineProperty(this,"pointImg",void 0),_defineProperty(this,"el",void 0),_defineProperty(this,"isDrawComplete",void 0),_defineProperty(this,"cacheParams",void 0),this.canvas=document.createElement("canvas"),this.ctx=this.canvas.getContext("2d"),this.ratio=window.devicePixelRatio,this.pointImg=new Image,this.isDrawComplete=!1,this.el=document.getElementById(e),this.cacheParams={},i&&i.arrowImg?this.pointImg.src=i.arrowImg:this.pointImg.src="data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgd2lkdGg9IjE2cHgiIGhlaWdodD0iMjRweCI+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiAgZmlsbD0icmdiKDI1NSwgMjU1LCAyNTUpIiBkPSJNOC4wMDAsMjQuMDA1IEMzLjU4MiwyNC4wMDUgLTAuMDAwLDIwLjUyNSAtMC4wMDAsMTYuMjMwIEMtMC4wMDAsMTEuOTM2IDguMDAwLC0wLjAwNSA4LjAwMCwtMC4wMDUgQzguMDAwLC0wLjAwNSAxNS45OTksMTEuOTM2IDE1Ljk5OSwxNi4yMzAgQzE1Ljk5OSwyMC41MjUgMTIuNDE4LDI0LjAwNSA4LjAwMCwyNC4wMDUgWk04LjAwMCwxMi4wNjUgQzUuNjI1LDEyLjA2NSAzLjcwMCwxMy45MzQgMy43MDAsMTYuMjM5IEMzLjcwMCwxOC41NDQgNS42MjUsMjAuNDEzIDguMDAwLDIwLjQxMyBDMTAuMzc1LDIwLjQxMyAxMi4zMDAsMTguNTQ0IDEyLjMwMCwxNi4yMzkgQzEyLjMwMCwxMy45MzQgMTAuMzc1LDEyLjA2NSA4LjAwMCwxMi4wNjUgWiIvPjwvc3ZnPg==",this.options=utils.mergeDeep({x:0,y:0,startAngle:165,endAngle:375,currentAngle:165,scoreStart:450,scoreTarget:770,scoreMin:450,scoreMax:850,scoreEvaDate:"评估日期:2019-04-01",scoreLevelText:"",segAngle:42,outerTextSeg:5,style:{line:{initColor:"rgba(255, 191, 150, 0.5)",activeColor:"#fff",width:1},dashLine:{initColor:"rgba(255, 191, 150, 0.5)",activeColor:"#fff",width:1},outerText:{fontSize:12,color:"#fff"},innerText:{score:{fontSize:36,color:"#fff"},level:{fontSize:16,color:"#fff"},date:{fontSize:12,color:"#f2f2f2",fontWeight:"normal"}}}},i),this.initElm()}return _createClass(t,[{key:"initElm",value:function(){if(!this.el)throw new Error("请传入一个渲染区域的ID");this.el.appendChild(this.canvas);var t=this.el.getBoundingClientRect(),e=t.height,i=t.width;console.log("height, width: ",e,i),this.canvasSize(i,e),this.options=_objectSpread2({},this.options,{x:e/2,y:i/2}),this.fixRangeValue(this.options),this.cacheParams=this.options,this.init()}},{key:"fixRangeValue",value:function(t){this.options=_objectSpread2({},t,{scoreStart:this.options.scoreMin,scoreTarget:this.options.scoreTarget>this.options.scoreMax?this.options.scoreMax:this.options.scoreTarget,currentAngle:this.options.startAngle})}},{key:"init",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options=utils.mergeDeep(this.options,t),this.fixRangeValue(this.options)}},{key:"canvasSize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:375,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:375;this.canvas.width=t*this.ratio,this.canvas.height=e*this.ratio,this.canvas.style.width="".concat(t,"px"),this.canvas.style.height="".concat(e,"px"),this.ctx.scale(this.ratio,this.ratio)}},{key:"stepAngleCalc",value:function(t,e,i){return(t-e)/i}},{key:"clearCanvas",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;this.ctx.clearRect(0,0,t,e)}},{key:"drawCircleLine",value:function(t,e){var i=t.color,o=void 0===i?"#fff":i,s=e.x,n=void 0===s?0:s,r=e.y,a=void 0===r?0:r,c=e.radius,h=void 0===c?0:c,l=e.startAngle,g=e.endAngle;this.ctx.beginPath(),this.ctx.arc(n,a,h,utils.getRadian(l||this.options.startAngle),utils.getRadian(g||this.options.endAngle)),this.ctx.strokeStyle=o,this.ctx.lineCap="round",this.ctx.lineWidth=1,this.ctx.stroke()}},{key:"drawOuterText",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:28,s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"#fff",n=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"normal";this.ctx.beginPath(),this.ctx.fillStyle=s,this.ctx.font="".concat(n," ").concat(o,"px Microsoft yahei"),this.ctx.textBaseline="ideographic",this.ctx.textAlign="left",this.ctx.fillText(i,t-this.ctx.measureText(i).width/2,e)}},{key:"drawOuterTextLine",value:function(t,e){for(var i=t.outerText,o=i.textArr,s=i.textAngelArr,n=i.textLenght,r=e.x,a=e.y,c=e.radius,h=0;h<n;h++){var l=utils.getRadian(s[h]),g=utils.getRadiusPoint(r,a,c,l),p=g.x1,u=g.y1;this.drawOuterText(p,u,""+o[h],this.options.style.outerText.fontSize,this.options.style.outerText.color)}}},{key:"drawCircle",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"#fff",s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];this.ctx.beginPath(),this.ctx.arc(t,e,i,0,2*Math.PI,s),this.ctx.fillStyle=o,this.ctx.fill()}},{key:"drawInnerText",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:30,s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:"#fff",n=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"bold";this.ctx.save(),this.ctx.fillStyle=s,this.ctx.font="".concat(n," ").concat(o,"px Microsoft yahei"),this.ctx.textAlign="center",this.ctx.fillText("".concat(i),t,e),this.ctx.textBaseline="ideographic",this.ctx.restore()}},{key:"waterDrop",value:function(t,e,i){this.ctx.save(),this.ctx.translate(t,e),this.ctx.rotate(utils.getRadian(i)),this.ctx.drawImage(this.pointImg,0,0,8,12),this.ctx.restore()}},{key:"moveWaterDrop",value:function(t,e,i,o){var s=utils.getRadiusPoint(t,e,i,utils.getRadian(o)),n=s.x1,r=s.y1;this.waterDrop(n,r,o+90)}},{key:"drawCircleDashLine",value:function(t,e){var i=t.color,o=void 0===i?"#ccc":i,s=e.x,n=e.y,r=e.radius,a=e.startAngle,c=e.endAngle;this.ctx.beginPath();for(var h=1;h<=this.options.segAngle;h++){var l=utils.getRadiusPoint(s,n,r,utils.getRadian(this.options.startAngle+this.stepAngleCalc(c||this.options.endAngle,a||this.options.startAngle,this.options.segAngle)*h)),g=l.x1,p=l.y1;this.drawCircle(g,p,1,o)}}},{key:"getNumberRange",value:function(t){return"score"===t?this.options.scoreMax-this.options.scoreMin:"angel"===t?this.options.endAngle-this.options.startAngle:0}},{key:"getScoreLevelText",value:function(t){if(t)return t;var e=Math.ceil(this.getNumberRange("score")/4);return this.options.scoreStart<=this.options.scoreMin+e?"信用中等":this.options.scoreStart>this.options.scoreMin+e&&this.options.scoreStart<=this.options.scoreMin+2*e?"信用良好":this.options.scoreStart>this.options.scoreMin+2*e&&this.options.scoreStart<=this.options.scoreMin+3*e?"信用优秀":this.options.scoreStart>this.options.scoreMin+3*e&&this.options.scoreStart<=this.options.scoreMin+4*e?"信用极高":""}},{key:"getOuterTextCollection",value:function(){var t=this,e=Math.ceil(this.getNumberRange("score")/(this.options.outerTextSeg-1)),i=Array.from(new Array(this.options.outerTextSeg),function(i,o){return t.options.outerTextSeg-1===o?t.options.scoreMax:e*o+t.options.scoreMin}),o=this.getNumberRange("angel")/(i.length-1),s=i.map(function(e,i){return t.options.startAngle+o*i});return{textArr:i,textLenght:i.length,textAngelArr:s}}},{key:"drawBaseMap",value:function(){if(this.clearCanvas(this.canvas.width,this.canvas.height),this.drawOuterTextLine({outerText:this.getOuterTextCollection()},{x:this.options.x,y:this.options.y,radius:.82*this.options.x}),this.drawCircleLine({color:this.options.style.line.initColor},{x:this.options.x,y:this.options.y,radius:.7*this.options.x}),this.drawCircleDashLine({color:this.options.style.dashLine.initColor},{x:this.options.x,y:this.options.y,radius:.6666666*this.options.x}),this.drawInnerText(this.options.x,this.options.y-20,this.options.scoreTarget-this.options.scoreStart<5?this.options.scoreTarget:this.options.scoreStart,this.options.style.innerText.score.fontSize,this.options.style.innerText.score.color),this.drawInnerText(this.options.x,this.options.y+5,this.options.scoreLevelText?this.options.scoreLevelText:this.getScoreLevelText(),this.options.style.innerText.level.fontSize,this.options.style.innerText.level.color),this.drawInnerText(this.options.x,this.options.y+25,this.options.scoreEvaDate,this.options.style.innerText.date.fontSize,this.options.style.innerText.date.color,this.options.style.innerText.date.fontWeight),this.drawCircleLine({color:this.options.style.line.activeColor},{x:this.options.x,y:this.options.y,radius:.7*this.options.x,startAngle:this.options.startAngle,endAngle:this.options.currentAngle}),this.drawCircleDashLine({color:this.options.style.dashLine.activeColor},{x:this.options.x,y:this.options.y,radius:.6666666*this.options.x,startAngle:this.options.startAngle,endAngle:this.options.currentAngle}),this.moveWaterDrop(this.options.x,this.options.y,.6*this.options.x,this.options.currentAngle),this.options.scoreStart<this.options.scoreTarget){var t=this.stepAngleCalc(this.options.endAngle,this.options.startAngle,this.options.segAngle);this.options.currentAngle+=t;var e=this.getNumberRange("score")*t/this.getNumberRange("angel");this.options.scoreStart=this.options.scoreStart+Math.round(e),this.options.scoreStart>=this.options.scoreTarget&&(this.options.scoreStart=this.options.scoreTarget);var i=this.options.startAngle+this.getNumberRange("score")*(this.options.scoreTarget-this.options.scoreMin)/this.getNumberRange("score");if(this.options.currentAngle>=i)return this.isDrawComplete=!0,this.ctx.save(),!1;window.requestAnimationFrame(this.drawBaseMap.bind(this))}}},{key:"refresh",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1e3,i=arguments.length>1?arguments[1]:void 0,o=setTimeout(function(){clearTimeout(o),t.isDrawComplete&&(t.isDrawComplete=!1),t.init(t.cacheParams),t.drawBaseMap(),i&&i()},e)}}]),t}();module.exports=CreditScore;
/*powered by crper(crper@outlook.com) */
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzLWNyZWRpdC1zY29yZS5janMuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9pbmRleC50cyIsIi4uLy4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIOiOt+WPluW8p+W6plxuICpcbiAqIEBwYXJhbSAgIHtudW1iZXJ9ICBkZWdyZWVzICBb5Lyg5YWl6KeS5bqmXVxuICpcbiAqIEByZXR1cm4gIHtudW1iZXJ9ICAgICAgICAgICBb6L+U5Zue5byn6ZW/XVxuICovXG5mdW5jdGlvbiBnZXRSYWRpYW4oZGVncmVlczogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIChNYXRoLlBJIC8gMTgwKSAqIGRlZ3JlZXM7XG59XG5cbi8qKlxuICog6I635Y+W5bqm5pWwXG4gKlxuICogQHBhcmFtICAge251bWJlcn0gIHJhZGlhbiAgW+S8oOWFpeW8p+mVv11cbiAqXG4gKiBAcmV0dXJuICB7bnVtYmVyfSAgICAgICAgICBb6L+U5Zue5bqm5pWwXVxuICovXG5mdW5jdGlvbiBnZXREZWdyZWVzKHJhZGlhbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuICgxODAgLyBNYXRoLlBJKSAqIHJhZGlhbjtcbn1cblxuLy8g6I635Y+W5ZyG6L655LiK54K555qE5Z2Q5qCHXG5mdW5jdGlvbiBnZXRSYWRpdXNQb2ludChcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIHJhZGl1czogbnVtYmVyLFxuICBkZWdyZWVzOiBudW1iZXJcbik6IHsgeDE6IG51bWJlcjsgeTE6IG51bWJlciB9IHtcbiAgcmV0dXJuIHtcbiAgICB4MTogeCArIHJhZGl1cyAqIE1hdGguY29zKGRlZ3JlZXMpLFxuICAgIHkxOiB5ICsgcmFkaXVzICogTWF0aC5zaW4oZGVncmVlcylcbiAgfTtcbn1cblxuLy8g55Sf5oiQ6ZqP5py655qEMTbov5vliLbpopzoibJcbmZ1bmN0aW9uIHJhbmRvbUhleENvbG9yKCk6IHN0cmluZyB7XG4gIC8v6ZqP5py655Sf5oiQ5Y2B5YWt6L+b5Yi26aKc6ImyXG4gIHZhciBoZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxNjc3NzIxNikudG9TdHJpbmcoMTYpOyAvL+eUn+aIkGZmZmZmZuS7peWGhTE26L+b5Yi25pWwXG4gIHdoaWxlIChoZXgubGVuZ3RoIDwgNikge1xuICAgIC8vd2hpbGXlvqrnjq/liKTmlq1oZXjkvY3mlbDvvIzlsJHkuo425L2N5YmN6Z2i5YqgMOWHkeWknzbkvY1cbiAgICBoZXggPSAnMCcgKyBoZXg7XG4gIH1cbiAgcmV0dXJuICcjJyArIGhleDsgLy/ov5Tlm57igJgj4oCZ5byA5aS0MTbov5vliLbpopzoibJcbn1cblxuLyoqXG4gKiBbaXNPYmplY3Qg5Yik5pat5piv5ZCm5Li65LiA5Liq5a+56LGhXVxuICpcbiAqIEBwYXJhbSAgIHtbdHlwZV19ICBpdGVtICBb5Lyg5YWl55qE5YC8XVxuICpcbiAqIEByZXR1cm4gIHtbdHlwZV19ICAgICAgICBb6L+U5Zue5biD5bCU5YC8XVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoaXRlbTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBpdGVtICYmIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpdGVtKTtcbn1cblxuLyoqXG4gKiBbbWVyZ2VEZWVwIGRlc2NyaXB0aW9uXVxuICpcbiAqIEBwYXJhbSAgIHtbdHlwZV19ICB0YXJnZXQ6ICAgICAgW3RhcmdldDog6KKr5ZCI5bm255qE5a+56LGhXVxuICogQHBhcmFtICAge1t0eXBlXX0gIC4uLnNvdXJjZXM6ICBbLi4uc291cmNlczog5ZCI5bm255qE5a+56LGhXVxuICpcbiAqIEByZXR1cm4gIHthbnl9ICAgICAgICAgICAgICAgICAgW3JldHVybiDmt7HlkIjlubblkI7nmoTlr7nosaFdXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZURlZXAodGFyZ2V0OiBhbnksIC4uLnNvdXJjZXM6IGFueVtdKTogYW55IHtcbiAgaWYgKCFzb3VyY2VzLmxlbmd0aCkgcmV0dXJuIHRhcmdldDtcbiAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuXG4gIGlmIChpc09iamVjdCh0YXJnZXQpICYmIGlzT2JqZWN0KHNvdXJjZSkpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChpc09iamVjdChzb3VyY2Vba2V5XSkpIHtcbiAgICAgICAgaWYgKCF0YXJnZXRba2V5XSkgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHt9IH0pO1xuICAgICAgICBtZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7IFtrZXldOiBzb3VyY2Vba2V5XSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZ2V0UmFkaWFuLFxuICBnZXREZWdyZWVzLFxuICBnZXRSYWRpdXNQb2ludCxcbiAgcmFuZG9tSGV4Q29sb3IsXG4gIGlzT2JqZWN0LFxuICBtZXJnZURlZXBcbn07XG4iLCJpbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5cbi8vIOm7mOiupOWPguaVsOeahOexu+Wei1xuaW50ZXJmYWNlIFN0eWxlUGFyYW1zIHtcbiAgbGluZToge1xuICAgIGluaXRDb2xvcjogc3RyaW5nOyAvLyDliJ3lp4vljJbpopzoibJcbiAgICBhY3RpdmVDb2xvcjogc3RyaW5nOyAvLyDpq5jkuq7nmoTpopzoibJcbiAgICB3aWR0aDogbnVtYmVyOyAvLyDnur/mnaHnmoTnspfnu4ZcbiAgfTtcbiAgZGFzaExpbmU6IHtcbiAgICBpbml0Q29sb3I6IHN0cmluZzsgLy8g5Yid5aeL5YyW6aKc6ImyXG4gICAgYWN0aXZlQ29sb3I6IHN0cmluZzsgLy8g6auY5Lqu55qE6aKc6ImyXG4gICAgd2lkdGg6IG51bWJlcjsgLy8g57q/5p2h55qE57KX57uGXG4gIH07XG4gIG91dGVyVGV4dDoge1xuICAgIC8vIOWklueOr+aWh+acrFxuICAgIGZvbnRTaXplOiBudW1iZXI7XG4gICAgY29sb3I6IHN0cmluZztcbiAgfTtcbiAgaW5uZXJUZXh0OiB7XG4gICAgc2NvcmU6IHtcbiAgICAgIGZvbnRTaXplOiBudW1iZXI7XG4gICAgICBjb2xvcjogc3RyaW5nO1xuICAgIH07XG4gICAgbGV2ZWw6IHtcbiAgICAgIGZvbnRTaXplOiBudW1iZXI7XG4gICAgICBjb2xvcjogc3RyaW5nO1xuICAgIH07XG4gICAgZGF0ZToge1xuICAgICAgZm9udFNpemU6IG51bWJlcjtcbiAgICAgIGNvbG9yOiBzdHJpbmc7XG4gICAgICBmb250V2VpZ2h0OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIERlZmF1bHRQYXJhbXMge1xuICBhcnJvd0ltZzogc3RyaW5nOyAvLyDnrq3lpLQgYmFzZTY0XG4gIHg6IG51bWJlcjsgLy8g5ZyG5b+D55qEeOWdkOagh1xuICB5OiBudW1iZXI7IC8vIOWchuW/g+eahHnlnZDmoIdcbiAgc3RhcnRBbmdsZTogbnVtYmVyOyAvLyDlvIDlp4vnmoTop5LluqZcbiAgZW5kQW5nbGU6IG51bWJlcjsgLy8g57uT5p2f55qE6KeS5bqmXG4gIGN1cnJlbnRBbmdsZTogbnVtYmVyOyAvLyDlvZPliY3nmoTop5LluqZcbiAgc2NvcmVTdGFydDogbnVtYmVyOyAvLyDotbfmraXliIZcbiAgc2NvcmVUYXJnZXQ6IG51bWJlcjsgLy8g55uu5qCH5YiGXG4gIHNjb3JlTWluOiBudW1iZXI7IC8vIOacgOS9juWIhlxuICBzY29yZU1heDogbnVtYmVyOyAvLyDmnIDpq5jliIZcbiAgc2NvcmVFdmFEYXRlOiBzdHJpbmc7IC8vIOivhOS8sOaXpeacn1xuICBzZWdBbmdsZTogbnVtYmVyOyAvLyDmgLvop5LluqbliIbmiJDlh6DnrYnliIZcbiAgb3V0ZXJUZXh0U2VnOiBudW1iZXI7IC8vIOWkluWbtOaWh+acrOWIhuaIkOWHoOS7vVxuICBzdHlsZTogU3R5bGVQYXJhbXM7IC8vIOagt+W8j1xuICBzY29yZUxldmVsVGV4dDogc3RyaW5nOyAvLyDkv6HnlKjnrYnnuqfmlofmnKxcbn1cblxuY2xhc3MgQ3JlZGl0U2NvcmUge1xuICBwdWJsaWMgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcHVibGljIGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICBwdWJsaWMgcmF0aW86IG51bWJlcjtcbiAgcHVibGljIG9wdGlvbnM6IERlZmF1bHRQYXJhbXM7XG5cbiAgcHVibGljIHBvaW50SW1nOiBIVE1MSW1hZ2VFbGVtZW50O1xuXG4gIHB1YmxpYyBlbDogSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gIHB1YmxpYyBpc0RyYXdDb21wbGV0ZTogYm9vbGVhbjtcblxuICBwdWJsaWMgY2FjaGVQYXJhbXM6IHt9O1xuXG4gIGNvbnN0cnVjdG9yKGVsOiBzdHJpbmcsIG9wdGlvbnMgPSB7IGFycm93SW1nOiAnJyB9KSB7XG4gICAgdGhpcy5jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoJzJkJykgYXMgYW55O1xuICAgIHRoaXMucmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzsgLy8g5YOP57Sg5q+UXG4gICAgdGhpcy5wb2ludEltZyA9IG5ldyBJbWFnZSgpOyAvLyDmlrDlu7rkuIDkuKrlm77niYflrp7kvotcbiAgICB0aGlzLmlzRHJhd0NvbXBsZXRlID0gZmFsc2U7IC8vIOeUu+W4g+aYr+WQpua4suafk+WujOavlVxuICAgIHRoaXMuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbCk7XG4gICAgdGhpcy5jYWNoZVBhcmFtcyA9IHt9O1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYXJyb3dJbWcpIHtcbiAgICAgIHRoaXMucG9pbnRJbWcuc3JjID0gb3B0aW9ucy5hcnJvd0ltZztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wb2ludEltZy5zcmMgPVxuICAgICAgICAnZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlBZ2VHMXNibk05SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpJd01EQXZjM1puSWlCNGJXeHVjenA0YkdsdWF6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZNVGs1T1M5NGJHbHVheUlnZDJsa2RHZzlJakUyY0hnaUlHaGxhV2RvZEQwaU1qUndlQ0krUEhCaGRHZ2dabWxzYkMxeWRXeGxQU0psZG1WdWIyUmtJaUFnWm1sc2JEMGljbWRpS0RJMU5Td2dNalUxTENBeU5UVXBJaUJrUFNKTk9DNHdNREFzTWpRdU1EQTFJRU16TGpVNE1pd3lOQzR3TURVZ0xUQXVNREF3TERJd0xqVXlOU0F0TUM0d01EQXNNVFl1TWpNd0lFTXRNQzR3TURBc01URXVPVE0ySURndU1EQXdMQzB3TGpBd05TQTRMakF3TUN3dE1DNHdNRFVnUXpndU1EQXdMQzB3TGpBd05TQXhOUzQ1T1Rrc01URXVPVE0ySURFMUxqazVPU3d4Tmk0eU16QWdRekUxTGprNU9Td3lNQzQxTWpVZ01USXVOREU0TERJMExqQXdOU0E0TGpBd01Dd3lOQzR3TURVZ1drMDRMakF3TUN3eE1pNHdOalVnUXpVdU5qSTFMREV5TGpBMk5TQXpMamN3TUN3eE15NDVNelFnTXk0M01EQXNNVFl1TWpNNUlFTXpMamN3TUN3eE9DNDFORFFnTlM0Mk1qVXNNakF1TkRFeklEZ3VNREF3TERJd0xqUXhNeUJETVRBdU16YzFMREl3TGpReE15QXhNaTR6TURBc01UZ3VOVFEwSURFeUxqTXdNQ3d4Tmk0eU16a2dRekV5TGpNd01Dd3hNeTQ1TXpRZ01UQXVNemMxTERFeUxqQTJOU0E0TGpBd01Dd3hNaTR3TmpVZ1dpSXZQand2YzNablBnPT0nO1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IHV0aWxzLm1lcmdlRGVlcChcbiAgICAgIHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgICAgc3RhcnRBbmdsZTogMTY1LCAvLyDnlLvluIPnmoTotbfngrlcbiAgICAgICAgZW5kQW5nbGU6IDM3NSwgLy8g55S75biD55qE57uT5p2f54K5XG4gICAgICAgIGN1cnJlbnRBbmdsZTogMTY1LCAvLyDlvZPliY3nmoTop5LluqZcbiAgICAgICAgc2NvcmVTdGFydDogNDUwLCAvLyDotbfmraXliIZcbiAgICAgICAgc2NvcmVUYXJnZXQ6IDc3MCwgLy8g55uu5qCH5YiGXG4gICAgICAgIHNjb3JlTWluOiA0NTAsIC8vIOacgOS9juWIhlxuICAgICAgICBzY29yZU1heDogODUwLCAvLyDmnIDpq5jliIZcbiAgICAgICAgc2NvcmVFdmFEYXRlOiAn6K+E5Lyw5pel5pyf77yaMjAxOS0wNC0wMScsIC8vIOivhOS8sOaXpeacn1xuICAgICAgICBzY29yZUxldmVsVGV4dDogJycsIC8vIOS/oeeUqOetiee6p+aWh+Wtl1xuICAgICAgICBzZWdBbmdsZTogNDIsIC8vIOaAu+inkuW6puWIhuaIkOWHoOetieWIhixcbiAgICAgICAgb3V0ZXJUZXh0U2VnOiA1LCAvLyDmlbDlrZfojIPlm7TnrYnliIZcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBsaW5lOiB7XG4gICAgICAgICAgICAvLyDnur/mnaHpopzoibLmjqfliLZcbiAgICAgICAgICAgIGluaXRDb2xvcjogJ3JnYmEoMjU1LCAxOTEsIDE1MCwgMC41KScsIC8vIOWIneWni+WMluminOiJslxuICAgICAgICAgICAgYWN0aXZlQ29sb3I6ICcjZmZmJywgLy8g6auY5Lqu55qE6aKc6ImyXG4gICAgICAgICAgICB3aWR0aDogMSAvLyDnur/mnaHnmoTlh7rmga9cbiAgICAgICAgICB9LFxuICAgICAgICAgIGRhc2hMaW5lOiB7XG4gICAgICAgICAgICBpbml0Q29sb3I6ICdyZ2JhKDI1NSwgMTkxLCAxNTAsIDAuNSknLCAvLyDliJ3lp4vljJbpopzoibJcbiAgICAgICAgICAgIGFjdGl2ZUNvbG9yOiAnI2ZmZicsIC8vIOmrmOS6rueahOminOiJslxuICAgICAgICAgICAgd2lkdGg6IDEgLy8g57q/5p2h55qE57KX57uGXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvdXRlclRleHQ6IHtcbiAgICAgICAgICAgIC8vIOWklueOr+aWh+acrFxuICAgICAgICAgICAgZm9udFNpemU6IDEyLFxuICAgICAgICAgICAgY29sb3I6ICcjZmZmJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaW5uZXJUZXh0OiB7XG4gICAgICAgICAgICBzY29yZToge1xuICAgICAgICAgICAgICBmb250U2l6ZTogMzYsXG4gICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBsZXZlbDoge1xuICAgICAgICAgICAgICBmb250U2l6ZTogMTYsXG4gICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZidcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRlOiB7XG4gICAgICAgICAgICAgIGZvbnRTaXplOiAxMixcbiAgICAgICAgICAgICAgY29sb3I6ICcjZjJmMmYyJyxcbiAgICAgICAgICAgICAgZm9udFdlaWdodDogJ25vcm1hbCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgICB0aGlzLmluaXRFbG0oKTtcbiAgfVxuXG4gIC8vIOaehOW7uuWFg+e0oOW5tua3u+WKoOWIsOaMh+WumuWMuuWfn1xuICBwcml2YXRlIGluaXRFbG0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZWwpIHtcbiAgICAgIHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpO1xuICAgICAgY29uc3QgeyBoZWlnaHQsIHdpZHRoIH0gPSB0aGlzLmVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc29sZS5sb2coJ2hlaWdodCwgd2lkdGg6ICcsIGhlaWdodCwgd2lkdGgpO1xuICAgICAgdGhpcy5jYW52YXNTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICAuLi50aGlzLm9wdGlvbnMsXG4gICAgICAgIHg6IGhlaWdodCAvIDIsXG4gICAgICAgIHk6IHdpZHRoIC8gMlxuICAgICAgfTtcbiAgICAgIHRoaXMuZml4UmFuZ2VWYWx1ZSh0aGlzLm9wdGlvbnMpO1xuICAgICAgLy8g57yT5a2Y5a6e5L6L5Yid5aeL5YyW55qE5Y+C5pWwXG4gICAgICB0aGlzLmNhY2hlUGFyYW1zID0gdGhpcy5vcHRpb25zO1xuICAgICAgdGhpcy5pbml0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcign6K+35Lyg5YWl5LiA5Liq5riy5p+T5Yy65Z+f55qESUQnKTtcbiAgICB9XG4gIH1cblxuICAvLyDlgZrkuIDkupvluLjop4TnmoTliKTmlq3vvIzmr5TlpoLkvKDlhaXnmoTmnIDlsI/lgLzlpKfkuo7mnIDlpKflgLzvvIzotbflp4vliIblkozotbflp4vop5LluqblkIzmraXmnIDlsI/liIblkozmnIDlsI/otbflp4vop5LluqZcbiAgcHJpdmF0ZSBmaXhSYW5nZVZhbHVlKG9wdGlvbnM6IERlZmF1bHRQYXJhbXMpOiB2b2lkIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgc2NvcmVTdGFydDogdGhpcy5vcHRpb25zLnNjb3JlTWluLCAvLyDph43nva7lvIDlp4vorqHnrpfnmoTliIblvojkuLrmnIDlsI/liIZcbiAgICAgIHNjb3JlVGFyZ2V0OlxuICAgICAgICB0aGlzLm9wdGlvbnMuc2NvcmVUYXJnZXQgPiB0aGlzLm9wdGlvbnMuc2NvcmVNYXhcbiAgICAgICAgICA/IHRoaXMub3B0aW9ucy5zY29yZU1heFxuICAgICAgICAgIDogdGhpcy5vcHRpb25zLnNjb3JlVGFyZ2V0LFxuICAgICAgY3VycmVudEFuZ2xlOiB0aGlzLm9wdGlvbnMuc3RhcnRBbmdsZVxuICAgIH07XG4gIH1cblxuICAvLyDliJ3lp4vljJZjYW52YXPnmoTkuIDkupvlj4LmlbBcbiAgcHJvdGVjdGVkIGluaXQob3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zID0gdXRpbHMubWVyZ2VEZWVwKHRoaXMub3B0aW9ucywgb3B0aW9ucyk7XG4gICAgdGhpcy5maXhSYW5nZVZhbHVlKHRoaXMub3B0aW9ucyk7XG4gIH1cblxuICAvLyDnlLvluIPlpKflsI9cbiAgcHJvdGVjdGVkIGNhbnZhc1NpemUod2lkdGg6IG51bWJlciA9IDM3NSwgaGVpZ2h0OiBudW1iZXIgPSAzNzUpOiB2b2lkIHtcbiAgICB0aGlzLmNhbnZhcy53aWR0aCA9IHdpZHRoICogdGhpcy5yYXRpbztcbiAgICB0aGlzLmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiB0aGlzLnJhdGlvO1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgIHRoaXMuY2FudmFzLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgdGhpcy5jdHguc2NhbGUodGhpcy5yYXRpbywgdGhpcy5yYXRpbyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGVuZEFuZ2xlIOe7k+adn+eahOinkuW6plxuICAgKiBAcGFyYW0gc3RhcnRBbmdsZSDlvIDlp4vnmoTop5LluqZcbiAgICogQHBhcmFtIHNlZ0FuZ2xlIOaLhuaIkOWkmuWwkeetieWIhlxuICAgKi9cbiAgcHJpdmF0ZSBzdGVwQW5nbGVDYWxjKFxuICAgIGVuZEFuZ2xlOiBudW1iZXIsXG4gICAgc3RhcnRBbmdsZTogbnVtYmVyLFxuICAgIHNlZ0FuZ2xlOiBudW1iZXJcbiAgKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKGVuZEFuZ2xlIC0gc3RhcnRBbmdsZSkgLyBzZWdBbmdsZTtcbiAgfVxuXG4gIC8vIOa4heepuueUu+W4g1xuICAvKipcbiAgICogW2NsZWFyQ2FudmFzIGRlc2NyaXB0aW9uXVxuICAgKlxuICAgKiBAcGFyYW0gICB7bnVtYmVyfSAgd2lkdGggICBb5riF6Zmk55qE5a695bqmXVxuICAgKiBAcGFyYW0gICB7bnVtYmVyfSAgaGVpZ2h0ICBb5riF6Zmk55qE6auY5bqmXVxuICAgKlxuICAgKiBAcmV0dXJuICB7W3R5cGVdfSAgICAgICAgICBb5rKh5pyJ6L+U5ZueXVxuICAgKi9cbiAgcHJpdmF0ZSBjbGVhckNhbnZhcyh3aWR0aDogbnVtYmVyID0gMCwgaGVpZ2h0OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgdGhpcy5jdHguY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSDnur/mnaHml4vovazov5nkuptcbiAgICogQHBhcmFtIOWchueahOS4ieimgee0oCx4LHks5Y2K5b6EXG4gICAqL1xuICBwcml2YXRlIGRyYXdDaXJjbGVMaW5lKFxuICAgIHsgY29sb3IgPSAnI2ZmZicgfTogeyBjb2xvcjogc3RyaW5nIH0sXG4gICAge1xuICAgICAgeCA9IDAsXG4gICAgICB5ID0gMCxcbiAgICAgIHJhZGl1cyA9IDAsXG4gICAgICBzdGFydEFuZ2xlLFxuICAgICAgZW5kQW5nbGVcbiAgICB9OiB7XG4gICAgICB4OiBudW1iZXI7XG4gICAgICB5OiBudW1iZXI7XG4gICAgICByYWRpdXM6IG51bWJlcjtcbiAgICAgIHN0YXJ0QW5nbGU/OiBudW1iZXI7XG4gICAgICBlbmRBbmdsZT86IG51bWJlcjtcbiAgICB9XG4gICk6IHZvaWQge1xuICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuY3R4LmFyYyhcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgcmFkaXVzLFxuICAgICAgdXRpbHMuZ2V0UmFkaWFuKHN0YXJ0QW5nbGUgPyBzdGFydEFuZ2xlIDogdGhpcy5vcHRpb25zLnN0YXJ0QW5nbGUpLFxuICAgICAgdXRpbHMuZ2V0UmFkaWFuKGVuZEFuZ2xlID8gZW5kQW5nbGUgOiB0aGlzLm9wdGlvbnMuZW5kQW5nbGUpXG4gICAgKTtcbiAgICB0aGlzLmN0eC5zdHJva2VTdHlsZSA9IGNvbG9yO1xuICAgIHRoaXMuY3R4LmxpbmVDYXAgPSAncm91bmQnO1xuICAgIHRoaXMuY3R4LmxpbmVXaWR0aCA9IDE7XG4gICAgdGhpcy5jdHguc3Ryb2tlKCk7XG4gIH1cblxuICAvLyDnu5jliLblpJblm7TmlofmnKxcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB4IOWdkOagh+eahHhcbiAgICogQHBhcmFtIHkg5Z2Q5qCH55qEeVxuICAgKiBAcGFyYW0gdGV4dCDlsZXnpLrnmoTmlofmnKxcbiAgICogQHBhcmFtIGZvbnRTaXplIOaWh+acrOeahOWkp+Wwj1xuICAgKiBAcGFyYW0gY29sb3Ig5paH5pys55qE6aKc6ImyXG4gICAqIEBwYXJhbSBmb250V2VpZ2h0IOaWh+acrOeahOeyl+e7hlxuICAgKi9cbiAgcHJpdmF0ZSBkcmF3T3V0ZXJUZXh0KFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGZvbnRTaXplOiBudW1iZXIgPSAyOCxcbiAgICBjb2xvcjogc3RyaW5nID0gJyNmZmYnLFxuICAgIGZvbnRXZWlnaHQ6IHN0cmluZyA9ICdub3JtYWwnXG4gICk6IHZvaWQge1xuICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IGNvbG9yO1xuICAgIHRoaXMuY3R4LmZvbnQgPSBgJHtmb250V2VpZ2h0fSAke2ZvbnRTaXplfXB4IE1pY3Jvc29mdCB5YWhlaWA7XG4gICAgdGhpcy5jdHgudGV4dEJhc2VsaW5lID0gJ2lkZW9ncmFwaGljJztcbiAgICB0aGlzLmN0eC50ZXh0QWxpZ24gPSAnbGVmdCc7XG4gICAgdGhpcy5jdHguZmlsbFRleHQodGV4dCwgeCAtIHRoaXMuY3R4Lm1lYXN1cmVUZXh0KHRleHQpLndpZHRoIC8gMiwgeSk7XG4gIH1cblxuICAvLyDnlLvlpJblm7TmlofmnKznur9cbiAgcHJpdmF0ZSBkcmF3T3V0ZXJUZXh0TGluZShcbiAgICB7XG4gICAgICBvdXRlclRleHQ6IHsgdGV4dEFyciwgdGV4dEFuZ2VsQXJyLCB0ZXh0TGVuZ2h0IH1cbiAgICB9OiB7XG4gICAgICBvdXRlclRleHQ6IHtcbiAgICAgICAgdGV4dEFycjogbnVtYmVyW107XG4gICAgICAgIHRleHRBbmdlbEFycjogbnVtYmVyW107XG4gICAgICAgIHRleHRMZW5naHQ6IG51bWJlcjtcbiAgICAgIH07XG4gICAgfSxcbiAgICB7IHgsIHksIHJhZGl1cyB9OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyByYWRpdXM6IG51bWJlciB9XG4gICk6IHZvaWQge1xuICAgIC8vIOacgOWkluWbtOaWh+Wtl+WxglxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0ZXh0TGVuZ2h0OyBpbmRleCsrKSB7XG4gICAgICBsZXQgYW5nbGUgPSB1dGlscy5nZXRSYWRpYW4odGV4dEFuZ2VsQXJyW2luZGV4XSk7XG4gICAgICBjb25zdCB7IHgxLCB5MSB9ID0gdXRpbHMuZ2V0UmFkaXVzUG9pbnQoeCwgeSwgcmFkaXVzLCBhbmdsZSk7XG5cbiAgICAgIHRoaXMuZHJhd091dGVyVGV4dChcbiAgICAgICAgeDEsXG4gICAgICAgIHkxLFxuICAgICAgICAnJyArIHRleHRBcnJbaW5kZXhdLFxuICAgICAgICB0aGlzLm9wdGlvbnMuc3R5bGUub3V0ZXJUZXh0LmZvbnRTaXplLFxuICAgICAgICB0aGlzLm9wdGlvbnMuc3R5bGUub3V0ZXJUZXh0LmNvbG9yXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIOeUu+Wwj+WchueCuVxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHggeOWdkOagh1xuICAgKiBAcGFyYW0geSB55Z2Q5qCHXG4gICAqIEBwYXJhbSByYWRpdXMg5Y2K5b6EXG4gICAqIEBwYXJhbSBmaWxsQ29sb3JcbiAgICogQHBhcmFtIG1vZGUgdHJ1ZTrpobrml7bpkoggZmFsc2U66YCG5pe26ZKIXG4gICAqL1xuICBwcml2YXRlIGRyYXdDaXJjbGUoXG4gICAgeDogbnVtYmVyID0gMCxcbiAgICB5OiBudW1iZXIgPSAwLFxuICAgIHJhZGl1czogbnVtYmVyID0gMSxcbiAgICBmaWxsQ29sb3I6IHN0cmluZyA9ICcjZmZmJyxcbiAgICBtb2RlOiBib29sZWFuID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5jdHguYmVnaW5QYXRoKCk7XG4gICAgdGhpcy5jdHguYXJjKHgsIHksIHJhZGl1cywgMCwgMiAqIE1hdGguUEksIG1vZGUpO1xuICAgIHRoaXMuY3R4LmZpbGxTdHlsZSA9IGZpbGxDb2xvcjtcbiAgICB0aGlzLmN0eC5maWxsKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHgg5Z2Q5qCH55qEeFxuICAgKiBAcGFyYW0geSDlnZDmoIfnmoR5XG4gICAqIEBwYXJhbSB0ZXh0IOWxleekuueahOaWh+acrFxuICAgKiBAcGFyYW0gZm9udFNpemUg5paH5pys55qE5aSn5bCPXG4gICAqIEBwYXJhbSBjb2xvciDmlofmnKznmoTpopzoibJcbiAgICogQHBhcmFtIGZvbnRXZWlnaHQg5paH5pys55qE57KX57uGXG4gICAqL1xuICBwcml2YXRlIGRyYXdJbm5lclRleHQoXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgICB0ZXh0OiBudW1iZXIgfCBzdHJpbmcsXG4gICAgZm9udFNpemU6IG51bWJlciA9IDMwLFxuICAgIGNvbG9yOiBzdHJpbmcgPSAnI2ZmZicsXG4gICAgZm9udFdlaWdodDogc3RyaW5nID0gJ2JvbGQnXG4gICk6IHZvaWQge1xuICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICB0aGlzLmN0eC5maWxsU3R5bGUgPSBjb2xvcjtcbiAgICB0aGlzLmN0eC5mb250ID0gYCR7Zm9udFdlaWdodH0gJHtmb250U2l6ZX1weCBNaWNyb3NvZnQgeWFoZWlgO1xuICAgIHRoaXMuY3R4LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgIHRoaXMuY3R4LmZpbGxUZXh0KGAke3RleHR9YCwgeCwgeSk7XG4gICAgdGhpcy5jdHgudGV4dEJhc2VsaW5lID0gJ2lkZW9ncmFwaGljJztcbiAgICB0aGlzLmN0eC5yZXN0b3JlKCk7XG4gIH1cblxuICAvLyDnlLvmsLTmu7RcbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB4IOWdkOagh3hcbiAgICogQHBhcmFtIHkg5Z2Q5qCHeVxuICAgKiBAcGFyYW0gcm90YXRlIOWBj+enu+eahOinkuW6plxuICAgKi9cbiAgcHJpdmF0ZSB3YXRlckRyb3AoeDogbnVtYmVyLCB5OiBudW1iZXIsIHJvdGF0ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jdHguc2F2ZSgpO1xuICAgIHRoaXMuY3R4LnRyYW5zbGF0ZSh4LCB5KTtcbiAgICB0aGlzLmN0eC5yb3RhdGUodXRpbHMuZ2V0UmFkaWFuKHJvdGF0ZSkpO1xuICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLnBvaW50SW1nLCAwLCAwLCA4LCAxMik7XG4gICAgdGhpcy5jdHgucmVzdG9yZSgpO1xuICB9XG5cbiAgLy8g56e75Yqo5rC05ru0XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geCDlnZDmoId4XG4gICAqIEBwYXJhbSB5IOWdkOagh3lcbiAgICogQHBhcmFtIHJhZGl1cyDljYrlvoRcbiAgICogQHBhcmFtIGFuZ2xlIOenu+WKqOeahOinkuW6plxuICAgKi9cbiAgcHJpdmF0ZSBtb3ZlV2F0ZXJEcm9wKFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICAgcmFkaXVzOiBudW1iZXIsXG4gICAgYW5nbGU6IG51bWJlclxuICApOiB2b2lkIHtcbiAgICBjb25zdCB7IHgxLCB5MSB9ID0gdXRpbHMuZ2V0UmFkaXVzUG9pbnQoXG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHJhZGl1cyxcbiAgICAgIHV0aWxzLmdldFJhZGlhbihhbmdsZSlcbiAgICApO1xuICAgIC8vIOS4uuS7gOS5iOimgeWKoDkwwrDvvIzmmK/lm6DkuLrlm77niYfpu5jorqTmmK/lnoLnm7TnmoTvvIzmiJHku6zopoHmia3mraPku5bvvIzku47lnZDmoIfns7vnmoTliJ3lp4vlgLzlvIDlp4tcbiAgICB0aGlzLndhdGVyRHJvcCh4MSwgeTEsIGFuZ2xlICsgOTApO1xuICB9XG5cbiAgLy8g55S76Jma57q/5ZyG5bynXG4gIHByaXZhdGUgZHJhd0NpcmNsZURhc2hMaW5lKFxuICAgIHsgY29sb3IgPSAnI2NjYycgfTogeyBjb2xvcjogc3RyaW5nIH0sXG4gICAge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICByYWRpdXMsXG4gICAgICBzdGFydEFuZ2xlLFxuICAgICAgZW5kQW5nbGVcbiAgICB9OiB7XG4gICAgICB4OiBudW1iZXI7XG4gICAgICB5OiBudW1iZXI7XG4gICAgICByYWRpdXM6IG51bWJlcjtcbiAgICAgIHN0YXJ0QW5nbGU/OiBudW1iZXI7XG4gICAgICBlbmRBbmdsZT86IG51bWJlcjtcbiAgICB9XG4gICk6IHZvaWQge1xuICAgIHRoaXMuY3R4LmJlZ2luUGF0aCgpO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMub3B0aW9ucy5zZWdBbmdsZTsgaSsrKSB7XG4gICAgICBjb25zdCB7IHgxLCB5MSB9ID0gdXRpbHMuZ2V0UmFkaXVzUG9pbnQoXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHJhZGl1cyxcbiAgICAgICAgdXRpbHMuZ2V0UmFkaWFuKFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGFydEFuZ2xlICtcbiAgICAgICAgICAgIHRoaXMuc3RlcEFuZ2xlQ2FsYyhcbiAgICAgICAgICAgICAgZW5kQW5nbGUgPyBlbmRBbmdsZSA6IHRoaXMub3B0aW9ucy5lbmRBbmdsZSxcbiAgICAgICAgICAgICAgc3RhcnRBbmdsZSA/IHN0YXJ0QW5nbGUgOiB0aGlzLm9wdGlvbnMuc3RhcnRBbmdsZSxcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnNlZ0FuZ2xlXG4gICAgICAgICAgICApICpcbiAgICAgICAgICAgICAgaVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgdGhpcy5kcmF3Q2lyY2xlKHgxLCB5MSwgMSwgY29sb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOiOt+WPluiMg+WbtFxuICAvKipcbiAgICogQHBhcmFtIHR5cGUgJ3Njb3JlJ3wnYW5nZWwnXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0TnVtYmVyUmFuZ2UodHlwZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAodHlwZSA9PT0gJ3Njb3JlJykge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zY29yZU1heCAtIHRoaXMub3B0aW9ucy5zY29yZU1pbjtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdhbmdlbCcpIHtcbiAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZW5kQW5nbGUgLSB0aGlzLm9wdGlvbnMuc3RhcnRBbmdsZTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHRleHQg5Lyg5YWl5YiG5pWw5YC877yM5rKh5pyJ5Lyg5YWl5YiZ5ouG5YiG6IyD5Zu05Li65LiJ562J5YiG57uZ5Ye66buY6K6k57qn5YirXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0U2NvcmVMZXZlbFRleHQodGV4dD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHRleHQpIHtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcGVyOiBudW1iZXIgPSBNYXRoLmNlaWwodGhpcy5nZXROdW1iZXJSYW5nZSgnc2NvcmUnKSAvIDQpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5zY29yZVN0YXJ0IDw9IHRoaXMub3B0aW9ucy5zY29yZU1pbiArIHBlcikge1xuICAgICAgICByZXR1cm4gJ+S/oeeUqOS4reetiSc7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMub3B0aW9ucy5zY29yZVN0YXJ0ID4gdGhpcy5vcHRpb25zLnNjb3JlTWluICsgcGVyICYmXG4gICAgICAgIHRoaXMub3B0aW9ucy5zY29yZVN0YXJ0IDw9IHRoaXMub3B0aW9ucy5zY29yZU1pbiArIHBlciAqIDJcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gJ+S/oeeUqOiJr+WlvSc7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMub3B0aW9ucy5zY29yZVN0YXJ0ID4gdGhpcy5vcHRpb25zLnNjb3JlTWluICsgcGVyICogMiAmJlxuICAgICAgICB0aGlzLm9wdGlvbnMuc2NvcmVTdGFydCA8PSB0aGlzLm9wdGlvbnMuc2NvcmVNaW4gKyBwZXIgKiAzXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuICfkv6HnlKjkvJjnp4AnO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm9wdGlvbnMuc2NvcmVTdGFydCA+IHRoaXMub3B0aW9ucy5zY29yZU1pbiArIHBlciAqIDMgJiZcbiAgICAgICAgdGhpcy5vcHRpb25zLnNjb3JlU3RhcnQgPD0gdGhpcy5vcHRpb25zLnNjb3JlTWluICsgcGVyICogNFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiAn5L+h55So5p6B6auYJztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICAvLyDojrflj5blpJbpg6jmlofmnKznmoTlr7nosaHpm4blkIhcbiAgcHJpdmF0ZSBnZXRPdXRlclRleHRDb2xsZWN0aW9uKCk6IGFueSB7XG4gICAgbGV0IHRleHRHYXA6IG51bWJlciA9IE1hdGguY2VpbChcbiAgICAgIHRoaXMuZ2V0TnVtYmVyUmFuZ2UoJ3Njb3JlJykgLyAodGhpcy5vcHRpb25zLm91dGVyVGV4dFNlZyAtIDEpXG4gICAgKTtcbiAgICAvLyDkuI3og73lrozlhajmlbTpmaTnmoTvvIzmnIDlkI7kuIDkuKrlgLzlj5bojIPlm7TmnIDlpKflgLxcbiAgICBsZXQgdGV4dEFycjogbnVtYmVyW10gPSBBcnJheS5mcm9tKFxuICAgICAgbmV3IEFycmF5KHRoaXMub3B0aW9ucy5vdXRlclRleHRTZWcpLFxuICAgICAgKGl0ZW0sIGluZGV4KTogbnVtYmVyID0+XG4gICAgICAgIHRoaXMub3B0aW9ucy5vdXRlclRleHRTZWcgLSAxID09PSBpbmRleFxuICAgICAgICAgID8gdGhpcy5vcHRpb25zLnNjb3JlTWF4XG4gICAgICAgICAgOiB0ZXh0R2FwICogaW5kZXggKyB0aGlzLm9wdGlvbnMuc2NvcmVNaW5cbiAgICApO1xuICAgIGxldCB0ZXh0U3RlcEFuZ2VsOiBudW1iZXIgPVxuICAgICAgdGhpcy5nZXROdW1iZXJSYW5nZSgnYW5nZWwnKSAvICh0ZXh0QXJyLmxlbmd0aCAtIDEpO1xuICAgIGxldCB0ZXh0QW5nZWxBcnI6IG51bWJlcltdID0gdGV4dEFyci5tYXAoXG4gICAgICAoaXRlbSwgaW5kZXgpID0+IHRoaXMub3B0aW9ucy5zdGFydEFuZ2xlICsgdGV4dFN0ZXBBbmdlbCAqIGluZGV4XG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgdGV4dEFycixcbiAgICAgIHRleHRMZW5naHQ6IHRleHRBcnIubGVuZ3RoLFxuICAgICAgdGV4dEFuZ2VsQXJyXG4gICAgfTtcbiAgfVxuXG4gIC8vIOe7mOWItueUu+W4g1xuICBwdWJsaWMgZHJhd0Jhc2VNYXAoKTogdm9pZCB8IGJvb2xlYW4ge1xuICAgIHRoaXMuY2xlYXJDYW52YXModGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG5cbiAgICB0aGlzLmRyYXdPdXRlclRleHRMaW5lKFxuICAgICAgeyBvdXRlclRleHQ6IHRoaXMuZ2V0T3V0ZXJUZXh0Q29sbGVjdGlvbigpIH0sXG4gICAgICB7XG4gICAgICAgIHg6IHRoaXMub3B0aW9ucy54LFxuICAgICAgICB5OiB0aGlzLm9wdGlvbnMueSxcbiAgICAgICAgcmFkaXVzOiB0aGlzLm9wdGlvbnMueCAqIDAuODJcbiAgICAgIH1cbiAgICApO1xuICAgIHRoaXMuZHJhd0NpcmNsZUxpbmUoXG4gICAgICB7XG4gICAgICAgIGNvbG9yOiB0aGlzLm9wdGlvbnMuc3R5bGUubGluZS5pbml0Q29sb3JcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHg6IHRoaXMub3B0aW9ucy54LFxuICAgICAgICB5OiB0aGlzLm9wdGlvbnMueSxcbiAgICAgICAgcmFkaXVzOiB0aGlzLm9wdGlvbnMueCAqIDAuN1xuICAgICAgfVxuICAgICk7XG4gICAgdGhpcy5kcmF3Q2lyY2xlRGFzaExpbmUoXG4gICAgICB7XG4gICAgICAgIGNvbG9yOiB0aGlzLm9wdGlvbnMuc3R5bGUuZGFzaExpbmUuaW5pdENvbG9yXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB4OiB0aGlzLm9wdGlvbnMueCxcbiAgICAgICAgeTogdGhpcy5vcHRpb25zLnksXG4gICAgICAgIHJhZGl1czogdGhpcy5vcHRpb25zLnggKiAwLjY2NjY2NjZcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8g5paH5a2X5L2N572uKClcbiAgICB0aGlzLmRyYXdJbm5lclRleHQoXG4gICAgICB0aGlzLm9wdGlvbnMueCxcbiAgICAgIHRoaXMub3B0aW9ucy55IC0gMjAsXG4gICAgICB0aGlzLm9wdGlvbnMuc2NvcmVUYXJnZXQgLSB0aGlzLm9wdGlvbnMuc2NvcmVTdGFydCA8IDVcbiAgICAgICAgPyB0aGlzLm9wdGlvbnMuc2NvcmVUYXJnZXRcbiAgICAgICAgOiB0aGlzLm9wdGlvbnMuc2NvcmVTdGFydCxcbiAgICAgIHRoaXMub3B0aW9ucy5zdHlsZS5pbm5lclRleHQuc2NvcmUuZm9udFNpemUsXG4gICAgICB0aGlzLm9wdGlvbnMuc3R5bGUuaW5uZXJUZXh0LnNjb3JlLmNvbG9yXG4gICAgKTtcbiAgICB0aGlzLmRyYXdJbm5lclRleHQoXG4gICAgICB0aGlzLm9wdGlvbnMueCxcbiAgICAgIHRoaXMub3B0aW9ucy55ICsgNSxcbiAgICAgIHRoaXMub3B0aW9ucy5zY29yZUxldmVsVGV4dFxuICAgICAgICA/IHRoaXMub3B0aW9ucy5zY29yZUxldmVsVGV4dFxuICAgICAgICA6IHRoaXMuZ2V0U2NvcmVMZXZlbFRleHQoKSxcbiAgICAgIHRoaXMub3B0aW9ucy5zdHlsZS5pbm5lclRleHQubGV2ZWwuZm9udFNpemUsXG4gICAgICB0aGlzLm9wdGlvbnMuc3R5bGUuaW5uZXJUZXh0LmxldmVsLmNvbG9yXG4gICAgKTtcbiAgICB0aGlzLmRyYXdJbm5lclRleHQoXG4gICAgICB0aGlzLm9wdGlvbnMueCxcbiAgICAgIHRoaXMub3B0aW9ucy55ICsgMjUsXG4gICAgICB0aGlzLm9wdGlvbnMuc2NvcmVFdmFEYXRlLFxuICAgICAgdGhpcy5vcHRpb25zLnN0eWxlLmlubmVyVGV4dC5kYXRlLmZvbnRTaXplLFxuICAgICAgdGhpcy5vcHRpb25zLnN0eWxlLmlubmVyVGV4dC5kYXRlLmNvbG9yLFxuICAgICAgdGhpcy5vcHRpb25zLnN0eWxlLmlubmVyVGV4dC5kYXRlLmZvbnRXZWlnaHRcbiAgICApO1xuXG4gICAgLy8g6KaG55uW5a6e57q/XG4gICAgdGhpcy5kcmF3Q2lyY2xlTGluZShcbiAgICAgIHtcbiAgICAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5zdHlsZS5saW5lLmFjdGl2ZUNvbG9yXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB4OiB0aGlzLm9wdGlvbnMueCxcbiAgICAgICAgeTogdGhpcy5vcHRpb25zLnksXG4gICAgICAgIHJhZGl1czogdGhpcy5vcHRpb25zLnggKiAwLjcsXG4gICAgICAgIHN0YXJ0QW5nbGU6IHRoaXMub3B0aW9ucy5zdGFydEFuZ2xlLFxuICAgICAgICBlbmRBbmdsZTogdGhpcy5vcHRpb25zLmN1cnJlbnRBbmdsZVxuICAgICAgfVxuICAgICk7XG5cbiAgICAvLyDopobnm5bomZrnur9cbiAgICB0aGlzLmRyYXdDaXJjbGVEYXNoTGluZShcbiAgICAgIHtcbiAgICAgICAgY29sb3I6IHRoaXMub3B0aW9ucy5zdHlsZS5kYXNoTGluZS5hY3RpdmVDb2xvclxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgeDogdGhpcy5vcHRpb25zLngsXG4gICAgICAgIHk6IHRoaXMub3B0aW9ucy55LFxuICAgICAgICByYWRpdXM6IHRoaXMub3B0aW9ucy54ICogMC42NjY2NjY2LFxuICAgICAgICBzdGFydEFuZ2xlOiB0aGlzLm9wdGlvbnMuc3RhcnRBbmdsZSxcbiAgICAgICAgZW5kQW5nbGU6IHRoaXMub3B0aW9ucy5jdXJyZW50QW5nbGVcbiAgICAgIH1cbiAgICApO1xuXG4gICAgLy8g56e75Yqo5bCP5rC05ru0XG4gICAgdGhpcy5tb3ZlV2F0ZXJEcm9wKFxuICAgICAgdGhpcy5vcHRpb25zLngsXG4gICAgICB0aGlzLm9wdGlvbnMueSxcbiAgICAgIHRoaXMub3B0aW9ucy54ICogMC42LFxuICAgICAgdGhpcy5vcHRpb25zLmN1cnJlbnRBbmdsZVxuICAgICk7XG5cbiAgICAvLyDojIPlm7TlhoXml6DpmZByZW5kZXJcbiAgICBpZiAodGhpcy5vcHRpb25zLnNjb3JlU3RhcnQgPCB0aGlzLm9wdGlvbnMuc2NvcmVUYXJnZXQpIHtcbiAgICAgIGxldCBzdGVwTW92ZUFuZ2xlID0gdGhpcy5zdGVwQW5nbGVDYWxjKFxuICAgICAgICB0aGlzLm9wdGlvbnMuZW5kQW5nbGUsXG4gICAgICAgIHRoaXMub3B0aW9ucy5zdGFydEFuZ2xlLFxuICAgICAgICB0aGlzLm9wdGlvbnMuc2VnQW5nbGVcbiAgICAgICk7XG4gICAgICAvLyDmr4/mrKHnp7vliqjop5LluqbnmoTluqbmlbDojIPlm7RcbiAgICAgIHRoaXMub3B0aW9ucy5jdXJyZW50QW5nbGUgKz0gc3RlcE1vdmVBbmdsZTtcblxuICAgICAgLy8g5paH5a2X5Y+Y5YyWXG4gICAgICAvLyDmsYLlh7rmr4/mrKHnp7vliqjop5LluqbnmoTluqbmlbDojIPlm7TopoHotbDlpJrlsJHliIbmlbBcbiAgICAgIGxldCBzdGVwU2NvcmUgPVxuICAgICAgICAodGhpcy5nZXROdW1iZXJSYW5nZSgnc2NvcmUnKSAqIHN0ZXBNb3ZlQW5nbGUpIC9cbiAgICAgICAgdGhpcy5nZXROdW1iZXJSYW5nZSgnYW5nZWwnKTtcbiAgICAgIHRoaXMub3B0aW9ucy5zY29yZVN0YXJ0ID0gdGhpcy5vcHRpb25zLnNjb3JlU3RhcnQgKyBNYXRoLnJvdW5kKHN0ZXBTY29yZSk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNjb3JlU3RhcnQgPj0gdGhpcy5vcHRpb25zLnNjb3JlVGFyZ2V0KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zY29yZVN0YXJ0ID0gdGhpcy5vcHRpb25zLnNjb3JlVGFyZ2V0O1xuICAgICAgfVxuICAgICAgLy8g5rGC5b2T5YmN6KeS5bqm5LiO5YiG5pWw6KeS5bqm55qE5q+U6L6D77yM5b2T5YmN57Sv6K6h55qE6KeS5bqm5bCP5LqO6ZyA6KaB56e75Yqo5Yiw55uu55qE5Zyw55qE6KeS5bqm5bCx57un57ut5riy5p+TXG4gICAgICBsZXQgc3RlcEFuZ2xlID1cbiAgICAgICAgdGhpcy5vcHRpb25zLnN0YXJ0QW5nbGUgK1xuICAgICAgICAodGhpcy5nZXROdW1iZXJSYW5nZSgnc2NvcmUnKSAqXG4gICAgICAgICAgKHRoaXMub3B0aW9ucy5zY29yZVRhcmdldCAtIHRoaXMub3B0aW9ucy5zY29yZU1pbikpIC9cbiAgICAgICAgICB0aGlzLmdldE51bWJlclJhbmdlKCdzY29yZScpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25zLmN1cnJlbnRBbmdsZSA+PSBzdGVwQW5nbGUpIHtcbiAgICAgICAgdGhpcy5pc0RyYXdDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuY3R4LnNhdmUoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmRyYXdCYXNlTWFwLmJpbmQodGhpcykpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIOmHjeaWsOa4suafk+eUu+W4g1xuICAvKipcbiAgICogW3JlZnJlc2ggZGVzY3JpcHRpb25dXG4gICAqXG4gICAqIEBwYXJhbSAgIHtbdHlwZV19ICBkZWxheSAgICAgIFtkZWxheSDmjqjov5/lh6Dnp5Lph43mlrDmuLLmn5NdXG4gICAqIEBwYXJhbSAgIHtbdHlwZV19ICBjYWxsYmFjaz8gIFtjYWxsYmFjaz8g5Lyg5YWl55qE5Zue6LCD5Ye95pWwXVxuICAgKlxuICAgKiBAcmV0dXJuICB7W3R5cGVdfSAgICAgICAgICAgICBbcmV0dXJuIGRlc2NyaXB0aW9uXVxuICAgKi9cbiAgcmVmcmVzaChkZWxheTogbnVtYmVyID0gMTAwMCwgY2FsbGJhY2s/OiBGdW5jdGlvbik6IHZvaWQge1xuICAgIGxldCBzdDogYW55ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoc3QpO1xuICAgICAgaWYgKHRoaXMuaXNEcmF3Q29tcGxldGUpIHtcbiAgICAgICAgdGhpcy5pc0RyYXdDb21wbGV0ZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5pbml0KHRoaXMuY2FjaGVQYXJhbXMpO1xuICAgICAgdGhpcy5kcmF3QmFzZU1hcCgpO1xuICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjaygpO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDcmVkaXRTY29yZTtcbiJdLCJuYW1lcyI6WyJnZXRSYWRpYW4iLCJkZWdyZWVzIiwiTWF0aCIsIlBJIiwiZ2V0RGVncmVlcyIsInJhZGlhbiIsImdldFJhZGl1c1BvaW50IiwieCIsInkiLCJyYWRpdXMiLCJ4MSIsImNvcyIsInkxIiwic2luIiwicmFuZG9tSGV4Q29sb3IiLCJoZXgiLCJmbG9vciIsInJhbmRvbSIsInRvU3RyaW5nIiwibGVuZ3RoIiwiaXNPYmplY3QiLCJpdGVtIiwiX3R5cGVvZiIsIkFycmF5IiwiaXNBcnJheSIsIm1lcmdlRGVlcCIsInRhcmdldCIsInNvdXJjZXMiLCJzb3VyY2UiLCJzaGlmdCIsImtleSIsIk9iamVjdCIsImFzc2lnbiIsIkNyZWRpdFNjb3JlIiwiZWwiLCJvcHRpb25zIiwiYXJyb3dJbWciLCJjYW52YXMiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjdHgiLCJ0aGlzIiwiZ2V0Q29udGV4dCIsInJhdGlvIiwid2luZG93IiwiZGV2aWNlUGl4ZWxSYXRpbyIsInBvaW50SW1nIiwiSW1hZ2UiLCJpc0RyYXdDb21wbGV0ZSIsImdldEVsZW1lbnRCeUlkIiwiY2FjaGVQYXJhbXMiLCJzcmMiLCJ1dGlscyIsInN0YXJ0QW5nbGUiLCJlbmRBbmdsZSIsImN1cnJlbnRBbmdsZSIsInNjb3JlU3RhcnQiLCJzY29yZVRhcmdldCIsInNjb3JlTWluIiwic2NvcmVNYXgiLCJzY29yZUV2YURhdGUiLCJzY29yZUxldmVsVGV4dCIsInNlZ0FuZ2xlIiwib3V0ZXJUZXh0U2VnIiwic3R5bGUiLCJsaW5lIiwiaW5pdENvbG9yIiwiYWN0aXZlQ29sb3IiLCJ3aWR0aCIsImRhc2hMaW5lIiwib3V0ZXJUZXh0IiwiZm9udFNpemUiLCJjb2xvciIsImlubmVyVGV4dCIsInNjb3JlIiwibGV2ZWwiLCJkYXRlIiwiZm9udFdlaWdodCIsImluaXRFbG0iLCJFcnJvciIsImFwcGVuZENoaWxkIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiaGVpZ2h0IiwiY29uc29sZSIsImxvZyIsImNhbnZhc1NpemUiLCJmaXhSYW5nZVZhbHVlIiwiaW5pdCIsInNjYWxlIiwiY2xlYXJSZWN0IiwiYmVnaW5QYXRoIiwiYXJjIiwic3Ryb2tlU3R5bGUiLCJsaW5lQ2FwIiwibGluZVdpZHRoIiwic3Ryb2tlIiwidGV4dCIsImZpbGxTdHlsZSIsImZvbnQiLCJ0ZXh0QmFzZWxpbmUiLCJ0ZXh0QWxpZ24iLCJmaWxsVGV4dCIsIm1lYXN1cmVUZXh0IiwidGV4dEFyciIsInRleHRBbmdlbEFyciIsInRleHRMZW5naHQiLCJpbmRleCIsImFuZ2xlIiwiZHJhd091dGVyVGV4dCIsImZpbGxDb2xvciIsIm1vZGUiLCJmaWxsIiwic2F2ZSIsInJlc3RvcmUiLCJyb3RhdGUiLCJ0cmFuc2xhdGUiLCJkcmF3SW1hZ2UiLCJ3YXRlckRyb3AiLCJpIiwic3RlcEFuZ2xlQ2FsYyIsImRyYXdDaXJjbGUiLCJ0eXBlIiwicGVyIiwiY2VpbCIsImdldE51bWJlclJhbmdlIiwidGV4dEdhcCIsImZyb20iLCJfdGhpcyIsInRleHRTdGVwQW5nZWwiLCJtYXAiLCJjbGVhckNhbnZhcyIsImRyYXdPdXRlclRleHRMaW5lIiwiZ2V0T3V0ZXJUZXh0Q29sbGVjdGlvbiIsImRyYXdDaXJjbGVMaW5lIiwiZHJhd0NpcmNsZURhc2hMaW5lIiwiZHJhd0lubmVyVGV4dCIsImdldFNjb3JlTGV2ZWxUZXh0IiwibW92ZVdhdGVyRHJvcCIsInN0ZXBNb3ZlQW5nbGUiLCJzdGVwU2NvcmUiLCJyb3VuZCIsInN0ZXBBbmdsZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImRyYXdCYXNlTWFwIiwiYmluZCIsImRlbGF5IiwiY2FsbGJhY2siLCJzdCIsInNldFRpbWVvdXQiLCJjbGVhclRpbWVvdXQiLCJfdGhpczIiXSwibWFwcGluZ3MiOiI7Ozs7O2cyQ0FPQSxTQUFTQSxVQUFVQyxVQUNUQyxLQUFLQyxHQUFLLElBQU9GLEVBVTNCLFNBQVNHLFdBQVdDLFVBQ1YsSUFBTUgsS0FBS0MsR0FBTUUsRUFJM0IsU0FBU0MsZUFDUEMsRUFDQUMsRUFDQUMsRUFDQVIsU0FFTyxDQUNMUyxHQUFJSCxFQUFJRSxFQUFTUCxLQUFLUyxJQUFJVixHQUMxQlcsR0FBSUosRUFBSUMsRUFBU1AsS0FBS1csSUFBSVosSUFLOUIsU0FBU2EseUJBRUhDLEVBQU1iLEtBQUtjLE1BQXNCLFNBQWhCZCxLQUFLZSxVQUFxQkMsU0FBUyxJQUNqREgsRUFBSUksT0FBUyxHQUVsQkosRUFBTSxJQUFNQSxRQUVQLElBQU1BLEVBVVIsU0FBU0ssU0FBU0MsVUFDaEJBLEdBQXdCLFdBQWhCQyxRQUFPRCxLQUFzQkUsTUFBTUMsUUFBUUgsR0FXckQsU0FBU0ksVUFBVUMsOEJBQWdCQyxtQ0FBQUEsd0JBQ25DQSxFQUFRUixPQUFRLE9BQU9PLE1BQ3RCRSxFQUFTRCxFQUFRRSxXQUVuQlQsU0FBU00sSUFBV04sU0FBU1EsT0FDMUIsSUFBTUUsS0FBT0YsRUFDWlIsU0FBU1EsRUFBT0UsS0FDYkosRUFBT0ksSUFBTUMsT0FBT0MsT0FBT04scUJBQVdJLEVBQU0sS0FDakRMLFVBQVVDLEVBQU9JLEdBQU1GLEVBQU9FLEtBRTlCQyxPQUFPQyxPQUFP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