@geoapify/route-planner-sdk
Version:
A TypeScript SDK for the Geoapify Route Planner API that simplifies route optimization requests, and helps visualize and edit resulting routes.
2 lines • 163 kB
JavaScript
function t(t,e,i,n){return new(i||(i=Promise))((function(s,r){function a(t){try{h(n.next(t))}catch(t){r(t)}}function o(t){try{h(n.throw(t))}catch(t){r(t)}}function h(t){var e;t.done?s(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(a,o)}h((n=n.apply(t,e||[])).next())}))}"function"==typeof SuppressedError&&SuppressedError;class e{constructor(t){this.raw=t||{capabilities:[],time_windows:[],breaks:[]}}getRaw(){return this.raw}setRaw(t){return this.raw=t,this}setStartLocation(t,e){return this.raw.start_location=[t,e],this}setStartLocationIndex(t){return this.raw.start_location_index=t,this}setEndLocation(t,e){return this.raw.end_location=[t,e],this}setEndLocationIndex(t){return this.raw.end_location_index=t,this}setPickupCapacity(t){return this.raw.pickup_capacity=t,this}setDeliveryCapacity(t){return this.raw.delivery_capacity=t,this}addCapability(t){return this.raw.capabilities.push(t),this}addTimeWindow(t,e){return this.raw.time_windows.push([t,e]),this}addBreak(t){return this.raw.breaks.push(t.getRaw()),this}setId(t){return this.raw.id=t,this}setDescription(t){return this.raw.description=t,this}}class i{constructor(t){this.raw=t||{}}getRaw(){return this.raw}setRaw(t){return this.raw=t,this}setLat(t){return this.raw.lat=t,this}setLon(t){return this.raw.lon=t,this}}class n{constructor(t){this.raw=t||{values:[]}}getRaw(){return this.raw}setRaw(t){return this.raw=t,this}setType(t){return this.raw.type=t,this}addValue(t,e){let n=(new i).setLat(e).setLon(t);return this.raw.values.push(n.getRaw()),this}}class s{constructor(t){this.raw=t||{time_windows:[]}}getRaw(){return this.raw}setRaw(t){return this.raw=t,this}addTimeWindow(t,e){return this.raw.time_windows.push([t,e]),this}setDuration(t){return this.raw.duration=t,this}}class r{constructor(t){this.raw=t||{requirements:[],time_windows:[]}}getRaw(){return this.raw}setRaw(t){return this.raw=t,this}setLocation(t,e){return this.raw.location=[t,e],this}setLocationIndex(t){return this.raw.location_index=t,this}setPriority(t){return this.raw.priority=t,this}setDuration(t){return this.raw.duration=t,this}setPickupAmount(t){return this.raw.pickup_amount=t,this}setDeliveryAmount(t){return this.raw.delivery_amount=t,this}addRequirement(t){return this.raw.requirements.push(t),this}addTimeWindow(t,e){return this.raw.time_windows.push([t,e]),this}setId(t){return this.raw.id=t,this}setDescription(t){return this.raw.description=t,this}}class a{constructor(t){this.raw=t||{}}getRaw(){return this.raw}setRaw(t){return this.raw=t,this}setId(t){return this.raw.id=t,this}setLocation(t,e){return this.raw.location=[t,e],this}}class o{constructor(t){this.raw=t||{requirements:[]}}getRaw(){return this.raw}setRaw(t){return this.raw=t,this}setId(t){return this.raw.id=t,this}setPickup(t){return this.raw.pickup=t.getRaw(),this}setDelivery(t){return this.raw.delivery=t.getRaw(),this}addRequirement(t){return this.raw.requirements.push(t),this}setPriority(t){return this.raw.priority=t,this}setDescription(t){return this.raw.description=t,this}setAmount(t){return this.raw.amount=t,this}}class h{constructor(t){this.raw=t||{time_windows:[]}}getRaw(){return this.raw}setRaw(t){return this.raw=t,this}setLocation(t,e){return this.raw.location=[t,e],this}setLocationIndex(t){return this.raw.location_index=t,this}setDuration(t){return this.raw.duration=t,this}addTimeWindow(t,e){return this.raw.time_windows.push([t,e]),this}}class d{constructor(t){if(!t)throw new Error("RouteLegStepData is undefined");this.raw=t}getRaw(){return this.raw}getDistance(){return this.raw.distance}getTime(){return this.raw.time}getFromIndex(){return this.raw.from_index}getToIndex(){return this.raw.to_index}}class u{constructor(t){if(!t)throw new Error("RouteLegData is undefined");this.raw=t}getRaw(){return this.raw}getTime(){return this.raw.time}getDistance(){return this.raw.distance}getSteps(){return this.raw.steps.map((t=>new d(t)))}getFromWaypointIndex(){return this.raw.from_waypoint_index}getToWaypointIndex(){return this.raw.to_waypoint_index}}class g{constructor(t){if(!t)throw new Error("RouteActionData is undefined");this.raw=t}getRaw(){return this.raw}getType(){return this.raw.type}getStartTime(){return this.raw.start_time}getDuration(){return this.raw.duration}getShipmentIndex(){return this.raw.shipment_index}getShipmentId(){return this.raw.shipment_id}getLocationIndex(){return this.raw.location_index}getLocationId(){return this.raw.location_id}getJobIndex(){return this.raw.job_index}getJobId(){return this.raw.job_id}getIndex(){return this.raw.index}getWaypointIndex(){return this.raw.waypoint_index}}class l{constructor(t){if(!t)throw new Error("WaypointData is undefined");this.raw=t}getRaw(){return this.raw}getOriginalLocation(){return this.raw.original_location}getOriginalLocationIndex(){return this.raw.original_location_index}getOriginalLocationId(){return this.raw.original_location_id}getLocation(){return this.raw.location}getStartTime(){return this.raw.start_time}getDuration(){return this.raw.duration}getActions(){return this.raw.actions.map((t=>new g(t)))}getPrevLegIndex(){return this.raw.prev_leg_index}getNextLegIndex(){return this.raw.next_leg_index}}class w{constructor(t){if(!t)throw new Error("AgentSolutionData is undefined");this.raw=t}getRaw(){return this.raw}getAgentIndex(){return this.raw.agentIndex}getAgentId(){return this.raw.agentId}getTime(){return this.raw.time}getStartTime(){return this.raw.start_time}getEndTime(){return this.raw.end_time}getDistance(){return this.raw.distance}getMode(){return this.raw.mode}getLegs(){return this.raw.legs.map((t=>new u(t)))}getActions(){return this.raw.actions.map((t=>new g(t)))}getWaypoints(){return this.raw.waypoints.map((t=>new l(t)))}}class p{constructor(t){if(!t)throw new Error("RouteActionInfo is undefined");this.raw=t}getRaw(){return this.raw}getAgentId(){return this.raw.agentId}getAction(){return this.raw.action}getAgent(){return this.raw.agent}}class c extends Error{constructor(t,e){super(e),this.errorName=t,this.name=t}}var m={__proto__:null,Agent:e,AgentSolution:w,Avoid:n,Break:s,Coordinates:i,Job:r,Location:a,RouteAction:g,RouteActionInfo:p,RouteLeg:u,RouteLegStep:d,RoutePlannerError:c,Shipment:o,ShipmentStep:h,Waypoint:l};class f{static cleanObject(t){if(Array.isArray(t))return t.length>0?t.map(f.cleanObject):void 0;if(null!==t&&"object"==typeof t){const e=Object.entries(t).reduce(((t,[e,i])=>{const n=f.cleanObject(i);return void 0!==n&&(t[e]=n),t}),{});return Object.keys(e).length>0?e:void 0}return t}static cloneObject(t){return JSON.parse(JSON.stringify(t))}}class A{constructor(t,e){this.rawData=e,this.options=t}getRaw(){return this.rawData}getAgentSolutions(){return this.rawData.agents.map((t=>new w(t)))}getAgentSolution(t){let e=this.rawData.agents.find((e=>e.agentId===t));return void 0===e?void 0:new w(e)}getAgentWaypoints(t){const e=this.getAgentSolution(t);return e?e.getWaypoints():[]}getAgentRouteActions(t){const e=this.getAgentSolution(t);return e?e.getActions():[]}getAgentRouteLegs(t){const e=this.getAgentSolution(t);return e?e.getLegs():[]}getOptions(){return this.options}getAgentJobs(t){const e=this.getAgentSolution(t);return void 0===e?[]:e.getActions().filter((t=>void 0!==t.getJobId())).map((t=>t.getJobId()))}getAgentShipments(t){const e=this.getAgentSolution(t);return void 0===e?[]:e.getActions().filter((t=>void 0!==t.getShipmentId())).map((t=>t.getShipmentId()))}getUnassignedAgents(){return this.rawData.unassignedAgents?this.rawData.unassignedAgents:[]}getUnassignedJobs(){return this.rawData.unassignedJobs?this.rawData.unassignedJobs:[]}getUnassignedShipments(){return this.rawData.unassignedShipments?this.rawData.unassignedShipments:[]}getJobInfo(t){for(const e of this.getAgentSolutions())for(const i of e.getActions())if(i.getJobId()===t)return new p({agentId:e.getAgentId(),action:i,agent:e})}getShipmentInfo(t){for(const e of this.getAgentSolutions())for(const i of e.getActions())if(i.getShipmentId()===t)return new p({agentId:e.getAgentId(),action:i,agent:e})}getAgentRoute(e,i){return t(this,void 0,void 0,(function*(){const t=this.getAgentSolution(e);if(!t)return;let n=t.getWaypoints().map((t=>"lonlat:"+t.getLocation())).join("|");if(0==n.length)return;const s=yield fetch(`${this.getOptions().baseUrl}/v1/routing?waypoints=${n}&apiKey=${this.getOptions().apiKey}&mode=${i}`);return yield s.json()}))}}class v{static convert(t,e,i){let n=this.generateRoutePlannerResultData(e,i);return new A(t,n)}static generateRoutePlannerResultData(t,e){var i,n,s;return{agents:this.generateAgents(e),inputData:t,unassignedAgents:null===(i=e.properties.issues)||void 0===i?void 0:i.unassigned_agents,unassignedJobs:null===(n=e.properties.issues)||void 0===n?void 0:n.unassigned_jobs,unassignedShipments:null===(s=e.properties.issues)||void 0===s?void 0:s.unassigned_shipments}}static generateAgents(t){let e=[];return t.features.forEach((t=>{let i=t.properties;e.push({agentIndex:i.agent_index,agentId:i.agent_id,time:i.time,start_time:i.start_time,end_time:i.end_time,distance:i.distance,mode:i.mode,legs:this.generateRouteLegs(i.legs),actions:this.generateActions(i.actions),waypoints:this.generateWaypoints(i.waypoints)})})),e}static generateRouteLegs(t){return void 0===t?[]:t.map((t=>({time:t.time,distance:t.distance,steps:this.generateRouteLegSteps(t.steps),from_waypoint_index:t.from_waypoint_index,to_waypoint_index:t.to_waypoint_index})))}static generateRouteLegSteps(t){return t.map((t=>({distance:t.distance,time:t.distance,from_index:t.from_index,to_index:t.to_index})))}static generateActions(t){return t.map((t=>({type:t.type,start_time:t.start_time,duration:t.duration,shipment_index:t.shipment_index,shipment_id:t.shipment_id,location_index:t.location_index,location_id:t.location_id,job_index:t.job_index,job_id:t.job_id,index:t.index,waypoint_index:t.waypoint_index})))}static generateWaypoints(t){return t.map((t=>({original_location:t.original_location,original_location_index:t.original_location_index,original_location_id:t.original_location_id,location:t.location,start_time:t.start_time,duration:t.duration,actions:this.generateActions(t.actions),prev_leg_index:t.prev_leg_index,next_leg_index:t.next_leg_index})))}}class S{constructor(t,e){this.options=t,this.options.baseUrl||(this.options.baseUrl="https://api.geoapify.com"),this.raw=e||{agents:[],jobs:[],shipments:[],locations:[],avoid:[]}}getRaw(){return this.raw}setRaw(t){return this.raw=t,this}setMode(t){return this.raw.mode=t,this}addAgent(t){return this.raw.agents.push(t.getRaw()),this}addJob(t){return this.raw.jobs.push(t.getRaw()),this}addLocation(t){return this.raw.locations.push(t.getRaw()),this}addShipment(t){return this.raw.shipments.push(t.getRaw()),this}addAvoid(t){return this.raw.avoid.push(t.getRaw()),this}setTraffic(t){return this.raw.traffic=t,this}setType(t){return this.raw.type=t,this}setMaxSpeed(t){return this.raw.max_speed=t,this}setUnits(t){return this.raw.units=t,this}plan(){return t(this,void 0,void 0,(function*(){const e=f.cleanObject(this.raw),i=yield function(e,i){return t(this,void 0,void 0,(function*(){if("undefined"!=typeof fetch)return fetch(e,i);try{const t=Function("return import('node-fetch')")();return(0,(yield t).default)(e,i)}catch(t){throw new Error("Fetch is not available in this environment. If you are using Node.js <18, install 'node-fetch' manually: npm install node-fetch")}}))}(`${this.options.baseUrl}/v1/routeplanner?apiKey=${this.options.apiKey}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(!i.ok){let t=yield i.json();throw new c(t.error,t.message)}let n=yield i.json();return v.convert(this.options,this.getRaw(),n)}))}}class b{constructor(t,e,i,n){this.agentId=t,this.agentJobIds=new Set(e),this.agentShipmentIds=new Set(i),this.agentLocationIds=new Set(n)}}class I{constructor(t){this.result=t}optimizeRoute(e){return t(this,void 0,void 0,(function*(){let t=f.cloneObject(this.result.getRaw().inputData);t.agents=t.agents.filter((t=>t.id==e.agentId)),t.jobs=t.jobs.filter((t=>e.agentJobIds.has(t.id))),t.shipments=t.shipments.filter((t=>e.agentShipmentIds.has(t.id))),t.locations=t.locations.filter((t=>e.agentLocationIds.has(t.id)));const i=new S(this.result.getOptions(),t);return yield i.plan()}))}updateAgent(t){let e=t.getRaw().inputData.agents[0].id;if(t.getUnassignedAgents().length>0){let i=this.getInitialAgentIndex(e);this.result.getUnassignedAgents().includes(i)||(this.result.getRaw().agents=this.result.getRaw().agents.filter((t=>t.agentId!=e))),this.updateUnassignedItems(t)}else this.result.getAgentSolution(e)&&(this.result.getRaw().agents=this.result.getRaw().agents.filter((t=>t.agentId!=e))),this.result.getRaw().agents.push(t.getRaw().agents[0]),this.updateUnassignedItems(t)}generateOptimizeAgentInput(t,e){if(!e)return new b(t,[],[],[]);let i=e.getActions().filter((t=>void 0!==t.getJobId())).map((t=>t.getJobId())),n=e.getActions().filter((t=>void 0!==t.getShipmentId())).map((t=>t.getShipmentId())),s=e.getActions().filter((t=>void 0!==t.getLocationId())).map((t=>t.getLocationId()));return new b(e.getAgentId(),i,n,s)}checkIfArrayIsUnique(t){return t.length===new Set(t).size}getInitialAgentIndex(t){return this.result.getRaw().inputData.agents.findIndex((e=>e.id==t))}getInitialJobIndex(t){return this.result.getRaw().inputData.jobs.findIndex((e=>e.id==t))}getInitialShipmentIndex(t){return this.result.getRaw().inputData.shipments.findIndex((e=>e.id==t))}validateAgent(t){if(-1==this.getInitialAgentIndex(t))throw new Error(`Agent with id ${t} not found`)}updateUnassignedItems(t){this.updateUnassignedAgents(t),this.updateUnassignedJobs(t),this.updateUnassignedShipments(t)}updateUnassignedAgents(t){let e=t.getRaw().inputData.agents[0].id,i=this.getInitialAgentIndex(e);t.getUnassignedAgents().length>0?this.result.getUnassignedAgents().includes(i)||(this.result.getRaw().unassignedAgents||(this.result.getRaw().unassignedAgents=[]),this.result.getRaw().unassignedAgents.push(i)):(this.result.getRaw().unassignedAgents||(this.result.getRaw().unassignedAgents=[]),this.result.getRaw().unassignedAgents=this.result.getRaw().unassignedAgents.filter((t=>t!=i)))}updateUnassignedJobs(t){this.getUnassignedJobs(t).forEach((t=>{let e=this.getInitialJobIndex(t);this.result.getUnassignedJobs().includes(e)||(this.result.getRaw().unassignedJobs||(this.result.getRaw().unassignedJobs=[]),this.result.getRaw().unassignedJobs.push(e))})),t.getRaw().agents.length>0&&t.getRaw().agents[0].actions.filter((t=>t.job_id)).map((t=>t.job_id)).forEach((t=>{let e=this.getInitialJobIndex(t);this.result.getUnassignedJobs().includes(e)&&(this.result.getRaw().unassignedJobs||(this.result.getRaw().unassignedJobs=[]),this.result.getRaw().unassignedJobs=this.result.getRaw().unassignedJobs.filter((t=>t!=e)))}))}updateUnassignedShipments(t){this.getUnassignedShipments(t).forEach((t=>{let e=this.getInitialShipmentIndex(t);this.result.getUnassignedShipments().includes(e)||(this.result.getRaw().unassignedShipments||(this.result.getRaw().unassignedShipments=[]),this.result.getRaw().unassignedShipments.push(e))})),t.getRaw().agents.length>0&&t.getRaw().agents[0].actions.filter((t=>t.shipment_id)).map((t=>t.shipment_id)).forEach((t=>{let e=this.getInitialShipmentIndex(t);this.result.getUnassignedShipments().includes(e)&&(this.result.getRaw().unassignedShipments||(this.result.getRaw().unassignedShipments=[]),this.result.getRaw().unassignedShipments=this.result.getRaw().unassignedShipments.filter((t=>t!=e)))}))}getUnassignedJobs(t){return t.getUnassignedJobs().map((t=>this.result.getRaw().inputData.jobs[t].id))}getUnassignedShipments(t){return t.getUnassignedShipments().map((t=>this.result.getRaw().inputData.shipments[t].id))}}class R extends I{assignJobs(e,i){return t(this,void 0,void 0,(function*(){this.validateAgent(e),this.validateJobs(i,e);for(const t of i)yield this.assignJob(t,e);return!0}))}removeJobs(e){return t(this,void 0,void 0,(function*(){this.validateJobs(e);for(const t of e)yield this.removeJob(t);return!0}))}addNewJobs(e,i){return t(this,void 0,void 0,(function*(){let t=i.map((t=>t.getRaw()));return this.validateAgent(e),this.validateNewJobs(t),yield this.addNewJobsToAgent(e,t),!0}))}assignJob(e,i){return t(this,void 0,void 0,(function*(){let t=this.result.getJobInfo(e),n=this.result.getAgentSolution(i);n&&t&&(yield this.addJobToExistingAgent(i,e),yield this.removeJobFromExistingAgent(t)),n&&!t&&(yield this.addJobToExistingAgent(i,e)),!n&&t&&(yield this.addJobToNonExistingAgent(i,e),yield this.removeJobFromExistingAgent(t)),n||t||(yield this.addJobToNonExistingAgent(i,e))}))}removeJob(e){return t(this,void 0,void 0,(function*(){let t=this.result.getJobInfo(e);if(t)yield this.removeJobFromExistingAgent(t);else{let t=this.getInitialJobIndex(e);this.result.getRaw().unassignedJobs=this.result.getRaw().unassignedJobs.filter((e=>e!==t))}}))}addNewJobsToAgent(e,i){return t(this,void 0,void 0,(function*(){let t=this.result.getAgentSolution(e);this.result.getRaw().inputData.jobs.push(...i);let n=this.addJobsToAgent(e,i.map((t=>t.id)),t),s=yield this.optimizeRoute(n);this.updateAgent(s)}))}addJobToNonExistingAgent(e,i){return t(this,void 0,void 0,(function*(){let t=this.addJobsToAgent(e,[i]),n=yield this.optimizeRoute(t);this.updateAgent(n)}))}addJobToExistingAgent(e,i){return t(this,void 0,void 0,(function*(){let t=this.result.getAgentSolution(e),n=this.addJobsToAgent(e,[i],t),s=yield this.optimizeRoute(n);this.updateAgent(s)}))}removeJobFromExistingAgent(e){return t(this,void 0,void 0,(function*(){let t=e.getAgent(),i=this.removeJobFromAgent(t,e.getAction().getJobId()),n=yield this.optimizeRoute(i);this.updateAgent(n)}))}addJobsToAgent(t,e,i){let n=this.generateOptimizeAgentInput(t,i);return e.forEach((t=>{n.agentJobIds.add(t)})),n}removeJobFromAgent(t,e){let i=this.generateOptimizeAgentInput(t.getAgentId(),t);return i.agentJobIds.delete(e),i}validateJobs(t,e){if(0==t.length)throw new Error("No jobs provided");if(!this.checkIfArrayIsUnique(t))throw new Error("Jobs are not unique");t.forEach((t=>{let i=this.result.getJobInfo(t);if(null==i&&this.validateJobExists(t),e&&(null==i?void 0:i.getAgentId())==e)throw new Error(`Job with id ${t} already assigned to agent ${e}`)}))}validateJobExists(t){let e=this.getInitialJobIndex(t);if(-1==e)throw new Error(`Job with id ${t} not found`);if(!this.result.getUnassignedJobs().includes(e))throw new Error(`Job with id ${t} not found`)}validateNewJobs(t){if(0==t.length)throw new Error("No jobs provided");if(!this.checkIfArrayIsUnique(t))throw new Error("Jobs are not unique");t.forEach((t=>{if(null==t.id)throw new Error("Job id is undefined")}))}}class x extends I{assignShipments(e,i){return t(this,void 0,void 0,(function*(){this.validateAgent(e),this.validateShipments(i,e);for(const t of i)yield this.assignShipment(t,e);return!0}))}removeShipments(e){return t(this,void 0,void 0,(function*(){this.validateShipments(e);for(const t of e)yield this.removeShipment(t);return!0}))}addNewShipments(e,i){return t(this,void 0,void 0,(function*(){let t=i.map((t=>t.getRaw()));return this.validateAgent(e),this.validateNewShipments(t),yield this.addNewShipmentsToAgent(e,t),!0}))}assignShipment(e,i){return t(this,void 0,void 0,(function*(){let t=this.result.getShipmentInfo(e),n=this.result.getAgentSolution(i);n&&t&&(yield this.addShipmentToExistingAgent(i,e),yield this.removeShipmentFromExistingAgent(t)),n&&!t&&(yield this.addShipmentToExistingAgent(i,e)),!n&&t&&(yield this.addShipmentToNonExistingAgent(i,e),yield this.removeShipmentFromExistingAgent(t)),n||t||(yield this.addShipmentToNonExistingAgent(i,e))}))}removeShipment(e){return t(this,void 0,void 0,(function*(){let t=this.result.getShipmentInfo(e);if(t)yield this.removeShipmentFromExistingAgent(t);else{let t=this.getInitialShipmentIndex(e);this.result.getRaw().unassignedShipments=this.result.getRaw().unassignedShipments.filter((e=>e!==t))}}))}addNewShipmentsToAgent(e,i){return t(this,void 0,void 0,(function*(){let t=this.result.getAgentSolution(e);this.result.getRaw().inputData.shipments.push(...i);let n=this.addShipmentsToAgent(e,i.map((t=>t.id)),t),s=yield this.optimizeRoute(n);this.updateAgent(s)}))}addShipmentToNonExistingAgent(e,i){return t(this,void 0,void 0,(function*(){let t=this.addShipmentsToAgent(e,[i]),n=yield this.optimizeRoute(t);this.updateAgent(n)}))}addShipmentToExistingAgent(e,i){return t(this,void 0,void 0,(function*(){let t=this.result.getAgentSolution(e),n=this.addShipmentsToAgent(e,[i],t),s=yield this.optimizeRoute(n);this.updateAgent(s)}))}removeShipmentFromExistingAgent(e){return t(this,void 0,void 0,(function*(){let t=e.getAgent(),i=this.removeShipmentFromAgent(t,e.getAction().getShipmentId()),n=yield this.optimizeRoute(i);this.updateAgent(n)}))}addShipmentsToAgent(t,e,i){let n=this.generateOptimizeAgentInput(t,i);return e.forEach((t=>{n.agentShipmentIds.add(t)})),n}removeShipmentFromAgent(t,e){let i=this.generateOptimizeAgentInput(t.getAgentId(),t);return i.agentShipmentIds.delete(e),i}validateShipments(t,e){if(0==t.length)throw new Error("No shipments provided");if(!this.checkIfArrayIsUnique(t))throw new Error("Shipments are not unique");t.forEach((t=>{let i=this.result.getShipmentInfo(t);if(null==i&&this.validateShipmentExists(t),e&&(null==i?void 0:i.getAgentId())==e)throw new Error(`Shipment with id ${t} already assigned to agent ${e}`)}))}validateShipmentExists(t){let e=this.getInitialShipmentIndex(t);if(-1==e)throw new Error(`Shipment with id ${t} not found`);if(!this.result.getUnassignedShipments().includes(e))throw new Error(`Shipment with id ${t} not found`)}validateNewShipments(t){if(0==t.length)throw new Error("No shipments provided");if(!this.checkIfArrayIsUnique(t))throw new Error("Shipments are not unique");t.forEach((t=>{if(null==t.id)throw new Error("Shipment id is undefined")}))}}class _{constructor(t){this.result=new A(f.cloneObject(t.getOptions()),f.cloneObject(t.getRaw()))}assignJobs(e,i){return t(this,void 0,void 0,(function*(){return new R(this.result).assignJobs(e,i)}))}assignShipments(e,i){return t(this,void 0,void 0,(function*(){return new x(this.result).assignShipments(e,i)}))}removeJobs(e){return t(this,void 0,void 0,(function*(){return new R(this.result).removeJobs(e)}))}removeShipments(e){return t(this,void 0,void 0,(function*(){return new x(this.result).removeShipments(e)}))}addNewJobs(t,e){return new R(this.result).addNewJobs(t,e)}addNewShipments(t,e){return new x(this.result).addNewShipments(t,e)}getModifiedResult(){return this.result}}"undefined"!=typeof window&&(window.RoutePlannerSDK=Object.assign({RoutePlanner:S,RouteEditor:_},m));export{e as Agent,w as AgentSolution,n as Avoid,s as Break,i as Coordinates,r as Job,a as Location,g as RouteAction,p as RouteActionInfo,u as RouteLeg,d as RouteLegStep,S as RoutePlanner,c as RoutePlannerError,_ as RoutePlannerResultEditor,o as Shipment,h as ShipmentStep,l as Waypoint,S as default};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWluLmVzbS5qcyIsInNvdXJjZXMiOlsiLi4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIi4uL3NyYy9tb2RlbHMvZW50aXRpZXMvbmVzdGVkL2lucHV0L2FnZW50LnRzIiwiLi4vc3JjL21vZGVscy9lbnRpdGllcy9uZXN0ZWQvaW5wdXQvY29vcmRpbmF0ZXMudHMiLCIuLi9zcmMvbW9kZWxzL2VudGl0aWVzL25lc3RlZC9pbnB1dC9hdm9pZC50cyIsIi4uL3NyYy9tb2RlbHMvZW50aXRpZXMvbmVzdGVkL2lucHV0L2JyZWFrLnRzIiwiLi4vc3JjL21vZGVscy9lbnRpdGllcy9uZXN0ZWQvaW5wdXQvam9iLnRzIiwiLi4vc3JjL21vZGVscy9lbnRpdGllcy9uZXN0ZWQvaW5wdXQvbG9jYXRpb24udHMiLCIuLi9zcmMvbW9kZWxzL2VudGl0aWVzL25lc3RlZC9pbnB1dC9zaGlwbWVudC50cyIsIi4uL3NyYy9tb2RlbHMvZW50aXRpZXMvbmVzdGVkL2lucHV0L3NoaXBtZW50LXN0ZXAudHMiLCIuLi9zcmMvbW9kZWxzL2VudGl0aWVzL25lc3RlZC9yZXN1bHQvcm91dGUtbGVnLXN0ZXAudHMiLCIuLi9zcmMvbW9kZWxzL2VudGl0aWVzL25lc3RlZC9yZXN1bHQvcm91dGUtbGVnLnRzIiwiLi4vc3JjL21vZGVscy9lbnRpdGllcy9uZXN0ZWQvcmVzdWx0L3JvdXRlLWFjdGlvbi50cyIsIi4uL3NyYy9tb2RlbHMvZW50aXRpZXMvbmVzdGVkL3Jlc3VsdC93YXlwb2ludC50cyIsIi4uL3NyYy9tb2RlbHMvZW50aXRpZXMvbmVzdGVkL3Jlc3VsdC9hZ2VudC1zb2x1dGlvbi50cyIsIi4uL3NyYy9tb2RlbHMvZW50aXRpZXMvbmVzdGVkL3Jlc3VsdC9yb3V0ZS1hY3Rpb24taW5mby50cyIsIi4uL3NyYy9tb2RlbHMvZW50aXRpZXMvcm91dGUtcGxhbm5lci1lcnJvci50cyIsIi4uL3NyYy90b29scy91dGlscy50cyIsIi4uL3NyYy9tb2RlbHMvZW50aXRpZXMvcm91dGUtcGxhbm5lci1yZXN1bHQudHMiLCIuLi9zcmMvdG9vbHMvcm91dGUtcGxhbm5lci1yZXN1bHQtY29udmVydGVyLnRzIiwiLi4vc3JjL3JvdXRlLXBsYW5uZXIudHMiLCIuLi9zcmMvdG9vbHMvZmV0Y2gudHMiLCIuLi9zcmMvdG9vbHMvcm91dGUtZWRpdG9yL29wdGltaXplLWFnZW50LWlucHV0LnRzIiwiLi4vc3JjL3Rvb2xzL3JvdXRlLWVkaXRvci9yb3V0ZS1yZXN1bHQtZWRpdG9yLWJhc2UudHMiLCIuLi9zcmMvdG9vbHMvcm91dGUtZWRpdG9yL3JvdXRlLXJlc3VsdC1qb2ItZWRpdG9yLnRzIiwiLi4vc3JjL3Rvb2xzL3JvdXRlLWVkaXRvci9yb3V0ZS1yZXN1bHQtc2hpcG1lbnQtZWRpdG9yLnRzIiwiLi4vc3JjL3JvdXRlLXBsYW5uZXItcmVzdWx0LWVkaXRvci50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sLCBJdGVyYXRvciAqL1xyXG5cclxudmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7XHJcbiAgICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLCBwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xyXG4gICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhiKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XHJcbiAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19hc3NpZ24gPSBmdW5jdGlvbigpIHtcclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XHJcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XHJcbiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07XHJcbiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Jlc3QocywgZSkge1xyXG4gICAgdmFyIHQgPSB7fTtcclxuICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgIHRbcF0gPSBzW3BdO1xyXG4gICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKVxyXG4gICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgfVxyXG4gICAgcmV0dXJuIHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2RlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkO1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wYXJhbShwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XHJcbiAgICBmdW5jdGlvbiBhY2NlcHQoZikgeyBpZiAoZiAhPT0gdm9pZCAwICYmIHR5cGVvZiBmICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGdW5jdGlvbiBleHBlY3RlZFwiKTsgcmV0dXJuIGY7IH1cclxuICAgIHZhciBraW5kID0gY29udGV4dEluLmtpbmQsIGtleSA9IGtpbmQgPT09IFwiZ2V0dGVyXCIgPyBcImdldFwiIDoga2luZCA9PT0gXCJzZXR0ZXJcIiA/IFwic2V0XCIgOiBcInZhbHVlXCI7XHJcbiAgICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcclxuICAgIHZhciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvckluIHx8ICh0YXJnZXQgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgY29udGV4dEluLm5hbWUpIDoge30pO1xyXG4gICAgdmFyIF8sIGRvbmUgPSBmYWxzZTtcclxuICAgIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbikgY29udGV4dFtwXSA9IHAgPT09IFwiYWNjZXNzXCIgPyB7fSA6IGNvbnRleHRJbltwXTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcclxuICAgICAgICBjb250ZXh0LmFkZEluaXRpYWxpemVyID0gZnVuY3Rpb24gKGYpIHsgaWYgKGRvbmUpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIGluaXRpYWxpemVycyBhZnRlciBkZWNvcmF0aW9uIGhhcyBjb21wbGV0ZWRcIik7IGV4dHJhSW5pdGlhbGl6ZXJzLnB1c2goYWNjZXB0KGYgfHwgbnVsbCkpOyB9O1xyXG4gICAgICAgIHZhciByZXN1bHQgPSAoMCwgZGVjb3JhdG9yc1tpXSkoa2luZCA9PT0gXCJhY2Nlc3NvclwiID8geyBnZXQ6IGRlc2NyaXB0b3IuZ2V0LCBzZXQ6IGRlc2NyaXB0b3Iuc2V0IH0gOiBkZXNjcmlwdG9yW2tleV0sIGNvbnRleHQpO1xyXG4gICAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdm9pZCAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVzdWx0ICE9PSBcIm9iamVjdFwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuc2V0KSkgZGVzY3JpcHRvci5zZXQgPSBfO1xyXG4gICAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuaW5pdCkpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChfID0gYWNjZXB0KHJlc3VsdCkpIHtcclxuICAgICAgICAgICAgaWYgKGtpbmQgPT09IFwiZmllbGRcIikgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XHJcbiAgICBkb25lID0gdHJ1ZTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3J1bkluaXRpYWxpemVycyh0aGlzQXJnLCBpbml0aWFsaXplcnMsIHZhbHVlKSB7XHJcbiAgICB2YXIgdXNlVmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMjtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFsdWUgPSB1c2VWYWx1ZSA/IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcsIHZhbHVlKSA6IGluaXRpYWxpemVyc1tpXS5jYWxsKHRoaXNBcmcpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcclxuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gXCJzeW1ib2xcIiA/IHggOiBcIlwiLmNvbmNhdCh4KTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NldEZ1bmN0aW9uTmFtZShmLCBuYW1lLCBwcmVmaXgpIHtcclxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgbmFtZSA9IG5hbWUuZGVzY3JpcHRpb24gPyBcIltcIi5jb25jYXQobmFtZS5kZXNjcmlwdGlvbiwgXCJdXCIpIDogXCJcIjtcclxuICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZyA9IE9iamVjdC5jcmVhdGUoKHR5cGVvZiBJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSk7XHJcbiAgICByZXR1cm4gZy5uZXh0ID0gdmVyYigwKSwgZ1tcInRocm93XCJdID0gdmVyYigxKSwgZ1tcInJldHVyblwiXSA9IHZlcmIoMiksIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcclxuICAgIGlmICghZGVzYyB8fCAoXCJnZXRcIiBpbiBkZXNjID8gIW0uX19lc01vZHVsZSA6IGRlc2Mud3JpdGFibGUgfHwgZGVzYy5jb25maWd1cmFibGUpKSB7XHJcbiAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcclxuICAgIH1cclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XHJcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgb1trMl0gPSBtW2tdO1xyXG59KTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgbykge1xyXG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xyXG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG8pO1xyXG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDtcclxuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xyXG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgZmluYWxseSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkKCkge1xyXG4gICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgcmV0dXJuIGFyO1xyXG59XHJcblxyXG4vKiogQGRlcHJlY2F0ZWQgKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xyXG4gICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICBmb3IgKHZhciByID0gQXJyYXkocyksIGsgPSAwLCBpID0gMDsgaSA8IGlsOyBpKyspXHJcbiAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgcmV0dXJuIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3NwcmVhZEFycmF5KHRvLCBmcm9tLCBwYWNrKSB7XHJcbiAgICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcclxuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcclxuICAgICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XHJcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcclxuICAgIHJldHVybiBpID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEFzeW5jSXRlcmF0b3IgPT09IFwiZnVuY3Rpb25cIiA/IEFzeW5jSXRlcmF0b3IgOiBPYmplY3QpLnByb3RvdHlwZSksIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiwgYXdhaXRSZXR1cm4pLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiBhd2FpdFJldHVybihmKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZiwgcmVqZWN0KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlmIChnW25dKSB7IGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IGlmIChmKSBpW25dID0gZihpW25dKTsgfSB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX21ha2VUZW1wbGF0ZU9iamVjdChjb29rZWQsIHJhdykge1xyXG4gICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgIHJldHVybiBjb29rZWQ7XHJcbn07XHJcblxyXG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XHJcbn0pIDogZnVuY3Rpb24obywgdikge1xyXG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xyXG59O1xyXG5cclxudmFyIG93bktleXMgPSBmdW5jdGlvbihvKSB7XHJcbiAgICBvd25LZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICB2YXIgYXIgPSBbXTtcclxuICAgICAgICBmb3IgKHZhciBrIGluIG8pIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykpIGFyW2FyLmxlbmd0aF0gPSBrO1xyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcbiAgICByZXR1cm4gb3duS2V5cyhvKTtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrID0gb3duS2V5cyhtb2QpLCBpID0gMDsgaSA8IGsubGVuZ3RoOyBpKyspIGlmIChrW2ldICE9PSBcImRlZmF1bHRcIikgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrW2ldKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xyXG4gICAgICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcclxuICAgICAgICBpZiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xyXG4gICAgICAgICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xyXG4gICAgICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChhc3luYykge1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcblxyXG59XHJcblxyXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcclxuICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xyXG4gICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcclxuICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdmFyIHIsIHMgPSAwO1xyXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcclxuICAgICAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoci5kaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHMgfD0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgZmFpbChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dCgpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXdyaXRlUmVsYXRpdmVJbXBvcnRFeHRlbnNpb24ocGF0aCwgcHJlc2VydmVKc3gpIHtcclxuICAgIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIiAmJiAvXlxcLlxcLj9cXC8vLnRlc3QocGF0aCkpIHtcclxuICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKC9cXC4odHN4KSR8KCg/OlxcLmQpPykoKD86XFwuW14uL10rPyk/KVxcLihbY21dPyl0cyQvaSwgZnVuY3Rpb24gKG0sIHRzeCwgZCwgZXh0LCBjbSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdHN4ID8gcHJlc2VydmVKc3ggPyBcIi5qc3hcIiA6IFwiLmpzXCIgOiBkICYmICghZXh0IHx8ICFjbSkgPyBtIDogKGQgKyBleHQgKyBcIi5cIiArIGNtLnRvTG93ZXJDYXNlKCkgKyBcImpzXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBhdGg7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdW