mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-17 12:19:12 +08:00
Reviewed By: michalgr Differential Revision: D3961648 fbshipit-source-id: 3c77d3c1352fd89e12163eee393ffcebe09ea8e3
542 lines
54 KiB
JavaScript
542 lines
54 KiB
JavaScript
/**
|
|
* Copyright (c) 2016-present, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*/
|
|
|
|
'use strict';
|
|
/*eslint no-console-disallow: "off"*/
|
|
/*global React:true*/
|
|
|
|
// TODO:
|
|
// selection and arrow keys for navigating
|
|
var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};}();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called");}return call&&(typeof call==="object"||typeof call==="function")?call:self;}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}
|
|
var rowHeight=20;
|
|
var treeIndent=16;var
|
|
|
|
Draggable=function(_React$Component){_inherits(Draggable,_React$Component);// eslint-disable-line no-unused-vars
|
|
function Draggable(props){_classCallCheck(this,Draggable);return _possibleConstructorReturn(this,(Draggable.__proto__||Object.getPrototypeOf(Draggable)).call(this,
|
|
props));
|
|
}_createClass(Draggable,[{key:'render',value:function render()
|
|
|
|
{
|
|
var id=this.props.id;
|
|
return React.cloneElement(
|
|
this.props.children,
|
|
{
|
|
draggable:'true',
|
|
onDragStart:function onDragStart(e){
|
|
e.dataTransfer.setData('text',id);
|
|
}});
|
|
|
|
|
|
}}]);return Draggable;}(React.Component);
|
|
|
|
Draggable.propTypes={
|
|
children:React.PropTypes.element.isRequired,
|
|
id:React.PropTypes.string.isRequired};var
|
|
|
|
|
|
DropTarget=function(_React$Component2){_inherits(DropTarget,_React$Component2);// eslint-disable-line no-unused-vars
|
|
function DropTarget(props){_classCallCheck(this,DropTarget);return _possibleConstructorReturn(this,(DropTarget.__proto__||Object.getPrototypeOf(DropTarget)).call(this,
|
|
props));
|
|
}_createClass(DropTarget,[{key:'render',value:function render()
|
|
|
|
{
|
|
var thisId=this.props.id;
|
|
var dropAction=this.props.dropAction;
|
|
return React.cloneElement(
|
|
this.props.children,
|
|
{
|
|
onDragOver:function onDragOver(e){return e.preventDefault();},
|
|
onDrop:function onDrop(e){
|
|
var sourceId=e.dataTransfer.getData('text');
|
|
e.preventDefault();
|
|
dropAction(sourceId,thisId);
|
|
}});
|
|
|
|
|
|
}}]);return DropTarget;}(React.Component);
|
|
|
|
|
|
DropTarget.propTypes={
|
|
children:React.PropTypes.element.isRequired,
|
|
id:React.PropTypes.string.isRequired,
|
|
dropAction:React.PropTypes.func.isRequired};var
|
|
|
|
|
|
ExpanderConfiguration=function(_React$Component3){_inherits(ExpanderConfiguration,_React$Component3);
|
|
function ExpanderConfiguration(props){_classCallCheck(this,ExpanderConfiguration);return _possibleConstructorReturn(this,(ExpanderConfiguration.__proto__||Object.getPrototypeOf(ExpanderConfiguration)).call(this,
|
|
props));
|
|
}_createClass(ExpanderConfiguration,[{key:'render',value:function render()
|
|
{
|
|
var aggrow=this.props.aggrow;
|
|
var expander=this.props.expander;
|
|
return(
|
|
React.createElement(Draggable,{id:'expander:add:'+expander.toString()},
|
|
React.createElement('div',{
|
|
style:{
|
|
width:'auto',
|
|
height:'26px',
|
|
border:'1px solid darkGray',
|
|
margin:'2px'}},
|
|
|
|
aggrow.getExpanderName(expander))));
|
|
|
|
|
|
|
|
}}]);return ExpanderConfiguration;}(React.Component);var
|
|
|
|
|
|
TableConfiguration=function(_React$Component4){_inherits(TableConfiguration,_React$Component4);
|
|
function TableConfiguration(props){_classCallCheck(this,TableConfiguration);var _this4=_possibleConstructorReturn(this,(TableConfiguration.__proto__||Object.getPrototypeOf(TableConfiguration)).call(this,
|
|
props));
|
|
_this4.state={
|
|
expanded:false};return _this4;
|
|
|
|
}_createClass(TableConfiguration,[{key:'renderExpander',value:function renderExpander(
|
|
ex){
|
|
return React.createElement(ExpanderConfiguration,{aggrow:this.props.aggrow,expander:ex});
|
|
}},{key:'render',value:function render()
|
|
{var _this5=this;
|
|
var expanderText=this.state.expanded?'>>':'<<';
|
|
var aggrow=this.props.aggrow;
|
|
var config=[];
|
|
if(this.state.expanded){
|
|
config=aggrow.getExpanders().map(function(ex){return _this5.renderExpander(ex);});
|
|
}
|
|
return(
|
|
React.createElement('div',{style:{
|
|
width:this.state.expanded?'512px':'26px',
|
|
height:'100%',
|
|
display:'flex',
|
|
flexDirection:'column',
|
|
overflow:'hidden',
|
|
borderLeft:'2px solid black'}},
|
|
|
|
React.createElement('div',{style:{
|
|
width:'100%',
|
|
height:'26px',
|
|
border:'1px solid darkGray'},
|
|
|
|
onClick:function onClick(e){return _this5.setState({expanded:!_this5.state.expanded});}},
|
|
expanderText),
|
|
|
|
config));
|
|
|
|
|
|
}}]);return TableConfiguration;}(React.Component);
|
|
|
|
|
|
TableConfiguration.propTypes={
|
|
aggrow:React.PropTypes.object.isRequired};var
|
|
|
|
|
|
TableHeader=function(_React$Component5){_inherits(TableHeader,_React$Component5);
|
|
function TableHeader(props){_classCallCheck(this,TableHeader);return _possibleConstructorReturn(this,(TableHeader.__proto__||Object.getPrototypeOf(TableHeader)).call(this,
|
|
props));
|
|
}_createClass(TableHeader,[{key:'render',value:function render()
|
|
{
|
|
var aggrow=this.props.aggrow;
|
|
var aggregators=aggrow.getActiveAggregators();
|
|
var expanders=aggrow.getActiveExpanders();
|
|
var headers=[];
|
|
for(var i=0;i<aggregators.length;i++){
|
|
var name=aggrow.getAggregatorName(aggregators[i]);
|
|
headers.push(
|
|
React.createElement(DropTarget,{
|
|
id:'aggregate:insert:'+i.toString(),
|
|
dropAction:this.props.dropAction},
|
|
|
|
React.createElement('div',{style:{
|
|
width:'16px',
|
|
height:'inherit',
|
|
backgroundColor:'darkGray',
|
|
flexShrink:'0'}})));
|
|
|
|
|
|
headers.push(React.createElement(Draggable,{id:'aggregate:active:'+i.toString()},
|
|
React.createElement('div',{style:{width:'128px',textAlign:'center',flexShrink:'0'}},name)));
|
|
|
|
}
|
|
headers.push(
|
|
React.createElement(DropTarget,{
|
|
id:'divider:insert',
|
|
dropAction:this.props.dropAction},
|
|
|
|
React.createElement('div',{style:{
|
|
width:'16px',
|
|
height:'inherit',
|
|
backgroundColor:'gold',
|
|
flexShrink:'0'}})));
|
|
|
|
|
|
for(var _i=0;_i<expanders.length;_i++){
|
|
var _name=aggrow.getExpanderName(expanders[_i]);
|
|
var bg=_i%2===0?'white':'lightGray';
|
|
headers.push(React.createElement(Draggable,{id:'expander:active:'+_i.toString()},
|
|
React.createElement('div',{style:{
|
|
width:'128px',
|
|
textAlign:'center',
|
|
backgroundColor:bg,
|
|
flexShrink:'0'}},
|
|
|
|
_name)));
|
|
|
|
|
|
var sep=_i+1<expanders.length?'->':'...';
|
|
headers.push(
|
|
React.createElement(DropTarget,{
|
|
id:'expander:insert:'+(_i+1).toString(),
|
|
dropAction:this.props.dropAction},
|
|
|
|
React.createElement('div',{style:{
|
|
height:'inherit',
|
|
backgroundColor:'darkGray',
|
|
flexShrink:'0'}},
|
|
|
|
sep)));
|
|
|
|
|
|
|
|
}
|
|
return(
|
|
React.createElement('div',{style:{
|
|
width:'100%',
|
|
height:'26px',
|
|
display:'flex',
|
|
flexDirection:'row',
|
|
alignItems:'center',
|
|
borderBottom:'2px solid black'}},
|
|
|
|
headers));
|
|
|
|
|
|
}}]);return TableHeader;}(React.Component);
|
|
|
|
|
|
TableHeader.propTypes={
|
|
aggrow:React.PropTypes.object.isRequired,
|
|
dropAction:React.PropTypes.func.isRequired};var
|
|
|
|
|
|
Table=function(_React$Component6){_inherits(Table,_React$Component6);// eslint-disable-line no-unused-vars
|
|
function Table(props){_classCallCheck(this,Table);var _this7=_possibleConstructorReturn(this,(Table.__proto__||Object.getPrototypeOf(Table)).call(this,
|
|
props));
|
|
_this7.state={
|
|
aggrow:props.aggrow,
|
|
viewport:{top:0,height:100},
|
|
cursor:0};return _this7;
|
|
|
|
}_createClass(Table,[{key:'scroll',value:function scroll(
|
|
|
|
e){
|
|
var viewport=e.target;
|
|
var top=Math.floor((viewport.scrollTop-viewport.clientHeight*1.0)/rowHeight);
|
|
var height=Math.ceil(viewport.clientHeight*3.0/rowHeight);
|
|
if(top!==this.state.viewport.top||height!==this.state.viewport.height){
|
|
this.setState({viewport:{top:top,height:height}});
|
|
}
|
|
}},{key:'_contractRow',value:function _contractRow(
|
|
|
|
row){
|
|
var newCursor=this.state.cursor;
|
|
if(newCursor>row.top&&newCursor<row.top+row.height){// in contracted section
|
|
newCursor=row.top;
|
|
}else if(newCursor>=row.top+row.height){// below contracted section
|
|
newCursor-=row.height-1;
|
|
}
|
|
this.state.aggrow.contract(row);
|
|
this.setState({cursor:newCursor});
|
|
console.log('-'+row.top);
|
|
}},{key:'_expandRow',value:function _expandRow(
|
|
|
|
row){
|
|
var newCursor=this.state.cursor;
|
|
this.state.aggrow.expand(row);
|
|
if(newCursor>row.top){// below expanded section
|
|
newCursor+=row.height-1;
|
|
}
|
|
this.setState({cursor:newCursor});
|
|
console.log('+'+row.top);
|
|
}},{key:'_keepCursorInViewport',value:function _keepCursorInViewport()
|
|
|
|
|
|
|
|
{
|
|
if(this._scrollDiv){
|
|
var cursor=this.state.cursor;
|
|
var scrollDiv=this._scrollDiv;
|
|
if(cursor*rowHeight<scrollDiv.scrollTop+scrollDiv.clientHeight*0.1){
|
|
scrollDiv.scrollTop=cursor*rowHeight-scrollDiv.clientHeight*0.1;
|
|
}else if((cursor+1)*rowHeight>scrollDiv.scrollTop+scrollDiv.clientHeight*0.9){
|
|
scrollDiv.scrollTop=(cursor+1)*rowHeight-scrollDiv.clientHeight*0.9;
|
|
}
|
|
}
|
|
}},{key:'keydown',value:function keydown(
|
|
|
|
e){
|
|
var aggrow=this.state.aggrow;
|
|
var cursor=this.state.cursor;
|
|
var row=aggrow.getRows(cursor,1)[0];
|
|
switch(e.keyCode){
|
|
case 38:// up
|
|
if(cursor>0){
|
|
this.setState({cursor:cursor-1});
|
|
this._keepCursorInViewport();
|
|
}
|
|
e.preventDefault();
|
|
break;
|
|
case 40:// down
|
|
if(cursor<aggrow.getHeight()-1){
|
|
this.setState({cursor:cursor+1});
|
|
this._keepCursorInViewport();
|
|
}
|
|
e.preventDefault();
|
|
break;
|
|
case 37:// left
|
|
if(aggrow.canContract(row)){
|
|
this._contractRow(row);
|
|
}else if(aggrow.getRowIndent(row)>0){
|
|
var indent=aggrow.getRowIndent(row)-1;
|
|
while(aggrow.getRowIndent(row)>indent){
|
|
cursor--;
|
|
row=aggrow.getRows(cursor,1)[0];
|
|
}
|
|
this.setState({cursor:cursor});
|
|
this._keepCursorInViewport();
|
|
}
|
|
e.preventDefault();
|
|
break;
|
|
case 39:// right
|
|
if(aggrow.canExpand(row)){
|
|
this._expandRow(row);
|
|
}else if(cursor<aggrow.getHeight()-1){
|
|
this.setState({cursor:cursor+1});
|
|
this._keepCursorInViewport();
|
|
}
|
|
e.preventDefault();
|
|
break;}
|
|
|
|
}},{key:'dropAction',value:function dropAction(
|
|
|
|
s,d){
|
|
var aggrow=this.state.aggrow;
|
|
console.log('dropped '+s+' to '+d);
|
|
if(s.startsWith('aggregate:active:')){
|
|
var sIndex=parseInt(s.substr(17),10);
|
|
var dIndex=-1;
|
|
var active=aggrow.getActiveAggregators();
|
|
var dragged=active[sIndex];
|
|
if(d.startsWith('aggregate:insert:')){
|
|
dIndex=parseInt(d.substr(17),10);
|
|
}else if(d==='divider:insert'){
|
|
dIndex=active.length;
|
|
}else{
|
|
throw'not allowed to drag '+s+' to '+d;
|
|
}
|
|
if(dIndex>sIndex){
|
|
dIndex--;
|
|
}
|
|
active.splice(sIndex,1);
|
|
active.splice(dIndex,0,dragged);
|
|
aggrow.setActiveAggregators(active);
|
|
this.setState({cursor:0});
|
|
}else if(s.startsWith('expander:active:')){
|
|
var _sIndex=parseInt(s.substr(16),10);
|
|
var _dIndex=-1;
|
|
var _active=aggrow.getActiveExpanders();
|
|
var _dragged=_active[_sIndex];
|
|
if(d.startsWith('expander:insert:')){
|
|
_dIndex=parseInt(d.substr(16),10);
|
|
}else if(d==='divider:insert'){
|
|
_dIndex=0;
|
|
}else{
|
|
throw'not allowed to drag '+s+' to '+d;
|
|
}
|
|
if(_dIndex>_sIndex){
|
|
_dIndex--;
|
|
}
|
|
_active.splice(_sIndex,1);
|
|
_active.splice(_dIndex,0,_dragged);
|
|
aggrow.setActiveExpanders(_active);
|
|
this.setState({cursor:0});
|
|
}else if(s.startsWith('expander:add:')){
|
|
var _dIndex2=-1;
|
|
var sExpander=parseInt(s.substring(13),10);
|
|
if(d.startsWith('expander:insert:')){
|
|
_dIndex2=parseInt(d.substr(16),10);
|
|
}else if(d==='divider:insert'){
|
|
_dIndex2=0;
|
|
}else{
|
|
throw'not allowed to drag '+s+' to '+d;
|
|
}
|
|
var _active2=aggrow.getActiveExpanders();
|
|
_active2.splice(_dIndex2,0,sExpander);
|
|
aggrow.setActiveExpanders(_active2);
|
|
this.setState({cursor:0});
|
|
}
|
|
}},{key:'render',value:function render()
|
|
|
|
{var _this8=this;
|
|
return(
|
|
React.createElement('div',{style:{width:'100%',height:'100%',display:'flex',flexDirection:'row'}},
|
|
React.createElement('div',{style:{width:'100%',height:'100%',display:'flex',flexDirection:'column',overflow:'hidden'}},
|
|
React.createElement(TableHeader,{aggrow:this.state.aggrow,dropAction:function dropAction(s,d){return _this8.dropAction(s,d);}}),
|
|
React.createElement('div',{
|
|
style:{
|
|
width:'100%',
|
|
flexGrow:'1',
|
|
overflow:'scroll'},
|
|
|
|
onScroll:function onScroll(e){return _this8.scroll(e);},
|
|
ref:function ref(div){_this8._scrollDiv=div;}},
|
|
React.createElement('div',{style:{position:'relative'}},
|
|
this.renderVirtualizedRows()))),
|
|
|
|
|
|
|
|
React.createElement(TableConfiguration,{aggrow:this.state.aggrow})));
|
|
|
|
|
|
}},{key:'renderVirtualizedRows',value:function renderVirtualizedRows()
|
|
|
|
{var _this9=this;
|
|
var aggrow=this.state.aggrow;
|
|
var viewport=this.state.viewport;
|
|
var rows=aggrow.getRows(viewport.top,viewport.height);
|
|
return(
|
|
React.createElement('div',{style:{
|
|
position:'absolute',
|
|
width:'100%',
|
|
height:(rowHeight*(aggrow.getHeight()+20)).toString()+'px'}},
|
|
|
|
rows.map(function(child){return _this9.renderRow(child);})));
|
|
|
|
|
|
}},{key:'renderRow',value:function renderRow(
|
|
|
|
row){var _this10=this;
|
|
if(row===null){
|
|
return null;
|
|
}
|
|
var bg='lightGray';
|
|
var aggrow=this.state.aggrow;
|
|
var columns=[];
|
|
var rowText='';
|
|
var indent=4+aggrow.getRowIndent(row)*treeIndent;
|
|
var aggregates=aggrow.getActiveAggregators();
|
|
if(row.parent!==null&&row.parent.expander%2===0){
|
|
bg='white';
|
|
}
|
|
if(row.top===this.state.cursor){
|
|
bg='lightblue';
|
|
}
|
|
for(var i=0;i<aggregates.length;i++){
|
|
var aggregate=aggrow.getRowAggregate(row,i);
|
|
columns.push(
|
|
React.createElement('div',{style:{
|
|
width:'16px',
|
|
height:'inherit',
|
|
backgroundColor:'darkGray',
|
|
flexShrink:'0'}}));
|
|
|
|
|
|
columns.push(
|
|
React.createElement('div',{style:{
|
|
width:'128px',
|
|
textAlign:'right',
|
|
flexShrink:'0'}},
|
|
|
|
aggregate));
|
|
|
|
|
|
}
|
|
columns.push(
|
|
React.createElement('div',{style:{
|
|
width:'16px',
|
|
height:'inherit',
|
|
backgroundColor:'gold',
|
|
flexShrink:'0'}}));
|
|
|
|
|
|
if(aggrow.canExpand(row)){
|
|
columns.push(
|
|
React.createElement('div',{
|
|
style:{
|
|
marginLeft:indent.toString()+'px',
|
|
flexShrink:'0',
|
|
width:'12px',
|
|
textAlign:'center',
|
|
border:'1px solid gray'},
|
|
|
|
onClick:function onClick(){return _this10._expandRow(row);}},'+'));
|
|
|
|
|
|
}else if(aggrow.canContract(row)){
|
|
columns.push(
|
|
React.createElement('div',{
|
|
style:{
|
|
marginLeft:indent.toString()+'px',
|
|
flexShrink:'0',
|
|
width:'12px',
|
|
textAlign:'center',
|
|
border:'1px solid gray'},
|
|
|
|
onClick:function onClick(){return _this10._contractRow(row);}},'-'));
|
|
|
|
|
|
}else{
|
|
columns.push(
|
|
React.createElement('div',{
|
|
style:{
|
|
marginLeft:indent.toString()+'px'}}));
|
|
|
|
|
|
|
|
}
|
|
rowText+=aggrow.getRowLabel(row);
|
|
columns.push(
|
|
React.createElement('div',{style:{
|
|
flexShrink:'0',
|
|
whiteSpace:'nowrap',
|
|
marginRight:'20px'}},
|
|
|
|
rowText));
|
|
|
|
|
|
return(
|
|
React.createElement('div',{
|
|
key:row.top,
|
|
style:{
|
|
position:'absolute',
|
|
height:(rowHeight-1).toString()+'px',
|
|
top:(rowHeight*row.top).toString()+'px',
|
|
display:'flex',
|
|
flexDirection:'row',
|
|
alignItems:'center',
|
|
backgroundColor:bg,
|
|
borderBottom:'1px solid gray'},
|
|
|
|
onClick:function onClick(){
|
|
_this10.setState({cursor:row.top});
|
|
}},
|
|
columns));
|
|
|
|
|
|
}},{key:'componentDidMount',value:function componentDidMount()
|
|
|
|
{
|
|
this.keydown=this.keydown.bind(this);
|
|
document.body.addEventListener('keydown',this.keydown);
|
|
}},{key:'componentWillUnmount',value:function componentWillUnmount()
|
|
|
|
{
|
|
document.body.removeEventListener('keydown',this.keydown);
|
|
}}]);return Table;}(React.Component);
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy90YWJsZS5qcyJdLCJuYW1lcyI6WyJyb3dIZWlnaHQiLCJ0cmVlSW5kZW50IiwiRHJhZ2dhYmxlIiwicHJvcHMiLCJpZCIsIlJlYWN0IiwiY2xvbmVFbGVtZW50IiwiY2hpbGRyZW4iLCJkcmFnZ2FibGUiLCJvbkRyYWdTdGFydCIsImUiLCJkYXRhVHJhbnNmZXIiLCJzZXREYXRhIiwiQ29tcG9uZW50IiwicHJvcFR5cGVzIiwiUHJvcFR5cGVzIiwiZWxlbWVudCIsImlzUmVxdWlyZWQiLCJzdHJpbmciLCJEcm9wVGFyZ2V0IiwidGhpc0lkIiwiZHJvcEFjdGlvbiIsIm9uRHJhZ092ZXIiLCJwcmV2ZW50RGVmYXVsdCIsIm9uRHJvcCIsInNvdXJjZUlkIiwiZ2V0RGF0YSIsImZ1bmMiLCJFeHBhbmRlckNvbmZpZ3VyYXRpb24iLCJhZ2dyb3ciLCJleHBhbmRlciIsInRvU3RyaW5nIiwid2lkdGgiLCJoZWlnaHQiLCJib3JkZXIiLCJtYXJnaW4iLCJnZXRFeHBhbmRlck5hbWUiLCJUYWJsZUNvbmZpZ3VyYXRpb24iLCJzdGF0ZSIsImV4cGFuZGVkIiwiZXgiLCJleHBhbmRlclRleHQiLCJjb25maWciLCJnZXRFeHBhbmRlcnMiLCJtYXAiLCJyZW5kZXJFeHBhbmRlciIsImRpc3BsYXkiLCJmbGV4RGlyZWN0aW9uIiwib3ZlcmZsb3ciLCJib3JkZXJMZWZ0Iiwic2V0U3RhdGUiLCJvYmplY3QiLCJUYWJsZUhlYWRlciIsImFnZ3JlZ2F0b3JzIiwiZ2V0QWN0aXZlQWdncmVnYXRvcnMiLCJleHBhbmRlcnMiLCJnZXRBY3RpdmVFeHBhbmRlcnMiLCJoZWFkZXJzIiwiaSIsImxlbmd0aCIsIm5hbWUiLCJnZXRBZ2dyZWdhdG9yTmFtZSIsInB1c2giLCJiYWNrZ3JvdW5kQ29sb3IiLCJmbGV4U2hyaW5rIiwidGV4dEFsaWduIiwiYmciLCJzZXAiLCJhbGlnbkl0ZW1zIiwiYm9yZGVyQm90dG9tIiwiVGFibGUiLCJ2aWV3cG9ydCIsInRvcCIsImN1cnNvciIsInRhcmdldCIsIk1hdGgiLCJmbG9vciIsInNjcm9sbFRvcCIsImNsaWVudEhlaWdodCIsImNlaWwiLCJyb3ciLCJuZXdDdXJzb3IiLCJjb250cmFjdCIsImNvbnNvbGUiLCJsb2ciLCJleHBhbmQiLCJfc2Nyb2xsRGl2Iiwic2Nyb2xsRGl2IiwiZ2V0Um93cyIsImtleUNvZGUiLCJfa2VlcEN1cnNvckluVmlld3BvcnQiLCJnZXRIZWlnaHQiLCJjYW5Db250cmFjdCIsIl9jb250cmFjdFJvdyIsImdldFJvd0luZGVudCIsImluZGVudCIsImNhbkV4cGFuZCIsIl9leHBhbmRSb3ciLCJzIiwiZCIsInN0YXJ0c1dpdGgiLCJzSW5kZXgiLCJwYXJzZUludCIsInN1YnN0ciIsImRJbmRleCIsImFjdGl2ZSIsImRyYWdnZWQiLCJzcGxpY2UiLCJzZXRBY3RpdmVBZ2dyZWdhdG9ycyIsInNldEFjdGl2ZUV4cGFuZGVycyIsInNFeHBhbmRlciIsInN1YnN0cmluZyIsImZsZXhHcm93Iiwic2Nyb2xsIiwiZGl2IiwicG9zaXRpb24iLCJyZW5kZXJWaXJ0dWFsaXplZFJvd3MiLCJyb3dzIiwicmVuZGVyUm93IiwiY2hpbGQiLCJjb2x1bW5zIiwicm93VGV4dCIsImFnZ3JlZ2F0ZXMiLCJwYXJlbnQiLCJhZ2dyZWdhdGUiLCJnZXRSb3dBZ2dyZWdhdGUiLCJtYXJnaW5MZWZ0IiwiZ2V0Um93TGFiZWwiLCJ3aGl0ZVNwYWNlIiwibWFyZ2luUmlnaHQiLCJrZXlkb3duIiwiYmluZCIsImRvY3VtZW50IiwiYm9keSIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZW1vdmVFdmVudExpc3RlbmVyIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0FBU0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsR0FBTUEsV0FBWSxFQUFsQjtBQUNBLEdBQU1DLFlBQWEsRUFBbkIsQzs7QUFFTUMsUyxrRUFBb0M7QUFDeEMsbUJBQVlDLEtBQVosQ0FBbUI7QUFDWEEsS0FEVztBQUVsQixDOztBQUVRO0FBQ1AsR0FBTUMsSUFBSyxL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bnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0Jztcbi8qZXNsaW50IG5vLWNvbnNvbGUtZGlzYWxsb3c6IFwib2ZmXCIqL1xuLypnbG9iYWwgUmVhY3Q6dHJ1ZSovXG5cbi8vIFRPRE86XG4vLyBzZWxlY3Rpb24gYW5kIGFycm93IGtleXMgZm9yIG5hdmlnYXRpbmdcblxuY29uc3Qgcm93SGVpZ2h0ID0gMjA7XG5jb25zdCB0cmVlSW5kZW50ID0gMTY7XG5cbmNsYXNzIERyYWdnYWJsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgaWQgPSB0aGlzLnByb3BzLmlkO1xuICAgIHJldHVybiBSZWFjdC5jbG9uZUVsZW1lbnQoXG4gICAgICB0aGlzLnByb3BzLmNoaWxkcmVuLFxuICAgICAge1xuICAgICAgICBkcmFnZ2FibGU6ICd0cnVlJyxcbiAgICAgICAgb25EcmFnU3RhcnQ6IChlKSA9PiB7XG4gICAgICAgICAgZS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dCcsIGlkKTtcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICApO1xuICB9XG59XG5EcmFnZ2FibGUucHJvcFR5cGVzID0ge1xuICBjaGlsZHJlbjogUmVhY3QuUHJvcFR5cGVzLmVsZW1lbnQuaXNSZXF1aXJlZCxcbiAgaWQ6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbn07XG5cbmNsYXNzIERyb3BUYXJnZXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHRoaXNJZCA9IHRoaXMucHJvcHMuaWQ7XG4gICAgY29uc3QgZHJvcEFjdGlvbiA9IHRoaXMucHJvcHMuZHJvcEFjdGlvbjtcbiAgICByZXR1cm4gUmVhY3QuY2xvbmVFbGVtZW50KFxuICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlbixcbiAgICAgIHtcbiAgICAgICAgb25EcmFnT3ZlcjogKGUpID0+IGUucHJldmVudERlZmF1bHQoKSxcbiAgICAgICAgb25Ecm9wOiAoZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNvdXJjZUlkID0gZS5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgndGV4dCcpO1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBkcm9wQWN0aW9uKHNvdXJjZUlkLCB0aGlzSWQpO1xuICAgICAgICB9LFxuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuRHJvcFRhcmdldC5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBSZWFjdC5Qcm9wVHlwZXMuZWxlbWVudC5pc1JlcXVpcmVkLFxuICBpZDogUmVhY3QuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBkcm9wQWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxufTtcblxuY2xhc3MgRXhwYW5kZXJDb25maWd1cmF0aW9uIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IGFnZ3JvdyA9IHRoaXMucHJvcHMuYWdncm93O1xuICAgIGNvbnN0IGV4cGFuZGVyID0gdGhpcy5wcm9wcy5leHBhbmRlcjtcbiAgICByZXR1cm4gKFxuICAgICAgPERyYWdnYWJsZSBpZD17J2V4cGFuZGVyOmFkZDonICsgZXhwYW5kZXIudG9TdHJpbmcoKX0+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgICAgIGhlaWdodDogJzI2cHgnLFxuICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIGRhcmtHcmF5JyxcbiAgICAgICAgICAgIG1hcmdpbjogJzJweCcsXG4gICAgICAgICAgfX0+XG4gICAgICAgICAge2FnZ3Jvdy5nZXRFeHBhbmRlck5hbWUoZXhwYW5kZXIpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvRHJhZ2dhYmxlPlxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgVGFibGVDb25maWd1cmF0aW9uIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGV4cGFuZGVkOiBmYWxzZSxcbiAgICB9O1xuICB9XG4gIHJlbmRlckV4cGFuZGVyKGV4KSB7XG4gICAgcmV0dXJuICg8RXhwYW5kZXJDb25maWd1cmF0aW9uIGFnZ3Jvdz17dGhpcy5wcm9wcy5hZ2dyb3d9IGV4cGFuZGVyPXtleH0gLz4pO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBleHBhbmRlclRleHQgPSB0aGlzLnN0YXRlLmV4cGFuZGVkID8gJz4+JyA6ICc8PCc7XG4gICAgY29uc3QgYWdncm93ID0gdGhpcy5wcm9wcy5hZ2dyb3c7XG4gICAgbGV0IGNvbmZpZyA9IFtdO1xuICAgIGlmICh0aGlzLnN0YXRlLmV4cGFuZGVkKSB7XG4gICAgICBjb25maWcgPSBhZ2dyb3cuZ2V0RXhwYW5kZXJzKCkubWFwKChleCkgPT4gdGhpcy5yZW5kZXJFeHBhbmRlcihleCkpO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgIHdpZHRoOiB0aGlzLnN0YXRlLmV4cGFuZGVkID8gJzUxMnB4JyA6ICcyNnB4JyxcbiAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgIGJvcmRlckxlZnQ6ICcycHggc29saWQgYmxhY2snLFxuICAgICAgICB9fT5cbiAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgIGhlaWdodDogJzI2cHgnLFxuICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIGRhcmtHcmF5JyxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2xpY2s9eyAoZSkgPT4gdGhpcy5zZXRTdGF0ZSh7ZXhwYW5kZWQ6ICF0aGlzLnN0YXRlLmV4cGFuZGVkfSkgfT5cbiAgICAgICAgICB7IGV4cGFuZGVyVGV4dCB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICB7IGNvbmZpZyB9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cblRhYmxlQ29uZmlndXJhdGlvbi5wcm9wVHlwZXMgPSB7XG4gIGFnZ3JvdzogUmVhY3QuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxufTtcblxuY2xhc3MgVGFibGVIZWFkZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgYWdncm93ID0gdGhpcy5wcm9wcy5hZ2dyb3c7XG4gICAgY29uc3QgYWdncmVnYXRvcnMgPSBhZ2dyb3cuZ2V0QWN0aXZlQWdncmVnYXRvcnMoKTtcbiAgICBjb25zdCBleHBhbmRlcnMgPSBhZ2dyb3cuZ2V0QWN0aXZlRXhwYW5kZXJzKCk7XG4gICAgY29uc3QgaGVhZGVycyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWdncmVnYXRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBhZ2dyb3cuZ2V0QWdncmVnYXRvck5hbWUoYWdncmVnYXRvcnNbaV0pO1xuICAgICAgaGVhZGVycy5wdXNoKChcbiAgICAgICAgPERyb3BUYXJnZXRcbiAgICAgICAgICBpZD17J2FnZ3JlZ2F0ZTppbnNlcnQ6JyArIGkudG9TdHJpbmcoKX1cbiAgICAgICAgICBkcm9wQWN0aW9uPXt0aGlzLnByb3BzLmRyb3BBY3Rpb259XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICB3aWR0aDogJzE2cHgnLFxuICAgICAgICAgICAgaGVpZ2h0OiAnaW5oZXJpdCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdkYXJrR3JheScsXG4gICAgICAgICAgICBmbGV4U2hyaW5rOiAnMCcgfX1cbiAgICAgICAgICA+PC9kaXY+XG4gICAgICAgIDwvRHJvcFRhcmdldD4pKTtcbiAgICAgIGhlYWRlcnMucHVzaCgoPERyYWdnYWJsZSBpZD17J2FnZ3JlZ2F0ZTphY3RpdmU6JyArIGkudG9TdHJpbmcoKX0+XG4gICAgICAgICAgPGRpdiBzdHlsZT17eyB3aWR0aDogJzEyOHB4JywgdGV4dEFsaWduOiAnY2VudGVyJywgZmxleFNocmluazogJzAnIH19PntuYW1lfTwvZGl2PlxuICAgICAgICA8L0RyYWdnYWJsZT4pKTtcbiAgICB9XG4gICAgaGVhZGVycy5wdXNoKChcbiAgICAgIDxEcm9wVGFyZ2V0XG4gICAgICAgIGlkPVwiZGl2aWRlcjppbnNlcnRcIlxuICAgICAgICBkcm9wQWN0aW9uPXt0aGlzLnByb3BzLmRyb3BBY3Rpb259XG4gICAgICA+XG4gICAgICAgIDxkaXYgc3R5bGU9e3tcbiAgICAgICAgICB3aWR0aDogJzE2cHgnLFxuICAgICAgICAgIGhlaWdodDogJ2luaGVyaXQnLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ2dvbGQnLFxuICAgICAgICAgIGZsZXhTaHJpbms6ICcwJ1xuICAgICAgICB9fT48L2Rpdj5cbiAgICAgIDwvRHJvcFRhcmdldD4pKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGFuZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZSA9IGFnZ3Jvdy5nZXRFeHBhbmRlck5hbWUoZXhwYW5kZXJzW2ldKTtcbiAgICAgIGNvbnN0IGJnID0gKGkgJSAyID09PSAwKSA/ICd3aGl0ZScgOiAnbGlnaHRHcmF5JztcbiAgICAgIGhlYWRlcnMucHVzaCgoPERyYWdnYWJsZSBpZD17J2V4cGFuZGVyOmFjdGl2ZTonICsgaS50b1N0cmluZygpfT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgICB3aWR0aDogJzEyOHB4JyxcbiAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGJnLFxuICAgICAgICAgICAgZmxleFNocmluazogJzAnXG4gICAgICAgICAgfX0+XG4gICAgICAgICAgICB7bmFtZX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9EcmFnZ2FibGU+KSk7XG4gICAgICBjb25zdCBzZXAgPSBpICsgMSA8IGV4cGFuZGVycy5sZW5ndGggPyAnLT4nIDogJy4uLic7XG4gICAgICBoZWFkZXJzLnB1c2goKFxuICAgICAgICA8RHJvcFRhcmdldFxuICAgICAgICAgIGlkPXsnZXhwYW5kZXI6aW5zZXJ0OicgKyAoaSArIDEpLnRvU3RyaW5nKCl9XG4gICAgICAgICAgZHJvcEFjdGlvbj17dGhpcy5wcm9wcy5kcm9wQWN0aW9ufVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgICAgaGVpZ2h0OiAnaW5oZXJpdCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdkYXJrR3JheScsXG4gICAgICAgICAgICBmbGV4U2hyaW5rOiAnMCdcbiAgICAgICAgICB9fT5cbiAgICAgICAgICAgIHtzZXB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvRHJvcFRhcmdldD4pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICBoZWlnaHQ6ICcyNnB4JyxcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBmbGV4RGlyZWN0aW9uOiAncm93JyxcbiAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgIGJvcmRlckJvdHRvbTogJzJweCBzb2xpZCBibGFjaycsXG4gICAgICB9fT5cbiAgICAgICAge2hlYWRlcnN9XG4gICAgICA8L2Rpdj5cbiAgICApO1xuICB9XG59XG5cblRhYmxlSGVhZGVyLnByb3BUeXBlcyA9IHtcbiAgYWdncm93OiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIGRyb3BBY3Rpb246IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG59O1xuXG5jbGFzcyBUYWJsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGFnZ3JvdzogcHJvcHMuYWdncm93LFxuICAgICAgdmlld3BvcnQ6IHsgdG9wOiAwLCBoZWlnaHQ6IDEwMCB9LFxuICAgICAgY3Vyc29yOiAwLFxuICAgIH07XG4gIH1cblxuICBzY3JvbGwoZSkge1xuICAgIGNvbnN0IHZpZXdwb3J0ID0gZS50YXJnZXQ7XG4gICAgY29uc3QgdG9wID0gTWF0aC5mbG9vcigodmlld3BvcnQuc2Nyb2xsVG9wIC0gdmlld3BvcnQuY2xpZW50SGVpZ2h0ICogMS4wKSAvIHJvd0hlaWdodCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5jZWlsKHZpZXdwb3J0LmNsaWVudEhlaWdodCAqIDMuMCAvIHJvd0hlaWdodCk7XG4gICAgaWYgKHRvcCAhPT0gdGhpcy5zdGF0ZS52aWV3cG9ydC50b3AgfHwgaGVpZ2h0ICE9PSB0aGlzLnN0YXRlLnZpZXdwb3J0LmhlaWdodCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7dmlld3BvcnQ6IHt0b3AsIGhlaWdodH19KTtcbiAgICB9XG4gIH1cblxuICBfY29udHJhY3RSb3cocm93KSB7XG4gICAgbGV0IG5ld0N1cnNvciA9IHRoaXMuc3RhdGUuY3Vyc29yO1xuICAgIGlmIChuZXdDdXJzb3IgPiByb3cudG9wICYmIG5ld0N1cnNvciA8IHJvdy50b3AgKyByb3cuaGVpZ2h0KSB7IC8vIGluIGNvbnRyYWN0ZWQgc2VjdGlvblxuICAgICAgbmV3Q3Vyc29yID0gcm93LnRvcDtcbiAgICB9IGVsc2UgaWYgKG5ld0N1cnNvciA+PSByb3cudG9wICsgcm93LmhlaWdodCkgeyAvLyBiZWxvdyBjb250cmFjdGVkIHNlY3Rpb25cbiAgICAgIG5ld0N1cnNvciAtPSByb3cuaGVpZ2h0IC0gMTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5hZ2dyb3cuY29udHJhY3Qocm93KTtcbiAgICB0aGlzLnNldFN0YXRlKHtjdXJzb3I6IG5ld0N1cnNvcn0pO1xuICAgIGNvbnNvbGUubG9nKCctJyArIHJvdy50b3ApO1xuICB9XG5cbiAgX2V4cGFuZFJvdyhyb3cpIHtcbiAgICBsZXQgbmV3Q3Vyc29yID0gdGhpcy5zdGF0ZS5jdXJzb3I7XG4gICAgdGhpcy5zdGF0ZS5hZ2dyb3cuZXhwYW5kKHJvdyk7XG4gICAgaWYgKG5ld0N1cnNvciA+IHJvdy50b3ApIHsgIC8vIGJlbG93IGV4cGFuZGVkIHNlY3Rpb25cbiAgICAgIG5ld0N1cnNvciArPSByb3cuaGVpZ2h0IC0gMTtcbiAgICB9XG4gICAgdGhpcy5zZXRTdGF0ZSh7Y3Vyc29yOiBuZXdDdXJzb3J9KTtcbiAgICBjb25zb2xlLmxvZygnKycgKyByb3cudG9wKTtcbiAgfVxuXG4gIF9zY3JvbGxEaXY6IG51bGw7XG5cbiAgX2tlZXBDdXJzb3JJblZpZXdwb3J0KCkge1xuICAgIGlmICh0aGlzLl9zY3JvbGxEaXYpIHtcbiAgICAgIGNvbnN0IGN1cnNvciA9IHRoaXMuc3RhdGUuY3Vyc29yO1xuICAgICAgY29uc3Qgc2Nyb2xsRGl2ID0gdGhpcy5fc2Nyb2xsRGl2O1xuICAgICAgaWYgKGN1cnNvciAqIHJvd0hlaWdodCA8IHNjcm9sbERpdi5zY3JvbGxUb3AgKyBzY3JvbGxEaXYuY2xpZW50SGVpZ2h0ICogMC4xKSB7XG4gICAgICAgIHNjcm9sbERpdi5zY3JvbGxUb3AgPSBjdXJzb3IgKiByb3dIZWlnaHQgLSBzY3JvbGxEaXYuY2xpZW50SGVpZ2h0ICogMC4xO1xuICAgICAgfSBlbHNlIGlmICgoY3Vyc29yICsgMSkgKiByb3dIZWlnaHQgPiBzY3JvbGxEaXYuc2Nyb2xsVG9wICsgc2Nyb2xsRGl2LmNsaWVudEhlaWdodCAqIDAuOSkge1xuICAgICAgICBzY3JvbGxEaXYuc2Nyb2xsVG9wID0gKGN1cnNvciArIDEpICogcm93SGVpZ2h0IC0gc2Nyb2xsRGl2LmNsaWVudEhlaWdodCAqIDAuOTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBrZXlkb3duKGUpIHtcbiAgICBjb25zdCBhZ2dyb3cgPSB0aGlzLnN0YXRlLmFnZ3JvdztcbiAgICBsZXQgY3Vyc29yID0gdGhpcy5zdGF0ZS5jdXJzb3I7XG4gICAgbGV0IHJvdyA9IGFnZ3Jvdy5nZXRSb3dzKGN1cnNvciwgMSlbMF07XG4gICAgc3dpdGNoIChlLmtleUNvZGUpIHtcbiAgICAgIGNhc2UgMzg6IC8vIHVwXG4gICAgICAgIGlmIChjdXJzb3IgPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y3Vyc29yOiBjdXJzb3IgLSAxfSk7XG4gICAgICAgICAgdGhpcy5fa2VlcEN1cnNvckluVmlld3BvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0MDogLy8gZG93blxuICAgICAgICBpZiAoY3Vyc29yIDwgYWdncm93LmdldEhlaWdodCgpIC0gMSkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2N1cnNvcjogY3Vyc29yICsgMX0pO1xuICAgICAgICAgIHRoaXMuX2tlZXBDdXJzb3JJblZpZXdwb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzc6IC8vIGxlZnRcbiAgICAgICAgaWYgKGFnZ3Jvdy5jYW5Db250cmFjdChyb3cpKSB7XG4gICAgICAgICAgdGhpcy5fY29udHJhY3RSb3cocm93KTtcbiAgICAgICAgfSBlbHNlIGlmIChhZ2dyb3cuZ2V0Um93SW5kZW50KHJvdykgPiAwKSB7XG4gICAgICAgICAgY29uc3QgaW5kZW50ID0gYWdncm93LmdldFJvd0luZGVudChyb3cpIC0gMTtcbiAgICAgICAgICB3aGlsZSAoYWdncm93LmdldFJvd0luZGVudChyb3cpID4gaW5kZW50KSB7XG4gICAgICAgICAgICBjdXJzb3ItLTtcbiAgICAgICAgICAgIHJvdyA9IGFnZ3Jvdy5nZXRSb3dzKGN1cnNvciwgMSlbMF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2N1cnNvcjogY3Vyc29yfSk7XG4gICAgICAgICAgdGhpcy5fa2VlcEN1cnNvckluVmlld3BvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOTogLy8gcmlnaHRcbiAgICAgICAgaWYgKGFnZ3Jvdy5jYW5FeHBhbmQocm93KSkge1xuICAgICAgICAgIHRoaXMuX2V4cGFuZFJvdyhyb3cpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnNvciA8IGFnZ3Jvdy5nZXRIZWlnaHQoKSAtIDEpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHtjdXJzb3I6IGN1cnNvciArIDF9KTtcbiAgICAgICAgICB0aGlzLl9rZWVwQ3Vyc29ySW5WaWV3cG9ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgZHJvcEFjdGlvbihzLCBkKSB7XG4gICAgY29uc3QgYWdncm93ID0gdGhpcy5zdGF0ZS5hZ2dyb3c7XG4gICAgY29uc29sZS5sb2coJ2Ryb3BwZWQgJyArIHMgKyAnIHRvICcgKyBkKTtcbiAgICBpZiAocy5zdGFydHNXaXRoKCdhZ2dyZWdhdGU6YWN0aXZlOicpKSB7XG4gICAgICBjb25zdCBzSW5kZXggPSBwYXJzZUludChzLnN1YnN0cigxNyksIDEwKTtcbiAgICAgIGxldCBkSW5kZXggPSAtMTtcbiAgICAgIGNvbnN0IGFjdGl2ZSA9IGFnZ3Jvdy5nZXRBY3RpdmVBZ2dyZWdhdG9ycygpO1xuICAgICAgY29uc3QgZHJhZ2dlZCA9IGFjdGl2ZVtzSW5kZXhdO1xuICAgICAgaWYgKGQuc3RhcnRzV2l0aCgnYWdncmVnYXRlOmluc2VydDonKSkge1xuICAgICAgICBkSW5kZXggPSBwYXJzZUludChkLnN1YnN0cigxNyksIDEwKTtcbiAgICAgIH0gZWxzZSBpZiAoZCA9PT0gJ2RpdmlkZXI6aW5zZXJ0Jykge1xuICAgICAgICBkSW5kZXggPSBhY3RpdmUubGVuZ3RoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgJ25vdCBhbGxvd2VkIHRvIGRyYWcgJyArIHMgKyAnIHRvICcgKyBkO1xuICAgICAgfVxuICAgICAgaWYgKGRJbmRleCA+IHNJbmRleCkge1xuICAgICAgICBkSW5kZXgtLTtcbiAgICAgIH1cbiAgICAgIGFjdGl2ZS5zcGxpY2Uoc0luZGV4LCAxKTtcbiAgICAgIGFjdGl2ZS5zcGxpY2UoZEluZGV4LCAwLCBkcmFnZ2VkKTtcbiAgICAgIGFnZ3Jvdy5zZXRBY3RpdmVBZ2dyZWdhdG9ycyhhY3RpdmUpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7Y3Vyc29yOjB9KTtcbiAgICB9IGVsc2UgaWYgKHMuc3RhcnRzV2l0aCgnZXhwYW5kZXI6YWN0aXZlOicpKSB7XG4gICAgICBjb25zdCBzSW5kZXggPSBwYXJzZUludChzLnN1YnN0cigxNiksIDEwKTtcbiAgICAgIGxldCBkSW5kZXggPSAtMTtcbiAgICAgIGNvbnN0IGFjdGl2ZSA9IGFnZ3Jvdy5nZXRBY3RpdmVFeHBhbmRlcnMoKTtcbiAgICAgIGNvbnN0IGRyYWdnZWQgPSBhY3RpdmVbc0luZGV4XTtcbiAgICAgIGlmIChkLnN0YXJ0c1dpdGgoJ2V4cGFuZGVyOmluc2VydDonKSkge1xuICAgICAgICBkSW5kZXggPSBwYXJzZUludChkLnN1YnN0cigxNiksIDEwKTtcbiAgICAgIH0gZWxzZSBpZiAoZCA9PT0gJ2RpdmlkZXI6aW5zZXJ0Jykge1xuICAgICAgICBkSW5kZXggPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgJ25vdCBhbGxvd2VkIHRvIGRyYWcgJyArIHMgKyAnIHRvICcgKyBkO1xuICAgICAgfVxuICAgICAgaWYgKGRJbmRleCA+IHNJbmRleCkge1xuICAgICAgICBkSW5kZXgtLTtcbiAgICAgIH1cbiAgICAgIGFjdGl2ZS5zcGxpY2Uoc0luZGV4LCAxKTtcbiAgICAgIGFjdGl2ZS5zcGxpY2UoZEluZGV4LCAwLCBkcmFnZ2VkKTtcbiAgICAgIGFnZ3Jvdy5zZXRBY3RpdmVFeHBhbmRlcnMoYWN0aXZlKTtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2N1cnNvcjowfSk7XG4gICAgfSBlbHNlIGlmIChzLnN0YXJ0c1dpdGgoJ2V4cGFuZGVyOmFkZDonKSkge1xuICAgICAgbGV0IGRJbmRleCA9IC0xO1xuICAgICAgY29uc3Qgc0V4cGFuZGVyID0gcGFyc2VJbnQocy5zdWJzdHJpbmcoMTMpLCAxMCk7XG4gICAgICBpZiAoZC5zdGFydHNXaXRoKCdleHBhbmRlcjppbnNlcnQ6JykpIHtcbiAgICAgICAgZEluZGV4ID0gcGFyc2VJbnQoZC5zdWJzdHIoMTYpLCAxMCk7XG4gICAgICB9IGVsc2UgaWYgKGQgPT09ICdkaXZpZGVyOmluc2VydCcpIHtcbiAgICAgICAgZEluZGV4ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93ICdub3QgYWxsb3dlZCB0byBkcmFnICcgKyBzICsgJyB0byAnICsgZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFjdGl2ZSA9IGFnZ3Jvdy5nZXRBY3RpdmVFeHBhbmRlcnMoKTtcbiAgICAgIGFjdGl2ZS5zcGxpY2UoZEluZGV4LCAwLCBzRXhwYW5kZXIpO1xuICAgICAgYWdncm93LnNldEFjdGl2ZUV4cGFuZGVycyhhY3RpdmUpO1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7Y3Vyc29yOjB9KTtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTAwJScsIGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ3JvdycgfX0+XG4gICAgICAgIDxkaXYgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTAwJScsIGRpc3BsYXk6ICdmbGV4JywgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsIG92ZXJmbG93OiAnaGlkZGVuJywgfX0+XG4gICAgICAgICAgPFRhYmxlSGVhZGVyIGFnZ3Jvdz17dGhpcy5zdGF0ZS5hZ2dyb3d9IGRyb3BBY3Rpb249eyhzLCBkKSA9PiB0aGlzLmRyb3BBY3Rpb24ocywgZCl9IC8+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICAgICAgZmxleEdyb3c6ICcxJyxcbiAgICAgICAgICAgICAgb3ZlcmZsb3c6ICdzY3JvbGwnXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgb25TY3JvbGw9eyAoZSkgPT4gdGhpcy5zY3JvbGwoZSkgfVxuICAgICAgICAgICAgcmVmPXsoZGl2KSA9PiB7IHRoaXMuX3Njcm9sbERpdiA9IGRpdjsgfSB9PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT17eyBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9fT5cbiAgICAgICAgICAgICAgeyB0aGlzLnJlbmRlclZpcnR1YWxpemVkUm93cygpIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPFRhYmxlQ29uZmlndXJhdGlvbiBhZ2dyb3c9e3RoaXMuc3RhdGUuYWdncm93fSAvPlxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlclZpcnR1YWxpemVkUm93cygpIHtcbiAgICBjb25zdCBhZ2dyb3cgPSB0aGlzLnN0YXRlLmFnZ3JvdztcbiAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMuc3RhdGUudmlld3BvcnQ7XG4gICAgY29uc3Qgcm93cyA9IGFnZ3Jvdy5nZXRSb3dzKHZpZXdwb3J0LnRvcCwgdmlld3BvcnQuaGVpZ2h0KTtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgaGVpZ2h0OiAocm93SGVpZ2h0ICogKGFnZ3Jvdy5nZXRIZWlnaHQoKSArIDIwKSkudG9TdHJpbmcoKSArICdweCdcbiAgICAgIH19PlxuICAgICAgICB7IHJvd3MubWFwKGNoaWxkID0+IHRoaXMucmVuZGVyUm93KGNoaWxkKSkgfVxuICAgICAgPC9kaXY+XG4gICAgKTtcbiAgfVxuXG4gIHJlbmRlclJvdyhyb3cpIHtcbiAgICBpZiAocm93ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgbGV0IGJnID0gJ2xpZ2h0R3JheSc7XG4gICAgY29uc3QgYWdncm93ID0gdGhpcy5zdGF0ZS5hZ2dyb3c7XG4gICAgY29uc3QgY29sdW1ucyA9IFtdO1xuICAgIGxldCByb3dUZXh0ID0gJyc7XG4gICAgY29uc3QgaW5kZW50ID0gNCArIGFnZ3Jvdy5nZXRSb3dJbmRlbnQocm93KSAqIHRyZWVJbmRlbnQ7XG4gICAgY29uc3QgYWdncmVnYXRlcyA9IGFnZ3Jvdy5nZXRBY3RpdmVBZ2dyZWdhdG9ycygpO1xuICAgIGlmIChyb3cucGFyZW50ICE9PSBudWxsICYmIChyb3cucGFyZW50LmV4cGFuZGVyICUgMiA9PT0gMCkpIHtcbiAgICAgIGJnID0gJ3doaXRlJztcbiAgICB9XG4gICAgaWYgKHJvdy50b3AgPT09IHRoaXMuc3RhdGUuY3Vyc29yKSB7XG4gICAgICBiZyA9ICdsaWdodGJsdWUnO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFnZ3JlZ2F0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBhZ2dyZWdhdGUgPSBhZ2dyb3cuZ2V0Um93QWdncmVnYXRlKHJvdywgaSk7XG4gICAgICBjb2x1bW5zLnB1c2goKFxuICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgd2lkdGg6ICcxNnB4JyxcbiAgICAgICAgICBoZWlnaHQ6ICdpbmhlcml0JyxcbiAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdkYXJrR3JheScsXG4gICAgICAgICAgZmxleFNocmluazogJzAnXG4gICAgICAgIH19PjwvZGl2PlxuICAgICAgKSk7XG4gICAgICBjb2x1bW5zLnB1c2goKFxuICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgd2lkdGg6ICcxMjhweCcsXG4gICAgICAgICAgdGV4dEFsaWduOiAncmlnaHQnLFxuICAgICAgICAgIGZsZXhTaHJpbms6ICcwJ1xuICAgICAgICB9fT5cbiAgICAgICAgICB7YWdncmVnYXRlfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICkpO1xuICAgIH1cbiAgICBjb2x1bW5zLnB1c2goKFxuICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICB3aWR0aDogJzE2cHgnLFxuICAgICAgICBoZWlnaHQ6ICdpbmhlcml0JyxcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnZ29sZCcsXG4gICAgICAgIGZsZXhTaHJpbms6ICcwJ1xuICAgICAgfX0+PC9kaXY+XG4gICAgKSk7XG4gICAgaWYgKGFnZ3Jvdy5jYW5FeHBhbmQocm93KSkge1xuICAgICAgY29sdW1ucy5wdXNoKChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBtYXJnaW5MZWZ0OiBpbmRlbnQudG9TdHJpbmcoKSArICdweCcsXG4gICAgICAgICAgICBmbGV4U2hyaW5rOiAnMCcsXG4gICAgICAgICAgICB3aWR0aDogJzEycHgnLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCBncmF5JyxcbiAgICAgICAgICB9fVxuICAgICAgICAgIG9uQ2xpY2s9eyAoKSA9PiB0aGlzLl9leHBhbmRSb3cocm93KSB9XG4gICAgICAgID4rPC9kaXY+XG4gICAgICApKTtcbiAgICB9IGVsc2UgaWYgKGFnZ3Jvdy5jYW5Db250cmFjdChyb3cpKSB7XG4gICAgICBjb2x1bW5zLnB1c2goKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIG1hcmdpbkxlZnQ6IGluZGVudC50b1N0cmluZygpICsgJ3B4JyxcbiAgICAgICAgICAgIGZsZXhTaHJpbms6ICcwJyxcbiAgICAgICAgICAgIHdpZHRoOiAnMTJweCcsXG4gICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIGdyYXknLFxuICAgICAgICAgIH19XG4gICAgICAgICAgb25DbGljaz17ICgpID0+IHRoaXMuX2NvbnRyYWN0Um93KHJvdykgfVxuICAgICAgICA+LTwvZGl2PlxuICAgICAgKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbHVtbnMucHVzaCgoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgbWFyZ2luTGVmdDogaW5kZW50LnRvU3RyaW5nKCkgKyAncHgnLFxuICAgICAgICAgIH19XG4gICAgICAgID48L2Rpdj5cbiAgICAgICkpO1xuICAgIH1cbiAgICByb3dUZXh0ICs9IGFnZ3Jvdy5nZXRSb3dMYWJlbChyb3cpO1xuICAgIGNvbHVtbnMucHVzaCgoXG4gICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgIGZsZXhTaHJpbms6ICcwJyxcbiAgICAgICAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gICAgICAgIG1hcmdpblJpZ2h0OiAnMjBweCdcbiAgICAgIH19PlxuICAgICAgICB7cm93VGV4dH1cbiAgICAgIDwvZGl2PlxuICAgICkpO1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGtleT17cm93LnRvcH1cbiAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICBoZWlnaHQ6IChyb3dIZWlnaHQgLSAxKS50b1N0cmluZygpICsgJ3B4JyxcbiAgICAgICAgICB0b3A6IChyb3dIZWlnaHQgKiByb3cudG9wKS50b1N0cmluZygpICsgJ3B4JyxcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgZmxleERpcmVjdGlvbjogJ3JvdycsXG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBiZyxcbiAgICAgICAgICBib3JkZXJCb3R0b206ICcxcHggc29saWQgZ3JheScsXG4gICAgICAgIH19XG4gICAgICAgIG9uQ2xpY2s9eyAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y3Vyc29yOiByb3cudG9wfSk7XG4gICAgICAgIH19PlxuICAgICAgICB7Y29sdW1uc31cbiAgICAgIDwvZGl2PlxuICAgICk7XG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLmtleWRvd24gPSB0aGlzLmtleWRvd24uYmluZCh0aGlzKTtcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmtleWRvd24pO1xuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5rZXlkb3duKTtcbiAgfVxufVxuIl19
|
|
// @generated
|