svgchrt
Version:
A way to easily create SVG-based charts without having to worry about positioning of titles, subtitles or legends.
2 lines • 64.7 kB
JavaScript
var SVGChrt=function(t){var e={};function n(o){if(e[o])return e[o].exports;var i=e[o]={i:o,l:!1,exports:{}};return t[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,o){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:o})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(o,i,function(e){return t[e]}.bind(null,i));return o},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.chart=void 0;var o,i,r=n(1);!function(t){t.Horizontal="horizontal",t.Vertical="vertical"}(o||(o={})),function(t){t.TopLeft="top-left",t.Top="top",t.TopRight="top-right",t.Right="right",t.BottomRight="bottom-right",t.Bottom="bottom",t.BottomLeft="bottom-left",t.Left="left"}(i||(i={})),e.chart=function(){var t,e,n,o,i,u,l,g,a,c,d=function(){c instanceof SVGElement&&"string"==typeof c&&document.querySelector(c)instanceof SVGElement&&(c=document.querySelector(c))};return d.height=function(t){return arguments.length?(e=t,d):e},d.legendDisplay=function(t){return arguments.length?(u=t,d):u},d.legendItems=function(t){return arguments.length?(l=t,d):l},d.legendOrientation=function(t){return arguments.length?(a=t,d):a},d.legendPosition=function(t){return arguments.length?(g=t,d):g},d.margin=function(t){return arguments.length?(n=t,d):n},d.subtitle=function(t){return arguments.length?(i=t,d):i},d.target=function(t){return arguments.length?(c=t,d):c},d.title=function(t){return arguments.length?(o=t,d):o},d.width=function(e){return arguments.length?(t=e,d):t},d.draw=function(){r.buildSurround().width(t).margin(n).height(e).target(c).title(o).subtitle(i).legendDisplay(u).legendItems(l).legendPosition(g).legendOrientation(a)},d}},function(t,e,n){"use strict";var o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.buildSurround=void 0;var i=n(2),r=o(n(3));e.buildSurround=function(){var t,e,n,o,u,l,g,a,c,d=960,s=500,h={top:0,right:0,bottom:0,left:0},f=!1,p=i.LegendPosition.Right,x=i.LegendOrientation.Vertical,b=!1,m=function(){if(!c)throw new Error("Looks like I haven't been given a target SVG to work with.");if(!(c instanceof SVGElement))throw new Error("Looks like the target I have been given isn't an SVG. I have been given "+c);if(c.setAttribute("width",""+d),c.setAttribute("height",""+s),n=c.querySelector("text.title"),o=c.querySelector("title"),u=c.querySelector("text.subtitle"),t?(n?n.textContent=t:((n=document.createElementNS("http://www.w3.org/2000/svg","text")).textContent=t,n.setAttribute("class","title"),n.setAttribute("text-anchor","middle"),n.setAttribute("x",""+d/2),n.setAttribute("y",""+n.getBBox().height),n.setAttribute("dy","1em"),c.appendChild(n)),n.getComputedTextLength()>d-h.left-h.right&&r.default(n,d-h.left-h.right),o?o.textContent=t:((o=document.createElementNS("http://www.w3.org/2000/svg","title")).textContent=t,c.appendChild(o))):(console.warn("You really should consider giving your chart a title!"),n&&n.remove(),o&&o.remove()),e?(u?u.textContent=e:((u=document.createElementNS("http://www.w3.org/2000/svg","text")).textContent=e,u.setAttribute("class","subtitle"),u.setAttribute("text-anchor","middle"),u.setAttribute("x",""+d/2),u.setAttribute("y",""+(u.getBBox().height+10+(n?null==n?void 0:n.getBBox().height:0))),u.setAttribute("dy","1em"),c.appendChild(u)),u.getComputedTextLength()>d-h.left-h.right&&r.default(u,d-h.left-h.right)):u&&u.remove(),f&&g){var i={x1:h.left,x2:d-h.right,y1:h.top,y2:s-h.bottom};b||(i.y1-=(n?n.getBBox().height:0)+(u?u.getBBox().height:0)),l||(l=document.createElementNS("http://www.w3.org/2000/svg","g")),l.setAttribute("class","legend");var x=document.createElementNS("http://www.w3.org/2000/svg","rect");x.setAttribute("class","legend-background"),l.appendChild(x),g.map((function(t,e){var n=document.createElementNS("http://www.w3.org/2000/svg","g");n.setAttribute("class","legend-item");var o=document.createElementNS("http://www.w3.org/2000/svg",t.shape?t.shape:"rect");o.setAttribute("class","legend-item-icon"),o.setAttribute("cx",t.cx?t.cx:""),o.setAttribute("cy",t.cy?t.cy:""),o.setAttribute("cx",t.d?t.d:""),o.setAttribute("cy",t.height?t.height:""),o.setAttribute("cx",t.r?t.r:""),o.setAttribute("cx",t.rx?t.rx:""),o.setAttribute("cy",t.ry?t.ry:""),o.setAttribute("cy",t.width?t.width:""),o.setAttribute("cx",t.x?t.x:""),o.setAttribute("cy",t.y?t.y:""),o.setAttribute("fill",t.colour?t.colour:"");var i=document.createElementNS("http://www.w3.org/2000/svg","text");i.setAttribute("class","legend-item-text"),i.setAttribute("dy","12px"),i.textContent=t.text,i.setAttribute("transform","translate("+(o.getBBox().width+5)+",0)"),n.appendChild(o),n.appendChild(i),n.setAttribute("transform","translate(0,"+20*e+")")}));var m={x:0,y:0};switch(p){case"top-left":m.x=i.x1,m.y=i.y1;break;case"top":m.x=(i.x1+i.x2-l.getBBox().width)/2,m.y=i.y1;break;case"top-right":m.x=i.x2-l.getBBox().width,m.y=i.y1;break;case"right":m.x=i.x2-l.getBBox().width,m.y=(i.y1+i.y2-l.getBBox().height)/2;break;case"bottom-right":m.x=i.x2-l.getBBox().width,m.y=i.y2-l.getBBox().height;break;case"bottom":m.x=(i.x1+i.x2-l.getBBox().width)/2,m.y=i.y2-l.getBBox().height;break;case"bottom-left":m.x=i.x1,m.y=i.y2-l.getBBox().height;break;case"left":m.x=i.x1,m.y=(i.y1+i.y2-l.getBBox().height)/2}c.appendChild(l)}else l&&l.remove();var y=c.querySelector("g.chart-area");y||((y=document.createElementNS("http://www.w3.org/2000/svg","g")).setAttribute("class","chart-area"),c.appendChild(y),a=y)};return m.margin=function(t){return h=t,m},m.getMargin=function(){return h},m.title=function(e){return t=e,m},m.getTitle=function(){return t},m.subtitle=function(t){return e=t,m},m.getSubtitle=function(){return e},m.width=function(t){return d=t,m},m.getWidth=function(){return d},m.height=function(t){return s=t,m},m.getHeight=function(){return s},m.legendPosition=function(t){return p=t,m},m.getLegendPosition=function(){return p},m.legendDisplay=function(t){return f=t,m},m.getLegendDisplay=function(){return f},m.legendItems=function(t){return g=t,m},m.getLegendItems=function(){return g},m.legendOrientation=function(t){return x=t,m},m.getLegendOrientation=function(){return x},m.legendDisplacesTitle=function(t){return b=t,m},m.getLegendDisplacesTitle=function(){return b},m.target=function(t){return c=t,m},m.getTarget=function(){return c},m.chartArea=function(){return{g:a,x1:h.left+(!l||p!==i.LegendPosition.Left&&(x!==i.LegendOrientation.Vertical||p!==i.LegendPosition.TopLeft&&p!==i.LegendPosition.BottomLeft)?0:null==l?void 0:l.getBBox().width),x2:h.right+(!l||p!==i.LegendPosition.Right&&(x!==i.LegendOrientation.Vertical||p!==i.LegendPosition.TopRight&&p!==i.LegendPosition.BottomRight)?0:null==l?void 0:l.getBBox().width),y1:h.top+10+(n?n.getBBox().height:0)+(u?u.getBBox().height:0)+(!l||p!==i.LegendPosition.Top&&(x!==i.LegendOrientation.Horizontal||p!==i.LegendPosition.TopLeft&&p!==i.LegendPosition.TopRight)?0:null==l?void 0:l.getBBox().height),y2:h.bottom+(!l||p!==i.LegendPosition.Bottom&&(x!==i.LegendOrientation.Horizontal||p!==i.LegendPosition.BottomLeft&&p!==i.LegendPosition.BottomRight)?0:null==l?void 0:l.getBBox().height)}},m},e.default=e.buildSurround},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.LegendPosition=e.LegendOrientation=e.LegendItemIconShape=void 0,function(t){t.Circle="circle",t.Ellipse="ellipse",t.Line="line",t.Path="path",t.Polygon="polygon",t.Polyline="polyline",t.Rect="rect"}(e.LegendItemIconShape||(e.LegendItemIconShape={})),function(t){t.Horizontal="horizontal",t.Vertical="vertical"}(e.LegendOrientation||(e.LegendOrientation={})),function(t){t.TopLeft="top-left",t.Top="top",t.TopRight="top-right",t.Right="right",t.BottomRight="bottom-right",t.Bottom="bottom",t.BottomLeft="bottom-left",t.Left="left"}(e.LegendPosition||(e.LegendPosition={}))},function(t,e,n){"use strict";var o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var i=o(n(4));e.default=function(t,e,n){var o;if(void 0===n&&(n=1.1),!(t.getComputedTextLength()<e)){var r,u=null===(o=null==t?void 0:t.textContent)||void 0===o?void 0:o.split(/\s+/).reverse(),l=[],g=0,a=t.getAttribute("x"),c=t.getAttribute("y"),d=t.getAttribute("dy")?t.getAttribute("dy"):"0",s=parseFloat(d.match(/[0-9.]/)[0]),h=d.match(/[A-Za-z%]+/)[0];t.textContent=null;for(var f=i.default("tspan",t,{x:a,y:c,dy:""+s+h});r=u.pop();)l.push(r),f.textContent=l.join(" "),f.getComputedTextLength()>e&&(l.pop(),f.textContent=l.join(" "),l=[r],f=i.default("tspan",t,{x:a,y:c,dx:0,dy:""+(++g*n+s)+h},r))}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t,e,n,o){void 0===n&&(n={}),void 0===o&&(o="");var i=document.createElementNS("http://www.w3.org/2000/svg",t);if(Object.entries(n).map((function(t){return i.setAttribute(t[0],t[1])})),o){var r=document.createTextNode(o);i.appendChild(r)}return e.appendChild(i),i}}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9TVkdDaHJ0L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL1NWR0NocnQvLi9kZXYvc3JjL2luZGV4LnRzIiwid2VicGFjazovL1NWR0NocnQvLi9kZXYvc3JjL2J1aWxkU3Vycm91bmQudHMiLCJ3ZWJwYWNrOi8vU1ZHQ2hydC8uL2Rldi9zcmMvaW50ZXJmYWNlcy50cyIsIndlYnBhY2s6Ly9TVkdDaHJ0Ly4vZGV2L3NyYy9zdmdXcmFwVGV4dC50cyIsIndlYnBhY2s6Ly9TVkdDaHJ0Ly4vZGV2L3NyYy9hcHBlbmRTVkdDaGlsZC50cyJdLCJuYW1lcyI6WyJpbnN0YWxsZWRNb2R1bGVzIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsImkiLCJsIiwibW9kdWxlcyIsImNhbGwiLCJtIiwiYyIsImQiLCJuYW1lIiwiZ2V0dGVyIiwibyIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZW51bWVyYWJsZSIsImdldCIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsInZhbHVlIiwidCIsIm1vZGUiLCJfX2VzTW9kdWxlIiwibnMiLCJjcmVhdGUiLCJrZXkiLCJiaW5kIiwibiIsIm9iamVjdCIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJwIiwicyIsIkxlZ2VuZE9yaWVudGF0aW9uIiwiTGVnZW5kUG9zaXRpb24iLCJjaGFydCIsIndpZHRoIiwiaGVpZ2h0IiwibWFyZ2luIiwidGl0bGUiLCJzdWJ0aXRsZSIsImxlZ2VuZERpc3BsYXkiLCJsZWdlbmRJdGVtcyIsImxlZ2VuZFBvc2l0aW9uIiwibGVnZW5kT3JpZW50YXRpb24iLCJ0YXJnZXQiLCJteSIsIlNWR0VsZW1lbnQiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJfIiwiYXJndW1lbnRzIiwibGVuZ3RoIiwiZHJhdyIsImJ1aWxkU3Vycm91bmQiLCJ0aXRsZVRleHRFbGVtZW50IiwidGl0bGVFbGVtZW50Iiwic3VidGl0bGVUZXh0RWxlbWVudCIsImxlZ2VuZEVsZW1lbnQiLCJjaGFydEFyZWEiLCJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiLCJSaWdodCIsIlZlcnRpY2FsIiwibGVnZW5kRGlzcGxhY2VzVGl0bGUiLCJzdXJyb3VuZCIsIkVycm9yIiwic2V0QXR0cmlidXRlIiwidGV4dENvbnRlbnQiLCJjcmVhdGVFbGVtZW50TlMiLCJnZXRCQm94IiwiYXBwZW5kQ2hpbGQiLCJnZXRDb21wdXRlZFRleHRMZW5ndGgiLCJjb25zb2xlIiwid2FybiIsInJlbW92ZSIsImxlZ2VuZEF2YWlsYWJsZVNwYWNlIiwieDEiLCJ4MiIsInkxIiwieTIiLCJsZWdlbmRCYWNrZ3JvdW5kIiwibWFwIiwibGVnZW5kSXRlbUVsZW1lbnQiLCJsZWdlbmRJdGVtRWxlbWVudEljb24iLCJzaGFwZSIsImN4IiwiY3kiLCJyeCIsInJ5IiwieCIsInkiLCJjb2xvdXIiLCJsZWdlbmRJdGVtRWxlbWVudFRleHQiLCJ0ZXh0IiwibGVnZW5kVHJhbnNmb3JtIiwiZyIsImdldE1hcmdpbiIsImdldFRpdGxlIiwiZ2V0U3VidGl0bGUiLCJnZXRXaWR0aCIsImdldEhlaWdodCIsImdldExlZ2VuZFBvc2l0aW9uIiwiZ2V0TGVnZW5kRGlzcGxheSIsImdldExlZ2VuZEl0ZW1zIiwiZ2V0TGVnZW5kT3JpZW50YXRpb24iLCJnZXRMZWdlbmREaXNwbGFjZXNUaXRsZSIsImdldFRhcmdldCIsIkxlZnQiLCJUb3BMZWZ0IiwiQm90dG9tTGVmdCIsIlRvcFJpZ2h0IiwiQm90dG9tUmlnaHQiLCJUb3AiLCJIb3Jpem9udGFsIiwiQm90dG9tIiwiTGVnZW5kSXRlbUljb25TaGFwZSIsIml0ZW0iLCJsaW5lSGVpZ2h0Iiwid29yZCIsIndvcmRzIiwic3BsaXQiLCJyZXZlcnNlIiwibGluZSIsImxpbmVOdW1iZXIiLCJnZXRBdHRyaWJ1dGUiLCJkeXZhbCIsImR5IiwicGFyc2VGbG9hdCIsIm1hdGNoIiwidHNwYW4iLCJwb3AiLCJwdXNoIiwiam9pbiIsImR4IiwiZWxlbWVudFR5cGUiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudCIsImVudHJpZXMiLCJhIiwidGV4dE5vZGUiLCJjcmVhdGVUZXh0Tm9kZSJdLCJtYXBwaW5ncyI6IndCQUNFLElBQUlBLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVDLFFBR25DLElBQUlDLEVBQVNKLEVBQWlCRSxHQUFZLENBQ3pDRyxFQUFHSCxFQUNISSxHQUFHLEVBQ0hILFFBQVMsSUFVVixPQU5BSSxFQUFRTCxHQUFVTSxLQUFLSixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTRixHQUcvREcsRUFBT0UsR0FBSSxFQUdKRixFQUFPRCxRQTBEZixPQXJEQUYsRUFBb0JRLEVBQUlGLEVBR3hCTixFQUFvQlMsRUFBSVYsRUFHeEJDLEVBQW9CVSxFQUFJLFNBQVNSLEVBQVNTLEVBQU1DLEdBQzNDWixFQUFvQmEsRUFBRVgsRUFBU1MsSUFDbENHLE9BQU9DLGVBQWViLEVBQVNTLEVBQU0sQ0FBRUssWUFBWSxFQUFNQyxJQUFLTCxLQUtoRVosRUFBb0JrQixFQUFJLFNBQVNoQixHQUNYLG9CQUFYaUIsUUFBMEJBLE9BQU9DLGFBQzFDTixPQUFPQyxlQUFlYixFQUFTaUIsT0FBT0MsWUFBYSxDQUFFQyxNQUFPLFdBRTdEUCxPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sS0FRdkRyQixFQUFvQnNCLEVBQUksU0FBU0QsRUFBT0UsR0FFdkMsR0FEVSxFQUFQQSxJQUFVRixFQUFRckIsRUFBb0JxQixJQUMvQixFQUFQRSxFQUFVLE9BQU9GLEVBQ3BCLEdBQVcsRUFBUEUsR0FBOEIsaUJBQVZGLEdBQXNCQSxHQUFTQSxFQUFNRyxXQUFZLE9BQU9ILEVBQ2hGLElBQUlJLEVBQUtYLE9BQU9ZLE9BQU8sTUFHdkIsR0FGQTFCLEVBQW9Ca0IsRUFBRU8sR0FDdEJYLE9BQU9DLGVBQWVVLEVBQUksVUFBVyxDQUFFVCxZQUFZLEVB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QUFRLFVBQ04sUUFDQWIsRUFDQSxDQUNFM0IsRUFBR0EsRUFDSEMsRUFBR0EsRUFDSDJDLEdBQUksRUFDSlAsR0FBSSxNQUFLSCxFQUFhTixFQUFhUyxHQUFXQSxHQUVoRFIsTyw4RUNsQlIsVUExQkEsU0FDRWdCLEVBQ0E1RixFQUNBNkYsRUFDQTFDLFFBREEsSUFBQTBDLE1BQUEsU0FDQSxJQUFBMUMsTUFBQSxJQU9BLElBQU0yQyxFQUFzQjNGLFNBQVN1QixnQkFDbkMsNkJBQ0FrRSxHQUtGLEdBSEE5SCxPQUFPaUksUUFBUUYsR0FBWXRELEtBQUksU0FBQ3lELEdBQzlCLE9BQUFGLEVBQVF0RSxhQUFhd0UsRUFBRSxHQUFJQSxFQUFFLE9BRTNCN0MsRUFBTSxDQUNSLElBQU04QyxFQUFXOUYsU0FBUytGLGVBQWUvQyxHQUN6QzJDLEVBQVFsRSxZQUFZcUUsR0FHdEIsT0FEQWpHLEVBQU80QixZQUFZa0UsR0FDWkEiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG4iLCIvKipcbiAqIEBhdXRob3IgR2F2aW4gU3lrZXMgPGdhdmluQGdhdmluc3lrZXMudWs+IChodHRwczovL2dhdmluc3lrZXMudWsvKSBbQGdhdmluc3lrZXNfdWtdKGh0dHBzOi8vdHdpdHRlci5jb20vZ2F2aW5zeWtlc191aylcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbmltcG9ydCB7IGJ1aWxkU3Vycm91bmQsIE1hcmdpbiwgTGVnZW5kSXRlbSB9IGZyb20gJy4vYnVpbGRTdXJyb3VuZCc7XG5cbi8vIFVQREFURSA1dGggQXVndXN0IDIwMjEgLSBhdHRlbXB0aW5nIHRvIHJlY29uc3RydWN0IHdpdGggYSBmdW5jdGlvbmFsIGFwcHJvYWNoLCBpbiBhIG1vcmUgRDMtZXNxdWUgc3R5bGVcblxuZW51bSBMZWdlbmRPcmllbnRhdGlvbiB7XG4gIEhvcml6b250YWwgPSAnaG9yaXpvbnRhbCcsXG4gIFZlcnRpY2FsID0gJ3ZlcnRpY2FsJ1xufVxuXG5lbnVtIExlZ2VuZFBvc2l0aW9uIHtcbiAgVG9wTGVmdCA9ICd0b3AtbGVmdCcsXG4gIFRvcCA9ICd0b3AnLFxuICBUb3BSaWdodCA9ICd0b3AtcmlnaHQnLFxuICBSaWdodCA9ICdyaWdodCcsXG4gIEJvdHRvbVJpZ2h0ID0gJ2JvdHRvbS1yaWdodCcsXG4gIEJvdHRvbSA9ICdib3R0b20nLFxuICBCb3R0b21MZWZ0ID0gJ2JvdHRvbS1sZWZ0JyxcbiAgTGVmdCA9ICdsZWZ0J1xufVxuXG5leHBvcnQgY29uc3QgY2hhcnQgPSAoKTogdHlwZW9mIG15ID0+IHtcbiAgbGV0IHdpZHRoOiBudW1iZXIsXG4gICAgaGVpZ2h0OiBudW1iZXIsXG4gICAgbWFyZ2luOiBNYXJnaW4sXG4gICAgdGl0bGU6IHN0cmluZyxcbiAgICBzdWJ0aXRsZTogc3RyaW5nLFxuICAgIGxlZ2VuZERpc3BsYXk6IGJvb2xlYW4sXG4gICAgbGVnZW5kSXRlbXM6IExlZ2VuZEl0ZW1bXSxcbiAgICBsZWdlbmRQb3NpdGlvbjogTGVnZW5kUG9zaXRpb24sXG4gICAgbGVnZW5kT3JpZW50YXRpb246IExlZ2VuZE9yaWVudGF0aW9uLFxuICAgIHRhcmdldDogU1ZHRWxlbWVudCB8IHN0cmluZztcbiAgY29uc3QgbXkgPSAoKSA9PiB7XG4gICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgU1ZHRWxlbWVudCkpIHtcbiAgICAgIC8vIEVycm9yLCB0YXJnZXQgaXNuJ3QgYW4gU1ZHIG9yIHN0cmluZ1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCBhcyBzdHJpbmcpIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkge1xuICAgICAgICB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCBhcyBzdHJpbmcpIGFzIFNWR0VsZW1lbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBFcnJvciwgc2VsZWN0b3IgaXMgbm90IGFuIFNWRyBlbGVtZW50XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIG15LmhlaWdodCA9IGZ1bmN0aW9uIChfOiBudW1iZXIpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoaGVpZ2h0ID0gXyksIG15IGFzIHR5cGVvZiBteSkgOiBoZWlnaHQ7XG4gIH07XG5cbiAgbXkubGVnZW5kRGlzcGxheSA9IGZ1bmN0aW9uIChfOiBib29sZWFuKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgID8gKChsZWdlbmREaXNwbGF5ID0gXyksIG15IGFzIHR5cGVvZiBteSlcbiAgICAgIDogbGVnZW5kRGlzcGxheTtcbiAgfTtcblxuICBteS5sZWdlbmRJdGVtcyA9IGZ1bmN0aW9uIChfOiBMZWdlbmRJdGVtW10pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyAoKGxlZ2VuZEl0ZW1zID0gXyksIG15IGFzIHR5cGVvZiBteSlcbiAgICAgIDogbGVnZW5kSXRlbXM7XG4gIH07XG5cbiAgbXkubGVnZW5kT3JpZW50YXRpb24gPSBmdW5jdGlvbiAoXzogTGVnZW5kT3JpZW50YXRpb24pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyAoKGxlZ2VuZE9yaWVudGF0aW9uID0gXyksIG15IGFzIHR5cGVvZiBteSlcbiAgICAgIDogbGVnZW5kT3JpZW50YXRpb247XG4gIH07XG5cbiAgbXkubGVnZW5kUG9zaXRpb24gPSBmdW5jdGlvbiAoXzogTGVnZW5kUG9zaXRpb24pIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgPyAoKGxlZ2VuZFBvc2l0aW9uID0gXyksIG15IGFzIHR5cGVvZiBteSlcbiAgICAgIDogbGVnZW5kUG9zaXRpb247XG4gIH07XG5cbiAgbXkubWFyZ2luID0gZnVuY3Rpb24gKF86IE1hcmdpbikge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKChtYXJnaW4gPSBfKSwgbXkgYXMgdHlwZW9mIG15KSA6IG1hcmdpbjtcbiAgfTtcblxuICBteS5zdWJ0aXRsZSA9IGZ1bmN0aW9uIChfOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoc3VidGl0bGUgPSBfKSwgbXkgYXMgdHlwZW9mIG15KSA6IHN1YnRpdGxlO1xuICB9O1xuXG4gIG15LnRhcmdldCA9IGZ1bmN0aW9uIChfOiBTVkdFbGVtZW50KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKHRhcmdldCA9IF8pLCBteSBhcyB0eXBlb2YgbXkpIDogdGFyZ2V0O1xuICB9O1xuXG4gIG15LnRpdGxlID0gZnVuY3Rpb24gKF86IHN0cmluZykge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKCh0aXRsZSA9IF8pLCBteSBhcyB0eXBlb2YgbXkpIDogdGl0bGU7XG4gIH07XG5cbiAgbXkud2lkdGggPSBmdW5jdGlvbiAoXzogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKHdpZHRoID0gXyksIG15IGFzIHR5cGVvZiBteSkgOiB3aWR0aDtcbiAgfTtcblxuICBteS5kcmF3ID0gZnVuY3Rpb24gKCkge1xuICAgIGJ1aWxkU3Vycm91bmQoKVxuICAgICAgLndpZHRoKHdpZHRoKVxuICAgICAgLm1hcmdpbihtYXJnaW4pXG4gICAgICAuaGVpZ2h0KGhlaWdodClcbiAgICAgIC50YXJnZXQodGFyZ2V0IGFzIFNWR0VsZW1lbnQpXG4gICAgICAudGl0bGUodGl0bGUpXG4gICAgICAuc3VidGl0bGUoc3VidGl0bGUpXG4gICAgICAubGVnZW5kRGlzcGxheShsZWdlbmREaXNwbGF5KVxuICAgICAgLmxlZ2VuZEl0ZW1zKGxlZ2VuZEl0ZW1zKVxuICAgICAgLmxlZ2VuZFBvc2l0aW9uKGxlZ2VuZFBvc2l0aW9uKVxuICAgICAgLmxlZ2VuZE9yaWVudGF0aW9uKGxlZ2VuZE9yaWVudGF0aW9uKTtcbiAgfTtcblxuICByZXR1cm4gbXk7XG59O1xuIiwiLyoqXG4gKiBAYXV0aG9yIEdhdmluIFN5a2VzIDxnYXZpbkBnYXZpbnN5a2VzLnVrPiAoaHR0cHM6Ly9nYXZpbnN5a2VzLnVrLykgW0BnYXZpbnN5a2VzX3VrXShodHRwczovL3R3aXR0ZXIuY29tL2dhdmluc3lrZXNfdWspXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG5pbXBvcnQgeyBMZWdlbmRQb3NpdGlvbiwgTGVnZW5kT3JpZW50YXRpb24gfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHN2Z1dyYXBUZXh0IGZyb20gJy4vc3ZnV3JhcFRleHQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1hcmdpbiBleHRlbmRzIFJlY29yZDxzdHJpbmcsIG51bWJlcj4ge1xuICB0b3A6IG51bWJlcjtcbiAgcmlnaHQ6IG51bWJlcjtcbiAgYm90dG9tOiBudW1iZXI7XG4gIGxlZnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMZWdlbmRJdGVtIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICB0ZXh0OiBzdHJpbmc7XG4gIGNvbG91cj86IHN0cmluZztcbiAgc2hhcGU/OiBzdHJpbmc7XG4gIGN4Pzogc3RyaW5nO1xuICBjeT86IHN0cmluZztcbiAgZD86IHN0cmluZztcbiAgaGVpZ2h0Pzogc3RyaW5nO1xuICByPzogc3RyaW5nO1xuICByeD86IHN0cmluZztcbiAgcnk/OiBzdHJpbmc7XG4gIHdpZHRoPzogc3RyaW5nO1xuICB4Pzogc3RyaW5nO1xuICB5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgYnVpbGRTdXJyb3VuZCA9ICgpOiB0eXBlb2Ygc3Vycm91bmQgPT4ge1xuICBsZXQgd2lkdGggPSA5NjA7XG4gIGxldCBoZWlnaHQgPSA1MDA7XG4gIGxldCBtYXJnaW4gPSB7IHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgbGVmdDogMCB9O1xuICBsZXQgdGl0bGU6IHN0cmluZztcbiAgbGV0IHN1YnRpdGxlOiBzdHJpbmc7XG4gIGxldCB0aXRsZVRleHRFbGVtZW50OiBTVkdUZXh0RWxlbWVudCB8IG51bGw7XG4gIGxldCB0aXRsZUVsZW1lbnQ6IFNWR1RpdGxlRWxlbWVudCB8IG51bGw7XG4gIGxldCBzdWJ0aXRsZVRleHRFbGVtZW50OiBTVkdUZXh0RWxlbWVudCB8IG51bGw7XG4gIGxldCBsZWdlbmREaXNwbGF5ID0gZmFsc2U7XG4gIGxldCBsZWdlbmRFbGVtZW50OiBTVkdHcmFwaGljc0VsZW1lbnQgfCBudWxsO1xuICBsZXQgbGVnZW5kSXRlbXM6IExlZ2VuZEl0ZW1bXTtcbiAgbGV0IGxlZ2VuZFBvc2l0aW9uID0gTGVnZW5kUG9zaXRpb24uUmlnaHQ7XG4gIGxldCBsZWdlbmRPcmllbnRhdGlvbiA9IExlZ2VuZE9yaWVudGF0aW9uLlZlcnRpY2FsO1xuICBsZXQgbGVnZW5kRGlzcGxhY2VzVGl0bGUgPSBmYWxzZTtcbiAgbGV0IGNoYXJ0QXJlYTogU1ZHR3JhcGhpY3NFbGVtZW50O1xuICBsZXQgdGFyZ2V0OiBTVkdFbGVtZW50O1xuICBjb25zdCBzdXJyb3VuZCA9ICgpID0+IHtcbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTG9va3MgbGlrZSBJIGhhdmVuJ3QgYmVlbiBnaXZlbiBhIHRhcmdldCBTVkcgdG8gd29yayB3aXRoLmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBMb29rcyBsaWtlIHRoZSB0YXJnZXQgSSBoYXZlIGJlZW4gZ2l2ZW4gaXNuJ3QgYW4gU1ZHLiBJIGhhdmUgYmVlbiBnaXZlbiAke3RhcmdldH1gXG4gICAgICApO1xuICAgIH1cbiAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCd3aWR0aCcsIGAke3dpZHRofWApO1xuICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIGAke2hlaWdodH1gKTtcbiAgICB0aXRsZVRleHRFbGVtZW50ID0gdGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoJ3RleHQudGl0bGUnKTtcbiAgICB0aXRsZUVsZW1lbnQgPSB0YXJnZXQucXVlcnlTZWxlY3RvcigndGl0bGUnKSBhcyBTVkdUaXRsZUVsZW1lbnQgfCBudWxsO1xuICAgIHN1YnRpdGxlVGV4dEVsZW1lbnQgPSB0YXJnZXQucXVlcnlTZWxlY3RvcigndGV4dC5zdWJ0aXRsZScpO1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgaWYgKHRpdGxlVGV4dEVsZW1lbnQpIHtcbiAgICAgICAgdGl0bGVUZXh0RWxlbWVudC50ZXh0Q29udGVudCA9IHRpdGxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGl0bGVUZXh0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgICAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFxuICAgICAgICAgICd0ZXh0J1xuICAgICAgICApO1xuICAgICAgICB0aXRsZVRleHRFbGVtZW50LnRleHRDb250ZW50ID0gdGl0bGU7XG4gICAgICAgIHRpdGxlVGV4dEVsZW1lbnQuc2V0QXR0cmlidXRlKCdjbGFzcycsICd0aXRsZScpO1xuICAgICAgICB0aXRsZVRleHRFbGVtZW50LnNldEF0dHJpYnV0ZSgndGV4dC1hbmNob3InLCAnbWlkZGxlJyk7XG4gICAgICAgIHRpdGxlVGV4dEVsZW1lbnQuc2V0QXR0cmlidXRlKCd4JywgYCR7d2lkdGggLyAyfWApO1xuICAgICAgICB0aXRsZVRleHRFbGVtZW50LnNldEF0dHJpYnV0ZShcbiAgICAgICAgICAneScsXG4gICAgICAgICAgYCR7dGl0bGVUZXh0RWxlbWVudC5nZXRCQm94KCkuaGVpZ2h0fWBcbiAgICAgICAgKTtcbiAgICAgICAgdGl0bGVUZXh0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2R5JywgJzFlbScpO1xuICAgICAgICB0YXJnZXQuYXBwZW5kQ2hpbGQodGl0bGVUZXh0RWxlbWVudCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRpdGxlVGV4dEVsZW1lbnQuZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCkgPlxuICAgICAgICB3aWR0aCAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0XG4gICAgICApIHtcbiAgICAgICAgc3ZnV3JhcFRleHQodGl0bGVUZXh0RWxlbWVudCwgd2lkdGggLSBtYXJnaW4ubGVmdCAtIG1hcmdpbi5yaWdodCk7XG4gICAgICB9XG4gICAgICBpZiAodGl0bGVFbGVtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC50ZXh0Q29udGVudCA9IHRpdGxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGl0bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsXG4gICAgICAgICAgJ3RpdGxlJ1xuICAgICAgICApO1xuICAgICAgICB0aXRsZUVsZW1lbnQudGV4dENvbnRlbnQgPSB0aXRsZTtcbiAgICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKHRpdGxlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignWW91IHJlYWxseSBzaG91bGQgY29uc2lkZXIgZ2l2aW5nIHlvdXIgY2hhcnQgYSB0aXRsZSEnKTtcbiAgICAgIGlmICh0aXRsZVRleHRFbGVtZW50KSB7XG4gICAgICAgIHRpdGxlVGV4dEVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICBpZiAodGl0bGVFbGVtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN1YnRpdGxlKSB7XG4gICAgICBpZiAoc3VidGl0bGVUZXh0RWxlbWVudCkge1xuICAgICAgICBzdWJ0aXRsZVRleHRFbGVtZW50LnRleHRDb250ZW50ID0gc3VidGl0bGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJ0aXRsZVRleHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsXG4gICAgICAgICAgJ3RleHQnXG4gICAgICAgICk7XG4gICAgICAgIHN1YnRpdGxlVGV4dEVsZW1lbnQudGV4dENvbnRlbnQgPSBzdWJ0aXRsZTtcbiAgICAgICAgc3VidGl0bGVUZXh0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ3N1YnRpdGxlJyk7XG4gICAgICAgIHN1YnRpdGxlVGV4dEVsZW1lbnQuc2V0QXR0cmlidXRlKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTtcbiAgICAgICAgc3VidGl0bGVUZXh0RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3gnLCBgJHt3aWR0aCAvIDJ9YCk7XG4gICAgICAgIHN1YnRpdGxlVGV4dEVsZW1lbnQuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICd5JyxcbiAgICAgICAgICBgJHtcbiAgICAgICAgICAgIHN1YnRpdGxlVGV4dEVsZW1lbnQuZ2V0QkJveCgpLmhlaWdodCArXG4gICAgICAgICAgICAxMCArXG4gICAgICAgICAgICAodGl0bGVUZXh0RWxlbWVudCA/IHRpdGxlVGV4dEVsZW1lbnQ/LmdldEJCb3goKS5oZWlnaHQgOiAwKVxuICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgICAgIHN1YnRpdGxlVGV4dEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkeScsICcxZW0nKTtcbiAgICAgICAgdGFyZ2V0LmFwcGVuZENoaWxkKHN1YnRpdGxlVGV4dEVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBzdWJ0aXRsZVRleHRFbGVtZW50LmdldENvbXB1dGVkVGV4dExlbmd0aCgpID5cbiAgICAgICAgd2lkdGggLSBtYXJnaW4ubGVmdCAtIG1hcmdpbi5yaWdodFxuICAgICAgKSB7XG4gICAgICAgIHN2Z1dyYXBUZXh0KHN1YnRpdGxlVGV4dEVsZW1lbnQsIHdpZHRoIC0gbWFyZ2luLmxlZnQgLSBtYXJnaW4ucmlnaHQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3VidGl0bGVUZXh0RWxlbWVudCkge1xuICAgICAgICBzdWJ0aXRsZVRleHRFbGVtZW50LnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobGVnZW5kRGlzcGxheSAmJiBsZWdlbmRJdGVtcykge1xuICAgICAgY29uc3QgbGVnZW5kQXZhaWxhYmxlU3BhY2UgPSB7XG4gICAgICAgIHgxOiBtYXJnaW4ubGVmdCxcbiAgICAgICAgeDI6IHdpZHRoIC0gbWFyZ2luLnJpZ2h0LFxuICAgICAgICB5MTogbWFyZ2luLnRvcCxcbiAgICAgICAgeTI6IGhlaWdodCAtIG1hcmdpbi5ib3R0b21cbiAgICAgIH07XG4gICAgICBpZiAoIWxlZ2VuZERpc3BsYWNlc1RpdGxlKSB7XG4gICAgICAgIGxlZ2VuZEF2YWlsYWJsZVNwYWNlLnkxIC09XG4gICAgICAgICAgKHRpdGxlVGV4dEVsZW1lbnQgPyB0aXRsZVRleHRFbGVtZW50LmdldEJCb3goKS5oZWlnaHQgOiAwKSArXG4gICAgICAgICAgKHN1YnRpdGxlVGV4dEVsZW1lbnQgPyBzdWJ0aXRsZVRleHRFbGVtZW50LmdldEJCb3goKS5oZWlnaHQgOiAwKTtcbiAgICAgIH1cbiAgICAgIGlmICghbGVnZW5kRWxlbWVudCkge1xuICAgICAgICBsZWdlbmRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsXG4gICAgICAgICAgJ2cnXG4gICAgICAgICkgYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgICAgfVxuICAgICAgbGVnZW5kRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2xlZ2VuZCcpO1xuICAgICAgY29uc3QgbGVnZW5kQmFja2dyb3VuZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyxcbiAgICAgICAgJ3JlY3QnXG4gICAgICApO1xuICAgICAgbGVnZW5kQmFja2dyb3VuZC5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2xlZ2VuZC1iYWNrZ3JvdW5kJyk7XG4gICAgICBsZWdlbmRFbGVtZW50LmFwcGVuZENoaWxkKGxlZ2VuZEJhY2tncm91bmQpO1xuICAgICAgbGVnZW5kSXRlbXMubWFwKChjLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGxlZ2VuZEl0ZW1FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsXG4gICAgICAgICAgJ2cnXG4gICAgICAgICk7XG4gICAgICAgIGxlZ2VuZEl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnbGVnZW5kLWl0ZW0nKTtcbiAgICAgICAgY29uc3QgbGVnZW5kSXRlbUVsZW1lbnRJY29uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFxuICAgICAgICAgICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsXG4gICAgICAgICAgYy5zaGFwZSA/IChjLnNoYXBlIGFzIHN0cmluZykgOiAncmVjdCdcbiAgICAgICAgKSBhcyBTVkdHcmFwaGljc0VsZW1lbnQ7XG4gICAgICAgIGxlZ2VuZEl0ZW1FbGVtZW50SWNvbi5zZXRBdHRyaWJ1dGUoJ2NsYXNzJywgJ2xlZ2VuZC1pdGVtLWljb24nKTtcbiAgICAgICAgbGVnZW5kSXRlbUVsZW1lbnRJY29uLnNldEF0dHJpYnV0ZSgnY3gnLCBjLmN4ID8gYy5jeCA6ICcnKTtcbiAgICAgICAgbGVnZW5kSXRlbUVsZW1lbnRJY29uLnNldEF0dHJpYnV0ZSgnY3knLCBjLmN5ID8gYy5jeSA6ICcnKTtcbiAgICAgICAgbGVnZW5kSXRlbUVsZW1lbnRJY29uLnNldEF0dHJpYnV0ZSgnY3gnLCBjLmQgPyBjLmQgOiAnJyk7XG4gICAgICAgIGxlZ2VuZEl0ZW1FbGVtZW50SWNvbi5zZXRBdHRyaWJ1dGUoJ2N5JywgYy5oZWlnaHQgPyBjLmhlaWdodCA6ICcnKTtcbiAgICAgICAgbGVnZW5kSXRlbUVsZW1lbnRJY29uLnNldEF0dHJpYnV0ZSgnY3gnLCBjLnIgPyBjLnIgOiAnJyk7XG4gICAgICAgIGxlZ2VuZEl0ZW1FbGVtZW50SWNvbi5zZXRBdHRyaWJ1dGUoJ2N4JywgYy5yeCA/IGMucnggOiAnJyk7XG4gICAgICAgIGxlZ2VuZEl0ZW1FbGVtZW50SWNvbi5zZXRBdHRyaWJ1dGUoJ2N5JywgYy5yeSA/IGMucnkgOiAnJyk7XG4gICAgICAgIGxlZ2VuZEl0ZW1FbGVtZW50SWNvbi5zZXRBdHRyaWJ1dGUoJ2N5JywgYy53aWR0aCA/IGMud2lkdGggOiAnJyk7XG4gICAgICAgIGxlZ2VuZEl0ZW1FbGVtZW50SWNvbi5zZXRBdHRyaWJ1dGUoJ2N4JywgYy54ID8gYy54IDogJycpO1xuICAgICAgICBsZWdlbmRJdGVtRWxlbWVudEljb24uc2V0QXR0cmlidXRlKCdjeScsIGMueSA/IGMueSA6ICcnKTtcbiAgICAgICAgbGVnZW5kSXRlbUVsZW1lbnRJY29uLnNldEF0dHJpYnV0ZSgnZmlsbCcsIGMuY29sb3VyID8gYy5jb2xvdXIgOiAnJyk7XG4gICAgICAgIGNvbnN0IGxlZ2VuZEl0ZW1FbGVtZW50VGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgICAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLFxuICAgICAgICAgICd0ZXh0J1xuICAgICAgICApIGFzIFNWR1RleHRFbGVtZW50O1xuICAgICAgICBsZWdlbmRJdGVtRWxlbWVudFRleHQuc2V0QXR0cmlidXRlKCdjbGFzcycsICdsZWdlbmQtaXRlbS10ZXh0Jyk7XG4gICAgICAgIGxlZ2VuZEl0ZW1FbGVtZW50VGV4dC5zZXRBdHRyaWJ1dGUoJ2R5JywgJzEycHgnKTtcbiAgICAgICAgbGVnZW5kSXRlbUVsZW1lbnRUZXh0LnRleHRDb250ZW50ID0gYy50ZXh0O1xuICAgICAgICBsZWdlbmRJdGVtRWxlbWVudFRleHQuc2V0QXR0cmlidXRlKFxuICAgICAgICAgICd0cmFuc2Zvcm0nLFxuICAgICAgICAgIGB0cmFuc2xhdGUoJHtsZWdlbmRJdGVtRWxlbWVudEljb24uZ2V0QkJveCgpLndpZHRoICsgNX0sMClgXG4gICAgICAgICk7XG4gICAgICAgIGxlZ2VuZEl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGxlZ2VuZEl0ZW1FbGVtZW50SWNvbik7XG4gICAgICAgIGxlZ2VuZEl0ZW1FbGVtZW50LmFwcGVuZENoaWxkKGxlZ2VuZEl0ZW1FbGVtZW50VGV4dCk7XG4gICAgICAgIGxlZ2VuZEl0ZW1FbGVtZW50LnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgwLCR7aSAqIDIwfSlgKTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbGVnZW5kVHJhbnNmb3JtID0geyB4OiAwLCB5OiAwIH07XG4gICAgICBzd2l0Y2ggKGxlZ2VuZFBvc2l0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3RvcC1sZWZ0JzpcbiAgICAgICAgICBsZWdlbmRUcmFuc2Zvcm0ueCA9IGxlZ2VuZEF2YWlsYWJsZVNwYWNlLngxO1xuICAgICAgICAgIGxlZ2VuZFRyYW5zZm9ybS55ID0gbGVnZW5kQXZhaWxhYmxlU3BhY2UueTE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgbGVnZW5kVHJhbnNmb3JtLnggPVxuICAgICAgICAgICAgKGxlZ2VuZEF2YWlsYWJsZVNwYWNlLngxICtcbiAgICAgICAgICAgICAgbGVnZW5kQXZhaWxhYmxlU3BhY2UueDIgLVxuICAgICAgICAgICAgICBsZWdlbmRFbGVtZW50LmdldEJCb3goKS53aWR0aCkgL1xuICAgICAgICAgICAgMjtcbiAgICAgICAgICBsZWdlbmRUcmFuc2Zvcm0ueSA9IGxlZ2VuZEF2YWlsYWJsZVNwYWNlLnkxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0b3AtcmlnaHQnOlxuICAgICAgICAgIGxlZ2VuZFRyYW5zZm9ybS54ID1cbiAgICAgICAgICAgIGxlZ2VuZEF2YWlsYWJsZVNwYWNlLngyIC0gbGVnZW5kRWxlbWVudC5nZXRCQm94KCkud2lkdGg7XG4gICAgICAgICAgbGVnZW5kVHJhbnNmb3JtLnkgPSBsZWdlbmRBdmFpbGFibGVTcGFjZS55MTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICAgIGxlZ2VuZFRyYW5zZm9ybS54ID1cbiAgICAgICAgICAgIGxlZ2VuZEF2YWlsYWJsZVNwYWNlLngyIC0gbGVnZW5kRWxlbWVudC5nZXRCQm94KCkud2lkdGg7XG4gICAgICAgICAgbGVnZW5kVHJhbnNmb3JtLnkgPVxuICAgICAgICAgICAgKGxlZ2VuZEF2YWlsYWJsZVNwYWNlLnkxICtcbiAgICAgICAgICAgICAgbGVnZW5kQXZhaWxhYmxlU3BhY2UueTIgLVxuICAgICAgICAgICAgICBsZWdlbmRFbGVtZW50LmdldEJCb3goKS5oZWlnaHQpIC9cbiAgICAgICAgICAgIDI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6XG4gICAgICAgICAgbGVnZW5kVHJhbnNmb3JtLnggPVxuICAgICAgICAgICAgbGVnZW5kQXZhaWxhYmxlU3BhY2UueDIgLSBsZWdlbmRFbGVtZW50LmdldEJCb3goKS53aWR0aDtcbiAgICAgICAgICBsZWdlbmRUcmFuc2Zvcm0ueSA9XG4gICAgICAgICAgICBsZWdlbmRBdmFpbGFibGVTcGFjZS55MiAtIGxlZ2VuZEVsZW1lbnQuZ2V0QkJveCgpLmhlaWdodDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICBsZWdlbmRUcmFuc2Zvcm0ueCA9XG4gICAgICAgICAgICAobGVnZW5kQXZhaWxhYmxlU3BhY2UueDEgK1xuICAgICAgICAgICAgICBsZWdlbmRBdmFpbGFibGVTcGFjZS54MiAtXG4gICAgICAgICAgICAgIGxlZ2VuZEVsZW1lbnQuZ2V0QkJveCgpLndpZHRoKSAvXG4gICAgICAgICAgICAyO1xuICAgICAgICAgIGxlZ2VuZFRyYW5zZm9ybS55ID1cbiAgICAgICAgICAgIGxlZ2VuZEF2YWlsYWJsZVNwYWNlLnkyIC0gbGVnZW5kRWxlbWVudC5nZXRCQm94KCkuaGVpZ2h0O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdib3R0b20tbGVmdCc6XG4gICAgICAgICAgbGVnZW5kVHJhbnNmb3JtLnggPSBsZWdlbmRBdmFpbGFibGVTcGFjZS54MTtcbiAgICAgICAgICBsZWdlbmRUcmFuc2Zvcm0ueSA9XG4gICAgICAgICAgICBsZWdlbmRBdmFpbGFibGVTcGFjZS55MiAtIGxlZ2VuZEVsZW1lbnQuZ2V0QkJveCgpLmhlaWdodDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgICAgbGVnZW5kVHJhbnNmb3JtLnggPSBsZWdlbmRBdmFpbGFibGVTcGFjZS54MTtcbiAgICAgICAgICBsZWdlbmRUcmFuc2Zvcm0ueSA9XG4gICAgICAgICAgICAobGVnZW5kQXZhaWxhYmxlU3BhY2UueTEgK1xuICAgICAgICAgICAgICBsZWdlbmRBdmFpbGFibGVTcGFjZS55MiAtXG4gICAgICAgICAgICAgIGxlZ2VuZEVsZW1lbnQuZ2V0QkJveCgpLmhlaWdodCkgL1xuICAgICAgICAgICAgMjtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRhcmdldC5hcHBlbmRDaGlsZChsZWdlbmRFbGVtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGxlZ2VuZEVsZW1lbnQpIHtcbiAgICAgICAgbGVnZW5kRWxlbWVudC5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGcgPSB0YXJnZXQucXVlcnlTZWxlY3RvcignZy5jaGFydC1hcmVhJykgYXMgU1ZHR3JhcGhpY3NFbGVtZW50O1xuICAgIGlmICghZykge1xuICAgICAgZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcbiAgICAgICAgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyxcbiAgICAgICAgJ2cnXG4gICAgICApIGFzIFNWR0dyYXBoaWNzRWxlbWVudDtcbiAgICAgIGcuc2V0QXR0cmlidXRlKCdjbGFzcycsICdjaGFydC1hcmVhJyk7XG4gICAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoZyk7XG4gICAgICBjaGFydEFyZWEgPSBnO1xuICAgIH1cbiAgfTtcblxuICBzdXJyb3VuZC5tYXJnaW4gPSBmdW5jdGlvbiAoXzogTWFyZ2luKTogdHlwZW9mIHN1cnJvdW5kIHtcbiAgICBtYXJnaW4gPSBfO1xuICAgIHJldHVybiBzdXJyb3VuZDtcbiAgfTtcblxuICBzdXJyb3VuZC5nZXRNYXJnaW4gPSBmdW5jdGlvbiAoKTogTWFyZ2luIHtcbiAgICByZXR1cm4gbWFyZ2luO1xuICB9O1xuXG4gIHN1cnJvdW5kLnRpdGxlID0gZnVuY3Rpb24gKF86IHN0cmluZyk6IHR5cGVvZiBzdXJyb3VuZCB7XG4gICAgdGl0bGUgPSBfO1xuICAgIHJldHVybiBzdXJyb3VuZDtcbiAgfTtcblxuICBzdXJyb3VuZC5nZXRUaXRsZSA9IGZ1bmN0aW9uICgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aXRsZTtcbiAgfTtcblxuICBzdXJyb3VuZC5zdWJ0aXRsZSA9IGZ1bmN0aW9uIChfOiBzdHJpbmcpOiB0eXBlb2Ygc3Vycm91bmQge1xuICAgIHN1YnRpdGxlID0gXztcbiAgICByZXR1cm4gc3Vycm91bmQ7XG4gIH07XG5cbiAgc3Vycm91bmQuZ2V0U3VidGl0bGUgPSBmdW5jdGlvbiAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3VidGl0bGU7XG4gIH07XG5cbiAgc3Vycm91bmQud2lkdGggPSBmdW5jdGlvbiAoXzogbnVtYmVyKTogdHlwZW9mIHN1cnJvdW5kIHtcbiAgICB3aWR0aCA9IF87XG4gICAgcmV0dXJuIHN1cnJvdW5kO1xuICB9O1xuXG4gIHN1cnJvdW5kLmdldFdpZHRoID0gZnVuY3Rpb24gKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHdpZHRoO1xuICB9O1xuXG4gIHN1cnJvdW5kLmhlaWdodCA9IGZ1bmN0aW9uIChfOiBudW1iZXIpOiB0eXBlb2Ygc3Vycm91bmQge1xuICAgIGhlaWdodCA9IF87XG4gICAgcmV0dXJuIHN1cnJvdW5kO1xuICB9O1xuXG4gIHN1cnJvdW5kLmdldEhlaWdodCA9IGZ1bmN0aW9uICgpOiBudW1iZXIge1xuICAgIHJldHVybiBoZWlnaHQ7XG4gIH07XG5cbiAgc3Vycm91bmQubGVnZW5kUG9zaXRpb24gPSBmdW5jdGlvbiAoXzogTGVnZW5kUG9zaXRpb24pOiB0eXBlb2Ygc3Vycm91bmQge1xuICAgIGxlZ2VuZFBvc2l0aW9uID0gXztcbiAgICByZXR1cm4gc3Vycm91bmQ7XG4gIH07XG5cbiAgc3Vycm91bmQuZ2V0TGVnZW5kUG9zaXRpb24gPSBmdW5jdGlvbiAoKTogTGVnZW5kUG9zaXRpb24ge1xuICAgIHJldHVybiBsZWdlbmRQb3NpdGlvbjtcbiAgfTtcblxuICBzdXJyb3VuZC5sZWdlbmREaXNwbGF5ID0gZnVuY3Rpb24gKF86IGJvb2xlYW4pOiB0eXBlb2Ygc3Vycm91bmQge1xuICAgIGxlZ2VuZERpc3BsYXkgPSBfO1xuICAgIHJldHVybiBzdXJyb3VuZDtcbiAgfTtcblxuICBzdXJyb3VuZC5nZXRMZWdlbmREaXNwbGF5ID0gZnVuY3Rpb24gKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsZWdlbmREaXNwbGF5O1xuICB9O1xuXG4gIHN1cnJvdW5kLmxlZ2VuZEl0ZW1zID0gZnVuY3Rpb24gKF86IExlZ2VuZEl0ZW1bXSk6IHR5cGVvZiBzdXJyb3VuZCB7XG4gICAgbGVnZW5kSXRlbXMgPSBfO1xuICAgIHJldHVybiBzdXJyb3VuZDtcbiAgfTtcblxuICBzdXJyb3VuZC5nZXRMZWdlbmRJdGVtcyA9IGZ1bmN0aW9uICgpOiBMZWdlbmRJdGVtW10ge1xuICAgIHJldHVybiBsZWdlbmRJdGVtcztcbiAgfTtcblxuICBzdXJyb3VuZC5sZWdlbmRPcmllbnRhdGlvbiA9IGZ1bmN0aW9uIChcbiAgICBfOiBMZWdlbmRPcmllbnRhdGlvblxuICApOiB0eXBlb2Ygc3Vycm91bmQge1xuICAgIGxlZ2VuZE9yaWVudGF0aW9uID0gXztcbiAgICByZXR1cm4gc3Vycm91bmQ7XG4gIH07XG5cbiAgc3Vycm91bmQuZ2V0TGVnZW5kT3JpZW50YXRpb24gPSBmdW5jdGlvbiAoKTogTGVnZW5kT3JpZW50YXRpb24ge1xuICAgIHJldHVybiBsZWdlbmRPcmllbnRhdGlvbjtcbiAgfTtcblxuICBzdXJyb3VuZC5sZWdlbmREaXNwbGFjZXNUaXRsZSA9IGZ1bmN0aW9uIChfOiBib29sZWFuKTogdHlwZW9mIHN1cnJvdW5kIHtcbiAgICBsZWdlbmREaXNwbGFjZXNUaXRsZSA9IF87XG4gICAgcmV0dXJuIHN1cnJvdW5kO1xuICB9O1xuXG4gIHN1cnJvdW5kLmdldExlZ2VuZERpc3BsYWNlc1RpdGxlID0gZnVuY3Rpb24gKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBsZWdlbmREaXNwbGFjZXNUaXRsZTtcbiAgfTtcblxuICBzdXJyb3VuZC50YXJnZXQgPSBmdW5jdGlvbiAoXzogU1ZHRWxlbWVudCk6IHR5cGVvZiBzdXJyb3VuZCB7XG4gICAgdGFyZ2V0ID0gXztcbiAgICByZXR1cm4gc3Vycm91bmQ7XG4gIH07XG5cbiAgc3Vycm91bmQuZ2V0VGFyZ2V0ID0gZnVuY3Rpb24gKCk6IFNWR0VsZW1lbnQge1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbiAgc3Vycm91bmQuY2hhcnRBcmVhID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7XG4gICAgICBnOiBjaGFydEFyZWEsXG4gICAgICB4MTpcbiAgICAgICAgbWFyZ2luLmxlZnQgK1xuICAgICAgICAobGVnZW5kRWxlbWVudCAmJlxuICAgICAgICAobGVnZW5kUG9zaXRpb24gPT09IExlZ2VuZFBvc2l0aW9uLkxlZnQgfHxcbiAgICAgICAgICAobGVnZW5kT3JpZW50YXRpb24gPT09IExlZ2VuZE9yaWVudGF0aW9uLlZlcnRpY2FsICYmXG4gICAgICAgICAgICAobGVnZW5kUG9zaXRpb24gPT09IExlZ2VuZFBvc2l0aW9uLlRvcExlZnQgfHxcbiAgICAgICAgICAgICAgbGVnZW5kUG9zaXRpb24gPT09IExlZ2VuZFBvc2l0aW9uLkJvdHRvbUxlZnQpKSlcbiAgICAgICAgICA/IGxlZ2VuZEVsZW1lbnQ/LmdldEJCb3goKS53aWR0aFxuICAgICAgICAgIDogMCksXG4gICAgICB4MjpcbiAgICAgICAgbWFyZ2luLnJpZ2h0ICtcbiAgICAgICAgKGxlZ2VuZEVsZW1lbnQgJiZcbiAgICAgICAgKGxlZ2VuZFBvc2l0aW9uID09PSBMZWdlbmRQb3NpdGlvbi5SaWdodCB8fFxuICAgICAgICAgIChsZWdlbmRPcmllbnRhdGlvbiA9PT0gTGVnZW5kT3JpZW50YXRpb24uVmVydGljYWwgJiZcbiAgICAgICAgICAgIChsZWdlbmRQb3NpdGlvbiA9PT0gTGVnZW5kUG9zaXRpb2