mirror of
https://github.com/lukevella/rallly.git
synced 2025-08-03 08:28:35 +02:00
2 lines
No EOL
71 KiB
JavaScript
2 lines
No EOL
71 KiB
JavaScript
angular.module("rallly",["ui.router","ngResource","ngFx","btford.modal"]).config(["$stateProvider","$urlRouterProvider","$locationProvider",function(e,t,n){n.html5Mode(!0),t.otherwise("/notfound"),e.state("index",{url:"/",templateUrl:"templates/home.html",controller:"HomeCtrl"}).state("newevent",{url:"/new",templateUrl:"templates/newevent.html",controller:"NewEventCtrl"}).state("about",{url:"/about",templateUrl:"templates/about.html",controller:"AboutCtrl"}).state("notfound",{url:"/notfound",templateUrl:"templates/notfound.html"}).state("event",{url:"/:id",templateUrl:"templates/event.html",controller:"EventCtrl"}).state("editevent",{url:"/:id/edit",templateUrl:"templates/editevent.html",controller:"EditEventCtrl"})}]).factory("Event",["$resource",function(e){return e("/api/event/:id",{id:"@_id"},{update:{method:"PUT"}})}]).factory("Participant",["$resource",function(e){return e("/api/event/:id/participant/:pid",{id:"@_id",pid:"@pid"},{update:{method:"PUT"}})}]).factory("Title",function(){return{set:function(e){document.title=e}}}),angular.module("rallly").run(["$templateCache",function(e){e.put("templates/about.html",'<div style="max-width:600px">\n <h1>What is Rallly?</h1>\n <div class="rl-page-desc">Rallly is a collaborative scheduling service that makes deciding on a date fast and easy.</div>\n <h2>Hi, I\'m Luke!</h2>\n <p>\n I created Rallly as side project to help me learn some new technologies. I decided to publish it because I thought other people might find it useful. Rallly is a completely free service. In fact it is even open source. You can look at the latest source code on Github.\n </p>\n</div>\n'),e.put("templates/confirmmodal.html",'<div class="rl-modal-overlay" ng-click="modal.cancel()"></div>\n\n<div class="rl-modal">\n <div class="rl-modal-title">{{modal.title}}</div>\n <div class="rl-modal-message">\n {{modal.message}}\n </div>\n <div class="rl-modal-actions">\n <button ng-click="modal.confirm()" ng-show="modal.confirm" class="btn" ng-class="{danger : modal.isDestructive}">{{modal.confirmText}}</button>\n <button ng-click="modal.cancel()" class="btn">{{modal.cancelText}}</button>\n </div>\n</div>\n'),e.put("templates/editevent.html",'<div ng-show="event._id">\n <div class="box">\n\n <div class="box-title">Edit Event</div>\n <div class="box-description">\n You can makes changes to your existing event by changing the fields in the form below.\n </div>\n\n <form novalidate name="form" ng-submit="submit()">\n\n <section class="box-section" user-form form="form" event="event">\n\n </section>\n\n <section class="box-section" event-form form="form" event="event">\n\n </section>\n <section class="box-section" date-form form="form" event="event">\n\n </section>\n <div class="box-controls box-bottom-sticky">\n <button type="submit" ng-show="didChange()" class="btn btn-primary" ng-class="{disabled : !didChange()}">\n Save Changes\n </button>\n <button ng-click="undoChanges()" class="btn" ng-show="didChange()">Undo Changes</button>\n <a href="/{{event._id}}" class="btn" ng-hide="didChange()">Done</a>\n </div>\n\n </form>\n\n </div>\n\n</div>\n'),e.put("templates/event.html",'<div ng-show="event._id">\n <div class="box ">\n <div class="event-header">\n <div class="avatar">\n <img src="/images/eventicon.png" width="32 " />\n </div>\n <div class="details">\n <div class="title">\n {{event.title}}\n </div>\n <div class="subtitle">\n Created by <a href="mailto:{{event.creator.email}}">{{event.creator.name}}</a> • {{event.created | elapsed}}\n </div>\n </div>\n <div class="actions">\n <button class="btn" ng-click="editEvent()">Edit Event</button>\n </div>\n </div>\n <div class="box-side-sticky event-description" ng-show="event.description">{{event.description}}</div>\n <div class="box-bottom-sticky event-location" ng-show="event.location">\n <img src="/images/location.png" width="18" /><a href="http://google.com/maps?q={{event.location}}" target="_blank">{{event.location}}</a>\n </div>\n\n </div>\n <div class="box box-x-scroll">\n <div poll event="event" class="poll" participant="participant">\n </div>\n </div>\n</div>\n'),e.put("templates/home.html",'<div class="page-placeholder">\n <div class="image">\n <img src="/images/mark_large.png" width="67" />\n </div>\n <div class="title">\n Schedule an Event\n </div>\n <div class="content">\n Want to host an event but can’t decide on a date? Click on the button below to start!\n </div>\n <button ng-click="newEvent()" class="btn">Schedule New Event</button>\n</div>\n'),e.put("templates/newevent.html",'<div ng-hide="eventUrl">\n <div class="box" ng-class="{\'animated shake\': form.$submitted && form.$invalid }">\n\n <div class="box-title">Schedule a New Event</div>\n <div class="box-description">\n Fill in the form below to create your event and share it with your friends and colleagues.\n </div>\n\n <form novalidate name="form" ng-submit="submit()">\n <section class="box-section" user-form form="form" event="event">\n\n </section>\n\n <section class="box-section" event-form form="form" event="event">\n\n </section>\n\n <section class="box-section" date-form form="form" event="event">\n\n </section>\n\n <section class="box-section" participants-form form="form" event="event">\n\n </section>\n\n <div class="box-controls box-bottom-sticky">\n <button type="submit" class="btn btn-primary">Create Event</button>\n </div>\n\n </form>\n </div>\n</div>\n<div ng-show="eventUrl" class="box fx-fade-up">\n <div class="box-message">\n <div class="main-image">\n <img src="/images/success_large.png" width="100" />\n </div>\n <div class="title">Event Created</div>\n <div class="content">\n Your event has been created successfully! Make sure you visit the page yourself and fill in the poll.\n </div>\n <div class="mini-divider">\n </div>\n <div class="form-group">\n <input type="text" class="form-control" disabled="true" value="{{eventUrl}}" />\n <a href="{{eventUrl}}" class="btn form-btn">GO</a>\n </div>\n </div>\n</div>\n'),e.put("templates/notfound.html","<h1>Error 404</h1>\n<h2>Not Found</h2>\n"),e.put("templates/directives/poll.html",'<div class="poll-header">\n <div class="header participants-header">\n {{event.participants.length}} participants\n </div>\n <div class="header date-header" ng-repeat="date in event.dates">\n <div class="daticon">\n <div class="dow">\n {{date | date: \'EEE\'}}\n </div>\n <div class="day">\n {{date | date: \'d\'}}\n </div>\n <div class="month">\n {{date | date : \'MMM\'}}\n </div>\n <span class="count" ng-show="selectedDate($index)" ng-class={top:isTopDate($index)}>{{selectedDate($index)}}</span>\n </div>\n </div>\n <div class="header actions-header">\n\n </div>\n</div>\n<div class="poll-body">\n <div class="poll-entry" ng-repeat="participant in event.participants">\n <form novalidate ng-submit="update(participant); editMode = false">\n <div class="cell name-cell">\n <span class="avatar style-{{$index + 1}}">\n <img src="/images/user.png" width="11" />\n </span>\n <input required autocomplete="off" type="text" class="form-control" ng-model="participant.name" ng-show="editMode" value="participant.name"/>\n <span ng-hide="editMode" class="name" ng-click="editMode = true; edit(participant)">{{participant.name}}</span>\n </div>\n <div class="cell vote-cell" ng-repeat="date in event.dates">\n <img src="/images/tick@2x.png" width="16" ng-hide="editMode" ng-if="participant.dates[$index]" />\n <img src="/images/nope@2x.png" width="8" ng-hide="editMode" ng-if="!participant.dates[$index]" />\n <input ng-model="participant.dates[$index]" ng-show="editMode" ng-false-value="false" type="checkbox" />\n <div class="overlay" ng-show="editMode" ng-click="participant.dates[$index] = !participant.dates[$index]"></div>\n </div>\n <div class="cell action-cell">\n <a href="#" ng-hide="editMode" ng-click="editMode = true; edit(participant)" class="btn hover">Edit</a>\n <a href="#" ng-hide="editMode" ng-click="delete(participant)" class="btn danger hover">Delete</a>\n <button ng-show="editMode" type="submit" class="btn">Save</button>\n <a href="#" ng-show="editMode" ng-click="editMode = false; cancel($index)" class="btn">Cancel</a>\n </div>\n </form>\n </div>\n <div class="poll-entry highlight">\n <form novalidate name="formnew" ng-submit="save(participant)">\n <div class="cell name-cell">\n <span class="avatar style-{{participant.style}}">\n <img src="/images/user.png" width="11" />\n </span>\n <input autocomplete="off" name="username" type="text" class="form-control" placeholder="Your name..." ng-model="participant.name" required value="participant.name"/>\n </div>\n <div class="cell vote-cell" ng-repeat="date in event.dates">\n <input ng-model="participant.dates[$index]" ng-false-value="false" type="checkbox" />\n <div class="overlay" ng-click="participant.dates[$index] = !participant.dates[$index]"></div>\n </div>\n <div class="cell action-cell">\n <button type="submit" ng-class="{ \'animated shake\' : formnew.$submitted && formnew.$invalid }" class="btn">Save</button>\n </div>\n </form>\n </div>\n</div>\n'),e.put("templates/directives/eventForm/dateForm.html",'<div class="section-details">\n <div class="section-title">Choose Dates</div>\n <ul class="daticon-list">\n <li ng-repeat="date in event.dates">\n <div class="daticon">\n <div class="dow">\n {{date | date: \'EEE\'}}\n </div>\n <div class="day">\n {{date | date: \'d\'}}\n </div>\n <div class="month">\n {{date | date : \'MMM\'}}\n </div>\n <span class="delete" ng-click="datepicker.unsetDate(date)"></span>\n </div>\n </li>\n </ul>\n</div>\n<div class="section-main">\n <div class="form-row">\n <div class="form-group">\n <label for="email">Calendar</label>\n <span class="form-error" ng-show="(form.datepicker.$dirty || form.$submitted) && form.datepicker.$error.required">\n <img src="/images/error.png" width="14" /> You need to select a few dates\n </span>\n <div datepicker required name="datepicker" control="datepicker" ng-model="event.dates">\n\n </div>\n </div>\n </div>\n</div>\n'),e.put("templates/directives/eventForm/eventForm.html",'<div class="section-details">\n <div class="section-title">Event Details</div>\n</div>\n<div class="section-main">\n <div class="form-row">\n <div class="form-col">\n <div class="form-group">\n <label for="title">Title</label>\n <span class="form-error" ng-show="(form.title.$touched || form.$submitted) && errors.title">\n <img src="/images/error.png" width="14" /> {{errors.title}}\n </span>\n <input id="title" name="title" ng-maxlength="30" required ng-model="event.title" type="text" placeholder="Monthly Meetup..." class="form-control extend"/>\n </div>\n </div>\n <div class="form-col">\n <div class="form-group optional">\n <label for="location">Location</label>\n <span class="form-error" ng-show="(form.location.$touched || form.$submitted) && errors.location">\n <img src="/images/error.png" width="14" /> {{errors.location}}\n </span>\n <input id="location" name="location" ng-model="event.location" ng-maxlength="50" type="text" placeholder="Rick\'s Cafe..." class="form-control extend"/>\n </div>\n </div>\n </div>\n <div class="form-row">\n <div class="form-group optional">\n <label for="description" >Description</label>\n <textarea id="description" name="description" ng-model="event.description" placeholder="Enter Description..." class="form-control extend"></textarea>\n </div>\n </div>\n</div>\n'),e.put("templates/directives/eventForm/participantsForm.html",'<div class="section-details">\n <div class="section-title">Invite Participants</div>\n</div>\n<div class="section-main">\n <div class="form-row">\n <div class="form-group optional">\n <label for="emails">Participant\'s Emails</label>\n <textarea id="emails" ng-list ng-model="event.emails" placeholder="Enter Emails..." class="form-control extend"></textarea>\n </div>\n </div>\n</div>\n</section>\n'),e.put("templates/directives/eventForm/userForm.html",'<div class="section-details">\n <div class="section-title">Your Details</div>\n</div>\n<div class="section-main">\n <div class="form-row">\n <div class="form-col">\n <div class="form-group">\n <label for="name">Name</label>\n <span class="form-error" ng-show="(form.name.$touched || form.$submitted) && errors.name">\n <img src="/images/error.png" width="14" /> {{errors.name}}\n </span>\n <input id="name" name="name" ng-maxlength="30" required ng-model="event.creator.name" type="text" placeholder="John Doe..." class="form-control extend"/>\n </div>\n </div>\n <div class="form-col">\n <div class="form-group">\n <label for="email">Email</label>\n <span class="form-error" ng-show="(form.email.$touched || form.$submitted) && errors.email">\n <img src="/images/error.png" width="14" /> {{errors.email}}\n </span>\n <input type="email" id="email" name="email" ng-pattern="emailRegex" required ng-model="event.creator.email" placeholder="john.doe@email.com..." class="form-control extend"/>\n </div>\n </div>\n </div>\n</div>\n')}]),angular.module("rallly").controller("AboutCtrl",["Title",function(e){e.set("About Rallly")}]),angular.module("rallly").controller("EditEventCtrl",["$scope","$http","$state","$timeout","Event","ConfirmModal","Title",function(e,t,n,i,a,o,l){var r=n.params.id;e.event=a.get({id:r},function(){l.set("Edit: "+e.event.title),e.master=angular.copy(e.event)},function(){n.go("notfound")}),e.undoChanges=function(){e.event=angular.copy(e.master),resetDates()},e.didChange=function(){return JSON.stringify(e.master)!=JSON.stringify(e.event)},e.didChangeDates=function(){return JSON.stringify(e.master.dates)!=JSON.stringify(e.event.dates)},e.submit=function(){if(e.form.$valid)if(e.didChangeDates()){new o({title:"Hold up!",message:"Changing the dates will reset all entries by the participants. Are you sure you want to do that?",confirmText:"Yes, I'm sure",isDestructive:!0,confirm:function(){e.event.participants=[],s()}})}else s();else{new o({title:"Not so fast!",message:"Make sure you fill in all the required fields and try again.",cancelText:"OK"})}};var s=function(){a.update({id:r},e.event,function(){new o({title:"Event Updated",message:"Your changes have been saved successfully!",confirmText:"Back to Event Page",cancelText:"Stay here",confirm:function(){n.go("event",{id:e.event._id})}});e.master=angular.copy(e.event),e.didSave=i(function(){e.didSave=!1},2e3)})}}]),angular.module("rallly").controller("EventCtrl",["$scope","$http","$state","Title","Event",function(e,t,n,i,a){var o=n.params.id;e.participant={},e.event=a.get({id:o},function(){i.set(e.event.title),e.eventUrl=n.href("event",{id:e.event._id},{absolute:!0})},function(){n.go("notfound")}),e.editEvent=function(){n.go("editevent",{id:e.event._id})}}]).directive("poll",["Event","Participant","ConfirmModal",function(e,t,n){return{restrict:"A",templateUrl:"templates/directives/poll.html",scope:{event:"=",participant:"="},link:function(e){e.defaults=[];var i=[];e.delete=function(i){var a=new n({title:"Delete "+i.name+"?",message:"Are you sure you want to remove "+i.name+" from the poll?",confirmText:"Yes - delete",cancelText:"No - nevermind",isDestructive:!0,confirm:function(){t.remove({id:e.event._id,pid:i._id},function(t){e.event=t})}});a.show()},e.isTopDate=function(e){for(var t=i[e],n=0;n<i.length;n++)if(i[n]>t)return!1;return!0},e.selectedDate=function(t){i[t]=0;for(var n=0;n<e.event.participants.length;n++)e.event.participants[n].dates[t]&&i[t]++;return i[t]},e.update=function(n){t.update({id:e.event._id,pid:n._id},n)},e.edit=function(t){e.defaults[e.event.participants.indexOf(t)]=angular.copy(t)},e.cancel=function(t){e.event.participants[t]=e.defaults[t]},e.save=function(n){if(e.formnew.$valid){var n=new t(n);n.$save({id:e.event._id},function(t){e.event=t,e.participant={}}),e.formnew.$setPristine()}}}}}]),angular.module("rallly").controller("HomeCtrl",["$scope","$state","Title",function(e,t,n){n.set("Rallly - Collaborative Scheduling"),e.newEvent=function(){t.go("newevent")}}]),angular.module("rallly").controller("NavigationCtrl",["$scope","$location",function(e,t){e.isActive=function(e){return t.path()==e?!0:!1}}]),angular.module("rallly").controller("NewEventCtrl",["$scope","$http","$state","Event","ConfirmModal",function(e,t,n,i,a){e.title="Schedule a New Event",e.description="Fill in the form below to create your event and share it with your friends and colleagues.";var o=function(e,t){new a({title:e||"Not so fast!",message:t||"Make sure you fill in all the required fields and try again.",cancelText:"OK"})};e.submit=function(){e.form.$valid?t.post("/api/event",e.event).success(function(t){e.event=t,e.eventUrl=n.href("event",{id:e.event._id},{absolute:!0})}).error(function(){o("Uh oh!","There was an error creating your event. Please try again later.")}):o()},e.clearDates=null}]),angular.module("rallly").directive("backImg",function(){return function(e,t,n){var i=n.backImg;t.css({"background-image":"url(/images/"+i+".png)"})}}),angular.module("rallly").directive("datepicker",function(){return{restrict:"A",require:"ngModel",scope:{model:"=ngModel",control:"="},link:function(e,t,n,i){e.model=e.model||[],angular.element(t).datepicker({multidate:!0,todayHighlight:!0}).on("changeDate",function(e){var t=e.dates;t.sort(function(e,t){return e.getTime()>t.getTime()?!0:!1}),i.$setViewValue(t,e)});var a=function(e,n){if(e&&n&&e.length!=n.length){for(var i=[],a=0;a<e.length;a++)i.push(new Date(e[a]));angular.element(t).datepicker("setDates",i)}};e.$watchCollection("model",a),e.control=e.control||{},e.control.unsetDate=function(t){var n=e.model.indexOf(t);e.model.splice(n,1)},i.$validators.required=function(e){return e&&0!=e.length?!0:!1}}}}),angular.module("rallly").service("FormHelper",function(){this.prettyError=function(e,t){return e.required?t+" is required":e.pattern?t+" is invalid":e.maxlength?t+" is too long":!1}}).directive("userForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/directives/eventForm/userForm.html",link:function(t){t.errors={},t.emailRegex=/^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/,t.$watchCollection("form.name.$error",function(n){t.errors.name=e.prettyError(n,"Name")}),t.$watchCollection("form.email.$error",function(n){t.errors.email=e.prettyError(n,"Email")})}}}]).directive("eventForm",["FormHelper",function(e){return{scope:{event:"=",form:"="},templateUrl:"templates/directives/eventForm/eventForm.html",link:function(t){t.errors={},t.$watchCollection("form.title.$error",function(n){t.errors.title=e.prettyError(n,"Title")}),t.$watchCollection("form.location.$error",function(n){t.errors.location=e.prettyError(n,"Location")})}}}]).directive("dateForm",function(){return{scope:{event:"=",form:"="},templateUrl:"templates/directives/eventForm/dateForm.html"}}).directive("participantsForm",function(){return{scope:{event:"=",form:"="},templateUrl:"templates/directives/eventForm/participantsForm.html"}}),angular.module("rallly").filter("elapsed",["$filter",function(e){return function(t){if(t){var n=Date.parse(t),i=(new Date).getTime(),a=i-n,o=Math.floor(a/1e3),l=Math.floor(o/60),r=Math.floor(l/60),s=Math.floor(r/24);return s>30?"on "+e("date")(t,"MMMM d"):s>1?s+" days ago":1==s?"1 day ago":r>1?r+" hours ago":1==r?"an hour ago":l>1?l+" minutes ago":1==l?"a minute ago":"a few seconds ago"}}}]),angular.module("rallly").factory("ConfirmModal",["btfModal",function(e){return function(t){var n;n=e({templateUrl:"templates/confirmmodal.html",controllerAs:"modal",controller:function(){this.title=t.title,this.message=t.message,this.confirm=t.confirm?function(){t.confirm(),n.deactivate()}:!1,this.cancel=n.deactivate,this.confirmText=t.confirmText||"Confirm",this.cancelText=t.cancelText||"Cancel",this.isDestructive=t.isDestructive}}),n.activate(),this.destroy=function(){n.deactivate()}}}]);
|
||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1haW4uanMiLCJ0ZW1wbGF0ZXMuanMiLCJjb250cm9sbGVycy9hYm91dC5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvZWRpdGV2ZW50LmNvbnRyb2xsZXIuanMiLCJjb250cm9sbGVycy9ldmVudC5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvaG9tZS5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvbmF2aWdhdGlvbi5jb250cm9sbGVyLmpzIiwiY29udHJvbGxlcnMvbmV3ZXZlbnQuY29udHJvbGxlci5qcyIsImRpcmVjdGl2ZXMvYmFja0ltZy5kaXJlY3RpdmUuanMiLCJkaXJlY3RpdmVzL2RhdGVwaWNrZXIuZGlyZWN0aXZlLmpzIiwiZGlyZWN0aXZlcy9mb3JtLmRpcmVjdGl2ZS5qcyIsImZpbHRlcnMvZWxhcHNlZC5maWx0ZXIuanMiLCJzZXJ2aWNlcy9tb2RhbC5zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFFBQUEsT0FBQSxVQUFBLFlBQUEsYUFBQSxPQUFBLGlCQUNBLFFBQUEsaUJBQUEscUJBQUEsb0JBQUEsU0FBQSxFQUFBLEVBQUEsR0FDQSxFQUFBLFdBQUEsR0FDQSxFQUFBLFVBQUEsYUFDQSxFQUNBLE1BQUEsU0FDQSxJQUFBLElBQ0EsWUFBQSxzQkFDQSxXQUFBLGFBRUEsTUFBQSxZQUNBLElBQUEsT0FDQSxZQUFBLDBCQUNBLFdBQUEsaUJBRUEsTUFBQSxTQUNBLElBQUEsU0FDQSxZQUFBLHVCQUNBLFdBQUEsY0FFQSxNQUFBLFlBQ0EsSUFBQSxZQUNBLFlBQUEsNEJBRUEsTUFBQSxTQUNBLElBQUEsT0FDQSxZQUFBLHVCQUNBLFdBQUEsY0FFQSxNQUFBLGFBQ0EsSUFBQSxZQUNBLFlBQUEsMkJBQ0EsV0FBQSxxQkFHQSxRQUFBLFNBQUEsWUFBQSxTQUFBLEdBQ0EsTUFBQSxHQUFBLGtCQUFBLEdBQUEsU0FDQSxRQUFBLE9BQUEsWUFHQSxRQUFBLGVBQUEsWUFBQSxTQUFBLEdBQ0EsTUFBQSxHQUFBLG1DQUFBLEdBQUEsT0FBQSxJQUFBLFNBQ0EsUUFBQSxPQUFBLFlBR0EsUUFBQSxRQUFBLFdBQ0EsT0FDQSxJQUFBLFNBQUEsR0FDQSxTQUFBLE1BQUEsTUNoREEsUUFBQSxPQUFBLFVBQUEsS0FBQSxpQkFBQSxTQUFBLEdBQUEsRUFBQSxJQUFBLHVCQUFBLDhnQkFDQSxFQUFBLElBQUEsOEJBQUEsdWdCQUNBLEVBQUEsSUFBQSwyQkFBQSxrbkNBQ0EsRUFBQSxJQUFBLHVCQUFBLGl0Q0FDQSxFQUFBLElBQUEsc0JBQUEsMlpBQ0EsRUFBQSxJQUFBLDBCQUFBLGlxREFDQSxFQUFBLElBQUEsMEJBQUEsNENBQ0EsRUFBQSxJQUFBLGlDQUFBLGtnSEFDQSxFQUFBLElBQUEsK0NBQUEsc3FDQUNBLEVBQUEsSUFBQSxnREFBQSxra0RBQ0EsRUFBQSxJQUFBLHVEQUFBLGdjQUNBLEVBQUEsSUFBQSwrQ0FBQSwwdkNDWEEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxhQUFBLFFBQUEsU0FBQSxHQUNBLEVBQUEsSUFBQSxtQkNGQSxRQUFBLE9BQUEsVUFDQSxXQUFBLGlCQUFBLFNBQUEsUUFBQSxTQUFBLFdBQUEsUUFBQSxlQUFBLFFBQUEsU0FBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxHQUNBLEdBQUEsR0FBQSxFQUFBLE9BQUEsRUFDQSxHQUFBLE1BQUEsRUFBQSxLQUFBLEdBQUEsR0FBQSxXQUNBLEVBQUEsSUFBQSxTQUFBLEVBQUEsTUFBQSxPQUNBLEVBQUEsT0FBQSxRQUFBLEtBQUEsRUFBQSxRQUNBLFdBQ0EsRUFBQSxHQUFBLGNBRUEsRUFBQSxZQUFBLFdBQ0EsRUFBQSxNQUFBLFFBQUEsS0FBQSxFQUFBLFFBQ0EsY0FFQSxFQUFBLFVBQUEsV0FDQSxNQUFBLE1BQUEsVUFBQSxFQUFBLFNBQUEsS0FBQSxVQUFBLEVBQUEsUUFFQSxFQUFBLGVBQUEsV0FDQSxNQUFBLE1BQUEsVUFBQSxFQUFBLE9BQUEsUUFBQSxLQUFBLFVBQUEsRUFBQSxNQUFBLFFBRUEsRUFBQSxPQUFBLFdBQ0EsR0FBQSxFQUFBLEtBQUEsT0FDQSxHQUFBLEVBQUEsaUJBQ0EsQ0FBQSxHQUFBLElBQ0EsTUFBQSxXQUNBLFFBQUEsbUdBQ0EsWUFBQSxnQkFDQSxlQUFBLEVBQ0EsUUFBQSxXQUNBLEVBQUEsTUFBQSxnQkFDQSxXQUtBLFNBR0EsQ0FBQSxHQUFBLElBQ0EsTUFBQSxlQUNBLFFBQUEsK0RBQ0EsV0FBQSxRQUlBLElBQUEsR0FBQSxXQUNBLEVBQUEsUUFDQSxHQUFBLEdBQ0EsRUFBQSxNQUNBLFdBQ0EsR0FBQSxJQUNBLE1BQUEsZ0JBQ0EsUUFBQSw2Q0FDQSxZQUFBLHFCQUNBLFdBQUEsWUFDQSxRQUFBLFdBQ0EsRUFBQSxHQUFBLFNBQUEsR0FBQSxFQUFBLE1BQUEsUUFHQSxHQUFBLE9BQUEsUUFBQSxLQUFBLEVBQUEsT0FDQSxFQUFBLFFBQUEsRUFBQSxXQUNBLEVBQUEsU0FBQSxHQUNBLFdDN0RBLFFBQUEsT0FBQSxVQUNBLFdBQUEsYUFBQSxTQUFBLFFBQUEsU0FBQSxRQUFBLFFBQUEsU0FBQSxFQUFBLEVBQUEsRUFBQSxFQUFBLEdBQ0EsR0FBQSxHQUFBLEVBQUEsT0FBQSxFQUNBLEdBQUEsZUFDQSxFQUFBLE1BQUEsRUFBQSxLQUFBLEdBQUEsR0FBQSxXQUNBLEVBQUEsSUFBQSxFQUFBLE1BQUEsT0FDQSxFQUFBLFNBQUEsRUFBQSxLQUFBLFNBQ0EsR0FBQSxFQUFBLE1BQUEsTUFFQSxVQUFBLEtBRUEsV0FDQSxFQUFBLEdBQUEsY0FHQSxFQUFBLFVBQUEsV0FDQSxFQUFBLEdBQUEsYUFBQSxHQUFBLEVBQUEsTUFBQSxVQUlBLFVBQUEsUUFBQSxRQUFBLGNBQUEsZUFBQSxTQUFBLEVBQUEsRUFBQSxHQUNBLE9BQ0EsU0FBQSxJQUNBLFlBQUEsaUNBQ0EsT0FDQSxNQUFBLElBQ0EsWUFBQSxLQUVBLEtBQUEsU0FBQSxHQUNBLEVBQUEsV0FDQSxJQUFBLEtBQ0EsR0FBQSxPQUFBLFNBQUEsR0FDQSxHQUFBLEdBQUEsR0FBQSxJQUNBLE1BQUEsVUFBQSxFQUFBLEtBQUEsSUFDQSxRQUFBLG1DQUFBLEVBQUEsS0FBQSxrQkFDQSxZQUFBLGVBQ0EsV0FBQSxpQkFDQSxlQUFBLEVBQ0EsUUFBQSxXQUNBLEVBQUEsUUFBQSxHQUFBLEVBQUEsTUFBQSxJQUFBLElBQUEsRUFBQSxLQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsTUFJQSxHQUFBLFFBRUEsRUFBQSxVQUFBLFNBQUEsR0FFQSxJQUFBLEdBREEsR0FBQSxFQUFBLEdBQ0EsRUFBQSxFQUFBLEVBQUEsRUFBQSxPQUFBLElBQ0EsR0FBQSxFQUFBLEdBQUEsRUFBQSxPQUFBLENBRUEsUUFBQSxHQUVBLEVBQUEsYUFBQSxTQUFBLEdBQ0EsRUFBQSxHQUFBLENBQ0EsS0FBQSxHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsTUFBQSxhQUFBLE9BQUEsSUFDQSxFQUFBLE1BQUEsYUFBQSxHQUFBLE1BQUEsSUFBQSxFQUFBLElBRUEsT0FBQSxHQUFBLElBRUEsRUFBQSxPQUFBLFNBQUEsR0FDQSxFQUFBLFFBQ0EsR0FBQSxFQUFBLE1BQUEsSUFDQSxJQUFBLEVBQUEsS0FDQSxJQUVBLEVBQUEsS0FBQSxTQUFBLEdBQ0EsRUFBQSxTQUFBLEVBQUEsTUFBQSxhQUFBLFFBQUEsSUFBQSxRQUFBLEtBQUEsSUFFQSxFQUFBLE9BQUEsU0FBQSxHQUNBLEVBQUEsTUFBQSxhQUFBLEdBQUEsRUFBQSxTQUFBLElBRUEsRUFBQSxLQUFBLFNBQUEsR0FDQSxHQUFBLEVBQUEsUUFBQSxPQUFBLENBQ0EsR0FBQSxHQUFBLEdBQUEsR0FBQSxFQUNBLEdBQUEsT0FBQSxHQUFBLEVBQUEsTUFBQSxLQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsRUFDQSxFQUFBLGlCQUVBLEVBQUEsUUFBQSxzQkMvRUEsUUFBQSxPQUFBLFVBQ0EsV0FBQSxZQUFBLFNBQUEsU0FBQSxRQUFBLFNBQUEsRUFBQSxFQUFBLEdBQ0EsRUFBQSxJQUFBLHFDQUVBLEVBQUEsU0FBQSxXQUNBLEVBQUEsR0FBQSxnQkNMQSxRQUFBLE9BQUEsVUFDQSxXQUFBLGtCQUFBLFNBQUEsWUFBQSxTQUFBLEVBQUEsR0FDQSxFQUFBLFNBQUEsU0FBQSxHQUNBLE1BQUEsR0FBQSxRQUFBLEdBQ0EsR0FFQSxNQ05BLFFBQUEsT0FBQSxVQUNBLFdBQUEsZ0JBQUEsU0FBQSxRQUFBLFNBQUEsUUFBQSxlQUFBLFNBQUEsRUFBQSxFQUFBLEVBQUEsRUFBQSxHQUVBLEVBQUEsTUFBQSx1QkFDQSxFQUFBLFlBQUEsNEZBRUEsSUFBQSxHQUFBLFNBQUEsRUFBQSxHQUNBLEdBQUEsSUFDQSxNQUFBLEdBQUEsZUFDQSxRQUFBLEdBQUEsK0RBQ0EsV0FBQSxPQUlBLEdBQUEsT0FBQSxXQUNBLEVBQUEsS0FBQSxPQUNBLEVBQUEsS0FBQSxhQUFBLEVBQUEsT0FDQSxRQUFBLFNBQUEsR0FDQSxFQUFBLE1BQUEsRUFDQSxFQUFBLFNBQUEsRUFBQSxLQUFBLFNBQ0EsR0FBQSxFQUFBLE1BQUEsTUFFQSxVQUFBLE1BR0EsTUFBQSxXQUNBLEVBQUEsU0FBQSxxRUFHQSxLQUlBLEVBQUEsV0FBQSxRQ2pDQSxRQUFBLE9BQUEsVUFDQSxVQUFBLFVBQUEsV0FDQSxNQUFBLFVBQUEsRUFBQSxFQUFBLEdBQ0EsR0FBQSxHQUFBLEVBQUEsT0FDQSxHQUFBLEtBQ0EsbUJBQUEsZUFBQSxFQUFBLGFDTEEsUUFBQSxPQUFBLFVBQ0EsVUFBQSxhQUFBLFdBQ0EsT0FDQSxTQUFBLElBQ0EsUUFBQSxVQUNBLE9BQ0EsTUFBQSxXQUNBLFFBQUEsS0FFQSxLQUFBLFNBQUEsRUFBQSxFQUFBLEVBQUEsR0FDQSxFQUFBLE1BQUEsRUFBQSxVQUNBLFFBQUEsUUFBQSxHQUFBLFlBQ0EsV0FBQSxFQUNBLGdCQUFBLElBRUEsR0FBQSxhQUFBLFNBQUEsR0FDQSxHQUFBLEdBQUEsRUFBQSxLQUNBLEdBQUEsS0FBQSxTQUFBLEVBQUEsR0FDQSxNQUFBLEdBQUEsVUFBQSxFQUFBLFdBQUEsR0FDQSxJQUVBLEVBQUEsY0FBQSxFQUFBLElBR0EsSUFBQSxHQUFBLFNBQUEsRUFBQSxHQUNBLEdBQUEsR0FBQSxHQUFBLEVBQUEsUUFBQSxFQUFBLE9BQUEsQ0FFQSxJQUFBLEdBREEsTUFDQSxFQUFBLEVBQUEsRUFBQSxFQUFBLE9BQUEsSUFDQSxFQUFBLEtBQUEsR0FBQSxNQUFBLEVBQUEsSUFFQSxTQUFBLFFBQUEsR0FBQSxXQUFBLFdBQUEsSUFFQSxHQUFBLGlCQUFBLFFBQUEsR0FFQSxFQUFBLFFBQUEsRUFBQSxZQUNBLEVBQUEsUUFBQSxVQUFBLFNBQUEsR0FDQSxHQUFBLEdBQUEsRUFBQSxNQUFBLFFBQUEsRUFDQSxHQUFBLE1BQUEsT0FBQSxFQUFBLElBR0EsRUFBQSxZQUFBLFNBQUEsU0FBQSxHQUNBLE1BQUEsSUFBQSxHQUFBLEVBQUEsUUFHQSxHQUZBLE9DMUNBLFFBQUEsT0FBQSxVQUNBLFFBQUEsYUFBQSxXQUNBLEtBQUEsWUFBQSxTQUFBLEVBQUEsR0FDQSxNQUFBLEdBQUEsU0FBQSxFQUFBLGVBQ0EsRUFBQSxRQUFBLEVBQUEsY0FDQSxFQUFBLFVBQUEsRUFBQSxnQkFDQSxLQUdBLFVBQUEsWUFBQSxhQUFBLFNBQUEsR0FDQSxPQUNBLE9BQ0EsTUFBQSxJQUNBLEtBQUEsS0FFQSxZQUFBLCtDQUNBLEtBQUEsU0FBQSxHQUNBLEVBQUEsVUFFQSxFQUFBLFdBQUEsc0NBRUEsRUFBQSxpQkFBQSxtQkFBQSxTQUFBLEdBQ0EsRUFBQSxPQUFBLEtBQUEsRUFBQSxZQUFBLEVBQUEsVUFHQSxFQUFBLGlCQUFBLG9CQUFBLFNBQUEsR0FDQSxFQUFBLE9BQUEsTUFBQSxFQUFBLFlBQUEsRUFBQSxnQkFLQSxVQUFBLGFBQUEsYUFBQSxTQUFBLEdBQ0EsT0FDQSxPQUNBLE1BQUEsSUFDQSxLQUFBLEtBRUEsWUFBQSxnREFDQSxLQUFBLFNBQUEsR0FDQSxFQUFBLFVBRUEsRUFBQSxpQkFBQSxvQkFBQSxTQUFBLEdBQ0EsRUFBQSxPQUFBLE1BQUEsRUFBQSxZQUFBLEVBQUEsV0FHQSxFQUFBLGlCQUFBLHVCQUFBLFNBQUEsR0FDQSxFQUFBLE9BQUEsU0FBQSxFQUFBLFlBQUEsRUFBQSxtQkFNQSxVQUFBLFdBQUEsV0FDQSxPQUNBLE9BQ0EsTUFBQSxJQUNBLEtBQUEsS0FFQSxZQUFBLGtEQUdBLFVBQUEsbUJBQUEsV0FDQSxPQUNBLE9BQ0EsTUFBQSxJQUNBLEtBQUEsS0FFQSxZQUFBLDBEQ25FQSxRQUFBLE9BQUEsVUFDQSxPQUFBLFdBQUEsVUFBQSxTQUFBLEdBQ0EsTUFBQSxVQUFBLEdBQ0EsR0FBQSxFQUFBLENBQ0EsR0FBQSxHQUFBLEtBQUEsTUFBQSxHQUNBLEdBQUEsR0FBQSxPQUFBLFVBQ0EsRUFBQSxFQUFBLEVBQ0EsRUFBQSxLQUFBLE1BQUEsRUFBQSxLQUNBLEVBQUEsS0FBQSxNQUFBLEVBQUEsSUFDQSxFQUFBLEtBQUEsTUFBQSxFQUFBLElBQ0EsRUFBQSxLQUFBLE1BQUEsRUFBQSxHQUNBLE9BQUEsR0FBQSxHQUNBLE1BQUEsRUFBQSxRQUFBLEVBQUEsVUFDQSxFQUFBLEVBQ0EsRUFBQSxZQUNBLEdBQUEsRUFDQSxZQUNBLEVBQUEsRUFDQSxFQUFBLGFBQ0EsR0FBQSxFQUNBLGNBQ0EsRUFBQSxFQUNBLEVBQUEsZUFDQSxHQUFBLEVBQ0EsZUFFQSx5QkMxQkEsUUFBQSxPQUFBLFVBQ0EsUUFBQSxnQkFBQSxXQUFBLFNBQUEsR0FFQSxNQUFBLFVBQUEsR0FDQSxHQUFBLEVBQ0EsR0FBQSxHQUNBLFlBQUEsOEJBQ0EsYUFBQSxRQUNBLFdBQUEsV0FDQSxLQUFBLE1BQUEsRUFBQSxNQUNBLEtBQUEsUUFBQSxFQUFBLFFBQ0EsS0FBQSxRQUFBLEVBQUEsUUFBQSxXQUFBLEVBQUEsVUFBQSxFQUFBLGVBQUEsRUFDQSxLQUFBLE9BQUEsRUFBQSxXQUNBLEtBQUEsWUFBQSxFQUFBLGFBQUEsVUFDQSxLQUFBLFdBQUEsRUFBQSxZQUFBLFNBQ0EsS0FBQSxjQUFBLEVBQUEsaUJBR0EsRUFBQSxXQUVBLEtBQUEsUUFBQSxXQUNBLEVBQUEiLCJmaWxlIjoicHVibGljL2J1aWxkL2FwcC5qcyIsInNvdXJjZXNDb250ZW50IjpbImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknLCBbJ3VpLnJvdXRlcicsJ25nUmVzb3VyY2UnLCduZ0Z4JywnYnRmb3JkLm1vZGFsJ10pXG4gICAgLmNvbmZpZyhmdW5jdGlvbigkc3RhdGVQcm92aWRlciwgJHVybFJvdXRlclByb3ZpZGVyLCAkbG9jYXRpb25Qcm92aWRlcil7XG4gICAgICAgICRsb2NhdGlvblByb3ZpZGVyLmh0bWw1TW9kZSh0cnVlKTtcbiAgICAgICAgJHVybFJvdXRlclByb3ZpZGVyLm90aGVyd2lzZShcIi9ub3Rmb3VuZFwiKVxuICAgICAgICAkc3RhdGVQcm92aWRlclxuICAgICAgICAuc3RhdGUoJ2luZGV4Jyx7XG4gICAgICAgICAgICB1cmwgOiAnLycsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvaG9tZS5odG1sJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiAnSG9tZUN0cmwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnbmV3ZXZlbnQnLHtcbiAgICAgICAgICAgIHVybCA6ICcvbmV3JyxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9uZXdldmVudC5odG1sJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiAnTmV3RXZlbnRDdHJsJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ2Fib3V0Jywge1xuICAgICAgICAgICAgdXJsIDogJy9hYm91dCcsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvYWJvdXQuaHRtbCcsXG4gICAgICAgICAgICBjb250cm9sbGVyIDogJ0Fib3V0Q3RybCdcbiAgICAgICAgfSlcbiAgICAgICAgLnN0YXRlKCdub3Rmb3VuZCcsIHtcbiAgICAgICAgICAgIHVybCA6ICcvbm90Zm91bmQnLFxuICAgICAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL25vdGZvdW5kLmh0bWwnXG4gICAgICAgIH0pXG4gICAgICAgIC5zdGF0ZSgnZXZlbnQnLHtcbiAgICAgICAgICAgIHVybCA6ICcvOmlkJyxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9ldmVudC5odG1sJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiAnRXZlbnRDdHJsJ1xuICAgICAgICB9KVxuICAgICAgICAuc3RhdGUoJ2VkaXRldmVudCcsIHtcbiAgICAgICAgICAgIHVybDogJy86aWQvZWRpdCcsXG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvZWRpdGV2ZW50Lmh0bWwnLFxuICAgICAgICAgICAgY29udHJvbGxlciA6ICdFZGl0RXZlbnRDdHJsJ1xuICAgICAgICB9KVxuICAgIH0pXG4gICAgLmZhY3RvcnkoJ0V2ZW50JywgZnVuY3Rpb24oJHJlc291cmNlKXtcbiAgICAgICAgcmV0dXJuICRyZXNvdXJjZSgnL2FwaS9ldmVudC86aWQnLCB7IGlkIDogJ0BfaWQnIH0sIHtcbiAgICAgICAgICAgICd1cGRhdGUnIDogeyBtZXRob2QgOiAnUFVUJyB9XG4gICAgICAgIH0pO1xuICAgIH0pXG4gICAgLmZhY3RvcnkoJ1BhcnRpY2lwYW50JywgZnVuY3Rpb24oJHJlc291cmNlKXtcbiAgICAgICAgcmV0dXJuICRyZXNvdXJjZSgnL2FwaS9ldmVudC86aWQvcGFydGljaXBhbnQvOnBpZCcsIHsgaWQ6ICdAX2lkJywgcGlkIDogJ0BwaWQnfSwge1xuICAgICAgICAgICAgJ3VwZGF0ZScgOiB7IG1ldGhvZCA6ICdQVVQnIH1cbiAgICAgICAgfSk7XG4gICAgfSlcbiAgICAuZmFjdG9yeSgnVGl0bGUnLCBmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2V0IDogZnVuY3Rpb24odGl0bGUpe1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LnRpdGxlID0gdGl0bGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiIsImFuZ3VsYXIubW9kdWxlKFwicmFsbGx5XCIpLnJ1bihbXCIkdGVtcGxhdGVDYWNoZVwiLCBmdW5jdGlvbigkdGVtcGxhdGVDYWNoZSkgeyR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9hYm91dC5odG1sXCIsXCI8ZGl2IHN0eWxlPVxcXCJtYXgtd2lkdGg6NjAwcHhcXFwiPlxcbiAgICA8aDE+V2hhdCBpcyBSYWxsbHk/PC9oMT5cXG4gICAgPGRpdiBjbGFzcz1cXFwicmwtcGFnZS1kZXNjXFxcIj5SYWxsbHkgaXMgYSBjb2xsYWJvcmF0aXZlIHNjaGVkdWxpbmcgc2VydmljZSB0aGF0IG1ha2VzIGRlY2lkaW5nIG9uIGEgZGF0ZSBmYXN0IGFuZCBlYXN5LjwvZGl2PlxcbiAgICA8aDI+SGksIElcXCdtIEx1a2UhPC9oMj5cXG4gICAgPHA+XFxuICAgICAgICBJIGNyZWF0ZWQgUmFsbGx5IGFzIHNpZGUgcHJvamVjdCB0byBoZWxwIG1lIGxlYXJuIHNvbWUgbmV3IHRlY2hub2xvZ2llcy4gSSBkZWNpZGVkIHRvIHB1Ymxpc2ggaXQgYmVjYXVzZSBJIHRob3VnaHQgb3RoZXIgcGVvcGxlIG1pZ2h0IGZpbmQgaXQgdXNlZnVsLiBSYWxsbHkgaXMgYSBjb21wbGV0ZWx5IGZyZWUgc2VydmljZS4gSW4gZmFjdCBpdCBpcyBldmVuIG9wZW4gc291cmNlLiBZb3UgY2FuIGxvb2sgYXQgdGhlIGxhdGVzdCBzb3VyY2UgY29kZSBvbiBHaXRodWIuXFxuICAgIDwvcD5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvY29uZmlybW1vZGFsLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInJsLW1vZGFsLW92ZXJsYXlcXFwiIG5nLWNsaWNrPVxcXCJtb2RhbC5jYW5jZWwoKVxcXCI+PC9kaXY+XFxuXFxuPGRpdiBjbGFzcz1cXFwicmwtbW9kYWxcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJybC1tb2RhbC10aXRsZVxcXCI+e3ttb2RhbC50aXRsZX19PC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInJsLW1vZGFsLW1lc3NhZ2VcXFwiPlxcbiAgICAgICAge3ttb2RhbC5tZXNzYWdlfX1cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcInJsLW1vZGFsLWFjdGlvbnNcXFwiPlxcbiAgICAgICAgPGJ1dHRvbiBuZy1jbGljaz1cXFwibW9kYWwuY29uZmlybSgpXFxcIiBuZy1zaG93PVxcXCJtb2RhbC5jb25maXJtXFxcIiBjbGFzcz1cXFwiYnRuXFxcIiBuZy1jbGFzcz1cXFwie2RhbmdlciA6IG1vZGFsLmlzRGVzdHJ1Y3RpdmV9XFxcIj57e21vZGFsLmNvbmZpcm1UZXh0fX08L2J1dHRvbj5cXG4gICAgICAgIDxidXR0b24gbmctY2xpY2s9XFxcIm1vZGFsLmNhbmNlbCgpXFxcIiAgY2xhc3M9XFxcImJ0blxcXCI+e3ttb2RhbC5jYW5jZWxUZXh0fX08L2J1dHRvbj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2VkaXRldmVudC5odG1sXCIsXCI8ZGl2IG5nLXNob3c9XFxcImV2ZW50Ll9pZFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImJveFxcXCI+XFxuXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtdGl0bGVcXFwiPkVkaXQgRXZlbnQ8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1kZXNjcmlwdGlvblxcXCI+XFxuICAgICAgICAgICAgWW91IGNhbiBtYWtlcyBjaGFuZ2VzIHRvIHlvdXIgZXhpc3RpbmcgZXZlbnQgYnkgY2hhbmdpbmcgdGhlIGZpZWxkcyBpbiB0aGUgZm9ybSBiZWxvdy5cXG4gICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPGZvcm0gbm92YWxpZGF0ZSBuYW1lPVxcXCJmb3JtXFxcIiBuZy1zdWJtaXQ9XFxcInN1Ym1pdCgpXFxcIj5cXG5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIHVzZXItZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cXG5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIGV2ZW50LWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG4gICAgICAgICAgICA8L3NlY3Rpb24+XFxuICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XFxcImJveC1zZWN0aW9uXFxcIiBkYXRlLWZvcm0gZm9ybT1cXFwiZm9ybVxcXCIgZXZlbnQ9XFxcImV2ZW50XFxcIj5cXG5cXG4gICAgICAgICAgICA8L3NlY3Rpb24+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LWNvbnRyb2xzIGJveC1ib3R0b20tc3RpY2t5XFxcIj5cXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVxcXCJzdWJtaXRcXFwiIG5nLXNob3c9XFxcImRpZENoYW5nZSgpXFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIiBuZy1jbGFzcz1cXFwie2Rpc2FibGVkIDogIWRpZENoYW5nZSgpfVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICBTYXZlIENoYW5nZXNcXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbmctY2xpY2s9XFxcInVuZG9DaGFuZ2VzKClcXFwiIGNsYXNzPVxcXCJidG5cXFwiIG5nLXNob3c9XFxcImRpZENoYW5nZSgpXFxcIj5VbmRvIENoYW5nZXM8L2J1dHRvbj5cXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cXFwiL3t7ZXZlbnQuX2lkfX1cXFwiIGNsYXNzPVxcXCJidG5cXFwiIG5nLWhpZGU9XFxcImRpZENoYW5nZSgpXFxcIj5Eb25lPC9hPlxcbiAgICAgICAgICAgIDwvZGl2PlxcblxcbiAgICAgICAgPC9mb3JtPlxcblxcbiAgICA8L2Rpdj5cXG5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZXZlbnQuaHRtbFwiLFwiPGRpdiBuZy1zaG93PVxcXCJldmVudC5faWRcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJib3ggXFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImV2ZW50LWhlYWRlclxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYXZhdGFyXFxcIj5cXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXZlbnRpY29uLnBuZ1xcXCIgd2lkdGg9XFxcIjMyICBcXFwiIC8+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGV0YWlsc1xcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcInRpdGxlXFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIHt7ZXZlbnQudGl0bGV9fVxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwic3VidGl0bGVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgQ3JlYXRlZCBieSA8YSBocmVmPVxcXCJtYWlsdG86e3tldmVudC5jcmVhdG9yLmVtYWlsfX1cXFwiPnt7ZXZlbnQuY3JlYXRvci5uYW1lfX08L2E+ICZidWxsOyB7e2V2ZW50LmNyZWF0ZWQgfCBlbGFwc2VkfX1cXG4gICAgICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiYWN0aW9uc1xcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XFxcImJ0blxcXCIgbmctY2xpY2s9XFxcImVkaXRFdmVudCgpXFxcIj5FZGl0IEV2ZW50PC9idXR0b24+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1zaWRlLXN0aWNreSBldmVudC1kZXNjcmlwdGlvblxcXCIgbmctc2hvdz1cXFwiZXZlbnQuZGVzY3JpcHRpb25cXFwiPnt7ZXZlbnQuZGVzY3JpcHRpb259fTwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiYm94LWJvdHRvbS1zdGlja3kgZXZlbnQtbG9jYXRpb25cXFwiIG5nLXNob3c9XFxcImV2ZW50LmxvY2F0aW9uXFxcIj5cXG4gICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9sb2NhdGlvbi5wbmdcXFwiIHdpZHRoPVxcXCIxOFxcXCIgLz48YSBocmVmPVxcXCJodHRwOi8vZ29vZ2xlLmNvbS9tYXBzP3E9e3tldmVudC5sb2NhdGlvbn19XFxcIiB0YXJnZXQ9XFxcIl9ibGFua1xcXCI+e3tldmVudC5sb2NhdGlvbn19PC9hPlxcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJib3ggYm94LXgtc2Nyb2xsXFxcIj5cXG4gICAgICAgIDxkaXYgcG9sbCBldmVudD1cXFwiZXZlbnRcXFwiIGNsYXNzPVxcXCJwb2xsXFxcIiBwYXJ0aWNpcGFudD1cXFwicGFydGljaXBhbnRcXFwiPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9ob21lLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInBhZ2UtcGxhY2Vob2xkZXJcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJpbWFnZVxcXCI+XFxuICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9tYXJrX2xhcmdlLnBuZ1xcXCIgd2lkdGg9XFxcIjY3XFxcIiAvPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPlxcbiAgICAgICAgU2NoZWR1bGUgYW4gRXZlbnRcXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImNvbnRlbnRcXFwiPlxcbiAgICAgICAgV2FudCB0byBob3N0IGFuIGV2ZW50IGJ1dCBjYW7igJl0IGRlY2lkZSBvbiBhIGRhdGU/IENsaWNrIG9uIHRoZSBidXR0b24gYmVsb3cgdG8gc3RhcnQhXFxuICAgIDwvZGl2PlxcbiAgICA8YnV0dG9uIG5nLWNsaWNrPVxcXCJuZXdFdmVudCgpXFxcIiBjbGFzcz1cXFwiYnRuXFxcIj5TY2hlZHVsZSBOZXcgRXZlbnQ8L2J1dHRvbj5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvbmV3ZXZlbnQuaHRtbFwiLFwiPGRpdiBuZy1oaWRlPVxcXCJldmVudFVybFxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImJveFxcXCIgbmctY2xhc3M9XFxcIntcXCdhbmltYXRlZCBzaGFrZVxcJzogZm9ybS4kc3VibWl0dGVkICYmIGZvcm0uJGludmFsaWQgfVxcXCI+XFxuXFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtdGl0bGVcXFwiPlNjaGVkdWxlIGEgTmV3IEV2ZW50PC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJib3gtZGVzY3JpcHRpb25cXFwiPlxcbiAgICAgICAgICAgIEZpbGwgaW4gdGhlIGZvcm0gYmVsb3cgdG8gY3JlYXRlIHlvdXIgZXZlbnQgYW5kIHNoYXJlIGl0IHdpdGggeW91ciBmcmllbmRzIGFuZCBjb2xsZWFndWVzLlxcbiAgICAgICAgPC9kaXY+XFxuXFxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlIG5hbWU9XFxcImZvcm1cXFwiIG5nLXN1Ym1pdD1cXFwic3VibWl0KClcXFwiPlxcbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgdXNlci1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuICAgICAgICAgICAgPC9zZWN0aW9uPlxcblxcbiAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVxcXCJib3gtc2VjdGlvblxcXCIgZXZlbnQtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cXG5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIGRhdGUtZm9ybSBmb3JtPVxcXCJmb3JtXFxcIiBldmVudD1cXFwiZXZlbnRcXFwiPlxcblxcbiAgICAgICAgICAgIDwvc2VjdGlvbj5cXG5cXG4gICAgICAgICAgICA8c2VjdGlvbiBjbGFzcz1cXFwiYm94LXNlY3Rpb25cXFwiIHBhcnRpY2lwYW50cy1mb3JtIGZvcm09XFxcImZvcm1cXFwiIGV2ZW50PVxcXCJldmVudFxcXCI+XFxuXFxuICAgICAgICAgICAgPC9zZWN0aW9uPlxcblxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImJveC1jb250cm9scyBib3gtYm90dG9tLXN0aWNreVxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBjbGFzcz1cXFwiYnRuIGJ0bi1wcmltYXJ5XFxcIj5DcmVhdGUgRXZlbnQ8L2J1dHRvbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG5cXG4gICAgICAgIDwvZm9ybT5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuPGRpdiBuZy1zaG93PVxcXCJldmVudFVybFxcXCIgY2xhc3M9XFxcImJveCBmeC1mYWRlLXVwXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiYm94LW1lc3NhZ2VcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1haW4taW1hZ2VcXFwiPlxcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9zdWNjZXNzX2xhcmdlLnBuZ1xcXCIgd2lkdGg9XFxcIjEwMFxcXCIgLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwidGl0bGVcXFwiPkV2ZW50IENyZWF0ZWQ8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiY29udGVudFxcXCI+XFxuICAgICAgICBZb3VyIGV2ZW50IGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ISBNYWtlIHN1cmUgeW91IHZpc2l0IHRoZSBwYWdlIHlvdXJzZWxmIGFuZCBmaWxsIGluIHRoZSBwb2xsLlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwibWluaS1kaXZpZGVyXFxcIj5cXG4gICAgPC9kaXY+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXBcXFwiPlxcbiAgICAgICAgPGlucHV0IHR5cGU9XFxcInRleHRcXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2xcXFwiIGRpc2FibGVkPVxcXCJ0cnVlXFxcIiB2YWx1ZT1cXFwie3tldmVudFVybH19XFxcIiAvPlxcbiAgICAgICAgPGEgaHJlZj1cXFwie3tldmVudFVybH19XFxcIiBjbGFzcz1cXFwiYnRuIGZvcm0tYnRuXFxcIj5HTzwvYT5cXG4gICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9ub3Rmb3VuZC5odG1sXCIsXCI8aDE+RXJyb3IgNDA0PC9oMT5cXG48aDI+Tm90IEZvdW5kPC9oMj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9wb2xsLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInBvbGwtaGVhZGVyXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiaGVhZGVyIHBhcnRpY2lwYW50cy1oZWFkZXJcXFwiPlxcbiAgICAgICAge3tldmVudC5wYXJ0aWNpcGFudHMubGVuZ3RofX0gcGFydGljaXBhbnRzXFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJoZWFkZXIgZGF0ZS1oZWFkZXJcXFwiIG5nLXJlcGVhdD1cXFwiZGF0ZSBpbiBldmVudC5kYXRlc1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkYXRpY29uXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJkb3dcXFwiPlxcbiAgICAgICAgICAgICAgICB7e2RhdGUgfCBkYXRlOiBcXCdFRUVcXCd9fVxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRheVxcXCI+XFxuICAgICAgICAgICAgICAgIHt7ZGF0ZSB8IGRhdGU6IFxcJ2RcXCd9fVxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm1vbnRoXFxcIj5cXG4gICAgICAgICAgICAgICAge3tkYXRlIHwgZGF0ZSA6IFxcJ01NTVxcJ319XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XFxcImNvdW50XFxcIiBuZy1zaG93PVxcXCJzZWxlY3RlZERhdGUoJGluZGV4KVxcXCIgbmctY2xhc3M9e3RvcDppc1RvcERhdGUoJGluZGV4KX0+e3tzZWxlY3RlZERhdGUoJGluZGV4KX19PC9zcGFuPlxcbiAgICAgICAgPC9kaXY+XFxuICAgIDwvZGl2PlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJoZWFkZXIgYWN0aW9ucy1oZWFkZXJcXFwiPlxcblxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPVxcXCJwb2xsLWJvZHlcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJwb2xsLWVudHJ5XFxcIiBuZy1yZXBlYXQ9XFxcInBhcnRpY2lwYW50IGluIGV2ZW50LnBhcnRpY2lwYW50c1xcXCI+XFxuICAgICAgICA8Zm9ybSBub3ZhbGlkYXRlIG5nLXN1Ym1pdD1cXFwidXBkYXRlKHBhcnRpY2lwYW50KTsgZWRpdE1vZGUgPSBmYWxzZVxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCBuYW1lLWNlbGxcXFwiPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiYXZhdGFyIHN0eWxlLXt7JGluZGV4ICsgMX19XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3VzZXIucG5nXFxcIiB3aWR0aD1cXFwiMTFcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPGlucHV0IHJlcXVpcmVkIGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sXFxcIiBuZy1tb2RlbD1cXFwicGFydGljaXBhbnQubmFtZVxcXCIgbmctc2hvdz1cXFwiZWRpdE1vZGVcXFwiIHZhbHVlPVxcXCJwYXJ0aWNpcGFudC5uYW1lXFxcIi8+XFxuICAgICAgICAgICAgICAgIDxzcGFuIG5nLWhpZGU9XFxcImVkaXRNb2RlXFxcIiBjbGFzcz1cXFwibmFtZVxcXCIgbmctY2xpY2s9XFxcImVkaXRNb2RlID0gdHJ1ZTsgZWRpdChwYXJ0aWNpcGFudClcXFwiPnt7cGFydGljaXBhbnQubmFtZX19PC9zcGFuPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImNlbGwgdm90ZS1jZWxsXFxcIiBuZy1yZXBlYXQ9XFxcImRhdGUgaW4gZXZlbnQuZGF0ZXNcXFwiPlxcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy90aWNrQDJ4LnBuZ1xcXCIgIHdpZHRoPVxcXCIxNlxcXCIgbmctaGlkZT1cXFwiZWRpdE1vZGVcXFwiIG5nLWlmPVxcXCJwYXJ0aWNpcGFudC5kYXRlc1skaW5kZXhdXFxcIiAvPlxcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9ub3BlQDJ4LnBuZ1xcXCIgd2lkdGg9XFxcIjhcXFwiIG5nLWhpZGU9XFxcImVkaXRNb2RlXFxcIiBuZy1pZj1cXFwiIXBhcnRpY2lwYW50LmRhdGVzWyRpbmRleF1cXFwiIC8+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD1cXFwicGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XVxcXCIgbmctc2hvdz1cXFwiZWRpdE1vZGVcXFwiIG5nLWZhbHNlLXZhbHVlPVxcXCJmYWxzZVxcXCIgdHlwZT1cXFwiY2hlY2tib3hcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcIm92ZXJsYXlcXFwiIG5nLXNob3c9XFxcImVkaXRNb2RlXFxcIiBuZy1jbGljaz1cXFwicGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XSA9ICFwYXJ0aWNpcGFudC5kYXRlc1skaW5kZXhdXFxcIj48L2Rpdj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjZWxsIGFjdGlvbi1jZWxsXFxcIj5cXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cXFwiI1xcXCIgbmctaGlkZT1cXFwiZWRpdE1vZGVcXFwiIG5nLWNsaWNrPVxcXCJlZGl0TW9kZSA9IHRydWU7IGVkaXQocGFydGljaXBhbnQpXFxcIiBjbGFzcz1cXFwiYnRuIGhvdmVyXFxcIj5FZGl0PC9hPlxcbiAgICAgICAgICAgICAgICA8YSBocmVmPVxcXCIjXFxcIiBuZy1oaWRlPVxcXCJlZGl0TW9kZVxcXCIgbmctY2xpY2s9XFxcImRlbGV0ZShwYXJ0aWNpcGFudClcXFwiIGNsYXNzPVxcXCJidG4gZGFuZ2VyIGhvdmVyXFxcIj5EZWxldGU8L2E+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gbmctc2hvdz1cXFwiZWRpdE1vZGVcXFwiIHR5cGU9XFxcInN1Ym1pdFxcXCIgY2xhc3M9XFxcImJ0blxcXCI+U2F2ZTwvYnV0dG9uPlxcbiAgICAgICAgICAgICAgICA8YSBocmVmPVxcXCIjXFxcIiBuZy1zaG93PVxcXCJlZGl0TW9kZVxcXCIgbmctY2xpY2s9XFxcImVkaXRNb2RlID0gZmFsc2U7IGNhbmNlbCgkaW5kZXgpXFxcIiAgY2xhc3M9XFxcImJ0blxcXCI+Q2FuY2VsPC9hPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9mb3JtPlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwicG9sbC1lbnRyeSBoaWdobGlnaHRcXFwiPlxcbiAgICAgICAgPGZvcm0gbm92YWxpZGF0ZSBuYW1lPVxcXCJmb3JtbmV3XFxcIiBuZy1zdWJtaXQ9XFxcInNhdmUocGFydGljaXBhbnQpXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJjZWxsIG5hbWUtY2VsbFxcXCI+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJhdmF0YXIgc3R5bGUte3twYXJ0aWNpcGFudC5zdHlsZX19XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVxcXCIvaW1hZ2VzL3VzZXIucG5nXFxcIiB3aWR0aD1cXFwiMTFcXFwiIC8+XFxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICAgICAgPGlucHV0IGF1dG9jb21wbGV0ZT1cXFwib2ZmXFxcIiBuYW1lPVxcXCJ1c2VybmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbFxcXCIgcGxhY2Vob2xkZXI9XFxcIllvdXIgbmFtZS4uLlxcXCIgbmctbW9kZWw9XFxcInBhcnRpY2lwYW50Lm5hbWVcXFwiIHJlcXVpcmVkIHZhbHVlPVxcXCJwYXJ0aWNpcGFudC5uYW1lXFxcIi8+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCB2b3RlLWNlbGxcXFwiIG5nLXJlcGVhdD1cXFwiZGF0ZSBpbiBldmVudC5kYXRlc1xcXCI+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBuZy1tb2RlbD1cXFwicGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XVxcXCIgbmctZmFsc2UtdmFsdWU9XFxcImZhbHNlXFxcIiB0eXBlPVxcXCJjaGVja2JveFxcXCIgLz5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwib3ZlcmxheVxcXCIgbmctY2xpY2s9XFxcInBhcnRpY2lwYW50LmRhdGVzWyRpbmRleF0gPSAhcGFydGljaXBhbnQuZGF0ZXNbJGluZGV4XVxcXCI+PC9kaXY+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiY2VsbCBhY3Rpb24tY2VsbFxcXCI+XFxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cXFwic3VibWl0XFxcIiBuZy1jbGFzcz1cXFwieyBcXCdhbmltYXRlZCBzaGFrZVxcJyA6IGZvcm1uZXcuJHN1Ym1pdHRlZCAmJiBmb3JtbmV3LiRpbnZhbGlkICB9XFxcIiBjbGFzcz1cXFwiYnRuXFxcIj5TYXZlPC9idXR0b24+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Zvcm0+XFxuICAgIDwvZGl2PlxcbjwvZGl2PlxcblwiKTtcbiR0ZW1wbGF0ZUNhY2hlLnB1dChcInRlbXBsYXRlcy9kaXJlY3RpdmVzL2V2ZW50Rm9ybS9kYXRlRm9ybS5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLWRldGFpbHNcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5DaG9vc2UgRGF0ZXM8L2Rpdj5cXG4gICAgPHVsIGNsYXNzPVxcXCJkYXRpY29uLWxpc3RcXFwiPlxcbiAgICAgICAgPGxpIG5nLXJlcGVhdD1cXFwiZGF0ZSBpbiBldmVudC5kYXRlc1xcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF0aWNvblxcXCI+XFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImRvd1xcXCI+XFxuICAgICAgICAgICAgICAgICAgICB7e2RhdGUgfCBkYXRlOiBcXCdFRUVcXCd9fVxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZGF5XFxcIj5cXG4gICAgICAgICAgICAgICAgICAgIHt7ZGF0ZSB8IGRhdGU6IFxcJ2RcXCd9fVxcbiAgICAgICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwibW9udGhcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAge3tkYXRlIHwgZGF0ZSA6IFxcJ01NTVxcJ319XFxuICAgICAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZGVsZXRlXFxcIiBuZy1jbGljaz1cXFwiZGF0ZXBpY2tlci51bnNldERhdGUoZGF0ZSlcXFwiPjwvc3Bhbj5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvbGk+XFxuICAgIDwvdWw+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwic2VjdGlvbi1tYWluXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1yb3dcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwiZW1haWxcXFwiPkNhbGVuZGFyPC9sYWJlbD5cXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZm9ybS1lcnJvclxcXCIgbmctc2hvdz1cXFwiKGZvcm0uZGF0ZXBpY2tlci4kZGlydHkgfHwgZm9ybS4kc3VibWl0dGVkKSAmJiBmb3JtLmRhdGVwaWNrZXIuJGVycm9yLnJlcXVpcmVkXFxcIj5cXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXJyb3IucG5nXFxcIiB3aWR0aD1cXFwiMTRcXFwiIC8+IFlvdSBuZWVkIHRvIHNlbGVjdCBhIGZldyBkYXRlc1xcbiAgICAgICAgICAgIDwvc3Bhbj5cXG4gICAgICAgICAgICA8ZGl2IGRhdGVwaWNrZXIgcmVxdWlyZWQgbmFtZT1cXFwiZGF0ZXBpY2tlclxcXCIgY29udHJvbD1cXFwiZGF0ZXBpY2tlclxcXCIgbmctbW9kZWw9XFxcImV2ZW50LmRhdGVzXFxcIj5cXG5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9ldmVudEZvcm0vZXZlbnRGb3JtLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tZGV0YWlsc1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInNlY3Rpb24tdGl0bGVcXFwiPkV2ZW50IERldGFpbHM8L2Rpdj5cXG48L2Rpdj5cXG48ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLW1haW5cXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLXJvd1xcXCI+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWNvbFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcInRpdGxlXFxcIj5UaXRsZTwvbGFiZWw+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJmb3JtLWVycm9yXFxcIiBuZy1zaG93PVxcXCIoZm9ybS50aXRsZS4kdG91Y2hlZCB8fCBmb3JtLiRzdWJtaXR0ZWQpICYmIGVycm9ycy50aXRsZVxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9lcnJvci5wbmdcXFwiIHdpZHRoPVxcXCIxNFxcXCIgLz4ge3tlcnJvcnMudGl0bGV9fVxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwidGl0bGVcXFwiIG5hbWU9XFxcInRpdGxlXFxcIiBuZy1tYXhsZW5ndGg9XFxcIjMwXFxcIiByZXF1aXJlZCBuZy1tb2RlbD1cXFwiZXZlbnQudGl0bGVcXFwiIHR5cGU9XFxcInRleHRcXFwiIHBsYWNlaG9sZGVyPVxcXCJNb250aGx5IE1lZXR1cC4uLlxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBleHRlbmRcXFwiLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1jb2xcXFwiPlxcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tZ3JvdXAgb3B0aW9uYWxcXFwiPlxcbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVxcXCJsb2NhdGlvblxcXCI+TG9jYXRpb248L2xhYmVsPlxcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cXFwiZm9ybS1lcnJvclxcXCIgbmctc2hvdz1cXFwiKGZvcm0ubG9jYXRpb24uJHRvdWNoZWQgfHwgZm9ybS4kc3VibWl0dGVkKSAmJiBlcnJvcnMubG9jYXRpb25cXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXJyb3IucG5nXFxcIiB3aWR0aD1cXFwiMTRcXFwiIC8+IHt7ZXJyb3JzLmxvY2F0aW9ufX1cXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxcbiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9XFxcImxvY2F0aW9uXFxcIiBuYW1lPVxcXCJsb2NhdGlvblxcXCIgbmctbW9kZWw9XFxcImV2ZW50LmxvY2F0aW9uXFxcIiBuZy1tYXhsZW5ndGg9XFxcIjUwXFxcIiB0eXBlPVxcXCJ0ZXh0XFxcIiBwbGFjZWhvbGRlcj1cXFwiUmlja1xcJ3MgQ2FmZS4uLlxcXCIgY2xhc3M9XFxcImZvcm0tY29udHJvbCBleHRlbmRcXFwiLz5cXG4gICAgICAgICAgICA8L2Rpdj5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1yb3dcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cCBvcHRpb25hbFxcXCI+XFxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwiZGVzY3JpcHRpb25cXFwiID5EZXNjcmlwdGlvbjwvbGFiZWw+XFxuICAgICAgICAgICAgPHRleHRhcmVhIGlkPVxcXCJkZXNjcmlwdGlvblxcXCIgbmFtZT1cXFwiZGVzY3JpcHRpb25cXFwiIG5nLW1vZGVsPVxcXCJldmVudC5kZXNjcmlwdGlvblxcXCIgcGxhY2Vob2xkZXI9XFxcIkVudGVyIERlc2NyaXB0aW9uLi4uXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGV4dGVuZFxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG5cIik7XG4kdGVtcGxhdGVDYWNoZS5wdXQoXCJ0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9ldmVudEZvcm0vcGFydGljaXBhbnRzRm9ybS5odG1sXCIsXCI8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLWRldGFpbHNcXFwiPlxcbiAgICA8ZGl2IGNsYXNzPVxcXCJzZWN0aW9uLXRpdGxlXFxcIj5JbnZpdGUgUGFydGljaXBhbnRzPC9kaXY+XFxuPC9kaXY+XFxuPGRpdiBjbGFzcz1cXFwic2VjdGlvbi1tYWluXFxcIj5cXG4gICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1yb3dcXFwiPlxcbiAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cCBvcHRpb25hbFxcXCI+XFxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwiZW1haWxzXFxcIj5QYXJ0aWNpcGFudFxcJ3MgRW1haWxzPC9sYWJlbD5cXG4gICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XFxcImVtYWlsc1xcXCIgbmctbGlzdCBuZy1tb2RlbD1cXFwiZXZlbnQuZW1haWxzXFxcIiBwbGFjZWhvbGRlcj1cXFwiRW50ZXIgRW1haWxzLi4uXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGV4dGVuZFxcXCI+PC90ZXh0YXJlYT5cXG4gICAgICAgIDwvZGl2PlxcbiAgICA8L2Rpdj5cXG48L2Rpdj5cXG48L3NlY3Rpb24+XFxuXCIpO1xuJHRlbXBsYXRlQ2FjaGUucHV0KFwidGVtcGxhdGVzL2RpcmVjdGl2ZXMvZXZlbnRGb3JtL3VzZXJGb3JtLmh0bWxcIixcIjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tZGV0YWlsc1xcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcInNlY3Rpb24tdGl0bGVcXFwiPllvdXIgRGV0YWlsczwvZGl2PlxcbjwvZGl2PlxcbjxkaXYgY2xhc3M9XFxcInNlY3Rpb24tbWFpblxcXCI+XFxuICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tcm93XFxcIj5cXG4gICAgICAgIDxkaXYgY2xhc3M9XFxcImZvcm0tY29sXFxcIj5cXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWdyb3VwXFxcIj5cXG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cXFwibmFtZVxcXCI+TmFtZTwvbGFiZWw+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJmb3JtLWVycm9yXFxcIiBuZy1zaG93PVxcXCIoZm9ybS5uYW1lLiR0b3VjaGVkIHx8IGZvcm0uJHN1Ym1pdHRlZCkgJiYgZXJyb3JzLm5hbWVcXFwiPlxcbiAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XFxcIi9pbWFnZXMvZXJyb3IucG5nXFxcIiB3aWR0aD1cXFwiMTRcXFwiIC8+IHt7ZXJyb3JzLm5hbWV9fVxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCBpZD1cXFwibmFtZVxcXCIgbmFtZT1cXFwibmFtZVxcXCIgbmctbWF4bGVuZ3RoPVxcXCIzMFxcXCIgcmVxdWlyZWQgbmctbW9kZWw9XFxcImV2ZW50LmNyZWF0b3IubmFtZVxcXCIgdHlwZT1cXFwidGV4dFxcXCIgcGxhY2Vob2xkZXI9XFxcIkpvaG4gRG9lLi4uXFxcIiBjbGFzcz1cXFwiZm9ybS1jb250cm9sIGV4dGVuZFxcXCIvPlxcbiAgICAgICAgICAgIDwvZGl2PlxcbiAgICAgICAgPC9kaXY+XFxuICAgICAgICA8ZGl2IGNsYXNzPVxcXCJmb3JtLWNvbFxcXCI+XFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cXFwiZm9ybS1ncm91cFxcXCI+XFxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XFxcImVtYWlsXFxcIj5FbWFpbDwvbGFiZWw+XFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVxcXCJmb3JtLWVycm9yXFxcIiBuZy1zaG93PVxcXCIoZm9ybS5lbWFpbC4kdG91Y2hlZCB8fCBmb3JtLiRzdWJtaXR0ZWQpICYmIGVycm9ycy5lbWFpbFxcXCI+XFxuICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cXFwiL2ltYWdlcy9lcnJvci5wbmdcXFwiIHdpZHRoPVxcXCIxNFxcXCIgLz4ge3tlcnJvcnMuZW1haWx9fVxcbiAgICAgICAgICAgICAgICA8L3NwYW4+XFxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVxcXCJlbWFpbFxcXCIgaWQ9XFxcImVtYWlsXFxcIiBuYW1lPVxcXCJlbWFpbFxcXCIgbmctcGF0dGVybj1cXFwiZW1haWxSZWdleFxcXCIgcmVxdWlyZWQgbmctbW9kZWw9XFxcImV2ZW50LmNyZWF0b3IuZW1haWxcXFwiIHBsYWNlaG9sZGVyPVxcXCJqb2huLmRvZUBlbWFpbC5jb20uLi5cXFwiIGNsYXNzPVxcXCJmb3JtLWNvbnRyb2wgZXh0ZW5kXFxcIi8+XFxuICAgICAgICAgICAgPC9kaXY+XFxuICAgICAgICA8L2Rpdj5cXG4gICAgPC9kaXY+XFxuPC9kaXY+XFxuXCIpO31dKTsiLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5jb250cm9sbGVyKCdBYm91dEN0cmwnLCBmdW5jdGlvbihUaXRsZSl7XG4gICAgVGl0bGUuc2V0KCdBYm91dCBSYWxsbHknKVxufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5jb250cm9sbGVyKCdFZGl0RXZlbnRDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkaHR0cCwgJHN0YXRlLCAkdGltZW91dCwgRXZlbnQsIENvbmZpcm1Nb2RhbCwgVGl0bGUpe1xuICAgIHZhciBpZCA9ICRzdGF0ZS5wYXJhbXMuaWRcbiAgICAkc2NvcGUuZXZlbnQgPSBFdmVudC5nZXQoe2lkOmlkfSwgZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgIFRpdGxlLnNldChcIkVkaXQ6IFwiICsgJHNjb3BlLmV2ZW50LnRpdGxlKTtcbiAgICAgICAgJHNjb3BlLm1hc3RlciA9IGFuZ3VsYXIuY29weSgkc2NvcGUuZXZlbnQpO1xuICAgIH0sIGZ1bmN0aW9uKGUpe1xuICAgICAgICAkc3RhdGUuZ28oJ25vdGZvdW5kJyk7XG4gICAgfSk7XG4gICAgJHNjb3BlLnVuZG9DaGFuZ2VzID0gZnVuY3Rpb24oKXtcbiAgICAgICAgJHNjb3BlLmV2ZW50ID0gYW5ndWxhci5jb3B5KCRzY29wZS5tYXN0ZXIpO1xuICAgICAgICByZXNldERhdGVzKCk7XG4gICAgfVxuICAgICRzY29wZS5kaWRDaGFuZ2UgPSBmdW5jdGlvbigpe1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoJHNjb3BlLm1hc3RlcikgIT0gSlNPTi5zdHJpbmdpZnkoJHNjb3BlLmV2ZW50KTtcbiAgICB9XG4gICAgJHNjb3BlLmRpZENoYW5nZURhdGVzID0gZnVuY3Rpb24oKXtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KCRzY29wZS5tYXN0ZXIuZGF0ZXMpICE9IEpTT04uc3RyaW5naWZ5KCRzY29wZS5ldmVudC5kYXRlcyk7XG4gICAgfVxuICAgICRzY29wZS5zdWJtaXQgPSBmdW5jdGlvbigpe1xuICAgICAgICBpZiAoJHNjb3BlLmZvcm0uJHZhbGlkKXtcbiAgICAgICAgICAgIGlmICgkc2NvcGUuZGlkQ2hhbmdlRGF0ZXMoKSApe1xuICAgICAgICAgICAgICAgIHZhciBtb2RhbCA9IG5ldyBDb25maXJtTW9kYWwoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZSA6ICdIb2xkIHVwIScsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgOiAnQ2hhbmdpbmcgdGhlIGRhdGVzIHdpbGwgcmVzZXQgYWxsIGVudHJpZXMgYnkgdGhlIHBhcnRpY2lwYW50cy4gQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvIHRoYXQ/JyxcbiAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQgOiAnWWVzLCBJXFwnbSBzdXJlJyxcbiAgICAgICAgICAgICAgICAgICAgaXNEZXN0cnVjdGl2ZSA6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm0gOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICAgICAgJHNjb3BlLmV2ZW50LnBhcnRpY2lwYW50cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cGRhdGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBtb2RhbCA9IG5ldyBDb25maXJtTW9kYWwoe1xuICAgICAgICAgICAgICAgIHRpdGxlIDogJ05vdCBzbyBmYXN0IScsXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA6ICdNYWtlIHN1cmUgeW91IGZpbGwgaW4gYWxsIHRoZSByZXF1aXJlZCBmaWVsZHMgYW5kIHRyeSBhZ2Fpbi4nLFxuICAgICAgICAgICAgICAgIGNhbmNlbFRleHQgOiAnT0snXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgdXBkYXRlID0gZnVuY3Rpb24oKXtcbiAgICAgICAgRXZlbnQudXBkYXRlKHtcbiAgICAgICAgICAgIGlkIDogaWRcbiAgICAgICAgfSwgJHNjb3BlLmV2ZW50LFxuICAgICAgICBmdW5jdGlvbigpe1xuICAgICAgICAgICAgdmFyIG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbCh7XG4gICAgICAgICAgICAgICAgdGl0bGUgOiAnRXZlbnQgVXBkYXRlZCcsXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA6ICdZb3VyIGNoYW5nZXMgaGF2ZSBiZWVuIHNhdmVkIHN1Y2Nlc3NmdWxseSEnLFxuICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0IDogJ0JhY2sgdG8gRXZlbnQgUGFnZScsXG4gICAgICAgICAgICAgICAgY2FuY2VsVGV4dCA6ICdTdGF5IGhlcmUnLFxuICAgICAgICAgICAgICAgIGNvbmZpcm0gOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICAkc3RhdGUuZ28oJ2V2ZW50Jyx7aWQgOiAkc2NvcGUuZXZlbnQuX2lkfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkc2NvcGUubWFzdGVyID0gYW5ndWxhci5jb3B5KCRzY29wZS5ldmVudCk7XG4gICAgICAgICAgICAkc2NvcGUuZGlkU2F2ZSA9ICR0aW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgJHNjb3BlLmRpZFNhdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICB9KTtcbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0V2ZW50Q3RybCcsIGZ1bmN0aW9uKCRzY29wZSwgJGh0dHAsICRzdGF0ZSwgVGl0bGUsIEV2ZW50KXtcbiAgICB2YXIgaWQgPSAkc3RhdGUucGFyYW1zLmlkO1xuICAgICRzY29wZS5wYXJ0aWNpcGFudCA9IHt9O1xuICAgICRzY29wZS5ldmVudCA9IEV2ZW50LmdldCh7aWQ6aWR9LCBmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgVGl0bGUuc2V0KCRzY29wZS5ldmVudC50aXRsZSk7XG4gICAgICAgICRzY29wZS5ldmVudFVybCA9ICRzdGF0ZS5ocmVmKCdldmVudCcsIHtcbiAgICAgICAgICAgIGlkOiAkc2NvcGUuZXZlbnQuX2lkXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGFic29sdXRlIDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9LCBmdW5jdGlvbihlKXtcbiAgICAgICAgJHN0YXRlLmdvKCdub3Rmb3VuZCcpO1xuICAgIH0pO1xuXG4gICAgJHNjb3BlLmVkaXRFdmVudCA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICRzdGF0ZS5nbygnZWRpdGV2ZW50JywgeyBpZCA6ICRzY29wZS5ldmVudC5faWQgfSk7XG4gICAgfVxuXG59KVxuLmRpcmVjdGl2ZSgncG9sbCcsIGZ1bmN0aW9uKEV2ZW50LCBQYXJ0aWNpcGFudCwgQ29uZmlybU1vZGFsKXtcbiAgICByZXR1cm4ge1xuICAgICAgICByZXN0cmljdCA6ICdBJyxcbiAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2RpcmVjdGl2ZXMvcG9sbC5odG1sJyxcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICAnZXZlbnQnIDogJz0nLFxuICAgICAgICAgICAgJ3BhcnRpY2lwYW50JyA6ICc9J1xuICAgICAgICB9LFxuICAgICAgICBsaW5rIDogZnVuY3Rpb24oc2NvcGUsIGVsLCBhdHRycyl7XG4gICAgICAgICAgICBzY29wZS5kZWZhdWx0cyA9IFtdO1xuICAgICAgICAgICAgdmFyIGRhdGVzQ291bnQgPSBbXTtcbiAgICAgICAgICAgIHNjb3BlLmRlbGV0ZSA9IGZ1bmN0aW9uKHBhcnRpY2lwYW50KXtcbiAgICAgICAgICAgICAgICB2YXIgbW9kYWwgPSBuZXcgQ29uZmlybU1vZGFsKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgOiAnRGVsZXRlICcgKyBwYXJ0aWNpcGFudC5uYW1lICsgJz8nLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIDogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZW1vdmUgJytwYXJ0aWNpcGFudC5uYW1lKycgZnJvbSB0aGUgcG9sbD8nLFxuICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dCA6ICdZZXMgLSBkZWxldGUnLFxuICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0IDogJ05vIC0gbmV2ZXJtaW5kJyxcbiAgICAgICAgICAgICAgICAgICAgaXNEZXN0cnVjdGl2ZSA6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbmZpcm0gOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICAgICAgUGFydGljaXBhbnQucmVtb3ZlKHsgaWQgOiBzY29wZS5ldmVudC5faWQgLCBwaWQgOiBwYXJ0aWNpcGFudC5faWQgfSwgZnVuY3Rpb24oZXZlbnQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG1vZGFsLnNob3coKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLmlzVG9wRGF0ZSA9IGZ1bmN0aW9uKGluZGV4KXtcbiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBkYXRlc0NvdW50W2luZGV4XTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGVzQ291bnQubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZXNDb3VudFtpXSA+IGNvdW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2NvcGUuc2VsZWN0ZWREYXRlID0gZnVuY3Rpb24oaW5kZXgpe1xuICAgICAgICAgICAgICAgIGRhdGVzQ291bnRbaW5kZXhdID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjb3BlLmV2ZW50LnBhcnRpY2lwYW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzY29wZS5ldmVudC5wYXJ0aWNpcGFudHNbaV0uZGF0ZXNbaW5kZXhdKSBkYXRlc0NvdW50W2luZGV4XSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZXNDb3VudFtpbmRleF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS51cGRhdGUgPSBmdW5jdGlvbihwYXJ0aWNpcGFudCl7XG4gICAgICAgICAgICAgICAgUGFydGljaXBhbnQudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgaWQgOiBzY29wZS5ldmVudC5faWQsXG4gICAgICAgICAgICAgICAgICAgIHBpZCA6IHBhcnRpY2lwYW50Ll9pZFxuICAgICAgICAgICAgICAgIH0sIHBhcnRpY2lwYW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLmVkaXQgPSBmdW5jdGlvbihwYXJ0aWNpcGFudCl7XG4gICAgICAgICAgICAgICAgc2NvcGUuZGVmYXVsdHNbc2NvcGUuZXZlbnQucGFydGljaXBhbnRzLmluZGV4T2YocGFydGljaXBhbnQpXSA9IGFuZ3VsYXIuY29weShwYXJ0aWNpcGFudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzY29wZS5jYW5jZWwgPSBmdW5jdGlvbihpbmRleCl7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXZlbnQucGFydGljaXBhbnRzW2luZGV4XSA9IHNjb3BlLmRlZmF1bHRzW2luZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLnNhdmUgPSBmdW5jdGlvbihwYXJ0aWNpcGFudCl7XG4gICAgICAgICAgICAgICAgaWYgKHNjb3BlLmZvcm1uZXcuJHZhbGlkKXtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnRpY2lwYW50ID0gbmV3IFBhcnRpY2lwYW50KHBhcnRpY2lwYW50KTtcbiAgICAgICAgICAgICAgICAgICAgcGFydGljaXBhbnQuJHNhdmUoe2lkOnNjb3BlLmV2ZW50Ll9pZH0sIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZS5wYXJ0aWNpcGFudCA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuZm9ybW5ldy4kc2V0UHJpc3RpbmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmNvbnRyb2xsZXIoJ0hvbWVDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkc3RhdGUsIFRpdGxlKXtcbiAgICBUaXRsZS5zZXQoJ1JhbGxseSAtIENvbGxhYm9yYXRpdmUgU2NoZWR1bGluZycpXG5cbiAgICAkc2NvcGUubmV3RXZlbnQgPSBmdW5jdGlvbigpe1xuICAgICAgICAkc3RhdGUuZ28oJ25ld2V2ZW50Jyk7XG4gICAgfVxufSk7XG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5jb250cm9sbGVyKCdOYXZpZ2F0aW9uQ3RybCcsIGZ1bmN0aW9uKCRzY29wZSwgJGxvY2F0aW9uKXtcbiAgICAkc2NvcGUuaXNBY3RpdmUgPSBmdW5jdGlvbihwYXRoKSB7XG4gICAgICAgIGlmICgkbG9jYXRpb24ucGF0aCgpID09IHBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG59KVxuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uY29udHJvbGxlcignTmV3RXZlbnRDdHJsJywgZnVuY3Rpb24oJHNjb3BlLCAkaHR0cCwgJHN0YXRlLCBFdmVudCwgQ29uZmlybU1vZGFsKXtcblxuICAgICRzY29wZS50aXRsZSA9IFwiU2NoZWR1bGUgYSBOZXcgRXZlbnRcIjtcbiAgICAkc2NvcGUuZGVzY3JpcHRpb24gPSBcIkZpbGwgaW4gdGhlIGZvcm0gYmVsb3cgdG8gY3JlYXRlIHlvdXIgZXZlbnQgYW5kIHNoYXJlIGl0IHdpdGggeW91ciBmcmllbmRzIGFuZCBjb2xsZWFndWVzLlwiO1xuXG4gICAgdmFyIHNob3dNb2RhbCA9IGZ1bmN0aW9uKHRpdGxlLCBtZXNzYWdlKXtcbiAgICAgICAgdmFyIG1vZGFsID0gbmV3IENvbmZpcm1Nb2RhbCh7XG4gICAgICAgICAgICB0aXRsZSA6IHRpdGxlIHx8ICdOb3Qgc28gZmFzdCEnLFxuICAgICAgICAgICAgbWVzc2FnZSA6IG1lc3NhZ2UgfHwgJ01ha2Ugc3VyZSB5b3UgZmlsbCBpbiBhbGwgdGhlIHJlcXVpcmVkIGZpZWxkcyBhbmQgdHJ5IGFnYWluLicsXG4gICAgICAgICAgICBjYW5jZWxUZXh0IDogJ09LJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAkc2NvcGUuc3VibWl0ID0gZnVuY3Rpb24oKXtcbiAgICAgICAgaWYgKCRzY29wZS5mb3JtLiR2YWxpZCl7XG4gICAgICAgICAgICAkaHR0cC5wb3N0KCcvYXBpL2V2ZW50JywgJHNjb3BlLmV2ZW50KVxuICAgICAgICAgICAgLnN1Y2Nlc3MoZnVuY3Rpb24oZXZlbnQsIHN0YXR1cywgaGVhZGVycywgY29uZmlnKXtcbiAgICAgICAgICAgICAgICAkc2NvcGUuZXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgICAgICAkc2NvcGUuZXZlbnRVcmwgPSAkc3RhdGUuaHJlZignZXZlbnQnLCB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAkc2NvcGUuZXZlbnQuX2lkXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZSA6IHRydWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZXJyb3IoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBzaG93TW9kYWwoJ1VoIG9oIScsICdUaGVyZSB3YXMgYW4gZXJyb3IgY3JlYXRpbmcgeW91ciBldmVudC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2hvd01vZGFsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAkc2NvcGUuY2xlYXJEYXRlcyA9IG51bGxcbn0pO1xuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uZGlyZWN0aXZlKCdiYWNrSW1nJywgZnVuY3Rpb24oKXtcbiAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUsIGVsZW1lbnQsIGF0dHJzKXtcbiAgICAgICAgdmFyIHVybCA9IGF0dHJzLmJhY2tJbWc7XG4gICAgICAgIGVsZW1lbnQuY3NzKHtcbiAgICAgICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzogJ3VybCgvaW1hZ2VzLycgKyB1cmwgKycucG5nKSdcbiAgICAgICAgfSk7XG4gICAgfTtcbn0pXG4iLCJhbmd1bGFyLm1vZHVsZSgncmFsbGx5Jylcbi5kaXJlY3RpdmUoJ2RhdGVwaWNrZXInLCBmdW5jdGlvbigpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHJlc3RyaWN0IDogJ0EnLFxuICAgICAgICByZXF1aXJlIDogJ25nTW9kZWwnLFxuICAgICAgICBzY29wZSA6IHtcbiAgICAgICAgICAgIG1vZGVsIDogJz1uZ01vZGVsJyxcbiAgICAgICAgICAgIGNvbnRyb2wgOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMsIG5nTW9kZWwpe1xuICAgICAgICAgICAgc2NvcGUubW9kZWwgPSBzY29wZS5tb2RlbCB8fCBbXTtcbiAgICAgICAgICAgIGFuZ3VsYXIuZWxlbWVudChlbCkuZGF0ZXBpY2tlcih7XG4gICAgICAgICAgICAgICAgbXVsdGlkYXRlIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0b2RheUhpZ2hsaWdodDogdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbignY2hhbmdlRGF0ZScsIGZ1bmN0aW9uKGUpe1xuICAgICAgICAgICAgICAgIHZhciBkYXRlcyA9IGUuZGF0ZXM7XG4gICAgICAgICAgICAgICAgZGF0ZXMuc29ydChmdW5jdGlvbihhLCBiKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEuZ2V0VGltZSgpID4gYi5nZXRUaW1lKCkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbmdNb2RlbC4kc2V0Vmlld1ZhbHVlKGRhdGVzLCBlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgdXBkYXRlID0gZnVuY3Rpb24obW9kZWxWYWx1ZSwgb2xkVmFsdWUpe1xuICAgICAgICAgICAgICAgIGlmICghbW9kZWxWYWx1ZSB8fCAhb2xkVmFsdWUgfHwgKG1vZGVsVmFsdWUubGVuZ3RoID09IG9sZFZhbHVlLmxlbmd0aCkpIHJldHVybjtcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVsVmFsdWUubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBkYXRlcy5wdXNoKG5ldyBEYXRlKG1vZGVsVmFsdWVbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYW5ndWxhci5lbGVtZW50KGVsKS5kYXRlcGlja2VyKCdzZXREYXRlcycsIGRhdGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjb3BlLiR3YXRjaENvbGxlY3Rpb24oJ21vZGVsJywgdXBkYXRlKTtcblxuICAgICAgICAgICAgc2NvcGUuY29udHJvbCA9IHNjb3BlLmNvbnRyb2wgfHwge307XG4gICAgICAgICAgICBzY29wZS5jb250cm9sLnVuc2V0RGF0ZSA9IGZ1bmN0aW9uKGRhdGUpe1xuICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHNjb3BlLm1vZGVsLmluZGV4T2YoZGF0ZSk7XG4gICAgICAgICAgICAgICAgc2NvcGUubW9kZWwuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmdNb2RlbC4kdmFsaWRhdG9ycy5yZXF1aXJlZCA9IGZ1bmN0aW9uKG1vZGVsVmFsdWUsIHZpZXdWYWx1ZSl7XG4gICAgICAgICAgICAgICAgaWYgKCFtb2RlbFZhbHVlIHx8IG1vZGVsVmFsdWUubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLnNlcnZpY2UoJ0Zvcm1IZWxwZXInLCBmdW5jdGlvbigpe1xuICAgIHRoaXMucHJldHR5RXJyb3IgPSBmdW5jdGlvbihlcnJvcnMsIGZpZWxkKXtcbiAgICAgICAgaWYgKGVycm9ycy5yZXF1aXJlZCkgcmV0dXJuIGZpZWxkICsgXCIgaXMgcmVxdWlyZWRcIjtcbiAgICAgICAgaWYgKGVycm9ycy5wYXR0ZXJuKSByZXR1cm4gZmllbGQgKyBcIiBpcyBpbnZhbGlkXCIgO1xuICAgICAgICBpZiAoZXJyb3JzLm1heGxlbmd0aCkgcmV0dXJuIGZpZWxkICsgXCIgaXMgdG9vIGxvbmdcIjtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0pXG4uZGlyZWN0aXZlKCd1c2VyRm9ybScsIGZ1bmN0aW9uKEZvcm1IZWxwZXIpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgZXZlbnQgOiAnPScsXG4gICAgICAgICAgICBmb3JtIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9kaXJlY3RpdmVzL2V2ZW50Rm9ybS91c2VyRm9ybS5odG1sJyxcbiAgICAgICAgbGluayA6IGZ1bmN0aW9uKHNjb3BlLCBlbCwgYXR0cnMpIHtcbiAgICAgICAgICAgIHNjb3BlLmVycm9ycyA9IHt9O1xuXG4gICAgICAgICAgICBzY29wZS5lbWFpbFJlZ2V4ID0gL14oW1xcdy1cXC5dK0AoW1xcdy1dK1xcLikrW1xcdy1dezIsNH0pPyQvO1xuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdmb3JtLm5hbWUuJGVycm9yJyxmdW5jdGlvbihlcnJvcnMpe1xuICAgICAgICAgICAgICAgIHNjb3BlLmVycm9ycy5uYW1lID0gRm9ybUhlbHBlci5wcmV0dHlFcnJvcihlcnJvcnMsIFwiTmFtZVwiKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzY29wZS4kd2F0Y2hDb2xsZWN0aW9uKCdmb3JtLmVtYWlsLiRlcnJvcicsZnVuY3Rpb24oZXJyb3JzKXtcbiAgICAgICAgICAgICAgICBzY29wZS5lcnJvcnMuZW1haWwgPSBGb3JtSGVscGVyLnByZXR0eUVycm9yKGVycm9ycywgXCJFbWFpbFwiKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufSlcbi5kaXJlY3RpdmUoJ2V2ZW50Rm9ybScsIGZ1bmN0aW9uKEZvcm1IZWxwZXIpe1xuICAgIHJldHVybiB7XG4gICAgICAgIHNjb3BlIDoge1xuICAgICAgICAgICAgZXZlbnQgOiAnPScsXG4gICAgICAgICAgICBmb3JtIDogJz0nXG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlVXJsIDogJ3RlbXBsYXRlcy9kaXJlY3RpdmVzL2V2ZW50Rm9ybS9ldmVudEZvcm0uaHRtbCcsXG4gICAgICAgIGxpbmsgOiBmdW5jdGlvbihzY29wZSwgZWwsIGF0dHJzKSB7XG4gICAgICAgICAgICBzY29wZS5lcnJvcnMgPSB7fTtcblxuICAgICAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbignZm9ybS50aXRsZS4kZXJyb3InLGZ1bmN0aW9uKGVycm9ycyl7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXJyb3JzLnRpdGxlID0gRm9ybUhlbHBlci5wcmV0dHlFcnJvcihlcnJvcnMsIFwiVGl0bGVcIik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgc2NvcGUuJHdhdGNoQ29sbGVjdGlvbignZm9ybS5sb2NhdGlvbi4kZXJyb3InLGZ1bmN0aW9uKGVycm9ycyl7XG4gICAgICAgICAgICAgICAgc2NvcGUuZXJyb3JzLmxvY2F0aW9uID0gRm9ybUhlbHBlci5wcmV0dHlFcnJvcihlcnJvcnMsIFwiTG9jYXRpb25cIik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9XG4gICAgfVxufSlcbi5kaXJlY3RpdmUoJ2RhdGVGb3JtJywgZnVuY3Rpb24oKXtcbiAgICByZXR1cm4ge1xuICAgICAgICBzY29wZSA6IHtcbiAgICAgICAgICAgIGV2ZW50IDogJz0nLFxuICAgICAgICAgICAgZm9ybSA6ICc9J1xuICAgICAgICB9LFxuICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvZGlyZWN0aXZlcy9ldmVudEZvcm0vZGF0ZUZvcm0uaHRtbCdcbiAgICB9XG59KVxuLmRpcmVjdGl2ZSgncGFydGljaXBhbnRzRm9ybScsIGZ1bmN0aW9uKCl7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICBldmVudCA6ICc9JyxcbiAgICAgICAgICAgIGZvcm0gOiAnPSdcbiAgICAgICAgfSxcbiAgICAgICAgdGVtcGxhdGVVcmwgOiAndGVtcGxhdGVzL2RpcmVjdGl2ZXMvZXZlbnRGb3JtL3BhcnRpY2lwYW50c0Zvcm0uaHRtbCdcbiAgICB9XG59KTtcbiIsImFuZ3VsYXIubW9kdWxlKCdyYWxsbHknKVxuLmZpbHRlcignZWxhcHNlZCcsIGZ1bmN0aW9uKCRmaWx0ZXIpe1xuICAgIHJldHVybiBmdW5jdGlvbihkYXRlKXtcbiAgICAgICAgaWYgKCFkYXRlKSByZXR1cm47XG4gICAgICAgIHZhciB0aW1lID0gRGF0ZS5wYXJzZShkYXRlKSxcbiAgICAgICAgICAgIHRpbWVOb3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSxcbiAgICAgICAgICAgIGRpZmZlcmVuY2UgPSB0aW1lTm93IC0gdGltZSxcbiAgICAgICAgICAgIHNlY29uZHMgPSBNYXRoLmZsb29yKGRpZmZlcmVuY2UgLyAxMDAwKSxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCksXG4gICAgICAgICAgICBob3VycyA9IE1hdGguZmxvb3IobWludXRlcyAvIDYwKSxcbiAgICAgICAgICAgIGRheXMgPSBNYXRoLmZsb29yKGhvdXJzIC8gMjQpO1xuICAgICAgICBpZiAoZGF5cyA+IDMwKSB7XG4gICAgICAgICAgICByZXR1cm4gJ29uICcgKyAkZmlsdGVyKCdkYXRlJykoZGF0ZSwgJ01NTU0gZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKGRheXMgPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF5cyArIFwiIGRheXMgYWdvXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5cyA9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIxIGRheSBhZ29cIlxuICAgICAgICB9IGVsc2UgaWYgKGhvdXJzID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIGhvdXJzICsgXCIgaG91cnMgYWdvXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoaG91cnMgPT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiYW4gaG91ciBhZ29cIjtcbiAgICAgICAgfSBlbHNlIGlmIChtaW51dGVzID4gMSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbnV0ZXMgKyBcIiBtaW51dGVzIGFnb1wiO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnV0ZXMgPT0gMSl7XG4gICAgICAgICAgICByZXR1cm4gXCJhIG1pbnV0ZSBhZ29cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBcImEgZmV3IHNlY29uZHMgYWdvXCI7XG4gICAgICAgIH1cbiAgICB9XG59KVxuIiwiYW5ndWxhci5tb2R1bGUoJ3JhbGxseScpXG4uZmFjdG9yeSgnQ29uZmlybU1vZGFsJywgZnVuY3Rpb24oYnRmTW9kYWwpe1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGNvbmZpZyl7XG4gICAgICAgIHZhciBtb2RhbDtcbiAgICAgICAgbW9kYWwgPSBidGZNb2RhbCh7XG4gICAgICAgICAgICB0ZW1wbGF0ZVVybCA6ICd0ZW1wbGF0ZXMvY29uZmlybW1vZGFsLmh0bWwnLFxuICAgICAgICAgICAgY29udHJvbGxlckFzIDogJ21vZGFsJyxcbiAgICAgICAgICAgIGNvbnRyb2xsZXIgOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHRoaXMudGl0bGUgPSBjb25maWcudGl0bGVcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBjb25maWcubWVzc2FnZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpcm0gPSAoY29uZmlnLmNvbmZpcm0pID8gZnVuY3Rpb24oKXtjb25maWcuY29uZmlybSgpOyBtb2RhbC5kZWFjdGl2YXRlKCl9IDogZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5jYW5jZWwgPSBtb2RhbC5kZWFjdGl2YXRlO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlybVRleHQgPSBjb25maWcuY29uZmlybVRleHQgfHwgJ0NvbmZpcm0nO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsVGV4dCA9IGNvbmZpZy5jYW5jZWxUZXh0IHx8ICdDYW5jZWwnO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEZXN0cnVjdGl2ZSA9IGNvbmZpZy5pc0Rlc3RydWN0aXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgbW9kYWwuYWN0aXZhdGUoKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBtb2RhbC5kZWFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcbiJdLCJzb3VyY2VSb290IjoiL3NvdXJjZS8ifQ==
|