|
- <!DOCTYPE html>
- <html>
- <meta charset="utf-8">
- <head>
- <style>
- </style>
- </head>
- <body>
- <script>
- /*
- localForage -- Offline Storage, Improved
- Version 1.7.3
- https://localforage.github.io/localForage
- (c) 2013-2017 Mozilla, Apache License 2.0
- */
- !function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.localforage=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c||a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){(function(a){"use strict";function c(){k=!0;for(var a,b,c=l.length;c;){for(b=l,l=[],a=-1;++a<c;)b[a]();c=l.length}k=!1}function d(a){1!==l.push(a)||k||e()}var e,f=a.MutationObserver||a.WebKitMutationObserver;if(f){var g=0,h=new f(c),i=a.document.createTextNode("");h.observe(i,{characterData:!0}),e=function(){i.data=g=++g%2}}else if(a.setImmediate||void 0===a.MessageChannel)e="document"in a&&"onreadystatechange"in a.document.createElement("script")?function(){var b=a.document.createElement("script");b.onreadystatechange=function(){c(),b.onreadystatechange=null,b.parentNode.removeChild(b),b=null},a.document.documentElement.appendChild(b)}:function(){setTimeout(c,0)};else{var j=new a.MessageChannel;j.port1.onmessage=c,e=function(){j.port2.postMessage(0)}}var k,l=[];b.exports=d}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],2:[function(a,b,c){"use strict";function d(){}function e(a){if("function"!=typeof a)throw new TypeError("resolver must be a function");this.state=s,this.queue=[],this.outcome=void 0,a!==d&&i(this,a)}function f(a,b,c){this.promise=a,"function"==typeof b&&(this.onFulfilled=b,this.callFulfilled=this.otherCallFulfilled),"function"==typeof c&&(this.onRejected=c,this.callRejected=this.otherCallRejected)}function g(a,b,c){o(function(){var d;try{d=b(c)}catch(b){return p.reject(a,b)}d===a?p.reject(a,new TypeError("Cannot resolve promise with itself")):p.resolve(a,d)})}function h(a){var b=a&&a.then;if(a&&("object"==typeof a||"function"==typeof a)&&"function"==typeof b)return function(){b.apply(a,arguments)}}function i(a,b){function c(b){f||(f=!0,p.reject(a,b))}function d(b){f||(f=!0,p.resolve(a,b))}function e(){b(d,c)}var f=!1,g=j(e);"error"===g.status&&c(g.value)}function j(a,b){var c={};try{c.value=a(b),c.status="success"}catch(a){c.status="error",c.value=a}return c}function k(a){return a instanceof this?a:p.resolve(new this(d),a)}function l(a){var b=new this(d);return p.reject(b,a)}function m(a){function b(a,b){function d(a){g[b]=a,++h!==e||f||(f=!0,p.resolve(j,g))}c.resolve(a).then(d,function(a){f||(f=!0,p.reject(j,a))})}var c=this;if("[object Array]"!==Object.prototype.toString.call(a))return this.reject(new TypeError("must be an array"));var e=a.length,f=!1;if(!e)return this.resolve([]);for(var g=new Array(e),h=0,i=-1,j=new this(d);++i<e;)b(a[i],i);return j}function n(a){function b(a){c.resolve(a).then(function(a){f||(f=!0,p.resolve(h,a))},function(a){f||(f=!0,p.reject(h,a))})}var c=this;if("[object Array]"!==Object.prototype.toString.call(a))return this.reject(new TypeError("must be an array"));var e=a.length,f=!1;if(!e)return this.resolve([]);for(var g=-1,h=new this(d);++g<e;)b(a[g]);return h}var o=a(1),p={},q=["REJECTED"],r=["FULFILLED"],s=["PENDING"];b.exports=e,e.prototype.catch=function(a){return this.then(null,a)},e.prototype.then=function(a,b){if("function"!=typeof a&&this.state===r||"function"!=typeof b&&this.state===q)return this;var c=new this.constructor(d);if(this.state!==s){g(c,this.state===r?a:b,this.outcome)}else this.queue.push(new f(c,a,b));return c},f.prototype.callFulfilled=function(a){p.resolve(this.promise,a)},f.prototype.otherCallFulfilled=function(a){g(this.promise,this.onFulfilled,a)},f.prototype.callRejected=function(a){p.reject(this.promise,a)},f.prototype.otherCallRejected=function(a){g(this.promise,this.onRejected,a)},p.resolve=function(a,b){var c=j(h,b);if("error"===c.status)return p.reject(a,c.value);var d=c.value;if(d)i(a,d);else{a.state=r,a.outcome=b;for(var e=-1,f=a.queue.length;++e<f;)a.queue[e].callFulfilled(b)}return a},p.reject=function(a,b){a.state=q,a.outcome=b;for(var c=-1,d=a.queue.length;++c<d;)a.queue[c].callRejected(b);return a},e.resolve=k,e.reject=l,e.all=m,e.race=n},{1:1}],3:[function(a,b,c){(function(b){"use strict";"function"!=typeof b.Promise&&(b.Promise=a(2))}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{2:2}],4:[function(a,b,c){"use strict";function d(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function e(){try{if("undefined"!=typeof indexedDB)return indexedDB;if("undefined"!=typeof webkitIndexedDB)return webkitIndexedDB;if("undefined"!=typeof mozIndexedDB)return mozIndexedDB;if("undefined"!=typeof OIndexedDB)return OIndexedDB;if("undefined"!=typeof msIndexedDB)return msIndexedDB}catch(a){return}}function f(){try{if(!ua)return!1;var a="undefined"!=typeof openDatabase&&/(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/BlackBerry/.test(navigator.platform),b="function"==typeof fetch&&-1!==fetch.toString().indexOf("[native code");return(!a||b)&&"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(a){return!1}}function g(a,b){a=a||[],b=b||{};try{return new Blob(a,b)}catch(f){if("TypeError"!==f.name)throw f;for(var c="undefined"!=typeof BlobBuilder?BlobBuilder:"undefined"!=typeof MSBlobBuilder?MSBlobBuilder:"undefined"!=typeof MozBlobBuilder?MozBlobBuilder:WebKitBlobBuilder,d=new c,e=0;e<a.length;e+=1)d.append(a[e]);return d.getBlob(b.type)}}function h(a,b){b&&a.then(function(a){b(null,a)},function(a){b(a)})}function i(a,b,c){"function"==typeof b&&a.then(b),"function"==typeof c&&a.catch(c)}function j(a){return"string"!=typeof a&&(console.warn(a+" used as a key, but it is not a string."),a=String(a)),a}function k(){if(arguments.length&&"function"==typeof arguments[arguments.length-1])return arguments[arguments.length-1]}function l(a){for(var b=a.length,c=new ArrayBuffer(b),d=new Uint8Array(c),e=0;e<b;e++)d[e]=a.charCodeAt(e);return c}function m(a){return new va(function(b){var c=a.transaction(wa,Ba),d=g([""]);c.objectStore(wa).put(d,"key"),c.onabort=function(a){a.preventDefault(),a.stopPropagation(),b(!1)},c.oncomplete=function(){var a=navigator.userAgent.match(/Chrome\/(\d+)/),c=navigator.userAgent.match(/Edge\//);b(c||!a||parseInt(a[1],10)>=43)}}).catch(function(){return!1})}function n(a){return"boolean"==typeof xa?va.resolve(xa):m(a).then(function(a){return xa=a})}function o(a){var b=ya[a.name],c={};c.promise=new va(function(a,b){c.resolve=a,c.reject=b}),b.deferredOperations.push(c),b.dbReady?b.dbReady=b.dbReady.then(function(){return c.promise}):b.dbReady=c.promise}function p(a){var b=ya[a.name],c=b.deferredOperations.pop();if(c)return c.resolve(),c.promise}function q(a,b){var c=ya[a.name],d=c.deferredOperations.pop();if(d)return d.reject(b),d.promise}function r(a,b){return new va(function(c,d){if(ya[a.name]=ya[a.name]||B(),a.db){if(!b)return c(a.db);o(a),a.db.close()}var e=[a.name];b&&e.push(a.version);var f=ua.open.apply(ua,e);b&&(f.onupgradeneeded=function(b){var c=f.result;try{c.createObjectStore(a.storeName),b.oldVersion<=1&&c.createObjectStore(wa)}catch(c){if("ConstraintError"!==c.name)throw c;console.warn('The database "'+a.name+'" has been upgraded from version '+b.oldVersion+" to version "+b.newVersion+', but the storage "'+a.storeName+'" already exists.')}}),f.onerror=function(a){a.preventDefault(),d(f.error)},f.onsuccess=function(){c(f.result),p(a)}})}function s(a){return r(a,!1)}function t(a){return r(a,!0)}function u(a,b){if(!a.db)return!0;var c=!a.db.objectStoreNames.contains(a.storeName),d=a.version<a.db.version,e=a.version>a.db.version;if(d&&(a.version!==b&&console.warn('The database "'+a.name+"\" can't be downgraded from version "+a.db.version+" to version "+a.version+"."),a.version=a.db.version),e||c){if(c){var f=a.db.version+1;f>a.version&&(a.version=f)}return!0}return!1}function v(a){return new va(function(b,c){var d=new FileReader;d.onerror=c,d.onloadend=function(c){var d=btoa(c.target.result||"");b({__local_forage_encoded_blob:!0,data:d,type:a.type})},d.readAsBinaryString(a)})}function w(a){return g([l(atob(a.data))],{type:a.type})}function x(a){return a&&a.__local_forage_encoded_blob}function y(a){var b=this,c=b._initReady().then(function(){var a=ya[b._dbInfo.name];if(a&&a.dbReady)return a.dbReady});return i(c,a,a),c}function z(a){o(a);for(var b=ya[a.name],c=b.forages,d=0;d<c.length;d++){var e=c[d];e._dbInfo.db&&(e._dbInfo.db.close(),e._dbInfo.db=null)}return a.db=null,s(a).then(function(b){return a.db=b,u(a)?t(a):b}).then(function(d){a.db=b.db=d;for(var e=0;e<c.length;e++)c[e]._dbInfo.db=d}).catch(function(b){throw q(a,b),b})}function A(a,b,c,d){void 0===d&&(d=1);try{var e=a.db.transaction(a.storeName,b);c(null,e)}catch(e){if(d>0&&(!a.db||"InvalidStateError"===e.name||"NotFoundError"===e.name))return va.resolve().then(function(){if(!a.db||"NotFoundError"===e.name&&!a.db.objectStoreNames.contains(a.storeName)&&a.version<=a.db.version)return a.db&&(a.version=a.db.version+1),t(a)}).then(function(){return z(a).then(function(){A(a,b,c,d-1)})}).catch(c);c(e)}}function B(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function C(a){function b(){return va.resolve()}var c=this,d={db:null};if(a)for(var e in a)d[e]=a[e];var f=ya[d.name];f||(f=B(),ya[d.name]=f),f.forages.push(c),c._initReady||(c._initReady=c.ready,c.ready=y);for(var g=[],h=0;h<f.forages.length;h++){var i=f.forages[h];i!==c&&g.push(i._initReady().catch(b))}var j=f.forages.slice(0);return va.all(g).then(function(){return d.db=f.db,s(d)}).then(function(a){return d.db=a,u(d,c._defaultConfig.version)?t(d):a}).then(function(a){d.db=f.db=a,c._dbInfo=d;for(var b=0;b<j.length;b++){var e=j[b];e!==c&&(e._dbInfo.db=d.db,e._dbInfo.version=d.version)}})}function D(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){A(c._dbInfo,Aa,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.get(a);h.onsuccess=function(){var a=h.result;void 0===a&&(a=null),x(a)&&(a=w(a)),b(a)},h.onerror=function(){d(h.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function E(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){A(c._dbInfo,Aa,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.openCursor(),i=1;h.onsuccess=function(){var c=h.result;if(c){var d=c.value;x(d)&&(d=w(d));var e=a(d,c.key,i++);void 0!==e?b(e):c.continue()}else b()},h.onerror=function(){d(h.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function F(a,b,c){var d=this;a=j(a);var e=new va(function(c,e){var f;d.ready().then(function(){return f=d._dbInfo,"[object Blob]"===za.call(b)?n(f.db).then(function(a){return a?b:v(b)}):b}).then(function(b){A(d._dbInfo,Ba,function(f,g){if(f)return e(f);try{var h=g.objectStore(d._dbInfo.storeName);null===b&&(b=void 0);var i=h.put(b,a);g.oncomplete=function(){void 0===b&&(b=null),c(b)},g.onabort=g.onerror=function(){var a=i.error?i.error:i.transaction.error;e(a)}}catch(a){e(a)}})}).catch(e)});return h(e,c),e}function G(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){A(c._dbInfo,Ba,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.delete(a);f.oncomplete=function(){b()},f.onerror=function(){d(h.error)},f.onabort=function(){var a=h.error?h.error:h.transaction.error;d(a)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function H(a){var b=this,c=new va(function(a,c){b.ready().then(function(){A(b._dbInfo,Ba,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.clear();e.oncomplete=function(){a()},e.onabort=e.onerror=function(){var a=g.error?g.error:g.transaction.error;c(a)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function I(a){var b=this,c=new va(function(a,c){b.ready().then(function(){A(b._dbInfo,Aa,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.count();g.onsuccess=function(){a(g.result)},g.onerror=function(){c(g.error)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function J(a,b){var c=this,d=new va(function(b,d){if(a<0)return void b(null);c.ready().then(function(){A(c._dbInfo,Aa,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=!1,i=g.openCursor();i.onsuccess=function(){var c=i.result;if(!c)return void b(null);0===a?b(c.key):h?b(c.key):(h=!0,c.advance(a))},i.onerror=function(){d(i.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function K(a){var b=this,c=new va(function(a,c){b.ready().then(function(){A(b._dbInfo,Aa,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.openCursor(),h=[];g.onsuccess=function(){var b=g.result;if(!b)return void a(h);h.push(b.key),b.continue()},g.onerror=function(){c(g.error)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function L(a,b){b=k.apply(this,arguments);var c=this.config();a="function"!=typeof a&&a||{},a.name||(a.name=a.name||c.name,a.storeName=a.storeName||c.storeName);var d,e=this;if(a.name){var f=a.name===c.name&&e._dbInfo.db,g=f?va.resolve(e._dbInfo.db):s(a).then(function(b){var c=ya[a.name],d=c.forages;c.db=b;for(var e=0;e<d.length;e++)d[e]._dbInfo.db=b;return b});d=a.storeName?g.then(function(b){if(b.objectStoreNames.contains(a.storeName)){var c=b.version+1;o(a);var d=ya[a.name],e=d.forages;b.close();for(var f=0;f<e.length;f++){var g=e[f];g._dbInfo.db=null,g._dbInfo.version=c}return new va(function(b,d){var e=ua.open(a.name,c);e.onerror=function(a){e.result.close(),d(a)},e.onupgradeneeded=function(){e.result.deleteObjectStore(a.storeName)},e.onsuccess=function(){var a=e.result;a.close(),b(a)}}).then(function(a){d.db=a;for(var b=0;b<e.length;b++){var c=e[b];c._dbInfo.db=a,p(c._dbInfo)}}).catch(function(b){throw(q(a,b)||va.resolve()).catch(function(){}),b})}}):g.then(function(b){o(a);var c=ya[a.name],d=c.forages;b.close();for(var e=0;e<d.length;e++){d[e]._dbInfo.db=null}return new va(function(b,c){var d=ua.deleteDatabase(a.name);d.onerror=d.onblocked=function(a){var b=d.result;b&&b.close(),c(a)},d.onsuccess=function(){var a=d.result;a&&a.close(),b(a)}}).then(function(a){c.db=a;for(var b=0;b<d.length;b++)p(d[b]._dbInfo)}).catch(function(b){throw(q(a,b)||va.resolve()).catch(function(){}),b})})}else d=va.reject("Invalid arguments");return h(d,b),d}function M(){return"function"==typeof openDatabase}function N(a){var b,c,d,e,f,g=.75*a.length,h=a.length,i=0;"="===a[a.length-1]&&(g--,"="===a[a.length-2]&&g--);var j=new ArrayBuffer(g),k=new Uint8Array(j);for(b=0;b<h;b+=4)c=Da.indexOf(a[b]),d=Da.indexOf(a[b+1]),e=Da.indexOf(a[b+2]),f=Da.indexOf(a[b+3]),k[i++]=c<<2|d>>4,k[i++]=(15&d)<<4|e>>2,k[i++]=(3&e)<<6|63&f;return j}function O(a){var b,c=new Uint8Array(a),d="";for(b=0;b<c.length;b+=3)d+=Da[c[b]>>2],d+=Da[(3&c[b])<<4|c[b+1]>>4],d+=Da[(15&c[b+1])<<2|c[b+2]>>6],d+=Da[63&c[b+2]];return c.length%3==2?d=d.substring(0,d.length-1)+"=":c.length%3==1&&(d=d.substring(0,d.length-2)+"=="),d}function P(a,b){var c="";if(a&&(c=Ua.call(a)),a&&("[object ArrayBuffer]"===c||a.buffer&&"[object ArrayBuffer]"===Ua.call(a.buffer))){var d,e=Ga;a instanceof ArrayBuffer?(d=a,e+=Ia):(d=a.buffer,"[object Int8Array]"===c?e+=Ka:"[object Uint8Array]"===c?e+=La:"[object Uint8ClampedArray]"===c?e+=Ma:"[object Int16Array]"===c?e+=Na:"[object Uint16Array]"===c?e+=Pa:"[object Int32Array]"===c?e+=Oa:"[object Uint32Array]"===c?e+=Qa:"[object Float32Array]"===c?e+=Ra:"[object Float64Array]"===c?e+=Sa:b(new Error("Failed to get type for BinaryArray"))),b(e+O(d))}else if("[object Blob]"===c){var f=new FileReader;f.onload=function(){var c=Ea+a.type+"~"+O(this.result);b(Ga+Ja+c)},f.readAsArrayBuffer(a)}else try{b(JSON.stringify(a))}catch(c){console.error("Couldn't convert value into a JSON string: ",a),b(null,c)}}function Q(a){if(a.substring(0,Ha)!==Ga)return JSON.parse(a);var b,c=a.substring(Ta),d=a.substring(Ha,Ta);if(d===Ja&&Fa.test(c)){var e=c.match(Fa);b=e[1],c=c.substring(e[0].length)}var f=N(c);switch(d){case Ia:return f;case Ja:return g([f],{type:b});case Ka:return new Int8Array(f);case La:return new Uint8Array(f);case Ma:return new Uint8ClampedArray(f);case Na:return new Int16Array(f);case Pa:return new Uint16Array(f);case Oa:return new Int32Array(f);case Qa:return new Uint32Array(f);case Ra:return new Float32Array(f);case Sa:return new Float64Array(f);default:throw new Error("Unkown type: "+d)}}function R(a,b,c,d){a.executeSql("CREATE TABLE IF NOT EXISTS "+b.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],c,d)}function S(a){var b=this,c={db:null};if(a)for(var d in a)c[d]="string"!=typeof a[d]?a[d].toString():a[d];var e=new va(function(a,d){try{c.db=openDatabase(c.name,String(c.version),c.description,c.size)}catch(a){return d(a)}c.db.transaction(function(e){R(e,c,function(){b._dbInfo=c,a()},function(a,b){d(b)})},d)});return c.serializer=Va,e}function T(a,b,c,d,e,f){a.executeSql(c,d,e,function(a,g){g.code===g.SYNTAX_ERR?a.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[b.storeName],function(a,h){h.rows.length?f(a,g):R(a,b,function(){a.executeSql(c,d,e,f)},f)},f):f(a,g)},f)}function U(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName+" WHERE key = ? LIMIT 1",[a],function(a,c){var d=c.rows.length?c.rows.item(0).value:null;d&&(d=e.serializer.deserialize(d)),b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function V(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName,[],function(c,d){for(var f=d.rows,g=f.length,h=0;h<g;h++){var i=f.item(h),j=i.value;if(j&&(j=e.serializer.deserialize(j)),void 0!==(j=a(j,i.key,h+1)))return void b(j)}b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function W(a,b,c,d){var e=this;a=j(a);var f=new va(function(f,g){e.ready().then(function(){void 0===b&&(b=null);var h=b,i=e._dbInfo;i.serializer.serialize(b,function(b,j){j?g(j):i.db.transaction(function(c){T(c,i,"INSERT OR REPLACE INTO "+i.storeName+" (key, value) VALUES (?, ?)",[a,b],function(){f(h)},function(a,b){g(b)})},function(b){if(b.code===b.QUOTA_ERR){if(d>0)return void f(W.apply(e,[a,h,c,d-1]));g(b)}})})}).catch(g)});return h(f,c),f}function X(a,b,c){return W.apply(this,[a,b,c,1])}function Y(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"DELETE FROM "+e.storeName+" WHERE key = ?",[a],function(){b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function Z(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"DELETE FROM "+d.storeName,[],function(){a()},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function $(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT COUNT(key) as c FROM "+d.storeName,[],function(b,c){var d=c.rows.item(0).c;a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function _(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT key FROM "+e.storeName+" WHERE id = ? LIMIT 1",[a+1],function(a,c){var d=c.rows.length?c.rows.item(0).key:null;b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function aa(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT key FROM "+d.storeName,[],function(b,c){for(var d=[],e=0;e<c.rows.length;e++)d.push(c.rows.item(e).key);a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function ba(a){return new va(function(b,c){a.transaction(function(d){d.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'",[],function(c,d){for(var e=[],f=0;f<d.rows.length;f++)e.push(d.rows.item(f).name);b({db:a,storeNames:e})},function(a,b){c(b)})},function(a){c(a)})})}function ca(a,b){b=k.apply(this,arguments);var c=this.config();a="function"!=typeof a&&a||{},a.name||(a.name=a.name||c.name,a.storeName=a.storeName||c.storeName);var d,e=this;return d=a.name?new va(function(b){var d;d=a.name===c.name?e._dbInfo.db:openDatabase(a.name,"","",0),b(a.storeName?{db:d,storeNames:[a.storeName]}:ba(d))}).then(function(a){return new va(function(b,c){a.db.transaction(function(d){function e(a){return new va(function(b,c){d.executeSql("DROP TABLE IF EXISTS "+a,[],function(){b()},function(a,b){c(b)})})}for(var f=[],g=0,h=a.storeNames.length;g<h;g++)f.push(e(a.storeNames[g]));va.all(f).then(function(){b()}).catch(function(a){c(a)})},function(a){c(a)})})}):va.reject("Invalid arguments"),h(d,b),d}function da(){try{return"undefined"!=typeof localStorage&&"setItem"in localStorage&&!!localStorage.setItem}catch(a){return!1}}function ea(a,b){var c=a.name+"/";return a.storeName!==b.storeName&&(c+=a.storeName+"/"),c}function fa(){var a="_localforage_support_test";try{return localStorage.setItem(a,!0),localStorage.removeItem(a),!1}catch(a){return!0}}function ga(){return!fa()||localStorage.length>0}function ha(a){var b=this,c={};if(a)for(var d in a)c[d]=a[d];return c.keyPrefix=ea(a,b._defaultConfig),ga()?(b._dbInfo=c,c.serializer=Va,va.resolve()):va.reject()}function ia(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo.keyPrefix,c=localStorage.length-1;c>=0;c--){var d=localStorage.key(c);0===d.indexOf(a)&&localStorage.removeItem(d)}});return h(c,a),c}function ja(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo,d=localStorage.getItem(b.keyPrefix+a);return d&&(d=b.serializer.deserialize(d)),d});return h(d,b),d}function ka(a,b){var c=this,d=c.ready().then(function(){for(var b=c._dbInfo,d=b.keyPrefix,e=d.length,f=localStorage.length,g=1,h=0;h<f;h++){var i=localStorage.key(h);if(0===i.indexOf(d)){var j=localStorage.getItem(i);if(j&&(j=b.serializer.deserialize(j)),void 0!==(j=a(j,i.substring(e),g++)))return j}}});return h(d,b),d}function la(a,b){var c=this,d=c.ready().then(function(){var b,d=c._dbInfo;try{b=localStorage.key(a)}catch(a){b=null}return b&&(b=b.substring(d.keyPrefix.length)),b});return h(d,b),d}function ma(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo,c=localStorage.length,d=[],e=0;e<c;e++){var f=localStorage.key(e);0===f.indexOf(a.keyPrefix)&&d.push(f.substring(a.keyPrefix.length))}return d});return h(c,a),c}function na(a){var b=this,c=b.keys().then(function(a){return a.length});return h(c,a),c}function oa(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo;localStorage.removeItem(b.keyPrefix+a)});return h(d,b),d}function pa(a,b,c){var d=this;a=j(a);var e=d.ready().then(function(){void 0===b&&(b=null);var c=b;return new va(function(e,f){var g=d._dbInfo;g.serializer.serialize(b,function(b,d){if(d)f(d);else try{localStorage.setItem(g.keyPrefix+a,b),e(c)}catch(a){"QuotaExceededError"!==a.name&&"NS_ERROR_DOM_QUOTA_REACHED"!==a.name||f(a),f(a)}})})});return h(e,c),e}function qa(a,b){if(b=k.apply(this,arguments),a="function"!=typeof a&&a||{},!a.name){var c=this.config();a.name=a.name||c.name,a.storeName=a.storeName||c.storeName}var d,e=this;return d=a.name?new va(function(b){b(a.storeName?ea(a,e._defaultConfig):a.name+"/")}).then(function(a){for(var b=localStorage.length-1;b>=0;b--){var c=localStorage.key(b);0===c.indexOf(a)&&localStorage.removeItem(c)}}):va.reject("Invalid arguments"),h(d,b),d}function ra(a,b){a[b]=function(){var c=arguments;return a.ready().then(function(){return a[b].apply(a,c)})}}function sa(){for(var a=1;a<arguments.length;a++){var b=arguments[a];if(b)for(var c in b)b.hasOwnProperty(c)&&($a(b[c])?arguments[0][c]=b[c].slice():arguments[0][c]=b[c])}return arguments[0]}var ta="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},ua=e();"undefined"==typeof Promise&&a(3);var va=Promise,wa="local-forage-detect-blob-support",xa=void 0,ya={},za=Object.prototype.toString,Aa="readonly",Ba="readwrite",Ca={_driver:"asyncStorage",_initStorage:C,_support:f(),iterate:E,getItem:D,setItem:F,removeItem:G,clear:H,length:I,key:J,keys:K,dropInstance:L},Da="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Ea="~~local_forage_type~",Fa=/^~~local_forage_type~([^~]+)~/,Ga="__lfsc__:",Ha=Ga.length,Ia="arbf",Ja="blob",Ka="si08",La="ui08",Ma="uic8",Na="si16",Oa="si32",Pa="ur16",Qa="ui32",Ra="fl32",Sa="fl64",Ta=Ha+Ia.length,Ua=Object.prototype.toString,Va={serialize:P,deserialize:Q,stringToBuffer:N,bufferToString:O},Wa={_driver:"webSQLStorage",_initStorage:S,_support:M(),iterate:V,getItem:U,setItem:X,removeItem:Y,clear:Z,length:$,key:_,keys:aa,dropInstance:ca},Xa={_driver:"localStorageWrapper",_initStorage:ha,_support:da(),iterate:ka,getItem:ja,setItem:pa,removeItem:oa,clear:ia,length:na,key:la,keys:ma,dropInstance:qa},Ya=function(a,b){return a===b||"number"==typeof a&&"number"==typeof b&&isNaN(a)&&isNaN(b)},Za=function(a,b){for(var c=a.length,d=0;d<c;){if(Ya(a[d],b))return!0;d++}return!1},$a=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},_a={},ab={},bb={INDEXEDDB:Ca,WEBSQL:Wa,LOCALSTORAGE:Xa},cb=[bb.INDEXEDDB._driver,bb.WEBSQL._driver,bb.LOCALSTORAGE._driver],db=["dropInstance"],eb=["clear","getItem","iterate","key","keys","length","removeItem","setItem"].concat(db),fb={description:"",driver:cb.slice(),name:"localforage",size:4980736,storeName:"keyvaluepairs",version:1},gb=function(){function a(b){d(this,a);for(var c in bb)if(bb.hasOwnProperty(c)){var e=bb[c],f=e._driver;this[c]=f,_a[f]||this.defineDriver(e)}this._defaultConfig=sa({},fb),this._config=sa({},this._defaultConfig,b),this._driverSet=null,this._initDriver=null,this._ready=!1,this._dbInfo=null,this._wrapLibraryMethodsWithReady(),this.setDriver(this._config.driver).catch(function(){})}return a.prototype.config=function(a){if("object"===(void 0===a?"undefined":ta(a))){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var b in a){if("storeName"===b&&(a[b]=a[b].replace(/\W/g,"_")),"version"===b&&"number"!=typeof a[b])return new Error("Database version must be a number.");this._config[b]=a[b]}return!("driver"in a&&a.driver)||this.setDriver(this._config.driver)}return"string"==typeof a?this._config[a]:this._config},a.prototype.defineDriver=function(a,b,c){var d=new va(function(b,c){try{var d=a._driver,e=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!a._driver)return void c(e);for(var f=eb.concat("_initStorage"),g=0,i=f.length;g<i;g++){var j=f[g];if((!Za(db,j)||a[j])&&"function"!=typeof a[j])return void c(e)}(function(){for(var b=function(a){return function(){var b=new Error("Method "+a+" is not implemented by the current driver"),c=va.reject(b);return h(c,arguments[arguments.length-1]),c}},c=0,d=db.length;c<d;c++){var e=db[c];a[e]||(a[e]=b(e))}})();var k=function(c){_a[d]&&console.info("Redefining LocalForage driver: "+d),_a[d]=a,ab[d]=c,b()};"_support"in a?a._support&&"function"==typeof a._support?a._support().then(k,c):k(!!a._support):k(!0)}catch(a){c(a)}});return i(d,b,c),d},a.prototype.driver=function(){return this._driver||null},a.prototype.getDriver=function(a,b,c){var d=_a[a]?va.resolve(_a[a]):va.reject(new Error("Driver not found."));return i(d,b,c),d},a.prototype.getSerializer=function(a){var b=va.resolve(Va);return i(b,a),b},a.prototype.ready=function(a){var b=this,c=b._driverSet.then(function(){return null===b._ready&&(b._ready=b._initDriver()),b._ready});return i(c,a,a),c},a.prototype.setDriver=function(a,b,c){function d(){g._config.driver=g.driver()}function e(a){return g._extend(a),d(),g._ready=g._initStorage(g._config),g._ready}function f(a){return function(){function b(){for(;c<a.length;){var f=a[c];return c++,g._dbInfo=null,g._ready=null,g.getDriver(f).then(e).catch(b)}d();var h=new Error("No available storage method found.");return g._driverSet=va.reject(h),g._driverSet}var c=0;return b()}}var g=this;$a(a)||(a=[a]);var h=this._getSupportedDrivers(a),j=null!==this._driverSet?this._driverSet.catch(function(){return va.resolve()}):va.resolve();return this._driverSet=j.then(function(){var a=h[0];return g._dbInfo=null,g._ready=null,g.getDriver(a).then(function(a){g._driver=a._driver,d(),g._wrapLibraryMethodsWithReady(),g._initDriver=f(h)})}).catch(function(){d();var a=new Error("No available storage method found.");return g._driverSet=va.reject(a),g._driverSet}),i(this._driverSet,b,c),this._driverSet},a.prototype.supports=function(a){return!!ab[a]},a.prototype._extend=function(a){sa(this,a)},a.prototype._getSupportedDrivers=function(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c];this.supports(e)&&b.push(e)}return b},a.prototype._wrapLibraryMethodsWithReady=function(){for(var a=0,b=eb.length;a<b;a++)ra(this,eb[a])},a.prototype.createInstance=function(b){return new a(b)},a}(),hb=new gb;b.exports=hb},{3:3}]},{},[4])(4)});
- </script>
- <script>
- /*
- https://github.com/solderjs/TextEncoderLite
- Apache 2.0
- */
- function TextEncoderLite(){}function TextDecoderLite(){}(function(){"use strict";function utf8ToBytes(string,units){units=units||Infinity;var codePoint;var length=string.length;var leadSurrogate=null;var bytes=[];var i=0;for(;i<length;i++){codePoint=string.charCodeAt(i);if(codePoint>55295&&codePoint<57344){if(leadSurrogate){if(codePoint<56320){if((units-=3)>-1)bytes.push(239,191,189);leadSurrogate=codePoint;continue}else{codePoint=leadSurrogate-55296<<10|codePoint-56320|65536;leadSurrogate=null}}else{if(codePoint>56319){if((units-=3)>-1)bytes.push(239,191,189);continue}else if(i+1===length){if((units-=3)>-1)bytes.push(239,191,189);continue}else{leadSurrogate=codePoint;continue}}}else if(leadSurrogate){if((units-=3)>-1)bytes.push(239,191,189);leadSurrogate=null}if(codePoint<128){if((units-=1)<0)break;bytes.push(codePoint)}else if(codePoint<2048){if((units-=2)<0)break;bytes.push(codePoint>>6|192,codePoint&63|128)}else if(codePoint<65536){if((units-=3)<0)break;bytes.push(codePoint>>12|224,codePoint>>6&63|128,codePoint&63|128)}else if(codePoint<2097152){if((units-=4)<0)break;bytes.push(codePoint>>18|240,codePoint>>12&63|128,codePoint>>6&63|128,codePoint&63|128)}else{throw new Error("Invalid code point")}}return bytes}function utf8Slice(buf,start,end){var res="";var tmp="";end=Math.min(buf.length,end||Infinity);start=start||0;for(var i=start;i<end;i++){if(buf[i]<=127){res+=decodeUtf8Char(tmp)+String.fromCharCode(buf[i]);tmp=""}else{tmp+="%"+buf[i].toString(16)}}return res+decodeUtf8Char(tmp)}function decodeUtf8Char(str){try{return decodeURIComponent(str)}catch(err){return String.fromCharCode(65533)}}TextEncoderLite.prototype.encode=function(str){var result;if("undefined"===typeof Uint8Array){result=utf8ToBytes(str)}else{result=new Uint8Array(utf8ToBytes(str))}return result};TextDecoderLite.prototype.decode=function(bytes){return utf8Slice(bytes,0,bytes.length)}})();if(typeof module==="object"&&module){module.exports.TextDecoderLite=TextDecoderLite;module.exports.TextEncoderLite=TextEncoderLite}
- </script>
- <script>
- /*
- https://github.com/beatgammit/base64-js
- MIT
- */
- (function(r){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=r()}else if(typeof define==="function"&&define.amd){define([],r)}else{var e;if(typeof window!=="undefined"){e=window}else if(typeof global!=="undefined"){e=global}else if(typeof self!=="undefined"){e=self}else{e=this}e.base64js=r()}})(function(){var r,e,n;return function(){function r(e,n,t){function o(f,i){if(!n[f]){if(!e[f]){var u="function"==typeof require&&require;if(!i&&u)return u(f,!0);if(a)return a(f,!0);var v=new Error("Cannot find module '"+f+"'");throw v.code="MODULE_NOT_FOUND",v}var d=n[f]={exports:{}};e[f][0].call(d.exports,function(r){var n=e[f][1][r];return o(n||r)},d,d.exports,r,e,n,t)}return n[f].exports}for(var a="function"==typeof require&&require,f=0;f<t.length;f++)o(t[f]);return o}return r}()({"/":[function(r,e,n){"use strict";n.byteLength=d;n.toByteArray=h;n.fromByteArray=p;var t=[];var o=[];var a=typeof Uint8Array!=="undefined"?Uint8Array:Array;var f="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";for(var i=0,u=f.length;i<u;++i){t[i]=f[i];o[f.charCodeAt(i)]=i}o["-".charCodeAt(0)]=62;o["_".charCodeAt(0)]=63;function v(r){var e=r.length;if(e%4>0){throw new Error("Invalid string. Length must be a multiple of 4")}var n=r.indexOf("=");if(n===-1)n=e;var t=n===e?0:4-n%4;return[n,t]}function d(r){var e=v(r);var n=e[0];var t=e[1];return(n+t)*3/4-t}function c(r,e,n){return(e+n)*3/4-n}function h(r){var e;var n=v(r);var t=n[0];var f=n[1];var i=new a(c(r,t,f));var u=0;var d=f>0?t-4:t;for(var h=0;h<d;h+=4){e=o[r.charCodeAt(h)]<<18|o[r.charCodeAt(h+1)]<<12|o[r.charCodeAt(h+2)]<<6|o[r.charCodeAt(h+3)];i[u++]=e>>16&255;i[u++]=e>>8&255;i[u++]=e&255}if(f===2){e=o[r.charCodeAt(h)]<<2|o[r.charCodeAt(h+1)]>>4;i[u++]=e&255}if(f===1){e=o[r.charCodeAt(h)]<<10|o[r.charCodeAt(h+1)]<<4|o[r.charCodeAt(h+2)]>>2;i[u++]=e>>8&255;i[u++]=e&255}return i}function s(r){return t[r>>18&63]+t[r>>12&63]+t[r>>6&63]+t[r&63]}function l(r,e,n){var t;var o=[];for(var a=e;a<n;a+=3){t=(r[a]<<16&16711680)+(r[a+1]<<8&65280)+(r[a+2]&255);o.push(s(t))}return o.join("")}function p(r){var e;var n=r.length;var o=n%3;var a=[];var f=16383;for(var i=0,u=n-o;i<u;i+=f){a.push(l(r,i,i+f>u?u:i+f))}if(o===1){e=r[n-1];a.push(t[e>>2]+t[e<<4&63]+"==")}else if(o===2){e=(r[n-2]<<8)+r[n-1];a.push(t[e>>10]+t[e>>4&63]+t[e<<2&63]+"=")}return a.join("")}},{}]},{},[])("/")});
- </script>
- <script>
- /*
- https://developer.mozilla.org/ru/docs/Web/API/WindowBase64/Base64_encoding_and_decoding
- */
- function base64Encode(str)
- {
- var bytes = new (TextEncoder || TextEncoderLite)("utf-8").encode(str);
- return base64js.fromByteArray(bytes);
- }
- function base64Decode(str)
- {
- var bytes = base64js.toByteArray(str);
- return new (TextDecoder || TextDecoderLite)("utf-8").decode(bytes);
- }
- </script>
- <script>
- // Create GUID / UUID in JavaScript?
- // https://stackoverflow.com/a/2117523
- function generateUUID()
- {
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
- /[xy]/g,
- function(c)
- {
- var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
- return v.toString(16);
- }
- );
- }
-
- // ReporterSubscription class.
- function ReporterSubscription(id, callback, reporter)
- {
- this.id = id;
- this.callback = callback;
- this.reporter = reporter;
- }
-
- // Reporter class.
- function Reporter(name)
- {
- this.name =
- (typeof name !== "undefined") ?
- name :
- "";
- this.subscriptions = [];
- }
- Reporter.prototype.report = function()
- {
- for (var id in this.subscriptions)
- {
- var subscription = this.subscriptions[id];
- subscription.callback();
- }
- }
- Reporter.prototype.subscribe = function(callback)
- {
- var id = generateUUID();
- var subscription = new ReporterSubscription(id, callback, this);
- this.subscriptions.push(subscription);
- return subscription;
- }
- Reporter.prototype.subscribeMany = function(funcs)
- {
- for (var i = 0; i < funcs.length; ++i)
- {
- var func = funcs[i];
- this.subscribe(func);
- }
- }
-
- var Уведомитель = Reporter;
- Reporter.prototype.уведомить = function()
- {
- this.report();
- };
- Reporter.prototype.подписать = function(функция)
- {
- this.subscribe(функция);
- };
- Reporter.prototype.подписатьМного = function(funcs)
- {
- this.subscribeMany(funcs);
- };
- </script>
- <script>
- var муром = {};
- муром.старт = new Уведомитель();
- var murom = муром;
- murom.start = муром.старт;
- </script>
- <script>
- муром.модули = [
-
- [
- "муром.файл.начало/конец",
- "0LzRg9GA0L7QvC7RhNCw0LnQuyA9IHt9OwrQvNGD0YDQvtC8LtGE0LDQudC7LtC90LDRh9Cw0LvQviA9ICJQQ0ZFVDBOVVdWQkZJR2gwYld3K0NqeG9kRzFzUGdvZ0lDQWdQRzFsZEdFZ1kyaGhjbk5sZEQwaWRYUm1MVGdpUGdvZ0lDQWdQR2hsWVdRK0NpQWdJQ0FnSUNBZ1BITjBlV3hsUGdvZ0lDQWdJQ0FnSUR3dmMzUjViR1UrQ2lBZ0lDQThMMmhsWVdRK0NpQWdJQ0E4WW05a2VUNEtJQ0FnSUNBZ0lDQThjMk55YVhCMFBnb3ZLZ29nSUNBZ2JHOWpZV3hHYjNKaFoyVWdMUzBnVDJabWJHbHVaU0JUZEc5eVlXZGxMQ0JKYlhCeWIzWmxaQW9nSUNBZ1ZtVnljMmx2YmlBeExqY3VNd29nSUNBZ2FIUjBjSE02THk5c2IyTmhiR1p2Y21GblpTNW5hWFJvZFdJdWFXOHZiRzlqWVd4R2IzSmhaMlVLSUNBZ0lDaGpLU0F5TURFekxUSXdNVGNnVFc5NmFXeHNZU3dnUVhCaFkyaGxJRXhwWTJWdWMyVWdNaTR3Q2lvdkNpRm1kVzVqZEdsdmJpaGhLWHRwWmlnaWIySnFaV04wSWowOWRIbHdaVzltSUdWNGNHOXlkSE1tSmlKMWJtUmxabWx1WldRaUlUMTBlWEJsYjJZZ2JXOWtkV3hsS1cxdlpIVnNaUzVsZUhCdmNuUnpQV0VvS1R0bGJITmxJR2xtS0NKbWRXNWpkR2x2YmlJOVBYUjVjR1Z2WmlCa1pXWnBibVVtSm1SbFptbHVaUzVoYldRcFpHVm1hVzVsS0Z0ZExHRXBPMlZzYzJWN2RtRnlJR0k3WWowaWRXNWtaV1pwYm1Wa0lpRTlkSGx3Wlc5bUlIZHBibVJ2ZHo5M2FXNWtiM2M2SW5WdVpHVm1hVzVsWkNJaFBYUjVjR1Z2WmlCbmJHOWlZV3cvWjJ4dlltRnNPaUoxYm1SbFptbHVaV1FpSVQxMGVYQmxiMllnYzJWc1pqOXpaV3htT25Sb2FYTXNZaTVzYjJOaGJHWnZjbUZuWlQxaEtDbDlmU2htZFc1amRHbHZiaWdwZTNKbGRIVnliaUJtZFc1amRHbHZiaUJoS0dJc1l5eGtLWHRtZFc1amRHbHZiaUJsS0djc2FDbDdhV1lvSVdOYloxMHBlMmxtS0NGaVcyZGRLWHQyWVhJZ2FUMGlablZ1WTNScGIyNGlQVDEwZVhCbGIyWWdjbVZ4ZFdseVpTWW1jbVZ4ZFdseVpUdHBaaWdoYUNZbWFTbHlaWFIxY200Z2FTaG5MQ0V3S1R0cFppaG1LWEpsZEhWeWJpQm1LR2NzSVRBcE8zWmhjaUJxUFc1bGR5QkZjbkp2Y2lnaVEyRnVibTkwSUdacGJtUWdiVzlrZFd4bElDY2lLMmNySWljaUtUdDBhSEp2ZHlCcUxtTnZaR1U5SWsxUFJGVk1SVjlPVDFSZlJrOVZUa1FpTEdwOWRtRnlJR3M5WTF0blhUMTdaWGh3YjNKMGN6cDdmWDA3WWx0blhWc3dYUzVqWVd4c0tHc3VaWGh3YjNKMGN5eG1kVzVqZEdsdmJpaGhLWHQyWVhJZ1l6MWlXMmRkV3pGZFcyRmRPM0psZEhWeWJpQmxLR044ZkdFcGZTeHJMR3N1Wlhod2IzSjBjeXhoTEdJc1l5eGtLWDF5WlhSMWNtNGdZMXRuWFM1bGVIQnZjblJ6ZldadmNpaDJZWElnWmowaVpuVnVZM1JwYjI0aVBUMTBlWEJsYjJZZ2NtVnhkV2x5WlNZbWNtVnhkV2x5WlN4blBUQTdaenhrTG14bGJtZDBhRHRuS3lzcFpTaGtXMmRkS1R0eVpYUjFjbTRnWlgwb2V6RTZXMloxYm1OMGFXOXVLR0VzWWl4aktYc29ablZ1WTNScGIyNG9ZU2w3SW5WelpTQnpkSEpwWTNRaU8yWjFibU4wYVc5dUlHTW9LWHRyUFNFd08yWnZjaWgyWVhJZ1lTeGlMR005YkM1c1pXNW5kR2c3WXpzcGUyWnZjaWhpUFd3c2JEMWJYU3hoUFMweE95c3JZVHhqT3lsaVcyRmRLQ2s3WXoxc0xteGxibWQwYUgxclBTRXhmV1oxYm1OMGFXOXVJR1FvWVNsN01TRTlQV3d1Y0hWemFDaGhLWHg4YTN4OFpTZ3BmWFpoY2lCbExHWTlZUzVOZFhSaGRHbHZiazlpYzJWeWRtVnlmSHhoTGxkbFlrdHBkRTExZEdGMGFXOXVUMkp6WlhKMlpYSTdhV1lvWmlsN2RtRnlJR2M5TUN4b1BXNWxkeUJtS0dNcExHazlZUzVrYjJOMWJXVnVkQzVqY21WaGRHVlVaWGgwVG05a1pTZ2lJaWs3YUM1dlluTmxjblpsS0drc2UyTm9ZWEpoWTNSbGNrUmhkR0U2SVRCOUtTeGxQV1oxYm1OMGFXOXVLQ2w3YVM1a1lYUmhQV2M5S3l0bkpUSjlmV1ZzYzJVZ2FXWW9ZUzV6WlhSSmJXMWxaR2xoZEdWOGZIWnZhV1FnTUQwOVBXRXVUV1Z6YzJGblpVTm9ZVzV1Wld3cFpUMGlaRzlqZFcxbGJuUWlhVzRnWVNZbUltOXVjbVZoWkhsemRHRjBaV05vWVc1blpTSnBiaUJoTG1SdlkzVnRaVzUwTG1OeVpXRjBaVVZzWlcxbGJuUW9Jbk5qY21sd2RDSXBQMloxYm1OMGFXOXVLQ2w3ZG1GeUlHSTlZUzVrYjJOMWJXVnVkQzVqY21WaGRHVkZiR1Z0Wlc1MEtDSnpZM0pwY0hRaUtUdGlMbTl1Y21WaFpIbHpkR0YwWldOb1lXNW5aVDFtZFc1amRHbHZiaWdwZTJNb0tTeGlMbTl1Y21WaFpIbHpkR0YwWldOb1lXNW5aVDF1ZFd4c0xHSXVjR0Z5Wlc1MFRtOWtaUzV5WlcxdmRtVkRhR2xzWkNoaUtTeGlQVzUxYkd4OUxHRXVaRzlqZFcxbGJuUXVaRzlqZFcxbGJuUkZiR1Z0Wlc1MExtRndjR1Z1WkVOb2FXeGtLR0lwZlRwbWRXNWpkR2x2YmlncGUzTmxkRlJwYldWdmRYUW9ZeXd3S1gwN1pXeHpaWHQyWVhJZ2FqMXVaWGNnWVM1TlpYTnpZV2RsUTJoaGJtNWxiRHRxTG5CdmNuUXhMbTl1YldWemMyRm5aVDFqTEdVOVpuVnVZM1JwYjI0b0tYdHFMbkJ2Y25ReUxuQnZjM1JOWlhOellXZGxLREFwZlgxMllYSWdheXhzUFZ0ZE8ySXVaWGh3YjNKMGN6MWtmU2t1WTJGc2JDaDBhR2x6TENKMWJtUmxabWx1WldRaUlUMTBlWEJsYjJZZ1oyeHZZbUZzUDJkc2IySmhiRG9pZFc1a1pXWnBibVZrSWlFOWRIbHdaVzltSUhObGJHWS9jMlZzWmpvaWRXNWtaV1pwYm1Wa0lpRTlkSGx3Wlc5bUlIZHBibVJ2ZHo5M2FXNWtiM2M2ZTMwcGZTeDdmVjBzTWpwYlpuVnVZM1JwYjI0b1lTeGlMR01wZXlKMWMyVWdjM1J5YVdOMElqdG1kVzVqZEdsdmJpQmtLQ2w3ZldaMWJtTjBhVzl1SUdVb1lTbDdhV1lvSW1aMWJtTjBhVzl1SWlFOWRIbHdaVzltSUdFcGRHaHliM2NnYm1WM0lGUjVjR1ZGY25KdmNpZ2ljbVZ6YjJ4MlpYSWdiWFZ6ZENCaVpTQmhJR1oxYm1OMGFXOXVJaWs3ZEdocGN5NXpkR0YwWlQxekxIUm9hWE11Y1hWbGRXVTlXMTBzZEdocGN5NXZkWFJqYjIxbFBYWnZhV1FnTUN4aElUMDlaQ1ltYVNoMGFHbHpMR0VwZldaMWJtTjBhVzl1SUdZb1lTeGlMR01wZTNSb2FYTXVjSEp2YldselpUMWhMQ0ptZFc1amRHbHZiaUk5UFhSNWNHVnZaaUJpSmlZb2RHaHBjeTV2YmtaMWJHWnBiR3hsWkQxaUxIUm9hWE11WTJGc2JFWjFiR1pwYkd4bFpEMTBhR2x6TG05MGFHVnlRMkZzYkVaMWJHWnBiR3hsWkNrc0ltWjFibU4wYVc5dUlqMDlkSGx3Wlc5bUlHTW1KaWgwYUdsekxtOXVVbVZxWldOMFpXUTlZeXgwYUdsekxtTmhiR3hTWldwbFkzUmxaRDEwYUdsekxtOTBhR1Z5UTJGc2JGSmxhbVZqZEdWa0tYMW1kVzVqZEdsdmJpQm5LR0VzWWl4aktYdHZLR1oxYm1OMGFXOXVLQ2w3ZG1GeUlHUTdkSEo1ZTJROVlpaGpLWDFqWVhSamFDaGlLWHR5WlhSMWNtNGdjQzV5WldwbFkzUW9ZU3hpS1gxa1BUMDlZVDl3TG5KbGFtVmpkQ2hoTEc1bGR5QlVlWEJsUlhKeWIzSW9Ja05oYm01dmRDQnlaWE52YkhabElIQnliMjFwYzJVZ2QybDBhQ0JwZEhObGJHWWlLU2s2Y0M1eVpYTnZiSFpsS0dFc1pDbDlLWDFtZFc1amRHbHZiaUJvS0dFcGUzWmhjaUJpUFdFbUptRXVkR2hsYmp0cFppaGhKaVlvSW05aWFtVmpkQ0k5UFhSNWNHVnZaaUJoZkh3aVpuVnVZM1JwYjI0aVBUMTBlWEJsYjJZZ1lTa21KaUptZFc1amRHbHZiaUk5UFhSNWNHVnZaaUJpS1hKbGRIVnliaUJtZFc1amRHbHZiaWdwZTJJdVlYQndiSGtvWVN4aGNtZDFiV1Z1ZEhNcGZYMW1kVzVqZEdsdmJpQnBLR0VzWWlsN1puVnVZM1JwYjI0Z1l5aGlLWHRtZkh3b1pqMGhNQ3h3TG5KbGFtVmpkQ2hoTEdJcEtYMW1kVzVqZEdsdmJpQmtLR0lwZTJaOGZDaG1QU0V3TEhBdWNtVnpiMngyWlNoaExHSXBLWDFtZFc1amRHbHZiaUJsS0NsN1lpaGtMR01wZlhaaGNpQm1QU0V4TEdjOWFpaGxLVHNpWlhKeWIzSWlQVDA5Wnk1emRHRjBkWE1tSm1Nb1p5NTJZV3gxWlNsOVpuVnVZM1JwYjI0Z2FpaGhMR0lwZTNaaGNpQmpQWHQ5TzNSeWVYdGpMblpoYkhWbFBXRW9ZaWtzWXk1emRHRjBkWE05SW5OMVkyTmxjM01pZldOaGRHTm9LR0VwZTJNdWMzUmhkSFZ6UFNKbGNuSnZjaUlzWXk1MllXeDFaVDFoZlhKbGRIVnliaUJqZldaMWJtTjBhVzl1SUdzb1lTbDdjbVYwZFhKdUlHRWdhVzV6ZEdGdVkyVnZaaUIwYUdselAyRTZjQzV5WlhOdmJIWmxLRzVsZHlCMGFHbHpLR1FwTEdFcGZXWjFibU4wYVc5dUlHd29ZU2w3ZG1GeUlHSTlibVYzSUhSb2FYTW9aQ2s3Y21WMGRYSnVJSEF1Y21WcVpXTjBLR0lzWVNsOVpuVnVZM1JwYjI0Z2JTaGhLWHRtZFc1amRHbHZiaUJpS0dFc1lpbDdablZ1WTNScGIyNGdaQ2hoS1h0blcySmRQV0VzS3l0b0lUMDlaWHg4Wm54OEtHWTlJVEFzY0M1eVpYTnZiSFpsS0dvc1p5a3BmV011Y21WemIyeDJaU2hoS1M1MGFHVnVLR1FzWm5WdVkzUnBiMjRvWVNsN1pueDhLR1k5SVRBc2NDNXlaV3BsWTNRb2FpeGhLU2w5S1gxMllYSWdZejEwYUdsek8ybG1LQ0piYjJKcVpXTjBJRUZ5Y21GNVhTSWhQVDFQWW1wbFkzUXVjSEp2ZEc5MGVYQmxMblJ2VTNSeWFXNW5MbU5oYkd3b1lTa3BjbVYwZFhKdUlIUm9hWE11Y21WcVpXTjBLRzVsZHlCVWVYQmxSWEp5YjNJb0ltMTFjM1FnWW1VZ1lXNGdZWEp5WVhraUtTazdkbUZ5SUdVOVlTNXNaVzVuZEdnc1pqMGhNVHRwWmlnaFpTbHlaWFIxY200Z2RHaHBjeTV5WlhOdmJIWmxLRnRkS1R0bWIzSW9kbUZ5SUdjOWJtVjNJRUZ5Y21GNUtHVXBMR2c5TUN4cFBTMHhMR285Ym1WM0lIUm9hWE1vWkNrN0t5dHBQR1U3S1dJb1lWdHBYU3hwS1R0eVpYUjFjbTRnYW4xbWRXNWpkR2x2YmlCdUtHRXBlMloxYm1OMGFXOXVJR0lvWVNsN1l5NXlaWE52YkhabEtHRXBMblJvWlc0b1puVnVZM1JwYjI0b1lTbDdabng4S0dZOUlUQXNjQzV5WlhOdmJIWmxLR2dzWVNrcGZTeG1kVzVqZEdsdmJpaGhLWHRtZkh3b1pqMGhNQ3h3TG5KbGFtVmpkQ2hvTEdFcEtYMHBmWFpoY2lCalBYUm9hWE03YVdZb0lsdHZZbXBsWTNRZ1FYSnlZWGxkSWlFOVBVOWlhbVZqZEM1d2NtOTBiM1I1Y0dVdWRHOVRkSEpwYm1jdVkyRnNiQ2hoS1NseVpYUjFjbTRnZEdocGN5NXlaV3BsWTNRb2JtVjNJRlI1Y0dWRmNuSnZjaWdpYlhWemRDQmlaU0JoYmlCaGNuSmhlU0lwS1R0MllYSWdaVDFoTG14bGJtZDBhQ3htUFNFeE8ybG1LQ0ZsS1hKbGRIVnliaUIwYUdsekxuSmxjMjlzZG1Vb1cxMHBPMlp2Y2loMllYSWdaejB0TVN4b1BXNWxkeUIwYUdsektHUXBPeXNyWnp4bE95bGlLR0ZiWjEwcE8zSmxkSFZ5YmlCb2ZYWmhjaUJ2UFdFb01Ta3NjRDE3ZlN4eFBWc2lVa1ZLUlVOVVJVUWlYU3h5UFZzaVJsVk1Sa2xNVEVWRUlsMHNjejFiSWxCRlRrUkpUa2NpWFR0aUxtVjRjRzl5ZEhNOVpTeGxMbkJ5YjNSdmRIbHdaUzVqWVhSamFEMW1kVzVqZEdsdmJpaGhLWHR5WlhSMWNtNGdkR2hwY3k1MGFHVnVLRzUxYkd3c1lTbDlMR1V1Y0hKdmRHOTBlWEJsTG5Sb1pXNDlablZ1WTNScGIyNG9ZU3hpS1h0cFppZ2lablZ1WTNScGIyNGlJVDEwZVhCbGIyWWdZU1ltZEdocGN5NXpkR0YwWlQwOVBYSjhmQ0ptZFc1amRHbHZiaUloUFhSNWNHVnZaaUJpSmlaMGFHbHpMbk4wWVhSbFBUMDljU2x5WlhSMWNtNGdkR2hwY3p0MllYSWdZejF1WlhjZ2RHaHBjeTVqYjI1emRISjFZM1J2Y2loa0tUdHBaaWgwYUdsekxuTjBZWFJsSVQwOWN5bDdaeWhqTEhSb2FYTXVjM1JoZEdVOVBUMXlQMkU2WWl4MGFHbHpMbTkxZEdOdmJXVXBmV1ZzYzJVZ2RHaHBjeTV4ZFdWMVpTNXdkWE5vS0c1bGR5Qm1LR01zWVN4aUtTazdjbVYwZFhKdUlHTjlMR1l1Y0hKdmRHOTBlWEJsTG1OaGJHeEdkV3htYVd4c1pXUTlablZ1WTNScGIyNG9ZU2w3Y0M1eVpYTnZiSFpsS0hSb2FYTXVjSEp2YldselpTeGhLWDBzWmk1d2NtOTBiM1I1Y0dVdWIzUm9aWEpEWVd4c1JuVnNabWxzYkdWa1BXWjFibU4wYVc5dUtHRXBlMmNvZEdocGN5NXdjbTl0YVhObExIUm9hWE11YjI1R2RXeG1hV3hzWldRc1lTbDlMR1l1Y0hKdmRHOTBlWEJsTG1OaGJHeFNaV3BsWTNSbFpEMW1kVzVqZEdsdmJpaGhLWHR3TG5KbGFtVmpkQ2gwYUdsekxuQnliMjFwYzJVc1lTbDlMR1l1Y0hKdmRHOTBlWEJsTG05MGFHVnlRMkZzYkZKbGFtVmpkR1ZrUFdaMWJtTjBhVzl1S0dFcGUyY29kR2hwY3k1d2NtOXRhWE5sTEhSb2FYTXViMjVTWldwbFkzUmxaQ3hoS1gwc2NDNXlaWE52YkhabFBXWjFibU4wYVc5dUtHRXNZaWw3ZG1GeUlHTTlhaWhvTEdJcE8ybG1LQ0psY25KdmNpSTlQVDFqTG5OMFlYUjFjeWx5WlhSMWNtNGdjQzV5WldwbFkzUW9ZU3hqTG5aaGJIVmxLVHQyWVhJZ1pEMWpMblpoYkhWbE8ybG1LR1FwYVNoaExHUXBPMlZzYzJWN1lTNXpkR0YwWlQxeUxHRXViM1YwWTI5dFpUMWlPMlp2Y2loMllYSWdaVDB0TVN4bVBXRXVjWFZsZFdVdWJHVnVaM1JvT3lzclpUeG1PeWxoTG5GMVpYVmxXMlZkTG1OaGJHeEdkV3htYVd4c1pXUW9ZaWw5Y21WMGRYSnVJR0Y5TEhBdWNtVnFaV04wUFdaMWJtTjBhVzl1S0dFc1lpbDdZUzV6ZEdGMFpUMXhMR0V1YjNWMFkyOXRaVDFpTzJadmNpaDJZWElnWXowdE1TeGtQV0V1Y1hWbGRXVXViR1Z1WjNSb095c3JZenhrT3lsaExuRjFaWFZsVzJOZExtTmhiR3hTWldwbFkzUmxaQ2hpS1R0eVpYUjFjbTRnWVgwc1pTNXlaWE52YkhabFBXc3NaUzV5WldwbFkzUTliQ3hsTG1Gc2JEMXRMR1V1Y21GalpUMXVmU3g3TVRveGZWMHNNenBiWm5WdVkzUnBiMjRvWVN4aUxHTXBleWhtZFc1amRHbHZiaWhpS1hzaWRYTmxJSE4wY21samRDSTdJbVoxYm1OMGFXOXVJaUU5ZEhsd1pXOW1JR0l1VUhKdmJXbHpaU1ltS0dJdVVISnZiV2x6WlQxaEtESXBLWDBwTG1OaGJHd29kR2hwY3l3aWRXNWtaV1pwYm1Wa0lpRTlkSGx3Wlc5bUlHZHNiMkpoYkQ5bmJHOWlZV3c2SW5WdVpHVm1hVzVsWkNJaFBYUjVjR1Z2WmlCelpXeG1QM05sYkdZNkluVnVaR1ZtYVc1bFpDSWhQWFI1Y0dWdlppQjNhVzVrYjNjL2QybHVaRzkzT250OUtYMHNlekk2TW4xZExEUTZXMloxYm1OMGFXOXVLR0VzWWl4aktYc2lkWE5sSUhOMGNtbGpkQ0k3Wm5WdVkzUnBiMjRnWkNoaExHSXBlMmxtS0NFb1lTQnBibk4wWVc1alpXOW1JR0lwS1hSb2NtOTNJRzVsZHlCVWVYQmxSWEp5YjNJb0lrTmhibTV2ZENCallXeHNJR0VnWTJ4aGMzTWdZWE1nWVNCbWRXNWpkR2x2YmlJcGZXWjFibU4wYVc5dUlHVW9LWHQwY25sN2FXWW9JblZ1WkdWbWFXNWxaQ0loUFhSNWNHVnZaaUJwYm1SbGVHVmtSRUlwY21WMGRYSnVJR2x1WkdWNFpXUkVRanRwWmlnaWRXNWtaV1pwYm1Wa0lpRTlkSGx3Wlc5bUlIZGxZbXRwZEVsdVpHVjRaV1JFUWlseVpYUjFjbTRnZDJWaWEybDBTVzVrWlhobFpFUkNPMmxtS0NKMWJtUmxabWx1WldRaUlUMTBlWEJsYjJZZ2JXOTZTVzVrWlhobFpFUkNLWEpsZEhWeWJpQnRiM3BKYm1SbGVHVmtSRUk3YVdZb0luVnVaR1ZtYVc1bFpDSWhQWFI1Y0dWdlppQlBTVzVrWlhobFpFUkNLWEpsZEhWeWJpQlBTVzVrWlhobFpFUkNPMmxtS0NKMWJtUmxabWx1WldRaUlUMTBlWEJsYjJZZ2JYTkpibVJsZUdWa1JFSXBjbVYwZFhKdUlHMXpTVzVrWlhobFpFUkNmV05oZEdOb0tHRXBlM0psZEhWeWJuMTlablZ1WTNScGIyNGdaaWdwZTNSeWVYdHBaaWdoZFdFcGNtVjBkWEp1SVRFN2RtRnlJR0U5SW5WdVpHVm1hVzVsWkNJaFBYUjVjR1Z2WmlCdmNHVnVSR0YwWVdKaGMyVW1KaThvVTJGbVlYSnBmR2xRYUc5dVpYeHBVR0ZrZkdsUWIyUXBMeTUwWlhOMEtHNWhkbWxuWVhSdmNpNTFjMlZ5UVdkbGJuUXBKaVloTDBOb2NtOXRaUzh1ZEdWemRDaHVZWFpwWjJGMGIzSXVkWE5sY2tGblpXNTBLU1ltSVM5Q2JHRmphMEpsY25KNUx5NTBaWE4wS0c1aGRtbG5ZWFJ2Y2k1d2JHRjBabTl5YlNrc1lqMGlablZ1WTNScGIyNGlQVDEwZVhCbGIyWWdabVYwWTJnbUppMHhJVDA5Wm1WMFkyZ3VkRzlUZEhKcGJtY29LUzVwYm1SbGVFOW1LQ0piYm1GMGFYWmxJR052WkdVaUtUdHlaWFIxY200b0lXRjhmR0lwSmlZaWRXNWtaV1pwYm1Wa0lpRTlkSGx3Wlc5bUlHbHVaR1Y0WldSRVFpWW1JblZ1WkdWbWFXNWxaQ0loUFhSNWNHVnZaaUJKUkVKTFpYbFNZVzVuWlgxallYUmphQ2hoS1h0eVpYUjFjbTRoTVgxOVpuVnVZM1JwYjI0Z1p5aGhMR0lwZTJFOVlYeDhXMTBzWWoxaWZIeDdmVHQwY25sN2NtVjBkWEp1SUc1bGR5QkNiRzlpS0dFc1lpbDlZMkYwWTJnb1ppbDdhV1lvSWxSNWNHVkZjbkp2Y2lJaFBUMW1MbTVoYldVcGRHaHliM2NnWmp0bWIzSW9kbUZ5SUdNOUluVnVaR1ZtYVc1bFpDSWhQWFI1Y0dWdlppQkNiRzlpUW5WcGJHUmxjajlDYkc5aVFuVnBiR1JsY2pvaWRXNWtaV1pwYm1Wa0lpRTlkSGx3Wlc5bUlFMVRRbXh2WWtKMWFXeGtaWEkvVFZOQ2JHOWlRblZwYkdSbGNqb2lkVzVrWldacGJtVmtJaUU5ZEhsd1pXOW1JRTF2ZWtKc2IySkNkV2xzWkdWeVAwMXZla0pzYjJKQ2RXbHNaR1Z5T2xkbFlrdHBkRUpzYjJKQ2RXbHNaR1Z5TEdROWJtVjNJR01zWlQwd08yVThZUzVzWlc1bmRHZzdaU3M5TVNsa0xtRndjR1Z1WkNoaFcyVmRLVHR5WlhSMWNtNGdaQzVuWlhSQ2JHOWlLR0l1ZEhsd1pTbDlmV1oxYm1OMGFXOXVJR2dvWVN4aUtYdGlKaVpoTG5Sb1pXNG9ablZ1WTNScGIyNG9ZU2w3WWlodWRXeHNMR0VwZlN4bWRXNWpkR2x2YmloaEtYdGlLR0VwZlNsOVpuVnVZM1JwYjI0Z2FTaGhMR0lzWXlsN0ltWjFibU4wYVc5dUlqMDlkSGx3Wlc5bUlHSW1KbUV1ZEdobGJpaGlLU3dpWm5WdVkzUnBiMjRpUFQxMGVYQmxiMllnWXlZbVlTNWpZWFJqYUNoaktYMW1kVzVqZEdsdmJpQnFLR0VwZTNKbGRIVnliaUp6ZEhKcGJtY2lJVDEwZVhCbGIyWWdZU1ltS0dOdmJuTnZiR1V1ZDJGeWJpaGhLeUlnZFhObFpDQmhjeUJoSUd0bGVTd2dZblYwSUdsMElHbHpJRzV2ZENCaElITjBjbWx1Wnk0aUtTeGhQVk4wY21sdVp5aGhLU2tzWVgxbWRXNWpkR2x2YmlCcktDbDdhV1lvWVhKbmRXMWxiblJ6TG14bGJtZDBhQ1ltSW1aMWJtTjBhVzl1SWowOWRIbHdaVzltSUdGeVozVnRaVzUwYzF0aGNtZDFiV1Z1ZEhNdWJHVnVaM1JvTFRGZEtYSmxkSFZ5YmlCaGNtZDFiV1Z1ZEhOYllYSm5kVzFsYm5SekxteGxibWQwYUMweFhYMW1kVzVqZEdsdmJpQnNLR0VwZTJadmNpaDJZWElnWWoxaExteGxibWQwYUN4alBXNWxkeUJCY25KaGVVSjFabVpsY2loaUtTeGtQVzVsZHlCVmFXNTBPRUZ5Y21GNUtHTXBMR1U5TUR0bFBHSTdaU3NyS1dSYlpWMDlZUzVqYUdGeVEyOWtaVUYwS0dVcE8zSmxkSFZ5YmlCamZXWjFibU4wYVc5dUlHMG9ZU2w3Y21WMGRYSnVJRzVsZHlCMllTaG1kVzVqZEdsdmJpaGlLWHQyWVhJZ1l6MWhMblJ5WVc1ellXTjBhVzl1S0hkaExFSmhLU3hrUFdjb1d5SWlYU2s3WXk1dlltcGxZM1JUZEc5eVpTaDNZU2t1Y0hWMEtHUXNJbXRsZVNJcExHTXViMjVoWW05eWREMW1kVzVqZEdsdmJpaGhLWHRoTG5CeVpYWmxiblJFWldaaGRXeDBLQ2tzWVM1emRHOXdVSEp2Y0dGbllYUnBiMjRvS1N4aUtDRXhLWDBzWXk1dmJtTnZiWEJzWlhSbFBXWjFibU4wYVc5dUtDbDdkbUZ5SUdFOWJtRjJhV2RoZEc5eUxuVnpaWEpCWjJWdWRDNXRZWFJqYUNndlEyaHliMjFsWEM4b1hHUXJLUzhwTEdNOWJtRjJhV2RoZEc5eUxuVnpaWEpCWjJWdWRDNXRZWFJqYUNndlJXUm5aVnd2THlrN1lpaGpmSHdoWVh4OGNHRnljMlZKYm5Rb1lWc3hYU3d4TUNrK1BUUXpLWDE5S1M1allYUmphQ2htZFc1amRHbHZiaWdwZTNKbGRIVnliaUV4ZlNsOVpuVnVZM1JwYjI0Z2JpaGhLWHR5WlhSMWNtNGlZbTl2YkdWaGJpSTlQWFI1Y0dWdlppQjRZVDkyWVM1eVpYTnZiSFpsS0hoaEtUcHRLR0VwTG5Sb1pXNG9ablZ1WTNScGIyNG9ZU2w3Y21WMGRYSnVJSGhoUFdGOUtYMW1kVzVqZEdsdmJpQnZLR0VwZTNaaGNpQmlQWGxoVzJFdWJtRnRaVjBzWXoxN2ZUdGpMbkJ5YjIxcGMyVTlibVYzSUhaaEtHWjFibU4wYVc5dUtHRXNZaWw3WXk1eVpYTnZiSFpsUFdFc1l5NXlaV3BsWTNROVluMHBMR0l1WkdWbVpYSnlaV1JQY0dWeVlYUnBiMjV6TG5CMWMyZ29ZeWtzWWk1a1lsSmxZV1I1UDJJdVpHSlNaV0ZrZVQxaUxtUmlVbVZoWkhrdWRHaGxiaWhtZFc1amRHbHZiaWdwZTNKbGRIVnliaUJqTG5CeWIyMXBjMlY5S1RwaUxtUmlVbVZoWkhrOVl5NXdjbTl0YVhObGZXWjFibU4wYVc5dUlIQW9ZU2w3ZG1GeUlHSTllV0ZiWVM1dVlXMWxYU3hqUFdJdVpHVm1aWEp5WldSUGNHVnlZWFJwYjI1ekxuQnZjQ2dwTzJsbUtHTXBjbVYwZFhKdUlHTXVjbVZ6YjJ4MlpTZ3BMR011Y0hKdmJXbHpaWDFtZFc1amRHbHZiaUJ4S0dFc1lpbDdkbUZ5SUdNOWVXRmJZUzV1WVcxbFhTeGtQV011WkdWbVpYSnlaV1JQY0dWeVlYUnBiMjV6TG5CdmNDZ3BPMmxtS0dRcGNtVjBkWEp1SUdRdWNtVnFaV04wS0dJcExHUXVjSEp2YldselpYMW1kVzVqZEdsdmJpQnlLR0VzWWlsN2NtVjBkWEp1SUc1bGR5QjJZU2htZFc1amRHbHZiaWhqTEdRcGUybG1LSGxoVzJFdWJtRnRaVjA5ZVdGYllTNXVZVzFsWFh4OFFpZ3BMR0V1WkdJcGUybG1LQ0ZpS1hKbGRIVnliaUJqS0dFdVpHSXBPMjhvWVNrc1lTNWtZaTVqYkc5elpTZ3BmWFpoY2lCbFBWdGhMbTVoYldWZE8ySW1KbVV1Y0hWemFDaGhMblpsY25OcGIyNHBPM1poY2lCbVBYVmhMbTl3Wlc0dVlYQndiSGtvZFdFc1pTazdZaVltS0dZdWIyNTFjR2R5WVdSbGJtVmxaR1ZrUFdaMWJtTjBhVzl1S0dJcGUzWmhjaUJqUFdZdWNtVnpkV3gwTzNSeWVYdGpMbU55WldGMFpVOWlhbVZqZEZOMGIzSmxLR0V1YzNSdmNtVk9ZVzFsS1N4aUxtOXNaRlpsY25OcGIyNDhQVEVtSm1NdVkzSmxZWFJsVDJKcVpXTjBVM1J2Y21Vb2QyRXBmV05oZEdOb0tHTXBlMmxtS0NKRGIyNXpkSEpoYVc1MFJYSnliM0lpSVQwOVl5NXVZVzFsS1hSb2NtOTNJR003WTI5dWMyOXNaUzUzWVhKdUtDZFVhR1VnWkdGMFlXSmhjMlVnSWljcllTNXVZVzFsS3ljaUlHaGhjeUJpWldWdUlIVndaM0poWkdWa0lHWnliMjBnZG1WeWMybHZiaUFuSzJJdWIyeGtWbVZ5YzJsdmJpc2lJSFJ2SUhabGNuTnBiMjRnSWl0aUxtNWxkMVpsY25OcGIyNHJKeXdnWW5WMElIUm9aU0J6ZEc5eVlXZGxJQ0luSzJFdWMzUnZjbVZPWVcxbEt5Y2lJR0ZzY21WaFpIa2daWGhwYzNSekxpY3BmWDBwTEdZdWIyNWxjbkp2Y2oxbWRXNWpkR2x2YmloaEtYdGhMbkJ5WlhabGJuUkVaV1poZFd4MEtDa3NaQ2htTG1WeWNtOXlLWDBzWmk1dmJuTjFZMk5sYzNNOVpuVnVZM1JwYjI0b0tYdGpLR1l1Y21WemRXeDBLU3h3S0dFcGZYMHBmV1oxYm1OMGFXOXVJSE1vWVNsN2NtVjBkWEp1SUhJb1lTd2hNU2w5Wm5WdVkzUnBiMjRnZENoaEtYdHlaWFIxY200Z2NpaGhMQ0V3S1gxbWRXNWpkR2x2YmlCMUtHRXNZaWw3YVdZb0lXRXVaR0lwY21WMGRYSnVJVEE3ZG1GeUlHTTlJV0V1WkdJdWIySnFaV04wVTNSdmNtVk9ZVzFsY3k1amIyNTBZV2x1Y3loaExuTjBiM0psVG1GdFpTa3NaRDFoTG5abGNuTnBiMjQ4WVM1a1lpNTJaWEp6YVc5dUxHVTlZUzUyWlhKemFXOXVQbUV1WkdJdWRtVnljMmx2Ymp0cFppaGtKaVlvWVM1MlpYSnphVzl1SVQwOVlpWW1ZMjl1YzI5c1pTNTNZWEp1S0NkVWFHVWdaR0YwWVdKaGMyVWdJaWNyWVM1dVlXMWxLeUpjSWlCallXNG5kQ0JpWlNCa2IzZHVaM0poWkdWa0lHWnliMjBnZG1WeWMybHZiaUFpSzJFdVpHSXVkbVZ5YzJsdmJpc2lJSFJ2SUhabGNuTnBiMjRnSWl0aExuWmxjbk5wYjI0cklpNGlLU3hoTG5abGNuTnBiMjQ5WVM1a1lpNTJaWEp6YVc5dUtTeGxmSHhqS1h0cFppaGpLWHQyWVhJZ1pqMWhMbVJpTG5abGNuTnBiMjRyTVR0bVBtRXVkbVZ5YzJsdmJpWW1LR0V1ZG1WeWMybHZiajFtS1gxeVpYUjFjbTRoTUgxeVpYUjFjbTRoTVgxbWRXNWpkR2x2YmlCMktHRXBlM0psZEhWeWJpQnVaWGNnZG1Fb1puVnVZM1JwYjI0b1lpeGpLWHQyWVhJZ1pEMXVaWGNnUm1sc1pWSmxZV1JsY2p0a0xtOXVaWEp5YjNJOVl5eGtMbTl1Ykc5aFpHVnVaRDFtZFc1amRHbHZiaWhqS1h0MllYSWdaRDFpZEc5aEtHTXVkR0Z5WjJWMExuSmxjM1ZzZEh4OElpSXBPMklvZTE5ZmJHOWpZV3hmWm05eVlXZGxYMlZ1WTI5a1pXUmZZbXh2WWpvaE1DeGtZWFJoT21Rc2RIbHdaVHBoTG5SNWNHVjlLWDBzWkM1eVpXRmtRWE5DYVc1aGNubFRkSEpwYm1jb1lTbDlLWDFtZFc1amRHbHZiaUIzS0dFcGUzSmxkSFZ5YmlCbktGdHNLR0YwYjJJb1lTNWtZWFJoS1NsZExIdDBlWEJsT21FdWRIbHdaWDBwZldaMWJtTjBhVzl1SUhnb1lTbDdjbVYwZFhKdUlHRW1KbUV1WDE5c2IyTmhiRjltYjNKaFoyVmZaVzVqYjJSbFpGOWliRzlpZldaMWJtTjBhVzl1SUhrb1lTbDdkbUZ5SUdJOWRHaHBjeXhqUFdJdVgybHVhWFJTWldGa2VTZ3BMblJvWlc0b1puVnVZM1JwYjI0b0tYdDJZWElnWVQxNVlWdGlMbDlrWWtsdVptOHVibUZ0WlYwN2FXWW9ZU1ltWVM1a1lsSmxZV1I1S1hKbGRIVnliaUJoTG1SaVVtVmhaSGw5S1R0eVpYUjFjbTRnYVNoakxHRXNZU2tzWTMxbWRXNWpkR2x2YmlCNktHRXBlMjhvWVNrN1ptOXlLSFpoY2lCaVBYbGhXMkV1Ym1GdFpWMHNZejFpTG1admNtRm5aWE1zWkQwd08yUThZeTVzWlc1bmRHZzdaQ3NyS1h0MllYSWdaVDFqVzJSZE8yVXVYMlJpU1c1bWJ5NWtZaVltS0dVdVgyUmlTVzVtYnk1a1lpNWpiRzl6WlNncExHVXVYMlJpU1c1bWJ5NWtZajF1ZFd4c0tYMXlaWFIxY200Z1lTNWtZajF1ZFd4c0xITW9ZU2t1ZEdobGJpaG1kVzVqZEdsdmJpaGlLWHR5WlhSMWNtNGdZUzVrWWoxaUxIVW9ZU2svZENoaEtUcGlmU2t1ZEdobGJpaG1kVzVqZEdsdmJpaGtLWHRoTG1SaVBXSXVaR0k5WkR0bWIzSW9kbUZ5SUdVOU1EdGxQR011YkdWdVozUm9PMlVyS3lsalcyVmRMbDlrWWtsdVptOHVaR0k5WkgwcExtTmhkR05vS0daMWJtTjBhVzl1S0dJcGUzUm9jbTkzSUhFb1lTeGlLU3hpZlNsOVpuVnVZM1JwYjI0Z1FTaGhMR0lzWXl4a0tYdDJiMmxrSURBOVBUMWtKaVlvWkQweEtUdDBjbmw3ZG1GeUlHVTlZUzVrWWk1MGNtRnVjMkZqZEdsdmJpaGhMbk4wYjNKbFRtRnRaU3hpS1R0aktHNTFiR3dzWlNsOVkyRjBZMmdvWlNsN2FXWW9aRDR3SmlZb0lXRXVaR0o4ZkNKSmJuWmhiR2xrVTNSaGRHVkZjbkp2Y2lJOVBUMWxMbTVoYldWOGZDSk9iM1JHYjNWdVpFVnljbTl5SWowOVBXVXVibUZ0WlNrcGNtVjBkWEp1SUhaaExuSmxjMjlzZG1Vb0tTNTBhR1Z1S0daMWJtTjBhVzl1S0NsN2FXWW9JV0V1WkdKOGZDSk9iM1JHYjNWdVpFVnljbTl5SWowOVBXVXVibUZ0WlNZbUlXRXVaR0l1YjJKcVpXTjBVM1J2Y21WT1lXMWxjeTVqYjI1MFlXbHVjeWhoTG5OMGIzSmxUbUZ0WlNrbUptRXVkbVZ5YzJsdmJqdzlZUzVrWWk1MlpYSnphVzl1S1hKbGRIVnliaUJoTG1SaUppWW9ZUzUyWlhKemFXOXVQV0V1WkdJdWRtVnljMmx2YmlzeEtTeDBLR0VwZlNrdWRHaGxiaWhtZFc1amRHbHZiaWdwZTNKbGRIVnliaUI2S0dFcExuUm9aVzRvWm5WdVkzUnBiMjRvS1h0QktHRXNZaXhqTEdRdE1TbDlLWDBwTG1OaGRHTm9LR01wTzJNb1pTbDlmV1oxYm1OMGFXOXVJRUlvS1h0eVpYUjFjbTU3Wm05eVlXZGxjenBiWFN4a1lqcHVkV3hzTEdSaVVtVmhaSGs2Ym5Wc2JDeGtaV1psY25KbFpFOXdaWEpoZEdsdmJuTTZXMTE5ZldaMWJtTjBhVzl1SUVNb1lTbDdablZ1WTNScGIyNGdZaWdwZTNKbGRIVnliaUIyWVM1eVpYTnZiSFpsS0NsOWRtRnlJR005ZEdocGN5eGtQWHRrWWpwdWRXeHNmVHRwWmloaEtXWnZjaWgyWVhJZ1pTQnBiaUJoS1dSYlpWMDlZVnRsWFR0MllYSWdaajE1WVZ0a0xtNWhiV1ZkTzJaOGZDaG1QVUlvS1N4NVlWdGtMbTVoYldWZFBXWXBMR1l1Wm05eVlXZGxjeTV3ZFhOb0tHTXBMR011WDJsdWFYUlNaV0ZrZVh4OEtHTXVYMmx1YVhSU1pXRmtlVDFqTG5KbFlXUjVMR011Y21WaFpIazllU2s3Wm05eUtIWmhjaUJuUFZ0ZExHZzlNRHRvUEdZdVptOXlZV2RsY3k1c1pXNW5kR2c3YUNzcktYdDJZWElnYVQxbUxtWnZjbUZuWlhOYmFGMDdhU0U5UFdNbUptY3VjSFZ6YUNocExsOXBibWwwVW1WaFpIa29LUzVqWVhSamFDaGlLU2w5ZG1GeUlHbzlaaTVtYjNKaFoyVnpMbk5zYVdObEtEQXBPM0psZEhWeWJpQjJZUzVoYkd3b1p5a3VkR2hsYmlobWRXNWpkR2x2YmlncGUzSmxkSFZ5YmlCa0xtUmlQV1l1WkdJc2N5aGtLWDBwTG5Sb1pXNG9ablZ1WTNScGIyNG9ZU2w3Y21WMGRYSnVJR1F1WkdJOVlTeDFLR1FzWXk1ZlpHVm1ZWFZzZEVOdmJtWnBaeTUyWlhKemFXOXVLVDkwS0dRcE9tRjlLUzUwYUdWdUtHWjFibU4wYVc5dUtHRXBlMlF1WkdJOVppNWtZajFoTEdNdVgyUmlTVzVtYnoxa08yWnZjaWgyWVhJZ1lqMHdPMkk4YWk1c1pXNW5kR2c3WWlzcktYdDJZWElnWlQxcVcySmRPMlVoUFQxakppWW9aUzVmWkdKSmJtWnZMbVJpUFdRdVpHSXNaUzVmWkdKSmJtWnZMblpsY25OcGIyNDlaQzUyWlhKemFXOXVLWDE5S1gxbWRXNWpkR2x2YmlCRUtHRXNZaWw3ZG1GeUlHTTlkR2hwY3p0aFBXb29ZU2s3ZG1GeUlHUTlibVYzSUhaaEtHWjFibU4wYVc5dUtHSXNaQ2w3WXk1eVpXRmtlU2dwTG5Sb1pXNG9ablZ1WTNScGIyNG9LWHRCS0dNdVgyUmlTVzVtYnl4QllTeG1kVzVqZEdsdmJpaGxMR1lwZTJsbUtHVXBjbVYwZFhKdUlHUW9aU2s3ZEhKNWUzWmhjaUJuUFdZdWIySnFaV04wVTNSdmNtVW9ZeTVmWkdKSmJtWnZMbk4wYjNKbFRtRnRaU2tzYUQxbkxtZGxkQ2hoS1R0b0xtOXVjM1ZqWTJWemN6MW1kVzVqZEdsdmJpZ3BlM1poY2lCaFBXZ3VjbVZ6ZFd4ME8zWnZhV1FnTUQwOVBXRW1KaWhoUFc1MWJHd3BMSGdvWVNrbUppaGhQWGNvWVNrcExHSW9ZU2w5TEdndWIyNWxjbkp2Y2oxbWRXNWpkR2x2YmlncGUyUW9hQzVsY25KdmNpbDlmV05oZEdOb0tHRXBlMlFvWVNsOWZTbDlLUzVqWVhSamFDaGtLWDBwTzNKbGRIVnliaUJvS0dRc1lpa3NaSDFtZFc1amRHbHZiaUJGS0dFc1lpbDdkbUZ5SUdNOWRHaHBjeXhrUFc1bGR5QjJZU2htZFc1amRHbHZiaWhpTEdRcGUyTXVjbVZoWkhrb0tTNTBhR1Z1S0daMWJtTjBhVzl1S0NsN1FTaGpMbDlrWWtsdVptOHNRV0VzWm5WdVkzUnBiMjRvWlN4bUtYdHBaaWhsS1hKbGRIVnliaUJrS0dVcE8zUnllWHQyWVhJZ1p6MW1MbTlpYW1WamRGTjBiM0psS0dNdVgyUmlTVzVtYnk1emRHOXlaVTVoYldVcExHZzlaeTV2Y0dWdVEzVnljMjl5S0Nrc2FUMHhPMmd1YjI1emRXTmpaWE56UFdaMWJtTjBhVzl1S0NsN2RtRnlJR005YUM1eVpYTjFiSFE3YVdZb1l5bDdkbUZ5SUdROVl5NTJZV3gxWlR0NEtHUXBKaVlvWkQxM0tHUXBLVHQyWVhJZ1pUMWhLR1FzWXk1clpYa3NhU3NyS1R0MmIybGtJREFoUFQxbFAySW9aU2s2WXk1amIyNTBhVzUxWlNncGZXVnNjMlVnWWlncGZTeG9MbTl1WlhKeWIzSTlablZ1WTNScGIyNG9LWHRrS0dndVpYSnliM0lwZlgxallYUmphQ2hoS1h0a0tHRXBmWDBwZlNrdVkyRjBZMmdvWkNsOUtUdHlaWFIxY200Z2FDaGtMR0lwTEdSOVpuVnVZM1JwYjI0Z1JpaGhMR0lzWXlsN2RtRnlJR1E5ZEdocGN6dGhQV29vWVNrN2RtRnlJR1U5Ym1WM0lIWmhLR1oxYm1OMGFXOXVLR01zWlNsN2RtRnlJR1k3WkM1eVpXRmtlU2dwTG5Sb1pXNG9ablZ1WTNScGIyNG9LWHR5WlhSMWNtNGdaajFrTGw5a1lrbHVabThzSWx0dlltcGxZM1FnUW14dllsMGlQVDA5ZW1FdVkyRnNiQ2hpS1Q5dUtHWXVaR0lwTG5Sb1pXNG9ablZ1WTNScGIyNG9ZU2w3Y21WMGRYSnVJR0UvWWpwMktHSXBmU2s2WW4wcExuUm9aVzRvWm5WdVkzUnBiMjRvWWlsN1FTaGtMbDlrWWtsdVptOHNRbUVzWm5WdVkzUnBiMjRvWml4bktYdHBaaWhtS1hKbGRIVnliaUJsS0dZcE8zUnllWHQyWVhJZ2FEMW5MbTlpYW1WamRGTjBiM0psS0dRdVgyUmlTVzVtYnk1emRHOXlaVTVoYldVcE8yNTFiR3c5UFQxaUppWW9ZajEyYjJsa0lEQXBPM1poY2lCcFBXZ3VjSFYwS0dJc1lTazdaeTV2Ym1OdmJYQnNaWFJsUFdaMWJtTjBhVzl1S0NsN2RtOXBaQ0F3UFQwOVlpWW1LR0k5Ym5Wc2JDa3NZeWhpS1gwc1p5NXZibUZpYjNKMFBXY3ViMjVsY25KdmNqMW1kVzVqZEdsdmJpZ3BlM1poY2lCaFBXa3VaWEp5YjNJL2FTNWxjbkp2Y2pwcExuUnlZVzV6WVdOMGFXOXVMbVZ5Y205eU8yVW9ZU2w5ZldOaGRHTm9LR0VwZTJVb1lTbDlmU2w5S1M1allYUmphQ2hsS1gwcE8zSmxkSFZ5YmlCb0tHVXNZeWtzWlgxbWRXNWpkR2x2YmlCSEtHRXNZaWw3ZG1GeUlHTTlkR2hwY3p0aFBXb29ZU2s3ZG1GeUlHUTlibVYzSUhaaEtHWjFibU4wYVc5dUtHSXNaQ2w3WXk1eVpXRmtlU2dwTG5Sb1pXNG9ablZ1WTNScGIyNG9LWHRCS0dNdVgyUmlTVzVtYnl4Q1lTeG1kVzVqZEdsdmJpaGxMR1lwZTJsbUtHVXBjbVYwZFhKdUlHUW9aU2s3ZEhKNWUzWmhjaUJuUFdZdWIySnFaV04wVTNSdmNtVW9ZeTVmWkdKSmJtWnZMbk4wYjNKbFRtRnRaU2tzYUQxbkxtUmxiR1YwWlNoaEtUdG1MbTl1WTI5dGNHeGxkR1U5Wm5WdVkzUnBiMjRvS1h0aUtDbDlMR1l1YjI1bGNuSnZjajFtZFc1amRHbHZiaWdwZTJRb2FDNWxjbkp2Y2lsOUxHWXViMjVoWW05eWREMW1kVzVqZEdsdmJpZ3BlM1poY2lCaFBXZ3VaWEp5YjNJL2FDNWxjbkp2Y2pwb0xuUnlZVzV6WVdOMGFXOXVMbVZ5Y205eU8yUW9ZU2w5ZldOaGRHTm9LR0VwZTJRb1lTbDlmU2w5S1M1allYUmphQ2hrS1gwcE8zSmxkSFZ5YmlCb0tHUXNZaWtzWkgxbWRXNWpkR2x2YmlCSUtHRXBlM1poY2lCaVBYUm9hWE1zWXoxdVpYY2dkbUVvWm5WdVkzUnBiMjRvWVN4aktYdGlMbkpsWVdSNUtDa3VkR2hsYmlobWRXNWpkR2x2YmlncGUwRW9ZaTVmWkdKSmJtWnZMRUpoTEdaMWJtTjBhVzl1S0dRc1pTbDdhV1lvWkNseVpYUjFjbTRnWXloa0tUdDBjbmw3ZG1GeUlHWTlaUzV2WW1wbFkzUlRkRzl5WlNoaUxsOWtZa2x1Wm04dWMzUnZjbVZPWVcxbEtTeG5QV1l1WTJ4bFlYSW9LVHRsTG05dVkyOXRjR3hsZEdVOVpuVnVZM1JwYjI0b0tYdGhLQ2w5TEdVdWIyNWhZbTl5ZEQxbExtOXVaWEp5YjNJOVpuVnVZM1JwYjI0b0tYdDJZWElnWVQxbkxtVnljbTl5UDJjdVpYSnliM0k2Wnk1MGNtRnVjMkZqZEdsdmJpNWxjbkp2Y2p0aktHRXBmWDFqWVhSamFDaGhLWHRqS0dFcGZYMHBmU2t1WTJGMFkyZ29ZeWw5S1R0eVpYUjFjbTRnYUNoakxHRXBMR045Wm5WdVkzUnBiMjRnU1NoaEtYdDJZWElnWWoxMGFHbHpMR005Ym1WM0lIWmhLR1oxYm1OMGFXOXVLR0VzWXlsN1lpNXlaV0ZrZVNncExuUm9aVzRvWm5WdVkzUnBiMjRvS1h0QktHSXVYMlJpU1c1bWJ5eEJZU3htZFc1amRHbHZiaWhrTEdVcGUybG1LR1FwY21WMGRYSnVJR01vWkNrN2RISjVlM1poY2lCbVBXVXViMkpxWldOMFUzUnZjbVVvWWk1ZlpHSkpibVp2TG5OMGIzSmxUbUZ0WlNrc1p6MW1MbU52ZFc1MEtDazdaeTV2Ym5OMVkyTmxjM005Wm5WdVkzUnBiMjRvS1h0aEtHY3VjbVZ6ZFd4MEtYMHNaeTV2Ym1WeWNtOXlQV1oxYm1OMGFXOXVLQ2w3WXlobkxtVnljbTl5S1gxOVkyRjBZMmdvWVNsN1l5aGhLWDE5S1gwcExtTmhkR05vS0dNcGZTazdjbVYwZFhKdUlHZ29ZeXhoS1N4amZXWjFibU4wYVc5dUlFb29ZU3hpS1h0MllYSWdZejEwYUdsekxHUTlibVYzSUhaaEtHWjFibU4wYVc5dUtHSXNaQ2w3YVdZb1lUd3dLWEpsZEhWeWJpQjJiMmxrSUdJb2JuVnNiQ2s3WXk1eVpXRmtlU2dwTG5Sb1pXNG9ablZ1WTNScGIyNG9LWHRCS0dNdVgyUmlTVzVtYnl4QllTeG1kVzVqZEdsdmJpaGxMR1lwZTJsbUtHVXBjbVYwZFhKdUlHUW9aU2s3ZEhKNWUzWmhjaUJuUFdZdWIySnFaV04wVTNSdmNtVW9ZeTVmWkdKSmJtWnZMbk4wYjNKbFRtRnRaU2tzYUQwaE1TeHBQV2N1YjNCbGJrTjFjbk52Y2lncE8ya3ViMjV6ZFdOalpYTnpQV1oxYm1OMGFXOXVLQ2w3ZG1GeUlHTTlhUzV5WlhOMWJIUTdhV1lvSVdNcGNtVjBkWEp1SUhadmFXUWdZaWh1ZFd4c0tUc3dQVDA5WVQ5aUtHTXVhMlY1S1Rwb1AySW9ZeTVyWlhrcE9paG9QU0V3TEdNdVlXUjJZVzVqWlNoaEtTbDlMR2t1YjI1bGNuSnZjajFtZFc1amRHbHZiaWdwZTJRb2FTNWxjbkp2Y2lsOWZXTmhkR05vS0dFcGUyUW9ZU2w5ZlNsOUtTNWpZWFJqYUNoa0tYMHBPM0psZEhWeWJpQm9LR1FzWWlrc1pIMW1kVzVqZEdsdmJpQkxLR0VwZTNaaGNpQmlQWFJvYVhNc1l6MXVaWGNnZG1Fb1puVnVZM1JwYjI0b1lTeGpLWHRpTG5KbFlXUjVLQ2t1ZEdobGJpaG1kVzVqZEdsdmJpZ3BlMEVvWWk1ZlpHSkpibVp2TEVGaExHWjFibU4wYVc5dUtHUXNaU2w3YVdZb1pDbHlaWFIxY200Z1l5aGtLVHQwY25sN2RtRnlJR1k5WlM1dlltcGxZM1JUZEc5eVpTaGlMbDlrWWtsdVptOHVjM1J2Y21WT1lXMWxLU3huUFdZdWIzQmxia04xY25OdmNpZ3BMR2c5VzEwN1p5NXZibk4xWTJObGMzTTlablZ1WTNScGIyNG9LWHQyWVhJZ1lqMW5MbkpsYzNWc2REdHBaaWdoWWlseVpYUjFjbTRnZG05cFpDQmhLR2dwTzJndWNIVnphQ2hpTG10bGVTa3NZaTVqYjI1MGFXNTFaU2dwZlN4bkxtOXVaWEp5YjNJOVpuVnVZM1JwYjI0b0tYdGpLR2N1WlhKeWIzSXBmWDFqWVhSamFDaGhLWHRqS0dFcGZYMHBmU2t1WTJGMFkyZ29ZeWw5S1R0eVpYUjFjbTRnYUNoakxHRXBMR045Wm5WdVkzUnBiMjRnVENoaExHSXBlMkk5YXk1aGNIQnNlU2gwYUdsekxHRnlaM1Z0Wlc1MGN5azdkbUZ5SUdNOWRHaHBjeTVqYjI1bWFXY29LVHRoUFNKbWRXNWpkR2x2YmlJaFBYUjVjR1Z2WmlCaEppWmhmSHg3ZlN4aExtNWhiV1Y4ZkNoaExtNWhiV1U5WVM1dVlXMWxmSHhqTG01aGJXVXNZUzV6ZEc5eVpVNWhiV1U5WVM1emRHOXlaVTVoYldWOGZHTXVjM1J2Y21WT1lXMWxLVHQyWVhJZ1pDeGxQWFJvYVhNN2FXWW9ZUzV1WVcxbEtYdDJZWElnWmoxaExtNWhiV1U5UFQxakxtNWhiV1VtSm1VdVgyUmlTVzVtYnk1a1lpeG5QV1kvZG1FdWNtVnpiMngyWlNobExsOWtZa2x1Wm04dVpHSXBPbk1vWVNrdWRHaGxiaWhtZFc1amRHbHZiaWhpS1h0MllYSWdZejE1WVZ0aExtNWhiV1ZkTEdROVl5NW1iM0poWjJWek8yTXVaR0k5WWp0bWIzSW9kbUZ5SUdVOU1EdGxQR1F1YkdWdVozUm9PMlVyS3lsa1cyVmRMbDlrWWtsdVptOHVaR0k5WWp0eVpYUjFjbTRnWW4wcE8yUTlZUzV6ZEc5eVpVNWhiV1UvWnk1MGFHVnVLR1oxYm1OMGFXOXVLR0lwZTJsbUtHSXViMkpxWldOMFUzUnZjbVZPWVcxbGN5NWpiMjUwWVdsdWN5aGhMbk4wYjNKbFRtRnRaU2twZTNaaGNpQmpQV0l1ZG1WeWMybHZiaXN4TzI4b1lTazdkbUZ5SUdROWVXRmJZUzV1WVcxbFhTeGxQV1F1Wm05eVlXZGxjenRpTG1Oc2IzTmxLQ2s3Wm05eUtIWmhjaUJtUFRBN1pqeGxMbXhsYm1kMGFEdG1LeXNwZTNaaGNpQm5QV1ZiWmwwN1p5NWZaR0pKYm1adkxtUmlQVzUxYkd3c1p5NWZaR0pKYm1adkxuWmxjbk5wYjI0OVkzMXlaWFIxY200Z2JtVjNJSFpoS0daMWJtTjBhVzl1S0dJc1pDbDdkbUZ5SUdVOWRXRXViM0JsYmloaExtNWhiV1VzWXlrN1pTNXZibVZ5Y205eVBXWjFibU4wYVc5dUtHRXBlMlV1Y21WemRXeDBMbU5zYjNObEtDa3NaQ2hoS1gwc1pTNXZiblZ3WjNKaFpHVnVaV1ZrWldROVpuVnVZM1JwYjI0b0tYdGxMbkpsYzNWc2RDNWtaV3hsZEdWUFltcGxZM1JUZEc5eVpTaGhMbk4wYjNKbFRtRnRaU2w5TEdVdWIyNXpkV05qWlhOelBXWjFibU4wYVc5dUtDbDdkbUZ5SUdFOVpTNXlaWE4xYkhRN1lTNWpiRzl6WlNncExHSW9ZU2w5ZlNrdWRHaGxiaWhtZFc1amRHbHZiaWhoS1h0a0xtUmlQV0U3Wm05eUtIWmhjaUJpUFRBN1lqeGxMbXhsYm1kMGFEdGlLeXNwZTNaaGNpQmpQV1ZiWWwwN1l5NWZaR0pKYm1adkxtUmlQV0VzY0NoakxsOWtZa2x1Wm04cGZYMHBMbU5oZEdOb0tHWjFibU4wYVc5dUtHSXBlM1JvY205M0tIRW9ZU3hpS1h4OGRtRXVjbVZ6YjJ4MlpTZ3BLUzVqWVhSamFDaG1kVzVqZEdsdmJpZ3BlMzBwTEdKOUtYMTlLVHBuTG5Sb1pXNG9ablZ1WTNScGIyNG9ZaWw3YnloaEtUdDJZWElnWXoxNVlWdGhMbTVoYldWZExHUTlZeTVtYjNKaFoyVnpPMkl1WTJ4dmMyVW9LVHRtYjNJb2RtRnlJR1U5TUR0bFBHUXViR1Z1WjNSb08yVXJLeWw3WkZ0bFhTNWZaR0pKYm1adkxtUmlQVzUxYkd4OWNtVjBkWEp1SUc1bGR5QjJZU2htZFc1amRHbHZiaWhpTEdNcGUzWmhjaUJrUFhWaExtUmxiR1YwWlVSaGRHRmlZWE5sS0dFdWJtRnRaU2s3WkM1dmJtVnljbTl5UFdRdWIyNWliRzlqYTJWa1BXWjFibU4wYVc5dUtHRXBlM1poY2lCaVBXUXVjbVZ6ZFd4ME8ySW1KbUl1WTJ4dmMyVW9LU3hqS0dFcGZTeGtMbTl1YzNWalkyVnpjejFtZFc1amRHbHZiaWdwZTNaaGNpQmhQV1F1Y21WemRXeDBPMkVtSm1FdVkyeHZjMlVvS1N4aUtHRXBmWDBwTG5Sb1pXNG9ablZ1WTNScGIyNG9ZU2w3WXk1a1lqMWhPMlp2Y2loMllYSWdZajB3TzJJOFpDNXNaVzVuZEdnN1lpc3JLWEFvWkZ0aVhTNWZaR0pKYm1adktYMHBMbU5oZEdOb0tHWjFibU4wYVc5dUtHSXBlM1JvY205M0tIRW9ZU3hpS1h4OGRtRXVjbVZ6YjJ4MlpTZ3BLUzVqWVhSamFDaG1kVzVqZEdsdmJpZ3BlMzBwTEdKOUtYMHBmV1ZzYzJVZ1pEMTJZUzV5WldwbFkzUW9Ja2x1ZG1Gc2FXUWdZWEpuZFcxbGJuUnpJaWs3Y21WMGRYSnVJR2dvWkN4aUtTeGtmV1oxYm1OMGFXOXVJRTBvS1h0eVpYUjFjbTRpWm5WdVkzUnBiMjRpUFQxMGVYQmxiMllnYjNCbGJrUmhkR0ZpWVhObGZXWjFibU4wYVc5dUlFNG9ZU2w3ZG1GeUlHSXNZeXhrTEdVc1ppeG5QUzQzTlNwaExteGxibWQwYUN4b1BXRXViR1Z1WjNSb0xHazlNRHNpUFNJOVBUMWhXMkV1YkdWdVozUm9MVEZkSmlZb1p5MHRMQ0k5SWowOVBXRmJZUzVzWlc1bmRHZ3RNbDBtSm1jdExTazdkbUZ5SUdvOWJtVjNJRUZ5Y21GNVFuVm1abVZ5S0djcExHczlibVYzSUZWcGJuUTRRWEp5WVhrb2FpazdabTl5S0dJOU1EdGlQR2c3WWlzOU5DbGpQVVJoTG1sdVpHVjRUMllvWVZ0aVhTa3NaRDFFWVM1cGJtUmxlRTltS0dGYllpc3hYU2tzWlQxRVlTNXBibVJsZUU5bUtHRmJZaXN5WFNrc1pqMUVZUzVwYm1SbGVFOW1LR0ZiWWlzelhTa3NhMXRwS3l0ZFBXTThQREo4WkQ0K05DeHJXMmtySzEwOUtERTFKbVFwUER3MGZHVStQaklzYTF0cEt5dGRQU2d6Sm1VcFBEdzJmRFl6Sm1ZN2NtVjBkWEp1SUdwOVpuVnVZM1JwYjI0Z1R5aGhLWHQyWVhJZ1lpeGpQVzVsZHlCVmFXNTBPRUZ5Y21GNUtHRXBMR1E5SWlJN1ptOXlLR0k5TUR0aVBHTXViR1Z1WjNSb08ySXJQVE1wWkNzOVJHRmJZMXRpWFQ0K01sMHNaQ3M5UkdGYktETW1ZMXRpWFNrOFBEUjhZMXRpS3pGZFBqNDBYU3hrS3oxRVlWc29NVFVtWTF0aUt6RmRLVHc4TW54alcySXJNbDArUGpaZExHUXJQVVJoV3pZekptTmJZaXN5WFYwN2NtVjBkWEp1SUdNdWJHVnVaM1JvSlRNOVBUSS9aRDFrTG5OMVluTjBjbWx1Wnlnd0xHUXViR1Z1WjNSb0xURXBLeUk5SWpwakxteGxibWQwYUNVelBUMHhKaVlvWkQxa0xuTjFZbk4wY21sdVp5Z3dMR1F1YkdWdVozUm9MVElwS3lJOVBTSXBMR1I5Wm5WdVkzUnBiMjRnVUNoaExHSXBlM1poY2lCalBTSWlPMmxtS0dFbUppaGpQVlZoTG1OaGJHd29ZU2twTEdFbUppZ2lXMjlpYW1WamRDQkJjbkpoZVVKMVptWmxjbDBpUFQwOVkzeDhZUzVpZFdabVpYSW1KaUpiYjJKcVpXTjBJRUZ5Y21GNVFuVm1abVZ5WFNJOVBUMVZZUzVqWVd4c0tHRXVZblZtWm1WeUtTa3BlM1poY2lCa0xHVTlSMkU3WVNCcGJuTjBZVzVqWlc5bUlFRnljbUY1UW5WbVptVnlQeWhrUFdFc1pTczlTV0VwT2loa1BXRXVZblZtWm1WeUxDSmJiMkpxWldOMElFbHVkRGhCY25KaGVWMGlQVDA5WXo5bEt6MUxZVG9pVzI5aWFtVmpkQ0JWYVc1ME9FRnljbUY1WFNJOVBUMWpQMlVyUFV4aE9pSmJiMkpxWldOMElGVnBiblE0UTJ4aGJYQmxaRUZ5Y21GNVhTSTlQVDFqUDJVclBVMWhPaUpiYjJKcVpXTjBJRWx1ZERFMlFYSnlZWGxkSWowOVBXTS9aU3M5VG1FNklsdHZZbXBsWTNRZ1ZXbHVkREUyUVhKeVlYbGRJajA5UFdNL1pTczlVR0U2SWx0dlltcGxZM1FnU1c1ME16SkJjbkpoZVYwaVBUMDlZejlsS3oxUFlUb2lXMjlpYW1WamRDQlZhVzUwTXpKQmNuSmhlVjBpUFQwOVl6OWxLejFSWVRvaVcyOWlhbVZqZENCR2JHOWhkRE15UVhKeVlYbGRJajA5UFdNL1pTczlVbUU2SWx0dlltcGxZM1FnUm14dllYUTJORUZ5Y21GNVhTSTlQVDFqUDJVclBWTmhPbUlvYm1WM0lFVnljbTl5S0NKR1lXbHNaV1FnZEc4Z1oyVjBJSFI1Y0dVZ1ptOXlJRUpwYm1GeWVVRnljbUY1SWlrcEtTeGlLR1VyVHloa0tTbDlaV3h6WlNCcFppZ2lXMjlpYW1WamRDQkNiRzlpWFNJOVBUMWpLWHQyWVhJZ1pqMXVaWGNnUm1sc1pWSmxZV1JsY2p0bUxtOXViRzloWkQxbWRXNWpkR2x2YmlncGUzWmhjaUJqUFVWaEsyRXVkSGx3WlNzaWZpSXJUeWgwYUdsekxuSmxjM1ZzZENrN1lpaEhZU3RLWVN0aktYMHNaaTV5WldGa1FYTkJjbkpoZVVKMVptWmxjaWhoS1gxbGJITmxJSFJ5ZVh0aUtFcFRUMDR1YzNSeWFXNW5hV1o1S0dFcEtYMWpZWFJqYUNoaktYdGpiMjV6YjJ4bExtVnljbTl5S0NKRGIzVnNaRzRuZENCamIyNTJaWEowSUhaaGJIVmxJR2x1ZEc4Z1lTQktVMDlPSUhOMGNtbHVaem9nSWl4aEtTeGlLRzUxYkd3c1l5bDlmV1oxYm1OMGFXOXVJRkVvWVNsN2FXWW9ZUzV6ZFdKemRISnBibWNvTUN4SVlTa2hQVDFIWVNseVpYUjFjbTRnU2xOUFRpNXdZWEp6WlNoaEtUdDJZWElnWWl4alBXRXVjM1ZpYzNSeWFXNW5LRlJoS1N4a1BXRXVjM1ZpYzNSeWFXNW5LRWhoTEZSaEtUdHBaaWhrUFQwOVNtRW1Ka1poTG5SbGMzUW9ZeWtwZTNaaGNpQmxQV011YldGMFkyZ29SbUVwTzJJOVpWc3hYU3hqUFdNdWMzVmljM1J5YVc1bktHVmJNRjB1YkdWdVozUm9LWDEyWVhJZ1pqMU9LR01wTzNOM2FYUmphQ2hrS1h0allYTmxJRWxoT25KbGRIVnliaUJtTzJOaGMyVWdTbUU2Y21WMGRYSnVJR2NvVzJaZExIdDBlWEJsT21KOUtUdGpZWE5sSUV0aE9uSmxkSFZ5YmlCdVpYY2dTVzUwT0VGeWNtRjVLR1lwTzJOaGMyVWdUR0U2Y21WMGRYSnVJRzVsZHlCVmFXNTBPRUZ5Y21GNUtHWXBPMk5oYzJVZ1RXRTZjbVYwZFhKdUlHNWxkeUJWYVc1ME9FTnNZVzF3WldSQmNuSmhlU2htS1R0allYTmxJRTVoT25KbGRIVnliaUJ1WlhjZ1NXNTBNVFpCY25KaGVTaG1LVHRqWVhObElGQmhPbkpsZEhWeWJpQnVaWGNnVldsdWRERTJRWEp5WVhrb1ppazdZMkZ6WlNCUFlUcHlaWFIxY200Z2JtVjNJRWx1ZERNeVFYSnlZWGtvWmlrN1kyRnpaU0JSWVRweVpYUjFjbTRnYm1WM0lGVnBiblF6TWtGeWNtRjVLR1lwTzJOaGMyVWdVbUU2Y21WMGRYSnVJRzVsZHlCR2JHOWhkRE15UVhKeVlYa29aaWs3WTJGelpTQlRZVHB5WlhSMWNtNGdibVYzSUVac2IyRjBOalJCY25KaGVTaG1LVHRrWldaaGRXeDBPblJvY205M0lHNWxkeUJGY25KdmNpZ2lWVzVyYjNkdUlIUjVjR1U2SUNJclpDbDlmV1oxYm1OMGFXOXVJRklvWVN4aUxHTXNaQ2w3WVM1bGVHVmpkWFJsVTNGc0tDSkRVa1ZCVkVVZ1ZFRkNURVVnU1VZZ1RrOVVJRVZZU1ZOVVV5QWlLMkl1YzNSdmNtVk9ZVzFsS3lJZ0tHbGtJRWxPVkVWSFJWSWdVRkpKVFVGU1dTQkxSVmtzSUd0bGVTQjFibWx4ZFdVc0lIWmhiSFZsS1NJc1cxMHNZeXhrS1gxbWRXNWpkR2x2YmlCVEtHRXBlM1poY2lCaVBYUm9hWE1zWXoxN1pHSTZiblZzYkgwN2FXWW9ZU2xtYjNJb2RtRnlJR1FnYVc0Z1lTbGpXMlJkUFNKemRISnBibWNpSVQxMGVYQmxiMllnWVZ0a1hUOWhXMlJkTG5SdlUzUnlhVzVuS0NrNllWdGtYVHQyWVhJZ1pUMXVaWGNnZG1Fb1puVnVZM1JwYjI0b1lTeGtLWHQwY25sN1l5NWtZajF2Y0dWdVJHRjBZV0poYzJVb1l5NXVZVzFsTEZOMGNtbHVaeWhqTG5abGNuTnBiMjRwTEdNdVpHVnpZM0pwY0hScGIyNHNZeTV6YVhwbEtYMWpZWFJqYUNoaEtYdHlaWFIxY200Z1pDaGhLWDFqTG1SaUxuUnlZVzV6WVdOMGFXOXVLR1oxYm1OMGFXOXVLR1VwZTFJb1pTeGpMR1oxYm1OMGFXOXVLQ2w3WWk1ZlpHSkpibVp2UFdNc1lTZ3BmU3htZFc1amRHbHZiaWhoTEdJcGUyUW9ZaWw5S1gwc1pDbDlLVHR5WlhSMWNtNGdZeTV6WlhKcFlXeHBlbVZ5UFZaaExHVjlablZ1WTNScGIyNGdWQ2hoTEdJc1l5eGtMR1VzWmlsN1lTNWxlR1ZqZFhSbFUzRnNLR01zWkN4bExHWjFibU4wYVc5dUtHRXNaeWw3Wnk1amIyUmxQVDA5Wnk1VFdVNVVRVmhmUlZKU1AyRXVaWGhsWTNWMFpWTnhiQ2dpVTBWTVJVTlVJRzVoYldVZ1JsSlBUU0J6Y1d4cGRHVmZiV0Z6ZEdWeUlGZElSVkpGSUhSNWNHVTlKM1JoWW14bEp5QkJUa1FnYm1GdFpTQTlJRDhpTEZ0aUxuTjBiM0psVG1GdFpWMHNablZ1WTNScGIyNG9ZU3hvS1h0b0xuSnZkM011YkdWdVozUm9QMllvWVN4bktUcFNLR0VzWWl4bWRXNWpkR2x2YmlncGUyRXVaWGhsWTNWMFpWTnhiQ2hqTEdRc1pTeG1LWDBzWmlsOUxHWXBPbVlvWVN4bktYMHNaaWw5Wm5WdVkzUnBiMjRnVlNoaExHSXBlM1poY2lCalBYUm9hWE03WVQxcUtHRXBPM1poY2lCa1BXNWxkeUIyWVNobWRXNWpkR2x2YmloaUxHUXBlMk11Y21WaFpIa29LUzUwYUdWdUtHWjFibU4wYVc5dUtDbDdkbUZ5SUdVOVl5NWZaR0pKYm1adk8yVXVaR0l1ZEhKaGJuTmhZM1JwYjI0b1puVnVZM1JwYjI0b1l5bDdWQ2hqTEdVc0lsTkZURVZEVkNBcUlFWlNUMDBnSWl0bExuTjBiM0psVG1GdFpTc2lJRmRJUlZKRklHdGxlU0E5SUQ4Z1RFbE5TVlFnTVNJc1cyRmRMR1oxYm1OMGFXOXVLR0VzWXlsN2RtRnlJR1E5WXk1eWIzZHpMbXhsYm1kMGFEOWpMbkp2ZDNNdWFYUmxiU2d3S1M1MllXeDFaVHB1ZFd4c08yUW1KaWhrUFdVdWMyVnlhV0ZzYVhwbGNpNWtaWE5sY21saGJHbDZaU2hrS1Nrc1lpaGtLWDBzWm5WdVkzUnBiMjRvWVN4aUtYdGtLR0lwZlNsOUtYMHBMbU5oZEdOb0tHUXBmU2s3Y21WMGRYSnVJR2dvWkN4aUtTeGtmV1oxYm1OMGFXOXVJRllvWVN4aUtYdDJZWElnWXoxMGFHbHpMR1E5Ym1WM0lIWmhLR1oxYm1OMGFXOXVLR0lzWkNsN1l5NXlaV0ZrZVNncExuUm9aVzRvWm5WdVkzUnBiMjRvS1h0MllYSWdaVDFqTGw5a1lrbHVabTg3WlM1a1lpNTBjbUZ1YzJGamRHbHZiaWhtZFc1amRHbHZiaWhqS1h0VUtHTXNaU3dpVTBWTVJVTlVJQ29nUmxKUFRTQWlLMlV1YzNSdmNtVk9ZVzFsTEZ0ZExHWjFibU4wYVc5dUtHTXNaQ2w3Wm05eUtIWmhjaUJtUFdRdWNtOTNjeXhuUFdZdWJHVnVaM1JvTEdnOU1EdG9QR2M3YUNzcktYdDJZWElnYVQxbUxtbDBaVzBvYUNrc2FqMXBMblpoYkhWbE8ybG1LR29tSmlocVBXVXVjMlZ5YVdGc2FYcGxjaTVrWlhObGNtbGhiR2w2WlNocUtTa3NkbTlwWkNBd0lUMDlLR285WVNocUxHa3VhMlY1TEdnck1Ta3BLWEpsZEhWeWJpQjJiMmxrSUdJb2FpbDlZaWdwZlN4bWRXNWpkR2x2YmloaExHSXBlMlFvWWlsOUtYMHBmU2t1WTJGMFkyZ29aQ2w5S1R0eVpYUjFjbTRnYUNoa0xHSXBMR1I5Wm5WdVkzUnBiMjRnVnloaExHSXNZeXhrS1h0MllYSWdaVDEwYUdsek8yRTlhaWhoS1R0MllYSWdaajF1WlhjZ2RtRW9ablZ1WTNScGIyNG9aaXhuS1h0bExuSmxZV1I1S0NrdWRHaGxiaWhtZFc1amRHbHZiaWdwZTNadmFXUWdNRDA5UFdJbUppaGlQVzUxYkd3cE8zWmhjaUJvUFdJc2FUMWxMbDlrWWtsdVptODdhUzV6WlhKcFlXeHBlbVZ5TG5ObGNtbGhiR2w2WlNoaUxHWjFibU4wYVc5dUtHSXNhaWw3YWo5bktHb3BPbWt1WkdJdWRISmhibk5oWTNScGIyNG9ablZ1WTNScGIyNG9ZeWw3VkNoakxHa3NJa2xPVTBWU1ZDQlBVaUJTUlZCTVFVTkZJRWxPVkU4Z0lpdHBMbk4wYjNKbFRtRnRaU3NpSUNoclpYa3NJSFpoYkhWbEtTQldRVXhWUlZNZ0tEOHNJRDhwSWl4YllTeGlYU3htZFc1amRHbHZiaWdwZTJZb2FDbDlMR1oxYm1OMGFXOXVLR0VzWWlsN1p5aGlLWDBwZlN4bWRXNWpkR2x2YmloaUtYdHBaaWhpTG1OdlpHVTlQVDFpTGxGVlQxUkJYMFZTVWlsN2FXWW9aRDR3S1hKbGRIVnliaUIyYjJsa0lHWW9WeTVoY0hCc2VTaGxMRnRoTEdnc1l5eGtMVEZkS1NrN1p5aGlLWDE5S1gwcGZTa3VZMkYwWTJnb1p5bDlLVHR5WlhSMWNtNGdhQ2htTEdNcExHWjlablZ1WTNScGIyNGdXQ2hoTEdJc1l5bDdjbVYwZFhKdUlGY3VZWEJ3Ykhrb2RHaHBjeXhiWVN4aUxHTXNNVjBwZldaMWJtTjBhVzl1SUZrb1lTeGlLWHQyWVhJZ1l6MTBhR2x6TzJFOWFpaGhLVHQyWVhJZ1pEMXVaWGNnZG1Fb1puVnVZM1JwYjI0b1lpeGtLWHRqTG5KbFlXUjVLQ2t1ZEdobGJpaG1kVzVqZEdsdmJpZ3BlM1poY2lCbFBXTXVYMlJpU1c1bWJ6dGxMbVJpTG5SeVlXNXpZV04wYVc5dUtHWjFibU4wYVc5dUtHTXBlMVFvWXl4bExDSkVSVXhGVkVVZ1JsSlBUU0FpSzJVdWMzUnZjbVZPWVcxbEt5SWdWMGhGVWtVZ2EyVjVJRDBnUHlJc1cyRmRMR1oxYm1OMGFXOXVLQ2w3WWlncGZTeG1kVzVqZEdsdmJpaGhMR0lwZTJRb1lpbDlLWDBwZlNrdVkyRjBZMmdvWkNsOUtUdHlaWFIxY200Z2FDaGtMR0lwTEdSOVpuVnVZM1JwYjI0Z1dpaGhLWHQyWVhJZ1lqMTBhR2x6TEdNOWJtVjNJSFpoS0daMWJtTjBhVzl1S0dFc1l5bDdZaTV5WldGa2VTZ3BMblJvWlc0b1puVnVZM1JwYjI0b0tYdDJZWElnWkQxaUxsOWtZa2x1Wm04N1pDNWtZaTUwY21GdWMyRmpkR2x2YmlobWRXNWpkR2x2YmloaUtYdFVLR0lzWkN3aVJFVk1SVlJGSUVaU1QwMGdJaXRrTG5OMGIzSmxUbUZ0WlN4YlhTeG1kVzVqZEdsdmJpZ3BlMkVvS1gwc1puVnVZM1JwYjI0b1lTeGlLWHRqS0dJcGZTbDlLWDBwTG1OaGRHTm9LR01wZlNrN2NtVjBkWEp1SUdnb1l5eGhLU3hqZldaMWJtTjBhVzl1SUNRb1lTbDdkbUZ5SUdJOWRHaHBjeXhqUFc1bGR5QjJZU2htZFc1amRHbHZiaWhoTEdNcGUySXVjbVZoWkhrb0tTNTBhR1Z1S0daMWJtTjBhVzl1S0NsN2RtRnlJR1E5WWk1ZlpHSkpibVp2TzJRdVpHSXVkSEpoYm5OaFkzUnBiMjRvWm5WdVkzUnBiMjRvWWlsN1ZDaGlMR1FzSWxORlRFVkRWQ0JEVDFWT1ZDaHJaWGtwSUdGeklHTWdSbEpQVFNBaUsyUXVjM1J2Y21WT1lXMWxMRnRkTEdaMWJtTjBhVzl1S0dJc1l5bDdkbUZ5SUdROVl5NXliM2R6TG1sMFpXMG9NQ2t1WXp0aEtHUXBmU3htZFc1amRHbHZiaWhoTEdJcGUyTW9ZaWw5S1gwcGZTa3VZMkYwWTJnb1l5bDlLVHR5WlhSMWNtNGdhQ2hqTEdFcExHTjlablZ1WTNScGIyNGdYeWhoTEdJcGUzWmhjaUJqUFhSb2FYTXNaRDF1WlhjZ2RtRW9ablZ1WTNScGIyNG9ZaXhrS1h0akxuSmxZV1I1S0NrdWRHaGxiaWhtZFc1amRHbHZiaWdwZTNaaGNpQmxQV011WDJSaVNXNW1ienRsTG1SaUxuUnlZVzV6WVdOMGFXOXVLR1oxYm1OMGFXOXVLR01wZTFRb1l5eGxMQ0pUUlV4RlExUWdhMlY1SUVaU1QwMGdJaXRsTG5OMGIzSmxUbUZ0WlNzaUlGZElSVkpGSUdsa0lEMGdQeUJNU1UxSlZDQXhJaXhiWVNzeFhTeG1kVzVqZEdsdmJpaGhMR01wZTNaaGNpQmtQV011Y205M2N5NXNaVzVuZEdnL1l5NXliM2R6TG1sMFpXMG9NQ2t1YTJWNU9tNTFiR3c3WWloa0tYMHNablZ1WTNScGIyNG9ZU3hpS1h0a0tHSXBmU2w5S1gwcExtTmhkR05vS0dRcGZTazdjbVYwZFhKdUlHZ29aQ3hpS1N4a2ZXWjFibU4wYVc5dUlHRmhLR0VwZTNaaGNpQmlQWFJvYVhNc1l6MXVaWGNnZG1Fb1puVnVZM1JwYjI0b1lTeGpLWHRpTG5KbFlXUjVLQ2t1ZEdobGJpaG1kVzVqZEdsdmJpZ3BlM1poY2lCa1BXSXVYMlJpU1c1bWJ6dGtMbVJpTG5SeVlXNXpZV04wYVc5dUtHWjFibU4wYVc5dUtHSXBlMVFvWWl4a0xDSlRSVXhGUTFRZ2EyVjVJRVpTVDAwZ0lpdGtMbk4wYjNKbFRtRnRaU3hiWFN4bWRXNWpkR2x2YmloaUxHTXBlMlp2Y2loMllYSWdaRDFiWFN4bFBUQTdaVHhqTG5KdmQzTXViR1Z1WjNSb08yVXJLeWxrTG5CMWMyZ29ZeTV5YjNkekxtbDBaVzBvWlNrdWEyVjVLVHRoS0dRcGZTeG1kVzVqZEdsdmJpaGhMR0lwZTJNb1lpbDlLWDBwZlNrdVkyRjBZMmdvWXlsOUtUdHlaWFIxY200Z2FDaGpMR0VwTEdOOVpuVnVZM1JwYjI0Z1ltRW9ZU2w3Y21WMGRYSnVJRzVsZHlCMllTaG1kVzVqZEdsdmJpaGlMR01wZTJFdWRISmhibk5oWTNScGIyNG9ablZ1WTNScGIyNG9aQ2w3WkM1bGVHVmpkWFJsVTNGc0tDSlRSVXhGUTFRZ2JtRnRaU0JHVWs5TklITnhiR2wwWlY5dFlYTjBaWElnVjBoRlVrVWdkSGx3WlQwbmRHRmliR1VuSUVGT1JDQnVZVzFsSUR3K0lDZGZYMWRsWWt0cGRFUmhkR0ZpWVhObFNXNW1iMVJoWW14bFgxOG5JaXhiWFN4bWRXNWpkR2x2YmloakxHUXBlMlp2Y2loMllYSWdaVDFiWFN4bVBUQTdaanhrTG5KdmQzTXViR1Z1WjNSb08yWXJLeWxsTG5CMWMyZ29aQzV5YjNkekxtbDBaVzBvWmlrdWJtRnRaU2s3WWloN1pHSTZZU3h6ZEc5eVpVNWhiV1Z6T21WOUtYMHNablZ1WTNScGIyNG9ZU3hpS1h0aktHSXBmU2w5TEdaMWJtTjBhVzl1S0dFcGUyTW9ZU2w5S1gwcGZXWjFibU4wYVc5dUlHTmhLR0VzWWlsN1lqMXJMbUZ3Y0d4NUtIUm9hWE1zWVhKbmRXMWxiblJ6S1R0MllYSWdZejEwYUdsekxtTnZibVpwWnlncE8yRTlJbVoxYm1OMGFXOXVJaUU5ZEhsd1pXOW1JR0VtSm1GOGZIdDlMR0V1Ym1GdFpYeDhLR0V1Ym1GdFpUMWhMbTVoYldWOGZHTXVibUZ0WlN4aExuTjBiM0psVG1GdFpUMWhMbk4wYjNKbFRtRnRaWHg4WXk1emRHOXlaVTVoYldVcE8zWmhjaUJrTEdVOWRHaHBjenR5WlhSMWNtNGdaRDFoTG01aGJXVS9ibVYzSUhaaEtHWjFibU4wYVc5dUtHSXBlM1poY2lCa08yUTlZUzV1WVcxbFBUMDlZeTV1WVcxbFAyVXVYMlJpU1c1bWJ5NWtZanB2Y0dWdVJHRjBZV0poYzJVb1lTNXVZVzFsTENJaUxDSWlMREFwTEdJb1lTNXpkRzl5WlU1aGJXVS9lMlJpT21Rc2MzUnZjbVZPWVcxbGN6cGJZUzV6ZEc5eVpVNWhiV1ZkZlRwaVlTaGtLU2w5S1M1MGFHVnVLR1oxYm1OMGFXOXVLR0VwZTNKbGRIVnliaUJ1WlhjZ2RtRW9ablZ1WTNScGIyNG9ZaXhqS1h0aExtUmlMblJ5WVc1ellXTjBhVzl1S0daMWJtTjBhVzl1S0dRcGUyWjFibU4wYVc5dUlHVW9ZU2w3Y21WMGRYSnVJRzVsZHlCMllTaG1kVzVqZEdsdmJpaGlMR01wZTJRdVpYaGxZM1YwWlZOeGJDZ2lSRkpQVUNCVVFVSk1SU0JKUmlCRldFbFRWRk1nSWl0aExGdGRMR1oxYm1OMGFXOXVLQ2w3WWlncGZTeG1kVzVqZEdsdmJpaGhMR0lwZTJNb1lpbDlLWDBwZldadmNpaDJZWElnWmoxYlhTeG5QVEFzYUQxaExuTjBiM0psVG1GdFpYTXViR1Z1WjNSb08yYzhhRHRuS3lzcFppNXdkWE5vS0dVb1lTNXpkRzl5WlU1aGJXVnpXMmRkS1NrN2RtRXVZV3hzS0dZcExuUm9aVzRvWm5WdVkzUnBiMjRvS1h0aUtDbDlLUzVqWVhSamFDaG1kVzVqZEdsdmJpaGhLWHRqS0dFcGZTbDlMR1oxYm1OMGFXOXVLR0VwZTJNb1lTbDlLWDBwZlNrNmRtRXVjbVZxWldOMEtDSkpiblpoYkdsa0lHRnlaM1Z0Wlc1MGN5SXBMR2dvWkN4aUtTeGtmV1oxYm1OMGFXOXVJR1JoS0NsN2RISjVlM0psZEhWeWJpSjFibVJsWm1sdVpXUWlJVDEwZVhCbGIyWWdiRzlqWVd4VGRHOXlZV2RsSmlZaWMyVjBTWFJsYlNKcGJpQnNiMk5oYkZOMGIzSmhaMlVtSmlFaGJHOWpZV3hUZEc5eVlXZGxMbk5sZEVsMFpXMTlZMkYwWTJnb1lTbDdjbVYwZFhKdUlURjlmV1oxYm1OMGFXOXVJR1ZoS0dFc1lpbDdkbUZ5SUdNOVlTNXVZVzFsS3lJdklqdHlaWFIxY200Z1lTNXpkRzl5WlU1aGJXVWhQVDFpTG5OMGIzSmxUbUZ0WlNZbUtHTXJQV0V1YzNSdmNtVk9ZVzFsS3lJdklpa3NZMzFtZFc1amRHbHZiaUJtWVNncGUzWmhjaUJoUFNKZmJHOWpZV3htYjNKaFoyVmZjM1Z3Y0c5eWRGOTBaWE4wSWp0MGNubDdjbVYwZFhKdUlHeHZZMkZzVTNSdmNtRm5aUzV6WlhSSmRHVnRLR0VzSVRBcExHeHZZMkZzVTNSdmNtRm5aUzV5WlcxdmRtVkpkR1Z0S0dFcExDRXhmV05oZEdOb0tHRXBlM0psZEhWeWJpRXdmWDFtZFc1amRHbHZiaUJuWVNncGUzSmxkSFZ5YmlGbVlTZ3BmSHhzYjJOaGJGTjBiM0poWjJVdWJHVnVaM1JvUGpCOVpuVnVZM1JwYjI0Z2FHRW9ZU2w3ZG1GeUlHSTlkR2hwY3l4alBYdDlPMmxtS0dFcFptOXlLSFpoY2lCa0lHbHVJR0VwWTF0a1hUMWhXMlJkTzNKbGRIVnliaUJqTG10bGVWQnlaV1pwZUQxbFlTaGhMR0l1WDJSbFptRjFiSFJEYjI1bWFXY3BMR2RoS0NrL0tHSXVYMlJpU1c1bWJ6MWpMR011YzJWeWFXRnNhWHBsY2oxV1lTeDJZUzV5WlhOdmJIWmxLQ2twT25aaExuSmxhbVZqZENncGZXWjFibU4wYVc5dUlHbGhLR0VwZTNaaGNpQmlQWFJvYVhNc1l6MWlMbkpsWVdSNUtDa3VkR2hsYmlobWRXNWpkR2x2YmlncGUyWnZjaWgyWVhJZ1lUMWlMbDlrWWtsdVptOHVhMlY1VUhKbFptbDRMR005Ykc5allXeFRkRzl5WVdkbExteGxibWQwYUMweE8yTStQVEE3WXkwdEtYdDJZWElnWkQxc2IyTmhiRk4wYjNKaFoyVXVhMlY1S0dNcE96QTlQVDFrTG1sdVpHVjRUMllvWVNrbUpteHZZMkZzVTNSdmNtRm5aUzV5WlcxdmRtVkpkR1Z0S0dRcGZYMHBPM0psZEhWeWJpQm9LR01zWVNrc1kzMW1kVzVqZEdsdmJpQnFZU2hoTEdJcGUzWmhjaUJqUFhSb2FYTTdZVDFxS0dFcE8zWmhjaUJrUFdNdWNtVmhaSGtvS1M1MGFHVnVLR1oxYm1OMGFXOXVLQ2w3ZG1GeUlHSTlZeTVmWkdKSmJtWnZMR1E5Ykc5allXeFRkRzl5WVdkbExtZGxkRWwwWlcwb1lpNXJaWGxRY21WbWFYZ3JZU2s3Y21WMGRYSnVJR1FtSmloa1BXSXVjMlZ5YVdGc2FYcGxjaTVrWlhObGNtbGhiR2w2WlNoa0tTa3NaSDBwTzNKbGRIVnliaUJvS0dRc1lpa3NaSDFtZFc1amRHbHZiaUJyWVNoaExHSXBlM1poY2lCalBYUm9hWE1zWkQxakxuSmxZV1I1S0NrdWRHaGxiaWhtZFc1amRHbHZiaWdwZTJadmNpaDJZWElnWWoxakxsOWtZa2x1Wm04c1pEMWlMbXRsZVZCeVpXWnBlQ3hsUFdRdWJHVnVaM1JvTEdZOWJHOWpZV3hUZEc5eVlXZGxMbXhsYm1kMGFDeG5QVEVzYUQwd08yZzhaanRvS3lzcGUzWmhjaUJwUFd4dlkyRnNVM1J2Y21GblpTNXJaWGtvYUNrN2FXWW9NRDA5UFdrdWFXNWtaWGhQWmloa0tTbDdkbUZ5SUdvOWJHOWpZV3hUZEc5eVlXZGxMbWRsZEVsMFpXMG9hU2s3YVdZb2FpWW1LR285WWk1elpYSnBZV3hwZW1WeUxtUmxjMlZ5YVdGc2FYcGxLR29wS1N4MmIybGtJREFoUFQwb2FqMWhLR29zYVM1emRXSnpkSEpwYm1jb1pTa3NaeXNyS1NrcGNtVjBkWEp1SUdwOWZYMHBPM0psZEhWeWJpQm9LR1FzWWlrc1pIMW1kVzVqZEdsdmJpQnNZU2hoTEdJcGUzWmhjaUJqUFhSb2FYTXNaRDFqTG5KbFlXUjVLQ2t1ZEdobGJpaG1kVzVqZEdsdmJpZ3BlM1poY2lCaUxHUTlZeTVmWkdKSmJtWnZPM1J5ZVh0aVBXeHZZMkZzVTNSdmNtRm5aUzVyWlhrb1lTbDlZMkYwWTJnb1lTbDdZajF1ZFd4c2ZYSmxkSFZ5YmlCaUppWW9ZajFpTG5OMVluTjBjbWx1Wnloa0xtdGxlVkJ5WldacGVDNXNaVzVuZEdncEtTeGlmU2s3Y21WMGRYSnVJR2dvWkN4aUtTeGtmV1oxYm1OMGFXOXVJRzFoS0dFcGUzWmhjaUJpUFhSb2FYTXNZejFpTG5KbFlXUjVLQ2t1ZEdobGJpaG1kVzVqZEdsdmJpZ3BlMlp2Y2loMllYSWdZVDFpTGw5a1lrbHVabThzWXoxc2IyTmhiRk4wYjNKaFoyVXViR1Z1WjNSb0xHUTlXMTBzWlQwd08yVThZenRsS3lzcGUzWmhjaUJtUFd4dlkyRnNVM1J2Y21GblpTNXJaWGtvWlNrN01EMDlQV1l1YVc1a1pYaFBaaWhoTG10bGVWQnlaV1pwZUNrbUptUXVjSFZ6YUNobUxuTjFZbk4wY21sdVp5aGhMbXRsZVZCeVpXWnBlQzVzWlc1bmRHZ3BLWDF5WlhSMWNtNGdaSDBwTzNKbGRIVnliaUJvS0dNc1lTa3NZMzFtZFc1amRHbHZiaUJ1WVNoaEtYdDJZWElnWWoxMGFHbHpMR005WWk1clpYbHpLQ2t1ZEdobGJpaG1kVzVqZEdsdmJpaGhLWHR5WlhSMWNtNGdZUzVzWlc1bmRHaDlLVHR5WlhSMWNtNGdhQ2hqTEdFcExHTjlablZ1WTNScGIyNGdiMkVvWVN4aUtYdDJZWElnWXoxMGFHbHpPMkU5YWloaEtUdDJZWElnWkQxakxuSmxZV1I1S0NrdWRHaGxiaWhtZFc1amRHbHZiaWdwZTNaaGNpQmlQV011WDJSaVNXNW1ienRzYjJOaGJGTjBiM0poWjJVdWNtVnRiM1psU1hSbGJTaGlMbXRsZVZCeVpXWnBlQ3RoS1gwcE8zSmxkSFZ5YmlCb0tHUXNZaWtzWkgxbWRXNWpkR2x2YmlCd1lTaGhMR0lzWXlsN2RtRnlJR1E5ZEdocGN6dGhQV29vWVNrN2RtRnlJR1U5WkM1eVpXRmtlU2dwTG5Sb1pXNG9ablZ1WTNScGIyNG9LWHQyYjJsa0lEQTlQVDFpSmlZb1lqMXVkV3hzS1R0MllYSWdZejFpTzNKbGRIVnliaUJ1WlhjZ2RtRW9ablZ1WTNScGIyNG9aU3htS1h0MllYSWdaejFrTGw5a1lrbHVabTg3Wnk1elpYSnBZV3hwZW1WeUxuTmxjbWxoYkdsNlpTaGlMR1oxYm1OMGFXOXVLR0lzWkNsN2FXWW9aQ2xtS0dRcE8yVnNjMlVnZEhKNWUyeHZZMkZzVTNSdmNtRm5aUzV6WlhSSmRHVnRLR2N1YTJWNVVISmxabWw0SzJFc1lpa3NaU2hqS1gxallYUmphQ2hoS1hzaVVYVnZkR0ZGZUdObFpXUmxaRVZ5Y205eUlpRTlQV0V1Ym1GdFpTWW1JazVUWDBWU1VrOVNYMFJQVFY5UlZVOVVRVjlTUlVGRFNFVkVJaUU5UFdFdWJtRnRaWHg4WmloaEtTeG1LR0VwZlgwcGZTbDlLVHR5WlhSMWNtNGdhQ2hsTEdNcExHVjlablZ1WTNScGIyNGdjV0VvWVN4aUtYdHBaaWhpUFdzdVlYQndiSGtvZEdocGN5eGhjbWQxYldWdWRITXBMR0U5SW1aMWJtTjBhVzl1SWlFOWRIbHdaVzltSUdFbUptRjhmSHQ5TENGaExtNWhiV1VwZTNaaGNpQmpQWFJvYVhNdVkyOXVabWxuS0NrN1lTNXVZVzFsUFdFdWJtRnRaWHg4WXk1dVlXMWxMR0V1YzNSdmNtVk9ZVzFsUFdFdWMzUnZjbVZPWVcxbGZIeGpMbk4wYjNKbFRtRnRaWDEyWVhJZ1pDeGxQWFJvYVhNN2NtVjBkWEp1SUdROVlTNXVZVzFsUDI1bGR5QjJZU2htZFc1amRHbHZiaWhpS1h0aUtHRXVjM1J2Y21WT1lXMWxQMlZoS0dFc1pTNWZaR1ZtWVhWc2RFTnZibVpwWnlrNllTNXVZVzFsS3lJdklpbDlLUzUwYUdWdUtHWjFibU4wYVc5dUtHRXBlMlp2Y2loMllYSWdZajFzYjJOaGJGTjBiM0poWjJVdWJHVnVaM1JvTFRFN1lqNDlNRHRpTFMwcGUzWmhjaUJqUFd4dlkyRnNVM1J2Y21GblpTNXJaWGtvWWlrN01EMDlQV011YVc1a1pYaFBaaWhoS1NZbWJHOWpZV3hUZEc5eVlXZGxMbkpsYlc5MlpVbDBaVzBvWXlsOWZTazZkbUV1Y21WcVpXTjBLQ0pKYm5aaGJHbGtJR0Z5WjNWdFpXNTBjeUlwTEdnb1pDeGlLU3hrZldaMWJtTjBhVzl1SUhKaEtHRXNZaWw3WVZ0aVhUMW1kVzVqZEdsdmJpZ3BlM1poY2lCalBXRnlaM1Z0Wlc1MGN6dHlaWFIxY200Z1lTNXlaV0ZrZVNncExuUm9aVzRvWm5WdVkzUnBiMjRvS1h0eVpYUjFjbTRnWVZ0aVhTNWhjSEJzZVNoaExHTXBmU2w5ZldaMWJtTjBhVzl1SUhOaEtDbDdabTl5S0haaGNpQmhQVEU3WVR4aGNtZDFiV1Z1ZEhNdWJHVnVaM1JvTzJFckt5bDdkbUZ5SUdJOVlYSm5kVzFsYm5SelcyRmRPMmxtS0dJcFptOXlLSFpoY2lCaklHbHVJR0lwWWk1b1lYTlBkMjVRY205d1pYSjBlU2hqS1NZbUtDUmhLR0piWTEwcFAyRnlaM1Z0Wlc1MGMxc3dYVnRqWFQxaVcyTmRMbk5zYVdObEtDazZZWEpuZFcxbGJuUnpXekJkVzJOZFBXSmJZMTBwZlhKbGRIVnliaUJoY21kMWJXVnVkSE5iTUYxOWRtRnlJSFJoUFNKbWRXNWpkR2x2YmlJOVBYUjVjR1Z2WmlCVGVXMWliMndtSmlKemVXMWliMndpUFQxMGVYQmxiMllnVTNsdFltOXNMbWwwWlhKaGRHOXlQMloxYm1OMGFXOXVLR0VwZTNKbGRIVnliaUIwZVhCbGIyWWdZWDA2Wm5WdVkzUnBiMjRvWVNsN2NtVjBkWEp1SUdFbUppSm1kVzVqZEdsdmJpSTlQWFI1Y0dWdlppQlRlVzFpYjJ3bUptRXVZMjl1YzNSeWRXTjBiM0k5UFQxVGVXMWliMndtSm1FaFBUMVRlVzFpYjJ3dWNISnZkRzkwZVhCbFB5SnplVzFpYjJ3aU9uUjVjR1Z2WmlCaGZTeDFZVDFsS0NrN0luVnVaR1ZtYVc1bFpDSTlQWFI1Y0dWdlppQlFjbTl0YVhObEppWmhLRE1wTzNaaGNpQjJZVDFRY205dGFYTmxMSGRoUFNKc2IyTmhiQzFtYjNKaFoyVXRaR1YwWldOMExXSnNiMkl0YzNWd2NHOXlkQ0lzZUdFOWRtOXBaQ0F3TEhsaFBYdDlMSHBoUFU5aWFtVmpkQzV3Y205MGIzUjVjR1V1ZEc5VGRISnBibWNzUVdFOUluSmxZV1J2Ym14NUlpeENZVDBpY21WaFpIZHlhWFJsSWl4RFlUMTdYMlJ5YVhabGNqb2lZWE41Ym1OVGRHOXlZV2RsSWl4ZmFXNXBkRk4wYjNKaFoyVTZReXhmYzNWd2NHOXlkRHBtS0Nrc2FYUmxjbUYwWlRwRkxHZGxkRWwwWlcwNlJDeHpaWFJKZEdWdE9rWXNjbVZ0YjNabFNYUmxiVHBITEdOc1pXRnlPa2dzYkdWdVozUm9Pa2tzYTJWNU9rb3NhMlY1Y3pwTExHUnliM0JKYm5OMFlXNWpaVHBNZlN4RVlUMGlRVUpEUkVWR1IwaEpTa3RNVFU1UFVGRlNVMVJWVmxkWVdWcGhZbU5rWldabmFHbHFhMnh0Ym05d2NYSnpkSFYyZDNoNWVqQXhNak0wTlRZM09Ea3JMeUlzUldFOUluNStiRzlqWVd4ZlptOXlZV2RsWDNSNWNHVitJaXhHWVQwdlhuNStiRzlqWVd4ZlptOXlZV2RsWDNSNWNHVitLRnRlZmwwcktYNHZMRWRoUFNKZlgyeG1jMk5mWHpvaUxFaGhQVWRoTG14bGJtZDBhQ3hKWVQwaVlYSmlaaUlzU21FOUltSnNiMklpTEV0aFBTSnphVEE0SWl4TVlUMGlkV2t3T0NJc1RXRTlJblZwWXpnaUxFNWhQU0p6YVRFMklpeFBZVDBpYzJrek1pSXNVR0U5SW5WeU1UWWlMRkZoUFNKMWFUTXlJaXhTWVQwaVptd3pNaUlzVTJFOUltWnNOalFpTEZSaFBVaGhLMGxoTG14bGJtZDBhQ3hWWVQxUFltcGxZM1F1Y0hKdmRHOTBlWEJsTG5SdlUzUnlhVzVuTEZaaFBYdHpaWEpwWVd4cGVtVTZVQ3hrWlhObGNtbGhiR2w2WlRwUkxITjBjbWx1WjFSdlFuVm1abVZ5T2s0c1luVm1abVZ5Vkc5VGRISnBibWM2VDMwc1YyRTllMTlrY21sMlpYSTZJbmRsWWxOUlRGTjBiM0poWjJVaUxGOXBibWwwVTNSdmNtRm5aVHBUTEY5emRYQndiM0owT2swb0tTeHBkR1Z5WVhSbE9sWXNaMlYwU1hSbGJUcFZMSE5sZEVsMFpXMDZXQ3h5WlcxdmRtVkpkR1Z0T2xrc1kyeGxZWEk2V2l4c1pXNW5kR2c2SkN4clpYazZYeXhyWlhsek9tRmhMR1J5YjNCSmJuTjBZVzVqWlRwallYMHNXR0U5ZTE5a2NtbDJaWEk2SW14dlkyRnNVM1J2Y21GblpWZHlZWEJ3WlhJaUxGOXBibWwwVTNSdmNtRm5aVHBvWVN4ZmMzVndjRzl5ZERwa1lTZ3BMR2wwWlhKaGRHVTZhMkVzWjJWMFNYUmxiVHBxWVN4elpYUkpkR1Z0T25CaExISmxiVzkyWlVsMFpXMDZiMkVzWTJ4bFlYSTZhV0VzYkdWdVozUm9PbTVoTEd0bGVUcHNZU3hyWlhsek9tMWhMR1J5YjNCSmJuTjBZVzVqWlRweFlYMHNXV0U5Wm5WdVkzUnBiMjRvWVN4aUtYdHlaWFIxY200Z1lUMDlQV0o4ZkNKdWRXMWlaWElpUFQxMGVYQmxiMllnWVNZbUltNTFiV0psY2lJOVBYUjVjR1Z2WmlCaUppWnBjMDVoVGloaEtTWW1hWE5PWVU0b1lpbDlMRnBoUFdaMWJtTjBhVzl1S0dFc1lpbDdabTl5S0haaGNpQmpQV0V1YkdWdVozUm9MR1E5TUR0a1BHTTdLWHRwWmloWllTaGhXMlJkTEdJcEtYSmxkSFZ5YmlFd08yUXJLMzF5WlhSMWNtNGhNWDBzSkdFOVFYSnlZWGt1YVhOQmNuSmhlWHg4Wm5WdVkzUnBiMjRvWVNsN2NtVjBkWEp1SWx0dlltcGxZM1FnUVhKeVlYbGRJajA5UFU5aWFtVmpkQzV3Y205MGIzUjVjR1V1ZEc5VGRISnBibWN1WTJGc2JDaGhLWDBzWDJFOWUzMHNZV0k5ZTMwc1ltSTllMGxPUkVWWVJVUkVRanBEWVN4WFJVSlRVVXc2VjJFc1RFOURRVXhUVkU5U1FVZEZPbGhoZlN4allqMWJZbUl1U1U1RVJWaEZSRVJDTGw5a2NtbDJaWElzWW1JdVYwVkNVMUZNTGw5a2NtbDJaWElzWW1JdVRFOURRVXhUVkU5U1FVZEZMbDlrY21sMlpYSmRMR1JpUFZzaVpISnZjRWx1YzNSaGJtTmxJbDBzWldJOVd5SmpiR1ZoY2lJc0ltZGxkRWwwWlcwaUxDSnBkR1Z5WVhSbElpd2lhMlY1SWl3aWEyVjVjeUlzSW14bGJtZDBhQ0lzSW5KbGJXOTJaVWwwWlcwaUxDSnpaWFJKZEdWdElsMHVZMjl1WTJGMEtHUmlLU3htWWoxN1pHVnpZM0pwY0hScGIyNDZJaUlzWkhKcGRtVnlPbU5pTG5Oc2FXTmxLQ2tzYm1GdFpUb2liRzlqWVd4bWIzSmhaMlVpTEhOcGVtVTZORGs0TURjek5peHpkRzl5WlU1aGJXVTZJbXRsZVhaaGJIVmxjR0ZwY25NaUxIWmxjbk5wYjI0Nk1YMHNaMkk5Wm5WdVkzUnBiMjRvS1h0bWRXNWpkR2x2YmlCaEtHSXBlMlFvZEdocGN5eGhLVHRtYjNJb2RtRnlJR01nYVc0Z1ltSXBhV1lvWW1JdWFHRnpUM2R1VUhKdmNHVnlkSGtvWXlrcGUzWmhjaUJsUFdKaVcyTmRMR1k5WlM1ZlpISnBkbVZ5TzNSb2FYTmJZMTA5Wml4ZllWdG1YWHg4ZEdocGN5NWtaV1pwYm1WRWNtbDJaWElvWlNsOWRHaHBjeTVmWkdWbVlYVnNkRU52Ym1acFp6MXpZU2g3ZlN4bVlpa3NkR2hwY3k1ZlkyOXVabWxuUFhOaEtIdDlMSFJvYVhNdVgyUmxabUYxYkhSRGIyNW1hV2NzWWlrc2RHaHBjeTVmWkhKcGRtVnlVMlYwUFc1MWJHd3NkR2hwY3k1ZmFXNXBkRVJ5YVhabGNqMXVkV3hzTEhSb2FYTXVYM0psWVdSNVBTRXhMSFJvYVhNdVgyUmlTVzVtYnoxdWRXeHNMSFJvYVhNdVgzZHlZWEJNYVdKeVlYSjVUV1YwYUc5a2MxZHBkR2hTWldGa2VTZ3BMSFJvYVhNdWMyVjBSSEpwZG1WeUtIUm9hWE11WDJOdmJtWnBaeTVrY21sMlpYSXBMbU5oZEdOb0tHWjFibU4wYVc5dUtDbDdmU2w5Y21WMGRYSnVJR0V1Y0hKdmRHOTBlWEJsTG1OdmJtWnBaejFtZFc1amRHbHZiaWhoS1h0cFppZ2liMkpxWldOMElqMDlQU2gyYjJsa0lEQTlQVDFoUHlKMWJtUmxabWx1WldRaU9uUmhLR0VwS1NsN2FXWW9kR2hwY3k1ZmNtVmhaSGtwY21WMGRYSnVJRzVsZHlCRmNuSnZjaWdpUTJGdUozUWdZMkZzYkNCamIyNW1hV2NvS1NCaFpuUmxjaUJzYjJOaGJHWnZjbUZuWlNCb1lYTWdZbVZsYmlCMWMyVmtMaUlwTzJadmNpaDJZWElnWWlCcGJpQmhLWHRwWmlnaWMzUnZjbVZPWVcxbElqMDlQV0ltSmloaFcySmRQV0ZiWWwwdWNtVndiR0ZqWlNndlhGY3ZaeXdpWHlJcEtTd2lkbVZ5YzJsdmJpSTlQVDFpSmlZaWJuVnRZbVZ5SWlFOWRIbHdaVzltSUdGYllsMHBjbVYwZFhKdUlHNWxkeUJGY25KdmNpZ2lSR0YwWVdKaGMyVWdkbVZ5YzJsdmJpQnRkWE4wSUdKbElHRWdiblZ0WW1WeUxpSXBPM1JvYVhNdVgyTnZibVpwWjF0aVhUMWhXMkpkZlhKbGRIVnliaUVvSW1SeWFYWmxjaUpwYmlCaEppWmhMbVJ5YVhabGNpbDhmSFJvYVhNdWMyVjBSSEpwZG1WeUtIUm9hWE11WDJOdmJtWnBaeTVrY21sMlpYSXBmWEpsZEhWeWJpSnpkSEpwYm1jaVBUMTBlWEJsYjJZZ1lUOTBhR2x6TGw5amIyNW1hV2RiWVYwNmRHaHBjeTVmWTI5dVptbG5mU3hoTG5CeWIzUnZkSGx3WlM1a1pXWnBibVZFY21sMlpYSTlablZ1WTNScGIyNG9ZU3hpTEdNcGUzWmhjaUJrUFc1bGR5QjJZU2htZFc1amRHbHZiaWhpTEdNcGUzUnllWHQyWVhJZ1pEMWhMbDlrY21sMlpYSXNaVDF1WlhjZ1JYSnliM0lvSWtOMWMzUnZiU0JrY21sMlpYSWdibTkwSUdOdmJYQnNhV0Z1ZERzZ2MyVmxJR2gwZEhCek9pOHZiVzk2YVd4c1lTNW5hWFJvZFdJdWFXOHZiRzlqWVd4R2IzSmhaMlV2STJSbFptbHVaV1J5YVhabGNpSXBPMmxtS0NGaExsOWtjbWwyWlhJcGNtVjBkWEp1SUhadmFXUWdZeWhsS1R0bWIzSW9kbUZ5SUdZOVpXSXVZMjl1WTJGMEtDSmZhVzVwZEZOMGIzSmhaMlVpS1N4blBUQXNhVDFtTG14bGJtZDBhRHRuUEdrN1p5c3JLWHQyWVhJZ2FqMW1XMmRkTzJsbUtDZ2hXbUVvWkdJc2FpbDhmR0ZiYWwwcEppWWlablZ1WTNScGIyNGlJVDEwZVhCbGIyWWdZVnRxWFNseVpYUjFjbTRnZG05cFpDQmpLR1VwZlNobWRXNWpkR2x2YmlncGUyWnZjaWgyWVhJZ1lqMW1kVzVqZEdsdmJpaGhLWHR5WlhSMWNtNGdablZ1WTNScGIyNG9LWHQyWVhJZ1lqMXVaWGNnUlhKeWIzSW9JazFsZEdodlpDQWlLMkVySWlCcGN5QnViM1FnYVcxd2JHVnRaVzUwWldRZ1lua2dkR2hsSUdOMWNuSmxiblFnWkhKcGRtVnlJaWtzWXoxMllTNXlaV3BsWTNRb1lpazdjbVYwZFhKdUlHZ29ZeXhoY21kMWJXVnVkSE5iWVhKbmRXMWxiblJ6TG14bGJtZDBhQzB4WFNrc1kzMTlMR005TUN4a1BXUmlMbXhsYm1kMGFEdGpQR1E3WXlzcktYdDJZWElnWlQxa1lsdGpYVHRoVzJWZGZId29ZVnRsWFQxaUtHVXBLWDE5S1NncE8zWmhjaUJyUFdaMWJtTjBhVzl1S0dNcGUxOWhXMlJkSmlaamIyNXpiMnhsTG1sdVptOG9JbEpsWkdWbWFXNXBibWNnVEc5allXeEdiM0poWjJVZ1pISnBkbVZ5T2lBaUsyUXBMRjloVzJSZFBXRXNZV0piWkYwOVl5eGlLQ2w5T3lKZmMzVndjRzl5ZENKcGJpQmhQMkV1WDNOMWNIQnZjblFtSmlKbWRXNWpkR2x2YmlJOVBYUjVjR1Z2WmlCaExsOXpkWEJ3YjNKMFAyRXVYM04xY0hCdmNuUW9LUzUwYUdWdUtHc3NZeWs2YXlnaElXRXVYM04xY0hCdmNuUXBPbXNvSVRBcGZXTmhkR05vS0dFcGUyTW9ZU2w5ZlNrN2NtVjBkWEp1SUdrb1pDeGlMR01wTEdSOUxHRXVjSEp2ZEc5MGVYQmxMbVJ5YVhabGNqMW1kVzVqZEdsdmJpZ3BlM0psZEhWeWJpQjBhR2x6TGw5a2NtbDJaWEo4Zkc1MWJHeDlMR0V1Y0hKdmRHOTBlWEJsTG1kbGRFUnlhWFpsY2oxbWRXNWpkR2x2YmloaExHSXNZeWw3ZG1GeUlHUTlYMkZiWVYwL2RtRXVjbVZ6YjJ4MlpTaGZZVnRoWFNrNmRtRXVjbVZxWldOMEtHNWxkeUJGY25KdmNpZ2lSSEpwZG1WeUlHNXZkQ0JtYjNWdVpDNGlLU2s3Y21WMGRYSnVJR2tvWkN4aUxHTXBMR1I5TEdFdWNISnZkRzkwZVhCbExtZGxkRk5sY21saGJHbDZaWEk5Wm5WdVkzUnBiMjRvWVNsN2RtRnlJR0k5ZG1FdWNtVnpiMngyWlNoV1lTazdjbVYwZFhKdUlHa29ZaXhoS1N4aWZTeGhMbkJ5YjNSdmRIbHdaUzV5WldGa2VUMW1kVzVqZEdsdmJpaGhLWHQyWVhJZ1lqMTBhR2x6TEdNOVlpNWZaSEpwZG1WeVUyVjBMblJvWlc0b1puVnVZM1JwYjI0b0tYdHlaWFIxY200Z2JuVnNiRDA5UFdJdVgzSmxZV1I1SmlZb1lpNWZjbVZoWkhrOVlpNWZhVzVwZEVSeWFYWmxjaWdwS1N4aUxsOXlaV0ZrZVgwcE8zSmxkSFZ5YmlCcEtHTXNZU3hoS1N4amZTeGhMbkJ5YjNSdmRIbHdaUzV6WlhSRWNtbDJaWEk5Wm5WdVkzUnBiMjRvWVN4aUxHTXBlMloxYm1OMGFXOXVJR1FvS1h0bkxsOWpiMjVtYVdjdVpISnBkbVZ5UFdjdVpISnBkbVZ5S0NsOVpuVnVZM1JwYjI0Z1pTaGhLWHR5WlhSMWNtNGdaeTVmWlhoMFpXNWtLR0VwTEdRb0tTeG5MbDl5WldGa2VUMW5MbDlwYm1sMFUzUnZjbUZuWlNobkxsOWpiMjVtYVdjcExHY3VYM0psWVdSNWZXWjFibU4wYVc5dUlHWW9ZU2w3Y21WMGRYSnVJR1oxYm1OMGFXOXVLQ2w3Wm5WdVkzUnBiMjRnWWlncGUyWnZjaWc3WXp4aExteGxibWQwYURzcGUzWmhjaUJtUFdGYlkxMDdjbVYwZFhKdUlHTXJLeXhuTGw5a1lrbHVabTg5Ym5Wc2JDeG5MbDl5WldGa2VUMXVkV3hzTEdjdVoyVjBSSEpwZG1WeUtHWXBMblJvWlc0b1pTa3VZMkYwWTJnb1lpbDlaQ2dwTzNaaGNpQm9QVzVsZHlCRmNuSnZjaWdpVG04Z1lYWmhhV3hoWW14bElITjBiM0poWjJVZ2JXVjBhRzlrSUdadmRXNWtMaUlwTzNKbGRIVnliaUJuTGw5a2NtbDJaWEpUWlhROWRtRXVjbVZxWldOMEtHZ3BMR2N1WDJSeWFYWmxjbE5sZEgxMllYSWdZejB3TzNKbGRIVnliaUJpS0NsOWZYWmhjaUJuUFhSb2FYTTdKR0VvWVNsOGZDaGhQVnRoWFNrN2RtRnlJR2c5ZEdocGN5NWZaMlYwVTNWd2NHOXlkR1ZrUkhKcGRtVnljeWhoS1N4cVBXNTFiR3doUFQxMGFHbHpMbDlrY21sMlpYSlRaWFEvZEdocGN5NWZaSEpwZG1WeVUyVjBMbU5oZEdOb0tHWjFibU4wYVc5dUtDbDdjbVYwZFhKdUlIWmhMbkpsYzI5c2RtVW9LWDBwT25aaExuSmxjMjlzZG1Vb0tUdHlaWFIxY200Z2RHaHBjeTVmWkhKcGRtVnlVMlYwUFdvdWRHaGxiaWhtZFc1amRHbHZiaWdwZTNaaGNpQmhQV2hiTUYwN2NtVjBkWEp1SUdjdVgyUmlTVzVtYnoxdWRXeHNMR2N1WDNKbFlXUjVQVzUxYkd3c1p5NW5aWFJFY21sMlpYSW9ZU2t1ZEdobGJpaG1kVzVqZEdsdmJpaGhLWHRuTGw5a2NtbDJaWEk5WVM1ZlpISnBkbVZ5TEdRb0tTeG5MbDkzY21Gd1RHbGljbUZ5ZVUxbGRHaHZaSE5YYVhSb1VtVmhaSGtvS1N4bkxsOXBibWwwUkhKcGRtVnlQV1lvYUNsOUtYMHBMbU5oZEdOb0tHWjFibU4wYVc5dUtDbDdaQ2dwTzNaaGNpQmhQVzVsZHlCRmNuSnZjaWdpVG04Z1lYWmhhV3hoWW14bElITjBiM0poWjJVZ2JXVjBhRzlrSUdadmRXNWtMaUlwTzNKbGRIVnliaUJuTGw5a2NtbDJaWEpUWlhROWRtRXVjbVZxWldOMEtHRXBMR2N1WDJSeWFYWmxjbE5sZEgwcExHa29kR2hwY3k1ZlpISnBkbVZ5VTJWMExHSXNZeWtzZEdocGN5NWZaSEpwZG1WeVUyVjBmU3hoTG5CeWIzUnZkSGx3WlM1emRYQndiM0owY3oxbWRXNWpkR2x2YmloaEtYdHlaWFIxY200aElXRmlXMkZkZlN4aExuQnliM1J2ZEhsd1pTNWZaWGgwWlc1a1BXWjFibU4wYVc5dUtHRXBlM05oS0hSb2FYTXNZU2w5TEdFdWNISnZkRzkwZVhCbExsOW5aWFJUZFhCd2IzSjBaV1JFY21sMlpYSnpQV1oxYm1OMGFXOXVLR0VwZTJadmNpaDJZWElnWWoxYlhTeGpQVEFzWkQxaExteGxibWQwYUR0alBHUTdZeXNyS1h0MllYSWdaVDFoVzJOZE8zUm9hWE11YzNWd2NHOXlkSE1vWlNrbUptSXVjSFZ6YUNobEtYMXlaWFIxY200Z1luMHNZUzV3Y205MGIzUjVjR1V1WDNkeVlYQk1hV0p5WVhKNVRXVjBhRzlrYzFkcGRHaFNaV0ZrZVQxbWRXNWpkR2x2YmlncGUyWnZjaWgyWVhJZ1lUMHdMR0k5WldJdWJHVnVaM1JvTzJFOFlqdGhLeXNwY21Fb2RHaHBjeXhsWWx0aFhTbDlMR0V1Y0hKdmRHOTBlWEJsTG1OeVpXRjBaVWx1YzNSaGJtTmxQV1oxYm1OMGFXOXVLR0lwZTNKbGRIVnliaUJ1WlhjZ1lTaGlLWDBzWVgwb0tTeG9ZajF1WlhjZ1oySTdZaTVsZUhCdmNuUnpQV2hpZlN4N016b3pmVjE5TEh0OUxGczBYU2tvTkNsOUtUc0tJQ0FnSUNBZ0lDQThMM05qY21sd2RENEtJQ0FnSUNBZ0lDQThjMk55YVhCMFBnb3ZLZ29KYUhSMGNITTZMeTluYVhSb2RXSXVZMjl0TDNOdmJHUmxjbXB6TDFSbGVIUkZibU52WkdWeVRHbDBaUW9KUVhCaFkyaGxJREl1TUFvcUx3cG1kVzVqZEdsdmJpQlVaWGgwUlc1amIyUmxja3hwZEdVb0tYdDlablZ1WTNScGIyNGdWR1Y0ZEVSbFkyOWtaWEpNYVhSbEtDbDdmU2htZFc1amRHbHZiaWdwZXlKMWMyVWdjM1J5YVdOMElqdG1kVzVqZEdsdmJpQjFkR1k0Vkc5Q2VYUmxjeWh6ZEhKcGJtY3NkVzVwZEhNcGUzVnVhWFJ6UFhWdWFYUnpmSHhKYm1acGJtbDBlVHQyWVhJZ1kyOWtaVkJ2YVc1ME8zWmhjaUJzWlc1bmRHZzljM1J5YVc1bkxteGxibWQwYUR0MllYSWdiR1ZoWkZOMWNuSnZaMkYwWlQxdWRXeHNPM1poY2lCaWVYUmxjejFiWFR0MllYSWdhVDB3TzJadmNpZzdhVHhzWlc1bmRHZzdhU3NyS1h0amIyUmxVRzlwYm5ROWMzUnlhVzVuTG1Ob1lYSkRiMlJsUVhRb2FTazdhV1lvWTI5a1pWQnZhVzUwUGpVMU1qazFKaVpqYjJSbFVHOXBiblE4TlRjek5EUXBlMmxtS0d4bFlXUlRkWEp5YjJkaGRHVXBlMmxtS0dOdlpHVlFiMmx1ZER3MU5qTXlNQ2w3YVdZb0tIVnVhWFJ6TFQwektUNHRNU2xpZVhSbGN5NXdkWE5vS0RJek9Td3hPVEVzTVRnNUtUdHNaV0ZrVTNWeWNtOW5ZWFJsUFdOdlpHVlFiMmx1ZER0amIyNTBhVzUxWlgxbGJITmxlMk52WkdWUWIybHVkRDFzWldGa1UzVnljbTluWVhSbExUVTFNamsyUER3eE1IeGpiMlJsVUc5cGJuUXROVFl6TWpCOE5qVTFNelk3YkdWaFpGTjFjbkp2WjJGMFpUMXVkV3hzZlgxbGJITmxlMmxtS0dOdlpHVlFiMmx1ZEQ0MU5qTXhPU2w3YVdZb0tIVnVhWFJ6TFQwektUNHRNU2xpZVhSbGN5NXdkWE5vS0RJek9Td3hPVEVzTVRnNUtUdGpiMjUwYVc1MVpYMWxiSE5sSUdsbUtHa3JNVDA5UFd4bGJtZDBhQ2w3YVdZb0tIVnVhWFJ6TFQwektUNHRNU2xpZVhSbGN5NXdkWE5vS0RJek9Td3hPVEVzTVRnNUtUdGpiMjUwYVc1MVpYMWxiSE5sZTJ4bFlXUlRkWEp5YjJkaGRHVTlZMjlrWlZCdmFXNTBPMk52Ym5ScGJuVmxmWDE5Wld4elpTQnBaaWhzWldGa1UzVnljbTluWVhSbEtYdHBaaWdvZFc1cGRITXRQVE1wUGkweEtXSjVkR1Z6TG5CMWMyZ29Nak01TERFNU1Td3hPRGtwTzJ4bFlXUlRkWEp5YjJkaGRHVTliblZzYkgxcFppaGpiMlJsVUc5cGJuUThNVEk0S1h0cFppZ29kVzVwZEhNdFBURXBQREFwWW5KbFlXczdZbmwwWlhNdWNIVnphQ2hqYjJSbFVHOXBiblFwZldWc2MyVWdhV1lvWTI5a1pWQnZhVzUwUERJd05EZ3BlMmxtS0NoMWJtbDBjeTA5TWlrOE1DbGljbVZoYXp0aWVYUmxjeTV3ZFhOb0tHTnZaR1ZRYjJsdWRENCtObnd4T1RJc1kyOWtaVkJ2YVc1MEpqWXpmREV5T0NsOVpXeHpaU0JwWmloamIyUmxVRzlwYm5ROE5qVTFNellwZTJsbUtDaDFibWwwY3kwOU15azhNQ2xpY21WaGF6dGllWFJsY3k1d2RYTm9LR052WkdWUWIybHVkRDQrTVRKOE1qSTBMR052WkdWUWIybHVkRDQrTmlZMk0zd3hNamdzWTI5a1pWQnZhVzUwSmpZemZERXlPQ2w5Wld4elpTQnBaaWhqYjJSbFVHOXBiblE4TWpBNU56RTFNaWw3YVdZb0tIVnVhWFJ6TFQwMEtUd3dLV0p5WldGck8ySjVkR1Z6TG5CMWMyZ29ZMjlrWlZCdmFXNTBQajR4T0h3eU5EQXNZMjlrWlZCdmFXNTBQajR4TWlZMk0zd3hNamdzWTI5a1pWQnZhVzUwUGo0MkpqWXpmREV5T0N4amIyUmxVRzlwYm5RbU5qTjhNVEk0S1gxbGJITmxlM1JvY205M0lHNWxkeUJGY25KdmNpZ2lTVzUyWVd4cFpDQmpiMlJsSUhCdmFXNTBJaWw5ZlhKbGRIVnliaUJpZVhSbGMzMW1kVzVqZEdsdmJpQjFkR1k0VTJ4cFkyVW9ZblZtTEhOMFlYSjBMR1Z1WkNsN2RtRnlJSEpsY3owaUlqdDJZWElnZEcxd1BTSWlPMlZ1WkQxTllYUm9MbTFwYmloaWRXWXViR1Z1WjNSb0xHVnVaSHg4U1c1bWFXNXBkSGtwTzNOMFlYSjBQWE4wWVhKMGZId3dPMlp2Y2loMllYSWdhVDF6ZEdGeWREdHBQR1Z1WkR0cEt5c3BlMmxtS0dKMVpsdHBYVHc5TVRJM0tYdHlaWE1yUFdSbFkyOWtaVlYwWmpoRGFHRnlLSFJ0Y0NrclUzUnlhVzVuTG1aeWIyMURhR0Z5UTI5a1pTaGlkV1piYVYwcE8zUnRjRDBpSW4xbGJITmxlM1J0Y0NzOUlpVWlLMkoxWmx0cFhTNTBiMU4wY21sdVp5Z3hOaWw5ZlhKbGRIVnliaUJ5WlhNclpHVmpiMlJsVlhSbU9FTm9ZWElvZEcxd0tYMW1kVzVqZEdsdmJpQmtaV052WkdWVmRHWTRRMmhoY2loemRISXBlM1J5ZVh0eVpYUjFjbTRnWkdWamIyUmxWVkpKUTI5dGNHOXVaVzUwS0hOMGNpbDlZMkYwWTJnb1pYSnlLWHR5WlhSMWNtNGdVM1J5YVc1bkxtWnliMjFEYUdGeVEyOWtaU2cyTlRVek15bDlmVlJsZUhSRmJtTnZaR1Z5VEdsMFpTNXdjbTkwYjNSNWNHVXVaVzVqYjJSbFBXWjFibU4wYVc5dUtITjBjaWw3ZG1GeUlISmxjM1ZzZER0cFppZ2lkVzVrWldacGJtVmtJajA5UFhSNWNHVnZaaUJWYVc1ME9FRnljbUY1S1h0eVpYTjFiSFE5ZFhSbU9GUnZRbmwwWlhNb2MzUnlLWDFsYkhObGUzSmxjM1ZzZEQxdVpYY2dWV2x1ZERoQmNuSmhlU2gxZEdZNFZHOUNlWFJsY3loemRISXBLWDF5WlhSMWNtNGdjbVZ6ZFd4MGZUdFVaWGgwUkdWamIyUmxja3hwZEdVdWNISnZkRzkwZVhCbExtUmxZMjlrWlQxbWRXNWpkR2x2YmloaWVYUmxjeWw3Y21WMGRYSnVJSFYwWmpoVGJHbGpaU2hpZVhSbGN5d3dMR0o1ZEdWekxteGxibWQwYUNsOWZTa29LVHRwWmloMGVYQmxiMllnYlc5a2RXeGxQVDA5SW05aWFtVmpkQ0ltSm0xdlpIVnNaU2w3Ylc5a2RXeGxMbVY0Y0c5eWRITXVWR1Y0ZEVSbFkyOWtaWEpNYVhSbFBWUmxlSFJFWldOdlpHVnlUR2wwWlR0dGIyUjFiR1V1Wlhod2IzSjBjeTVVWlhoMFJXNWpiMlJsY2t4cGRHVTlWR1Y0ZEVWdVkyOWtaWEpNYVhSbGZRb2dJQ0FnSUNBZ0lEd3ZjMk55YVhCMFBnb2dJQ0FnSUNBZ0lEeHpZM0pwY0hRK0NpOHFDZ2xvZEhSd2N6b3ZMMmRwZEdoMVlpNWpiMjB2WW1WaGRHZGhiVzFwZEM5aVlYTmxOalF0YW5NS0lBbE5TVlFLS2k4S0tHWjFibU4wYVc5dUtISXBlMmxtS0hSNWNHVnZaaUJsZUhCdmNuUnpQVDA5SW05aWFtVmpkQ0ltSm5SNWNHVnZaaUJ0YjJSMWJHVWhQVDBpZFc1a1pXWnBibVZrSWlsN2JXOWtkV3hsTG1WNGNHOXlkSE05Y2lncGZXVnNjMlVnYVdZb2RIbHdaVzltSUdSbFptbHVaVDA5UFNKbWRXNWpkR2x2YmlJbUptUmxabWx1WlM1aGJXUXBlMlJsWm1sdVpTaGJYU3h5S1gxbGJITmxlM1poY2lCbE8ybG1LSFI1Y0dWdlppQjNhVzVrYjNjaFBUMGlkVzVrWldacGJtVmtJaWw3WlQxM2FXNWtiM2Q5Wld4elpTQnBaaWgwZVhCbGIyWWdaMnh2WW1Gc0lUMDlJblZ1WkdWbWFXNWxaQ0lwZTJVOVoyeHZZbUZzZldWc2MyVWdhV1lvZEhsd1pXOW1JSE5sYkdZaFBUMGlkVzVrWldacGJtVmtJaWw3WlQxelpXeG1mV1ZzYzJWN1pUMTBhR2x6ZldVdVltRnpaVFkwYW5NOWNpZ3BmWDBwS0daMWJtTjBhVzl1S0NsN2RtRnlJSElzWlN4dU8zSmxkSFZ5YmlCbWRXNWpkR2x2YmlncGUyWjFibU4wYVc5dUlISW9aU3h1TEhRcGUyWjFibU4wYVc5dUlHOG9aaXhwS1h0cFppZ2hibHRtWFNsN2FXWW9JV1ZiWmwwcGUzWmhjaUIxUFNKbWRXNWpkR2x2YmlJOVBYUjVjR1Z2WmlCeVpYRjFhWEpsSmlaeVpYRjFhWEpsTzJsbUtDRnBKaVoxS1hKbGRIVnliaUIxS0dZc0lUQXBPMmxtS0dFcGNtVjBkWEp1SUdFb1ppd2hNQ2s3ZG1GeUlIWTlibVYzSUVWeWNtOXlLQ0pEWVc1dWIzUWdabWx1WkNCdGIyUjFiR1VnSnlJclppc2lKeUlwTzNSb2NtOTNJSFl1WTI5a1pUMGlUVTlFVlV4RlgwNVBWRjlHVDFWT1JDSXNkbjEyWVhJZ1pEMXVXMlpkUFh0bGVIQnZjblJ6T250OWZUdGxXMlpkV3pCZExtTmhiR3dvWkM1bGVIQnZjblJ6TEdaMWJtTjBhVzl1S0hJcGUzWmhjaUJ1UFdWYlpsMWJNVjFiY2wwN2NtVjBkWEp1SUc4b2JueDhjaWw5TEdRc1pDNWxlSEJ2Y25SekxISXNaU3h1TEhRcGZYSmxkSFZ5YmlCdVcyWmRMbVY0Y0c5eWRITjlabTl5S0haaGNpQmhQU0ptZFc1amRHbHZiaUk5UFhSNWNHVnZaaUJ5WlhGMWFYSmxKaVp5WlhGMWFYSmxMR1k5TUR0bVBIUXViR1Z1WjNSb08yWXJLeWx2S0hSYlpsMHBPM0psZEhWeWJpQnZmWEpsZEhWeWJpQnlmU2dwS0hzaUx5STZXMloxYm1OMGFXOXVLSElzWlN4dUtYc2lkWE5sSUhOMGNtbGpkQ0k3Ymk1aWVYUmxUR1Z1WjNSb1BXUTdiaTUwYjBKNWRHVkJjbkpoZVQxb08yNHVabkp2YlVKNWRHVkJjbkpoZVQxd08zWmhjaUIwUFZ0ZE8zWmhjaUJ2UFZ0ZE8zWmhjaUJoUFhSNWNHVnZaaUJWYVc1ME9FRnljbUY1SVQwOUluVnVaR1ZtYVc1bFpDSS9WV2x1ZERoQmNuSmhlVHBCY25KaGVUdDJZWElnWmowaVFVSkRSRVZHUjBoSlNrdE1UVTVQVUZGU1UxUlZWbGRZV1ZwaFltTmtaV1puYUdscWEyeHRibTl3Y1hKemRIVjJkM2g1ZWpBeE1qTTBOVFkzT0Rrckx5STdabTl5S0haaGNpQnBQVEFzZFQxbUxteGxibWQwYUR0cFBIVTdLeXRwS1h0MFcybGRQV1piYVYwN2IxdG1MbU5vWVhKRGIyUmxRWFFvYVNsZFBXbDliMXNpTFNJdVkyaGhja052WkdWQmRDZ3dLVjA5TmpJN2Ixc2lYeUl1WTJoaGNrTnZaR1ZCZENnd0tWMDlOak03Wm5WdVkzUnBiMjRnZGloeUtYdDJZWElnWlQxeUxteGxibWQwYUR0cFppaGxKVFErTUNsN2RHaHliM2NnYm1WM0lFVnljbTl5S0NKSmJuWmhiR2xrSUhOMGNtbHVaeTRnVEdWdVozUm9JRzExYzNRZ1ltVWdZU0J0ZFd4MGFYQnNaU0J2WmlBMElpbDlkbUZ5SUc0OWNpNXBibVJsZUU5bUtDSTlJaWs3YVdZb2JqMDlQUzB4S1c0OVpUdDJZWElnZEQxdVBUMDlaVDh3T2pRdGJpVTBPM0psZEhWeWJsdHVMSFJkZldaMWJtTjBhVzl1SUdRb2NpbDdkbUZ5SUdVOWRpaHlLVHQyWVhJZ2JqMWxXekJkTzNaaGNpQjBQV1ZiTVYwN2NtVjBkWEp1S0c0cmRDa3FNeTgwTFhSOVpuVnVZM1JwYjI0Z1l5aHlMR1VzYmlsN2NtVjBkWEp1S0dVcmJpa3FNeTgwTFc1OVpuVnVZM1JwYjI0Z2FDaHlLWHQyWVhJZ1pUdDJZWElnYmoxMktISXBPM1poY2lCMFBXNWJNRjA3ZG1GeUlHWTlibHN4WFR0MllYSWdhVDF1WlhjZ1lTaGpLSElzZEN4bUtTazdkbUZ5SUhVOU1EdDJZWElnWkQxbVBqQS9kQzAwT25RN1ptOXlLSFpoY2lCb1BUQTdhRHhrTzJnclBUUXBlMlU5YjF0eUxtTm9ZWEpEYjJSbFFYUW9hQ2xkUER3eE9IeHZXM0l1WTJoaGNrTnZaR1ZCZENob0t6RXBYVHc4TVRKOGIxdHlMbU5vWVhKRGIyUmxRWFFvYUNzeUtWMDhQRFo4YjF0eUxtTm9ZWEpEYjJSbFFYUW9hQ3N6S1YwN2FWdDFLeXRkUFdVK1BqRTJKakkxTlR0cFczVXJLMTA5WlQ0K09DWXlOVFU3YVZ0MUt5dGRQV1VtTWpVMWZXbG1LR1k5UFQweUtYdGxQVzliY2k1amFHRnlRMjlrWlVGMEtHZ3BYVHc4TW54dlczSXVZMmhoY2tOdlpHVkJkQ2hvS3pFcFhUNCtORHRwVzNVcksxMDlaU1l5TlRWOWFXWW9aajA5UFRFcGUyVTliMXR5TG1Ob1lYSkRiMlJsUVhRb2FDbGRQRHd4TUh4dlczSXVZMmhoY2tOdlpHVkJkQ2hvS3pFcFhUdzhOSHh2VzNJdVkyaGhja052WkdWQmRDaG9LeklwWFQ0K01qdHBXM1VySzEwOVpUNCtPQ1l5TlRVN2FWdDFLeXRkUFdVbU1qVTFmWEpsZEhWeWJpQnBmV1oxYm1OMGFXOXVJSE1vY2lsN2NtVjBkWEp1SUhSYmNqNCtNVGdtTmpOZEszUmJjajQrTVRJbU5qTmRLM1JiY2o0K05pWTJNMTByZEZ0eUpqWXpYWDFtZFc1amRHbHZiaUJzS0hJc1pTeHVLWHQyWVhJZ2REdDJZWElnYnoxYlhUdG1iM0lvZG1GeUlHRTlaVHRoUEc0N1lTczlNeWw3ZEQwb2NsdGhYVHc4TVRZbU1UWTNNVEUyT0RBcEt5aHlXMkVyTVYwOFBEZ21OalV5T0RBcEt5aHlXMkVyTWwwbU1qVTFLVHR2TG5CMWMyZ29jeWgwS1NsOWNtVjBkWEp1SUc4dWFtOXBiaWdpSWlsOVpuVnVZM1JwYjI0Z2NDaHlLWHQyWVhJZ1pUdDJZWElnYmoxeUxteGxibWQwYUR0MllYSWdiejF1SlRNN2RtRnlJR0U5VzEwN2RtRnlJR1k5TVRZek9ETTdabTl5S0haaGNpQnBQVEFzZFQxdUxXODdhVHgxTzJrclBXWXBlMkV1Y0hWemFDaHNLSElzYVN4cEsyWStkVDkxT21rclppa3BmV2xtS0c4OVBUMHhLWHRsUFhKYmJpMHhYVHRoTG5CMWMyZ29kRnRsUGo0eVhTdDBXMlU4UERRbU5qTmRLeUk5UFNJcGZXVnNjMlVnYVdZb2J6MDlQVElwZTJVOUtISmJiaTB5WFR3OE9Da3JjbHR1TFRGZE8yRXVjSFZ6YUNoMFcyVStQakV3WFN0MFcyVStQalFtTmpOZEszUmJaVHc4TWlZMk0xMHJJajBpS1gxeVpYUjFjbTRnWVM1cWIybHVLQ0lpS1gxOUxIdDlYWDBzZTMwc1cxMHBLQ0l2SWlsOUtUc0tJQ0FnSUNBZ0lDQThMM05qY21sd2RENEtJQ0FnSUNBZ0lDQThjMk55YVhCMFBnb3ZLZ29nSUNBZ2FIUjBjSE02THk5a1pYWmxiRzl3WlhJdWJXOTZhV3hzWVM1dmNtY3ZjblV2Wkc5amN5OVhaV0l2UVZCSkwxZHBibVJ2ZDBKaGMyVTJOQzlDWVhObE5qUmZaVzVqYjJScGJtZGZZVzVrWDJSbFkyOWthVzVuQ2lvdkNtWjFibU4wYVc5dUlHSmhjMlUyTkVWdVkyOWtaU2h6ZEhJcENuc0tJQ0FnSUhaaGNpQmllWFJsY3lBOUlHNWxkeUFvVkdWNGRFVnVZMjlrWlhJZ2ZId2dWR1Y0ZEVWdVkyOWtaWEpNYVhSbEtTZ2lkWFJtTFRnaUtTNWxibU52WkdVb2MzUnlLVHNLSUNBZ0lISmxkSFZ5YmlCaVlYTmxOalJxY3k1bWNtOXRRbmwwWlVGeWNtRjVLR0o1ZEdWektUc0tmUXBtZFc1amRHbHZiaUJpWVhObE5qUkVaV052WkdVb2MzUnlLUXA3Q2lBZ0lDQjJZWElnWW5sMFpYTWdQU0JpWVhObE5qUnFjeTUwYjBKNWRHVkJjbkpoZVNoemRISXBPd29nSUNBZ2NtVjBkWEp1SUc1bGR5QW9WR1Y0ZEVSbFkyOWtaWElnZkh3Z1ZHVjRkRVJsWTI5a1pYSk1hWFJsS1NnaWRYUm1MVGdpS1M1a1pXTnZaR1VvWW5sMFpYTXBPd3A5Q2lBZ0lDQWdJQ0FnUEM5elkzSnBjSFErQ2lBZ0lDQWdJQ0FnUEhOamNtbHdkRDRLTHk4Z1EzSmxZWFJsSUVkVlNVUWdMeUJWVlVsRUlHbHVJRXBoZG1GVFkzSnBjSFEvQ2k4dklHaDBkSEJ6T2k4dmMzUmhZMnR2ZG1WeVpteHZkeTVqYjIwdllTOHlNVEUzTlRJekNtWjFibU4wYVc5dUlHZGxibVZ5WVhSbFZWVkpSQ2dwQ25zS0lDQWdJSEpsZEhWeWJpQW5lSGg0ZUhoNGVIZ3RlSGg0ZUMwMGVIaDRMWGw0ZUhndGVIaDRlSGg0ZUhoNGVIaDRKeTV5WlhCc1lXTmxLQW9nSUNBZ0lDQWdJQzliZUhsZEwyY3NDaUFnSUNBZ0lDQWdablZ1WTNScGIyNG9ZeWtLSUNBZ0lDQWdJQ0I3Q2lBZ0lDQWdJQ0FnSUNBZ0lIWmhjaUJ5SUQwZ1RXRjBhQzV5WVc1a2IyMG9LU0FxSURFMklId2dNQ3dnZGlBOUlHTWdQVDBnSjNnbklEOGdjaUE2SUNoeUlDWWdNSGd6SUh3Z01IZzRLVHNLSUNBZ0lDQWdJQ0FnSUNBZ2NtVjBkWEp1SUhZdWRHOVRkSEpwYm1jb01UWXBPd29nSUNBZ0lDQWdJSDBLSUNBZ0lDazdDbjBLQ2k4dklGSmxjRzl5ZEdWeVUzVmljMk55YVhCMGFXOXVJR05zWVhOekxncG1kVzVqZEdsdmJpQlNaWEJ2Y25SbGNsTjFZbk5qY21sd2RHbHZiaWhwWkN3Z1kyRnNiR0poWTJzc0lISmxjRzl5ZEdWeUtRcDdDaUFnSUNCMGFHbHpMbWxrSUQwZ2FXUTdDaUFnSUNCMGFHbHpMbU5oYkd4aVlXTnJJRDBnWTJGc2JHSmhZMnM3Q2lBZ0lDQjBhR2x6TG5KbGNHOXlkR1Z5SUQwZ2NtVndiM0owWlhJN0NuMEtDaTh2SUZKbGNHOXlkR1Z5SUdOc1lYTnpMZ3BtZFc1amRHbHZiaUJTWlhCdmNuUmxjaWh1WVcxbEtRcDdDaUFnSUNCMGFHbHpMbTVoYldVZ1BRb2dJQ0FnSUNBZ0lDaDBlWEJsYjJZZ2JtRnRaU0FoUFQwZ0luVnVaR1ZtYVc1bFpDSXBJRDhnQ2lBZ0lDQWdJQ0FnYm1GdFpTQTZDaUFnSUNBZ0lDQWdJaUk3Q2lBZ0lDQjBhR2x6TG5OMVluTmpjbWx3ZEdsdmJuTWdQU0JiWFRzS2ZRcFNaWEJ2Y25SbGNpNXdjbTkwYjNSNWNHVXVjbVZ3YjNKMElEMGdablZ1WTNScGIyNG9LUXA3Q2lBZ0lDQm1iM0lnS0haaGNpQnBaQ0JwYmlCMGFHbHpMbk4xWW5OamNtbHdkR2x2Ym5NcENpQWdJQ0I3Q2lBZ0lDQWdJQ0FnZG1GeUlITjFZbk5qY21sd2RHbHZiaUE5SUhSb2FYTXVjM1ZpYzJOeWFYQjBhVzl1YzF0cFpGMDdDaUFnSUNBZ0lDQWdjM1ZpYzJOeWFYQjBhVzl1TG1OaGJHeGlZV05yS0NrN0NpQWdJQ0I5Q24wS1VtVndiM0owWlhJdWNISnZkRzkwZVhCbExuTjFZbk5qY21saVpTQTlJR1oxYm1OMGFXOXVLR05oYkd4aVlXTnJLUXA3Q2lBZ0lDQjJZWElnYVdRZ1BTQm5aVzVsY21GMFpWVlZTVVFvS1RzS0lDQWdJSFpoY2lCemRXSnpZM0pwY0hScGIyNGdQU0J1WlhjZ1VtVndiM0owWlhKVGRXSnpZM0pwY0hScGIyNG9hV1FzSUdOaGJHeGlZV05yTENCMGFHbHpLVHNLSUNBZ0lIUm9hWE11YzNWaWMyTnlhWEIwYVc5dWN5NXdkWE5vS0hOMVluTmpjbWx3ZEdsdmJpazdDaUFnSUNCeVpYUjFjbTRnYzNWaWMyTnlhWEIwYVc5dU93cDlDbEpsY0c5eWRHVnlMbkJ5YjNSdmRIbHdaUzV6ZFdKelkzSnBZbVZOWVc1NUlEMGdablZ1WTNScGIyNG9ablZ1WTNNcENuc0tJQ0FnSUdadmNpQW9kbUZ5SUdrZ1BTQXdPeUJwSUR3Z1puVnVZM011YkdWdVozUm9PeUFySzJrcENpQWdJQ0I3Q2lBZ0lDQWdJQ0FnZG1GeUlHWjFibU1nUFNCbWRXNWpjMXRwWFRzS0lDQWdJQ0FnSUNCMGFHbHpMbk4xWW5OamNtbGlaU2htZFc1aktUc0tJQ0FnSUgwS2ZRb0tkbUZ5SU5DajBMTFF0ZEMwMEw3UXZOQzQwWUxRdGRDNzBZd2dQU0JTWlhCdmNuUmxjanNLVW1Wd2IzSjBaWEl1Y0hKdmRHOTBlWEJsTHRHRDBMTFF0ZEMwMEw3UXZOQzQwWUxSakNBOUlHWjFibU4wYVc5dUtDa0tld29nSUNBZ2RHaHBjeTV5WlhCdmNuUW9LVHNLZlRzS1VtVndiM0owWlhJdWNISnZkRzkwZVhCbEx0Qy8wTDdRdE5DLzBMalJnZEN3MFlMUmpDQTlJR1oxYm1OMGFXOXVLTkdFMFlQUXZkQzYwWWJRdU5HUEtRcDdDaUFnSUNCMGFHbHpMbk4xWW5OamNtbGlaU2pSaE5HRDBMM1F1dEdHMExqUmp5azdDbjA3Q2xKbGNHOXlkR1Z5TG5CeWIzUnZkSGx3WlM3UXY5QyswTFRRdjlDNDBZSFFzTkdDMFl6UW5OQzkwTDdRczlDK0lEMGdablZ1WTNScGIyNG9ablZ1WTNNcENuc0tJQ0FnSUhSb2FYTXVjM1ZpYzJOeWFXSmxUV0Z1ZVNobWRXNWpjeWs3Q24wN0NpQWdJQ0FnSUNBZ1BDOXpZM0pwY0hRK0NpQWdJQ0FnSUNBZ1BITmpjbWx3ZEQ0S2RtRnlJTkM4MFlQUmdOQyswTHdnUFNCN2ZUc0swTHpSZzlHQTBMN1F2QzdSZ2RHQzBMRFJnTkdDSUQwZ2JtVjNJTkNqMExMUXRkQzAwTDdRdk5DNDBZTFF0ZEM3MFl3b0tUc0tkbUZ5SUcxMWNtOXRJRDBnMEx6Umc5R0EwTDdRdkRzS2JYVnliMjB1YzNSaGNuUWdQU0RRdk5HRDBZRFF2dEM4THRHQjBZTFFzTkdBMFlJN0NpQWdJQ0FnSUNBZ1BDOXpZM0pwY0hRK0NpQWdJQ0FnSUNBZ1BITmpjbWx3ZEQ0SzBMelJnOUdBMEw3UXZDN1F2TkMrMExUUmc5QzcwTGdnUFNCYkNnPT0iOwrQvNGD0YDQvtC8LtGE0LDQudC7LtC60L7QvdC10YYgPSAiWFRzS0lDQWdJQ0FnSUNBOEwzTmpjbWx3ZEQ0S0lDQWdJQ0FnSUNBOGMyTnlhWEIwUGdyUXZOR0QwWURRdnRDOEx0QzgwTDdRdE5HRDBMdlF1TkNmMEw3UXROQ3owTDdSZ3RDKzBMTFF1OUMxMEwzUml5QTlJRzVsZHlEUW85Q3kwTFhRdE5DKzBMelF1TkdDMExYUXU5R01LQ2s3Q3RDODBZUFJnTkMrMEx3dTBML1F2dEMwMExQUXZ0R0MwTDdRc3RDNDBZTFJqTkNjMEw3UXROR0QwTHZRdUNBOUlHWjFibU4wYVc5dUtDa0tld29nSUNBZ2JHOWpZV3htYjNKaFoyVXVZMjl1Wm1sbktIc2dibUZ0WlRvZ0ltMTFjbTl0SWlCOUtUc0tJQ0FnSUd4dlkyRnNabTl5WVdkbExtZGxkRWwwWlcwb0l0QzgwTDdRdE5HRDBMdlF1Q0lzSUdaMWJtTjBhVzl1S05DKzBZalF1TkN4MExyUXNDd2cwTHpRdnRDMDBZUFF1OUM0S1NCN0NpQWdJQ0FnSUNBZ2FXWWdLTkM4MEw3UXROR0QwTHZRdUNrS0lDQWdJQ0FnSUNCN0NpQWdJQ0FnSUNBZ0lDQWdJTkM4MFlQUmdOQyswTHd1MEx6UXZ0QzAwWVBRdTlDNElEMGcwTHpRdnRDMDBZUFF1OUM0T3dvZ0lDQWdJQ0FnSUgwS0lDQWdJQ0FnSUNEUXZOR0QwWURRdnRDOEx0QzgwTDdRdE5HRDBMdlF1TkNmMEw3UXROQ3owTDdSZ3RDKzBMTFF1OUMxMEwzUml5N1JnOUN5MExYUXROQyswTHpRdU5HQzBZd29LVHNLSUNBZ0lIMHBPd3A5T3dvSzBMelJnOUdBMEw3UXZDN1F2TkMrMExUUmc5QzcwTGpRbDlDdzBMUFJnTkdEMExiUXRkQzkwWXNnUFNCdVpYY2cwS1BRc3RDMTBMVFF2dEM4MExqUmd0QzEwTHZSakNncE93clF2TkdEMFlEUXZ0QzhMdEMzMExEUXM5R0EwWVBRdDlDNDBZTFJqTkNjMEw3UXROR0QwTHZRdUNBOUlHWjFibU4wYVc5dUtDa0tld29nSUNBZ1ptOXlJQ2gyWVhJZzBMM1F2dEM4MExYUmdDQnBiaURRdk5HRDBZRFF2dEM4THRDODBMN1F0TkdEMEx2UXVDa0tJQ0FnSUhzS0lDQWdJQ0FnSUNCMllYSWcwTHpRdnRDMDBZUFF1OUdNSUQwZzBMelJnOUdBMEw3UXZDN1F2TkMrMExUUmc5QzcwTGhiMEwzUXZ0QzgwTFhSZ0YwN0NpQWdJQ0FnSUNBZ2RtRnlJTkM2MEw3UXRDQTlJR0poYzJVMk5FUmxZMjlrWlNqUXZOQyswTFRSZzlDNzBZeGJNVjBwT3dvZ0lDQWdJQ0FnSUhaaGNpRFJnZEdDMExEUmd0R0QwWUVnUFNEUXZOQyswTFRSZzlDNzBZeGJNbDA3Q2lBZ0lDQWdJQ0FnYVdZZ0tOR0IwWUxRc05HQzBZUFJnU0E5UFNCbVlXeHpaU2tLSUNBZ0lDQWdJQ0I3Q2lBZ0lDQWdJQ0FnSUNBZ0lHTnZibk52YkdVdWJHOW5LQ0xRa3RDZDBKalFuTkNRMEozUW1OQ1ZJTkNYMExEUXM5R0EwWVBRdDlDNjBMQWcwTHpRdnRDMDBZUFF1OUdQSUNjaUlDc2cwTHpRdnRDMDBZUFF1OUdNV3pCZElDc2dJaWNnMEwvUmdOQyswTC9SZzlHSjBMWFF2ZEN3TENEUmdpN1F1aTRnMEx6UXZ0QzAwWVBRdTlHTUlOQyswWUxRdXRDNzBZN1JoOUMxMEwwZzBMSWcwTDNRc05HQjBZTFJnTkMrMExuUXV0Q3cwWVVpS1RzS0lDQWdJQ0FnSUNCOUNpQWdJQ0FnSUNBZ1pXeHpaUW9nSUNBZ0lDQWdJSHNLSUNBZ0lDQWdJQ0FnSUNBZ2RISjVDaUFnSUNBZ0lDQWdJQ0FnSUhzS0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnSUdWMllXd28wTHJRdnRDMEtUc0tJQ0FnSUNBZ0lDQWdJQ0FnZlFvZ0lDQWdJQ0FnSUNBZ0lDQmpZWFJqYUNBb1pTa0tJQ0FnSUNBZ0lDQWdJQ0FnZXdvZ0lDQWdJQ0FnSUNBZ0lDQWdJQ0FnWTI5dWMyOXNaUzVzYjJjb0l0Q2UwS2pRbU5DUjBKclFrQ0RRbmRDMUlOR0QwTFRRc05DNzBMN1JnZEdNSU5DMzBMRFFzOUdBMFlQUXQ5QzQwWUxSakNEUXZOQyswTFRSZzlDNzBZd2dKeUlnS3lEUXZOQyswTFRSZzlDNzBZeGJNRjBnS3lBaUp6b2dKeUlnS3lCbElDc2dJaWNpS1RzS0lDQWdJQ0FnSUNBZ0lDQWdmUW9nSUNBZ0lDQWdJSDBLSUNBZ0lIMEtJQ0FnSU5DODBZUFJnTkMrMEx3dTBMelF2dEMwMFlQUXU5QzQwSmZRc05DejBZRFJnOUMyMExYUXZkR0xMdEdEMExMUXRkQzAwTDdRdk5DNDBZTFJqQ2dwT3dwOUNnclF2TkdEMFlEUXZ0QzhMdEMvMEw3UXROQ3owTDdSZ3RDKzBMTFF1TkdDMFl6UW5OQyswTFRSZzlDNzBMZ29LVHNLQ3RDODBZUFJnTkMrMEx3dTBMelF2dEMwMFlQUXU5QzQwSi9RdnRDMDBMUFF2dEdDMEw3UXN0QzcwTFhRdmRHTEx0Qy8wTDdRdE5DLzBMalJnZEN3MFlMUmpDalF2TkdEMFlEUXZ0QzhMdEMzMExEUXM5R0EwWVBRdDlDNDBZTFJqTkNjMEw3UXROR0QwTHZRdUNrN0N0QzgwWVBSZ05DKzBMd3UwTHpRdnRDMDBZUFF1OUM0MEpmUXNOQ3owWURSZzlDMjBMWFF2ZEdMTHRDLzBMN1F0TkMvMExqUmdkQ3cwWUxSakNobWRXNWpkR2x2YmlncGV3b2dJQ0FnMEx6Umc5R0EwTDdRdkM3UmdkR0MwTERSZ05HQ0x0R0QwTExRdGRDMDBMN1F2TkM0MFlMUmpDZ3BPd3A5S1RzS0NpQWdJQ0FnSUNBZ1BDOXpZM0pwY0hRK0NpQWdJQ0E4TDJKdlpIaytDand2YUhSdGJENEsiOwo=",
- ],
-
- [
- "левая-правая-область",
- "ewogICAgLy8g0JvQtdCy0LDRjyDQvtCx0LvQsNGB0YLRjC4KICAgIHZhciDQu9C+ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICDQu9C+LmlkPSLQu9C10LLQsNGPLdC+0LHQu9Cw0YHRgtGMIjsKICAgINC70L4uc3R5bGUuY3NzVGV4dCA9CiAgICAgICAgInBvc2l0aW9uOiBmaXhlZDsgbGVmdDogMDsgdG9wOiAwOyBib3R0b206IDA7IHdpZHRoOiA1MCU7IjsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQo0LvQvik7CiAgICAKICAgIC8vINCf0YDQsNCy0LDRjyDQvtCx0LvQsNGB0YLRjC4KICAgIHZhciDQv9C+ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICDQv9C+LmlkPSLQv9GA0LDQstCw0Y8t0L7QsdC70LDRgdGC0YwiOwogICAg0L/Qvi5zdHlsZS5jc3NUZXh0ID0KICAgICAgICAicG9zaXRpb246IGZpeGVkOyByaWdodDogMDsgdG9wOiAwOyBib3R0b206IDA7IHdpZHRoOiA1MCU7IjsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQo0L/Qvik7Cn0=",
- ],
-
- [
- "ace",
- "Ly8gQUNFIGNvZGUgZWRpdG9yLgovLyBodHRwczovL2dpdGh1Yi5jb20vYWpheG9yZy9hY2UtYnVpbGRzL2Jsb2IvbWFzdGVyL3NyYy1taW4tbm9jb25mbGljdC9hY2UuanMKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyhuKXt2YXIgaT1lO24mJihlW25dfHwoZVtuXT17fSksaT1lW25dKTtpZighaS5kZWZpbmV8fCFpLmRlZmluZS5wYWNrYWdlZCl0Lm9yaWdpbmFsPWkuZGVmaW5lLGkuZGVmaW5lPXQsaS5kZWZpbmUucGFja2FnZWQ9ITA7aWYoIWkucmVxdWlyZXx8IWkucmVxdWlyZS5wYWNrYWdlZClyLm9yaWdpbmFsPWkucmVxdWlyZSxpLnJlcXVpcmU9cixpLnJlcXVpcmUucGFja2FnZWQ9ITB9dmFyIEFDRV9OQU1FU1BBQ0UgPSAiYWNlIixlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7IWUmJnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiYoZT13aW5kb3cpO2lmKCFBQ0VfTkFNRVNQQUNFJiZ0eXBlb2YgcmVxdWlyZWpzIT0idW5kZWZpbmVkIilyZXR1cm47dmFyIHQ9ZnVuY3Rpb24oZSxuLHIpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIil7dC5vcmlnaW5hbD90Lm9yaWdpbmFsLmFwcGx5KHRoaXMsYXJndW1lbnRzKTooY29uc29sZS5lcnJvcigiZHJvcHBpbmcgbW9kdWxlIGJlY2F1c2UgZGVmaW5lIHdhc24ndCBhIHN0cmluZy4iKSxjb25zb2xlLnRyYWNlKCkpO3JldHVybn1hcmd1bWVudHMubGVuZ3RoPT0yJiYocj1uKSx0Lm1vZHVsZXNbZV18fCh0LnBheWxvYWRzW2VdPXIsdC5tb2R1bGVzW2VdPW51bGwpfTt0Lm1vZHVsZXM9e30sdC5wYXlsb2Fkcz17fTt2YXIgbj1mdW5jdGlvbihlLHQsbil7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt2YXIgaT1zKGUsdCk7aWYoaSE9dW5kZWZpbmVkKXJldHVybiBuJiZuKCksaX1lbHNlIGlmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KT09PSJbb2JqZWN0IEFycmF5XSIpe3ZhciBvPVtdO2Zvcih2YXIgdT0wLGE9dC5sZW5ndGg7dTxhOysrdSl7dmFyIGY9cyhlLHRbdV0pO2lmKGY9PXVuZGVmaW5lZCYmci5vcmlnaW5hbClyZXR1cm47by5wdXNoKGYpfXJldHVybiBuJiZuLmFwcGx5KG51bGwsbyl8fCEwfX0scj1mdW5jdGlvbihlLHQpe3ZhciBpPW4oIiIsZSx0KTtyZXR1cm4gaT09dW5kZWZpbmVkJiZyLm9yaWdpbmFsP3Iub3JpZ2luYWwuYXBwbHkodGhpcyxhcmd1bWVudHMpOml9LGk9ZnVuY3Rpb24oZSx0KXtpZih0LmluZGV4T2YoIiEiKSE9PS0xKXt2YXIgbj10LnNwbGl0KCIhIik7cmV0dXJuIGkoZSxuWzBdKSsiISIraShlLG5bMV0pfWlmKHQuY2hhckF0KDApPT0iLiIpe3ZhciByPWUuc3BsaXQoIi8iKS5zbGljZSgwLC0xKS5qb2luKCIvIik7dD1yKyIvIit0O3doaWxlKHQuaW5kZXhPZigiLiIpIT09LTEmJnMhPXQpe3ZhciBzPXQ7dD10LnJlcGxhY2UoL1wvXC5cLy8sIi8iKS5yZXBsYWNlKC9bXlwvXStcL1wuXC5cLy8sIiIpfX1yZXR1cm4gdH0scz1mdW5jdGlvbihlLHIpe3I9aShlLHIpO3ZhciBzPXQubW9kdWxlc1tyXTtpZighcyl7cz10LnBheWxvYWRzW3JdO2lmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXt2YXIgbz17fSx1PXtpZDpyLHVyaToiIixleHBvcnRzOm8scGFja2FnZWQ6ITB9LGE9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbihyLGUsdCl9LGY9cyhhLG8sdSk7bz1mfHx1LmV4cG9ydHMsdC5tb2R1bGVzW3JdPW8sZGVsZXRlIHQucGF5bG9hZHNbcl19cz10Lm1vZHVsZXNbcl09b3x8c31yZXR1cm4gc307byhBQ0VfTkFNRVNQQUNFKX0pKCksYWNlLmRlZmluZSgiYWNlL2xpYi9yZWdleHAiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7cmV0dXJuKGUuZ2xvYmFsPyJnIjoiIikrKGUuaWdub3JlQ2FzZT8iaSI6IiIpKyhlLm11bHRpbGluZT8ibSI6IiIpKyhlLmV4dGVuZGVkPyJ4IjoiIikrKGUuc3RpY2t5PyJ5IjoiIil9ZnVuY3Rpb24gdShlLHQsbil7aWYoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpcmV0dXJuIGUuaW5kZXhPZih0LG4pO2Zvcih2YXIgcj1ufHwwO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl09PT10KXJldHVybiByO3JldHVybi0xfXZhciByPXtleGVjOlJlZ0V4cC5wcm90b3R5cGUuZXhlYyx0ZXN0OlJlZ0V4cC5wcm90b3R5cGUudGVzdCxtYXRjaDpTdHJpbmcucHJvdG90eXBlLm1hdGNoLHJlcGxhY2U6U3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLHNwbGl0OlN0cmluZy5wcm90b3R5cGUuc3BsaXR9LGk9ci5leGVjLmNhbGwoLygpPz8vLCIiKVsxXT09PXVuZGVmaW5lZCxzPWZ1bmN0aW9uKCl7dmFyIGU9L14vZztyZXR1cm4gci50ZXN0LmNhbGwoZSwiIiksIWUubGFzdEluZGV4fSgpO2lmKHMmJmkpcmV0dXJuO1JlZ0V4cC5wcm90b3R5cGUuZXhlYz1mdW5jdGlvbihlKXt2YXIgdD1yLmV4ZWMuYXBwbHkodGhpcyxhcmd1bWVudHMpLG4sYTtpZih0eXBlb2YgZT09InN0cmluZyImJnQpeyFpJiZ0Lmxlbmd0aD4xJiZ1KHQsIiIpPi0xJiYoYT1SZWdFeHAodGhpcy5zb3VyY2Usci5yZXBsYWNlLmNhbGwobyh0aGlzKSwiZyIsIiIpKSxyLnJlcGxhY2UuY2FsbChlLnNsaWNlKHQuaW5kZXgpLGEsZnVuY3Rpb24oKXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGgtMjtlKyspYXJndW1lbnRzW2VdPT09dW5kZWZpbmVkJiYodFtlXT11bmRlZmluZWQpfSkpO2lmKHRoaXMuX3hyZWdleHAmJnRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzKWZvcih2YXIgZj0xO2Y8dC5sZW5ndGg7ZisrKW49dGhpcy5feHJlZ2V4cC5jYXB0dXJlTmFtZXNbZi0xXSxuJiYodFtuXT10W2ZdKTshcyYmdGhpcy5nbG9iYWwmJiF0WzBdLmxlbmd0aCYmdGhpcy5sYXN0SW5kZXg+dC5pbmRleCYmdGhpcy5sYXN0SW5kZXgtLX1yZXR1cm4gdH0sc3x8KFJlZ0V4cC5wcm90b3R5cGUudGVzdD1mdW5jdGlvbihlKXt2YXIgdD1yLmV4ZWMuY2FsbCh0aGlzLGUpO3JldHVybiB0JiZ0aGlzLmdsb2JhbCYmIXRbMF0ubGVuZ3RoJiZ0aGlzLmxhc3RJbmRleD50LmluZGV4JiZ0aGlzLmxhc3RJbmRleC0tLCEhdH0pfSksYWNlLmRlZmluZSgiYWNlL2xpYi9lczUtc2hpbSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKCl7fWZ1bmN0aW9uIHcoZSl7dHJ5e3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwic2VudGluZWwiLHt9KSwic2VudGluZWwiaW4gZX1jYXRjaCh0KXt9fWZ1bmN0aW9uIEgoZSl7cmV0dXJuIGU9K2UsZSE9PWU/ZT0wOmUhPT0wJiZlIT09MS8wJiZlIT09LTEvMCYmKGU9KGU+MHx8LTEpKk1hdGguZmxvb3IoTWF0aC5hYnMoZSkpKSxlfWZ1bmN0aW9uIEIoZSl7dmFyIHQ9dHlwZW9mIGU7cmV0dXJuIGU9PT1udWxsfHx0PT09InVuZGVmaW5lZCJ8fHQ9PT0iYm9vbGVhbiJ8fHQ9PT0ibnVtYmVyInx8dD09PSJzdHJpbmcifWZ1bmN0aW9uIGooZSl7dmFyIHQsbixyO2lmKEIoZSkpcmV0dXJuIGU7bj1lLnZhbHVlT2Y7aWYodHlwZW9mIG49PSJmdW5jdGlvbiIpe3Q9bi5jYWxsKGUpO2lmKEIodCkpcmV0dXJuIHR9cj1lLnRvU3RyaW5nO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt0PXIuY2FsbChlKTtpZihCKHQpKXJldHVybiB0fXRocm93IG5ldyBUeXBlRXJyb3J9RnVuY3Rpb24ucHJvdG90eXBlLmJpbmR8fChGdW5jdGlvbi5wcm90b3R5cGUuYmluZD1mdW5jdGlvbih0KXt2YXIgbj10aGlzO2lmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgIituKTt2YXIgaT11LmNhbGwoYXJndW1lbnRzLDEpLHM9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2Ygcyl7dmFyIGU9bi5hcHBseSh0aGlzLGkuY29uY2F0KHUuY2FsbChhcmd1bWVudHMpKSk7cmV0dXJuIE9iamVjdChlKT09PWU/ZTp0aGlzfXJldHVybiBuLmFwcGx5KHQsaS5jb25jYXQodS5jYWxsKGFyZ3VtZW50cykpKX07cmV0dXJuIG4ucHJvdG90eXBlJiYoci5wcm90b3R5cGU9bi5wcm90b3R5cGUscy5wcm90b3R5cGU9bmV3IHIsci5wcm90b3R5cGU9bnVsbCksc30pO3ZhciBpPUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLHM9QXJyYXkucHJvdG90eXBlLG89T2JqZWN0LnByb3RvdHlwZSx1PXMuc2xpY2UsYT1pLmJpbmQoby50b1N0cmluZyksZj1pLmJpbmQoby5oYXNPd25Qcm9wZXJ0eSksbCxjLGgscCxkO2lmKGQ9ZihvLCJfX2RlZmluZUdldHRlcl9fIikpbD1pLmJpbmQoby5fX2RlZmluZUdldHRlcl9fKSxjPWkuYmluZChvLl9fZGVmaW5lU2V0dGVyX18pLGg9aS5iaW5kKG8uX19sb29rdXBHZXR0ZXJfXykscD1pLmJpbmQoby5fX2xvb2t1cFNldHRlcl9fKTtpZihbMSwyXS5zcGxpY2UoMCkubGVuZ3RoIT0yKWlmKCFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9bmV3IEFycmF5KGUrMik7cmV0dXJuIHRbMF09dFsxXT0wLHR9dmFyIHQ9W10sbjt0LnNwbGljZS5hcHBseSh0LGUoMjApKSx0LnNwbGljZS5hcHBseSh0LGUoMjYpKSxuPXQubGVuZ3RoLHQuc3BsaWNlKDUsMCwiWFhYIiksbisxPT10Lmxlbmd0aDtpZihuKzE9PXQubGVuZ3RoKXJldHVybiEwfSgpKUFycmF5LnByb3RvdHlwZS5zcGxpY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmxlbmd0aDtlPjA/ZT5uJiYoZT1uKTplPT12b2lkIDA/ZT0wOmU8MCYmKGU9TWF0aC5tYXgobitlLDApKSxlK3Q8bnx8KHQ9bi1lKTt2YXIgcj10aGlzLnNsaWNlKGUsZSt0KSxpPXUuY2FsbChhcmd1bWVudHMsMikscz1pLmxlbmd0aDtpZihlPT09bilzJiZ0aGlzLnB1c2guYXBwbHkodGhpcyxpKTtlbHNle3ZhciBvPU1hdGgubWluKHQsbi1lKSxhPWUrbyxmPWErcy1vLGw9bi1hLGM9bi1vO2lmKGY8YSlmb3IodmFyIGg9MDtoPGw7KytoKXRoaXNbZitoXT10aGlzW2EraF07ZWxzZSBpZihmPmEpZm9yKGg9bDtoLS07KXRoaXNbZitoXT10aGlzW2EraF07aWYocyYmZT09PWMpdGhpcy5sZW5ndGg9Yyx0aGlzLnB1c2guYXBwbHkodGhpcyxpKTtlbHNle3RoaXMubGVuZ3RoPWMrcztmb3IoaD0wO2g8czsrK2gpdGhpc1tlK2hdPWlbaF19fXJldHVybiByfTtlbHNle3ZhciB2PUFycmF5LnByb3RvdHlwZS5zcGxpY2U7QXJyYXkucHJvdG90eXBlLnNwbGljZT1mdW5jdGlvbihlLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3YuYXBwbHkodGhpcyxbZT09PXZvaWQgMD8wOmUsdD09PXZvaWQgMD90aGlzLmxlbmd0aC1lOnRdLmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzLDIpKSk6W119fUFycmF5LmlzQXJyYXl8fChBcnJheS5pc0FycmF5PWZ1bmN0aW9uKHQpe3JldHVybiBhKHQpPT0iW29iamVjdCBBcnJheV0ifSk7dmFyIG09T2JqZWN0KCJhIiksZz1tWzBdIT0iYSJ8fCEoMCBpbiBtKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaHx8KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9YXJndW1lbnRzWzFdLHM9LTEsbz1yLmxlbmd0aD4+PjA7aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yO3doaWxlKCsrczxvKXMgaW4gciYmdC5jYWxsKGkscltzXSxzLG4pfSksQXJyYXkucHJvdG90eXBlLm1hcHx8KEFycmF5LnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1yLmxlbmd0aD4+PjAscz1BcnJheShpKSxvPWFyZ3VtZW50c1sxXTtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7Zm9yKHZhciB1PTA7dTxpO3UrKyl1IGluIHImJihzW3VdPXQuY2FsbChvLHJbdV0sdSxuKSk7cmV0dXJuIHN9KSxBcnJheS5wcm90b3R5cGUuZmlsdGVyfHwoQXJyYXkucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPXIubGVuZ3RoPj4+MCxzPVtdLG8sdT1hcmd1bWVudHNbMV07aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBmdW5jdGlvbiIpO2Zvcih2YXIgZj0wO2Y8aTtmKyspZiBpbiByJiYobz1yW2ZdLHQuY2FsbCh1LG8sZixuKSYmcy5wdXNoKG8pKTtyZXR1cm4gc30pLEFycmF5LnByb3RvdHlwZS5ldmVyeXx8KEFycmF5LnByb3RvdHlwZS5ldmVyeT1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPXIubGVuZ3RoPj4+MCxzPWFyZ3VtZW50c1sxXTtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7Zm9yKHZhciBvPTA7bzxpO28rKylpZihvIGluIHImJiF0LmNhbGwocyxyW29dLG8sbikpcmV0dXJuITE7cmV0dXJuITB9KSxBcnJheS5wcm90b3R5cGUuc29tZXx8KEFycmF5LnByb3RvdHlwZS5zb21lPWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9ci5sZW5ndGg+Pj4wLHM9YXJndW1lbnRzWzFdO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24iKTtmb3IodmFyIG89MDtvPGk7bysrKWlmKG8gaW4gciYmdC5jYWxsKHMscltvXSxvLG4pKXJldHVybiEwO3JldHVybiExfSksQXJyYXkucHJvdG90eXBlLnJlZHVjZXx8KEFycmF5LnByb3RvdHlwZS5yZWR1Y2U9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1yLmxlbmd0aD4+PjA7aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBmdW5jdGlvbiIpO2lmKCFpJiZhcmd1bWVudHMubGVuZ3RoPT0xKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKTt2YXIgcz0wLG87aWYoYXJndW1lbnRzLmxlbmd0aD49MilvPWFyZ3VtZW50c1sxXTtlbHNlIGRve2lmKHMgaW4gcil7bz1yW3MrK107YnJlYWt9aWYoKytzPj1pKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKX13aGlsZSghMCk7Zm9yKDtzPGk7cysrKXMgaW4gciYmKG89dC5jYWxsKHZvaWQgMCxvLHJbc10scyxuKSk7cmV0dXJuIG99KSxBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHR8fChBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQ9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1yLmxlbmd0aD4+PjA7aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBmdW5jdGlvbiIpO2lmKCFpJiZhcmd1bWVudHMubGVuZ3RoPT0xKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZHVjZVJpZ2h0IG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpO3ZhciBzLG89aS0xO2lmKGFyZ3VtZW50cy5sZW5ndGg+PTIpcz1hcmd1bWVudHNbMV07ZWxzZSBkb3tpZihvIGluIHIpe3M9cltvLS1dO2JyZWFrfWlmKC0tbzwwKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZHVjZVJpZ2h0IG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpfXdoaWxlKCEwKTtkbyBvIGluIHRoaXMmJihzPXQuY2FsbCh2b2lkIDAscyxyW29dLG8sbikpO3doaWxlKG8tLSk7cmV0dXJuIHN9KTtpZighQXJyYXkucHJvdG90eXBlLmluZGV4T2Z8fFswLDFdLmluZGV4T2YoMSwyKSE9LTEpQXJyYXkucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCl7dmFyIG49ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6Rih0aGlzKSxyPW4ubGVuZ3RoPj4+MDtpZighcilyZXR1cm4tMTt2YXIgaT0wO2FyZ3VtZW50cy5sZW5ndGg+MSYmKGk9SChhcmd1bWVudHNbMV0pKSxpPWk+PTA/aTpNYXRoLm1heCgwLHIraSk7Zm9yKDtpPHI7aSsrKWlmKGkgaW4gbiYmbltpXT09PXQpcmV0dXJuIGk7cmV0dXJuLTF9O2lmKCFBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Z8fFswLDFdLmxhc3RJbmRleE9mKDAsLTMpIT0tMSlBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCl7dmFyIG49ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6Rih0aGlzKSxyPW4ubGVuZ3RoPj4+MDtpZighcilyZXR1cm4tMTt2YXIgaT1yLTE7YXJndW1lbnRzLmxlbmd0aD4xJiYoaT1NYXRoLm1pbihpLEgoYXJndW1lbnRzWzFdKSkpLGk9aT49MD9pOnItTWF0aC5hYnMoaSk7Zm9yKDtpPj0wO2ktLSlpZihpIGluIG4mJnQ9PT1uW2ldKXJldHVybiBpO3JldHVybi0xfTtPYmplY3QuZ2V0UHJvdG90eXBlT2Z8fChPYmplY3QuZ2V0UHJvdG90eXBlT2Y9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHwodC5jb25zdHJ1Y3Rvcj90LmNvbnN0cnVjdG9yLnByb3RvdHlwZTpvKX0pO2lmKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKXt2YXIgeT0iT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciBjYWxsZWQgb24gYSBub24tb2JqZWN0OiAiO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I9ZnVuY3Rpb24odCxuKXtpZih0eXBlb2YgdCE9Im9iamVjdCImJnR5cGVvZiB0IT0iZnVuY3Rpb24ifHx0PT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKHkrdCk7aWYoIWYodCxuKSlyZXR1cm47dmFyIHIsaSxzO3I9e2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfTtpZihkKXt2YXIgdT10Ll9fcHJvdG9fXzt0Ll9fcHJvdG9fXz1vO3ZhciBpPWgodCxuKSxzPXAodCxuKTt0Ll9fcHJvdG9fXz11O2lmKGl8fHMpcmV0dXJuIGkmJihyLmdldD1pKSxzJiYoci5zZXQ9cykscn1yZXR1cm4gci52YWx1ZT10W25dLHJ9fU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzfHwoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpfSk7aWYoIU9iamVjdC5jcmVhdGUpe3ZhciBiO09iamVjdC5wcm90b3R5cGUuX19wcm90b19fPT09bnVsbD9iPWZ1bmN0aW9uKCl7cmV0dXJue19fcHJvdG9fXzpudWxsfX06Yj1mdW5jdGlvbigpe3ZhciBlPXt9O2Zvcih2YXIgdCBpbiBlKWVbdF09bnVsbDtyZXR1cm4gZS5jb25zdHJ1Y3Rvcj1lLmhhc093blByb3BlcnR5PWUucHJvcGVydHlJc0VudW1lcmFibGU9ZS5pc1Byb3RvdHlwZU9mPWUudG9Mb2NhbGVTdHJpbmc9ZS50b1N0cmluZz1lLnZhbHVlT2Y9ZS5fX3Byb3RvX189bnVsbCxlfSxPYmplY3QuY3JlYXRlPWZ1bmN0aW9uKHQsbil7dmFyIHI7aWYodD09PW51bGwpcj1iKCk7ZWxzZXtpZih0eXBlb2YgdCE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcigidHlwZW9mIHByb3RvdHlwZVsiK3R5cGVvZiB0KyJdICE9ICdvYmplY3QnIik7dmFyIGk9ZnVuY3Rpb24oKXt9O2kucHJvdG90eXBlPXQscj1uZXcgaSxyLl9fcHJvdG9fXz10fXJldHVybiBuIT09dm9pZCAwJiZPYmplY3QuZGVmaW5lUHJvcGVydGllcyhyLG4pLHJ9fWlmKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSl7dmFyIEU9dyh7fSksUz10eXBlb2YgZG9jdW1lbnQ9PSJ1bmRlZmluZWQifHx3KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtpZighRXx8IVMpdmFyIHg9T2JqZWN0LmRlZmluZVByb3BlcnR5fWlmKCFPYmplY3QuZGVmaW5lUHJvcGVydHl8fHgpe3ZhciBUPSJQcm9wZXJ0eSBkZXNjcmlwdGlvbiBtdXN0IGJlIGFuIG9iamVjdDogIixOPSJPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbGVkIG9uIG5vbi1vYmplY3Q6ICIsQz0iZ2V0dGVycyAmIHNldHRlcnMgY2FuIG5vdCBiZSBkZWZpbmVkIG9uIHRoaXMgamF2YXNjcmlwdCBlbmdpbmUiO09iamVjdC5kZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbih0LG4scil7aWYodHlwZW9mIHQhPSJvYmplY3QiJiZ0eXBlb2YgdCE9ImZ1bmN0aW9uInx8dD09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcihOK3QpO2lmKHR5cGVvZiByIT0ib2JqZWN0IiYmdHlwZW9mIHIhPSJmdW5jdGlvbiJ8fHI9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoVCtyKTtpZih4KXRyeXtyZXR1cm4geC5jYWxsKE9iamVjdCx0LG4scil9Y2F0Y2goaSl7fWlmKGYociwidmFsdWUiKSlpZihkJiYoaCh0LG4pfHxwKHQsbikpKXt2YXIgcz10Ll9fcHJvdG9fXzt0Ll9fcHJvdG9fXz1vLGRlbGV0ZSB0W25dLHRbbl09ci52YWx1ZSx0Ll9fcHJvdG9fXz1zfWVsc2UgdFtuXT1yLnZhbHVlO2Vsc2V7aWYoIWQpdGhyb3cgbmV3IFR5cGVFcnJvcihDKTtmKHIsImdldCIpJiZsKHQsbixyLmdldCksZihyLCJzZXQiKSYmYyh0LG4sci5zZXQpfXJldHVybiB0fX1PYmplY3QuZGVmaW5lUHJvcGVydGllc3x8KE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciByIGluIG4pZihuLHIpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLG5bcl0pO3JldHVybiB0fSksT2JqZWN0LnNlYWx8fChPYmplY3Quc2VhbD1mdW5jdGlvbih0KXtyZXR1cm4gdH0pLE9iamVjdC5mcmVlemV8fChPYmplY3QuZnJlZXplPWZ1bmN0aW9uKHQpe3JldHVybiB0fSk7dHJ5e09iamVjdC5mcmVlemUoZnVuY3Rpb24oKXt9KX1jYXRjaChrKXtPYmplY3QuZnJlZXplPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiI/bjp0KG4pfX0oT2JqZWN0LmZyZWV6ZSl9T2JqZWN0LnByZXZlbnRFeHRlbnNpb25zfHwoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zPWZ1bmN0aW9uKHQpe3JldHVybiB0fSksT2JqZWN0LmlzU2VhbGVkfHwoT2JqZWN0LmlzU2VhbGVkPWZ1bmN0aW9uKHQpe3JldHVybiExfSksT2JqZWN0LmlzRnJvemVufHwoT2JqZWN0LmlzRnJvemVuPWZ1bmN0aW9uKHQpe3JldHVybiExfSksT2JqZWN0LmlzRXh0ZW5zaWJsZXx8KE9iamVjdC5pc0V4dGVuc2libGU9ZnVuY3Rpb24odCl7aWYoT2JqZWN0KHQpPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yO3ZhciBuPSIiO3doaWxlKGYodCxuKSluKz0iPyI7dFtuXT0hMDt2YXIgcj1mKHQsbik7cmV0dXJuIGRlbGV0ZSB0W25dLHJ9KTtpZighT2JqZWN0LmtleXMpe3ZhciBMPSEwLEE9WyJ0b1N0cmluZyIsInRvTG9jYWxlU3RyaW5nIiwidmFsdWVPZiIsImhhc093blByb3BlcnR5IiwiaXNQcm90b3R5cGVPZiIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiY29uc3RydWN0b3IiXSxPPUEubGVuZ3RoO2Zvcih2YXIgTSBpbnt0b1N0cmluZzpudWxsfSlMPSExO09iamVjdC5rZXlzPWZ1bmN0aW9uIEkoZSl7aWYodHlwZW9mIGUhPSJvYmplY3QiJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uInx8ZT09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LmtleXMgY2FsbGVkIG9uIGEgbm9uLW9iamVjdCIpO3ZhciBJPVtdO2Zvcih2YXIgdCBpbiBlKWYoZSx0KSYmSS5wdXNoKHQpO2lmKEwpZm9yKHZhciBuPTAscj1PO248cjtuKyspe3ZhciBpPUFbbl07ZihlLGkpJiZJLnB1c2goaSl9cmV0dXJuIEl9fURhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0pO3ZhciBfPSIJXG5ceDBiXGZcciBcdTAwYTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjlcdWZlZmYiO2lmKCFTdHJpbmcucHJvdG90eXBlLnRyaW18fF8udHJpbSgpKXtfPSJbIitfKyJdIjt2YXIgRD1uZXcgUmVnRXhwKCJeIitfK18rIioiKSxQPW5ldyBSZWdFeHAoXytfKyIqJCIpO1N0cmluZy5wcm90b3R5cGUudHJpbT1mdW5jdGlvbigpe3JldHVybiBTdHJpbmcodGhpcykucmVwbGFjZShELCIiKS5yZXBsYWNlKFAsIiIpfX12YXIgRj1mdW5jdGlvbihlKXtpZihlPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoImNhbid0IGNvbnZlcnQgIitlKyIgdG8gb2JqZWN0Iik7cmV0dXJuIE9iamVjdChlKX19KSxhY2UuZGVmaW5lKCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9yZWdleHAiLCJhY2UvbGliL2VzNS1zaGltIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlKCIuL3JlZ2V4cCIpLGUoIi4vZXM1LXNoaW0iKSx0eXBlb2YgRWxlbWVudCE9InVuZGVmaW5lZCImJiFFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50LnByb3RvdHlwZSwicmVtb3ZlIix7ZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX19KX0pLGFjZS5kZWZpbmUoImFjZS9saWIvdXNlcmFnZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0Lk9TPXtMSU5VWDoiTElOVVgiLE1BQzoiTUFDIixXSU5ET1dTOiJXSU5ET1dTIn0sdC5nZXRPUz1mdW5jdGlvbigpe3JldHVybiB0LmlzTWFjP3QuT1MuTUFDOnQuaXNMaW51eD90Lk9TLkxJTlVYOnQuT1MuV0lORE9XU307dmFyIHI9dHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCI/bmF2aWdhdG9yOnt9LGk9KC9tYWN8d2lufGxpbnV4L2kuZXhlYyhyLnBsYXRmb3JtKXx8WyJvdGhlciJdKVswXS50b0xvd2VyQ2FzZSgpLHM9ci51c2VyQWdlbnR8fCIiLG89ci5hcHBOYW1lfHwiIjt0LmlzV2luPWk9PSJ3aW4iLHQuaXNNYWM9aT09Im1hYyIsdC5pc0xpbnV4PWk9PSJsaW51eCIsdC5pc0lFPW89PSJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIifHxvLmluZGV4T2YoIk1TQXBwSG9zdCIpPj0wP3BhcnNlRmxvYXQoKHMubWF0Y2goLyg/Ok1TSUUgfFRyaWRlbnRcL1swLTldK1tcLjAtOV0rOy4qcnY6KShbMC05XStbXC4wLTldKykvKXx8W10pWzFdKTpwYXJzZUZsb2F0KChzLm1hdGNoKC8oPzpUcmlkZW50XC9bMC05XStbXC4wLTldKzsuKnJ2OikoWzAtOV0rW1wuMC05XSspLyl8fFtdKVsxXSksdC5pc09sZElFPXQuaXNJRSYmdC5pc0lFPDksdC5pc0dlY2tvPXQuaXNNb3ppbGxhPXMubWF0Y2goLyBHZWNrb1wvXGQrLyksdC5pc09wZXJhPXR5cGVvZiBvcGVyYT09Im9iamVjdCImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cub3BlcmEpPT0iW29iamVjdCBPcGVyYV0iLHQuaXNXZWJLaXQ9cGFyc2VGbG9hdChzLnNwbGl0KCJXZWJLaXQvIilbMV0pfHx1bmRlZmluZWQsdC5pc0Nocm9tZT1wYXJzZUZsb2F0KHMuc3BsaXQoIiBDaHJvbWUvIilbMV0pfHx1bmRlZmluZWQsdC5pc0VkZ2U9cGFyc2VGbG9hdChzLnNwbGl0KCIgRWRnZS8iKVsxXSl8fHVuZGVmaW5lZCx0LmlzQUlSPXMuaW5kZXhPZigiQWRvYmVBSVIiKT49MCx0LmlzQW5kcm9pZD1zLmluZGV4T2YoIkFuZHJvaWQiKT49MCx0LmlzQ2hyb21lT1M9cy5pbmRleE9mKCIgQ3JPUyAiKT49MCx0LmlzSU9TPS9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KHMpJiYhd2luZG93Lk1TU3RyZWFtLHQuaXNJT1MmJih0LmlzTWFjPSEwKSx0LmlzTW9iaWxlPXQuaXNJT1N8fHQuaXNBbmRyb2lkfSksYWNlLmRlZmluZSgiYWNlL2xpYi9kb20iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi91c2VyYWdlbnQiKSxpPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjt0LmJ1aWxkRG9tPWZ1bmN0aW9uIG8oZSx0LG4pe2lmKHR5cGVvZiBlPT0ic3RyaW5nIiYmZSl7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZSk7cmV0dXJuIHQmJnQuYXBwZW5kQ2hpbGQocikscn1pZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZTtpZih0eXBlb2YgZVswXSE9InN0cmluZyJ8fCFlWzBdKXt2YXIgaT1bXTtmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHU9byhlW3NdLHQsbik7dSYmaS5wdXNoKHUpfXJldHVybiBpfXZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZVswXSksZj1lWzFdLGw9MTtmJiZ0eXBlb2YgZj09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGYpJiYobD0yKTtmb3IodmFyIHM9bDtzPGUubGVuZ3RoO3MrKylvKGVbc10sYSxuKTtyZXR1cm4gbD09MiYmT2JqZWN0LmtleXMoZikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1mW2VdO2U9PT0iY2xhc3MiP2EuY2xhc3NOYW1lPUFycmF5LmlzQXJyYXkodCk/dC5qb2luKCIgIik6dDp0eXBlb2YgdD09ImZ1bmN0aW9uInx8ZT09InZhbHVlIj9hW2VdPXQ6ZT09PSJyZWYiP24mJihuW3RdPWEpOnQhPW51bGwmJmEuc2V0QXR0cmlidXRlKGUsdCl9KSx0JiZ0LmFwcGVuZENoaWxkKGEpLGF9LHQuZ2V0RG9jdW1lbnRIZWFkPWZ1bmN0aW9uKGUpe3JldHVybiBlfHwoZT1kb2N1bWVudCksZS5oZWFkfHxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGUuZG9jdW1lbnRFbGVtZW50fSx0LmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0fHxpLGUpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZSl9LHQucmVtb3ZlQ2hpbGRyZW49ZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IiJ9LHQuY3JlYXRlVGV4dE5vZGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10P3Qub3duZXJEb2N1bWVudDpkb2N1bWVudDtyZXR1cm4gbi5jcmVhdGVUZXh0Tm9kZShlKX0sdC5jcmVhdGVGcmFnbWVudD1mdW5jdGlvbihlKXt2YXIgdD1lP2Uub3duZXJEb2N1bWVudDpkb2N1bWVudDtyZXR1cm4gdC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCl9LHQuaGFzQ3NzQ2xhc3M9ZnVuY3Rpb24oZSx0KXt2YXIgbj0oZS5jbGFzc05hbWUrIiIpLnNwbGl0KC9ccysvZyk7cmV0dXJuIG4uaW5kZXhPZih0KSE9PS0xfSx0LmFkZENzc0NsYXNzPWZ1bmN0aW9uKGUsbil7dC5oYXNDc3NDbGFzcyhlLG4pfHwoZS5jbGFzc05hbWUrPSIgIituKX0sdC5yZW1vdmVDc3NDbGFzcz1mdW5jdGlvbihlLHQpe3ZhciBuPWUuY2xhc3NOYW1lLnNwbGl0KC9ccysvZyk7Zm9yKDs7KXt2YXIgcj1uLmluZGV4T2YodCk7aWYocj09LTEpYnJlYWs7bi5zcGxpY2UociwxKX1lLmNsYXNzTmFtZT1uLmpvaW4oIiAiKX0sdC50b2dnbGVDc3NDbGFzcz1mdW5jdGlvbihlLHQpe3ZhciBuPWUuY2xhc3NOYW1lLnNwbGl0KC9ccysvZykscj0hMDtmb3IoOzspe3ZhciBpPW4uaW5kZXhPZih0KTtpZihpPT0tMSlicmVhaztyPSExLG4uc3BsaWNlKGksMSl9cmV0dXJuIHImJm4ucHVzaCh0KSxlLmNsYXNzTmFtZT1uLmpvaW4oIiAiKSxyfSx0LnNldENzc0NsYXNzPWZ1bmN0aW9uKGUsbixyKXtyP3QuYWRkQ3NzQ2xhc3MoZSxuKTp0LnJlbW92ZUNzc0NsYXNzKGUsbil9LHQuaGFzQ3NzU3RyaW5nPWZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyO3Q9dHx8ZG9jdW1lbnQ7aWYocj10LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIikpd2hpbGUobjxyLmxlbmd0aClpZihyW24rK10uaWQ9PT1lKXJldHVybiEwfSx0LmltcG9ydENzc1N0cmluZz1mdW5jdGlvbihuLHIsaSl7dmFyIHM9aTtpZighaXx8IWkuZ2V0Um9vdE5vZGUpcz1kb2N1bWVudDtlbHNle3M9aS5nZXRSb290Tm9kZSgpO2lmKCFzfHxzPT1pKXM9ZG9jdW1lbnR9dmFyIG89cy5vd25lckRvY3VtZW50fHxzO2lmKHImJnQuaGFzQ3NzU3RyaW5nKHIscykpcmV0dXJuIG51bGw7ciYmKG4rPSJcbi8qIyBzb3VyY2VVUkw9YWNlL2Nzcy8iK3IrIiAqLyIpO3ZhciB1PXQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt1LmFwcGVuZENoaWxkKG8uY3JlYXRlVGV4dE5vZGUobikpLHImJih1LmlkPXIpLHM9PW8mJihzPXQuZ2V0RG9jdW1lbnRIZWFkKG8pKSxzLmluc2VydEJlZm9yZSh1LHMuZmlyc3RDaGlsZCl9LHQuaW1wb3J0Q3NzU3R5bHNoZWV0PWZ1bmN0aW9uKGUsbil7dC5idWlsZERvbShbImxpbmsiLHtyZWw6InN0eWxlc2hlZXQiLGhyZWY6ZX1dLHQuZ2V0RG9jdW1lbnRIZWFkKG4pKX0sdC5zY3JvbGxiYXJXaWR0aD1mdW5jdGlvbihlKXt2YXIgbj10LmNyZWF0ZUVsZW1lbnQoImFjZV9pbm5lciIpO24uc3R5bGUud2lkdGg9IjEwMCUiLG4uc3R5bGUubWluV2lkdGg9IjBweCIsbi5zdHlsZS5oZWlnaHQ9IjIwMHB4IixuLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt2YXIgcj10LmNyZWF0ZUVsZW1lbnQoImFjZV9vdXRlciIpLGk9ci5zdHlsZTtpLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaS5sZWZ0PSItMTAwMDBweCIsaS5vdmVyZmxvdz0iaGlkZGVuIixpLndpZHRoPSIyMDBweCIsaS5taW5XaWR0aD0iMHB4IixpLmhlaWdodD0iMTUwcHgiLGkuZGlzcGxheT0iYmxvY2siLHIuYXBwZW5kQ2hpbGQobik7dmFyIHM9ZS5kb2N1bWVudEVsZW1lbnQ7cy5hcHBlbmRDaGlsZChyKTt2YXIgbz1uLm9mZnNldFdpZHRoO2kub3ZlcmZsb3c9InNjcm9sbCI7dmFyIHU9bi5vZmZzZXRXaWR0aDtyZXR1cm4gbz09dSYmKHU9ci5jbGllbnRXaWR0aCkscy5yZW1vdmVDaGlsZChyKSxvLXV9LHR5cGVvZiBkb2N1bWVudD09InVuZGVmaW5lZCImJih0LmltcG9ydENzc1N0cmluZz1mdW5jdGlvbigpe30pLHQuY29tcHV0ZWRTdHlsZT1mdW5jdGlvbihlLHQpe3JldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlLCIiKXx8e319LHQuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0LG4pe2VbdF0hPT1uJiYoZVt0XT1uKX0sdC5IQVNfQ1NTX0FOSU1BVElPTj0hMSx0LkhBU19DU1NfVFJBTlNGT1JNUz0hMSx0LkhJX0RQST1yLmlzV2luP3R5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbz49MS41OiEwO2lmKHR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCIpe3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuSElfRFBJJiZzLnN0eWxlLnRyYW5zZm9ybSE9PXVuZGVmaW5lZCYmKHQuSEFTX0NTU19UUkFOU0ZPUk1TPSEwKSwhci5pc0VkZ2UmJnR5cGVvZiBzLnN0eWxlLmFuaW1hdGlvbk5hbWUhPSJ1bmRlZmluZWQiJiYodC5IQVNfQ1NTX0FOSU1BVElPTj0hMCkscz1udWxsfXQuSEFTX0NTU19UUkFOU0ZPUk1TP3QudHJhbnNsYXRlPWZ1bmN0aW9uKGUsdCxuKXtlLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlKCIrTWF0aC5yb3VuZCh0KSsicHgsICIrTWF0aC5yb3VuZChuKSsicHgpIn06dC50cmFuc2xhdGU9ZnVuY3Rpb24oZSx0LG4pe2Uuc3R5bGUudG9wPU1hdGgucm91bmQobikrInB4IixlLnN0eWxlLmxlZnQ9TWF0aC5yb3VuZCh0KSsicHgifX0pLGFjZS5kZWZpbmUoImFjZS9saWIvb29wIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0LmluaGVyaXRzPWZ1bmN0aW9uKGUsdCl7ZS5zdXBlcl89dCxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX0sdC5taXhpbj1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX0sdC5pbXBsZW1lbnQ9ZnVuY3Rpb24oZSxuKXt0Lm1peGluKGUsbil9fSksYWNlLmRlZmluZSgiYWNlL2xpYi9rZXlzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vb29wIiksaT1mdW5jdGlvbigpe3ZhciBlPXtNT0RJRklFUl9LRVlTOnsxNjoiU2hpZnQiLDE3OiJDdHJsIiwxODoiQWx0IiwyMjQ6Ik1ldGEiLDkxOiJNZXRhTGVmdCIsOTI6Ik1ldGFSaWdodCIsOTM6IkNvbnRleHRNZW51In0sS0VZX01PRFM6e2N0cmw6MSxhbHQ6MixvcHRpb246MixzaGlmdDo0LCJzdXBlciI6OCxtZXRhOjgsY29tbWFuZDo4LGNtZDo4fSxGVU5DVElPTl9LRVlTOns4OiJCYWNrc3BhY2UiLDk6IlRhYiIsMTM6IlJldHVybiIsMTk6IlBhdXNlIiwyNzoiRXNjIiwzMjoiU3BhY2UiLDMzOiJQYWdlVXAiLDM0OiJQYWdlRG93biIsMzU6IkVuZCIsMzY6IkhvbWUiLDM3OiJMZWZ0IiwzODoiVXAiLDM5OiJSaWdodCIsNDA6IkRvd24iLDQ0OiJQcmludCIsNDU6Ikluc2VydCIsNDY6IkRlbGV0ZSIsOTY6Ik51bXBhZDAiLDk3OiJOdW1wYWQxIiw5ODoiTnVtcGFkMiIsOTk6Ik51bXBhZDMiLDEwMDoiTnVtcGFkNCIsMTAxOiJOdW1wYWQ1IiwxMDI6Ik51bXBhZDYiLDEwMzoiTnVtcGFkNyIsMTA0OiJOdW1wYWQ4IiwxMDU6Ik51bXBhZDkiLCItMTMiOiJOdW1wYWRFbnRlciIsMTEyOiJGMSIsMTEzOiJGMiIsMTE0OiJGMyIsMTE1OiJGNCIsMTE2OiJGNSIsMTE3OiJGNiIsMTE4OiJGNyIsMTE5OiJGOCIsMTIwOiJGOSIsMTIxOiJGMTAiLDEyMjoiRjExIiwxMjM6IkYxMiIsMTQ0OiJOdW1sb2NrIiwxNDU6IlNjcm9sbGxvY2sifSxQUklOVEFCTEVfS0VZUzp7MzI6IiAiLDQ4OiIwIiw0OToiMSIsNTA6IjIiLDUxOiIzIiw1MjoiNCIsNTM6IjUiLDU0OiI2Iiw1NToiNyIsNTY6IjgiLDU3OiI5Iiw1OToiOyIsNjE6Ij0iLDY1OiJhIiw2NjoiYiIsNjc6ImMiLDY4OiJkIiw2OToiZSIsNzA6ImYiLDcxOiJnIiw3MjoiaCIsNzM6ImkiLDc0OiJqIiw3NToiayIsNzY6ImwiLDc3OiJtIiw3ODoibiIsNzk6Im8iLDgwOiJwIiw4MToicSIsODI6InIiLDgzOiJzIiw4NDoidCIsODU6InUiLDg2OiJ2Iiw4NzoidyIsODg6IngiLDg5OiJ5Iiw5MDoieiIsMTA3OiIrIiwxMDk6Ii0iLDExMDoiLiIsMTg2OiI7IiwxODc6Ij0iLDE4ODoiLCIsMTg5OiItIiwxOTA6Ii4iLDE5MToiLyIsMTkyOiJgIiwyMTk6IlsiLDIyMDoiXFwiLDIyMToiXSIsMjIyOiInIiwxMTE6Ii8iLDEwNjoiKiJ9fSx0LG47Zm9yKG4gaW4gZS5GVU5DVElPTl9LRVlTKXQ9ZS5GVU5DVElPTl9LRVlTW25dLnRvTG93ZXJDYXNlKCksZVt0XT1wYXJzZUludChuLDEwKTtmb3IobiBpbiBlLlBSSU5UQUJMRV9LRVlTKXQ9ZS5QUklOVEFCTEVfS0VZU1tuXS50b0xvd2VyQ2FzZSgpLGVbdF09cGFyc2VJbnQobiwxMCk7cmV0dXJuIHIubWl4aW4oZSxlLk1PRElGSUVSX0tFWVMpLHIubWl4aW4oZSxlLlBSSU5UQUJMRV9LRVlTKSxyLm1peGluKGUsZS5GVU5DVElPTl9LRVlTKSxlLmVudGVyPWVbInJldHVybiJdLGUuZXNjYXBlPWUuZXNjLGUuZGVsPWVbImRlbGV0ZSJdLGVbMTczXT0iLSIsZnVuY3Rpb24oKXt2YXIgdD1bImNtZCIsImN0cmwiLCJhbHQiLCJzaGlmdCJdO2Zvcih2YXIgbj1NYXRoLnBvdygyLHQubGVuZ3RoKTtuLS07KWUuS0VZX01PRFNbbl09dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIG4mZS5LRVlfTU9EU1t0XX0pLmpvaW4oIi0iKSsiLSJ9KCksZS5LRVlfTU9EU1swXT0iIixlLktFWV9NT0RTWy0xXT0iaW5wdXQtIixlfSgpO3IubWl4aW4odCxpKSx0LmtleUNvZGVUb1N0cmluZz1mdW5jdGlvbihlKXt2YXIgdD1pW2VdO3JldHVybiB0eXBlb2YgdCE9InN0cmluZyImJih0PVN0cmluZy5mcm9tQ2hhckNvZGUoZSkpLHQudG9Mb3dlckNhc2UoKX19KSxhY2UuZGVmaW5lKCJhY2UvbGliL2V2ZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9rZXlzIiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoZSx0LG4pe3ZhciBhPXUodCk7aWYoIWkuaXNNYWMmJnMpe3QuZ2V0TW9kaWZpZXJTdGF0ZSYmKHQuZ2V0TW9kaWZpZXJTdGF0ZSgiT1MiKXx8dC5nZXRNb2RpZmllclN0YXRlKCJXaW4iKSkmJihhfD04KTtpZihzLmFsdEdyKXtpZigoMyZhKT09MylyZXR1cm47cy5hbHRHcj0wfWlmKG49PT0xOHx8bj09PTE3KXt2YXIgZj0ibG9jYXRpb24iaW4gdD90LmxvY2F0aW9uOnQua2V5TG9jYXRpb247aWYobj09PTE3JiZmPT09MSlzW25dPT0xJiYobz10LnRpbWVTdGFtcCk7ZWxzZSBpZihuPT09MTgmJmE9PT0zJiZmPT09Mil7dmFyIGw9dC50aW1lU3RhbXAtbztsPDUwJiYocy5hbHRHcj0hMCl9fX1uIGluIHIuTU9ESUZJRVJfS0VZUyYmKG49LTEpO2lmKCFhJiZuPT09MTMpe3ZhciBmPSJsb2NhdGlvbiJpbiB0P3QubG9jYXRpb246dC5rZXlMb2NhdGlvbjtpZihmPT09Myl7ZSh0LGEsLW4pO2lmKHQuZGVmYXVsdFByZXZlbnRlZClyZXR1cm59fWlmKGkuaXNDaHJvbWVPUyYmYSY4KXtlKHQsYSxuKTtpZih0LmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuO2EmPS05fXJldHVybiEhYXx8biBpbiByLkZVTkNUSU9OX0tFWVN8fG4gaW4gci5QUklOVEFCTEVfS0VZUz9lKHQsYSxuKTohMX1mdW5jdGlvbiBmKCl7cz1PYmplY3QuY3JlYXRlKG51bGwpfXZhciByPWUoIi4va2V5cyIpLGk9ZSgiLi91c2VyYWdlbnQiKSxzPW51bGwsbz0wO3QuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4pe2lmKGUuYWRkRXZlbnRMaXN0ZW5lcilyZXR1cm4gZS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMSk7aWYoZS5hdHRhY2hFdmVudCl7dmFyIHI9ZnVuY3Rpb24oKXtuLmNhbGwoZSx3aW5kb3cuZXZlbnQpfTtuLl93cmFwcGVyPXIsZS5hdHRhY2hFdmVudCgib24iK3Qscil9fSx0LnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGUsdCxuKXtpZihlLnJlbW92ZUV2ZW50TGlzdGVuZXIpcmV0dXJuIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITEpO2UuZGV0YWNoRXZlbnQmJmUuZGV0YWNoRXZlbnQoIm9uIit0LG4uX3dyYXBwZXJ8fG4pfSx0LnN0b3BFdmVudD1mdW5jdGlvbihlKXtyZXR1cm4gdC5zdG9wUHJvcGFnYXRpb24oZSksdC5wcmV2ZW50RGVmYXVsdChlKSwhMX0sdC5zdG9wUHJvcGFnYXRpb249ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24/ZS5zdG9wUHJvcGFnYXRpb24oKTplLmNhbmNlbEJ1YmJsZT0hMH0sdC5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0P2UucHJldmVudERlZmF1bHQoKTplLnJldHVyblZhbHVlPSExfSx0LmdldEJ1dHRvbj1mdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT0iZGJsY2xpY2siPzA6ZS50eXBlPT0iY29udGV4dG1lbnUifHxpLmlzTWFjJiZlLmN0cmxLZXkmJiFlLmFsdEtleSYmIWUuc2hpZnRLZXk/MjplLnByZXZlbnREZWZhdWx0P2UuYnV0dG9uOnsxOjAsMjoyLDQ6MX1bZS5idXR0b25dfSx0LmNhcHR1cmU9ZnVuY3Rpb24oZSxuLHIpe2Z1bmN0aW9uIGkoZSl7biYmbihlKSxyJiZyKGUpLHQucmVtb3ZlTGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsbiwhMCksdC5yZW1vdmVMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsaSwhMCksdC5yZW1vdmVMaXN0ZW5lcihkb2N1bWVudCwiZHJhZ3N0YXJ0IixpLCEwKX1yZXR1cm4gdC5hZGRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixuLCEwKSx0LmFkZExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixpLCEwKSx0LmFkZExpc3RlbmVyKGRvY3VtZW50LCJkcmFnc3RhcnQiLGksITApLGl9LHQuYWRkTW91c2VXaGVlbExpc3RlbmVyPWZ1bmN0aW9uKGUsbil7Im9ubW91c2V3aGVlbCJpbiBlP3QuYWRkTGlzdGVuZXIoZSwibW91c2V3aGVlbCIsZnVuY3Rpb24oZSl7dmFyIHQ9ODtlLndoZWVsRGVsdGFYIT09dW5kZWZpbmVkPyhlLndoZWVsWD0tZS53aGVlbERlbHRhWC90LGUud2hlZWxZPS1lLndoZWVsRGVsdGFZL3QpOihlLndoZWVsWD0wLGUud2hlZWxZPS1lLndoZWVsRGVsdGEvdCksbihlKX0pOiJvbndoZWVsImluIGU/dC5hZGRMaXN0ZW5lcihlLCJ3aGVlbCIsZnVuY3Rpb24oZSl7dmFyIHQ9LjM1O3N3aXRjaChlLmRlbHRhTW9kZSl7Y2FzZSBlLkRPTV9ERUxUQV9QSVhFTDplLndoZWVsWD1lLmRlbHRhWCp0fHwwLGUud2hlZWxZPWUuZGVsdGFZKnR8fDA7YnJlYWs7Y2FzZSBlLkRPTV9ERUxUQV9MSU5FOmNhc2UgZS5ET01fREVMVEFfUEFHRTplLndoZWVsWD0oZS5kZWx0YVh8fDApKjUsZS53aGVlbFk9KGUuZGVsdGFZfHwwKSo1fW4oZSl9KTp0LmFkZExpc3RlbmVyKGUsIkRPTU1vdXNlU2Nyb2xsIixmdW5jdGlvbihlKXtlLmF4aXMmJmUuYXhpcz09ZS5IT1JJWk9OVEFMX0FYSVM/KGUud2hlZWxYPShlLmRldGFpbHx8MCkqNSxlLndoZWVsWT0wKTooZS53aGVlbFg9MCxlLndoZWVsWT0oZS5kZXRhaWx8fDApKjUpLG4oZSl9KX0sdC5hZGRNdWx0aU1vdXNlRG93bkxpc3RlbmVyPWZ1bmN0aW9uKGUsbixyLHMpe2Z1bmN0aW9uIGMoZSl7dC5nZXRCdXR0b24oZSkhPT0wP289MDplLmRldGFpbD4xPyhvKyssbz40JiYobz0xKSk6bz0xO2lmKGkuaXNJRSl7dmFyIGM9TWF0aC5hYnMoZS5jbGllbnRYLXUpPjV8fE1hdGguYWJzKGUuY2xpZW50WS1hKT41O2lmKCFmfHxjKW89MTtmJiZjbGVhclRpbWVvdXQoZiksZj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zj1udWxsfSxuW28tMV18fDYwMCksbz09MSYmKHU9ZS5jbGllbnRYLGE9ZS5jbGllbnRZKX1lLl9jbGlja3M9byxyW3NdKCJtb3VzZWRvd24iLGUpO2lmKG8+NClvPTA7ZWxzZSBpZihvPjEpcmV0dXJuIHJbc10obFtvXSxlKX1mdW5jdGlvbiBoKGUpe289MixmJiZjbGVhclRpbWVvdXQoZiksZj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zj1udWxsfSxuW28tMV18fDYwMCkscltzXSgibW91c2Vkb3duIixlKSxyW3NdKGxbb10sZSl9dmFyIG89MCx1LGEsZixsPXsyOiJkYmxjbGljayIsMzoidHJpcGxlY2xpY2siLDQ6InF1YWRjbGljayJ9O0FycmF5LmlzQXJyYXkoZSl8fChlPVtlXSksZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYWRkTGlzdGVuZXIoZSwibW91c2Vkb3duIixjKSxpLmlzT2xkSUUmJnQuYWRkTGlzdGVuZXIoZSwiZGJsY2xpY2siLGgpfSl9O3ZhciB1PSFpLmlzTWFjfHwhaS5pc09wZXJhfHwiS2V5Ym9hcmRFdmVudCJpbiB3aW5kb3c/ZnVuY3Rpb24oZSl7cmV0dXJuIDB8KGUuY3RybEtleT8xOjApfChlLmFsdEtleT8yOjApfChlLnNoaWZ0S2V5PzQ6MCl8KGUubWV0YUtleT84OjApfTpmdW5jdGlvbihlKXtyZXR1cm4gMHwoZS5tZXRhS2V5PzE6MCl8KGUuYWx0S2V5PzI6MCl8KGUuc2hpZnRLZXk/NDowKXwoZS5jdHJsS2V5Pzg6MCl9O3QuZ2V0TW9kaWZpZXJTdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuS0VZX01PRFNbdShlKV19LHQuYWRkQ29tbWFuZEtleUxpc3RlbmVyPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5hZGRMaXN0ZW5lcjtpZihpLmlzT2xkR2Vja298fGkuaXNPcGVyYSYmISgiS2V5Ym9hcmRFdmVudCJpbiB3aW5kb3cpKXt2YXIgbz1udWxsO3IoZSwia2V5ZG93biIsZnVuY3Rpb24oZSl7bz1lLmtleUNvZGV9KSxyKGUsImtleXByZXNzIixmdW5jdGlvbihlKXtyZXR1cm4gYShuLGUsbyl9KX1lbHNle3ZhciB1PW51bGw7cihlLCJrZXlkb3duIixmdW5jdGlvbihlKXtzW2Uua2V5Q29kZV09KHNbZS5rZXlDb2RlXXx8MCkrMTt2YXIgdD1hKG4sZSxlLmtleUNvZGUpO3JldHVybiB1PWUuZGVmYXVsdFByZXZlbnRlZCx0fSkscihlLCJrZXlwcmVzcyIsZnVuY3Rpb24oZSl7dSYmKGUuY3RybEtleXx8ZS5hbHRLZXl8fGUuc2hpZnRLZXl8fGUubWV0YUtleSkmJih0LnN0b3BFdmVudChlKSx1PW51bGwpfSkscihlLCJrZXl1cCIsZnVuY3Rpb24oZSl7c1tlLmtleUNvZGVdPW51bGx9KSxzfHwoZigpLHIod2luZG93LCJmb2N1cyIsZikpfX07aWYodHlwZW9mIHdpbmRvdz09Im9iamVjdCImJndpbmRvdy5wb3N0TWVzc2FnZSYmIWkuaXNPbGRJRSl7dmFyIGw9MTt0Lm5leHRUaWNrPWZ1bmN0aW9uKGUsbil7bj1ufHx3aW5kb3c7dmFyIHI9Inplcm8tdGltZW91dC1tZXNzYWdlLSIrbCsrLGk9ZnVuY3Rpb24ocyl7cy5kYXRhPT1yJiYodC5zdG9wUHJvcGFnYXRpb24ocyksdC5yZW1vdmVMaXN0ZW5lcihuLCJtZXNzYWdlIixpKSxlKCkpfTt0LmFkZExpc3RlbmVyKG4sIm1lc3NhZ2UiLGkpLG4ucG9zdE1lc3NhZ2UociwiKiIpfX10LiRpZGxlQmxvY2tlZD0hMSx0Lm9uSWRsZT1mdW5jdGlvbihlLG4pe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uIHIoKXt0LiRpZGxlQmxvY2tlZD9zZXRUaW1lb3V0KHIsMTAwKTplKCl9LG4pfSx0LiRpZGxlQmxvY2tJZD1udWxsLHQuYmxvY2tJZGxlPWZ1bmN0aW9uKGUpe3QuJGlkbGVCbG9ja0lkJiZjbGVhclRpbWVvdXQodC4kaWRsZUJsb2NrSWQpLHQuJGlkbGVCbG9ja2VkPSEwLHQuJGlkbGVCbG9ja0lkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LiRpZGxlQmxvY2tlZD0hMX0sZXx8MTAwKX0sdC5uZXh0RnJhbWU9dHlwZW9mIHdpbmRvdz09Im9iamVjdCImJih3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lKSx0Lm5leHRGcmFtZT90Lm5leHRGcmFtZT10Lm5leHRGcmFtZS5iaW5kKHdpbmRvdyk6dC5uZXh0RnJhbWU9ZnVuY3Rpb24oZSl7c2V0VGltZW91dChlLDE3KX19KSxhY2UuZGVmaW5lKCJhY2UvcmFuZ2UiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucm93LXQucm93fHxlLmNvbHVtbi10LmNvbHVtbn0saT1mdW5jdGlvbihlLHQsbixyKXt0aGlzLnN0YXJ0PXtyb3c6ZSxjb2x1bW46dH0sdGhpcy5lbmQ9e3JvdzpuLGNvbHVtbjpyfX07KGZ1bmN0aW9uKCl7dGhpcy5pc0VxdWFsPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnN0YXJ0LnJvdz09PWUuc3RhcnQucm93JiZ0aGlzLmVuZC5yb3c9PT1lLmVuZC5yb3cmJnRoaXMuc3RhcnQuY29sdW1uPT09ZS5zdGFydC5jb2x1bW4mJnRoaXMuZW5kLmNvbHVtbj09PWUuZW5kLmNvbHVtbn0sdGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJSYW5nZTogWyIrdGhpcy5zdGFydC5yb3crIi8iK3RoaXMuc3RhcnQuY29sdW1uKyJdIC0+IFsiK3RoaXMuZW5kLnJvdysiLyIrdGhpcy5lbmQuY29sdW1uKyJdIn0sdGhpcy5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmNvbXBhcmUoZSx0KT09MH0sdGhpcy5jb21wYXJlUmFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmVuZCxyPWUuc3RhcnQ7cmV0dXJuIHQ9dGhpcy5jb21wYXJlKG4ucm93LG4uY29sdW1uKSx0PT0xPyh0PXRoaXMuY29tcGFyZShyLnJvdyxyLmNvbHVtbiksdD09MT8yOnQ9PTA/MTowKTp0PT0tMT8tMjoodD10aGlzLmNvbXBhcmUoci5yb3csci5jb2x1bW4pLHQ9PS0xPy0xOnQ9PTE/NDI6MCl9LHRoaXMuY29tcGFyZVBvaW50PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbXBhcmUoZS5yb3csZS5jb2x1bW4pfSx0aGlzLmNvbnRhaW5zUmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29tcGFyZVBvaW50KGUuc3RhcnQpPT0wJiZ0aGlzLmNvbXBhcmVQb2ludChlLmVuZCk9PTB9LHRoaXMuaW50ZXJzZWN0cz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNvbXBhcmVSYW5nZShlKTtyZXR1cm4gdD09LTF8fHQ9PTB8fHQ9PTF9LHRoaXMuaXNFbmQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmQucm93PT1lJiZ0aGlzLmVuZC5jb2x1bW49PXR9LHRoaXMuaXNTdGFydD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnN0YXJ0LnJvdz09ZSYmdGhpcy5zdGFydC5jb2x1bW49PXR9LHRoaXMuc2V0U3RhcnQ9ZnVuY3Rpb24oZSx0KXt0eXBlb2YgZT09Im9iamVjdCI/KHRoaXMuc3RhcnQuY29sdW1uPWUuY29sdW1uLHRoaXMuc3RhcnQucm93PWUucm93KToodGhpcy5zdGFydC5yb3c9ZSx0aGlzLnN0YXJ0LmNvbHVtbj10KX0sdGhpcy5zZXRFbmQ9ZnVuY3Rpb24oZSx0KXt0eXBlb2YgZT09Im9iamVjdCI/KHRoaXMuZW5kLmNvbHVtbj1lLmNvbHVtbix0aGlzLmVuZC5yb3c9ZS5yb3cpOih0aGlzLmVuZC5yb3c9ZSx0aGlzLmVuZC5jb2x1bW49dCl9LHRoaXMuaW5zaWRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuY29tcGFyZShlLHQpPT0wP3RoaXMuaXNFbmQoZSx0KXx8dGhpcy5pc1N0YXJ0KGUsdCk/ITE6ITA6ITF9LHRoaXMuaW5zaWRlU3RhcnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5jb21wYXJlKGUsdCk9PTA/dGhpcy5pc0VuZChlLHQpPyExOiEwOiExfSx0aGlzLmluc2lkZUVuZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmNvbXBhcmUoZSx0KT09MD90aGlzLmlzU3RhcnQoZSx0KT8hMTohMDohMX0sdGhpcy5jb21wYXJlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIXRoaXMuaXNNdWx0aUxpbmUoKSYmZT09PXRoaXMuc3RhcnQucm93P3Q8dGhpcy5zdGFydC5jb2x1bW4/LTE6dD50aGlzLmVuZC5jb2x1bW4/MTowOmU8dGhpcy5zdGFydC5yb3c/LTE6ZT50aGlzLmVuZC5yb3c/MTp0aGlzLnN0YXJ0LnJvdz09PWU/dD49dGhpcy5zdGFydC5jb2x1bW4/MDotMTp0aGlzLmVuZC5yb3c9PT1lP3Q8PXRoaXMuZW5kLmNvbHVtbj8wOjE6MH0sdGhpcy5jb21wYXJlU3RhcnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zdGFydC5yb3c9PWUmJnRoaXMuc3RhcnQuY29sdW1uPT10Py0xOnRoaXMuY29tcGFyZShlLHQpfSx0aGlzLmNvbXBhcmVFbmQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmQucm93PT1lJiZ0aGlzLmVuZC5jb2x1bW49PXQ/MTp0aGlzLmNvbXBhcmUoZSx0KX0sdGhpcy5jb21wYXJlSW5zaWRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5kLnJvdz09ZSYmdGhpcy5lbmQuY29sdW1uPT10PzE6dGhpcy5zdGFydC5yb3c9PWUmJnRoaXMuc3RhcnQuY29sdW1uPT10Py0xOnRoaXMuY29tcGFyZShlLHQpfSx0aGlzLmNsaXBSb3dzPWZ1bmN0aW9uKGUsdCl7aWYodGhpcy5lbmQucm93PnQpdmFyIG49e3Jvdzp0KzEsY29sdW1uOjB9O2Vsc2UgaWYodGhpcy5lbmQucm93PGUpdmFyIG49e3JvdzplLGNvbHVtbjowfTtpZih0aGlzLnN0YXJ0LnJvdz50KXZhciByPXtyb3c6dCsxLGNvbHVtbjowfTtlbHNlIGlmKHRoaXMuc3RhcnQucm93PGUpdmFyIHI9e3JvdzplLGNvbHVtbjowfTtyZXR1cm4gaS5mcm9tUG9pbnRzKHJ8fHRoaXMuc3RhcnQsbnx8dGhpcy5lbmQpfSx0aGlzLmV4dGVuZD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY29tcGFyZShlLHQpO2lmKG49PTApcmV0dXJuIHRoaXM7aWYobj09LTEpdmFyIHI9e3JvdzplLGNvbHVtbjp0fTtlbHNlIHZhciBzPXtyb3c6ZSxjb2x1bW46dH07cmV0dXJuIGkuZnJvbVBvaW50cyhyfHx0aGlzLnN0YXJ0LHN8fHRoaXMuZW5kKX0sdGhpcy5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnQucm93PT09dGhpcy5lbmQucm93JiZ0aGlzLnN0YXJ0LmNvbHVtbj09PXRoaXMuZW5kLmNvbHVtbn0sdGhpcy5pc011bHRpTGluZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LnJvdyE9PXRoaXMuZW5kLnJvd30sdGhpcy5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBpLmZyb21Qb2ludHModGhpcy5zdGFydCx0aGlzLmVuZCl9LHRoaXMuY29sbGFwc2VSb3dzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kLmNvbHVtbj09MD9uZXcgaSh0aGlzLnN0YXJ0LnJvdywwLE1hdGgubWF4KHRoaXMuc3RhcnQucm93LHRoaXMuZW5kLnJvdy0xKSwwKTpuZXcgaSh0aGlzLnN0YXJ0LnJvdywwLHRoaXMuZW5kLnJvdywwKX0sdGhpcy50b1NjcmVlblJhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuc3RhcnQpLG49ZS5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5lbmQpO3JldHVybiBuZXcgaSh0LnJvdyx0LmNvbHVtbixuLnJvdyxuLmNvbHVtbil9LHRoaXMubW92ZUJ5PWZ1bmN0aW9uKGUsdCl7dGhpcy5zdGFydC5yb3crPWUsdGhpcy5zdGFydC5jb2x1bW4rPXQsdGhpcy5lbmQucm93Kz1lLHRoaXMuZW5kLmNvbHVtbis9dH19KS5jYWxsKGkucHJvdG90eXBlKSxpLmZyb21Qb2ludHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IGkoZS5yb3csZS5jb2x1bW4sdC5yb3csdC5jb2x1bW4pfSxpLmNvbXBhcmVQb2ludHM9cixpLmNvbXBhcmVQb2ludHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5yb3ctdC5yb3d8fGUuY29sdW1uLXQuY29sdW1ufSx0LlJhbmdlPWl9KSxhY2UuZGVmaW5lKCJhY2UvbGliL2xhbmciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QubGFzdD1mdW5jdGlvbihlKXtyZXR1cm4gZVtlLmxlbmd0aC0xXX0sdC5zdHJpbmdSZXZlcnNlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIil9LHQuc3RyaW5nUmVwZWF0PWZ1bmN0aW9uKGUsdCl7dmFyIG49IiI7d2hpbGUodD4wKXt0JjEmJihuKz1lKTtpZih0Pj49MSllKz1lfXJldHVybiBufTt2YXIgcj0vXlxzXHMqLyxpPS9cc1xzKiQvO3Quc3RyaW5nVHJpbUxlZnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShyLCIiKX0sdC5zdHJpbmdUcmltUmlnaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShpLCIiKX0sdC5jb3B5T2JqZWN0PWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXTtyZXR1cm4gdH0sdC5jb3B5QXJyYXk9ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0mJnR5cGVvZiBlW25dPT0ib2JqZWN0Ij90W25dPXRoaXMuY29weU9iamVjdChlW25dKTp0W25dPWVbbl07cmV0dXJuIHR9LHQuZGVlcENvcHk9ZnVuY3Rpb24gcyhlKXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fCFlKXJldHVybiBlO3ZhciB0O2lmKEFycmF5LmlzQXJyYXkoZSkpe3Q9W107Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspdFtuXT1zKGVbbl0pO3JldHVybiB0fWlmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSE9PSJbb2JqZWN0IE9iamVjdF0iKXJldHVybiBlO3Q9e307Zm9yKHZhciBuIGluIGUpdFtuXT1zKGVbbl0pO3JldHVybiB0fSx0LmFycmF5VG9NYXA9ZnVuY3Rpb24oZSl7dmFyIHQ9e307Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspdFtlW25dXT0xO3JldHVybiB0fSx0LmNyZWF0ZU1hcD1mdW5jdGlvbihlKXt2YXIgdD1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXTtyZXR1cm4gdH0sdC5hcnJheVJlbW92ZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248PWUubGVuZ3RoO24rKyl0PT09ZVtuXSYmZS5zcGxpY2UobiwxKX0sdC5lc2NhcGVSZWdFeHA9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvKFsuKis/XiR7fSgpfFtcXVwvXFxdKS9nLCJcXCQxIil9LHQuZXNjYXBlSFRNTD1mdW5jdGlvbihlKXtyZXR1cm4oIiIrZSkucmVwbGFjZSgvJi9nLCImIzM4OyIpLnJlcGxhY2UoLyIvZywiJiMzNDsiKS5yZXBsYWNlKC8nL2csIiYjMzk7IikucmVwbGFjZSgvPC9nLCImIzYwOyIpfSx0LmdldE1hdGNoT2Zmc2V0cz1mdW5jdGlvbihlLHQpe3ZhciBuPVtdO3JldHVybiBlLnJlcGxhY2UodCxmdW5jdGlvbihlKXtuLnB1c2goe29mZnNldDphcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0yXSxsZW5ndGg6ZS5sZW5ndGh9KX0pLG59LHQuZGVmZXJyZWRDYWxsPWZ1bmN0aW9uKGUpe3ZhciB0PW51bGwsbj1mdW5jdGlvbigpe3Q9bnVsbCxlKCl9LHI9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuY2FuY2VsKCksdD1zZXRUaW1lb3V0KG4sZXx8MCkscn07cmV0dXJuIHIuc2NoZWR1bGU9cixyLmNhbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWwoKSxlKCkscn0sci5jYW5jZWw9ZnVuY3Rpb24oKXtyZXR1cm4gY2xlYXJUaW1lb3V0KHQpLHQ9bnVsbCxyfSxyLmlzUGVuZGluZz1mdW5jdGlvbigpe3JldHVybiB0fSxyfSx0LmRlbGF5ZWRDYWxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49bnVsbCxyPWZ1bmN0aW9uKCl7bj1udWxsLGUoKX0saT1mdW5jdGlvbihlKXtuPT1udWxsJiYobj1zZXRUaW1lb3V0KHIsZXx8dCkpfTtyZXR1cm4gaS5kZWxheT1mdW5jdGlvbihlKXtuJiZjbGVhclRpbWVvdXQobiksbj1zZXRUaW1lb3V0KHIsZXx8dCl9LGkuc2NoZWR1bGU9aSxpLmNhbGw9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbCgpLGUoKX0saS5jYW5jZWw9ZnVuY3Rpb24oKXtuJiZjbGVhclRpbWVvdXQobiksbj1udWxsfSxpLmlzUGVuZGluZz1mdW5jdGlvbigpe3JldHVybiBufSxpfX0pLGFjZS5kZWZpbmUoImFjZS9jbGlwYm9hcmQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByO24uZXhwb3J0cz17bGluZU1vZGU6ITEscGFzdGVDYW5jZWxsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gciYmcj5EYXRlLm5vdygpLTUwPyEwOnI9ITF9LGNhbmNlbDpmdW5jdGlvbigpe3I9RGF0ZS5ub3coKX19fSksYWNlLmRlZmluZSgiYWNlL2tleWJvYXJkL3RleHRpbnB1dCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2NsaXBib2FyZCIsImFjZS9saWIva2V5cyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2V2ZW50IiksaT1lKCIuLi9saWIvdXNlcmFnZW50Iikscz1lKCIuLi9saWIvZG9tIiksbz1lKCIuLi9saWIvbGFuZyIpLHU9ZSgiLi4vY2xpcGJvYXJkIiksYT1pLmlzQ2hyb21lPDE4LGY9aS5pc0lFLGw9aS5pc0Nocm9tZT42MyxjPTQwMCxoPWUoIi4uL2xpYi9rZXlzIikscD1oLktFWV9NT0RTLGQ9aS5pc0lPUyx2PWQ/L1xzLzovXG4vLG09ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiB6KCl7Uz0hMCxuLmJsdXIoKSxuLmZvY3VzKCksUz0hMX1mdW5jdGlvbiBYKGUpe2Uua2V5Q29kZT09MjcmJm4udmFsdWUubGVuZ3RoPG4uc2VsZWN0aW9uU3RhcnQmJih5fHwoeD1uLnZhbHVlKSxUPU49LTEsTCgpKSxXKCl9ZnVuY3Rpb24gJCgpe2NsZWFyVGltZW91dChWKSxWPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt3JiYobi5zdHlsZS5jc3NUZXh0PXcsdz0iIiksdC5yZW5kZXJlci4kaXNNb3VzZVByZXNzZWQ9ITEsdC5yZW5kZXJlci4ka2VlcFRleHRBcmVhQXRDdXJzb3ImJnQucmVuZGVyZXIuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCl9LDApfWZ1bmN0aW9uIEsoZSx0LG4pe3ZhciByPW51bGwsaT0hMTtuLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKGUpe3ImJmNsZWFyVGltZW91dChyKSxpPSEwfSwhMCksbi5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsZnVuY3Rpb24oZSl7cj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aT0hMX0sMTAwKX0sITApO3ZhciBzPWZ1bmN0aW9uKGUpe2lmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhPT1uKXJldHVybjtpZihpfHx5fHx0LiRtb3VzZUhhbmRsZXIuaXNNb3VzZVByZXNzZWQpcmV0dXJuO2lmKG0pcmV0dXJuO3ZhciByPW4uc2VsZWN0aW9uU3RhcnQscz1uLnNlbGVjdGlvbkVuZCxvPW51bGwsdT0wO2lmKHI9PTApbz1oLnVwO2Vsc2UgaWYocj09MSlvPWguaG9tZTtlbHNlIGlmKHM+TiYmeFtzXT09IlxuIilvPWguZW5kO2Vsc2UgaWYocjxUJiZ4W3ItMV09PSIgIilvPWgubGVmdCx1PXAub3B0aW9uO2Vsc2UgaWYocjxUfHxyPT1UJiZOIT1UJiZyPT1zKW89aC5sZWZ0O2Vsc2UgaWYocz5OJiZ4LnNsaWNlKDAscykuc3BsaXQoIlxuIikubGVuZ3RoPjIpbz1oLmRvd247ZWxzZSBpZihzPk4mJnhbcy0xXT09IiAiKW89aC5yaWdodCx1PXAub3B0aW9uO2Vsc2UgaWYocz5OfHxzPT1OJiZOIT1UJiZyPT1zKW89aC5yaWdodDtyIT09cyYmKHV8PXAuc2hpZnQpO2lmKG8pe3ZhciBhPXQub25Db21tYW5kS2V5KHt9LHUsbyk7aWYoIWEmJnQuY29tbWFuZHMpe289aC5rZXlDb2RlVG9TdHJpbmcobyk7dmFyIGY9dC5jb21tYW5kcy5maW5kS2V5Q29tbWFuZCh1LG8pO2YmJnQuZXhlY0NvbW1hbmQoZil9VD1yLE49cyxMKCIiKX19O2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIscyksdC5vbigiZGVzdHJveSIsZnVuY3Rpb24oKXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLHMpfSl9dmFyIG49cy5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpO24uY2xhc3NOYW1lPSJhY2VfdGV4dC1pbnB1dCIsbi5zZXRBdHRyaWJ1dGUoIndyYXAiLCJvZmYiKSxuLnNldEF0dHJpYnV0ZSgiYXV0b2NvcnJlY3QiLCJvZmYiKSxuLnNldEF0dHJpYnV0ZSgiYXV0b2NhcGl0YWxpemUiLCJvZmYiKSxuLnNldEF0dHJpYnV0ZSgic3BlbGxjaGVjayIsITEpLG4uc3R5bGUub3BhY2l0eT0iMCIsZS5pbnNlcnRCZWZvcmUobixlLmZpcnN0Q2hpbGQpO3ZhciBtPSExLGc9ITEseT0hMSxiPSExLHc9IiI7aS5pc01vYmlsZXx8KG4uc3R5bGUuZm9udFNpemU9IjFweCIpO3ZhciBFPSExLFM9ITEseD0iIixUPTAsTj0wO3RyeXt2YXIgQz1kb2N1bWVudC5hY3RpdmVFbGVtZW50PT09bn1jYXRjaChrKXt9ci5hZGRMaXN0ZW5lcihuLCJibHVyIixmdW5jdGlvbihlKXtpZihTKXJldHVybjt0Lm9uQmx1cihlKSxDPSExfSksci5hZGRMaXN0ZW5lcihuLCJmb2N1cyIsZnVuY3Rpb24oZSl7aWYoUylyZXR1cm47Qz0hMDtpZihpLmlzRWRnZSl0cnl7aWYoIWRvY3VtZW50Lmhhc0ZvY3VzKCkpcmV0dXJufWNhdGNoKGUpe310Lm9uRm9jdXMoZSksaS5pc0VkZ2U/c2V0VGltZW91dChMKTpMKCl9KSx0aGlzLiRmb2N1c1Njcm9sbD0hMSx0aGlzLmZvY3VzPWZ1bmN0aW9uKCl7aWYod3x8bHx8dGhpcy4kZm9jdXNTY3JvbGw9PSJicm93c2VyIilyZXR1cm4gbi5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pO3ZhciBlPW4uc3R5bGUudG9wO24uc3R5bGUucG9zaXRpb249ImZpeGVkIixuLnN0eWxlLnRvcD0iMHB4Ijt0cnl7dmFyIHQ9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AhPTB9Y2F0Y2gocil7cmV0dXJufXZhciBpPVtdO2lmKHQpe3ZhciBzPW4ucGFyZW50RWxlbWVudDt3aGlsZShzJiZzLm5vZGVUeXBlPT0xKWkucHVzaChzKSxzLnNldEF0dHJpYnV0ZSgiYWNlX25vY29udGV4dCIsITApLCFzLnBhcmVudEVsZW1lbnQmJnMuZ2V0Um9vdE5vZGU/cz1zLmdldFJvb3ROb2RlKCkuaG9zdDpzPXMucGFyZW50RWxlbWVudH1uLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksdCYmaS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucmVtb3ZlQXR0cmlidXRlKCJhY2Vfbm9jb250ZXh0Iil9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5zdHlsZS5wb3NpdGlvbj0iIixuLnN0eWxlLnRvcD09IjBweCImJihuLnN0eWxlLnRvcD1lKX0sMCl9LHRoaXMuYmx1cj1mdW5jdGlvbigpe24uYmx1cigpfSx0aGlzLmlzRm9jdXNlZD1mdW5jdGlvbigpe3JldHVybiBDfSx0Lm9uKCJiZWZvcmVFbmRPcGVyYXRpb24iLGZ1bmN0aW9uKCl7aWYodC5jdXJPcCYmdC5jdXJPcC5jb21tYW5kLm5hbWU9PSJpbnNlcnRzdHJpbmciKXJldHVybjt5JiYoeD1uLnZhbHVlPSIiLFUoKSksTCgpfSk7dmFyIEw9ZD9mdW5jdGlvbihlKXtpZighQ3x8bSYmIWV8fGIpcmV0dXJuO2V8fChlPSIiKTt2YXIgcj0iXG4gYWIiK2UrImNkZSBmZ1xuIjtyIT1uLnZhbHVlJiYobi52YWx1ZT14PXIpO3ZhciBpPTQscz00KyhlLmxlbmd0aHx8KHQuc2VsZWN0aW9uLmlzRW1wdHkoKT8wOjEpKTsoVCE9aXx8TiE9cykmJm4uc2V0U2VsZWN0aW9uUmFuZ2UoaSxzKSxUPWksTj1zfTpmdW5jdGlvbigpe2lmKHl8fGIpcmV0dXJuO2lmKCFDJiYhXylyZXR1cm47eT0hMDt2YXIgZT10LnNlbGVjdGlvbixyPWUuZ2V0UmFuZ2UoKSxpPWUuY3Vyc29yLnJvdyxzPXIuc3RhcnQuY29sdW1uLG89ci5lbmQuY29sdW1uLHU9dC5zZXNzaW9uLmdldExpbmUoaSk7aWYoci5zdGFydC5yb3chPWkpe3ZhciBhPXQuc2Vzc2lvbi5nZXRMaW5lKGktMSk7cz1yLnN0YXJ0LnJvdzxpLTE/MDpzLG8rPWEubGVuZ3RoKzEsdT1hKyJcbiIrdX1lbHNlIGlmKHIuZW5kLnJvdyE9aSl7dmFyIGY9dC5zZXNzaW9uLmdldExpbmUoaSsxKTtvPXIuZW5kLnJvdz5pKzE/Zi5sZW5ndGg6byxvKz11Lmxlbmd0aCsxLHU9dSsiXG4iK2Z9dS5sZW5ndGg+YyYmKHM8YyYmbzxjP3U9dS5zbGljZSgwLGMpOih1PSJcbiIscz0wLG89MSkpO3ZhciBsPXUrIlxuXG4iO2whPXgmJihuLnZhbHVlPXg9bCxUPU49bC5sZW5ndGgpLF8mJihUPW4uc2VsZWN0aW9uU3RhcnQsTj1uLnNlbGVjdGlvbkVuZCk7aWYoTiE9b3x8VCE9c3x8bi5zZWxlY3Rpb25FbmQhPU4pdHJ5e24uc2V0U2VsZWN0aW9uUmFuZ2UocyxvKSxUPXMsTj1vfWNhdGNoKGgpe315PSExfTtDJiZ0Lm9uRm9jdXMoKTt2YXIgQT1mdW5jdGlvbihlKXtyZXR1cm4gZS5zZWxlY3Rpb25TdGFydD09PTAmJmUuc2VsZWN0aW9uRW5kPj14Lmxlbmd0aCYmZS52YWx1ZT09PXgmJngmJmUuc2VsZWN0aW9uRW5kIT09Tn0sTz1mdW5jdGlvbihlKXtpZih5KXJldHVybjttP209ITE6QShuKSYmKHQuc2VsZWN0QWxsKCksTCgpKX0sTT1udWxsO3RoaXMuc2V0SW5wdXRIYW5kbGVyPWZ1bmN0aW9uKGUpe009ZX0sdGhpcy5nZXRJbnB1dEhhbmRsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gTX07dmFyIF89ITEsRD1mdW5jdGlvbihlLHIpe18mJihfPSExKTtpZihnKXJldHVybiBMKCksZSYmdC5vblBhc3RlKGUpLGc9ITEsIiI7dmFyIGk9bi5zZWxlY3Rpb25TdGFydCxzPW4uc2VsZWN0aW9uRW5kLG89VCx1PXgubGVuZ3RoLU4sYT1lLGY9ZS5sZW5ndGgtaSxsPWUubGVuZ3RoLXMsYz0wO3doaWxlKG8+MCYmeFtjXT09ZVtjXSljKyssby0tO2E9YS5zbGljZShjKSxjPTE7d2hpbGUodT4wJiZ4Lmxlbmd0aC1jPlQtMSYmeFt4Lmxlbmd0aC1jXT09ZVtlLmxlbmd0aC1jXSljKyssdS0tO2YtPWMtMSxsLT1jLTE7dmFyIGg9YS5sZW5ndGgtYysxO3JldHVybiBoPDAmJihvPS1oLGg9MCksYT1hLnNsaWNlKDAsaCksIXImJmY9PWEubGVuZ3RoJiYhbyYmIXUmJiFsPyIiOihiPSEwLGEmJiFvJiYhdSYmIWYmJiFsfHxFP3Qub25UZXh0SW5wdXQoYSk6dC5vblRleHRJbnB1dChhLHtleHRlbmRMZWZ0Om8sZXh0ZW5kUmlnaHQ6dSxyZXN0b3JlU3RhcnQ6ZixyZXN0b3JlRW5kOmx9KSxiPSExLHg9ZSxUPWksTj1zLGEpfSxQPWZ1bmN0aW9uKGUpe2lmKHkpcmV0dXJuIFIoKTtpZihlJiZlLmlucHV0VHlwZSl7aWYoZS5pbnB1dFR5cGU9PSJoaXN0b3J5VW5kbyIpcmV0dXJuIHQuZXhlY0NvbW1hbmQoInVuZG8iKTtpZihlLmlucHV0VHlwZT09Imhpc3RvcnlSZWRvIilyZXR1cm4gdC5leGVjQ29tbWFuZCgicmVkbyIpfXZhciByPW4udmFsdWUsaT1EKHIsITApOyhyLmxlbmd0aD5jKzEwMHx8di50ZXN0KGkpKSYmTCgpfSxIPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmNsaXBib2FyZERhdGF8fHdpbmRvdy5jbGlwYm9hcmREYXRhO2lmKCFyfHxhKXJldHVybjt2YXIgaT1mfHxuPyJUZXh0IjoidGV4dC9wbGFpbiI7dHJ5e3JldHVybiB0P3Iuc2V0RGF0YShpLHQpIT09ITE6ci5nZXREYXRhKGkpfWNhdGNoKGUpe2lmKCFuKXJldHVybiBIKGUsdCwhMCl9fSxCPWZ1bmN0aW9uKGUsaSl7dmFyIHM9dC5nZXRDb3B5VGV4dCgpO2lmKCFzKXJldHVybiByLnByZXZlbnREZWZhdWx0KGUpO0goZSxzKT8oZCYmKEwocyksbT1zLHNldFRpbWVvdXQoZnVuY3Rpb24oKXttPSExfSwxMCkpLGk/dC5vbkN1dCgpOnQub25Db3B5KCksci5wcmV2ZW50RGVmYXVsdChlKSk6KG09ITAsbi52YWx1ZT1zLG4uc2VsZWN0KCksc2V0VGltZW91dChmdW5jdGlvbigpe209ITEsTCgpLGk/dC5vbkN1dCgpOnQub25Db3B5KCl9KSl9LGo9ZnVuY3Rpb24oZSl7QihlLCEwKX0sRj1mdW5jdGlvbihlKXtCKGUsITEpfSxJPWZ1bmN0aW9uKGUpe3ZhciBzPUgoZSk7aWYodS5wYXN0ZUNhbmNlbGxlZCgpKXJldHVybjt0eXBlb2Ygcz09InN0cmluZyI/KHMmJnQub25QYXN0ZShzLGUpLGkuaXNJRSYmc2V0VGltZW91dChMKSxyLnByZXZlbnREZWZhdWx0KGUpKToobi52YWx1ZT0iIixnPSEwKX07ci5hZGRDb21tYW5kS2V5TGlzdGVuZXIobix0Lm9uQ29tbWFuZEtleS5iaW5kKHQpKSxyLmFkZExpc3RlbmVyKG4sInNlbGVjdCIsTyksci5hZGRMaXN0ZW5lcihuLCJpbnB1dCIsUCksci5hZGRMaXN0ZW5lcihuLCJjdXQiLGopLHIuYWRkTGlzdGVuZXIobiwiY29weSIsRiksci5hZGRMaXN0ZW5lcihuLCJwYXN0ZSIsSSksKCEoIm9uY3V0ImluIG4pfHwhKCJvbmNvcHkiaW4gbil8fCEoIm9ucGFzdGUiaW4gbikpJiZyLmFkZExpc3RlbmVyKGUsImtleWRvd24iLGZ1bmN0aW9uKGUpe2lmKGkuaXNNYWMmJiFlLm1ldGFLZXl8fCFlLmN0cmxLZXkpcmV0dXJuO3N3aXRjaChlLmtleUNvZGUpe2Nhc2UgNjc6RihlKTticmVhaztjYXNlIDg2OkkoZSk7YnJlYWs7Y2FzZSA4ODpqKGUpfX0pO3ZhciBxPWZ1bmN0aW9uKGUpe2lmKHl8fCF0Lm9uQ29tcG9zaXRpb25TdGFydHx8dC4kcmVhZE9ubHkpcmV0dXJuO3k9e307aWYoRSlyZXR1cm47c2V0VGltZW91dChSLDApLHQub24oIm1vdXNlZG93biIseik7dmFyIHI9dC5nZXRTZWxlY3Rpb25SYW5nZSgpO3IuZW5kLnJvdz1yLnN0YXJ0LnJvdyxyLmVuZC5jb2x1bW49ci5zdGFydC5jb2x1bW4seS5tYXJrZXJSYW5nZT1yLHkuc2VsZWN0aW9uU3RhcnQ9VCx0Lm9uQ29tcG9zaXRpb25TdGFydCh5KSx5LnVzZVRleHRhcmVhRm9ySU1FPyhuLnZhbHVlPSIiLHg9IiIsVD0wLE49MCk6KG4ubXNHZXRJbnB1dENvbnRleHQmJih5LmNvbnRleHQ9bi5tc0dldElucHV0Q29udGV4dCgpKSxuLmdldElucHV0Q29udGV4dCYmKHkuY29udGV4dD1uLmdldElucHV0Q29udGV4dCgpKSl9LFI9ZnVuY3Rpb24oKXtpZigheXx8IXQub25Db21wb3NpdGlvblVwZGF0ZXx8dC4kcmVhZE9ubHkpcmV0dXJuO2lmKEUpcmV0dXJuIHooKTtpZih5LnVzZVRleHRhcmVhRm9ySU1FKXQub25Db21wb3NpdGlvblVwZGF0ZShuLnZhbHVlKTtlbHNle3ZhciBlPW4udmFsdWU7RChlKSx5Lm1hcmtlclJhbmdlJiYoeS5jb250ZXh0JiYoeS5tYXJrZXJSYW5nZS5zdGFydC5jb2x1bW49eS5zZWxlY3Rpb25TdGFydD15LmNvbnRleHQuY29tcG9zaXRpb25TdGFydE9mZnNldCkseS5tYXJrZXJSYW5nZS5lbmQuY29sdW1uPXkubWFya2VyUmFuZ2Uuc3RhcnQuY29sdW1uK04teS5zZWxlY3Rpb25TdGFydCl9fSxVPWZ1bmN0aW9uKGUpe2lmKCF0Lm9uQ29tcG9zaXRpb25FbmR8fHQuJHJlYWRPbmx5KXJldHVybjt5PSExLHQub25Db21wb3NpdGlvbkVuZCgpLHQub2ZmKCJtb3VzZWRvd24iLHopLGUmJlAoKX0sVz1vLmRlbGF5ZWRDYWxsKFIsNTApLnNjaGVkdWxlLmJpbmQobnVsbCxudWxsKTtyLmFkZExpc3RlbmVyKG4sImNvbXBvc2l0aW9uc3RhcnQiLHEpLHIuYWRkTGlzdGVuZXIobiwiY29tcG9zaXRpb251cGRhdGUiLFIpLHIuYWRkTGlzdGVuZXIobiwia2V5dXAiLFgpLHIuYWRkTGlzdGVuZXIobiwia2V5ZG93biIsVyksci5hZGRMaXN0ZW5lcihuLCJjb21wb3NpdGlvbmVuZCIsVSksdGhpcy5nZXRFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG59LHRoaXMuc2V0Q29tbWFuZE1vZGU9ZnVuY3Rpb24oZSl7RT1lLG4ucmVhZE9ubHk9ITF9LHRoaXMuc2V0UmVhZE9ubHk9ZnVuY3Rpb24oZSl7RXx8KG4ucmVhZE9ubHk9ZSl9LHRoaXMuc2V0Q29weVdpdGhFbXB0eVNlbGVjdGlvbj1mdW5jdGlvbihlKXt9LHRoaXMub25Db250ZXh0TWVudT1mdW5jdGlvbihlKXtfPSEwLEwoKSx0Ll9lbWl0KCJuYXRpdmVjb250ZXh0bWVudSIse3RhcmdldDp0LGRvbUV2ZW50OmV9KSx0aGlzLm1vdmVUb01vdXNlKGUsITApfSx0aGlzLm1vdmVUb01vdXNlPWZ1bmN0aW9uKGUsbyl7d3x8KHc9bi5zdHlsZS5jc3NUZXh0KSxuLnN0eWxlLmNzc1RleHQ9KG8/InotaW5kZXg6MTAwMDAwOyI6IiIpKyhpLmlzSUU/Im9wYWNpdHk6MC4xOyI6IiIpKyJ0ZXh0LWluZGVudDogLSIrKFQrTikqdC5yZW5kZXJlci5jaGFyYWN0ZXJXaWR0aCouNSsicHg7Ijt2YXIgdT10LmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPXMuY29tcHV0ZWRTdHlsZSh0LmNvbnRhaW5lciksZj11LnRvcCsocGFyc2VJbnQoYS5ib3JkZXJUb3BXaWR0aCl8fDApLGw9dS5sZWZ0KyhwYXJzZUludCh1LmJvcmRlckxlZnRXaWR0aCl8fDApLGM9dS5ib3R0b20tZi1uLmNsaWVudEhlaWdodC0yLGg9ZnVuY3Rpb24oZSl7cy50cmFuc2xhdGUobixlLmNsaWVudFgtbC0yLE1hdGgubWluKGUuY2xpZW50WS1mLTIsYykpfTtoKGUpO2lmKGUudHlwZSE9Im1vdXNlZG93biIpcmV0dXJuO3QucmVuZGVyZXIuJGlzTW91c2VQcmVzc2VkPSEwLGNsZWFyVGltZW91dChWKSxpLmlzV2luJiZyLmNhcHR1cmUodC5jb250YWluZXIsaCwkKX0sdGhpcy5vbkNvbnRleHRNZW51Q2xvc2U9JDt2YXIgVixKPWZ1bmN0aW9uKGUpe3QudGV4dElucHV0Lm9uQ29udGV4dE1lbnUoZSksJCgpfTtyLmFkZExpc3RlbmVyKG4sIm1vdXNldXAiLEopLHIuYWRkTGlzdGVuZXIobiwibW91c2Vkb3duIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksJCgpfSksci5hZGRMaXN0ZW5lcih0LnJlbmRlcmVyLnNjcm9sbGVyLCJjb250ZXh0bWVudSIsSiksci5hZGRMaXN0ZW5lcihuLCJjb250ZXh0bWVudSIsSiksZCYmSyhlLHQsbil9O3QuVGV4dElucHV0PW19KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvZGVmYXVsdF9oYW5kbGVycyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUpe2UuJGNsaWNrU2VsZWN0aW9uPW51bGw7dmFyIHQ9ZS5lZGl0b3I7dC5zZXREZWZhdWx0SGFuZGxlcigibW91c2Vkb3duIix0aGlzLm9uTW91c2VEb3duLmJpbmQoZSkpLHQuc2V0RGVmYXVsdEhhbmRsZXIoImRibGNsaWNrIix0aGlzLm9uRG91YmxlQ2xpY2suYmluZChlKSksdC5zZXREZWZhdWx0SGFuZGxlcigidHJpcGxlY2xpY2siLHRoaXMub25UcmlwbGVDbGljay5iaW5kKGUpKSx0LnNldERlZmF1bHRIYW5kbGVyKCJxdWFkY2xpY2siLHRoaXMub25RdWFkQ2xpY2suYmluZChlKSksdC5zZXREZWZhdWx0SGFuZGxlcigibW91c2V3aGVlbCIsdGhpcy5vbk1vdXNlV2hlZWwuYmluZChlKSk7dmFyIG49WyJzZWxlY3QiLCJzdGFydFNlbGVjdCIsInNlbGVjdEVuZCIsInNlbGVjdEFsbEVuZCIsInNlbGVjdEJ5V29yZHNFbmQiLCJzZWxlY3RCeUxpbmVzRW5kIiwiZHJhZ1dhaXQiLCJkcmFnV2FpdEVuZCIsImZvY3VzV2FpdCJdO24uZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPXRoaXNbdF19LHRoaXMpLGUuc2VsZWN0QnlMaW5lcz10aGlzLmV4dGVuZFNlbGVjdGlvbkJ5LmJpbmQoZSwiZ2V0TGluZVJhbmdlIiksZS5zZWxlY3RCeVdvcmRzPXRoaXMuZXh0ZW5kU2VsZWN0aW9uQnkuYmluZChlLCJnZXRXb3JkUmFuZ2UiKX1mdW5jdGlvbiB1KGUsdCxuLHIpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cobi1lLDIpK01hdGgucG93KHItdCwyKSl9ZnVuY3Rpb24gYShlLHQpe2lmKGUuc3RhcnQucm93PT1lLmVuZC5yb3cpdmFyIG49Mip0LmNvbHVtbi1lLnN0YXJ0LmNvbHVtbi1lLmVuZC5jb2x1bW47ZWxzZSBpZihlLnN0YXJ0LnJvdz09ZS5lbmQucm93LTEmJiFlLnN0YXJ0LmNvbHVtbiYmIWUuZW5kLmNvbHVtbil2YXIgbj10LmNvbHVtbi00O2Vsc2UgdmFyIG49Mip0LnJvdy1lLnN0YXJ0LnJvdy1lLmVuZC5yb3c7cmV0dXJuIG48MD97Y3Vyc29yOmUuc3RhcnQsYW5jaG9yOmUuZW5kfTp7Y3Vyc29yOmUuZW5kLGFuY2hvcjplLnN0YXJ0fX12YXIgcj1lKCIuLi9saWIvdXNlcmFnZW50IiksaT0wLHM9NTUwOyhmdW5jdGlvbigpe3RoaXMub25Nb3VzZURvd249ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pblNlbGVjdGlvbigpLG49ZS5nZXREb2N1bWVudFBvc2l0aW9uKCk7dGhpcy5tb3VzZWRvd25FdmVudD1lO3ZhciBpPXRoaXMuZWRpdG9yLHM9ZS5nZXRCdXR0b24oKTtpZihzIT09MCl7dmFyIG89aS5nZXRTZWxlY3Rpb25SYW5nZSgpLHU9by5pc0VtcHR5KCk7KHV8fHM9PTEpJiZpLnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihuKSxzPT0yJiYoaS50ZXh0SW5wdXQub25Db250ZXh0TWVudShlLmRvbUV2ZW50KSxyLmlzTW96aWxsYXx8ZS5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm59dGhpcy5tb3VzZWRvd25FdmVudC50aW1lPURhdGUubm93KCk7aWYodCYmIWkuaXNGb2N1c2VkKCkpe2kuZm9jdXMoKTtpZih0aGlzLiRmb2N1c1RpbWVvdXQmJiF0aGlzLiRjbGlja1NlbGVjdGlvbiYmIWkuaW5NdWx0aVNlbGVjdE1vZGUpe3RoaXMuc2V0U3RhdGUoImZvY3VzV2FpdCIpLHRoaXMuY2FwdHVyZU1vdXNlKGUpO3JldHVybn19cmV0dXJuIHRoaXMuY2FwdHVyZU1vdXNlKGUpLHRoaXMuc3RhcnRTZWxlY3QobixlLmRvbUV2ZW50Ll9jbGlja3M+MSksZS5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLnN0YXJ0U2VsZWN0PWZ1bmN0aW9uKGUsdCl7ZT1lfHx0aGlzLmVkaXRvci5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyh0aGlzLngsdGhpcy55KTt2YXIgbj10aGlzLmVkaXRvcjtpZighdGhpcy5tb3VzZWRvd25FdmVudClyZXR1cm47dGhpcy5tb3VzZWRvd25FdmVudC5nZXRTaGlmdEtleSgpP24uc2VsZWN0aW9uLnNlbGVjdFRvUG9zaXRpb24oZSk6dHx8bi5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24oZSksdHx8dGhpcy5zZWxlY3QoKSxuLnJlbmRlcmVyLnNjcm9sbGVyLnNldENhcHR1cmUmJm4ucmVuZGVyZXIuc2Nyb2xsZXIuc2V0Q2FwdHVyZSgpLG4uc2V0U3R5bGUoImFjZV9zZWxlY3RpbmciKSx0aGlzLnNldFN0YXRlKCJzZWxlY3QiKX0sdGhpcy5zZWxlY3Q9ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMuZWRpdG9yLG49dC5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyh0aGlzLngsdGhpcy55KTtpZih0aGlzLiRjbGlja1NlbGVjdGlvbil7dmFyIHI9dGhpcy4kY2xpY2tTZWxlY3Rpb24uY29tcGFyZVBvaW50KG4pO2lmKHI9PS0xKWU9dGhpcy4kY2xpY2tTZWxlY3Rpb24uZW5kO2Vsc2UgaWYocj09MSllPXRoaXMuJGNsaWNrU2VsZWN0aW9uLnN0YXJ0O2Vsc2V7dmFyIGk9YSh0aGlzLiRjbGlja1NlbGVjdGlvbixuKTtuPWkuY3Vyc29yLGU9aS5hbmNob3J9dC5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uQW5jaG9yKGUucm93LGUuY29sdW1uKX10LnNlbGVjdGlvbi5zZWxlY3RUb1Bvc2l0aW9uKG4pLHQucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKX0sdGhpcy5leHRlbmRTZWxlY3Rpb25CeT1mdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMuZWRpdG9yLHI9bi5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyh0aGlzLngsdGhpcy55KSxpPW4uc2VsZWN0aW9uW2VdKHIucm93LHIuY29sdW1uKTtpZih0aGlzLiRjbGlja1NlbGVjdGlvbil7dmFyIHM9dGhpcy4kY2xpY2tTZWxlY3Rpb24uY29tcGFyZVBvaW50KGkuc3RhcnQpLG89dGhpcy4kY2xpY2tTZWxlY3Rpb24uY29tcGFyZVBvaW50KGkuZW5kKTtpZihzPT0tMSYmbzw9MCl7dD10aGlzLiRjbGlja1NlbGVjdGlvbi5lbmQ7aWYoaS5lbmQucm93IT1yLnJvd3x8aS5lbmQuY29sdW1uIT1yLmNvbHVtbilyPWkuc3RhcnR9ZWxzZSBpZihvPT0xJiZzPj0wKXt0PXRoaXMuJGNsaWNrU2VsZWN0aW9uLnN0YXJ0O2lmKGkuc3RhcnQucm93IT1yLnJvd3x8aS5zdGFydC5jb2x1bW4hPXIuY29sdW1uKXI9aS5lbmR9ZWxzZSBpZihzPT0tMSYmbz09MSlyPWkuZW5kLHQ9aS5zdGFydDtlbHNle3ZhciB1PWEodGhpcy4kY2xpY2tTZWxlY3Rpb24scik7cj11LmN1cnNvcix0PXUuYW5jaG9yfW4uc2VsZWN0aW9uLnNldFNlbGVjdGlvbkFuY2hvcih0LnJvdyx0LmNvbHVtbil9bi5zZWxlY3Rpb24uc2VsZWN0VG9Qb3NpdGlvbihyKSxuLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCl9LHRoaXMuc2VsZWN0RW5kPXRoaXMuc2VsZWN0QWxsRW5kPXRoaXMuc2VsZWN0QnlXb3Jkc0VuZD10aGlzLnNlbGVjdEJ5TGluZXNFbmQ9ZnVuY3Rpb24oKXt0aGlzLiRjbGlja1NlbGVjdGlvbj1udWxsLHRoaXMuZWRpdG9yLnVuc2V0U3R5bGUoImFjZV9zZWxlY3RpbmciKSx0aGlzLmVkaXRvci5yZW5kZXJlci5zY3JvbGxlci5yZWxlYXNlQ2FwdHVyZSYmdGhpcy5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsZXIucmVsZWFzZUNhcHR1cmUoKX0sdGhpcy5mb2N1c1dhaXQ9ZnVuY3Rpb24oKXt2YXIgZT11KHRoaXMubW91c2Vkb3duRXZlbnQueCx0aGlzLm1vdXNlZG93bkV2ZW50LnksdGhpcy54LHRoaXMueSksdD1EYXRlLm5vdygpOyhlPml8fHQtdGhpcy5tb3VzZWRvd25FdmVudC50aW1lPnRoaXMuJGZvY3VzVGltZW91dCkmJnRoaXMuc3RhcnRTZWxlY3QodGhpcy5tb3VzZWRvd25FdmVudC5nZXREb2N1bWVudFBvc2l0aW9uKCkpfSx0aGlzLm9uRG91YmxlQ2xpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXREb2N1bWVudFBvc2l0aW9uKCksbj10aGlzLmVkaXRvcixyPW4uc2Vzc2lvbixpPXIuZ2V0QnJhY2tldFJhbmdlKHQpO2k/KGkuaXNFbXB0eSgpJiYoaS5zdGFydC5jb2x1bW4tLSxpLmVuZC5jb2x1bW4rKyksdGhpcy5zZXRTdGF0ZSgic2VsZWN0IikpOihpPW4uc2VsZWN0aW9uLmdldFdvcmRSYW5nZSh0LnJvdyx0LmNvbHVtbiksdGhpcy5zZXRTdGF0ZSgic2VsZWN0QnlXb3JkcyIpKSx0aGlzLiRjbGlja1NlbGVjdGlvbj1pLHRoaXMuc2VsZWN0KCl9LHRoaXMub25UcmlwbGVDbGljaz1mdW5jdGlvbihlKXt2YXIgdD1lLmdldERvY3VtZW50UG9zaXRpb24oKSxuPXRoaXMuZWRpdG9yO3RoaXMuc2V0U3RhdGUoInNlbGVjdEJ5TGluZXMiKTt2YXIgcj1uLmdldFNlbGVjdGlvblJhbmdlKCk7ci5pc011bHRpTGluZSgpJiZyLmNvbnRhaW5zKHQucm93LHQuY29sdW1uKT8odGhpcy4kY2xpY2tTZWxlY3Rpb249bi5zZWxlY3Rpb24uZ2V0TGluZVJhbmdlKHIuc3RhcnQucm93KSx0aGlzLiRjbGlja1NlbGVjdGlvbi5lbmQ9bi5zZWxlY3Rpb24uZ2V0TGluZVJhbmdlKHIuZW5kLnJvdykuZW5kKTp0aGlzLiRjbGlja1NlbGVjdGlvbj1uLnNlbGVjdGlvbi5nZXRMaW5lUmFuZ2UodC5yb3cpLHRoaXMuc2VsZWN0KCl9LHRoaXMub25RdWFkQ2xpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5lZGl0b3I7dC5zZWxlY3RBbGwoKSx0aGlzLiRjbGlja1NlbGVjdGlvbj10LmdldFNlbGVjdGlvblJhbmdlKCksdGhpcy5zZXRTdGF0ZSgic2VsZWN0QWxsIil9LHRoaXMub25Nb3VzZVdoZWVsPWZ1bmN0aW9uKGUpe2lmKGUuZ2V0QWNjZWxLZXkoKSlyZXR1cm47ZS5nZXRTaGlmdEtleSgpJiZlLndoZWVsWSYmIWUud2hlZWxYJiYoZS53aGVlbFg9ZS53aGVlbFksZS53aGVlbFk9MCk7dmFyIHQ9dGhpcy5lZGl0b3I7dGhpcy4kbGFzdFNjcm9sbHx8KHRoaXMuJGxhc3RTY3JvbGw9e3Q6MCx2eDowLHZ5OjAsYWxsb3dlZDowfSk7dmFyIG49dGhpcy4kbGFzdFNjcm9sbCxyPWUuZG9tRXZlbnQudGltZVN0YW1wLGk9ci1uLnQsbz1pP2Uud2hlZWxYL2k6bi52eCx1PWk/ZS53aGVlbFkvaTpuLnZ5O2k8cyYmKG89KG8rbi52eCkvMix1PSh1K24udnkpLzIpO3ZhciBhPU1hdGguYWJzKG8vdSksZj0hMTthPj0xJiZ0LnJlbmRlcmVyLmlzU2Nyb2xsYWJsZUJ5KGUud2hlZWxYKmUuc3BlZWQsMCkmJihmPSEwKSxhPD0xJiZ0LnJlbmRlcmVyLmlzU2Nyb2xsYWJsZUJ5KDAsZS53aGVlbFkqZS5zcGVlZCkmJihmPSEwKTtpZihmKW4uYWxsb3dlZD1yO2Vsc2UgaWYoci1uLmFsbG93ZWQ8cyl7dmFyIGw9TWF0aC5hYnMobyk8PTEuNSpNYXRoLmFicyhuLnZ4KSYmTWF0aC5hYnModSk8PTEuNSpNYXRoLmFicyhuLnZ5KTtsPyhmPSEwLG4uYWxsb3dlZD1yKTpuLmFsbG93ZWQ9MH1uLnQ9cixuLnZ4PW8sbi52eT11O2lmKGYpcmV0dXJuIHQucmVuZGVyZXIuc2Nyb2xsQnkoZS53aGVlbFgqZS5zcGVlZCxlLndoZWVsWSplLnNwZWVkKSxlLnN0b3AoKX19KS5jYWxsKG8ucHJvdG90eXBlKSx0LkRlZmF1bHRIYW5kbGVycz1vfSksYWNlLmRlZmluZSgiYWNlL3Rvb2x0aXAiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBzKGUpe3RoaXMuaXNPcGVuPSExLHRoaXMuJGVsZW1lbnQ9bnVsbCx0aGlzLiRwYXJlbnROb2RlPWV9dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9kb20iKTsoZnVuY3Rpb24oKXt0aGlzLiRpbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGVsZW1lbnQ9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRlbGVtZW50LmNsYXNzTmFtZT0iYWNlX3Rvb2x0aXAiLHRoaXMuJGVsZW1lbnQuc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy4kcGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLiRlbGVtZW50KSx0aGlzLiRlbGVtZW50fSx0aGlzLmdldEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZWxlbWVudHx8dGhpcy4kaW5pdCgpfSx0aGlzLnNldFRleHQ9ZnVuY3Rpb24oZSl7dGhpcy5nZXRFbGVtZW50KCkudGV4dENvbnRlbnQ9ZX0sdGhpcy5zZXRIdG1sPWZ1bmN0aW9uKGUpe3RoaXMuZ2V0RWxlbWVudCgpLmlubmVySFRNTD1lfSx0aGlzLnNldFBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy5nZXRFbGVtZW50KCkuc3R5bGUubGVmdD1lKyJweCIsdGhpcy5nZXRFbGVtZW50KCkuc3R5bGUudG9wPXQrInB4In0sdGhpcy5zZXRDbGFzc05hbWU9ZnVuY3Rpb24oZSl7aS5hZGRDc3NDbGFzcyh0aGlzLmdldEVsZW1lbnQoKSxlKX0sdGhpcy5zaG93PWZ1bmN0aW9uKGUsdCxuKXtlIT1udWxsJiZ0aGlzLnNldFRleHQoZSksdCE9bnVsbCYmbiE9bnVsbCYmdGhpcy5zZXRQb3NpdGlvbih0LG4pLHRoaXMuaXNPcGVufHwodGhpcy5nZXRFbGVtZW50KCkuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuaXNPcGVuPSEwKX0sdGhpcy5oaWRlPWZ1bmN0aW9uKCl7dGhpcy5pc09wZW4mJih0aGlzLmdldEVsZW1lbnQoKS5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLmlzT3Blbj0hMSl9LHRoaXMuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RWxlbWVudCgpLm9mZnNldEhlaWdodH0sdGhpcy5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEVsZW1lbnQoKS5vZmZzZXRXaWR0aH0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5pc09wZW49ITEsdGhpcy4kZWxlbWVudCYmdGhpcy4kZWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWxlbWVudCl9fSkuY2FsbChzLnByb3RvdHlwZSksdC5Ub29sdGlwPXN9KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvZGVmYXVsdF9ndXR0ZXJfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2V2ZW50IiwiYWNlL3Rvb2x0aXAiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHUoZSl7ZnVuY3Rpb24gbCgpe3ZhciByPXUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLnJvdyxzPW4uJGFubm90YXRpb25zW3JdO2lmKCFzKXJldHVybiBjKCk7dmFyIG89dC5zZXNzaW9uLmdldExlbmd0aCgpO2lmKHI9PW8pe3ZhciBhPXQucmVuZGVyZXIucGl4ZWxUb1NjcmVlbkNvb3JkaW5hdGVzKDAsdS55KS5yb3csbD11LiRwb3M7aWYoYT50LnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblJvdyhsLnJvdyxsLmNvbHVtbikpcmV0dXJuIGMoKX1pZihmPT1zKXJldHVybjtmPXMudGV4dC5qb2luKCI8YnIvPiIpLGkuc2V0SHRtbChmKSxpLnNob3coKSx0Ll9zaWduYWwoInNob3dHdXR0ZXJUb29sdGlwIixpKSx0Lm9uKCJtb3VzZXdoZWVsIixjKTtpZihlLiR0b29sdGlwRm9sbG93c01vdXNlKWgodSk7ZWxzZXt2YXIgcD11LmRvbUV2ZW50LnRhcmdldCxkPXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdj1pLmdldEVsZW1lbnQoKS5zdHlsZTt2LmxlZnQ9ZC5yaWdodCsicHgiLHYudG9wPWQuYm90dG9tKyJweCJ9fWZ1bmN0aW9uIGMoKXtvJiYobz1jbGVhclRpbWVvdXQobykpLGYmJihpLmhpZGUoKSxmPW51bGwsdC5fc2lnbmFsKCJoaWRlR3V0dGVyVG9vbHRpcCIsaSksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXdoZWVsIixjKSl9ZnVuY3Rpb24gaChlKXtpLnNldFBvc2l0aW9uKGUueCxlLnkpfXZhciB0PWUuZWRpdG9yLG49dC5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIsaT1uZXcgYSh0LmNvbnRhaW5lcik7ZS5lZGl0b3Iuc2V0RGVmYXVsdEhhbmRsZXIoImd1dHRlcm1vdXNlZG93biIsZnVuY3Rpb24ocil7aWYoIXQuaXNGb2N1c2VkKCl8fHIuZ2V0QnV0dG9uKCkhPTApcmV0dXJuO3ZhciBpPW4uZ2V0UmVnaW9uKHIpO2lmKGk9PSJmb2xkV2lkZ2V0cyIpcmV0dXJuO3ZhciBzPXIuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLnJvdyxvPXQuc2Vzc2lvbi5zZWxlY3Rpb247aWYoci5nZXRTaGlmdEtleSgpKW8uc2VsZWN0VG8ocywwKTtlbHNle2lmKHIuZG9tRXZlbnQuZGV0YWlsPT0yKXJldHVybiB0LnNlbGVjdEFsbCgpLHIucHJldmVudERlZmF1bHQoKTtlLiRjbGlja1NlbGVjdGlvbj10LnNlbGVjdGlvbi5nZXRMaW5lUmFuZ2Uocyl9cmV0dXJuIGUuc2V0U3RhdGUoInNlbGVjdEJ5TGluZXMiKSxlLmNhcHR1cmVNb3VzZShyKSxyLnByZXZlbnREZWZhdWx0KCl9KTt2YXIgbyx1LGY7ZS5lZGl0b3Iuc2V0RGVmYXVsdEhhbmRsZXIoImd1dHRlcm1vdXNlbW92ZSIsZnVuY3Rpb24odCl7dmFyIG49dC5kb21FdmVudC50YXJnZXR8fHQuZG9tRXZlbnQuc3JjRWxlbWVudDtpZihyLmhhc0Nzc0NsYXNzKG4sImFjZV9mb2xkLXdpZGdldCIpKXJldHVybiBjKCk7ZiYmZS4kdG9vbHRpcEZvbGxvd3NNb3VzZSYmaCh0KSx1PXQ7aWYobylyZXR1cm47bz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bz1udWxsLHUmJiFlLmlzTW91c2VQcmVzc2VkP2woKTpjKCl9LDUwKX0pLHMuYWRkTGlzdGVuZXIodC5yZW5kZXJlci4kZ3V0dGVyLCJtb3VzZW91dCIsZnVuY3Rpb24oZSl7dT1udWxsO2lmKCFmfHxvKXJldHVybjtvPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtvPW51bGwsYygpfSw1MCl9KSx0Lm9uKCJjaGFuZ2VTZXNzaW9uIixjKX1mdW5jdGlvbiBhKGUpe28uY2FsbCh0aGlzLGUpfXZhciByPWUoIi4uL2xpYi9kb20iKSxpPWUoIi4uL2xpYi9vb3AiKSxzPWUoIi4uL2xpYi9ldmVudCIpLG89ZSgiLi4vdG9vbHRpcCIpLlRvb2x0aXA7aS5pbmhlcml0cyhhLG8pLGZ1bmN0aW9uKCl7dGhpcy5zZXRQb3NpdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPXdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgscj13aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsaT10aGlzLmdldFdpZHRoKCkscz10aGlzLmdldEhlaWdodCgpO2UrPTE1LHQrPTE1LGUraT5uJiYoZS09ZStpLW4pLHQrcz5yJiYodC09MjArcyksby5wcm90b3R5cGUuc2V0UG9zaXRpb24uY2FsbCh0aGlzLGUsdCl9fS5jYWxsKGEucHJvdG90eXBlKSx0Lkd1dHRlckhhbmRsZXI9dX0pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9tb3VzZV9ldmVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2V2ZW50IiksaT1lKCIuLi9saWIvdXNlcmFnZW50Iikscz10Lk1vdXNlRXZlbnQ9ZnVuY3Rpb24oZSx0KXt0aGlzLmRvbUV2ZW50PWUsdGhpcy5lZGl0b3I9dCx0aGlzLng9dGhpcy5jbGllbnRYPWUuY2xpZW50WCx0aGlzLnk9dGhpcy5jbGllbnRZPWUuY2xpZW50WSx0aGlzLiRwb3M9bnVsbCx0aGlzLiRpblNlbGVjdGlvbj1udWxsLHRoaXMucHJvcGFnYXRpb25TdG9wcGVkPSExLHRoaXMuZGVmYXVsdFByZXZlbnRlZD0hMX07KGZ1bmN0aW9uKCl7dGhpcy5zdG9wUHJvcGFnYXRpb249ZnVuY3Rpb24oKXtyLnN0b3BQcm9wYWdhdGlvbih0aGlzLmRvbUV2ZW50KSx0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZD0hMH0sdGhpcy5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe3IucHJldmVudERlZmF1bHQodGhpcy5kb21FdmVudCksdGhpcy5kZWZhdWx0UHJldmVudGVkPSEwfSx0aGlzLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMucHJldmVudERlZmF1bHQoKX0sdGhpcy5nZXREb2N1bWVudFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHBvcz90aGlzLiRwb3M6KHRoaXMuJHBvcz10aGlzLmVkaXRvci5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyh0aGlzLmNsaWVudFgsdGhpcy5jbGllbnRZKSx0aGlzLiRwb3MpfSx0aGlzLmluU2VsZWN0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy4kaW5TZWxlY3Rpb24hPT1udWxsKXJldHVybiB0aGlzLiRpblNlbGVjdGlvbjt2YXIgZT10aGlzLmVkaXRvcix0PWUuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpZih0LmlzRW1wdHkoKSl0aGlzLiRpblNlbGVjdGlvbj0hMTtlbHNle3ZhciBuPXRoaXMuZ2V0RG9jdW1lbnRQb3NpdGlvbigpO3RoaXMuJGluU2VsZWN0aW9uPXQuY29udGFpbnMobi5yb3csbi5jb2x1bW4pfXJldHVybiB0aGlzLiRpblNlbGVjdGlvbn0sdGhpcy5nZXRCdXR0b249ZnVuY3Rpb24oKXtyZXR1cm4gci5nZXRCdXR0b24odGhpcy5kb21FdmVudCl9LHRoaXMuZ2V0U2hpZnRLZXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21FdmVudC5zaGlmdEtleX0sdGhpcy5nZXRBY2NlbEtleT1pLmlzTWFjP2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tRXZlbnQubWV0YUtleX06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21FdmVudC5jdHJsS2V5fX0pLmNhbGwocy5wcm90b3R5cGUpfSksYWNlLmRlZmluZSgiYWNlL21vdXNlL2RyYWdkcm9wX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZihlKXtmdW5jdGlvbiBUKGUsbil7dmFyIHI9RGF0ZS5ub3coKSxpPSFufHxlLnJvdyE9bi5yb3cscz0hbnx8ZS5jb2x1bW4hPW4uY29sdW1uO2lmKCFTfHxpfHxzKXQubW92ZUN1cnNvclRvUG9zaXRpb24oZSksUz1yLHg9e3g6cCx5OmR9O2Vsc2V7dmFyIG89bCh4LngseC55LHAsZCk7bz5hP1M9bnVsbDpyLVM+PXUmJih0LnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCksUz1udWxsKX19ZnVuY3Rpb24gTihlLG4pe3ZhciByPURhdGUubm93KCksaT10LnJlbmRlcmVyLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQscz10LnJlbmRlcmVyLmxheWVyQ29uZmlnLmNoYXJhY3RlcldpZHRoLHU9dC5yZW5kZXJlci5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPXt4OntsZWZ0OnAtdS5sZWZ0LHJpZ2h0OnUucmlnaHQtcH0seTp7dG9wOmQtdS50b3AsYm90dG9tOnUuYm90dG9tLWR9fSxmPU1hdGgubWluKGEueC5sZWZ0LGEueC5yaWdodCksbD1NYXRoLm1pbihhLnkudG9wLGEueS5ib3R0b20pLGM9e3JvdzplLnJvdyxjb2x1bW46ZS5jb2x1bW59O2Yvczw9MiYmKGMuY29sdW1uKz1hLngubGVmdDxhLngucmlnaHQ/LTM6MiksbC9pPD0xJiYoYy5yb3crPWEueS50b3A8YS55LmJvdHRvbT8tMToxKTt2YXIgaD1lLnJvdyE9Yy5yb3csdj1lLmNvbHVtbiE9Yy5jb2x1bW4sbT0hbnx8ZS5yb3chPW4ucm93O2h8fHYmJiFtP0U/ci1FPj1vJiZ0LnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KGMpOkU9cjpFPW51bGx9ZnVuY3Rpb24gQygpe3ZhciBlPWc7Zz10LnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHAsZCksVChnLGUpLE4oZyxlKX1mdW5jdGlvbiBrKCl7bT10LnNlbGVjdGlvbi50b09yaWVudGVkUmFuZ2UoKSxoPXQuc2Vzc2lvbi5hZGRNYXJrZXIobSwiYWNlX3NlbGVjdGlvbiIsdC5nZXRTZWxlY3Rpb25TdHlsZSgpKSx0LmNsZWFyU2VsZWN0aW9uKCksdC5pc0ZvY3VzZWQoKSYmdC5yZW5kZXJlci4kY3Vyc29yTGF5ZXIuc2V0QmxpbmtpbmcoITEpLGNsZWFySW50ZXJ2YWwodiksQygpLHY9c2V0SW50ZXJ2YWwoQywyMCkseT0wLGkuYWRkTGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsTyl9ZnVuY3Rpb24gTCgpe2NsZWFySW50ZXJ2YWwodiksdC5zZXNzaW9uLnJlbW92ZU1hcmtlcihoKSxoPW51bGwsdC5zZWxlY3Rpb24uZnJvbU9yaWVudGVkUmFuZ2UobSksdC5pc0ZvY3VzZWQoKSYmIXcmJnQuJHJlc2V0Q3Vyc29yU3R5bGUoKSxtPW51bGwsZz1udWxsLHk9MCxFPW51bGwsUz1udWxsLGkucmVtb3ZlTGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsTyl9ZnVuY3Rpb24gTygpe0E9PW51bGwmJihBPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtBIT1udWxsJiZoJiZMKCl9LDIwKSl9ZnVuY3Rpb24gTShlKXt2YXIgdD1lLnR5cGVzO3JldHVybiF0fHxBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKHQsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PSJ0ZXh0L3BsYWluInx8ZT09IlRleHQifSl9ZnVuY3Rpb24gXyhlKXt2YXIgdD1bImNvcHkiLCJjb3B5bW92ZSIsImFsbCIsInVuaW5pdGlhbGl6ZWQiXSxuPVsibW92ZSIsImNvcHltb3ZlIiwibGlua21vdmUiLCJhbGwiLCJ1bmluaXRpYWxpemVkIl0scj1zLmlzTWFjP2UuYWx0S2V5OmUuY3RybEtleSxpPSJ1bmluaXRpYWxpemVkIjt0cnl7aT1lLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkLnRvTG93ZXJDYXNlKCl9Y2F0Y2goZSl7fXZhciBvPSJub25lIjtyZXR1cm4gciYmdC5pbmRleE9mKGkpPj0wP289ImNvcHkiOm4uaW5kZXhPZihpKT49MD9vPSJtb3ZlIjp0LmluZGV4T2YoaSk+PTAmJihvPSJjb3B5Iiksb312YXIgdD1lLmVkaXRvcixuPXIuY3JlYXRlRWxlbWVudCgiaW1nIik7bi5zcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBQUFBQUNINUJBRUtBQUVBTEFBQUFBQUJBQUVBQUFJQ1RBRUFPdz09IixzLmlzT3BlcmEmJihuLnN0eWxlLmNzc1RleHQ9IndpZHRoOjFweDtoZWlnaHQ6MXB4O3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt6LWluZGV4OjIxNDc0ODM2NDc7b3BhY2l0eTowOyIpO3ZhciBmPVsiZHJhZ1dhaXQiLCJkcmFnV2FpdEVuZCIsInN0YXJ0RHJhZyIsImRyYWdSZWFkeUVuZCIsIm9uTW91c2VEcmFnIl07Zi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09dGhpc1t0XX0sdGhpcyksdC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMub25Nb3VzZURvd24uYmluZChlKSk7dmFyIGM9dC5jb250YWluZXIsaCxwLGQsdixtLGcseT0wLGIsdyxFLFMseDt0aGlzLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKGUpe2lmKHRoaXMuY2FuY2VsRHJhZ3x8IWMuZHJhZ2dhYmxlKXt2YXIgcj10aGlzO3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5zdGFydFNlbGVjdCgpLHIuY2FwdHVyZU1vdXNlKGUpfSwwKSxlLnByZXZlbnREZWZhdWx0KCl9bT10LmdldFNlbGVjdGlvblJhbmdlKCk7dmFyIGk9ZS5kYXRhVHJhbnNmZXI7aS5lZmZlY3RBbGxvd2VkPXQuZ2V0UmVhZE9ubHkoKT8iY29weSI6ImNvcHlNb3ZlIixzLmlzT3BlcmEmJih0LmNvbnRhaW5lci5hcHBlbmRDaGlsZChuKSxuLnNjcm9sbFRvcD0wKSxpLnNldERyYWdJbWFnZSYmaS5zZXREcmFnSW1hZ2UobiwwLDApLHMuaXNPcGVyYSYmdC5jb250YWluZXIucmVtb3ZlQ2hpbGQobiksaS5jbGVhckRhdGEoKSxpLnNldERhdGEoIlRleHQiLHQuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UoKSksdz0hMCx0aGlzLnNldFN0YXRlKCJkcmFnIil9LHRoaXMub25EcmFnRW5kPWZ1bmN0aW9uKGUpe2MuZHJhZ2dhYmxlPSExLHc9ITEsdGhpcy5zZXRTdGF0ZShudWxsKTtpZighdC5nZXRSZWFkT25seSgpKXt2YXIgbj1lLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0OyFiJiZuPT0ibW92ZSImJnQuc2Vzc2lvbi5yZW1vdmUodC5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0LiRyZXNldEN1cnNvclN0eWxlKCl9dGhpcy5lZGl0b3IudW5zZXRTdHlsZSgiYWNlX2RyYWdnaW5nIiksdGhpcy5lZGl0b3IucmVuZGVyZXIuc2V0Q3Vyc29yU3R5bGUoIiIpfSx0aGlzLm9uRHJhZ0VudGVyPWZ1bmN0aW9uKGUpe2lmKHQuZ2V0UmVhZE9ubHkoKXx8IU0oZS5kYXRhVHJhbnNmZXIpKXJldHVybjtyZXR1cm4gcD1lLmNsaWVudFgsZD1lLmNsaWVudFksaHx8aygpLHkrKyxlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PWI9XyhlKSxpLnByZXZlbnREZWZhdWx0KGUpfSx0aGlzLm9uRHJhZ092ZXI9ZnVuY3Rpb24oZSl7aWYodC5nZXRSZWFkT25seSgpfHwhTShlLmRhdGFUcmFuc2ZlcikpcmV0dXJuO3JldHVybiBwPWUuY2xpZW50WCxkPWUuY2xpZW50WSxofHwoaygpLHkrKyksQSE9PW51bGwmJihBPW51bGwpLGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9Yj1fKGUpLGkucHJldmVudERlZmF1bHQoZSl9LHRoaXMub25EcmFnTGVhdmU9ZnVuY3Rpb24oZSl7eS0tO2lmKHk8PTAmJmgpcmV0dXJuIEwoKSxiPW51bGwsaS5wcmV2ZW50RGVmYXVsdChlKX0sdGhpcy5vbkRyb3A9ZnVuY3Rpb24oZSl7aWYoIWcpcmV0dXJuO3ZhciBuPWUuZGF0YVRyYW5zZmVyO2lmKHcpc3dpdGNoKGIpe2Nhc2UibW92ZSI6bS5jb250YWlucyhnLnJvdyxnLmNvbHVtbik/bT17c3RhcnQ6ZyxlbmQ6Z306bT10Lm1vdmVUZXh0KG0sZyk7YnJlYWs7Y2FzZSJjb3B5IjptPXQubW92ZVRleHQobSxnLCEwKX1lbHNle3ZhciByPW4uZ2V0RGF0YSgiVGV4dCIpO209e3N0YXJ0OmcsZW5kOnQuc2Vzc2lvbi5pbnNlcnQoZyxyKX0sdC5mb2N1cygpLGI9bnVsbH1yZXR1cm4gTCgpLGkucHJldmVudERlZmF1bHQoZSl9LGkuYWRkTGlzdGVuZXIoYywiZHJhZ3N0YXJ0Iix0aGlzLm9uRHJhZ1N0YXJ0LmJpbmQoZSkpLGkuYWRkTGlzdGVuZXIoYywiZHJhZ2VuZCIsdGhpcy5vbkRyYWdFbmQuYmluZChlKSksaS5hZGRMaXN0ZW5lcihjLCJkcmFnZW50ZXIiLHRoaXMub25EcmFnRW50ZXIuYmluZChlKSksaS5hZGRMaXN0ZW5lcihjLCJkcmFnb3ZlciIsdGhpcy5vbkRyYWdPdmVyLmJpbmQoZSkpLGkuYWRkTGlzdGVuZXIoYywiZHJhZ2xlYXZlIix0aGlzLm9uRHJhZ0xlYXZlLmJpbmQoZSkpLGkuYWRkTGlzdGVuZXIoYywiZHJvcCIsdGhpcy5vbkRyb3AuYmluZChlKSk7dmFyIEE9bnVsbH1mdW5jdGlvbiBsKGUsdCxuLHIpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cobi1lLDIpK01hdGgucG93KHItdCwyKSl9dmFyIHI9ZSgiLi4vbGliL2RvbSIpLGk9ZSgiLi4vbGliL2V2ZW50Iikscz1lKCIuLi9saWIvdXNlcmFnZW50Iiksbz0yMDAsdT0yMDAsYT01OyhmdW5jdGlvbigpe3RoaXMuZHJhZ1dhaXQ9ZnVuY3Rpb24oKXt2YXIgZT1EYXRlLm5vdygpLXRoaXMubW91c2Vkb3duRXZlbnQudGltZTtlPnRoaXMuZWRpdG9yLmdldERyYWdEZWxheSgpJiZ0aGlzLnN0YXJ0RHJhZygpfSx0aGlzLmRyYWdXYWl0RW5kPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lZGl0b3IuY29udGFpbmVyO2UuZHJhZ2dhYmxlPSExLHRoaXMuc3RhcnRTZWxlY3QodGhpcy5tb3VzZWRvd25FdmVudC5nZXREb2N1bWVudFBvc2l0aW9uKCkpLHRoaXMuc2VsZWN0RW5kKCl9LHRoaXMuZHJhZ1JlYWR5RW5kPWZ1bmN0aW9uKGUpe3RoaXMuZWRpdG9yLiRyZXNldEN1cnNvclN0eWxlKCksdGhpcy5lZGl0b3IudW5zZXRTdHlsZSgiYWNlX2RyYWdnaW5nIiksdGhpcy5lZGl0b3IucmVuZGVyZXIuc2V0Q3Vyc29yU3R5bGUoIiIpLHRoaXMuZHJhZ1dhaXRFbmQoKX0sdGhpcy5zdGFydERyYWc9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbERyYWc9ITE7dmFyIGU9dGhpcy5lZGl0b3IsdD1lLmNvbnRhaW5lcjt0LmRyYWdnYWJsZT0hMCxlLnJlbmRlcmVyLiRjdXJzb3JMYXllci5zZXRCbGlua2luZyghMSksZS5zZXRTdHlsZSgiYWNlX2RyYWdnaW5nIik7dmFyIG49cy5pc1dpbj8iZGVmYXVsdCI6Im1vdmUiO2UucmVuZGVyZXIuc2V0Q3Vyc29yU3R5bGUobiksdGhpcy5zZXRTdGF0ZSgiZHJhZ1JlYWR5Iil9LHRoaXMub25Nb3VzZURyYWc9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5lZGl0b3IuY29udGFpbmVyO2lmKHMuaXNJRSYmdGhpcy5zdGF0ZT09ImRyYWdSZWFkeSIpe3ZhciBuPWwodGhpcy5tb3VzZWRvd25FdmVudC54LHRoaXMubW91c2Vkb3duRXZlbnQueSx0aGlzLngsdGhpcy55KTtuPjMmJnQuZHJhZ0Ryb3AoKX1pZih0aGlzLnN0YXRlPT09ImRyYWdXYWl0Iil7dmFyIG49bCh0aGlzLm1vdXNlZG93bkV2ZW50LngsdGhpcy5tb3VzZWRvd25FdmVudC55LHRoaXMueCx0aGlzLnkpO24+MCYmKHQuZHJhZ2dhYmxlPSExLHRoaXMuc3RhcnRTZWxlY3QodGhpcy5tb3VzZWRvd25FdmVudC5nZXREb2N1bWVudFBvc2l0aW9uKCkpKX19LHRoaXMub25Nb3VzZURvd249ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJGRyYWdFbmFibGVkKXJldHVybjt0aGlzLm1vdXNlZG93bkV2ZW50PWU7dmFyIHQ9dGhpcy5lZGl0b3Isbj1lLmluU2VsZWN0aW9uKCkscj1lLmdldEJ1dHRvbigpLGk9ZS5kb21FdmVudC5kZXRhaWx8fDE7aWYoaT09PTEmJnI9PT0wJiZuKXtpZihlLmVkaXRvci5pbk11bHRpU2VsZWN0TW9kZSYmKGUuZ2V0QWNjZWxLZXkoKXx8ZS5nZXRTaGlmdEtleSgpKSlyZXR1cm47dGhpcy5tb3VzZWRvd25FdmVudC50aW1lPURhdGUubm93KCk7dmFyIG89ZS5kb21FdmVudC50YXJnZXR8fGUuZG9tRXZlbnQuc3JjRWxlbWVudDsidW5zZWxlY3RhYmxlImluIG8mJihvLnVuc2VsZWN0YWJsZT0ib24iKTtpZih0LmdldERyYWdEZWxheSgpKXtpZihzLmlzV2ViS2l0KXt0aGlzLmNhbmNlbERyYWc9ITA7dmFyIHU9dC5jb250YWluZXI7dS5kcmFnZ2FibGU9ITB9dGhpcy5zZXRTdGF0ZSgiZHJhZ1dhaXQiKX1lbHNlIHRoaXMuc3RhcnREcmFnKCk7dGhpcy5jYXB0dXJlTW91c2UoZSx0aGlzLm9uTW91c2VEcmFnLmJpbmQodGhpcykpLGUuZGVmYXVsdFByZXZlbnRlZD0hMH19fSkuY2FsbChmLnByb3RvdHlwZSksdC5EcmFnZHJvcEhhbmRsZXI9Zn0pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS90b3VjaF9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL21vdXNlL21vdXNlX2V2ZW50IiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbW91c2VfZXZlbnQiKS5Nb3VzZUV2ZW50LGk9ZSgiLi4vbGliL2RvbSIpO3QuYWRkVG91Y2hMaXN0ZW5lcnM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiB5KCl7dmFyIGU9d2luZG93Lm5hdmlnYXRvciYmd2luZG93Lm5hdmlnYXRvci5jbGlwYm9hcmQscj0hMSxzPWZ1bmN0aW9uKCl7dmFyIG49dC5nZXRDb3B5VGV4dCgpLHM9dC5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCkuaGFzVW5kbygpO2cucmVwbGFjZUNoaWxkKGkuYnVpbGREb20ocj9bInNwYW4iLCFuJiZbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJzZWxlY3RhbGwifSwiU2VsZWN0IEFsbCJdLG4mJlsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246ImNvcHkifSwiQ29weSJdLG4mJlsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246ImN1dCJ9LCJDdXQiXSxlJiZbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJwYXN0ZSJ9LCJQYXN0ZSJdLHMmJlsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246InVuZG8ifSwiVW5kbyJdLFsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246ImZpbmQifSwiRmluZCJdLFsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246Im9wZW5Db21tYW5kUGFsbGV0ZSJ9LCJQYWxsZXRlIl1dOlsic3BhbiJdKSxnLmZpcnN0Q2hpbGQpfSxvPWZ1bmN0aW9uKG4pe3ZhciBpPW4udGFyZ2V0LmdldEF0dHJpYnV0ZSgiYWN0aW9uIik7aWYoaT09Im1vcmUifHwhcilyZXR1cm4gcj0hcixzKCk7aWYoaT09InBhc3RlIillLnJlYWRUZXh0KCkudGhlbihmdW5jdGlvbihlKXt0LmV4ZWNDb21tYW5kKGksZSl9KTtlbHNlIGlmKGkpe2lmKGk9PSJjdXQifHxpPT0iY29weSIpZT9lLndyaXRlVGV4dCh0LmdldENvcHlUZXh0KCkpOmRvY3VtZW50LmV4ZWNDb21tYW5kKCJjb3B5Iik7dC5leGVjQ29tbWFuZChpKX1nLmZpcnN0Q2hpbGQuc3R5bGUuZGlzcGxheT0ibm9uZSIscj0hMSxpIT0ib3BlbkNvbW1hbmRQYWxsZXRlIiYmdC5mb2N1cygpfTtnPWkuYnVpbGREb20oWyJkaXYiLHsiY2xhc3MiOiJhY2VfbW9iaWxlLW1lbnUiLG9udG91Y2hzdGFydDpmdW5jdGlvbihlKXtuPSJtZW51IixlLnN0b3BQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKSx0LnRleHRJbnB1dC5mb2N1cygpfSxvbnRvdWNoZW5kOmZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCksZS5wcmV2ZW50RGVmYXVsdCgpLG8oZSl9LG9uY2xpY2s6b30sWyJzcGFuIl0sWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoibW9yZSJ9LCIuLi4iXV0sdC5jb250YWluZXIpfWZ1bmN0aW9uIGIoKXtnfHx5KCk7dmFyIGU9dC5zZWxlY3Rpb24uY3Vyc29yLG49dC5yZW5kZXJlci50ZXh0VG9TY3JlZW5Db29yZGluYXRlcyhlLnJvdyxlLmNvbHVtbikscj10LmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtnLnN0eWxlLnRvcD1uLnBhZ2VZLXIudG9wLTMrInB4IixnLnN0eWxlLnJpZ2h0PSIxMHB4IixnLnN0eWxlLmRpc3BsYXk9IiIsZy5maXJzdENoaWxkLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHQub24oImlucHV0Iix3KX1mdW5jdGlvbiB3KGUpe2cmJihnLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0Lm9mZigiaW5wdXQiLHcpfWZ1bmN0aW9uIEUoKXtmPW51bGwsY2xlYXJUaW1lb3V0KGYpO3ZhciBlPXQuc2VsZWN0aW9uLmdldFJhbmdlKCkscj1lLmNvbnRhaW5zKGgucm93LGguY29sdW1uKTtpZihlLmlzRW1wdHkoKXx8IXIpdC5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24oaCksdC5zZWxlY3Rpb24uc2VsZWN0V29yZCgpO249IndhaXQiLGIoKX1mdW5jdGlvbiBTKCl7Zj1udWxsLGNsZWFyVGltZW91dChmKSx0LnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihoKTt2YXIgZT1wPj0yP3Quc2VsZWN0aW9uLmdldExpbmVSYW5nZShoLnJvdyk6dC5zZXNzaW9uLmdldEJyYWNrZXRSYW5nZShoKTtlJiYhZS5pc0VtcHR5KCk/dC5zZWxlY3Rpb24uc2V0UmFuZ2UoZSk6dC5zZWxlY3Rpb24uc2VsZWN0V29yZCgpLG49IndhaXQifWZ1bmN0aW9uIHgoKXtjKz02MCxsPXNldEludGVydmFsKGZ1bmN0aW9uKCl7Yy0tPD0wJiYoY2xlYXJJbnRlcnZhbChsKSxsPW51bGwpLE1hdGguYWJzKGQpPC4wMSYmKGQ9MCksTWF0aC5hYnModik8LjAxJiYodj0wKSxjPDIwJiYoZD0uOSpkKSxjPDIwJiYodj0uOSp2KTt2YXIgZT10LnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCk7dC5yZW5kZXJlci5zY3JvbGxCeSgxMCpkLDEwKnYpLGU9PXQuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKSYmKGM9MCl9LDEwKX12YXIgbj0ic2Nyb2xsIixzLG8sdSxhLGYsbCxjPTAsaCxwPTAsZD0wLHY9MCxtLGc7ZS5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsZnVuY3Rpb24oZSl7aWYoIW0pcmV0dXJuO3ZhciBuPXQudGV4dElucHV0LmdldEVsZW1lbnQoKTtuLmZvY3VzKCl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGZ1bmN0aW9uKGUpe3ZhciBpPWUudG91Y2hlcztpZihmfHxpLmxlbmd0aD4xKXtjbGVhclRpbWVvdXQoZiksZj1udWxsLHU9LTEsbj0iem9vbSI7cmV0dXJufW09dC4kbW91c2VIYW5kbGVyLmlzTW91c2VQcmVzc2VkPSEwO3ZhciBsPXQucmVuZGVyZXIubGF5ZXJDb25maWcubGluZUhlaWdodCxnPXQucmVuZGVyZXIubGF5ZXJDb25maWcubGluZUhlaWdodCx5PWUudGltZVN0YW1wO2E9eTt2YXIgYj1pWzBdLHc9Yi5jbGllbnRYLHg9Yi5jbGllbnRZO01hdGguYWJzKHMtdykrTWF0aC5hYnMoby14KT5sJiYodT0tMSkscz1lLmNsaWVudFg9dyxvPWUuY2xpZW50WT14LGQ9dj0wO3ZhciBUPW5ldyByKGUsdCk7aD1ULmdldERvY3VtZW50UG9zaXRpb24oKTtpZih5LXU8NTAwJiZpLmxlbmd0aD09MSYmIWMpcCsrLGUucHJldmVudERlZmF1bHQoKSxlLmJ1dHRvbj0wLFMoKTtlbHNle3A9MDt2YXIgTj10LnNlbGVjdGlvbi5jdXJzb3IsQz10LnNlbGVjdGlvbi5pc0VtcHR5KCk/Tjp0LnNlbGVjdGlvbi5hbmNob3Isaz10LnJlbmRlcmVyLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKE4sITApLEw9dC5yZW5kZXJlci4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbihDLCEwKSxBPXQucmVuZGVyZXIuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksTz1mdW5jdGlvbihlLHQpe3JldHVybiBlLz1nLHQ9dC9sLS43NSxlKmUrdCp0fTtpZihlLmNsaWVudFg8QS5sZWZ0KXtuPSJ6b29tIjtyZXR1cm59dmFyIE09TyhlLmNsaWVudFgtQS5sZWZ0LWsubGVmdCxlLmNsaWVudFktQS50b3Atay50b3ApLF89TyhlLmNsaWVudFgtQS5sZWZ0LUwubGVmdCxlLmNsaWVudFktQS50b3AtTC50b3ApO008My41JiZfPDMuNSYmKG49TT5fPyJjdXJzb3IiOiJhbmNob3IiKSxfPDMuNT9uPSJhbmNob3IiOk08My41P249ImN1cnNvciI6bj0ic2Nyb2xsIixmPXNldFRpbWVvdXQoRSw0NTApfXU9eX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLGZ1bmN0aW9uKGUpe209dC4kbW91c2VIYW5kbGVyLmlzTW91c2VQcmVzc2VkPSExLGwmJmNsZWFySW50ZXJ2YWwobCksbj09Inpvb20iPyhuPSIiLGM9MCk6Zj8odC5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24oaCksYz0wLGIoKSk6bj09InNjcm9sbCI/KHgoKSxlLnByZXZlbnREZWZhdWx0KCksdygpKTpiKCksY2xlYXJUaW1lb3V0KGYpLGY9bnVsbH0pLGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixmdW5jdGlvbihlKXtmJiYoY2xlYXJUaW1lb3V0KGYpLGY9bnVsbCk7dmFyIGk9ZS50b3VjaGVzO2lmKGkubGVuZ3RoPjF8fG49PSJ6b29tIilyZXR1cm47dmFyIHU9aVswXSxsPXMtdS5jbGllbnRYLGM9by11LmNsaWVudFk7aWYobj09IndhaXQiKXtpZighKGwqbCtjKmM+NCkpcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtuPSJjdXJzb3IifXM9dS5jbGllbnRYLG89dS5jbGllbnRZLGUuY2xpZW50WD11LmNsaWVudFgsZS5jbGllbnRZPXUuY2xpZW50WTt2YXIgaD1lLnRpbWVTdGFtcCxwPWgtYTthPWg7aWYobj09InNjcm9sbCIpe3ZhciBtPW5ldyByKGUsdCk7bS5zcGVlZD0xLG0ud2hlZWxYPWwsbS53aGVlbFk9YywxMCpNYXRoLmFicyhsKTxNYXRoLmFicyhjKSYmKGw9MCksMTAqTWF0aC5hYnMoYyk8TWF0aC5hYnMobCkmJihjPTApLHAhPTAmJihkPWwvcCx2PWMvcCksdC5fZW1pdCgibW91c2V3aGVlbCIsbSksbS5wcm9wYWdhdGlvblN0b3BwZWR8fChkPXY9MCl9ZWxzZXt2YXIgZz1uZXcgcihlLHQpLHk9Zy5nZXREb2N1bWVudFBvc2l0aW9uKCk7bj09ImN1cnNvciI/dC5zZWxlY3Rpb24ubW92ZUN1cnNvclRvUG9zaXRpb24oeSk6bj09ImFuY2hvciImJnQuc2VsZWN0aW9uLnNldFNlbGVjdGlvbkFuY2hvcih5LnJvdyx5LmNvbHVtbiksdC5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyh5KSxlLnByZXZlbnREZWZhdWx0KCl9fSl9fSksYWNlLmRlZmluZSgiYWNlL2xpYi9uZXQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9kb20iKTt0LmdldD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBYTUxIdHRwUmVxdWVzdDtuLm9wZW4oIkdFVCIsZSwhMCksbi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtuLnJlYWR5U3RhdGU9PT00JiZ0KG4ucmVzcG9uc2VUZXh0KX0sbi5zZW5kKG51bGwpfSx0LmxvYWRTY3JpcHQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1yLmdldERvY3VtZW50SGVhZCgpLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aS5zcmM9ZSxuLmFwcGVuZENoaWxkKGkpLGkub25sb2FkPWkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGUsbil7aWYobnx8IWkucmVhZHlTdGF0ZXx8aS5yZWFkeVN0YXRlPT0ibG9hZGVkInx8aS5yZWFkeVN0YXRlPT0iY29tcGxldGUiKWk9aS5vbmxvYWQ9aS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxufHx0KCl9fSx0LnF1YWxpZnlVUkw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO3JldHVybiB0LmhyZWY9ZSx0LmhyZWZ9fSksYWNlLmRlZmluZSgiYWNlL2xpYi9ldmVudF9lbWl0dGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17fSxpPWZ1bmN0aW9uKCl7dGhpcy5wcm9wYWdhdGlvblN0b3BwZWQ9ITB9LHM9ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9O3IuX2VtaXQ9ci5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3RoaXMuX2V2ZW50UmVnaXN0cnl8fCh0aGlzLl9ldmVudFJlZ2lzdHJ5PXt9KSx0aGlzLl9kZWZhdWx0SGFuZGxlcnN8fCh0aGlzLl9kZWZhdWx0SGFuZGxlcnM9e30pO3ZhciBuPXRoaXMuX2V2ZW50UmVnaXN0cnlbZV18fFtdLHI9dGhpcy5fZGVmYXVsdEhhbmRsZXJzW2VdO2lmKCFuLmxlbmd0aCYmIXIpcmV0dXJuO2lmKHR5cGVvZiB0IT0ib2JqZWN0Inx8IXQpdD17fTt0LnR5cGV8fCh0LnR5cGU9ZSksdC5zdG9wUHJvcGFnYXRpb258fCh0LnN0b3BQcm9wYWdhdGlvbj1pKSx0LnByZXZlbnREZWZhdWx0fHwodC5wcmV2ZW50RGVmYXVsdD1zKSxuPW4uc2xpY2UoKTtmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rKyl7bltvXSh0LHRoaXMpO2lmKHQucHJvcGFnYXRpb25TdG9wcGVkKWJyZWFrfWlmKHImJiF0LmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuIHIodCx0aGlzKX0sci5fc2lnbmFsPWZ1bmN0aW9uKGUsdCl7dmFyIG49KHRoaXMuX2V2ZW50UmVnaXN0cnl8fHt9KVtlXTtpZighbilyZXR1cm47bj1uLnNsaWNlKCk7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspbltyXSh0LHRoaXMpfSxyLm9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uIHIoKXtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxyKSx0LmFwcGx5KG51bGwsYXJndW1lbnRzKX0pO2lmKCF0KXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXt0PWV9KX0sci5zZXREZWZhdWx0SGFuZGxlcj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2RlZmF1bHRIYW5kbGVycztufHwobj10aGlzLl9kZWZhdWx0SGFuZGxlcnM9e19kaXNhYmxlZF86e319KTtpZihuW2VdKXt2YXIgcj1uW2VdLGk9bi5fZGlzYWJsZWRfW2VdO2l8fChuLl9kaXNhYmxlZF9bZV09aT1bXSksaS5wdXNoKHIpO3ZhciBzPWkuaW5kZXhPZih0KTtzIT0tMSYmaS5zcGxpY2UocywxKX1uW2VdPXR9LHIucmVtb3ZlRGVmYXVsdEhhbmRsZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9kZWZhdWx0SGFuZGxlcnM7aWYoIW4pcmV0dXJuO3ZhciByPW4uX2Rpc2FibGVkX1tlXTtpZihuW2VdPT10KXImJnRoaXMuc2V0RGVmYXVsdEhhbmRsZXIoZSxyLnBvcCgpKTtlbHNlIGlmKHIpe3ZhciBpPXIuaW5kZXhPZih0KTtpIT0tMSYmci5zcGxpY2UoaSwxKX19LHIub249ci5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLl9ldmVudFJlZ2lzdHJ5PXRoaXMuX2V2ZW50UmVnaXN0cnl8fHt9O3ZhciByPXRoaXMuX2V2ZW50UmVnaXN0cnlbZV07cmV0dXJuIHJ8fChyPXRoaXMuX2V2ZW50UmVnaXN0cnlbZV09W10pLHIuaW5kZXhPZih0KT09LTEmJnJbbj8idW5zaGlmdCI6InB1c2giXSh0KSx0fSxyLm9mZj1yLnJlbW92ZUxpc3RlbmVyPXIucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3RoaXMuX2V2ZW50UmVnaXN0cnk9dGhpcy5fZXZlbnRSZWdpc3RyeXx8e307dmFyIG49dGhpcy5fZXZlbnRSZWdpc3RyeVtlXTtpZighbilyZXR1cm47dmFyIHI9bi5pbmRleE9mKHQpO3IhPT0tMSYmbi5zcGxpY2UociwxKX0sci5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7dGhpcy5fZXZlbnRSZWdpc3RyeSYmKHRoaXMuX2V2ZW50UmVnaXN0cnlbZV09W10pfSx0LkV2ZW50RW1pdHRlcj1yfSksYWNlLmRlZmluZSgiYWNlL2xpYi9hcHBfY29uZmlnIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7Im5vIHVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7dHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2Fybi5hcHBseShjb25zb2xlLGFyZ3VtZW50cyl9ZnVuY3Rpb24gdShlLHQpe3ZhciBuPW5ldyBFcnJvcihlKTtuLmRhdGE9dCx0eXBlb2YgY29uc29sZT09Im9iamVjdCImJmNvbnNvbGUuZXJyb3ImJmNvbnNvbGUuZXJyb3Iobiksc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IG59KX12YXIgcj1lKCIuL29vcCIpLGk9ZSgiLi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHM9e3NldE9wdGlvbnM6ZnVuY3Rpb24oZSl7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXt0aGlzLnNldE9wdGlvbih0LGVbdF0pfSx0aGlzKX0sZ2V0T3B0aW9uczpmdW5jdGlvbihlKXt2YXIgdD17fTtpZighZSl7dmFyIG49dGhpcy4kb3B0aW9ucztlPU9iamVjdC5rZXlzKG4pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hbltlXS5oaWRkZW59KX1lbHNlIEFycmF5LmlzQXJyYXkoZSl8fCh0PWUsZT1PYmplY3Qua2V5cyh0KSk7cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPXRoaXMuZ2V0T3B0aW9uKGUpfSx0aGlzKSx0fSxzZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtpZih0aGlzWyIkIitlXT09PXQpcmV0dXJuO3ZhciBuPXRoaXMuJG9wdGlvbnNbZV07aWYoIW4pcmV0dXJuIG8oJ21pc3NwZWxsZWQgb3B0aW9uICInK2UrJyInKTtpZihuLmZvcndhcmRUbylyZXR1cm4gdGhpc1tuLmZvcndhcmRUb10mJnRoaXNbbi5mb3J3YXJkVG9dLnNldE9wdGlvbihlLHQpO24uaGFuZGxlc1NldHx8KHRoaXNbIiQiK2VdPXQpLG4mJm4uc2V0JiZuLnNldC5jYWxsKHRoaXMsdCl9LGdldE9wdGlvbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLiRvcHRpb25zW2VdO3JldHVybiB0P3QuZm9yd2FyZFRvP3RoaXNbdC5mb3J3YXJkVG9dJiZ0aGlzW3QuZm9yd2FyZFRvXS5nZXRPcHRpb24oZSk6dCYmdC5nZXQ/dC5nZXQuY2FsbCh0aGlzKTp0aGlzWyIkIitlXTpvKCdtaXNzcGVsbGVkIG9wdGlvbiAiJytlKyciJyl9fSxhPWZ1bmN0aW9uKCl7dGhpcy4kZGVmYXVsdE9wdGlvbnM9e319OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMsaSksdGhpcy5kZWZpbmVPcHRpb25zPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS4kb3B0aW9uc3x8KHRoaXMuJGRlZmF1bHRPcHRpb25zW3RdPWUuJG9wdGlvbnM9e30pLE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIHI9blt0XTt0eXBlb2Ygcj09InN0cmluZyImJihyPXtmb3J3YXJkVG86cn0pLHIubmFtZXx8KHIubmFtZT10KSxlLiRvcHRpb25zW3IubmFtZV09ciwiaW5pdGlhbFZhbHVlImluIHImJihlWyIkIityLm5hbWVdPXIuaW5pdGlhbFZhbHVlKX0pLHIuaW1wbGVtZW50KGUscyksdGhpc30sdGhpcy5yZXNldE9wdGlvbnM9ZnVuY3Rpb24oZSl7T2JqZWN0LmtleXMoZS4kb3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj1lLiRvcHRpb25zW3RdOyJ2YWx1ZSJpbiBuJiZlLnNldE9wdGlvbih0LG4udmFsdWUpfSl9LHRoaXMuc2V0RGVmYXVsdFZhbHVlPWZ1bmN0aW9uKGUsdCxuKXtpZighZSl7Zm9yKGUgaW4gdGhpcy4kZGVmYXVsdE9wdGlvbnMpaWYodGhpcy4kZGVmYXVsdE9wdGlvbnNbZV1bdF0pYnJlYWs7aWYoIXRoaXMuJGRlZmF1bHRPcHRpb25zW2VdW3RdKXJldHVybiExfXZhciByPXRoaXMuJGRlZmF1bHRPcHRpb25zW2VdfHwodGhpcy4kZGVmYXVsdE9wdGlvbnNbZV09e30pO3JbdF0mJihyLmZvcndhcmRUbz90aGlzLnNldERlZmF1bHRWYWx1ZShyLmZvcndhcmRUbyx0LG4pOnJbdF0udmFsdWU9bil9LHRoaXMuc2V0RGVmYXVsdFZhbHVlcz1mdW5jdGlvbihlLHQpe09iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24obil7dGhpcy5zZXREZWZhdWx0VmFsdWUoZSxuLHRbbl0pfSx0aGlzKX0sdGhpcy53YXJuPW8sdGhpcy5yZXBvcnRFcnJvcj11fSkuY2FsbChhLnByb3RvdHlwZSksdC5BcHBDb25maWc9YX0pLGFjZS5kZWZpbmUoImFjZS9jb25maWciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL29vcCIsImFjZS9saWIvbmV0IiwiYWNlL2xpYi9hcHBfY29uZmlnIl0sZnVuY3Rpb24oZSx0LG4peyJubyB1c2Ugc3RyaWN0IjtmdW5jdGlvbiBsKHIpe2lmKCF1fHwhdS5kb2N1bWVudClyZXR1cm47YS5wYWNrYWdlZD1yfHxlLnBhY2thZ2VkfHxuLnBhY2thZ2VkfHx1LmRlZmluZSYmZGVmaW5lLnBhY2thZ2VkO3ZhciBpPXt9LHM9IiIsbz1kb2N1bWVudC5jdXJyZW50U2NyaXB0fHxkb2N1bWVudC5fY3VycmVudFNjcmlwdCxmPW8mJm8ub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQsbD1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTtmb3IodmFyIGg9MDtoPGwubGVuZ3RoO2grKyl7dmFyIHA9bFtoXSxkPXAuc3JjfHxwLmdldEF0dHJpYnV0ZSgic3JjIik7aWYoIWQpY29udGludWU7dmFyIHY9cC5hdHRyaWJ1dGVzO2Zvcih2YXIgbT0wLGc9di5sZW5ndGg7bTxnO20rKyl7dmFyIHk9dlttXTt5Lm5hbWUuaW5kZXhPZigiZGF0YS1hY2UtIik9PT0wJiYoaVtjKHkubmFtZS5yZXBsYWNlKC9eZGF0YS1hY2UtLywiIikpXT15LnZhbHVlKX12YXIgYj1kLm1hdGNoKC9eKC4qKVwvYWNlKFwtXHcrKT9cLmpzKFw/fCQpLyk7YiYmKHM9YlsxXSl9cyYmKGkuYmFzZT1pLmJhc2V8fHMsaS5wYWNrYWdlZD0hMCksaS5iYXNlUGF0aD1pLmJhc2UsaS53b3JrZXJQYXRoPWkud29ya2VyUGF0aHx8aS5iYXNlLGkubW9kZVBhdGg9aS5tb2RlUGF0aHx8aS5iYXNlLGkudGhlbWVQYXRoPWkudGhlbWVQYXRofHxpLmJhc2UsZGVsZXRlIGkuYmFzZTtmb3IodmFyIHcgaW4gaSl0eXBlb2YgaVt3XSE9InVuZGVmaW5lZCImJnQuc2V0KHcsaVt3XSl9ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZS5yZXBsYWNlKC8tKC4pL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfSl9dmFyIHI9ZSgiLi9saWIvbGFuZyIpLGk9ZSgiLi9saWIvb29wIikscz1lKCIuL2xpYi9uZXQiKSxvPWUoIi4vbGliL2FwcF9jb25maWciKS5BcHBDb25maWc7bi5leHBvcnRzPXQ9bmV3IG87dmFyIHU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc3x8dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvd30oKSxhPXtwYWNrYWdlZDohMSx3b3JrZXJQYXRoOm51bGwsbW9kZVBhdGg6bnVsbCx0aGVtZVBhdGg6bnVsbCxiYXNlUGF0aDoiIixzdWZmaXg6Ii5qcyIsJG1vZHVsZVVybHM6e30sbG9hZFdvcmtlckZyb21CbG9iOiEwLHNoYXJlZFBvcHVwczohMX07dC5nZXQ9ZnVuY3Rpb24oZSl7aWYoIWEuaGFzT3duUHJvcGVydHkoZSkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvbmZpZyBrZXk6ICIrZSk7cmV0dXJuIGFbZV19LHQuc2V0PWZ1bmN0aW9uKGUsdCl7aWYoYS5oYXNPd25Qcm9wZXJ0eShlKSlhW2VdPXQ7ZWxzZSBpZih0aGlzLnNldERlZmF1bHRWYWx1ZSgiIixlLHQpPT0wKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBjb25maWcga2V5OiAiK2UpfSx0LmFsbD1mdW5jdGlvbigpe3JldHVybiByLmNvcHlPYmplY3QoYSl9LHQuJG1vZGVzPXt9LHQubW9kdWxlVXJsPWZ1bmN0aW9uKGUsdCl7aWYoYS4kbW9kdWxlVXJsc1tlXSlyZXR1cm4gYS4kbW9kdWxlVXJsc1tlXTt2YXIgbj1lLnNwbGl0KCIvIik7dD10fHxuW24ubGVuZ3RoLTJdfHwiIjt2YXIgcj10PT0ic25pcHBldHMiPyIvIjoiLSIsaT1uW24ubGVuZ3RoLTFdO2lmKHQ9PSJ3b3JrZXIiJiZyPT0iLSIpe3ZhciBzPW5ldyBSZWdFeHAoIl4iK3QrIltcXC1fXXxbXFwtX10iK3QrIiQiLCJnIik7aT1pLnJlcGxhY2UocywiIil9KCFpfHxpPT10KSYmbi5sZW5ndGg+MSYmKGk9bltuLmxlbmd0aC0yXSk7dmFyIG89YVt0KyJQYXRoIl07cmV0dXJuIG89PW51bGw/bz1hLmJhc2VQYXRoOnI9PSIvIiYmKHQ9cj0iIiksbyYmby5zbGljZSgtMSkhPSIvIiYmKG8rPSIvIiksbyt0K3IraSt0aGlzLmdldCgic3VmZml4Iil9LHQuc2V0TW9kdWxlVXJsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEuJG1vZHVsZVVybHNbZV09dH0sdC4kbG9hZGluZz17fSx0LmxvYWRNb2R1bGU9ZnVuY3Rpb24obixyKXt2YXIgaSxvO0FycmF5LmlzQXJyYXkobikmJihvPW5bMF0sbj1uWzFdKTt0cnl7aT1lKG4pfWNhdGNoKHUpe31pZihpJiYhdC4kbG9hZGluZ1tuXSlyZXR1cm4gciYmcihpKTt0LiRsb2FkaW5nW25dfHwodC4kbG9hZGluZ1tuXT1bXSksdC4kbG9hZGluZ1tuXS5wdXNoKHIpO2lmKHQuJGxvYWRpbmdbbl0ubGVuZ3RoPjEpcmV0dXJuO3ZhciBhPWZ1bmN0aW9uKCl7ZShbbl0sZnVuY3Rpb24oZSl7dC5fZW1pdCgibG9hZC5tb2R1bGUiLHtuYW1lOm4sbW9kdWxlOmV9KTt2YXIgcj10LiRsb2FkaW5nW25dO3QuJGxvYWRpbmdbbl09bnVsbCxyLmZvckVhY2goZnVuY3Rpb24odCl7dCYmdChlKX0pfSl9O2lmKCF0LmdldCgicGFja2FnZWQiKSlyZXR1cm4gYSgpO3MubG9hZFNjcmlwdCh0Lm1vZHVsZVVybChuLG8pLGEpLGYoKX07dmFyIGY9ZnVuY3Rpb24oKXshYS5iYXNlUGF0aCYmIWEud29ya2VyUGF0aCYmIWEubW9kZVBhdGgmJiFhLnRoZW1lUGF0aCYmIU9iamVjdC5rZXlzKGEuJG1vZHVsZVVybHMpLmxlbmd0aCYmKGNvbnNvbGUuZXJyb3IoIlVuYWJsZSB0byBpbmZlciBwYXRoIHRvIGFjZSBmcm9tIHNjcmlwdCBzcmMsIiwidXNlIGFjZS5jb25maWcuc2V0KCdiYXNlUGF0aCcsICdwYXRoJykgdG8gZW5hYmxlIGR5bmFtaWMgbG9hZGluZyBvZiBtb2RlcyBhbmQgdGhlbWVzIiwib3Igd2l0aCB3ZWJwYWNrIHVzZSBhY2Uvd2VicGFjay1yZXNvbHZlciIpLGY9ZnVuY3Rpb24oKXt9KX07dC5pbml0PWwsdC52ZXJzaW9uPSIxLjQuNiJ9KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvbW91c2VfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCIsImFjZS9tb3VzZS9kZWZhdWx0X2hhbmRsZXJzIiwiYWNlL21vdXNlL2RlZmF1bHRfZ3V0dGVyX2hhbmRsZXIiLCJhY2UvbW91c2UvbW91c2VfZXZlbnQiLCJhY2UvbW91c2UvZHJhZ2Ryb3BfaGFuZGxlciIsImFjZS9tb3VzZS90b3VjaF9oYW5kbGVyIiwiYWNlL2NvbmZpZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2V2ZW50IiksaT1lKCIuLi9saWIvdXNlcmFnZW50Iikscz1lKCIuL2RlZmF1bHRfaGFuZGxlcnMiKS5EZWZhdWx0SGFuZGxlcnMsbz1lKCIuL2RlZmF1bHRfZ3V0dGVyX2hhbmRsZXIiKS5HdXR0ZXJIYW5kbGVyLHU9ZSgiLi9tb3VzZV9ldmVudCIpLk1vdXNlRXZlbnQsYT1lKCIuL2RyYWdkcm9wX2hhbmRsZXIiKS5EcmFnZHJvcEhhbmRsZXIsZj1lKCIuL3RvdWNoX2hhbmRsZXIiKS5hZGRUb3VjaExpc3RlbmVycyxsPWUoIi4uL2NvbmZpZyIpLGM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLmVkaXRvcj1lLG5ldyBzKHRoaXMpLG5ldyBvKHRoaXMpLG5ldyBhKHRoaXMpO3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciBuPSFkb2N1bWVudC5oYXNGb2N1c3x8IWRvY3VtZW50Lmhhc0ZvY3VzKCl8fCFlLmlzRm9jdXNlZCgpJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT0oZS50ZXh0SW5wdXQmJmUudGV4dElucHV0LmdldEVsZW1lbnQoKSk7biYmd2luZG93LmZvY3VzKCksZS5mb2N1cygpfSx1PWUucmVuZGVyZXIuZ2V0TW91c2VFdmVudFRhcmdldCgpO3IuYWRkTGlzdGVuZXIodSwiY2xpY2siLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiY2xpY2siKSksci5hZGRMaXN0ZW5lcih1LCJtb3VzZW1vdmUiLHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzLCJtb3VzZW1vdmUiKSksci5hZGRNdWx0aU1vdXNlRG93bkxpc3RlbmVyKFt1LGUucmVuZGVyZXIuc2Nyb2xsQmFyViYmZS5yZW5kZXJlci5zY3JvbGxCYXJWLmlubmVyLGUucmVuZGVyZXIuc2Nyb2xsQmFySCYmZS5yZW5kZXJlci5zY3JvbGxCYXJILmlubmVyLGUudGV4dElucHV0JiZlLnRleHRJbnB1dC5nZXRFbGVtZW50KCldLmZpbHRlcihCb29sZWFuKSxbNDAwLDMwMCwyNTBdLHRoaXMsIm9uTW91c2VFdmVudCIpLHIuYWRkTW91c2VXaGVlbExpc3RlbmVyKGUuY29udGFpbmVyLHRoaXMub25Nb3VzZVdoZWVsLmJpbmQodGhpcywibW91c2V3aGVlbCIpKSxmKGUuY29udGFpbmVyLGUpO3ZhciBsPWUucmVuZGVyZXIuJGd1dHRlcjtyLmFkZExpc3RlbmVyKGwsIm1vdXNlZG93biIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJndXR0ZXJtb3VzZWRvd24iKSksci5hZGRMaXN0ZW5lcihsLCJjbGljayIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJndXR0ZXJjbGljayIpKSxyLmFkZExpc3RlbmVyKGwsImRibGNsaWNrIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImd1dHRlcmRibGNsaWNrIikpLHIuYWRkTGlzdGVuZXIobCwibW91c2Vtb3ZlIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImd1dHRlcm1vdXNlbW92ZSIpKSxyLmFkZExpc3RlbmVyKHUsIm1vdXNlZG93biIsbiksci5hZGRMaXN0ZW5lcihsLCJtb3VzZWRvd24iLG4pLGkuaXNJRSYmZS5yZW5kZXJlci5zY3JvbGxCYXJWJiYoci5hZGRMaXN0ZW5lcihlLnJlbmRlcmVyLnNjcm9sbEJhclYuZWxlbWVudCwibW91c2Vkb3duIixuKSxyLmFkZExpc3RlbmVyKGUucmVuZGVyZXIuc2Nyb2xsQmFySC5lbGVtZW50LCJtb3VzZWRvd24iLG4pKSxlLm9uKCJtb3VzZW1vdmUiLGZ1bmN0aW9uKG4pe2lmKHQuc3RhdGV8fHQuJGRyYWdEZWxheXx8IXQuJGRyYWdFbmFibGVkKXJldHVybjt2YXIgcj1lLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKG4ueCxuLnkpLGk9ZS5zZXNzaW9uLnNlbGVjdGlvbi5nZXRSYW5nZSgpLHM9ZS5yZW5kZXJlcjshaS5pc0VtcHR5KCkmJmkuaW5zaWRlU3RhcnQoci5yb3csci5jb2x1bW4pP3Muc2V0Q3Vyc29yU3R5bGUoImRlZmF1bHQiKTpzLnNldEN1cnNvclN0eWxlKCIiKX0pfTsoZnVuY3Rpb24oKXt0aGlzLm9uTW91c2VFdmVudD1mdW5jdGlvbihlLHQpe3RoaXMuZWRpdG9yLl9lbWl0KGUsbmV3IHUodCx0aGlzLmVkaXRvcikpfSx0aGlzLm9uTW91c2VNb3ZlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5lZGl0b3IuX2V2ZW50UmVnaXN0cnkmJnRoaXMuZWRpdG9yLl9ldmVudFJlZ2lzdHJ5Lm1vdXNlbW92ZTtpZighbnx8IW4ubGVuZ3RoKXJldHVybjt0aGlzLmVkaXRvci5fZW1pdChlLG5ldyB1KHQsdGhpcy5lZGl0b3IpKX0sdGhpcy5vbk1vdXNlV2hlZWw9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgdSh0LHRoaXMuZWRpdG9yKTtuLnNwZWVkPXRoaXMuJHNjcm9sbFNwZWVkKjIsbi53aGVlbFg9dC53aGVlbFgsbi53aGVlbFk9dC53aGVlbFksdGhpcy5lZGl0b3IuX2VtaXQoZSxuKX0sdGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihlKXt0aGlzLnN0YXRlPWV9LHRoaXMuY2FwdHVyZU1vdXNlPWZ1bmN0aW9uKGUsdCl7dGhpcy54PWUueCx0aGlzLnk9ZS55LHRoaXMuaXNNb3VzZVByZXNzZWQ9ITA7dmFyIG49dGhpcy5lZGl0b3Iscz10aGlzLmVkaXRvci5yZW5kZXJlcjtzLiRpc01vdXNlUHJlc3NlZD0hMDt2YXIgbz10aGlzLGE9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuO2lmKGkuaXNXZWJLaXQmJiFlLndoaWNoJiZvLnJlbGVhc2VNb3VzZSlyZXR1cm4gby5yZWxlYXNlTW91c2UoKTtvLng9ZS5jbGllbnRYLG8ueT1lLmNsaWVudFksdCYmdChlKSxvLm1vdXNlRXZlbnQ9bmV3IHUoZSxvLmVkaXRvciksby4kbW91c2VNb3ZlZD0hMH0sZj1mdW5jdGlvbihlKXtuLm9mZigiYmVmb3JlRW5kT3BlcmF0aW9uIixjKSxjbGVhckludGVydmFsKGgpLGwoKSxvW28uc3RhdGUrIkVuZCJdJiZvW28uc3RhdGUrIkVuZCJdKGUpLG8uc3RhdGU9IiIsby5pc01vdXNlUHJlc3NlZD1zLiRpc01vdXNlUHJlc3NlZD0hMSxzLiRrZWVwVGV4dEFyZWFBdEN1cnNvciYmcy4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKSxvLiRvbkNhcHR1cmVNb3VzZU1vdmU9by5yZWxlYXNlTW91c2U9bnVsbCxlJiZvLm9uTW91c2VFdmVudCgibW91c2V1cCIsZSksbi5lbmRPcGVyYXRpb24oKX0sbD1mdW5jdGlvbigpe29bby5zdGF0ZV0mJm9bby5zdGF0ZV0oKSxvLiRtb3VzZU1vdmVkPSExfTtpZihpLmlzT2xkSUUmJmUuZG9tRXZlbnQudHlwZT09ImRibGNsaWNrIilyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2YoZSl9KTt2YXIgYz1mdW5jdGlvbihlKXtpZighby5yZWxlYXNlTW91c2UpcmV0dXJuO24uY3VyT3AuY29tbWFuZC5uYW1lJiZuLmN1ck9wLnNlbGVjdGlvbkNoYW5nZWQmJihvW28uc3RhdGUrIkVuZCJdJiZvW28uc3RhdGUrIkVuZCJdKCksby5zdGF0ZT0iIixvLnJlbGVhc2VNb3VzZSgpKX07bi5vbigiYmVmb3JlRW5kT3BlcmF0aW9uIixjKSxuLnN0YXJ0T3BlcmF0aW9uKHtjb21tYW5kOntuYW1lOiJtb3VzZSJ9fSksby4kb25DYXB0dXJlTW91c2VNb3ZlPWEsby5yZWxlYXNlTW91c2U9ci5jYXB0dXJlKHRoaXMuZWRpdG9yLmNvbnRhaW5lcixhLGYpO3ZhciBoPXNldEludGVydmFsKGwsMjApfSx0aGlzLnJlbGVhc2VNb3VzZT1udWxsLHRoaXMuY2FuY2VsQ29udGV4dE1lbnU9ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbih0KXtpZih0JiZ0LmRvbUV2ZW50JiZ0LmRvbUV2ZW50LnR5cGUhPSJjb250ZXh0bWVudSIpcmV0dXJuO3RoaXMuZWRpdG9yLm9mZigibmF0aXZlY29udGV4dG1lbnUiLGUpLHQmJnQuZG9tRXZlbnQmJnIuc3RvcEV2ZW50KHQuZG9tRXZlbnQpfS5iaW5kKHRoaXMpO3NldFRpbWVvdXQoZSwxMCksdGhpcy5lZGl0b3Iub24oIm5hdGl2ZWNvbnRleHRtZW51IixlKX19KS5jYWxsKGMucHJvdG90eXBlKSxsLmRlZmluZU9wdGlvbnMoYy5wcm90b3R5cGUsIm1vdXNlSGFuZGxlciIse3Njcm9sbFNwZWVkOntpbml0aWFsVmFsdWU6Mn0sZHJhZ0RlbGF5Ontpbml0aWFsVmFsdWU6aS5pc01hYz8xNTA6MH0sZHJhZ0VuYWJsZWQ6e2luaXRpYWxWYWx1ZTohMH0sZm9jdXNUaW1lb3V0Ontpbml0aWFsVmFsdWU6MH0sdG9vbHRpcEZvbGxvd3NNb3VzZTp7aW5pdGlhbFZhbHVlOiEwfX0pLHQuTW91c2VIYW5kbGVyPWN9KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvZm9sZF9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7ZS5vbigiY2xpY2siLGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLGk9ZS5zZXNzaW9uLHM9aS5nZXRGb2xkQXQobi5yb3csbi5jb2x1bW4sMSk7cyYmKHQuZ2V0QWNjZWxLZXkoKT9pLnJlbW92ZUZvbGQocyk6aS5leHBhbmRGb2xkKHMpLHQuc3RvcCgpKTt2YXIgbz10LmRvbUV2ZW50JiZ0LmRvbUV2ZW50LnRhcmdldDtvJiZyLmhhc0Nzc0NsYXNzKG8sImFjZV9pbmxpbmVfYnV0dG9uIikmJnIuaGFzQ3NzQ2xhc3MobywiYWNlX3RvZ2dsZV93cmFwIikmJihpLnNldE9wdGlvbigid3JhcCIsIWkuZ2V0VXNlV3JhcE1vZGUoKSksZS5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpKX0pLGUub24oImd1dHRlcmNsaWNrIixmdW5jdGlvbih0KXt2YXIgbj1lLnJlbmRlcmVyLiRndXR0ZXJMYXllci5nZXRSZWdpb24odCk7aWYobj09ImZvbGRXaWRnZXRzIil7dmFyIHI9dC5nZXREb2N1bWVudFBvc2l0aW9uKCkucm93LGk9ZS5zZXNzaW9uO2kuZm9sZFdpZGdldHMmJmkuZm9sZFdpZGdldHNbcl0mJmUuc2Vzc2lvbi5vbkZvbGRXaWRnZXRDbGljayhyLHQpLGUuaXNGb2N1c2VkKCl8fGUuZm9jdXMoKSx0LnN0b3AoKX19KSxlLm9uKCJndXR0ZXJkYmxjbGljayIsZnVuY3Rpb24odCl7dmFyIG49ZS5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuZ2V0UmVnaW9uKHQpO2lmKG49PSJmb2xkV2lkZ2V0cyIpe3ZhciByPXQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLnJvdyxpPWUuc2Vzc2lvbixzPWkuZ2V0UGFyZW50Rm9sZFJhbmdlRGF0YShyLCEwKSxvPXMucmFuZ2V8fHMuZmlyc3RSYW5nZTtpZihvKXtyPW8uc3RhcnQucm93O3ZhciB1PWkuZ2V0Rm9sZEF0KHIsaS5nZXRMaW5lKHIpLmxlbmd0aCwxKTt1P2kucmVtb3ZlRm9sZCh1KTooaS5hZGRGb2xkKCIuLi4iLG8pLGUucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoe3JvdzpvLnN0YXJ0LnJvdyxjb2x1bW46MH0pKX10LnN0b3AoKX19KX12YXIgcj1lKCIuLi9saWIvZG9tIik7dC5Gb2xkSGFuZGxlcj1pfSksYWNlLmRlZmluZSgiYWNlL2tleWJvYXJkL2tleWJpbmRpbmciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2tleXMiLCJhY2UvbGliL2V2ZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIva2V5cyIpLGk9ZSgiLi4vbGliL2V2ZW50Iikscz1mdW5jdGlvbihlKXt0aGlzLiRlZGl0b3I9ZSx0aGlzLiRkYXRhPXtlZGl0b3I6ZX0sdGhpcy4kaGFuZGxlcnM9W10sdGhpcy5zZXREZWZhdWx0SGFuZGxlcihlLmNvbW1hbmRzKX07KGZ1bmN0aW9uKCl7dGhpcy5zZXREZWZhdWx0SGFuZGxlcj1mdW5jdGlvbihlKXt0aGlzLnJlbW92ZUtleWJvYXJkSGFuZGxlcih0aGlzLiRkZWZhdWx0SGFuZGxlciksdGhpcy4kZGVmYXVsdEhhbmRsZXI9ZSx0aGlzLmFkZEtleWJvYXJkSGFuZGxlcihlLDApfSx0aGlzLnNldEtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRoYW5kbGVycztpZih0W3QubGVuZ3RoLTFdPT1lKXJldHVybjt3aGlsZSh0W3QubGVuZ3RoLTFdJiZ0W3QubGVuZ3RoLTFdIT10aGlzLiRkZWZhdWx0SGFuZGxlcil0aGlzLnJlbW92ZUtleWJvYXJkSGFuZGxlcih0W3QubGVuZ3RoLTFdKTt0aGlzLmFkZEtleWJvYXJkSGFuZGxlcihlLDEpfSx0aGlzLmFkZEtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbihlLHQpe2lmKCFlKXJldHVybjt0eXBlb2YgZT09ImZ1bmN0aW9uIiYmIWUuaGFuZGxlS2V5Ym9hcmQmJihlLmhhbmRsZUtleWJvYXJkPWUpO3ZhciBuPXRoaXMuJGhhbmRsZXJzLmluZGV4T2YoZSk7biE9LTEmJnRoaXMuJGhhbmRsZXJzLnNwbGljZShuLDEpLHQ9PXVuZGVmaW5lZD90aGlzLiRoYW5kbGVycy5wdXNoKGUpOnRoaXMuJGhhbmRsZXJzLnNwbGljZSh0LDAsZSksbj09LTEmJmUuYXR0YWNoJiZlLmF0dGFjaCh0aGlzLiRlZGl0b3IpfSx0aGlzLnJlbW92ZUtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRoYW5kbGVycy5pbmRleE9mKGUpO3JldHVybiB0PT0tMT8hMToodGhpcy4kaGFuZGxlcnMuc3BsaWNlKHQsMSksZS5kZXRhY2gmJmUuZGV0YWNoKHRoaXMuJGVkaXRvciksITApfSx0aGlzLmdldEtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRoYW5kbGVyc1t0aGlzLiRoYW5kbGVycy5sZW5ndGgtMV19LHRoaXMuZ2V0U3RhdHVzVGV4dD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJGRhdGEsdD1lLmVkaXRvcjtyZXR1cm4gdGhpcy4kaGFuZGxlcnMubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFN0YXR1c1RleHQmJm4uZ2V0U3RhdHVzVGV4dCh0LGUpfHwiIn0pLmZpbHRlcihCb29sZWFuKS5qb2luKCIgIil9LHRoaXMuJGNhbGxLZXlib2FyZEhhbmRsZXJzPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBzLG89ITEsdT10aGlzLiRlZGl0b3IuY29tbWFuZHM7Zm9yKHZhciBhPXRoaXMuJGhhbmRsZXJzLmxlbmd0aDthLS07KXtzPXRoaXMuJGhhbmRsZXJzW2FdLmhhbmRsZUtleWJvYXJkKHRoaXMuJGRhdGEsZSx0LG4scik7aWYoIXN8fCFzLmNvbW1hbmQpY29udGludWU7cy5jb21tYW5kPT0ibnVsbCI/bz0hMDpvPXUuZXhlYyhzLmNvbW1hbmQsdGhpcy4kZWRpdG9yLHMuYXJncyxyKSxvJiZyJiZlIT0tMSYmcy5wYXNzRXZlbnQhPTEmJnMuY29tbWFuZC5wYXNzRXZlbnQhPTEmJmkuc3RvcEV2ZW50KHIpO2lmKG8pYnJlYWt9cmV0dXJuIW8mJmU9PS0xJiYocz17Y29tbWFuZDoiaW5zZXJ0c3RyaW5nIn0sbz11LmV4ZWMoImluc2VydHN0cmluZyIsdGhpcy4kZWRpdG9yLHQpKSxvJiZ0aGlzLiRlZGl0b3IuX3NpZ25hbCYmdGhpcy4kZWRpdG9yLl9zaWduYWwoImtleWJvYXJkQWN0aXZpdHkiLHMpLG99LHRoaXMub25Db21tYW5kS2V5PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1yLmtleUNvZGVUb1N0cmluZyhuKTtyZXR1cm4gdGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnModCxpLG4sZSl9LHRoaXMub25UZXh0SW5wdXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJGNhbGxLZXlib2FyZEhhbmRsZXJzKC0xLGUpfX0pLmNhbGwocy5wcm90b3R5cGUpLHQuS2V5QmluZGluZz1zfSksYWNlLmRlZmluZSgiYWNlL2xpYi9iaWRpdXRpbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gRihlLHQsbixyKXt2YXIgaT1zP2Q6cCxjPW51bGwsaD1udWxsLHY9bnVsbCxtPTAsZz1udWxsLHk9bnVsbCxiPS0xLHc9bnVsbCxFPW51bGwsVD1bXTtpZighcilmb3Iodz0wLHI9W107dzxuO3crKylyW3ddPVIoZVt3XSk7bz1zLHU9ITEsYT0hMSxmPSExLGw9ITE7Zm9yKEU9MDtFPG47RSsrKXtjPW0sVFtFXT1oPXEoZSxyLFQsRSksbT1pW2NdW2hdLGc9bSYyNDAsbSY9MTUsdFtFXT12PWlbbV1bNV07aWYoZz4wKWlmKGc9PTE2KXtmb3Iodz1iO3c8RTt3KyspdFt3XT0xO2I9LTF9ZWxzZSBiPS0xO3k9aVttXVs2XTtpZih5KWI9PS0xJiYoYj1FKTtlbHNlIGlmKGI+LTEpe2Zvcih3PWI7dzxFO3crKyl0W3ddPXY7Yj0tMX1yW0VdPT1TJiYodFtFXT0wKSxvfD12fWlmKGwpZm9yKHc9MDt3PG47dysrKWlmKHJbd109PXgpe3Rbd109cztmb3IodmFyIEM9dy0xO0M+PTA7Qy0tKXtpZihyW0NdIT1OKWJyZWFrO3RbQ109c319fWZ1bmN0aW9uIEkoZSx0LG4pe2lmKG88ZSlyZXR1cm47aWYoZT09MSYmcz09bSYmIWYpe24ucmV2ZXJzZSgpO3JldHVybn12YXIgcj1uLmxlbmd0aCxpPTAsdSxhLGwsYzt3aGlsZShpPHIpe2lmKHRbaV0+PWUpe3U9aSsxO3doaWxlKHU8ciYmdFt1XT49ZSl1Kys7Zm9yKGE9aSxsPXUtMTthPGw7YSsrLGwtLSljPW5bYV0sblthXT1uW2xdLG5bbF09YztpPXV9aSsrfX1mdW5jdGlvbiBxKGUsdCxuLHIpe3ZhciBpPXRbcl0sbyxjLGgscDtzd2l0Y2goaSl7Y2FzZSBnOmNhc2UgeTp1PSExO2Nhc2UgRTpjYXNlIHc6cmV0dXJuIGk7Y2FzZSBiOnJldHVybiB1P3c6YjtjYXNlIFQ6cmV0dXJuIHU9ITAsYT0hMCx5O2Nhc2UgTjpyZXR1cm4gRTtjYXNlIEM6aWYocjwxfHxyKzE+PXQubGVuZ3RofHwobz1uW3ItMV0pIT1iJiZvIT13fHwoYz10W3IrMV0pIT1iJiZjIT13KXJldHVybiBFO3JldHVybiB1JiYoYz13KSxjPT1vP2M6RTtjYXNlIGs6bz1yPjA/bltyLTFdOlM7aWYobz09YiYmcisxPHQubGVuZ3RoJiZ0W3IrMV09PWIpcmV0dXJuIGI7cmV0dXJuIEU7Y2FzZSBMOmlmKHI+MCYmbltyLTFdPT1iKXJldHVybiBiO2lmKHUpcmV0dXJuIEU7cD1yKzEsaD10Lmxlbmd0aDt3aGlsZShwPGgmJnRbcF09PUwpcCsrO2lmKHA8aCYmdFtwXT09YilyZXR1cm4gYjtyZXR1cm4gRTtjYXNlIEE6aD10Lmxlbmd0aCxwPXIrMTt3aGlsZShwPGgmJnRbcF09PUEpcCsrO2lmKHA8aCl7dmFyIGQ9ZVtyXSx2PWQ+PTE0MjUmJmQ8PTIzMDN8fGQ9PTY0Mjg2O289dFtwXTtpZih2JiYobz09eXx8bz09VCkpcmV0dXJuIHl9aWYocjwxfHwobz10W3ItMV0pPT1TKXJldHVybiBFO3JldHVybiBuW3ItMV07Y2FzZSBTOnJldHVybiB1PSExLGY9ITAscztjYXNlIHg6cmV0dXJuIGw9ITAsRTtjYXNlIE86Y2FzZSBNOmNhc2UgRDpjYXNlIFA6Y2FzZSBfOnU9ITE7Y2FzZSBIOnJldHVybiBFfX1mdW5jdGlvbiBSKGUpe3ZhciB0PWUuY2hhckNvZGVBdCgwKSxuPXQ+Pjg7cmV0dXJuIG49PTA/dD4xOTE/ZzpCW3RdOm49PTU/L1tcdTA1OTEtXHUwNWY0XS8udGVzdChlKT95Omc6bj09Nj8vW1x1MDYxMC1cdTA2MWFcdTA2NGItXHUwNjVmXHUwNmQ2LVx1MDZlNFx1MDZlNy1cdTA2ZWRdLy50ZXN0KGUpP0E6L1tcdTA2NjAtXHUwNjY5XHUwNjZiLVx1MDY2Y10vLnRlc3QoZSk/dzp0PT0xNjQyP0w6L1tcdTA2ZjAtXHUwNmY5XS8udGVzdChlKT9iOlQ6bj09MzImJnQ8PTgyODc/alt0JjI1NV06bj09MjU0P3Q+PTY1MTM2P1Q6RTpFfWZ1bmN0aW9uIFUoZSl7cmV0dXJuIGU+PSJcdTA2NGIiJiZlPD0iXHUwNjU1In12YXIgcj1bIlx1MDYyMSIsIlx1MDY0MSJdLGk9WyJcdTA2M2EiLCJcdTA2NGEiXSxzPTAsbz0wLHU9ITEsYT0hMSxmPSExLGw9ITEsYz0hMSxoPSExLHA9W1swLDMsMCwxLDAsMCwwXSxbMCwzLDAsMSwyLDIsMF0sWzAsMywwLDE3LDIsMCwxXSxbMCwzLDUsNSw0LDEsMF0sWzAsMywyMSwyMSw0LDAsMV0sWzAsMyw1LDUsNCwyLDBdXSxkPVtbMiwwLDEsMSwwLDEsMF0sWzIsMCwxLDEsMCwyLDBdLFsyLDAsMiwxLDMsMiwwXSxbMiwwLDIsMzMsMywxLDFdXSx2PTAsbT0xLGc9MCx5PTEsYj0yLHc9MyxFPTQsUz01LHg9NixUPTcsTj04LEM9OSxrPTEwLEw9MTEsQT0xMixPPTEzLE09MTQsXz0xNSxEPTE2LFA9MTcsSD0xOCxCPVtILEgsSCxILEgsSCxILEgsSCx4LFMseCxOLFMsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILFMsUyxTLHgsTixFLEUsTCxMLEwsRSxFLEUsRSxFLGssQyxrLEMsQyxiLGIsYixiLGIsYixiLGIsYixiLEMsRSxFLEUsRSxFLEUsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLEUsRSxFLEUsRSxFLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxFLEUsRSxFLEgsSCxILEgsSCxILFMsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEMsRSxMLEwsTCxMLEUsRSxFLEUsZyxFLEUsSCxFLEUsTCxMLGIsYixFLGcsRSxFLEUsYixnLEUsRSxFLEUsRV0saj1bTixOLE4sTixOLE4sTixOLE4sTixOLEgsSCxILGcseSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxOLFMsTyxNLF8sRCxQLEMsTCxMLEwsTCxMLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEMsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLE5dO3QuTD1nLHQuUj15LHQuRU49Yix0Lk9OX1I9Myx0LkFOPTQsdC5SX0g9NSx0LkI9Nix0LlJMRT03LHQuRE9UPSJcdTAwYjciLHQuZG9CaWRpUmVvcmRlcj1mdW5jdGlvbihlLG4scil7aWYoZS5sZW5ndGg8MilyZXR1cm57fTt2YXIgaT1lLnNwbGl0KCIiKSxvPW5ldyBBcnJheShpLmxlbmd0aCksdT1uZXcgQXJyYXkoaS5sZW5ndGgpLGE9W107cz1yP206dixGKGksYSxpLmxlbmd0aCxuKTtmb3IodmFyIGY9MDtmPG8ubGVuZ3RoO29bZl09ZixmKyspO0koMixhLG8pLEkoMSxhLG8pO2Zvcih2YXIgZj0wO2Y8by5sZW5ndGgtMTtmKyspbltmXT09PXc/YVtmXT10LkFOOmFbZl09PT15JiYobltmXT5UJiZuW2ZdPE98fG5bZl09PT1FfHxuW2ZdPT09SCk/YVtmXT10Lk9OX1I6Zj4wJiZpW2YtMV09PT0iXHUwNjQ0IiYmL1x1MDYyMnxcdTA2MjN8XHUwNjI1fFx1MDYyNy8udGVzdChpW2ZdKSYmKGFbZi0xXT1hW2ZdPXQuUl9ILGYrKyk7aVtpLmxlbmd0aC0xXT09PXQuRE9UJiYoYVtpLmxlbmd0aC0xXT10LkIpLGlbMF09PT0iXHUyMDJiIiYmKGFbMF09dC5STEUpO2Zvcih2YXIgZj0wO2Y8by5sZW5ndGg7ZisrKXVbZl09YVtvW2ZdXTtyZXR1cm57bG9naWNhbEZyb21WaXN1YWw6byxiaWRpTGV2ZWxzOnV9fSx0Lmhhc0JpZGlDaGFyYWN0ZXJzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ITE7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspdFtyXT1SKGUuY2hhckF0KHIpKSwhbiYmKHRbcl09PXl8fHRbcl09PVR8fHRbcl09PXcpJiYobj0hMCk7cmV0dXJuIG59LHQuZ2V0VmlzdWFsRnJvbUxvZ2ljYWxJZHg9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHQubG9naWNhbEZyb21WaXN1YWwubGVuZ3RoO24rKylpZih0LmxvZ2ljYWxGcm9tVmlzdWFsW25dPT1lKXJldHVybiBuO3JldHVybiAwfX0pLGFjZS5kZWZpbmUoImFjZS9iaWRpaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvYmlkaXV0aWwiLCJhY2UvbGliL2xhbmciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL2JpZGl1dGlsIiksaT1lKCIuL2xpYi9sYW5nIikscz0vW1x1MDU5MC1cdTA1ZjRcdTA2MDAtXHUwNmZmXHUwNzAwLVx1MDhhY1x1MjAyQl0vLG89ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uPWUsdGhpcy5iaWRpTWFwPXt9LHRoaXMuY3VycmVudFJvdz1udWxsLHRoaXMuYmlkaVV0aWw9cix0aGlzLmNoYXJXaWR0aHM9W10sdGhpcy5FT0w9Ilx1MDBhYyIsdGhpcy5zaG93SW52aXNpYmxlcz0hMCx0aGlzLmlzUnRsRGlyPSExLHRoaXMuJGlzUnRsPSExLHRoaXMubGluZT0iIix0aGlzLndyYXBJbmRlbnQ9MCx0aGlzLkVPRj0iXHUwMGI2Iix0aGlzLlJMRT0iXHUyMDJiIix0aGlzLmNvbnRlbnRXaWR0aD0wLHRoaXMuZm9udE1ldHJpY3M9bnVsbCx0aGlzLnJ0bExpbmVPZmZzZXQ9MCx0aGlzLndyYXBPZmZzZXQ9MCx0aGlzLmlzTW92ZUxlZnRPcGVyYXRpb249ITEsdGhpcy5zZWVuQmlkaT1zLnRlc3QoZS5nZXRWYWx1ZSgpKX07KGZ1bmN0aW9uKCl7dGhpcy5pc0JpZGlSb3c9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLnNlZW5CaWRpPyhlIT09dGhpcy5jdXJyZW50Um93JiYodGhpcy5jdXJyZW50Um93PWUsdGhpcy51cGRhdGVSb3dMaW5lKHQsbiksdGhpcy51cGRhdGVCaWRpTWFwKCkpLHRoaXMuYmlkaU1hcC5iaWRpTGV2ZWxzKTohMX0sdGhpcy5vbkNoYW5nZT1mdW5jdGlvbihlKXt0aGlzLnNlZW5CaWRpP3RoaXMuY3VycmVudFJvdz1udWxsOmUuYWN0aW9uPT0iaW5zZXJ0IiYmcy50ZXN0KGUubGluZXMuam9pbigiXG4iKSkmJih0aGlzLnNlZW5CaWRpPSEwLHRoaXMuY3VycmVudFJvdz1udWxsKX0sdGhpcy5nZXREb2N1bWVudFJvdz1mdW5jdGlvbigpe3ZhciBlPTAsdD10aGlzLnNlc3Npb24uJHNjcmVlblJvd0NhY2hlO2lmKHQubGVuZ3RoKXt2YXIgbj10aGlzLnNlc3Npb24uJGdldFJvd0NhY2hlSW5kZXgodCx0aGlzLmN1cnJlbnRSb3cpO24+PTAmJihlPXRoaXMuc2Vzc2lvbi4kZG9jUm93Q2FjaGVbbl0pfXJldHVybiBlfSx0aGlzLmdldFNwbGl0SW5kZXg9ZnVuY3Rpb24oKXt2YXIgZT0wLHQ9dGhpcy5zZXNzaW9uLiRzY3JlZW5Sb3dDYWNoZTtpZih0Lmxlbmd0aCl7dmFyIG4scj10aGlzLnNlc3Npb24uJGdldFJvd0NhY2hlSW5kZXgodCx0aGlzLmN1cnJlbnRSb3cpO3doaWxlKHRoaXMuY3VycmVudFJvdy1lPjApe249dGhpcy5zZXNzaW9uLiRnZXRSb3dDYWNoZUluZGV4KHQsdGhpcy5jdXJyZW50Um93LWUtMSk7aWYobiE9PXIpYnJlYWs7cj1uLGUrK319ZWxzZSBlPXRoaXMuY3VycmVudFJvdztyZXR1cm4gZX0sdGhpcy51cGRhdGVSb3dMaW5lPWZ1bmN0aW9uKGUsdCl7ZT09PXVuZGVmaW5lZCYmKGU9dGhpcy5nZXREb2N1bWVudFJvdygpKTt2YXIgbj1lPT09dGhpcy5zZXNzaW9uLmdldExlbmd0aCgpLTEscz1uP3RoaXMuRU9GOnRoaXMuRU9MO3RoaXMud3JhcEluZGVudD0wLHRoaXMubGluZT10aGlzLnNlc3Npb24uZ2V0TGluZShlKSx0aGlzLmlzUnRsRGlyPXRoaXMuJGlzUnRsfHx0aGlzLmxpbmUuY2hhckF0KDApPT09dGhpcy5STEU7aWYodGhpcy5zZXNzaW9uLiR1c2VXcmFwTW9kZSl7dmFyIG89dGhpcy5zZXNzaW9uLiR3cmFwRGF0YVtlXTtvJiYodD09PXVuZGVmaW5lZCYmKHQ9dGhpcy5nZXRTcGxpdEluZGV4KCkpLHQ+MCYmby5sZW5ndGg/KHRoaXMud3JhcEluZGVudD1vLmluZGVudCx0aGlzLndyYXBPZmZzZXQ9dGhpcy53cmFwSW5kZW50KnRoaXMuY2hhcldpZHRoc1tyLkxdLHRoaXMubGluZT10PG8ubGVuZ3RoP3RoaXMubGluZS5zdWJzdHJpbmcob1t0LTFdLG9bdF0pOnRoaXMubGluZS5zdWJzdHJpbmcob1tvLmxlbmd0aC0xXSkpOnRoaXMubGluZT10aGlzLmxpbmUuc3Vic3RyaW5nKDAsb1t0XSkpLHQ9PW8ubGVuZ3RoJiYodGhpcy5saW5lKz10aGlzLnNob3dJbnZpc2libGVzP3M6ci5ET1QpfWVsc2UgdGhpcy5saW5lKz10aGlzLnNob3dJbnZpc2libGVzP3M6ci5ET1Q7dmFyIHU9dGhpcy5zZXNzaW9uLGE9MCxmO3RoaXMubGluZT10aGlzLmxpbmUucmVwbGFjZSgvXHR8W1x1MTEwMC1cdTIwMjksIFx1MjAyRi1cdUZGRTZdL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PSIJInx8dS5pc0Z1bGxXaWR0aChlLmNoYXJDb2RlQXQoMCkpPyhmPWU9PT0iCSI/dS5nZXRTY3JlZW5UYWJTaXplKHQrYSk6MixhKz1mLTEsaS5zdHJpbmdSZXBlYXQoci5ET1QsZikpOmV9KSx0aGlzLmlzUnRsRGlyJiYodGhpcy5mb250TWV0cmljcy4kbWFpbi50ZXh0Q29udGVudD10aGlzLmxpbmUuY2hhckF0KHRoaXMubGluZS5sZW5ndGgtMSk9PXIuRE9UP3RoaXMubGluZS5zdWJzdHIoMCx0aGlzLmxpbmUubGVuZ3RoLTEpOnRoaXMubGluZSx0aGlzLnJ0bExpbmVPZmZzZXQ9dGhpcy5jb250ZW50V2lkdGgtdGhpcy5mb250TWV0cmljcy4kbWFpbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCl9LHRoaXMudXBkYXRlQmlkaU1hcD1mdW5jdGlvbigpe3ZhciBlPVtdO3IuaGFzQmlkaUNoYXJhY3RlcnModGhpcy5saW5lLGUpfHx0aGlzLmlzUnRsRGlyP3RoaXMuYmlkaU1hcD1yLmRvQmlkaVJlb3JkZXIodGhpcy5saW5lLGUsdGhpcy5pc1J0bERpcik6dGhpcy5iaWRpTWFwPXt9fSx0aGlzLm1hcmtBc0RpcnR5PWZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50Um93PW51bGx9LHRoaXMudXBkYXRlQ2hhcmFjdGVyV2lkdGhzPWZ1bmN0aW9uKGUpe2lmKHRoaXMuY2hhcmFjdGVyV2lkdGg9PT1lLiRjaGFyYWN0ZXJTaXplLndpZHRoKXJldHVybjt0aGlzLmZvbnRNZXRyaWNzPWU7dmFyIHQ9dGhpcy5jaGFyYWN0ZXJXaWR0aD1lLiRjaGFyYWN0ZXJTaXplLndpZHRoLG49ZS4kbWVhc3VyZUNoYXJXaWR0aCgiXHUwNWQ0Iik7dGhpcy5jaGFyV2lkdGhzW3IuTF09dGhpcy5jaGFyV2lkdGhzW3IuRU5dPXRoaXMuY2hhcldpZHRoc1tyLk9OX1JdPXQsdGhpcy5jaGFyV2lkdGhzW3IuUl09dGhpcy5jaGFyV2lkdGhzW3IuQU5dPW4sdGhpcy5jaGFyV2lkdGhzW3IuUl9IXT1uKi40NSx0aGlzLmNoYXJXaWR0aHNbci5CXT10aGlzLmNoYXJXaWR0aHNbci5STEVdPTAsdGhpcy5jdXJyZW50Um93PW51bGx9LHRoaXMuc2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oZSl7dGhpcy5zaG93SW52aXNpYmxlcz1lLHRoaXMuY3VycmVudFJvdz1udWxsfSx0aGlzLnNldEVvbENoYXI9ZnVuY3Rpb24oZSl7dGhpcy5FT0w9ZX0sdGhpcy5zZXRDb250ZW50V2lkdGg9ZnVuY3Rpb24oZSl7dGhpcy5jb250ZW50V2lkdGg9ZX0sdGhpcy5pc1J0bExpbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJGlzUnRsPyEwOmUhPXVuZGVmaW5lZD90aGlzLnNlc3Npb24uZ2V0TGluZShlKS5jaGFyQXQoMCk9PXRoaXMuUkxFOnRoaXMuaXNSdGxEaXJ9LHRoaXMuc2V0UnRsRGlyZWN0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRDdXJzb3JQb3NpdGlvbigpO2Zvcih2YXIgcj1lLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb25BbmNob3IoKS5yb3c7cjw9bi5yb3c7cisrKSF0JiZlLnNlc3Npb24uZ2V0TGluZShyKS5jaGFyQXQoMCk9PT1lLnNlc3Npb24uJGJpZGlIYW5kbGVyLlJMRT9lLnNlc3Npb24uZG9jLnJlbW92ZUluTGluZShyLDAsMSk6dCYmZS5zZXNzaW9uLmdldExpbmUocikuY2hhckF0KDApIT09ZS5zZXNzaW9uLiRiaWRpSGFuZGxlci5STEUmJmUuc2Vzc2lvbi5kb2MuaW5zZXJ0KHtjb2x1bW46MCxyb3c6cn0sZS5zZXNzaW9uLiRiaWRpSGFuZGxlci5STEUpfSx0aGlzLmdldFBvc0xlZnQ9ZnVuY3Rpb24oZSl7ZS09dGhpcy53cmFwSW5kZW50O3ZhciB0PXRoaXMubGluZS5jaGFyQXQoMCk9PT10aGlzLlJMRT8xOjAsbj1lPnQ/dGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpP2U6ZS0xOnQsaT1yLmdldFZpc3VhbEZyb21Mb2dpY2FsSWR4KG4sdGhpcy5iaWRpTWFwKSxzPXRoaXMuYmlkaU1hcC5iaWRpTGV2ZWxzLG89MDshdGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpJiZlPD10JiZzW2ldJTIhPT0wJiZpKys7Zm9yKHZhciB1PTA7dTxpO3UrKylvKz10aGlzLmNoYXJXaWR0aHNbc1t1XV07cmV0dXJuIXRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKSYmZT50JiZzW2ldJTI9PT0wJiYobys9dGhpcy5jaGFyV2lkdGhzW3NbaV1dKSx0aGlzLndyYXBJbmRlbnQmJihvKz10aGlzLmlzUnRsRGlyPy0xKnRoaXMud3JhcE9mZnNldDp0aGlzLndyYXBPZmZzZXQpLHRoaXMuaXNSdGxEaXImJihvKz10aGlzLnJ0bExpbmVPZmZzZXQpLG99LHRoaXMuZ2V0U2VsZWN0aW9ucz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYmlkaU1hcCxyPW4uYmlkaUxldmVscyxpLHM9W10sbz0wLHU9TWF0aC5taW4oZSx0KS10aGlzLndyYXBJbmRlbnQsYT1NYXRoLm1heChlLHQpLXRoaXMud3JhcEluZGVudCxmPSExLGw9ITEsYz0wO3RoaXMud3JhcEluZGVudCYmKG8rPXRoaXMuaXNSdGxEaXI/LTEqdGhpcy53cmFwT2Zmc2V0OnRoaXMud3JhcE9mZnNldCk7Zm9yKHZhciBoLHA9MDtwPHIubGVuZ3RoO3ArKyloPW4ubG9naWNhbEZyb21WaXN1YWxbcF0saT1yW3BdLGY9aD49dSYmaDxhLGYmJiFsP2M9bzohZiYmbCYmcy5wdXNoKHtsZWZ0OmMsd2lkdGg6by1jfSksbys9dGhpcy5jaGFyV2lkdGhzW2ldLGw9ZjtmJiZwPT09ci5sZW5ndGgmJnMucHVzaCh7bGVmdDpjLHdpZHRoOm8tY30pO2lmKHRoaXMuaXNSdGxEaXIpZm9yKHZhciBkPTA7ZDxzLmxlbmd0aDtkKyspc1tkXS5sZWZ0Kz10aGlzLnJ0bExpbmVPZmZzZXQ7cmV0dXJuIHN9LHRoaXMub2Zmc2V0VG9Db2w9ZnVuY3Rpb24oZSl7dGhpcy5pc1J0bERpciYmKGUtPXRoaXMucnRsTGluZU9mZnNldCk7dmFyIHQ9MCxlPU1hdGgubWF4KGUsMCksbj0wLHI9MCxpPXRoaXMuYmlkaU1hcC5iaWRpTGV2ZWxzLHM9dGhpcy5jaGFyV2lkdGhzW2lbcl1dO3RoaXMud3JhcEluZGVudCYmKGUtPXRoaXMuaXNSdGxEaXI/LTEqdGhpcy53cmFwT2Zmc2V0OnRoaXMud3JhcE9mZnNldCk7d2hpbGUoZT5uK3MvMil7bis9cztpZihyPT09aS5sZW5ndGgtMSl7cz0wO2JyZWFrfXM9dGhpcy5jaGFyV2lkdGhzW2lbKytyXV19cmV0dXJuIHI+MCYmaVtyLTFdJTIhPT0wJiZpW3JdJTI9PT0wPyhlPG4mJnItLSx0PXRoaXMuYmlkaU1hcC5sb2dpY2FsRnJvbVZpc3VhbFtyXSk6cj4wJiZpW3ItMV0lMj09PTAmJmlbcl0lMiE9PTA/dD0xKyhlPm4/dGhpcy5iaWRpTWFwLmxvZ2ljYWxGcm9tVmlzdWFsW3JdOnRoaXMuYmlkaU1hcC5sb2dpY2FsRnJvbVZpc3VhbFtyLTFdKTp0aGlzLmlzUnRsRGlyJiZyPT09aS5sZW5ndGgtMSYmcz09PTAmJmlbci0xXSUyPT09MHx8IXRoaXMuaXNSdGxEaXImJnI9PT0wJiZpW3JdJTIhPT0wP3Q9MSt0aGlzLmJpZGlNYXAubG9naWNhbEZyb21WaXN1YWxbcl06KHI+MCYmaVtyLTFdJTIhPT0wJiZzIT09MCYmci0tLHQ9dGhpcy5iaWRpTWFwLmxvZ2ljYWxGcm9tVmlzdWFsW3JdKSx0PT09MCYmdGhpcy5pc1J0bERpciYmdCsrLHQrdGhpcy53cmFwSW5kZW50fX0pLmNhbGwoby5wcm90b3R5cGUpLHQuQmlkaUhhbmRsZXI9b30pLGFjZS5kZWZpbmUoImFjZS9zZWxlY3Rpb24iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9sYW5nIikscz1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLG89ZSgiLi9yYW5nZSIpLlJhbmdlLHU9ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uPWUsdGhpcy5kb2M9ZS5nZXREb2N1bWVudCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLmN1cnNvcj10aGlzLmxlYWQ9dGhpcy5kb2MuY3JlYXRlQW5jaG9yKDAsMCksdGhpcy5hbmNob3I9dGhpcy5kb2MuY3JlYXRlQW5jaG9yKDAsMCksdGhpcy4kc2lsZW50PSExO3ZhciB0PXRoaXM7dGhpcy5jdXJzb3Iub24oImNoYW5nZSIsZnVuY3Rpb24oZSl7dC4kY3Vyc29yQ2hhbmdlZD0hMCx0LiRzaWxlbnR8fHQuX2VtaXQoImNoYW5nZUN1cnNvciIpLCF0LiRpc0VtcHR5JiYhdC4kc2lsZW50JiZ0Ll9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKSwhdC4ka2VlcERlc2lyZWRDb2x1bW5PbkNoYW5nZSYmZS5vbGQuY29sdW1uIT1lLnZhbHVlLmNvbHVtbiYmKHQuJGRlc2lyZWRDb2x1bW49bnVsbCl9KSx0aGlzLmFuY2hvci5vbigiY2hhbmdlIixmdW5jdGlvbigpe3QuJGFuY2hvckNoYW5nZWQ9ITAsIXQuJGlzRW1wdHkmJiF0LiRzaWxlbnQmJnQuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpfSl9OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMscyksdGhpcy5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGlzRW1wdHl8fHRoaXMuYW5jaG9yLnJvdz09dGhpcy5sZWFkLnJvdyYmdGhpcy5hbmNob3IuY29sdW1uPT10aGlzLmxlYWQuY29sdW1ufSx0aGlzLmlzTXVsdGlMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuJGlzRW1wdHkmJnRoaXMuYW5jaG9yLnJvdyE9dGhpcy5jdXJzb3Iucm93fSx0aGlzLmdldEN1cnNvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlYWQuZ2V0UG9zaXRpb24oKX0sdGhpcy5zZXRTZWxlY3Rpb25BbmNob3I9ZnVuY3Rpb24oZSx0KXt0aGlzLiRpc0VtcHR5PSExLHRoaXMuYW5jaG9yLnNldFBvc2l0aW9uKGUsdCl9LHRoaXMuZ2V0QW5jaG9yPXRoaXMuZ2V0U2VsZWN0aW9uQW5jaG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGlzRW1wdHk/dGhpcy5nZXRTZWxlY3Rpb25MZWFkKCk6dGhpcy5hbmNob3IuZ2V0UG9zaXRpb24oKX0sdGhpcy5nZXRTZWxlY3Rpb25MZWFkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVhZC5nZXRQb3NpdGlvbigpfSx0aGlzLmlzQmFja3dhcmRzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5hbmNob3IsdD10aGlzLmxlYWQ7cmV0dXJuIGUucm93PnQucm93fHxlLnJvdz09dC5yb3cmJmUuY29sdW1uPnQuY29sdW1ufSx0aGlzLmdldFJhbmdlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5hbmNob3IsdD10aGlzLmxlYWQ7cmV0dXJuIHRoaXMuJGlzRW1wdHk/by5mcm9tUG9pbnRzKHQsdCk6dGhpcy5pc0JhY2t3YXJkcygpP28uZnJvbVBvaW50cyh0LGUpOm8uZnJvbVBvaW50cyhlLHQpfSx0aGlzLmNsZWFyU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dGhpcy4kaXNFbXB0eXx8KHRoaXMuJGlzRW1wdHk9ITAsdGhpcy5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uIikpfSx0aGlzLnNlbGVjdEFsbD1mdW5jdGlvbigpe3RoaXMuJHNldFNlbGVjdGlvbigwLDAsTnVtYmVyLk1BWF9WQUxVRSxOdW1iZXIuTUFYX1ZBTFVFKX0sdGhpcy5zZXRSYW5nZT10aGlzLnNldFNlbGVjdGlvblJhbmdlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dD9lLmVuZDplLnN0YXJ0LHI9dD9lLnN0YXJ0OmUuZW5kO3RoaXMuJHNldFNlbGVjdGlvbihuLnJvdyxuLmNvbHVtbixyLnJvdyxyLmNvbHVtbil9LHRoaXMuJHNldFNlbGVjdGlvbj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLiRpc0VtcHR5LHM9dGhpcy5pbk11bHRpU2VsZWN0TW9kZTt0aGlzLiRzaWxlbnQ9ITAsdGhpcy4kY3Vyc29yQ2hhbmdlZD10aGlzLiRhbmNob3JDaGFuZ2VkPSExLHRoaXMuYW5jaG9yLnNldFBvc2l0aW9uKGUsdCksdGhpcy5jdXJzb3Iuc2V0UG9zaXRpb24obixyKSx0aGlzLiRpc0VtcHR5PSFvLmNvbXBhcmVQb2ludHModGhpcy5hbmNob3IsdGhpcy5jdXJzb3IpLHRoaXMuJHNpbGVudD0hMSx0aGlzLiRjdXJzb3JDaGFuZ2VkJiZ0aGlzLl9lbWl0KCJjaGFuZ2VDdXJzb3IiKSwodGhpcy4kY3Vyc29yQ2hhbmdlZHx8dGhpcy4kYW5jaG9yQ2hhbmdlZHx8aSE9dGhpcy4kaXNFbXB0eXx8cykmJnRoaXMuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpfSx0aGlzLiRtb3ZlU2VsZWN0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubGVhZDt0aGlzLiRpc0VtcHR5JiZ0aGlzLnNldFNlbGVjdGlvbkFuY2hvcih0LnJvdyx0LmNvbHVtbiksZS5jYWxsKHRoaXMpfSx0aGlzLnNlbGVjdFRvPWZ1bmN0aW9uKGUsdCl7dGhpcy4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvclRvKGUsdCl9KX0sdGhpcy5zZWxlY3RUb1Bvc2l0aW9uPWZ1bmN0aW9uKGUpe3RoaXMuJG1vdmVTZWxlY3Rpb24oZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGUpfSl9LHRoaXMubW92ZVRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5jbGVhclNlbGVjdGlvbigpLHRoaXMubW92ZUN1cnNvclRvKGUsdCl9LHRoaXMubW92ZVRvUG9zaXRpb249ZnVuY3Rpb24oZSl7dGhpcy5jbGVhclNlbGVjdGlvbigpLHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oZSl9LHRoaXMuc2VsZWN0VXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvclVwKX0sdGhpcy5zZWxlY3REb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JEb3duKX0sdGhpcy5zZWxlY3RSaWdodD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yUmlnaHQpfSx0aGlzLnNlbGVjdExlZnQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckxlZnQpfSx0aGlzLnNlbGVjdExpbmVTdGFydD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yTGluZVN0YXJ0KX0sdGhpcy5zZWxlY3RMaW5lRW5kPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JMaW5lRW5kKX0sdGhpcy5zZWxlY3RGaWxlRW5kPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JGaWxlRW5kKX0sdGhpcy5zZWxlY3RGaWxlU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckZpbGVTdGFydCl9LHRoaXMuc2VsZWN0V29yZFJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JXb3JkUmlnaHQpfSx0aGlzLnNlbGVjdFdvcmRMZWZ0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JXb3JkTGVmdCl9LHRoaXMuZ2V0V29yZFJhbmdlPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIHQ9PSJ1bmRlZmluZWQiKXt2YXIgbj1lfHx0aGlzLmxlYWQ7ZT1uLnJvdyx0PW4uY29sdW1ufXJldHVybiB0aGlzLnNlc3Npb24uZ2V0V29yZFJhbmdlKGUsdCl9LHRoaXMuc2VsZWN0V29yZD1mdW5jdGlvbigpe3RoaXMuc2V0U2VsZWN0aW9uUmFuZ2UodGhpcy5nZXRXb3JkUmFuZ2UoKSl9LHRoaXMuc2VsZWN0QVdvcmQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEN1cnNvcigpLHQ9dGhpcy5zZXNzaW9uLmdldEFXb3JkUmFuZ2UoZS5yb3csZS5jb2x1bW4pO3RoaXMuc2V0U2VsZWN0aW9uUmFuZ2UodCl9LHRoaXMuZ2V0TGluZVJhbmdlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGU9PSJudW1iZXIiP2U6dGhpcy5sZWFkLnJvdyxyLGk9dGhpcy5zZXNzaW9uLmdldEZvbGRMaW5lKG4pO3JldHVybiBpPyhuPWkuc3RhcnQucm93LHI9aS5lbmQucm93KTpyPW4sdD09PSEwP25ldyBvKG4sMCxyLHRoaXMuc2Vzc2lvbi5nZXRMaW5lKHIpLmxlbmd0aCk6bmV3IG8obiwwLHIrMSwwKX0sdGhpcy5zZWxlY3RMaW5lPWZ1bmN0aW9uKCl7dGhpcy5zZXRTZWxlY3Rpb25SYW5nZSh0aGlzLmdldExpbmVSYW5nZSgpKX0sdGhpcy5tb3ZlQ3Vyc29yVXA9ZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JCeSgtMSwwKX0sdGhpcy5tb3ZlQ3Vyc29yRG93bj1mdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvckJ5KDEsMCl9LHRoaXMud291bGRNb3ZlSW50b1NvZnRUYWI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuY29sdW1uLGk9ZS5jb2x1bW4rdDtyZXR1cm4gbjwwJiYocj1lLmNvbHVtbi10LGk9ZS5jb2x1bW4pLHRoaXMuc2Vzc2lvbi5pc1RhYlN0b3AoZSkmJnRoaXMuZG9jLmdldExpbmUoZS5yb3cpLnNsaWNlKHIsaSkuc3BsaXQoIiAiKS5sZW5ndGgtMT09dH0sdGhpcy5tb3ZlQ3Vyc29yTGVmdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5nZXRQb3NpdGlvbigpLHQ7aWYodD10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUucm93LGUuY29sdW1uLC0xKSl0aGlzLm1vdmVDdXJzb3JUbyh0LnN0YXJ0LnJvdyx0LnN0YXJ0LmNvbHVtbik7ZWxzZSBpZihlLmNvbHVtbj09PTApZS5yb3c+MCYmdGhpcy5tb3ZlQ3Vyc29yVG8oZS5yb3ctMSx0aGlzLmRvYy5nZXRMaW5lKGUucm93LTEpLmxlbmd0aCk7ZWxzZXt2YXIgbj10aGlzLnNlc3Npb24uZ2V0VGFiU2l6ZSgpO3RoaXMud291bGRNb3ZlSW50b1NvZnRUYWIoZSxuLC0xKSYmIXRoaXMuc2Vzc2lvbi5nZXROYXZpZ2F0ZVdpdGhpblNvZnRUYWJzKCk/dGhpcy5tb3ZlQ3Vyc29yQnkoMCwtbik6dGhpcy5tb3ZlQ3Vyc29yQnkoMCwtMSl9fSx0aGlzLm1vdmVDdXJzb3JSaWdodD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5nZXRQb3NpdGlvbigpLHQ7aWYodD10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUucm93LGUuY29sdW1uLDEpKXRoaXMubW92ZUN1cnNvclRvKHQuZW5kLnJvdyx0LmVuZC5jb2x1bW4pO2Vsc2UgaWYodGhpcy5sZWFkLmNvbHVtbj09dGhpcy5kb2MuZ2V0TGluZSh0aGlzLmxlYWQucm93KS5sZW5ndGgpdGhpcy5sZWFkLnJvdzx0aGlzLmRvYy5nZXRMZW5ndGgoKS0xJiZ0aGlzLm1vdmVDdXJzb3JUbyh0aGlzLmxlYWQucm93KzEsMCk7ZWxzZXt2YXIgbj10aGlzLnNlc3Npb24uZ2V0VGFiU2l6ZSgpLGU9dGhpcy5sZWFkO3RoaXMud291bGRNb3ZlSW50b1NvZnRUYWIoZSxuLDEpJiYhdGhpcy5zZXNzaW9uLmdldE5hdmlnYXRlV2l0aGluU29mdFRhYnMoKT90aGlzLm1vdmVDdXJzb3JCeSgwLG4pOnRoaXMubW92ZUN1cnNvckJ5KDAsMSl9fSx0aGlzLm1vdmVDdXJzb3JMaW5lU3RhcnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQucm93LHQ9dGhpcy5sZWFkLmNvbHVtbixuPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUm93KGUsdCkscj10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKG4sMCksaT10aGlzLnNlc3Npb24uZ2V0RGlzcGxheUxpbmUoZSxudWxsLHIucm93LHIuY29sdW1uKSxzPWkubWF0Y2goL15ccyovKTtzWzBdLmxlbmd0aCE9dCYmIXRoaXMuc2Vzc2lvbi4kdXNlRW1hY3NTdHlsZUxpbmVTdGFydCYmKHIuY29sdW1uKz1zWzBdLmxlbmd0aCksdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihyKX0sdGhpcy5tb3ZlQ3Vyc29yTGluZUVuZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZCx0PXRoaXMuc2Vzc2lvbi5nZXREb2N1bWVudExhc3RSb3dDb2x1bW5Qb3NpdGlvbihlLnJvdyxlLmNvbHVtbik7aWYodGhpcy5sZWFkLmNvbHVtbj09dC5jb2x1bW4pe3ZhciBuPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKHQucm93KTtpZih0LmNvbHVtbj09bi5sZW5ndGgpe3ZhciByPW4uc2VhcmNoKC9ccyskLyk7cj4wJiYodC5jb2x1bW49cil9fXRoaXMubW92ZUN1cnNvclRvKHQucm93LHQuY29sdW1uKX0sdGhpcy5tb3ZlQ3Vyc29yRmlsZUVuZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZG9jLmdldExlbmd0aCgpLTEsdD10aGlzLmRvYy5nZXRMaW5lKGUpLmxlbmd0aDt0aGlzLm1vdmVDdXJzb3JUbyhlLHQpfSx0aGlzLm1vdmVDdXJzb3JGaWxlU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JUbygwLDApfSx0aGlzLm1vdmVDdXJzb3JMb25nV29yZFJpZ2h0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLnJvdyx0PXRoaXMubGVhZC5jb2x1bW4sbj10aGlzLmRvYy5nZXRMaW5lKGUpLHI9bi5zdWJzdHJpbmcodCk7dGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4PTAsdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4PTA7dmFyIGk9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLHQsMSk7aWYoaSl7dGhpcy5tb3ZlQ3Vyc29yVG8oaS5lbmQucm93LGkuZW5kLmNvbHVtbik7cmV0dXJufXRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmV4ZWMocikmJih0Kz10aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXgsdGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4PTAscj1uLnN1YnN0cmluZyh0KSk7aWYodD49bi5sZW5ndGgpe3RoaXMubW92ZUN1cnNvclRvKGUsbi5sZW5ndGgpLHRoaXMubW92ZUN1cnNvclJpZ2h0KCksZTx0aGlzLmRvYy5nZXRMZW5ndGgoKS0xJiZ0aGlzLm1vdmVDdXJzb3JXb3JkUmlnaHQoKTtyZXR1cm59dGhpcy5zZXNzaW9uLnRva2VuUmUuZXhlYyhyKSYmKHQrPXRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleCx0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg9MCksdGhpcy5tb3ZlQ3Vyc29yVG8oZSx0KX0sdGhpcy5tb3ZlQ3Vyc29yTG9uZ1dvcmRMZWZ0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLnJvdyx0PXRoaXMubGVhZC5jb2x1bW4sbjtpZihuPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZSx0LC0xKSl7dGhpcy5tb3ZlQ3Vyc29yVG8obi5zdGFydC5yb3csbi5zdGFydC5jb2x1bW4pO3JldHVybn12YXIgcj10aGlzLnNlc3Npb24uZ2V0Rm9sZFN0cmluZ0F0KGUsdCwtMSk7cj09bnVsbCYmKHI9dGhpcy5kb2MuZ2V0TGluZShlKS5zdWJzdHJpbmcoMCx0KSk7dmFyIHM9aS5zdHJpbmdSZXZlcnNlKHIpO3RoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleD0wLHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleD0wLHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmV4ZWMocykmJih0LT10aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXgscz1zLnNsaWNlKHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleCksdGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4PTApO2lmKHQ8PTApe3RoaXMubW92ZUN1cnNvclRvKGUsMCksdGhpcy5tb3ZlQ3Vyc29yTGVmdCgpLGU+MCYmdGhpcy5tb3ZlQ3Vyc29yV29yZExlZnQoKTtyZXR1cm59dGhpcy5zZXNzaW9uLnRva2VuUmUuZXhlYyhzKSYmKHQtPXRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleCx0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg9MCksdGhpcy5tb3ZlQ3Vyc29yVG8oZSx0KX0sdGhpcy4kc2hvcnRXb3JkRW5kSW5kZXg9ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuLHI9L1xzLyxpPXRoaXMuc2Vzc2lvbi50b2tlblJlO2kubGFzdEluZGV4PTA7aWYodGhpcy5zZXNzaW9uLnRva2VuUmUuZXhlYyhlKSl0PXRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleDtlbHNle3doaWxlKChuPWVbdF0pJiZyLnRlc3QobikpdCsrO2lmKHQ8MSl7aS5sYXN0SW5kZXg9MDt3aGlsZSgobj1lW3RdKSYmIWkudGVzdChuKSl7aS5sYXN0SW5kZXg9MCx0Kys7aWYoci50ZXN0KG4pKXtpZih0PjIpe3QtLTticmVha313aGlsZSgobj1lW3RdKSYmci50ZXN0KG4pKXQrKztpZih0PjIpYnJlYWt9fX19cmV0dXJuIGkubGFzdEluZGV4PTAsdH0sdGhpcy5tb3ZlQ3Vyc29yU2hvcnRXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQucm93LHQ9dGhpcy5sZWFkLmNvbHVtbixuPXRoaXMuZG9jLmdldExpbmUoZSkscj1uLnN1YnN0cmluZyh0KSxpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZSx0LDEpO2lmKGkpcmV0dXJuIHRoaXMubW92ZUN1cnNvclRvKGkuZW5kLnJvdyxpLmVuZC5jb2x1bW4pO2lmKHQ9PW4ubGVuZ3RoKXt2YXIgcz10aGlzLmRvYy5nZXRMZW5ndGgoKTtkbyBlKysscj10aGlzLmRvYy5nZXRMaW5lKGUpO3doaWxlKGU8cyYmL15ccyokLy50ZXN0KHIpKTsvXlxzKy8udGVzdChyKXx8KHI9IiIpLHQ9MH12YXIgbz10aGlzLiRzaG9ydFdvcmRFbmRJbmRleChyKTt0aGlzLm1vdmVDdXJzb3JUbyhlLHQrbyl9LHRoaXMubW92ZUN1cnNvclNob3J0V29yZExlZnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQucm93LHQ9dGhpcy5sZWFkLmNvbHVtbixuO2lmKG49dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLHQsLTEpKXJldHVybiB0aGlzLm1vdmVDdXJzb3JUbyhuLnN0YXJ0LnJvdyxuLnN0YXJ0LmNvbHVtbik7dmFyIHI9dGhpcy5zZXNzaW9uLmdldExpbmUoZSkuc3Vic3RyaW5nKDAsdCk7aWYodD09PTApe2RvIGUtLSxyPXRoaXMuZG9jLmdldExpbmUoZSk7d2hpbGUoZT4wJiYvXlxzKiQvLnRlc3QocikpO3Q9ci5sZW5ndGgsL1xzKyQvLnRlc3Qocil8fChyPSIiKX12YXIgcz1pLnN0cmluZ1JldmVyc2Uociksbz10aGlzLiRzaG9ydFdvcmRFbmRJbmRleChzKTtyZXR1cm4gdGhpcy5tb3ZlQ3Vyc29yVG8oZSx0LW8pfSx0aGlzLm1vdmVDdXJzb3JXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24uJHNlbGVjdExvbmdXb3Jkcz90aGlzLm1vdmVDdXJzb3JMb25nV29yZFJpZ2h0KCk6dGhpcy5tb3ZlQ3Vyc29yU2hvcnRXb3JkUmlnaHQoKX0sdGhpcy5tb3ZlQ3Vyc29yV29yZExlZnQ9ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24uJHNlbGVjdExvbmdXb3Jkcz90aGlzLm1vdmVDdXJzb3JMb25nV29yZExlZnQoKTp0aGlzLm1vdmVDdXJzb3JTaG9ydFdvcmRMZWZ0KCl9LHRoaXMubW92ZUN1cnNvckJ5PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmxlYWQucm93LHRoaXMubGVhZC5jb2x1bW4pLHI7dD09PTAmJihlIT09MCYmKHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KG4ucm93LHRoaXMubGVhZC5yb3cpPyhyPXRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuZ2V0UG9zTGVmdChuLmNvbHVtbiksbi5jb2x1bW49TWF0aC5yb3VuZChyL3RoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuY2hhcldpZHRoc1swXSkpOnI9bi5jb2x1bW4qdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5jaGFyV2lkdGhzWzBdKSx0aGlzLiRkZXNpcmVkQ29sdW1uP24uY29sdW1uPXRoaXMuJGRlc2lyZWRDb2x1bW46dGhpcy4kZGVzaXJlZENvbHVtbj1uLmNvbHVtbik7dmFyIGk9dGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihuLnJvdytlLG4uY29sdW1uLHIpO2UhPT0wJiZ0PT09MCYmaS5yb3c9PT10aGlzLmxlYWQucm93JiZpLmNvbHVtbj09PXRoaXMubGVhZC5jb2x1bW4mJnRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cyYmdGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzW2kucm93XSYmKGkucm93PjB8fGU+MCkmJmkucm93KyssdGhpcy5tb3ZlQ3Vyc29yVG8oaS5yb3csaS5jb2x1bW4rdCx0PT09MCl9LHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb249ZnVuY3Rpb24oZSl7dGhpcy5tb3ZlQ3Vyc29yVG8oZS5yb3csZS5jb2x1bW4pfSx0aGlzLm1vdmVDdXJzb3JUbz1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLHQsMSk7ciYmKGU9ci5zdGFydC5yb3csdD1yLnN0YXJ0LmNvbHVtbiksdGhpcy4ka2VlcERlc2lyZWRDb2x1bW5PbkNoYW5nZT0hMDt2YXIgaT10aGlzLnNlc3Npb24uZ2V0TGluZShlKTsvW1x1REMwMC1cdURGRkZdLy50ZXN0KGkuY2hhckF0KHQpKSYmaS5jaGFyQXQodC0xKSYmKHRoaXMubGVhZC5yb3c9PWUmJnRoaXMubGVhZC5jb2x1bW49PXQrMT90LT0xOnQrPTEpLHRoaXMubGVhZC5zZXRQb3NpdGlvbihlLHQpLHRoaXMuJGtlZXBEZXNpcmVkQ29sdW1uT25DaGFuZ2U9ITEsbnx8KHRoaXMuJGRlc2lyZWRDb2x1bW49bnVsbCl9LHRoaXMubW92ZUN1cnNvclRvU2NyZWVuPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGUsdCk7dGhpcy5tb3ZlQ3Vyc29yVG8oci5yb3csci5jb2x1bW4sbil9LHRoaXMuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5sZWFkLmRldGFjaCgpLHRoaXMuYW5jaG9yLmRldGFjaCgpLHRoaXMuc2Vzc2lvbj10aGlzLmRvYz1udWxsfSx0aGlzLmZyb21PcmllbnRlZFJhbmdlPWZ1bmN0aW9uKGUpe3RoaXMuc2V0U2VsZWN0aW9uUmFuZ2UoZSxlLmN1cnNvcj09ZS5zdGFydCksdGhpcy4kZGVzaXJlZENvbHVtbj1lLmRlc2lyZWRDb2x1bW58fHRoaXMuJGRlc2lyZWRDb2x1bW59LHRoaXMudG9PcmllbnRlZFJhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0UmFuZ2UoKTtyZXR1cm4gZT8oZS5zdGFydC5jb2x1bW49dC5zdGFydC5jb2x1bW4sZS5zdGFydC5yb3c9dC5zdGFydC5yb3csZS5lbmQuY29sdW1uPXQuZW5kLmNvbHVtbixlLmVuZC5yb3c9dC5lbmQucm93KTplPXQsZS5jdXJzb3I9dGhpcy5pc0JhY2t3YXJkcygpP2Uuc3RhcnQ6ZS5lbmQsZS5kZXNpcmVkQ29sdW1uPXRoaXMuJGRlc2lyZWRDb2x1bW4sZX0sdGhpcy5nZXRSYW5nZU9mTW92ZW1lbnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0Q3Vyc29yKCk7dHJ5e2UodGhpcyk7dmFyIG49dGhpcy5nZXRDdXJzb3IoKTtyZXR1cm4gby5mcm9tUG9pbnRzKHQsbil9Y2F0Y2gocil7cmV0dXJuIG8uZnJvbVBvaW50cyh0LHQpfWZpbmFsbHl7dGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbih0KX19LHRoaXMudG9KU09OPWZ1bmN0aW9uKCl7aWYodGhpcy5yYW5nZUNvdW50KXZhciBlPXRoaXMucmFuZ2VzLm1hcChmdW5jdGlvbihlKXt2YXIgdD1lLmNsb25lKCk7cmV0dXJuIHQuaXNCYWNrd2FyZHM9ZS5jdXJzb3I9PWUuc3RhcnQsdH0pO2Vsc2V7dmFyIGU9dGhpcy5nZXRSYW5nZSgpO2UuaXNCYWNrd2FyZHM9dGhpcy5pc0JhY2t3YXJkcygpfXJldHVybiBlfSx0aGlzLmZyb21KU09OPWZ1bmN0aW9uKGUpe2lmKGUuc3RhcnQ9PXVuZGVmaW5lZCl7aWYodGhpcy5yYW5nZUxpc3QmJmUubGVuZ3RoPjEpe3RoaXMudG9TaW5nbGVSYW5nZShlWzBdKTtmb3IodmFyIHQ9ZS5sZW5ndGg7dC0tOyl7dmFyIG49by5mcm9tUG9pbnRzKGVbdF0uc3RhcnQsZVt0XS5lbmQpO2VbdF0uaXNCYWNrd2FyZHMmJihuLmN1cnNvcj1uLnN0YXJ0KSx0aGlzLmFkZFJhbmdlKG4sITApfXJldHVybn1lPWVbMF19dGhpcy5yYW5nZUxpc3QmJnRoaXMudG9TaW5nbGVSYW5nZShlKSx0aGlzLnNldFNlbGVjdGlvblJhbmdlKGUsZS5pc0JhY2t3YXJkcyl9LHRoaXMuaXNFcXVhbD1mdW5jdGlvbihlKXtpZigoZS5sZW5ndGh8fHRoaXMucmFuZ2VDb3VudCkmJmUubGVuZ3RoIT10aGlzLnJhbmdlQ291bnQpcmV0dXJuITE7aWYoIWUubGVuZ3RofHwhdGhpcy5yYW5nZXMpcmV0dXJuIHRoaXMuZ2V0UmFuZ2UoKS5pc0VxdWFsKGUpO2Zvcih2YXIgdD10aGlzLnJhbmdlcy5sZW5ndGg7dC0tOylpZighdGhpcy5yYW5nZXNbdF0uaXNFcXVhbChlW3RdKSlyZXR1cm4hMTtyZXR1cm4hMH19KS5jYWxsKHUucHJvdG90eXBlKSx0LlNlbGVjdGlvbj11fSksYWNlLmRlZmluZSgiYWNlL3Rva2VuaXplciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9jb25maWciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vY29uZmlnIiksaT0yZTMscz1mdW5jdGlvbihlKXt0aGlzLnN0YXRlcz1lLHRoaXMucmVnRXhwcz17fSx0aGlzLm1hdGNoTWFwcGluZ3M9e307Zm9yKHZhciB0IGluIHRoaXMuc3RhdGVzKXt2YXIgbj10aGlzLnN0YXRlc1t0XSxyPVtdLGk9MCxzPXRoaXMubWF0Y2hNYXBwaW5nc1t0XT17ZGVmYXVsdFRva2VuOiJ0ZXh0In0sbz0iZyIsdT1bXTtmb3IodmFyIGE9MDthPG4ubGVuZ3RoO2ErKyl7dmFyIGY9blthXTtmLmRlZmF1bHRUb2tlbiYmKHMuZGVmYXVsdFRva2VuPWYuZGVmYXVsdFRva2VuKSxmLmNhc2VJbnNlbnNpdGl2ZSYmKG89ImdpIik7aWYoZi5yZWdleD09bnVsbCljb250aW51ZTtmLnJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwJiYoZi5yZWdleD1mLnJlZ2V4LnRvU3RyaW5nKCkuc2xpY2UoMSwtMSkpO3ZhciBsPWYucmVnZXgsYz0obmV3IFJlZ0V4cCgiKD86KCIrbCsiKXwoLikpIikpLmV4ZWMoImEiKS5sZW5ndGgtMjtBcnJheS5pc0FycmF5KGYudG9rZW4pP2YudG9rZW4ubGVuZ3RoPT0xfHxjPT0xP2YudG9rZW49Zi50b2tlblswXTpjLTEhPWYudG9rZW4ubGVuZ3RoPyh0aGlzLnJlcG9ydEVycm9yKCJudW1iZXIgb2YgY2xhc3NlcyBhbmQgcmVnZXhwIGdyb3VwcyBkb2Vzbid0IG1hdGNoIix7cnVsZTpmLGdyb3VwQ291bnQ6Yy0xfSksZi50b2tlbj1mLnRva2VuWzBdKTooZi50b2tlbkFycmF5PWYudG9rZW4sZi50b2tlbj1udWxsLGYub25NYXRjaD10aGlzLiRhcnJheVRva2Vucyk6dHlwZW9mIGYudG9rZW49PSJmdW5jdGlvbiImJiFmLm9uTWF0Y2gmJihjPjE/Zi5vbk1hdGNoPXRoaXMuJGFwcGx5VG9rZW46Zi5vbk1hdGNoPWYudG9rZW4pLGM+MSYmKC9cXFxkLy50ZXN0KGYucmVnZXgpP2w9Zi5yZWdleC5yZXBsYWNlKC9cXChbMC05XSspL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4iXFwiKyhwYXJzZUludCh0LDEwKStpKzEpfSk6KGM9MSxsPXRoaXMucmVtb3ZlQ2FwdHVyaW5nR3JvdXBzKGYucmVnZXgpKSwhZi5zcGxpdFJlZ2V4JiZ0eXBlb2YgZi50b2tlbiE9InN0cmluZyImJnUucHVzaChmKSksc1tpXT1hLGkrPWMsci5wdXNoKGwpLGYub25NYXRjaHx8KGYub25NYXRjaD1udWxsKX1yLmxlbmd0aHx8KHNbMF09MCxyLnB1c2goIiQiKSksdS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc3BsaXRSZWdleD10aGlzLmNyZWF0ZVNwbGl0dGVyUmVnZXhwKGUucmVnZXgsbyl9LHRoaXMpLHRoaXMucmVnRXhwc1t0XT1uZXcgUmVnRXhwKCIoIityLmpvaW4oIil8KCIpKyIpfCgkKSIsbyl9fTsoZnVuY3Rpb24oKXt0aGlzLiRzZXRNYXhUb2tlbkNvdW50PWZ1bmN0aW9uKGUpe2k9ZXwwfSx0aGlzLiRhcHBseVRva2VuPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc3BsaXRSZWdleC5leGVjKGUpLnNsaWNlKDEpLG49dGhpcy50b2tlbi5hcHBseSh0aGlzLHQpO2lmKHR5cGVvZiBuPT0ic3RyaW5nIilyZXR1cm5be3R5cGU6bix2YWx1ZTplfV07dmFyIHI9W107Zm9yKHZhciBpPTAscz1uLmxlbmd0aDtpPHM7aSsrKXRbaV0mJihyW3IubGVuZ3RoXT17dHlwZTpuW2ldLHZhbHVlOnRbaV19KTtyZXR1cm4gcn0sdGhpcy4kYXJyYXlUb2tlbnM9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuW107dmFyIHQ9dGhpcy5zcGxpdFJlZ2V4LmV4ZWMoZSk7aWYoIXQpcmV0dXJuInRleHQiO3ZhciBuPVtdLHI9dGhpcy50b2tlbkFycmF5O2Zvcih2YXIgaT0wLHM9ci5sZW5ndGg7aTxzO2krKyl0W2krMV0mJihuW24ubGVuZ3RoXT17dHlwZTpyW2ldLHZhbHVlOnRbaSsxXX0pO3JldHVybiBufSx0aGlzLnJlbW92ZUNhcHR1cmluZ0dyb3Vwcz1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL1xcLnxcWyg/OlxcLnxbXlxcXF1dKSp8XChcP1s6PSFdfChcKCkvZyxmdW5jdGlvbihlLHQpe3JldHVybiB0PyIoPzoiOmV9KTtyZXR1cm4gdH0sdGhpcy5jcmVhdGVTcGxpdHRlclJlZ2V4cD1mdW5jdGlvbihlLHQpe2lmKGUuaW5kZXhPZigiKD89IikhPS0xKXt2YXIgbj0wLHI9ITEsaT17fTtlLnJlcGxhY2UoLyhcXC4pfChcKCg/Olw/Wz0hXSk/KXwoXCkpfChbXFtcXV0pL2csZnVuY3Rpb24oZSx0LHMsbyx1LGEpe3JldHVybiByP3I9dSE9Il0iOnU/cj0hMDpvPyhuPT1pLnN0YWNrJiYoaS5lbmQ9YSsxLGkuc3RhY2s9LTEpLG4tLSk6cyYmKG4rKyxzLmxlbmd0aCE9MSYmKGkuc3RhY2s9bixpLnN0YXJ0PWEpKSxlfSksaS5lbmQhPW51bGwmJi9eXCkqJC8udGVzdChlLnN1YnN0cihpLmVuZCkpJiYoZT1lLnN1YnN0cmluZygwLGkuc3RhcnQpK2Uuc3Vic3RyKGkuZW5kKSl9cmV0dXJuIGUuY2hhckF0KDApIT0iXiImJihlPSJeIitlKSxlLmNoYXJBdChlLmxlbmd0aC0xKSE9IiQiJiYoZSs9IiQiKSxuZXcgUmVnRXhwKGUsKHR8fCIiKS5yZXBsYWNlKCJnIiwiIikpfSx0aGlzLmdldExpbmVUb2tlbnM9ZnVuY3Rpb24oZSx0KXtpZih0JiZ0eXBlb2YgdCE9InN0cmluZyIpe3ZhciBuPXQuc2xpY2UoMCk7dD1uWzBdLHQ9PT0iI3RtcCImJihuLnNoaWZ0KCksdD1uLnNoaWZ0KCkpfWVsc2UgdmFyIG49W107dmFyIHI9dHx8InN0YXJ0IixzPXRoaXMuc3RhdGVzW3JdO3N8fChyPSJzdGFydCIscz10aGlzLnN0YXRlc1tyXSk7dmFyIG89dGhpcy5tYXRjaE1hcHBpbmdzW3JdLHU9dGhpcy5yZWdFeHBzW3JdO3UubGFzdEluZGV4PTA7dmFyIGEsZj1bXSxsPTAsYz0wLGg9e3R5cGU6bnVsbCx2YWx1ZToiIn07d2hpbGUoYT11LmV4ZWMoZSkpe3ZhciBwPW8uZGVmYXVsdFRva2VuLGQ9bnVsbCx2PWFbMF0sbT11Lmxhc3RJbmRleDtpZihtLXYubGVuZ3RoPmwpe3ZhciBnPWUuc3Vic3RyaW5nKGwsbS12Lmxlbmd0aCk7aC50eXBlPT1wP2gudmFsdWUrPWc6KGgudHlwZSYmZi5wdXNoKGgpLGg9e3R5cGU6cCx2YWx1ZTpnfSl9Zm9yKHZhciB5PTA7eTxhLmxlbmd0aC0yO3krKyl7aWYoYVt5KzFdPT09dW5kZWZpbmVkKWNvbnRpbnVlO2Q9c1tvW3ldXSxkLm9uTWF0Y2g/cD1kLm9uTWF0Y2godixyLG4sZSk6cD1kLnRva2VuLGQubmV4dCYmKHR5cGVvZiBkLm5leHQ9PSJzdHJpbmciP3I9ZC5uZXh0OnI9ZC5uZXh0KHIsbikscz10aGlzLnN0YXRlc1tyXSxzfHwodGhpcy5yZXBvcnRFcnJvcigic3RhdGUgZG9lc24ndCBleGlzdCIscikscj0ic3RhcnQiLHM9dGhpcy5zdGF0ZXNbcl0pLG89dGhpcy5tYXRjaE1hcHBpbmdzW3JdLGw9bSx1PXRoaXMucmVnRXhwc1tyXSx1Lmxhc3RJbmRleD1tKSxkLmNvbnN1bWVMaW5lRW5kJiYobD1tKTticmVha31pZih2KWlmKHR5cGVvZiBwPT0ic3RyaW5nIikhIWQmJmQubWVyZ2U9PT0hMXx8aC50eXBlIT09cD8oaC50eXBlJiZmLnB1c2goaCksaD17dHlwZTpwLHZhbHVlOnZ9KTpoLnZhbHVlKz12O2Vsc2UgaWYocCl7aC50eXBlJiZmLnB1c2goaCksaD17dHlwZTpudWxsLHZhbHVlOiIifTtmb3IodmFyIHk9MDt5PHAubGVuZ3RoO3krKylmLnB1c2gocFt5XSl9aWYobD09ZS5sZW5ndGgpYnJlYWs7bD1tO2lmKGMrKz5pKXtjPjIqZS5sZW5ndGgmJnRoaXMucmVwb3J0RXJyb3IoImluZmluaXRlIGxvb3Agd2l0aCBpbiBhY2UgdG9rZW5pemVyIix7c3RhcnRTdGF0ZTp0LGxpbmU6ZX0pO3doaWxlKGw8ZS5sZW5ndGgpaC50eXBlJiZmLnB1c2goaCksaD17dmFsdWU6ZS5zdWJzdHJpbmcobCxsKz01MDApLHR5cGU6Im92ZXJmbG93In07cj0ic3RhcnQiLG49W107YnJlYWt9fXJldHVybiBoLnR5cGUmJmYucHVzaChoKSxuLmxlbmd0aD4xJiZuWzBdIT09ciYmbi51bnNoaWZ0KCIjdG1wIixyKSx7dG9rZW5zOmYsc3RhdGU6bi5sZW5ndGg/bjpyfX0sdGhpcy5yZXBvcnRFcnJvcj1yLnJlcG9ydEVycm9yfSkuY2FsbChzLnByb3RvdHlwZSksdC5Ub2tlbml6ZXI9c30pLGFjZS5kZWZpbmUoImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvbGFuZyIpLGk9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiZW1wdHlfbGluZSIscmVnZXg6Il4kIn0se2RlZmF1bHRUb2tlbjoidGV4dCJ9XX19OyhmdW5jdGlvbigpe3RoaXMuYWRkUnVsZXM9ZnVuY3Rpb24oZSx0KXtpZighdCl7Zm9yKHZhciBuIGluIGUpdGhpcy4kcnVsZXNbbl09ZVtuXTtyZXR1cm59Zm9yKHZhciBuIGluIGUpe3ZhciByPWVbbl07Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBzPXJbaV07aWYocy5uZXh0fHxzLm9uTWF0Y2gpdHlwZW9mIHMubmV4dD09InN0cmluZyImJnMubmV4dC5pbmRleE9mKHQpIT09MCYmKHMubmV4dD10K3MubmV4dCkscy5uZXh0U3RhdGUmJnMubmV4dFN0YXRlLmluZGV4T2YodCkhPT0wJiYocy5uZXh0U3RhdGU9dCtzLm5leHRTdGF0ZSl9dGhpcy4kcnVsZXNbdCtuXT1yfX0sdGhpcy5nZXRSdWxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRydWxlc30sdGhpcy5lbWJlZFJ1bGVzPWZ1bmN0aW9uKGUsdCxuLGkscyl7dmFyIG89dHlwZW9mIGU9PSJmdW5jdGlvbiI/KG5ldyBlKS5nZXRSdWxlcygpOmU7aWYoaSlmb3IodmFyIHU9MDt1PGkubGVuZ3RoO3UrKylpW3VdPXQraVt1XTtlbHNle2k9W107Zm9yKHZhciBhIGluIG8paS5wdXNoKHQrYSl9dGhpcy5hZGRSdWxlcyhvLHQpO2lmKG4pe3ZhciBmPUFycmF5LnByb3RvdHlwZVtzPyJwdXNoIjoidW5zaGlmdCJdO2Zvcih2YXIgdT0wO3U8aS5sZW5ndGg7dSsrKWYuYXBwbHkodGhpcy4kcnVsZXNbaVt1XV0sci5kZWVwQ29weShuKSl9dGhpcy4kZW1iZWRzfHwodGhpcy4kZW1iZWRzPVtdKSx0aGlzLiRlbWJlZHMucHVzaCh0KX0sdGhpcy5nZXRFbWJlZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZW1iZWRzfTt2YXIgZT1mdW5jdGlvbihlLHQpe3JldHVybihlIT0ic3RhcnQifHx0Lmxlbmd0aCkmJnQudW5zaGlmdCh0aGlzLm5leHRTdGF0ZSxlKSx0aGlzLm5leHRTdGF0ZX0sdD1mdW5jdGlvbihlLHQpe3JldHVybiB0LnNoaWZ0KCksdC5zaGlmdCgpfHwic3RhcnQifTt0aGlzLm5vcm1hbGl6ZVJ1bGVzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaShzKXt2YXIgbz1yW3NdO28ucHJvY2Vzc2VkPSEwO2Zvcih2YXIgdT0wO3U8by5sZW5ndGg7dSsrKXt2YXIgYT1vW3VdLGY9bnVsbDtBcnJheS5pc0FycmF5KGEpJiYoZj1hLGE9e30pLCFhLnJlZ2V4JiZhLnN0YXJ0JiYoYS5yZWdleD1hLnN0YXJ0LGEubmV4dHx8KGEubmV4dD1bXSksYS5uZXh0LnB1c2goe2RlZmF1bHRUb2tlbjphLnRva2VufSx7dG9rZW46YS50b2tlbisiLmVuZCIscmVnZXg6YS5lbmR8fGEuc3RhcnQsbmV4dDoicG9wIn0pLGEudG9rZW49YS50b2tlbisiLnN0YXJ0IixhLnB1c2g9ITApO3ZhciBsPWEubmV4dHx8YS5wdXNoO2lmKGwmJkFycmF5LmlzQXJyYXkobCkpe3ZhciBjPWEuc3RhdGVOYW1lO2N8fChjPWEudG9rZW4sdHlwZW9mIGMhPSJzdHJpbmciJiYoYz1jWzBdfHwiIikscltjXSYmKGMrPW4rKykpLHJbY109bCxhLm5leHQ9YyxpKGMpfWVsc2UgbD09InBvcCImJihhLm5leHQ9dCk7YS5wdXNoJiYoYS5uZXh0U3RhdGU9YS5uZXh0fHxhLnB1c2gsYS5uZXh0PWUsZGVsZXRlIGEucHVzaCk7aWYoYS5ydWxlcylmb3IodmFyIGggaW4gYS5ydWxlcylyW2hdP3JbaF0ucHVzaCYmcltoXS5wdXNoLmFwcGx5KHJbaF0sYS5ydWxlc1toXSk6cltoXT1hLnJ1bGVzW2hdO3ZhciBwPXR5cGVvZiBhPT0ic3RyaW5nIj9hOmEuaW5jbHVkZTtwJiYoQXJyYXkuaXNBcnJheShwKT9mPXAubWFwKGZ1bmN0aW9uKGUpe3JldHVybiByW2VdfSk6Zj1yW3BdKTtpZihmKXt2YXIgZD1bdSwxXS5jb25jYXQoZik7YS5ub0VzY2FwZSYmKGQ9ZC5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUubmV4dH0pKSxvLnNwbGljZS5hcHBseShvLGQpLHUtLX1hLmtleXdvcmRNYXAmJihhLnRva2VuPXRoaXMuY3JlYXRlS2V5d29yZE1hcHBlcihhLmtleXdvcmRNYXAsYS5kZWZhdWx0VG9rZW58fCJ0ZXh0IixhLmNhc2VJbnNlbnNpdGl2ZSksZGVsZXRlIGEuZGVmYXVsdFRva2VuKX19dmFyIG49MCxyPXRoaXMuJHJ1bGVzO09iamVjdC5rZXlzKHIpLmZvckVhY2goaSx0aGlzKX0sdGhpcy5jcmVhdGVLZXl3b3JkTWFwcGVyPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIHM9ZVt0XTtuJiYocz1zLnRvTG93ZXJDYXNlKCkpO3ZhciBvPXMuc3BsaXQocnx8InwiKTtmb3IodmFyIHU9by5sZW5ndGg7dS0tOylpW29bdV1dPXR9KSxPYmplY3QuZ2V0UHJvdG90eXBlT2YoaSkmJihpLl9fcHJvdG9fXz1udWxsKSx0aGlzLiRrZXl3b3JkTGlzdD1PYmplY3Qua2V5cyhpKSxlPW51bGwsbj9mdW5jdGlvbihlKXtyZXR1cm4gaVtlLnRvTG93ZXJDYXNlKCldfHx0fTpmdW5jdGlvbihlKXtyZXR1cm4gaVtlXXx8dH19LHRoaXMuZ2V0S2V5d29yZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4ka2V5d29yZHN9fSkuY2FsbChpLnByb3RvdHlwZSksdC5UZXh0SGlnaGxpZ2h0UnVsZXM9aX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oKXt0aGlzLiRiZWhhdmlvdXJzPXt9fTsoZnVuY3Rpb24oKXt0aGlzLmFkZD1mdW5jdGlvbihlLHQsbil7c3dpdGNoKHVuZGVmaW5lZCl7Y2FzZSB0aGlzLiRiZWhhdmlvdXJzOnRoaXMuJGJlaGF2aW91cnM9e307Y2FzZSB0aGlzLiRiZWhhdmlvdXJzW2VdOnRoaXMuJGJlaGF2aW91cnNbZV09e319dGhpcy4kYmVoYXZpb3Vyc1tlXVt0XT1ufSx0aGlzLmFkZEJlaGF2aW91cnM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpZm9yKHZhciBuIGluIGVbdF0pdGhpcy5hZGQodCxuLGVbdF1bbl0pfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihlKXt0aGlzLiRiZWhhdmlvdXJzJiZ0aGlzLiRiZWhhdmlvdXJzW2VdJiZkZWxldGUgdGhpcy4kYmVoYXZpb3Vyc1tlXX0sdGhpcy5pbmhlcml0PWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpdmFyIG49KG5ldyBlKS5nZXRCZWhhdmlvdXJzKHQpO2Vsc2UgdmFyIG49ZS5nZXRCZWhhdmlvdXJzKHQpO3RoaXMuYWRkQmVoYXZpb3VycyhuKX0sdGhpcy5nZXRCZWhhdmlvdXJzPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiB0aGlzLiRiZWhhdmlvdXJzO3ZhciB0PXt9O2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRoaXMuJGJlaGF2aW91cnNbZVtuXV0mJih0W2Vbbl1dPXRoaXMuJGJlaGF2aW91cnNbZVtuXV0pO3JldHVybiB0fX0pLmNhbGwoci5wcm90b3R5cGUpLHQuQmVoYXZpb3VyPXJ9KSxhY2UuZGVmaW5lKCJhY2UvdG9rZW5faXRlcmF0b3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vcmFuZ2UiKS5SYW5nZSxpPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLiRzZXNzaW9uPWUsdGhpcy4kcm93PXQsdGhpcy4kcm93VG9rZW5zPWUuZ2V0VG9rZW5zKHQpO3ZhciByPWUuZ2V0VG9rZW5BdCh0LG4pO3RoaXMuJHRva2VuSW5kZXg9cj9yLmluZGV4Oi0xfTsoZnVuY3Rpb24oKXt0aGlzLnN0ZXBCYWNrd2FyZD1mdW5jdGlvbigpe3RoaXMuJHRva2VuSW5kZXgtPTE7d2hpbGUodGhpcy4kdG9rZW5JbmRleDwwKXt0aGlzLiRyb3ctPTE7aWYodGhpcy4kcm93PDApcmV0dXJuIHRoaXMuJHJvdz0wLG51bGw7dGhpcy4kcm93VG9rZW5zPXRoaXMuJHNlc3Npb24uZ2V0VG9rZW5zKHRoaXMuJHJvdyksdGhpcy4kdG9rZW5JbmRleD10aGlzLiRyb3dUb2tlbnMubGVuZ3RoLTF9cmV0dXJuIHRoaXMuJHJvd1Rva2Vuc1t0aGlzLiR0b2tlbkluZGV4XX0sdGhpcy5zdGVwRm9yd2FyZD1mdW5jdGlvbigpe3RoaXMuJHRva2VuSW5kZXgrPTE7dmFyIGU7d2hpbGUodGhpcy4kdG9rZW5JbmRleD49dGhpcy4kcm93VG9rZW5zLmxlbmd0aCl7dGhpcy4kcm93Kz0xLGV8fChlPXRoaXMuJHNlc3Npb24uZ2V0TGVuZ3RoKCkpO2lmKHRoaXMuJHJvdz49ZSlyZXR1cm4gdGhpcy4kcm93PWUtMSxudWxsO3RoaXMuJHJvd1Rva2Vucz10aGlzLiRzZXNzaW9uLmdldFRva2Vucyh0aGlzLiRyb3cpLHRoaXMuJHRva2VuSW5kZXg9MH1yZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdfSx0aGlzLmdldEN1cnJlbnRUb2tlbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyb3dUb2tlbnNbdGhpcy4kdG9rZW5JbmRleF19LHRoaXMuZ2V0Q3VycmVudFRva2VuUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvd30sdGhpcy5nZXRDdXJyZW50VG9rZW5Db2x1bW49ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRyb3dUb2tlbnMsdD10aGlzLiR0b2tlbkluZGV4LG49ZVt0XS5zdGFydDtpZihuIT09dW5kZWZpbmVkKXJldHVybiBuO249MDt3aGlsZSh0PjApdC09MSxuKz1lW3RdLnZhbHVlLmxlbmd0aDtyZXR1cm4gbn0sdGhpcy5nZXRDdXJyZW50VG9rZW5Qb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybntyb3c6dGhpcy4kcm93LGNvbHVtbjp0aGlzLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfX0sdGhpcy5nZXRDdXJyZW50VG9rZW5SYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJHJvd1Rva2Vuc1t0aGlzLiR0b2tlbkluZGV4XSx0PXRoaXMuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCk7cmV0dXJuIG5ldyByKHRoaXMuJHJvdyx0LHRoaXMuJHJvdyx0K2UudmFsdWUubGVuZ3RoKX19KS5jYWxsKGkucHJvdG90eXBlKSx0LlRva2VuSXRlcmF0b3I9aX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciIsImFjZS90b2tlbl9pdGVyYXRvciIsImFjZS9saWIvbGFuZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vLi4vbGliL29vcCIpLGk9ZSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLHM9ZSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLG89ZSgiLi4vLi4vbGliL2xhbmciKSx1PVsidGV4dCIsInBhcmVuLnJwYXJlbiIsInJwYXJlbiIsInBhcmVuIiwicHVuY3R1YXRpb24ub3BlcmF0b3IiXSxhPVsidGV4dCIsInBhcmVuLnJwYXJlbiIsInJwYXJlbiIsInBhcmVuIiwicHVuY3R1YXRpb24ub3BlcmF0b3IiLCJjb21tZW50Il0sZixsPXt9LGM9eyciJzonIicsIiciOiInIn0saD1mdW5jdGlvbihlKXt2YXIgdD0tMTtlLm11bHRpU2VsZWN0JiYodD1lLnNlbGVjdGlvbi5pbmRleCxsLnJhbmdlQ291bnQhPWUubXVsdGlTZWxlY3QucmFuZ2VDb3VudCYmKGw9e3JhbmdlQ291bnQ6ZS5tdWx0aVNlbGVjdC5yYW5nZUNvdW50fSkpO2lmKGxbdF0pcmV0dXJuIGY9bFt0XTtmPWxbdF09e2F1dG9JbnNlcnRlZEJyYWNrZXRzOjAsYXV0b0luc2VydGVkUm93Oi0xLGF1dG9JbnNlcnRlZExpbmVFbmQ6IiIsbWF5YmVJbnNlcnRlZEJyYWNrZXRzOjAsbWF5YmVJbnNlcnRlZFJvdzotMSxtYXliZUluc2VydGVkTGluZVN0YXJ0OiIiLG1heWJlSW5zZXJ0ZWRMaW5lRW5kOiIifX0scD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1lLmVuZC5yb3ctZS5zdGFydC5yb3c7cmV0dXJue3RleHQ6bit0K3Isc2VsZWN0aW9uOlswLGUuc3RhcnQuY29sdW1uKzEsaSxlLmVuZC5jb2x1bW4rKGk/MDoxKV19fSxkPWZ1bmN0aW9uKGUpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKHQsbixyLGkscyl7dmFyIHU9ci5nZXRDdXJzb3JQb3NpdGlvbigpLGE9aS5kb2MuZ2V0TGluZSh1LnJvdyk7aWYocz09InsiKXtoKHIpO3ZhciBsPXIuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxjPWkuZG9jLmdldFRleHRSYW5nZShsKTtpZihjIT09IiImJmMhPT0ieyImJnIuZ2V0V3JhcEJlaGF2aW91cnNFbmFibGVkKCkpcmV0dXJuIHAobCxjLCJ7IiwifSIpO2lmKGQuaXNTYW5lSW5zZXJ0aW9uKHIsaSkpcmV0dXJuL1tcXVx9XCldLy50ZXN0KGFbdS5jb2x1bW5dKXx8ci5pbk11bHRpU2VsZWN0TW9kZXx8ZSYmZS5icmFjZXM/KGQucmVjb3JkQXV0b0luc2VydChyLGksIn0iKSx7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX0pOihkLnJlY29yZE1heWJlSW5zZXJ0KHIsaSwieyIpLHt0ZXh0OiJ7IixzZWxlY3Rpb246WzEsMV19KX1lbHNlIGlmKHM9PSJ9Iil7aChyKTt2YXIgdj1hLnN1YnN0cmluZyh1LmNvbHVtbix1LmNvbHVtbisxKTtpZih2PT0ifSIpe3ZhciBtPWkuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjp1LmNvbHVtbisxLHJvdzp1LnJvd30pO2lmKG0hPT1udWxsJiZkLmlzQXV0b0luc2VydGVkQ2xvc2luZyh1LGEscykpcmV0dXJuIGQucG9wQXV0b0luc2VydGVkQ2xvc2luZygpLHt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2V7aWYocz09IlxuInx8cz09IlxyXG4iKXtoKHIpO3ZhciBnPSIiO2QuaXNNYXliZUluc2VydGVkQ2xvc2luZyh1LGEpJiYoZz1vLnN0cmluZ1JlcGVhdCgifSIsZi5tYXliZUluc2VydGVkQnJhY2tldHMpLGQuY2xlYXJNYXliZUluc2VydGVkQ2xvc2luZygpKTt2YXIgdj1hLnN1YnN0cmluZyh1LmNvbHVtbix1LmNvbHVtbisxKTtpZih2PT09In0iKXt2YXIgeT1pLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzp1LnJvdyxjb2x1bW46dS5jb2x1bW4rMX0sIn0iKTtpZigheSlyZXR1cm4gbnVsbDt2YXIgYj10aGlzLiRnZXRJbmRlbnQoaS5nZXRMaW5lKHkucm93KSl9ZWxzZXtpZighZyl7ZC5jbGVhck1heWJlSW5zZXJ0ZWRDbG9zaW5nKCk7cmV0dXJufXZhciBiPXRoaXMuJGdldEluZGVudChhKX12YXIgdz1iK2kuZ2V0VGFiU3RyaW5nKCk7cmV0dXJue3RleHQ6IlxuIit3KyJcbiIrYitnLHNlbGVjdGlvbjpbMSx3Lmxlbmd0aCwxLHcubGVuZ3RoXX19ZC5jbGVhck1heWJlSW5zZXJ0ZWRDbG9zaW5nKCl9fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXIuZG9jLmdldFRleHRSYW5nZShpKTtpZighaS5pc011bHRpTGluZSgpJiZzPT0ieyIpe2gobik7dmFyIG89ci5kb2MuZ2V0TGluZShpLnN0YXJ0LnJvdyksdT1vLnN1YnN0cmluZyhpLmVuZC5jb2x1bW4saS5lbmQuY29sdW1uKzEpO2lmKHU9PSJ9IilyZXR1cm4gaS5lbmQuY29sdW1uKyssaTtmLm1heWJlSW5zZXJ0ZWRCcmFja2V0cy0tfX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoaT09IigiKXtoKG4pO3ZhciBzPW4uZ2V0U2VsZWN0aW9uUmFuZ2UoKSxvPXIuZG9jLmdldFRleHRSYW5nZShzKTtpZihvIT09IiImJm4uZ2V0V3JhcEJlaGF2aW91cnNFbmFibGVkKCkpcmV0dXJuIHAocyxvLCIoIiwiKSIpO2lmKGQuaXNTYW5lSW5zZXJ0aW9uKG4scikpcmV0dXJuIGQucmVjb3JkQXV0b0luc2VydChuLHIsIikiKSx7dGV4dDoiKCkiLHNlbGVjdGlvbjpbMSwxXX19ZWxzZSBpZihpPT0iKSIpe2gobik7dmFyIHU9bi5nZXRDdXJzb3JQb3NpdGlvbigpLGE9ci5kb2MuZ2V0TGluZSh1LnJvdyksZj1hLnN1YnN0cmluZyh1LmNvbHVtbix1LmNvbHVtbisxKTtpZihmPT0iKSIpe3ZhciBsPXIuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjp1LmNvbHVtbisxLHJvdzp1LnJvd30pO2lmKGwhPT1udWxsJiZkLmlzQXV0b0luc2VydGVkQ2xvc2luZyh1LGEsaSkpcmV0dXJuIGQucG9wQXV0b0luc2VydGVkQ2xvc2luZygpLHt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz1yLmRvYy5nZXRUZXh0UmFuZ2UoaSk7aWYoIWkuaXNNdWx0aUxpbmUoKSYmcz09IigiKXtoKG4pO3ZhciBvPXIuZG9jLmdldExpbmUoaS5zdGFydC5yb3cpLHU9by5zdWJzdHJpbmcoaS5zdGFydC5jb2x1bW4rMSxpLnN0YXJ0LmNvbHVtbisyKTtpZih1PT0iKSIpcmV0dXJuIGkuZW5kLmNvbHVtbisrLGl9fSksdGhpcy5hZGQoImJyYWNrZXRzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe2lmKGk9PSJbIil7aChuKTt2YXIgcz1uLmdldFNlbGVjdGlvblJhbmdlKCksbz1yLmRvYy5nZXRUZXh0UmFuZ2Uocyk7aWYobyE9PSIiJiZuLmdldFdyYXBCZWhhdmlvdXJzRW5hYmxlZCgpKXJldHVybiBwKHMsbywiWyIsIl0iKTtpZihkLmlzU2FuZUluc2VydGlvbihuLHIpKXJldHVybiBkLnJlY29yZEF1dG9JbnNlcnQobixyLCJdIikse3RleHQ6IltdIixzZWxlY3Rpb246WzEsMV19fWVsc2UgaWYoaT09Il0iKXtoKG4pO3ZhciB1PW4uZ2V0Q3Vyc29yUG9zaXRpb24oKSxhPXIuZG9jLmdldExpbmUodS5yb3cpLGY9YS5zdWJzdHJpbmcodS5jb2x1bW4sdS5jb2x1bW4rMSk7aWYoZj09Il0iKXt2YXIgbD1yLiRmaW5kT3BlbmluZ0JyYWNrZXQoIl0iLHtjb2x1bW46dS5jb2x1bW4rMSxyb3c6dS5yb3d9KTtpZihsIT09bnVsbCYmZC5pc0F1dG9JbnNlcnRlZENsb3NpbmcodSxhLGkpKXJldHVybiBkLnBvcEF1dG9JbnNlcnRlZENsb3NpbmcoKSx7dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgiYnJhY2tldHMiLCJkZWxldGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz1yLmRvYy5nZXRUZXh0UmFuZ2UoaSk7aWYoIWkuaXNNdWx0aUxpbmUoKSYmcz09IlsiKXtoKG4pO3ZhciBvPXIuZG9jLmdldExpbmUoaS5zdGFydC5yb3cpLHU9by5zdWJzdHJpbmcoaS5zdGFydC5jb2x1bW4rMSxpLnN0YXJ0LmNvbHVtbisyKTtpZih1PT0iXSIpcmV0dXJuIGkuZW5kLmNvbHVtbisrLGl9fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXIuJG1vZGUuJHF1b3Rlc3x8YztpZihpLmxlbmd0aD09MSYmc1tpXSl7aWYodGhpcy5saW5lQ29tbWVudFN0YXJ0JiZ0aGlzLmxpbmVDb21tZW50U3RhcnQuaW5kZXhPZihpKSE9LTEpcmV0dXJuO2gobik7dmFyIG89aSx1PW4uZ2V0U2VsZWN0aW9uUmFuZ2UoKSxhPXIuZG9jLmdldFRleHRSYW5nZSh1KTtpZihhIT09IiImJihhLmxlbmd0aCE9MXx8IXNbYV0pJiZuLmdldFdyYXBCZWhhdmlvdXJzRW5hYmxlZCgpKXJldHVybiBwKHUsYSxvLG8pO2lmKCFhKXt2YXIgZj1uLmdldEN1cnNvclBvc2l0aW9uKCksbD1yLmRvYy5nZXRMaW5lKGYucm93KSxkPWwuc3Vic3RyaW5nKGYuY29sdW1uLTEsZi5jb2x1bW4pLHY9bC5zdWJzdHJpbmcoZi5jb2x1bW4sZi5jb2x1bW4rMSksbT1yLmdldFRva2VuQXQoZi5yb3csZi5jb2x1bW4pLGc9ci5nZXRUb2tlbkF0KGYucm93LGYuY29sdW1uKzEpO2lmKGQ9PSJcXCImJm0mJi9lc2NhcGUvLnRlc3QobS50eXBlKSlyZXR1cm4gbnVsbDt2YXIgeT1tJiYvc3RyaW5nfGVzY2FwZS8udGVzdChtLnR5cGUpLGI9IWd8fC9zdHJpbmd8ZXNjYXBlLy50ZXN0KGcudHlwZSksdztpZih2PT1vKXc9eSE9PWIsdyYmL3N0cmluZ1wuZW5kLy50ZXN0KGcudHlwZSkmJih3PSExKTtlbHNle2lmKHkmJiFiKXJldHVybiBudWxsO2lmKHkmJmIpcmV0dXJuIG51bGw7dmFyIEU9ci4kbW9kZS50b2tlblJlO0UubGFzdEluZGV4PTA7dmFyIFM9RS50ZXN0KGQpO0UubGFzdEluZGV4PTA7dmFyIHg9RS50ZXN0KGQpO2lmKFN8fHgpcmV0dXJuIG51bGw7aWYodiYmIS9bXHM7LC59KVxdXFxdLy50ZXN0KHYpKXJldHVybiBudWxsO3ZhciBUPWxbZi5jb2x1bW4tMl07aWYoIShkIT1vfHxUIT1vJiYhRS50ZXN0KFQpKSlyZXR1cm4gbnVsbDt3PSEwfXJldHVybnt0ZXh0Onc/bytvOiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXIuJG1vZGUuJHF1b3Rlc3x8YyxvPXIuZG9jLmdldFRleHRSYW5nZShpKTtpZighaS5pc011bHRpTGluZSgpJiZzLmhhc093blByb3BlcnR5KG8pKXtoKG4pO3ZhciB1PXIuZG9jLmdldExpbmUoaS5zdGFydC5yb3cpLGE9dS5zdWJzdHJpbmcoaS5zdGFydC5jb2x1bW4rMSxpLnN0YXJ0LmNvbHVtbisyKTtpZihhPT1vKXJldHVybiBpLmVuZC5jb2x1bW4rKyxpfX0pfTtkLmlzU2FuZUluc2VydGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0Q3Vyc29yUG9zaXRpb24oKSxyPW5ldyBzKHQsbi5yb3csbi5jb2x1bW4pO2lmKCF0aGlzLiRtYXRjaFRva2VuVHlwZShyLmdldEN1cnJlbnRUb2tlbigpfHwidGV4dCIsdSkpe2lmKC9bKX1cXV0vLnRlc3QoZS5zZXNzaW9uLmdldExpbmUobi5yb3cpW24uY29sdW1uXSkpcmV0dXJuITA7dmFyIGk9bmV3IHModCxuLnJvdyxuLmNvbHVtbisxKTtpZighdGhpcy4kbWF0Y2hUb2tlblR5cGUoaS5nZXRDdXJyZW50VG9rZW4oKXx8InRleHQiLHUpKXJldHVybiExfXJldHVybiByLnN0ZXBGb3J3YXJkKCksci5nZXRDdXJyZW50VG9rZW5Sb3coKSE9PW4ucm93fHx0aGlzLiRtYXRjaFRva2VuVHlwZShyLmdldEN1cnJlbnRUb2tlbigpfHwidGV4dCIsYSl9LGQuJG1hdGNoVG9rZW5UeXBlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuaW5kZXhPZihlLnR5cGV8fGUpPi0xfSxkLnJlY29yZEF1dG9JbnNlcnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPXQuZG9jLmdldExpbmUoci5yb3cpO3RoaXMuaXNBdXRvSW5zZXJ0ZWRDbG9zaW5nKHIsaSxmLmF1dG9JbnNlcnRlZExpbmVFbmRbMF0pfHwoZi5hdXRvSW5zZXJ0ZWRCcmFja2V0cz0wKSxmLmF1dG9JbnNlcnRlZFJvdz1yLnJvdyxmLmF1dG9JbnNlcnRlZExpbmVFbmQ9bitpLnN1YnN0cihyLmNvbHVtbiksZi5hdXRvSW5zZXJ0ZWRCcmFja2V0cysrfSxkLnJlY29yZE1heWJlSW5zZXJ0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmdldEN1cnNvclBvc2l0aW9uKCksaT10LmRvYy5nZXRMaW5lKHIucm93KTt0aGlzLmlzTWF5YmVJbnNlcnRlZENsb3NpbmcocixpKXx8KGYubWF5YmVJbnNlcnRlZEJyYWNrZXRzPTApLGYubWF5YmVJbnNlcnRlZFJvdz1yLnJvdyxmLm1heWJlSW5zZXJ0ZWRMaW5lU3RhcnQ9aS5zdWJzdHIoMCxyLmNvbHVtbikrbixmLm1heWJlSW5zZXJ0ZWRMaW5lRW5kPWkuc3Vic3RyKHIuY29sdW1uKSxmLm1heWJlSW5zZXJ0ZWRCcmFja2V0cysrfSxkLmlzQXV0b0luc2VydGVkQ2xvc2luZz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGYuYXV0b0luc2VydGVkQnJhY2tldHM+MCYmZS5yb3c9PT1mLmF1dG9JbnNlcnRlZFJvdyYmbj09PWYuYXV0b0luc2VydGVkTGluZUVuZFswXSYmdC5zdWJzdHIoZS5jb2x1bW4pPT09Zi5hdXRvSW5zZXJ0ZWRMaW5lRW5kfSxkLmlzTWF5YmVJbnNlcnRlZENsb3Npbmc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZi5tYXliZUluc2VydGVkQnJhY2tldHM+MCYmZS5yb3c9PT1mLm1heWJlSW5zZXJ0ZWRSb3cmJnQuc3Vic3RyKGUuY29sdW1uKT09PWYubWF5YmVJbnNlcnRlZExpbmVFbmQmJnQuc3Vic3RyKDAsZS5jb2x1bW4pPT1mLm1heWJlSW5zZXJ0ZWRMaW5lU3RhcnR9LGQucG9wQXV0b0luc2VydGVkQ2xvc2luZz1mdW5jdGlvbigpe2YuYXV0b0luc2VydGVkTGluZUVuZD1mLmF1dG9JbnNlcnRlZExpbmVFbmQuc3Vic3RyKDEpLGYuYXV0b0luc2VydGVkQnJhY2tldHMtLX0sZC5jbGVhck1heWJlSW5zZXJ0ZWRDbG9zaW5nPWZ1bmN0aW9uKCl7ZiYmKGYubWF5YmVJbnNlcnRlZEJyYWNrZXRzPTAsZi5tYXliZUluc2VydGVkUm93PS0xKX0sci5pbmhlcml0cyhkLGkpLHQuQ3N0eWxlQmVoYXZpb3VyPWR9KSxhY2UuZGVmaW5lKCJhY2UvdW5pY29kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9WzQ4LDksOCwyNSw1LDAsMiwyNSw0OCwwLDExLDAsNSwwLDYsMjIsMiwzMCwyLDQ1Nyw1LDExLDE1LDQsOCwwLDIsMCwxOCwxMTYsMiwxLDMsMyw5LDAsMiwyLDIsMCwyLDE5LDIsODIsMiwxMzgsMiw0LDMsMTU1LDEyLDM3LDMsMCw4LDM4LDEwLDQ0LDIsMCwyLDEsMiwxLDIsMCw5LDI2LDYsMiwzMCwxMCw3LDYxLDIsOSw1LDEwMSwyLDcsMyw5LDIsMTgsMywwLDE3LDU4LDMsMTAwLDE1LDUzLDUsMCw2LDQ1LDIxMSw1NywzLDE4LDIsNSwzLDExLDMsOSwyLDEsNyw2LDIsMiwyLDcsMywxLDMsMjEsMiw2LDIsMCw0LDMsMyw4LDMsMSwzLDMsOSwwLDUsMSwyLDQsMywxMSwxNiwyLDIsNSw1LDEsMywyMSwyLDYsMiwxLDIsMSwyLDEsMywwLDIsNCw1LDEsMywyLDQsMCw4LDMsMiwwLDgsMTUsMTIsMiwyLDgsMiwyLDIsMjEsMiw2LDIsMSwyLDQsMyw5LDIsMiwyLDIsMywwLDE2LDMsMyw5LDE4LDIsMiw3LDMsMSwzLDIxLDIsNiwyLDEsMiw0LDMsOCwzLDEsMywyLDksMSw1LDEsMiw0LDMsOSwyLDAsMTcsMSwyLDUsNCwyLDIsMyw0LDEsMiwwLDIsMSw0LDEsNCwyLDQsMTEsNSw0LDQsMiwyLDMsMywwLDcsMCwxNSw5LDE4LDIsMiw3LDIsMiwyLDIyLDIsOSwyLDQsNCw3LDIsMiwyLDMsOCwxLDIsMSw3LDMsMyw5LDE5LDEsMiw3LDIsMiwyLDIyLDIsOSwyLDQsMyw4LDIsMiwyLDMsOCwxLDgsMCwyLDMsMyw5LDE5LDEsMiw3LDIsMiwyLDIyLDIsMTUsNCw3LDIsMiwyLDMsMTAsMCw5LDMsMyw5LDExLDUsMywxLDIsMTcsNCwyMywyLDgsMiwwLDMsNiw0LDAsNSw1LDIsMCwyLDcsMTksMSwxNCw1Nyw2LDE0LDIsOSw0MCwxLDIsMCwzLDEsMiwwLDMsMCw3LDMsMiw2LDIsMiwyLDAsMiwwLDMsMSwyLDEyLDIsMiwzLDQsMiwwLDIsNSwzLDksMywxLDM1LDAsMjQsMSw3LDksMTIsMCwyLDAsMiwwLDUsOSwyLDM1LDUsMTksMiw1LDUsNywyLDM1LDEwLDAsNTgsNzMsNyw3NywzLDM3LDExLDQyLDIsMCw0LDMyOCwyLDMsMyw2LDIsMCwyLDMsMyw0MCwyLDMsMywzMiwyLDMsMyw2LDIsMCwyLDMsMywxNCwyLDU2LDIsMywzLDY2LDUsMCwzMywxNSwxNyw4NCwxMyw2MTksMywxNiwyLDI1LDYsNzQsMjIsMTIsMiw2LDEyLDIwLDEyLDE5LDEzLDEyLDIsMiwyLDEsMTMsNTEsMywyOSw0LDAsNSwxLDMsOSwzNCwyLDMsOSw3LDg3LDksNDIsNiw2OSwxMSwyOCw0LDExLDUsMTEsMTEsMzksMyw0LDEyLDQzLDUsMjUsNywxMCwzOCwyNyw1LDYyLDIsMjgsMywxMCw3LDksMTQsMCw4OSw3NSw1LDksMTgsOCwxMyw0Miw0LDExLDcxLDU1LDksOSw0LDQ4LDgzLDIsMiwzMCwxNCwyMzAsMjMsMjgwLDMsNSwzLDM3LDMsNSwzLDcsMiwwLDIsMCwyLDAsMiwzMCwzLDUyLDIsNiwyLDAsNCwyLDIsNiw0LDMsMyw1LDUsMTIsNiwyLDIsNiw2NywxLDIwLDAsMjksMCwxNCwwLDE3LDQsNjAsMTIsNSwwLDQsMTEsMTgsMCw1LDAsMyw5LDIsMCw0LDQsNywwLDIsMCwyLDAsMiwzLDIsMTAsMywzLDYsNCw1LDAsNTMsMSwyNjg0LDQ2LDIsNDYsMiwxMzIsNyw2LDE1LDM3LDExLDUzLDEwLDAsMTcsMjIsMTAsNiwyLDYsMiw2LDIsNiwyLDYsMiw2LDIsNiwyLDYsMiwzMSw0OCwwLDQ3MCwxLDM2LDUsMiw0LDYsMSw1LDg1LDMsMSwzLDIsMiw4OSwyLDMsNiw0MCw0LDkzLDE4LDIzLDU3LDE1LDUxMyw2NTgxLDc1LDIwOTM5LDUzLDExNjQsNjgsNDUsMywyNjgsNCwyNywyMSwzMSwzLDEzLDEzLDEsMiwyNCw5LDY5LDExLDEsMzgsOCwzLDEwMiwzLDEsMTExLDQ0LDI1LDUxLDEzLDY4LDEyLDksNywyMyw0LDAsNSw0NSwzLDM1LDEzLDI4LDQsNjQsMTUsMTAsMzksNTQsMTAsMTMsMyw5LDcsMjIsNCwxLDUsNjYsMjUsMiwyMjcsNDIsMiwxLDMsOSw3LDExMTcxLDEzLDIyLDUsNDgsODQ1MywzMDEsMyw2MSwzLDEwNSwzOSw2LDEzLDQsNiwxMSwyLDEyLDIsNCwyLDAsMiwxLDIsMSwyLDEwNywzNCwzNjIsMTksNjMsMyw1Myw0MSwxMSw1LDE1LDE3LDYsMTMsMSwyNSwyLDMzLDQsMiwxMzQsMjAsOSw4LDI1LDUsMCwyLDI1LDEyLDg4LDQsNSwzLDUsMyw1LDMsMl0saT0wLHM9W107Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKz0yKXMucHVzaChpKz1yW29dKSxyW28rMV0mJnMucHVzaCg0NSxpKz1yW28rMV0pO3Qud29yZENoYXJzPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxzKX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL3RleHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvY29uZmlnIiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsImFjZS91bmljb2RlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9jb25maWciKSxpPWUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixzPWUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsbz1lKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsdT1lKCIuLi91bmljb2RlIiksYT1lKCIuLi9saWIvbGFuZyIpLGY9ZSgiLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLGw9ZSgiLi4vcmFuZ2UiKS5SYW5nZSxjPWZ1bmN0aW9uKCl7dGhpcy5IaWdobGlnaHRSdWxlcz1zfTsoZnVuY3Rpb24oKXt0aGlzLiRkZWZhdWx0QmVoYXZpb3VyPW5ldyBvLHRoaXMudG9rZW5SZT1uZXcgUmVnRXhwKCJeWyIrdS53b3JkQ2hhcnMrIlxcJF9dKyIsImciKSx0aGlzLm5vblRva2VuUmU9bmV3IFJlZ0V4cCgiXig/OlteIit1LndvcmRDaGFycysiXFwkX118XFxzXSkrIiwiZyIpLHRoaXMuZ2V0VG9rZW5pemVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRva2VuaXplcnx8KHRoaXMuJGhpZ2hsaWdodFJ1bGVzPXRoaXMuJGhpZ2hsaWdodFJ1bGVzfHxuZXcgdGhpcy5IaWdobGlnaHRSdWxlcyh0aGlzLiRoaWdobGlnaHRSdWxlQ29uZmlnKSx0aGlzLiR0b2tlbml6ZXI9bmV3IGkodGhpcy4kaGlnaGxpZ2h0UnVsZXMuZ2V0UnVsZXMoKSkpLHRoaXMuJHRva2VuaXplcn0sdGhpcy5saW5lQ29tbWVudFN0YXJ0PSIiLHRoaXMuYmxvY2tDb21tZW50PSIiLHRoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGUsdCxuLHIpe2Z1bmN0aW9uIHcoZSl7Zm9yKHZhciB0PW47dDw9cjt0KyspZShpLmdldExpbmUodCksdCl9dmFyIGk9dC5kb2Mscz0hMCxvPSEwLHU9SW5maW5pdHksZj10LmdldFRhYlNpemUoKSxsPSExO2lmKCF0aGlzLmxpbmVDb21tZW50U3RhcnQpe2lmKCF0aGlzLmJsb2NrQ29tbWVudClyZXR1cm4hMTt2YXIgYz10aGlzLmJsb2NrQ29tbWVudC5zdGFydCxoPXRoaXMuYmxvY2tDb21tZW50LmVuZCxwPW5ldyBSZWdFeHAoIl4oXFxzKikoPzoiK2EuZXNjYXBlUmVnRXhwKGMpKyIpIiksZD1uZXcgUmVnRXhwKCIoPzoiK2EuZXNjYXBlUmVnRXhwKGgpKyIpXFxzKiQiKSx2PWZ1bmN0aW9uKGUsdCl7aWYoZyhlLHQpKXJldHVybjtpZighc3x8L1xTLy50ZXN0KGUpKWkuaW5zZXJ0SW5MaW5lKHtyb3c6dCxjb2x1bW46ZS5sZW5ndGh9LGgpLGkuaW5zZXJ0SW5MaW5lKHtyb3c6dCxjb2x1bW46dX0sYyl9LG09ZnVuY3Rpb24oZSx0KXt2YXIgbjsobj1lLm1hdGNoKGQpKSYmaS5yZW1vdmVJbkxpbmUodCxlLmxlbmd0aC1uWzBdLmxlbmd0aCxlLmxlbmd0aCksKG49ZS5tYXRjaChwKSkmJmkucmVtb3ZlSW5MaW5lKHQsblsxXS5sZW5ndGgsblswXS5sZW5ndGgpfSxnPWZ1bmN0aW9uKGUsbil7aWYocC50ZXN0KGUpKXJldHVybiEwO3ZhciByPXQuZ2V0VG9rZW5zKG4pO2Zvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKWlmKHJbaV0udHlwZT09PSJjb21tZW50IilyZXR1cm4hMH19ZWxzZXtpZihBcnJheS5pc0FycmF5KHRoaXMubGluZUNvbW1lbnRTdGFydCkpdmFyIHA9dGhpcy5saW5lQ29tbWVudFN0YXJ0Lm1hcChhLmVzY2FwZVJlZ0V4cCkuam9pbigifCIpLGM9dGhpcy5saW5lQ29tbWVudFN0YXJ0WzBdO2Vsc2UgdmFyIHA9YS5lc2NhcGVSZWdFeHAodGhpcy5saW5lQ29tbWVudFN0YXJ0KSxjPXRoaXMubGluZUNvbW1lbnRTdGFydDtwPW5ldyBSZWdFeHAoIl4oXFxzKikoPzoiK3ArIikgPyIpLGw9dC5nZXRVc2VTb2Z0VGFicygpO3ZhciBtPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5tYXRjaChwKTtpZighbilyZXR1cm47dmFyIHI9blsxXS5sZW5ndGgscz1uWzBdLmxlbmd0aDshYihlLHIscykmJm5bMF1bcy0xXT09IiAiJiZzLS0saS5yZW1vdmVJbkxpbmUodCxyLHMpfSx5PWMrIiAiLHY9ZnVuY3Rpb24oZSx0KXtpZighc3x8L1xTLy50ZXN0KGUpKWIoZSx1LHUpP2kuaW5zZXJ0SW5MaW5lKHtyb3c6dCxjb2x1bW46dX0seSk6aS5pbnNlcnRJbkxpbmUoe3Jvdzp0LGNvbHVtbjp1fSxjKX0sZz1mdW5jdGlvbihlLHQpe3JldHVybiBwLnRlc3QoZSl9LGI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPTA7d2hpbGUodC0tJiZlLmNoYXJBdCh0KT09IiAiKXIrKztpZihyJWYhPTApcmV0dXJuITE7dmFyIHI9MDt3aGlsZShlLmNoYXJBdChuKyspPT0iICIpcisrO3JldHVybiBmPjI/ciVmIT1mLTE6ciVmPT0wfX12YXIgRT1JbmZpbml0eTt3KGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zZWFyY2goL1xTLyk7biE9PS0xPyhuPHUmJih1PW4pLG8mJiFnKGUsdCkmJihvPSExKSk6RT5lLmxlbmd0aCYmKEU9ZS5sZW5ndGgpfSksdT09SW5maW5pdHkmJih1PUUscz0hMSxvPSExKSxsJiZ1JWYhPTAmJih1PU1hdGguZmxvb3IodS9mKSpmKSx3KG8/bTp2KX0sdGhpcy50b2dnbGVCbG9ja0NvbW1lbnQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy5ibG9ja0NvbW1lbnQ7aWYoIWkpcmV0dXJuOyFpLnN0YXJ0JiZpWzBdJiYoaT1pWzBdKTt2YXIgcz1uZXcgZih0LHIucm93LHIuY29sdW1uKSxvPXMuZ2V0Q3VycmVudFRva2VuKCksdT10LnNlbGVjdGlvbixhPXQuc2VsZWN0aW9uLnRvT3JpZW50ZWRSYW5nZSgpLGMsaDtpZihvJiYvY29tbWVudC8udGVzdChvLnR5cGUpKXt2YXIgcCxkO3doaWxlKG8mJi9jb21tZW50Ly50ZXN0KG8udHlwZSkpe3ZhciB2PW8udmFsdWUuaW5kZXhPZihpLnN0YXJ0KTtpZih2IT0tMSl7dmFyIG09cy5nZXRDdXJyZW50VG9rZW5Sb3coKSxnPXMuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrdjtwPW5ldyBsKG0sZyxtLGcraS5zdGFydC5sZW5ndGgpO2JyZWFrfW89cy5zdGVwQmFja3dhcmQoKX12YXIgcz1uZXcgZih0LHIucm93LHIuY29sdW1uKSxvPXMuZ2V0Q3VycmVudFRva2VuKCk7d2hpbGUobyYmL2NvbW1lbnQvLnRlc3Qoby50eXBlKSl7dmFyIHY9by52YWx1ZS5pbmRleE9mKGkuZW5kKTtpZih2IT0tMSl7dmFyIG09cy5nZXRDdXJyZW50VG9rZW5Sb3coKSxnPXMuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrdjtkPW5ldyBsKG0sZyxtLGcraS5lbmQubGVuZ3RoKTticmVha31vPXMuc3RlcEZvcndhcmQoKX1kJiZ0LnJlbW92ZShkKSxwJiYodC5yZW1vdmUocCksYz1wLnN0YXJ0LnJvdyxoPS1pLnN0YXJ0Lmxlbmd0aCl9ZWxzZSBoPWkuc3RhcnQubGVuZ3RoLGM9bi5zdGFydC5yb3csdC5pbnNlcnQobi5lbmQsaS5lbmQpLHQuaW5zZXJ0KG4uc3RhcnQsaS5zdGFydCk7YS5zdGFydC5yb3c9PWMmJihhLnN0YXJ0LmNvbHVtbis9aCksYS5lbmQucm93PT1jJiYoYS5lbmQuY29sdW1uKz1oKSx0LnNlbGVjdGlvbi5mcm9tT3JpZW50ZWRSYW5nZShhKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuJGdldEluZGVudCh0KX0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGUsdCxuKXt9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5tYXRjaCgvXlxzKi8pWzBdfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbH0sdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzPWZ1bmN0aW9uKGUpe3RoaXMuJGVtYmVkcz1bXSx0aGlzLiRtb2Rlcz17fTtmb3IodmFyIHQgaW4gZSlpZihlW3RdKXt2YXIgbj1lW3RdLGk9bi5wcm90b3R5cGUuJGlkLHM9ci4kbW9kZXNbaV07c3x8KHIuJG1vZGVzW2ldPXM9bmV3IG4pLHIuJG1vZGVzW3RdfHwoci4kbW9kZXNbdF09cyksdGhpcy4kZW1iZWRzLnB1c2godCksdGhpcy4kbW9kZXNbdF09c312YXIgbz1bInRvZ2dsZUJsb2NrQ29tbWVudCIsInRvZ2dsZUNvbW1lbnRMaW5lcyIsImdldE5leHRMaW5lSW5kZW50IiwiY2hlY2tPdXRkZW50IiwiYXV0b091dGRlbnQiLCJ0cmFuc2Zvcm1BY3Rpb24iLCJnZXRDb21wbGV0aW9ucyJdO2Zvcih2YXIgdD0wO3Q8by5sZW5ndGg7dCsrKShmdW5jdGlvbihlKXt2YXIgbj1vW3RdLHI9ZVtuXTtlW29bdF1dPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGRlbGVnYXRvcihuLGFyZ3VtZW50cyxyKX19KSh0aGlzKX0sdGhpcy4kZGVsZWdhdG9yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdfHwic3RhcnQiO2lmKHR5cGVvZiByIT0ic3RyaW5nIil7aWYoQXJyYXkuaXNBcnJheShyWzJdKSl7dmFyIGk9clsyXVtyWzJdLmxlbmd0aC0xXSxzPXRoaXMuJG1vZGVzW2ldO2lmKHMpcmV0dXJuIHNbZV0uYXBwbHkocyxbclsxXV0uY29uY2F0KFtdLnNsaWNlLmNhbGwodCwxKSkpfXI9clswXXx8InN0YXJ0In1mb3IodmFyIG89MDtvPHRoaXMuJGVtYmVkcy5sZW5ndGg7bysrKXtpZighdGhpcy4kbW9kZXNbdGhpcy4kZW1iZWRzW29dXSljb250aW51ZTt2YXIgdT1yLnNwbGl0KHRoaXMuJGVtYmVkc1tvXSk7aWYoIXVbMF0mJnVbMV0pe3RbMF09dVsxXTt2YXIgcz10aGlzLiRtb2Rlc1t0aGlzLiRlbWJlZHNbb11dO3JldHVybiBzW2VdLmFwcGx5KHMsdCl9fXZhciBhPW4uYXBwbHkodGhpcyx0KTtyZXR1cm4gbj9hOnVuZGVmaW5lZH0sdGhpcy50cmFuc2Zvcm1BY3Rpb249ZnVuY3Rpb24oZSx0LG4scixpKXtpZih0aGlzLiRiZWhhdmlvdXIpe3ZhciBzPXRoaXMuJGJlaGF2aW91ci5nZXRCZWhhdmlvdXJzKCk7Zm9yKHZhciBvIGluIHMpaWYoc1tvXVt0XSl7dmFyIHU9c1tvXVt0XS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYodSlyZXR1cm4gdX19fSx0aGlzLmdldEtleXdvcmRzPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmNvbXBsZXRpb25LZXl3b3Jkcyl7dmFyIHQ9dGhpcy4kdG9rZW5pemVyLnJ1bGVzLG49W107Zm9yKHZhciByIGluIHQpe3ZhciBpPXRbcl07Zm9yKHZhciBzPTAsbz1pLmxlbmd0aDtzPG87cysrKWlmKHR5cGVvZiBpW3NdLnRva2VuPT0ic3RyaW5nIikva2V5d29yZHxzdXBwb3J0fHN0b3JhZ2UvLnRlc3QoaVtzXS50b2tlbikmJm4ucHVzaChpW3NdLnJlZ2V4KTtlbHNlIGlmKHR5cGVvZiBpW3NdLnRva2VuPT0ib2JqZWN0Iilmb3IodmFyIHU9MCxhPWlbc10udG9rZW4ubGVuZ3RoO3U8YTt1KyspaWYoL2tleXdvcmR8c3VwcG9ydHxzdG9yYWdlLy50ZXN0KGlbc10udG9rZW5bdV0pKXt2YXIgcj1pW3NdLnJlZ2V4Lm1hdGNoKC9cKC4rP1wpL2cpW3VdO24ucHVzaChyLnN1YnN0cigxLHIubGVuZ3RoLTIpKX19dGhpcy5jb21wbGV0aW9uS2V5d29yZHM9bn1yZXR1cm4gZT9uLmNvbmNhdCh0aGlzLiRrZXl3b3JkTGlzdHx8W10pOnRoaXMuJGtleXdvcmRMaXN0fSx0aGlzLiRjcmVhdGVLZXl3b3JkTGlzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRoaWdobGlnaHRSdWxlc3x8dGhpcy5nZXRUb2tlbml6ZXIoKSx0aGlzLiRrZXl3b3JkTGlzdD10aGlzLiRoaWdobGlnaHRSdWxlcy4ka2V5d29yZExpc3R8fFtdfSx0aGlzLmdldENvbXBsZXRpb25zPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuJGtleXdvcmRMaXN0fHx0aGlzLiRjcmVhdGVLZXl3b3JkTGlzdCgpO3JldHVybiBpLm1hcChmdW5jdGlvbihlKXtyZXR1cm57bmFtZTplLHZhbHVlOmUsc2NvcmU6MCxtZXRhOiJrZXl3b3JkIn19KX0sdGhpcy4kaWQ9ImFjZS9tb2RlL3RleHQifSkuY2FsbChjLnByb3RvdHlwZSksdC5Nb2RlPWN9KSxhY2UuZGVmaW5lKCJhY2UvYXBwbHlfZGVsdGEiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt0aHJvdyBjb25zb2xlLmxvZygiSW52YWxpZCBEZWx0YToiLGUpLCJJbnZhbGlkIERlbHRhOiAiK3R9ZnVuY3Rpb24gaShlLHQpe3JldHVybiB0LnJvdz49MCYmdC5yb3c8ZS5sZW5ndGgmJnQuY29sdW1uPj0wJiZ0LmNvbHVtbjw9ZVt0LnJvd10ubGVuZ3RofWZ1bmN0aW9uIHMoZSx0KXt0LmFjdGlvbiE9Imluc2VydCImJnQuYWN0aW9uIT0icmVtb3ZlIiYmcih0LCJkZWx0YS5hY3Rpb24gbXVzdCBiZSAnaW5zZXJ0JyBvciAncmVtb3ZlJyIpLHQubGluZXMgaW5zdGFuY2VvZiBBcnJheXx8cih0LCJkZWx0YS5saW5lcyBtdXN0IGJlIGFuIEFycmF5IiksKCF0LnN0YXJ0fHwhdC5lbmQpJiZyKHQsImRlbHRhLnN0YXJ0L2VuZCBtdXN0IGJlIGFuIHByZXNlbnQiKTt2YXIgbj10LnN0YXJ0O2koZSx0LnN0YXJ0KXx8cih0LCJkZWx0YS5zdGFydCBtdXN0IGJlIGNvbnRhaW5lZCBpbiBkb2N1bWVudCIpO3ZhciBzPXQuZW5kO3QuYWN0aW9uPT0icmVtb3ZlIiYmIWkoZSxzKSYmcih0LCJkZWx0YS5lbmQgbXVzdCBjb250YWluZWQgaW4gZG9jdW1lbnQgZm9yICdyZW1vdmUnIGFjdGlvbnMiKTt2YXIgbz1zLnJvdy1uLnJvdyx1PXMuY29sdW1uLShvPT0wP24uY29sdW1uOjApOyhvIT10LmxpbmVzLmxlbmd0aC0xfHx0LmxpbmVzW29dLmxlbmd0aCE9dSkmJnIodCwiZGVsdGEucmFuZ2UgbXVzdCBtYXRjaCBkZWx0YSBsaW5lcyIpfXQuYXBwbHlEZWx0YT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5zdGFydC5yb3csaT10LnN0YXJ0LmNvbHVtbixzPWVbcl18fCIiO3N3aXRjaCh0LmFjdGlvbil7Y2FzZSJpbnNlcnQiOnZhciBvPXQubGluZXM7aWYoby5sZW5ndGg9PT0xKWVbcl09cy5zdWJzdHJpbmcoMCxpKSt0LmxpbmVzWzBdK3Muc3Vic3RyaW5nKGkpO2Vsc2V7dmFyIHU9W3IsMV0uY29uY2F0KHQubGluZXMpO2Uuc3BsaWNlLmFwcGx5KGUsdSksZVtyXT1zLnN1YnN0cmluZygwLGkpK2Vbcl0sZVtyK3QubGluZXMubGVuZ3RoLTFdKz1zLnN1YnN0cmluZyhpKX1icmVhaztjYXNlInJlbW92ZSI6dmFyIGE9dC5lbmQuY29sdW1uLGY9dC5lbmQucm93O3I9PT1mP2Vbcl09cy5zdWJzdHJpbmcoMCxpKStzLnN1YnN0cmluZyhhKTplLnNwbGljZShyLGYtcisxLHMuc3Vic3RyaW5nKDAsaSkrZVtmXS5zdWJzdHJpbmcoYSkpfX19KSxhY2UuZGVmaW5lKCJhY2UvYW5jaG9yIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixzPXQuQW5jaG9yPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLiRvbkNoYW5nZT10aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5hdHRhY2goZSksdHlwZW9mIG49PSJ1bmRlZmluZWQiP3RoaXMuc2V0UG9zaXRpb24odC5yb3csdC5jb2x1bW4pOnRoaXMuc2V0UG9zaXRpb24odCxuKX07KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbil7dmFyIHI9bj9lLmNvbHVtbjw9dC5jb2x1bW46ZS5jb2x1bW48dC5jb2x1bW47cmV0dXJuIGUucm93PHQucm93fHxlLnJvdz09dC5yb3cmJnJ9ZnVuY3Rpb24gdCh0LG4scil7dmFyIGk9dC5hY3Rpb249PSJpbnNlcnQiLHM9KGk/MTotMSkqKHQuZW5kLnJvdy10LnN0YXJ0LnJvdyksbz0oaT8xOi0xKSoodC5lbmQuY29sdW1uLXQuc3RhcnQuY29sdW1uKSx1PXQuc3RhcnQsYT1pP3U6dC5lbmQ7cmV0dXJuIGUobix1LHIpP3tyb3c6bi5yb3csY29sdW1uOm4uY29sdW1ufTplKGEsbiwhcik/e3JvdzpuLnJvdytzLGNvbHVtbjpuLmNvbHVtbisobi5yb3c9PWEucm93P286MCl9Ontyb3c6dS5yb3csY29sdW1uOnUuY29sdW1ufX1yLmltcGxlbWVudCh0aGlzLGkpLHRoaXMuZ2V0UG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudCh0aGlzLnJvdyx0aGlzLmNvbHVtbil9LHRoaXMuZ2V0RG9jdW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2N1bWVudH0sdGhpcy4kaW5zZXJ0UmlnaHQ9ITEsdGhpcy5vbkNoYW5nZT1mdW5jdGlvbihlKXtpZihlLnN0YXJ0LnJvdz09ZS5lbmQucm93JiZlLnN0YXJ0LnJvdyE9dGhpcy5yb3cpcmV0dXJuO2lmKGUuc3RhcnQucm93PnRoaXMucm93KXJldHVybjt2YXIgbj10KGUse3Jvdzp0aGlzLnJvdyxjb2x1bW46dGhpcy5jb2x1bW59LHRoaXMuJGluc2VydFJpZ2h0KTt0aGlzLnNldFBvc2l0aW9uKG4ucm93LG4uY29sdW1uLCEwKX0sdGhpcy5zZXRQb3NpdGlvbj1mdW5jdGlvbihlLHQsbil7dmFyIHI7bj9yPXtyb3c6ZSxjb2x1bW46dH06cj10aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KGUsdCk7aWYodGhpcy5yb3c9PXIucm93JiZ0aGlzLmNvbHVtbj09ci5jb2x1bW4pcmV0dXJuO3ZhciBpPXtyb3c6dGhpcy5yb3csY29sdW1uOnRoaXMuY29sdW1ufTt0aGlzLnJvdz1yLnJvdyx0aGlzLmNvbHVtbj1yLmNvbHVtbix0aGlzLl9zaWduYWwoImNoYW5nZSIse29sZDppLHZhbHVlOnJ9KX0sdGhpcy5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy4kb25DaGFuZ2UpfSx0aGlzLmF0dGFjaD1mdW5jdGlvbihlKXt0aGlzLmRvY3VtZW50PWV8fHRoaXMuZG9jdW1lbnQsdGhpcy5kb2N1bWVudC5vbigiY2hhbmdlIix0aGlzLiRvbkNoYW5nZSl9LHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtyZXR1cm4gZT49dGhpcy5kb2N1bWVudC5nZXRMZW5ndGgoKT8obi5yb3c9TWF0aC5tYXgoMCx0aGlzLmRvY3VtZW50LmdldExlbmd0aCgpLTEpLG4uY29sdW1uPXRoaXMuZG9jdW1lbnQuZ2V0TGluZShuLnJvdykubGVuZ3RoKTplPDA/KG4ucm93PTAsbi5jb2x1bW49MCk6KG4ucm93PWUsbi5jb2x1bW49TWF0aC5taW4odGhpcy5kb2N1bWVudC5nZXRMaW5lKG4ucm93KS5sZW5ndGgsTWF0aC5tYXgoMCx0KSkpLHQ8MCYmKG4uY29sdW1uPTApLG59fSkuY2FsbChzLnByb3RvdHlwZSl9KSxhY2UuZGVmaW5lKCJhY2UvZG9jdW1lbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9hcHBseV9kZWx0YSIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9yYW5nZSIsImFjZS9hbmNob3IiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9hcHBseV9kZWx0YSIpLmFwcGx5RGVsdGEscz1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLG89ZSgiLi9yYW5nZSIpLlJhbmdlLHU9ZSgiLi9hbmNob3IiKS5BbmNob3IsYT1mdW5jdGlvbihlKXt0aGlzLiRsaW5lcz1bIiJdLGUubGVuZ3RoPT09MD90aGlzLiRsaW5lcz1bIiJdOkFycmF5LmlzQXJyYXkoZSk/dGhpcy5pbnNlcnRNZXJnZWRMaW5lcyh7cm93OjAsY29sdW1uOjB9LGUpOnRoaXMuaW5zZXJ0KHtyb3c6MCxjb2x1bW46MH0sZSl9OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMscyksdGhpcy5zZXRWYWx1ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldExlbmd0aCgpLTE7dGhpcy5yZW1vdmUobmV3IG8oMCwwLHQsdGhpcy5nZXRMaW5lKHQpLmxlbmd0aCkpLHRoaXMuaW5zZXJ0KHtyb3c6MCxjb2x1bW46MH0sZSl9LHRoaXMuZ2V0VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBbGxMaW5lcygpLmpvaW4odGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpfSx0aGlzLmNyZWF0ZUFuY2hvcj1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgdSh0aGlzLGUsdCl9LCJhYWEiLnNwbGl0KC9hLykubGVuZ3RoPT09MD90aGlzLiRzcGxpdD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9cclxufFxyL2csIlxuIikuc3BsaXQoIlxuIil9OnRoaXMuJHNwbGl0PWZ1bmN0aW9uKGUpe3JldHVybiBlLnNwbGl0KC9cclxufFxyfFxuLyl9LHRoaXMuJGRldGVjdE5ld0xpbmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXRjaCgvXi4qPyhcclxufFxyfFxuKS9tKTt0aGlzLiRhdXRvTmV3TGluZT10P3RbMV06IlxuIix0aGlzLl9zaWduYWwoImNoYW5nZU5ld0xpbmVNb2RlIil9LHRoaXMuZ2V0TmV3TGluZUNoYXJhY3Rlcj1mdW5jdGlvbigpe3N3aXRjaCh0aGlzLiRuZXdMaW5lTW9kZSl7Y2FzZSJ3aW5kb3dzIjpyZXR1cm4iXHJcbiI7Y2FzZSJ1bml4IjpyZXR1cm4iXG4iO2RlZmF1bHQ6cmV0dXJuIHRoaXMuJGF1dG9OZXdMaW5lfHwiXG4ifX0sdGhpcy4kYXV0b05ld0xpbmU9IiIsdGhpcy4kbmV3TGluZU1vZGU9ImF1dG8iLHRoaXMuc2V0TmV3TGluZU1vZGU9ZnVuY3Rpb24oZSl7aWYodGhpcy4kbmV3TGluZU1vZGU9PT1lKXJldHVybjt0aGlzLiRuZXdMaW5lTW9kZT1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlTmV3TGluZU1vZGUiKX0sdGhpcy5nZXROZXdMaW5lTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRuZXdMaW5lTW9kZX0sdGhpcy5pc05ld0xpbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PSJcclxuInx8ZT09IlxyInx8ZT09IlxuIn0sdGhpcy5nZXRMaW5lPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiRsaW5lc1tlXXx8IiJ9LHRoaXMuZ2V0TGluZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy4kbGluZXMuc2xpY2UoZSx0KzEpfSx0aGlzLmdldEFsbExpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TGluZXMoMCx0aGlzLmdldExlbmd0aCgpKX0sdGhpcy5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbGluZXMubGVuZ3RofSx0aGlzLmdldFRleHRSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRMaW5lc0ZvclJhbmdlKGUpLmpvaW4odGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpfSx0aGlzLmdldExpbmVzRm9yUmFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZS5zdGFydC5yb3c9PT1lLmVuZC5yb3cpdD1bdGhpcy5nZXRMaW5lKGUuc3RhcnQucm93KS5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4sZS5lbmQuY29sdW1uKV07ZWxzZXt0PXRoaXMuZ2V0TGluZXMoZS5zdGFydC5yb3csZS5lbmQucm93KSx0WzBdPSh0WzBdfHwiIikuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKTt2YXIgbj10Lmxlbmd0aC0xO2UuZW5kLnJvdy1lLnN0YXJ0LnJvdz09biYmKHRbbl09dFtuXS5zdWJzdHJpbmcoMCxlLmVuZC5jb2x1bW4pKX1yZXR1cm4gdH0sdGhpcy5pbnNlcnRMaW5lcz1mdW5jdGlvbihlLHQpe3JldHVybiBjb25zb2xlLndhcm4oIlVzZSBvZiBkb2N1bWVudC5pbnNlcnRMaW5lcyBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIGluc2VydEZ1bGxMaW5lcyBtZXRob2QgaW5zdGVhZC4iKSx0aGlzLmluc2VydEZ1bGxMaW5lcyhlLHQpfSx0aGlzLnJlbW92ZUxpbmVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGNvbnNvbGUud2FybigiVXNlIG9mIGRvY3VtZW50LnJlbW92ZUxpbmVzIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgcmVtb3ZlRnVsbExpbmVzIG1ldGhvZCBpbnN0ZWFkLiIpLHRoaXMucmVtb3ZlRnVsbExpbmVzKGUsdCl9LHRoaXMuaW5zZXJ0TmV3TGluZT1mdW5jdGlvbihlKXtyZXR1cm4gY29uc29sZS53YXJuKCJVc2Ugb2YgZG9jdW1lbnQuaW5zZXJ0TmV3TGluZSBpcyBkZXByZWNhdGVkLiBVc2UgaW5zZXJ0TWVyZ2VkTGluZXMocG9zaXRpb24sIFsnJywgJyddKSBpbnN0ZWFkLiIpLHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXMoZSxbIiIsIiJdKX0sdGhpcy5pbnNlcnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5nZXRMZW5ndGgoKTw9MSYmdGhpcy4kZGV0ZWN0TmV3TGluZSh0KSx0aGlzLmluc2VydE1lcmdlZExpbmVzKGUsdGhpcy4kc3BsaXQodCkpfSx0aGlzLmluc2VydEluTGluZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY2xpcHBlZFBvcyhlLnJvdyxlLmNvbHVtbikscj10aGlzLnBvcyhlLnJvdyxlLmNvbHVtbit0Lmxlbmd0aCk7cmV0dXJuIHRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6bixlbmQ6cixhY3Rpb246Imluc2VydCIsbGluZXM6W3RdfSwhMCksdGhpcy5jbG9uZVBvcyhyKX0sdGhpcy5jbGlwcGVkUG9zPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRMZW5ndGgoKTtlPT09dW5kZWZpbmVkP2U9bjplPDA/ZT0wOmU+PW4mJihlPW4tMSx0PXVuZGVmaW5lZCk7dmFyIHI9dGhpcy5nZXRMaW5lKGUpO3JldHVybiB0PT11bmRlZmluZWQmJih0PXIubGVuZ3RoKSx0PU1hdGgubWluKE1hdGgubWF4KHQsMCksci5sZW5ndGgpLHtyb3c6ZSxjb2x1bW46dH19LHRoaXMuY2xvbmVQb3M9ZnVuY3Rpb24oZSl7cmV0dXJue3JvdzplLnJvdyxjb2x1bW46ZS5jb2x1bW59fSx0aGlzLnBvcz1mdW5jdGlvbihlLHQpe3JldHVybntyb3c6ZSxjb2x1bW46dH19LHRoaXMuJGNsaXBQb3NpdGlvbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldExlbmd0aCgpO3JldHVybiBlLnJvdz49dD8oZS5yb3c9TWF0aC5tYXgoMCx0LTEpLGUuY29sdW1uPXRoaXMuZ2V0TGluZSh0LTEpLmxlbmd0aCk6KGUucm93PU1hdGgubWF4KDAsZS5yb3cpLGUuY29sdW1uPU1hdGgubWluKE1hdGgubWF4KGUuY29sdW1uLDApLHRoaXMuZ2V0TGluZShlLnJvdykubGVuZ3RoKSksZX0sdGhpcy5pbnNlcnRGdWxsTGluZXM9ZnVuY3Rpb24oZSx0KXtlPU1hdGgubWluKE1hdGgubWF4KGUsMCksdGhpcy5nZXRMZW5ndGgoKSk7dmFyIG49MDtlPHRoaXMuZ2V0TGVuZ3RoKCk/KHQ9dC5jb25jYXQoWyIiXSksbj0wKToodD1bIiJdLmNvbmNhdCh0KSxlLS0sbj10aGlzLiRsaW5lc1tlXS5sZW5ndGgpLHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXMoe3JvdzplLGNvbHVtbjpufSx0KX0sdGhpcy5pbnNlcnRNZXJnZWRMaW5lcz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY2xpcHBlZFBvcyhlLnJvdyxlLmNvbHVtbikscj17cm93Om4ucm93K3QubGVuZ3RoLTEsY29sdW1uOih0Lmxlbmd0aD09MT9uLmNvbHVtbjowKSt0W3QubGVuZ3RoLTFdLmxlbmd0aH07cmV0dXJuIHRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6bixlbmQ6cixhY3Rpb246Imluc2VydCIsbGluZXM6dH0pLHRoaXMuY2xvbmVQb3Mocil9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY2xpcHBlZFBvcyhlLnN0YXJ0LnJvdyxlLnN0YXJ0LmNvbHVtbiksbj10aGlzLmNsaXBwZWRQb3MoZS5lbmQucm93LGUuZW5kLmNvbHVtbik7cmV0dXJuIHRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6dCxlbmQ6bixhY3Rpb246InJlbW92ZSIsbGluZXM6dGhpcy5nZXRMaW5lc0ZvclJhbmdlKHtzdGFydDp0LGVuZDpufSl9KSx0aGlzLmNsb25lUG9zKHQpfSx0aGlzLnJlbW92ZUluTGluZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5jbGlwcGVkUG9zKGUsdCksaT10aGlzLmNsaXBwZWRQb3MoZSxuKTtyZXR1cm4gdGhpcy5hcHBseURlbHRhKHtzdGFydDpyLGVuZDppLGFjdGlvbjoicmVtb3ZlIixsaW5lczp0aGlzLmdldExpbmVzRm9yUmFuZ2Uoe3N0YXJ0OnIsZW5kOml9KX0sITApLHRoaXMuY2xvbmVQb3Mocil9LHRoaXMucmVtb3ZlRnVsbExpbmVzPWZ1bmN0aW9uKGUsdCl7ZT1NYXRoLm1pbihNYXRoLm1heCgwLGUpLHRoaXMuZ2V0TGVuZ3RoKCktMSksdD1NYXRoLm1pbihNYXRoLm1heCgwLHQpLHRoaXMuZ2V0TGVuZ3RoKCktMSk7dmFyIG49dD09dGhpcy5nZXRMZW5ndGgoKS0xJiZlPjAscj10PHRoaXMuZ2V0TGVuZ3RoKCktMSxpPW4/ZS0xOmUscz1uP3RoaXMuZ2V0TGluZShpKS5sZW5ndGg6MCx1PXI/dCsxOnQsYT1yPzA6dGhpcy5nZXRMaW5lKHUpLmxlbmd0aCxmPW5ldyBvKGkscyx1LGEpLGw9dGhpcy4kbGluZXMuc2xpY2UoZSx0KzEpO3JldHVybiB0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0OmYuc3RhcnQsZW5kOmYuZW5kLGFjdGlvbjoicmVtb3ZlIixsaW5lczp0aGlzLmdldExpbmVzRm9yUmFuZ2UoZil9KSxsfSx0aGlzLnJlbW92ZU5ld0xpbmU9ZnVuY3Rpb24oZSl7ZTx0aGlzLmdldExlbmd0aCgpLTEmJmU+PTAmJnRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6dGhpcy5wb3MoZSx0aGlzLmdldExpbmUoZSkubGVuZ3RoKSxlbmQ6dGhpcy5wb3MoZSsxLDApLGFjdGlvbjoicmVtb3ZlIixsaW5lczpbIiIsIiJdfSl9LHRoaXMucmVwbGFjZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBvfHwoZT1vLmZyb21Qb2ludHMoZS5zdGFydCxlLmVuZCkpO2lmKHQubGVuZ3RoPT09MCYmZS5pc0VtcHR5KCkpcmV0dXJuIGUuc3RhcnQ7aWYodD09dGhpcy5nZXRUZXh0UmFuZ2UoZSkpcmV0dXJuIGUuZW5kO3RoaXMucmVtb3ZlKGUpO3ZhciBuO3JldHVybiB0P249dGhpcy5pbnNlcnQoZS5zdGFydCx0KTpuPWUuc3RhcnQsbn0sdGhpcy5hcHBseURlbHRhcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl0aGlzLmFwcGx5RGVsdGEoZVt0XSl9LHRoaXMucmV2ZXJ0RGVsdGFzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmxlbmd0aC0xO3Q+PTA7dC0tKXRoaXMucmV2ZXJ0RGVsdGEoZVt0XSl9LHRoaXMuYXBwbHlEZWx0YT1mdW5jdGlvbihlLHQpe3ZhciBuPWUuYWN0aW9uPT0iaW5zZXJ0IjtpZihuP2UubGluZXMubGVuZ3RoPD0xJiYhZS5saW5lc1swXTohby5jb21wYXJlUG9pbnRzKGUuc3RhcnQsZS5lbmQpKXJldHVybjtuJiZlLmxpbmVzLmxlbmd0aD4yZTQ/dGhpcy4kc3BsaXRBbmRhcHBseUxhcmdlRGVsdGEoZSwyZTQpOihpKHRoaXMuJGxpbmVzLGUsdCksdGhpcy5fc2lnbmFsKCJjaGFuZ2UiLGUpKX0sdGhpcy4kc3BsaXRBbmRhcHBseUxhcmdlRGVsdGE9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxpbmVzLHI9bi5sZW5ndGgtdCsxLGk9ZS5zdGFydC5yb3cscz1lLnN0YXJ0LmNvbHVtbjtmb3IodmFyIG89MCx1PTA7bzxyO289dSl7dSs9dC0xO3ZhciBhPW4uc2xpY2Uobyx1KTthLnB1c2goIiIpLHRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6dGhpcy5wb3MoaStvLHMpLGVuZDp0aGlzLnBvcyhpK3Uscz0wKSxhY3Rpb246ZS5hY3Rpb24sbGluZXM6YX0sITApfWUubGluZXM9bi5zbGljZShvKSxlLnN0YXJ0LnJvdz1pK28sZS5zdGFydC5jb2x1bW49cyx0aGlzLmFwcGx5RGVsdGEoZSwhMCl9LHRoaXMucmV2ZXJ0RGVsdGE9ZnVuY3Rpb24oZSl7dGhpcy5hcHBseURlbHRhKHtzdGFydDp0aGlzLmNsb25lUG9zKGUuc3RhcnQpLGVuZDp0aGlzLmNsb25lUG9zKGUuZW5kKSxhY3Rpb246ZS5hY3Rpb249PSJpbnNlcnQiPyJyZW1vdmUiOiJpbnNlcnQiLGxpbmVzOmUubGluZXMuc2xpY2UoKX0pfSx0aGlzLmluZGV4VG9Qb3NpdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGxpbmVzfHx0aGlzLmdldEFsbExpbmVzKCkscj10aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKS5sZW5ndGg7Zm9yKHZhciBpPXR8fDAscz1uLmxlbmd0aDtpPHM7aSsrKXtlLT1uW2ldLmxlbmd0aCtyO2lmKGU8MClyZXR1cm57cm93OmksY29sdW1uOmUrbltpXS5sZW5ndGgrcn19cmV0dXJue3JvdzpzLTEsY29sdW1uOmUrbltzLTFdLmxlbmd0aCtyfX0sdGhpcy5wb3NpdGlvblRvSW5kZXg9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRsaW5lc3x8dGhpcy5nZXRBbGxMaW5lcygpLHI9dGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkubGVuZ3RoLGk9MCxzPU1hdGgubWluKGUucm93LG4ubGVuZ3RoKTtmb3IodmFyIG89dHx8MDtvPHM7KytvKWkrPW5bb10ubGVuZ3RoK3I7cmV0dXJuIGkrZS5jb2x1bW59fSkuY2FsbChhLnByb3RvdHlwZSksdC5Eb2N1bWVudD1hfSksYWNlLmRlZmluZSgiYWNlL2JhY2tncm91bmRfdG9rZW5pemVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixzPWZ1bmN0aW9uKGUsdCl7dGhpcy5ydW5uaW5nPSExLHRoaXMubGluZXM9W10sdGhpcy5zdGF0ZXM9W10sdGhpcy5jdXJyZW50TGluZT0wLHRoaXMudG9rZW5pemVyPWU7dmFyIG49dGhpczt0aGlzLiR3b3JrZXI9ZnVuY3Rpb24oKXtpZighbi5ydW5uaW5nKXJldHVybjt2YXIgZT1uZXcgRGF0ZSx0PW4uY3VycmVudExpbmUscj0tMSxpPW4uZG9jLHM9dDt3aGlsZShuLmxpbmVzW3RdKXQrKzt2YXIgbz1pLmdldExlbmd0aCgpLHU9MDtuLnJ1bm5pbmc9ITE7d2hpbGUodDxvKXtuLiR0b2tlbml6ZVJvdyh0KSxyPXQ7ZG8gdCsrO3doaWxlKG4ubGluZXNbdF0pO3UrKztpZih1JTU9PT0wJiZuZXcgRGF0ZS1lPjIwKXtuLnJ1bm5pbmc9c2V0VGltZW91dChuLiR3b3JrZXIsMjApO2JyZWFrfX1uLmN1cnJlbnRMaW5lPXQscj09LTEmJihyPXQpLHM8PXImJm4uZmlyZVVwZGF0ZUV2ZW50KHMscil9fTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLGkpLHRoaXMuc2V0VG9rZW5pemVyPWZ1bmN0aW9uKGUpe3RoaXMudG9rZW5pemVyPWUsdGhpcy5saW5lcz1bXSx0aGlzLnN0YXRlcz1bXSx0aGlzLnN0YXJ0KDApfSx0aGlzLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3RoaXMuZG9jPWUsdGhpcy5saW5lcz1bXSx0aGlzLnN0YXRlcz1bXSx0aGlzLnN0b3AoKX0sdGhpcy5maXJlVXBkYXRlRXZlbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj17Zmlyc3Q6ZSxsYXN0OnR9O3RoaXMuX3NpZ25hbCgidXBkYXRlIix7ZGF0YTpufSl9LHRoaXMuc3RhcnQ9ZnVuY3Rpb24oZSl7dGhpcy5jdXJyZW50TGluZT1NYXRoLm1pbihlfHwwLHRoaXMuY3VycmVudExpbmUsdGhpcy5kb2MuZ2V0TGVuZ3RoKCkpLHRoaXMubGluZXMuc3BsaWNlKHRoaXMuY3VycmVudExpbmUsdGhpcy5saW5lcy5sZW5ndGgpLHRoaXMuc3RhdGVzLnNwbGljZSh0aGlzLmN1cnJlbnRMaW5lLHRoaXMuc3RhdGVzLmxlbmd0aCksdGhpcy5zdG9wKCksdGhpcy5ydW5uaW5nPXNldFRpbWVvdXQodGhpcy4kd29ya2VyLDcwMCl9LHRoaXMuc2NoZWR1bGVTdGFydD1mdW5jdGlvbigpe3RoaXMucnVubmluZ3x8KHRoaXMucnVubmluZz1zZXRUaW1lb3V0KHRoaXMuJHdvcmtlciw3MDApKX0sdGhpcy4kdXBkYXRlT25DaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdGFydC5yb3csbj1lLmVuZC5yb3ctdDtpZihuPT09MCl0aGlzLmxpbmVzW3RdPW51bGw7ZWxzZSBpZihlLmFjdGlvbj09InJlbW92ZSIpdGhpcy5saW5lcy5zcGxpY2UodCxuKzEsbnVsbCksdGhpcy5zdGF0ZXMuc3BsaWNlKHQsbisxLG51bGwpO2Vsc2V7dmFyIHI9QXJyYXkobisxKTtyLnVuc2hpZnQodCwxKSx0aGlzLmxpbmVzLnNwbGljZS5hcHBseSh0aGlzLmxpbmVzLHIpLHRoaXMuc3RhdGVzLnNwbGljZS5hcHBseSh0aGlzLnN0YXRlcyxyKX10aGlzLmN1cnJlbnRMaW5lPU1hdGgubWluKHQsdGhpcy5jdXJyZW50TGluZSx0aGlzLmRvYy5nZXRMZW5ndGgoKSksdGhpcy5zdG9wKCl9LHRoaXMuc3RvcD1mdW5jdGlvbigpe3RoaXMucnVubmluZyYmY2xlYXJUaW1lb3V0KHRoaXMucnVubmluZyksdGhpcy5ydW5uaW5nPSExfSx0aGlzLmdldFRva2Vucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5saW5lc1tlXXx8dGhpcy4kdG9rZW5pemVSb3coZSl9LHRoaXMuZ2V0U3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY3VycmVudExpbmU9PWUmJnRoaXMuJHRva2VuaXplUm93KGUpLHRoaXMuc3RhdGVzW2VdfHwic3RhcnQifSx0aGlzLiR0b2tlbml6ZVJvdz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmRvYy5nZXRMaW5lKGUpLG49dGhpcy5zdGF0ZXNbZS0xXSxyPXRoaXMudG9rZW5pemVyLmdldExpbmVUb2tlbnModCxuLGUpO3JldHVybiB0aGlzLnN0YXRlc1tlXSsiIiE9ci5zdGF0ZSsiIj8odGhpcy5zdGF0ZXNbZV09ci5zdGF0ZSx0aGlzLmxpbmVzW2UrMV09bnVsbCx0aGlzLmN1cnJlbnRMaW5lPmUrMSYmKHRoaXMuY3VycmVudExpbmU9ZSsxKSk6dGhpcy5jdXJyZW50TGluZT09ZSYmKHRoaXMuY3VycmVudExpbmU9ZSsxKSx0aGlzLmxpbmVzW2VdPXIudG9rZW5zfX0pLmNhbGwocy5wcm90b3R5cGUpLHQuQmFja2dyb3VuZFRva2VuaXplcj1zfSksYWNlLmRlZmluZSgiYWNlL3NlYXJjaF9oaWdobGlnaHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvbGFuZyIpLGk9ZSgiLi9saWIvb29wIikscz1lKCIuL3JhbmdlIikuUmFuZ2Usbz1mdW5jdGlvbihlLHQsbil7dGhpcy5zZXRSZWdleHAoZSksdGhpcy5jbGF6ej10LHRoaXMudHlwZT1ufHwidGV4dCJ9OyhmdW5jdGlvbigpe3RoaXMuTUFYX1JBTkdFUz01MDAsdGhpcy5zZXRSZWdleHA9ZnVuY3Rpb24oZSl7aWYodGhpcy5yZWdFeHArIiI9PWUrIiIpcmV0dXJuO3RoaXMucmVnRXhwPWUsdGhpcy5jYWNoZT1bXX0sdGhpcy51cGRhdGU9ZnVuY3Rpb24oZSx0LG4saSl7aWYoIXRoaXMucmVnRXhwKXJldHVybjt2YXIgbz1pLmZpcnN0Um93LHU9aS5sYXN0Um93O2Zvcih2YXIgYT1vO2E8PXU7YSsrKXt2YXIgZj10aGlzLmNhY2hlW2FdO2Y9PW51bGwmJihmPXIuZ2V0TWF0Y2hPZmZzZXRzKG4uZ2V0TGluZShhKSx0aGlzLnJlZ0V4cCksZi5sZW5ndGg+dGhpcy5NQVhfUkFOR0VTJiYoZj1mLnNsaWNlKDAsdGhpcy5NQVhfUkFOR0VTKSksZj1mLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gbmV3IHMoYSxlLm9mZnNldCxhLGUub2Zmc2V0K2UubGVuZ3RoKX0pLHRoaXMuY2FjaGVbYV09Zi5sZW5ndGg/ZjoiIik7Zm9yKHZhciBsPWYubGVuZ3RoO2wtLTspdC5kcmF3U2luZ2xlTGluZU1hcmtlcihlLGZbbF0udG9TY3JlZW5SYW5nZShuKSx0aGlzLmNsYXp6LGkpfX19KS5jYWxsKG8ucHJvdG90eXBlKSx0LlNlYXJjaEhpZ2hsaWdodD1vfSksYWNlLmRlZmluZSgiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkX2xpbmUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSx0KXt0aGlzLmZvbGREYXRhPWUsQXJyYXkuaXNBcnJheSh0KT90aGlzLmZvbGRzPXQ6dD10aGlzLmZvbGRzPVt0XTt2YXIgbj10W3QubGVuZ3RoLTFdO3RoaXMucmFuZ2U9bmV3IHIodFswXS5zdGFydC5yb3csdFswXS5zdGFydC5jb2x1bW4sbi5lbmQucm93LG4uZW5kLmNvbHVtbiksdGhpcy5zdGFydD10aGlzLnJhbmdlLnN0YXJ0LHRoaXMuZW5kPXRoaXMucmFuZ2UuZW5kLHRoaXMuZm9sZHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNldEZvbGRMaW5lKHRoaXMpfSx0aGlzKX12YXIgcj1lKCIuLi9yYW5nZSIpLlJhbmdlOyhmdW5jdGlvbigpe3RoaXMuc2hpZnRSb3c9ZnVuY3Rpb24oZSl7dGhpcy5zdGFydC5yb3crPWUsdGhpcy5lbmQucm93Kz1lLHRoaXMuZm9sZHMuZm9yRWFjaChmdW5jdGlvbih0KXt0LnN0YXJ0LnJvdys9ZSx0LmVuZC5yb3crPWV9KX0sdGhpcy5hZGRGb2xkPWZ1bmN0aW9uKGUpe2lmKGUuc2FtZVJvdyl7aWYoZS5zdGFydC5yb3c8dGhpcy5zdGFydFJvd3x8ZS5lbmRSb3c+dGhpcy5lbmRSb3cpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCBhZGQgYSBmb2xkIHRvIHRoaXMgRm9sZExpbmUgYXMgaXQgaGFzIG5vIGNvbm5lY3Rpb24iKTt0aGlzLmZvbGRzLnB1c2goZSksdGhpcy5mb2xkcy5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuLWUucmFuZ2UuY29tcGFyZUVuZCh0LnN0YXJ0LnJvdyx0LnN0YXJ0LmNvbHVtbil9KSx0aGlzLnJhbmdlLmNvbXBhcmVFbmQoZS5zdGFydC5yb3csZS5zdGFydC5jb2x1bW4pPjA/KHRoaXMuZW5kLnJvdz1lLmVuZC5yb3csdGhpcy5lbmQuY29sdW1uPWUuZW5kLmNvbHVtbik6dGhpcy5yYW5nZS5jb21wYXJlU3RhcnQoZS5lbmQucm93LGUuZW5kLmNvbHVtbik8MCYmKHRoaXMuc3RhcnQucm93PWUuc3RhcnQucm93LHRoaXMuc3RhcnQuY29sdW1uPWUuc3RhcnQuY29sdW1uKX1lbHNlIGlmKGUuc3RhcnQucm93PT10aGlzLmVuZC5yb3cpdGhpcy5mb2xkcy5wdXNoKGUpLHRoaXMuZW5kLnJvdz1lLmVuZC5yb3csdGhpcy5lbmQuY29sdW1uPWUuZW5kLmNvbHVtbjtlbHNle2lmKGUuZW5kLnJvdyE9dGhpcy5zdGFydC5yb3cpdGhyb3cgbmV3IEVycm9yKCJUcnlpbmcgdG8gYWRkIGZvbGQgdG8gRm9sZFJvdyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIG1hdGNoaW5nIHJvdyIpO3RoaXMuZm9sZHMudW5zaGlmdChlKSx0aGlzLnN0YXJ0LnJvdz1lLnN0YXJ0LnJvdyx0aGlzLnN0YXJ0LmNvbHVtbj1lLnN0YXJ0LmNvbHVtbn1lLmZvbGRMaW5lPXRoaXN9LHRoaXMuY29udGFpbnNSb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PXRoaXMuc3RhcnQucm93JiZlPD10aGlzLmVuZC5yb3d9LHRoaXMud2Fsaz1mdW5jdGlvbihlLHQsbil7dmFyIHI9MCxpPXRoaXMuZm9sZHMscyxvLHUsYT0hMDt0PT1udWxsJiYodD10aGlzLmVuZC5yb3csbj10aGlzLmVuZC5jb2x1bW4pO2Zvcih2YXIgZj0wO2Y8aS5sZW5ndGg7ZisrKXtzPWlbZl0sbz1zLnJhbmdlLmNvbXBhcmVTdGFydCh0LG4pO2lmKG89PS0xKXtlKG51bGwsdCxuLHIsYSk7cmV0dXJufXU9ZShudWxsLHMuc3RhcnQucm93LHMuc3RhcnQuY29sdW1uLHIsYSksdT0hdSYmZShzLnBsYWNlaG9sZGVyLHMuc3RhcnQucm93LHMuc3RhcnQuY29sdW1uLHIpO2lmKHV8fG89PT0wKXJldHVybjthPSFzLnNhbWVSb3cscj1zLmVuZC5jb2x1bW59ZShudWxsLHQsbixyLGEpfSx0aGlzLmdldE5leHRGb2xkVG89ZnVuY3Rpb24oZSx0KXt2YXIgbixyO2Zvcih2YXIgaT0wO2k8dGhpcy5mb2xkcy5sZW5ndGg7aSsrKXtuPXRoaXMuZm9sZHNbaV0scj1uLnJhbmdlLmNvbXBhcmVFbmQoZSx0KTtpZihyPT0tMSlyZXR1cm57Zm9sZDpuLGtpbmQ6ImFmdGVyIn07aWYocj09PTApcmV0dXJue2ZvbGQ6bixraW5kOiJpbnNpZGUifX1yZXR1cm4gbnVsbH0sdGhpcy5hZGRSZW1vdmVDaGFycz1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5nZXROZXh0Rm9sZFRvKGUsdCksaSxzO2lmKHIpe2k9ci5mb2xkO2lmKHIua2luZD09Imluc2lkZSImJmkuc3RhcnQuY29sdW1uIT10JiZpLnN0YXJ0LnJvdyE9ZSl3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUubG9nKGUsdCxpKTtlbHNlIGlmKGkuc3RhcnQucm93PT1lKXtzPXRoaXMuZm9sZHM7dmFyIG89cy5pbmRleE9mKGkpO289PT0wJiYodGhpcy5zdGFydC5jb2x1bW4rPW4pO2ZvcihvO288cy5sZW5ndGg7bysrKXtpPXNbb10saS5zdGFydC5jb2x1bW4rPW47aWYoIWkuc2FtZVJvdylyZXR1cm47aS5lbmQuY29sdW1uKz1ufXRoaXMuZW5kLmNvbHVtbis9bn19fSx0aGlzLnNwbGl0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXROZXh0Rm9sZFRvKGUsdCk7aWYoIW58fG4ua2luZD09Imluc2lkZSIpcmV0dXJuIG51bGw7dmFyIHI9bi5mb2xkLHM9dGhpcy5mb2xkcyxvPXRoaXMuZm9sZERhdGEsdT1zLmluZGV4T2YociksYT1zW3UtMV07dGhpcy5lbmQucm93PWEuZW5kLnJvdyx0aGlzLmVuZC5jb2x1bW49YS5lbmQuY29sdW1uLHM9cy5zcGxpY2UodSxzLmxlbmd0aC11KTt2YXIgZj1uZXcgaShvLHMpO3JldHVybiBvLnNwbGljZShvLmluZGV4T2YodGhpcykrMSwwLGYpLGZ9LHRoaXMubWVyZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5mb2xkcztmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0aGlzLmFkZEZvbGQodFtuXSk7dmFyIHI9dGhpcy5mb2xkRGF0YTtyLnNwbGljZShyLmluZGV4T2YoZSksMSl9LHRoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT1bdGhpcy5yYW5nZS50b1N0cmluZygpKyI6IFsiXTtyZXR1cm4gdGhpcy5mb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UucHVzaCgiICAiK3QudG9TdHJpbmcoKSl9KSxlLnB1c2goIl0iKSxlLmpvaW4oIlxuIil9LHRoaXMuaWR4VG9Qb3NpdGlvbj1mdW5jdGlvbihlKXt2YXIgdD0wO2Zvcih2YXIgbj0wO248dGhpcy5mb2xkcy5sZW5ndGg7bisrKXt2YXIgcj10aGlzLmZvbGRzW25dO2UtPXIuc3RhcnQuY29sdW1uLXQ7aWYoZTwwKXJldHVybntyb3c6ci5zdGFydC5yb3csY29sdW1uOnIuc3RhcnQuY29sdW1uK2V9O2UtPXIucGxhY2Vob2xkZXIubGVuZ3RoO2lmKGU8MClyZXR1cm4gci5zdGFydDt0PXIuZW5kLmNvbHVtbn1yZXR1cm57cm93OnRoaXMuZW5kLnJvdyxjb2x1bW46dGhpcy5lbmQuY29sdW1uK2V9fX0pLmNhbGwoaS5wcm90b3R5cGUpLHQuRm9sZExpbmU9aX0pLGFjZS5kZWZpbmUoImFjZS9yYW5nZV9saXN0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL3JhbmdlIikuUmFuZ2UsaT1yLmNvbXBhcmVQb2ludHMscz1mdW5jdGlvbigpe3RoaXMucmFuZ2VzPVtdLHRoaXMuJGJpYXM9MX07KGZ1bmN0aW9uKCl7dGhpcy5jb21wYXJlUG9pbnRzPWksdGhpcy5wb2ludEluZGV4PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLnJhbmdlcztmb3IodmFyIHM9bnx8MDtzPHIubGVuZ3RoO3MrKyl7dmFyIG89cltzXSx1PWkoZSxvLmVuZCk7aWYodT4wKWNvbnRpbnVlO3ZhciBhPWkoZSxvLnN0YXJ0KTtyZXR1cm4gdT09PTA/dCYmYSE9PTA/LXMtMjpzOmE+MHx8YT09PTAmJiF0P3M6LXMtMX1yZXR1cm4tcy0xfSx0aGlzLmFkZD1mdW5jdGlvbihlKXt2YXIgdD0hZS5pc0VtcHR5KCksbj10aGlzLnBvaW50SW5kZXgoZS5zdGFydCx0KTtuPDAmJihuPS1uLTEpO3ZhciByPXRoaXMucG9pbnRJbmRleChlLmVuZCx0LG4pO3JldHVybiByPDA/cj0tci0xOnIrKyx0aGlzLnJhbmdlcy5zcGxpY2UobixyLW4sZSl9LHRoaXMuYWRkTGlzdD1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG49ZS5sZW5ndGg7bi0tOyl0LnB1c2guYXBwbHkodCx0aGlzLmFkZChlW25dKSk7cmV0dXJuIHR9LHRoaXMuc3Vic3RyYWN0UG9pbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wb2ludEluZGV4KGUpO2lmKHQ+PTApcmV0dXJuIHRoaXMucmFuZ2VzLnNwbGljZSh0LDEpfSx0aGlzLm1lcmdlPWZ1bmN0aW9uKCl7dmFyIGU9W10sdD10aGlzLnJhbmdlczt0PXQuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBpKGUuc3RhcnQsdC5zdGFydCl9KTt2YXIgbj10WzBdLHI7Zm9yKHZhciBzPTE7czx0Lmxlbmd0aDtzKyspe3I9bixuPXRbc107dmFyIG89aShyLmVuZCxuLnN0YXJ0KTtpZihvPDApY29udGludWU7aWYobz09MCYmIXIuaXNFbXB0eSgpJiYhbi5pc0VtcHR5KCkpY29udGludWU7aShyLmVuZCxuLmVuZCk8MCYmKHIuZW5kLnJvdz1uLmVuZC5yb3csci5lbmQuY29sdW1uPW4uZW5kLmNvbHVtbiksdC5zcGxpY2UocywxKSxlLnB1c2gobiksbj1yLHMtLX1yZXR1cm4gdGhpcy5yYW5nZXM9dCxlfSx0aGlzLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMucG9pbnRJbmRleCh7cm93OmUsY29sdW1uOnR9KT49MH0sdGhpcy5jb250YWluc1BvaW50PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBvaW50SW5kZXgoZSk+PTB9LHRoaXMucmFuZ2VBdFBvaW50PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucG9pbnRJbmRleChlKTtpZih0Pj0wKXJldHVybiB0aGlzLnJhbmdlc1t0XX0sdGhpcy5jbGlwUm93cz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMucmFuZ2VzO2lmKG5bMF0uc3RhcnQucm93PnR8fG5bbi5sZW5ndGgtMV0uc3RhcnQucm93PGUpcmV0dXJuW107dmFyIHI9dGhpcy5wb2ludEluZGV4KHtyb3c6ZSxjb2x1bW46MH0pO3I8MCYmKHI9LXItMSk7dmFyIGk9dGhpcy5wb2ludEluZGV4KHtyb3c6dCxjb2x1bW46MH0scik7aTwwJiYoaT0taS0xKTt2YXIgcz1bXTtmb3IodmFyIG89cjtvPGk7bysrKXMucHVzaChuW29dKTtyZXR1cm4gc30sdGhpcy5yZW1vdmVBbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5nZXMuc3BsaWNlKDAsdGhpcy5yYW5nZXMubGVuZ3RoKX0sdGhpcy5hdHRhY2g9ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uJiZ0aGlzLmRldGFjaCgpLHRoaXMuc2Vzc2lvbj1lLHRoaXMub25DaGFuZ2U9dGhpcy4kb25DaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZSIsdGhpcy5vbkNoYW5nZSl9LHRoaXMuZGV0YWNoPWZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Vzc2lvbilyZXR1cm47dGhpcy5zZXNzaW9uLnJlbW92ZUxpc3RlbmVyKCJjaGFuZ2UiLHRoaXMub25DaGFuZ2UpLHRoaXMuc2Vzc2lvbj1udWxsfSx0aGlzLiRvbkNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0YXJ0LG49ZS5lbmQscj10LnJvdyxpPW4ucm93LHM9dGhpcy5yYW5nZXM7Zm9yKHZhciBvPTAsdT1zLmxlbmd0aDtvPHU7bysrKXt2YXIgYT1zW29dO2lmKGEuZW5kLnJvdz49cilicmVha31pZihlLmFjdGlvbj09Imluc2VydCIpe3ZhciBmPWktcixsPS10LmNvbHVtbituLmNvbHVtbjtmb3IoO288dTtvKyspe3ZhciBhPXNbb107aWYoYS5zdGFydC5yb3c+cilicmVhazthLnN0YXJ0LnJvdz09ciYmYS5zdGFydC5jb2x1bW4+PXQuY29sdW1uJiYoYS5zdGFydC5jb2x1bW49PXQuY29sdW1uJiZ0aGlzLiRiaWFzPD0wfHwoYS5zdGFydC5jb2x1bW4rPWwsYS5zdGFydC5yb3crPWYpKTtpZihhLmVuZC5yb3c9PXImJmEuZW5kLmNvbHVtbj49dC5jb2x1bW4pe2lmKGEuZW5kLmNvbHVtbj09dC5jb2x1bW4mJnRoaXMuJGJpYXM8MCljb250aW51ZTthLmVuZC5jb2x1bW49PXQuY29sdW1uJiZsPjAmJm88dS0xJiZhLmVuZC5jb2x1bW4+YS5zdGFydC5jb2x1bW4mJmEuZW5kLmNvbHVtbj09c1tvKzFdLnN0YXJ0LmNvbHVtbiYmKGEuZW5kLmNvbHVtbi09bCksYS5lbmQuY29sdW1uKz1sLGEuZW5kLnJvdys9Zn19fWVsc2V7dmFyIGY9ci1pLGw9dC5jb2x1bW4tbi5jb2x1bW47Zm9yKDtvPHU7bysrKXt2YXIgYT1zW29dO2lmKGEuc3RhcnQucm93PmkpYnJlYWs7aWYoYS5lbmQucm93PGkmJihyPGEuZW5kLnJvd3x8cj09YS5lbmQucm93JiZ0LmNvbHVtbjxhLmVuZC5jb2x1bW4pKWEuZW5kLnJvdz1yLGEuZW5kLmNvbHVtbj10LmNvbHVtbjtlbHNlIGlmKGEuZW5kLnJvdz09aSlpZihhLmVuZC5jb2x1bW48PW4uY29sdW1uKXtpZihmfHxhLmVuZC5jb2x1bW4+dC5jb2x1bW4pYS5lbmQuY29sdW1uPXQuY29sdW1uLGEuZW5kLnJvdz10LnJvd31lbHNlIGEuZW5kLmNvbHVtbis9bCxhLmVuZC5yb3crPWY7ZWxzZSBhLmVuZC5yb3c+aSYmKGEuZW5kLnJvdys9Zik7aWYoYS5zdGFydC5yb3c8aSYmKHI8YS5zdGFydC5yb3d8fHI9PWEuc3RhcnQucm93JiZ0LmNvbHVtbjxhLnN0YXJ0LmNvbHVtbikpYS5zdGFydC5yb3c9cixhLnN0YXJ0LmNvbHVtbj10LmNvbHVtbjtlbHNlIGlmKGEuc3RhcnQucm93PT1pKWlmKGEuc3RhcnQuY29sdW1uPD1uLmNvbHVtbil7aWYoZnx8YS5zdGFydC5jb2x1bW4+dC5jb2x1bW4pYS5zdGFydC5jb2x1bW49dC5jb2x1bW4sYS5zdGFydC5yb3c9dC5yb3d9ZWxzZSBhLnN0YXJ0LmNvbHVtbis9bCxhLnN0YXJ0LnJvdys9ZjtlbHNlIGEuc3RhcnQucm93PmkmJihhLnN0YXJ0LnJvdys9Zil9fWlmKGYhPTAmJm88dSlmb3IoO288dTtvKyspe3ZhciBhPXNbb107YS5zdGFydC5yb3crPWYsYS5lbmQucm93Kz1mfX19KS5jYWxsKHMucHJvdG90eXBlKSx0LlJhbmdlTGlzdD1zfSksYWNlLmRlZmluZSgiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlX2xpc3QiLCJhY2UvbGliL29vcCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQpe2Uucm93LT10LnJvdyxlLnJvdz09MCYmKGUuY29sdW1uLT10LmNvbHVtbil9ZnVuY3Rpb24gdShlLHQpe28oZS5zdGFydCx0KSxvKGUuZW5kLHQpfWZ1bmN0aW9uIGEoZSx0KXtlLnJvdz09MCYmKGUuY29sdW1uKz10LmNvbHVtbiksZS5yb3crPXQucm93fWZ1bmN0aW9uIGYoZSx0KXthKGUuc3RhcnQsdCksYShlLmVuZCx0KX12YXIgcj1lKCIuLi9yYW5nZV9saXN0IikuUmFuZ2VMaXN0LGk9ZSgiLi4vbGliL29vcCIpLHM9dC5Gb2xkPWZ1bmN0aW9uKGUsdCl7dGhpcy5mb2xkTGluZT1udWxsLHRoaXMucGxhY2Vob2xkZXI9dCx0aGlzLnJhbmdlPWUsdGhpcy5zdGFydD1lLnN0YXJ0LHRoaXMuZW5kPWUuZW5kLHRoaXMuc2FtZVJvdz1lLnN0YXJ0LnJvdz09ZS5lbmQucm93LHRoaXMuc3ViRm9sZHM9dGhpcy5yYW5nZXM9W119O2kuaW5oZXJpdHMocyxyKSxmdW5jdGlvbigpe3RoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4nIicrdGhpcy5wbGFjZWhvbGRlcisnIiAnK3RoaXMucmFuZ2UudG9TdHJpbmcoKX0sdGhpcy5zZXRGb2xkTGluZT1mdW5jdGlvbihlKXt0aGlzLmZvbGRMaW5lPWUsdGhpcy5zdWJGb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Quc2V0Rm9sZExpbmUoZSl9KX0sdGhpcy5jbG9uZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmFuZ2UuY2xvbmUoKSx0PW5ldyBzKGUsdGhpcy5wbGFjZWhvbGRlcik7cmV0dXJuIHRoaXMuc3ViRm9sZHMuZm9yRWFjaChmdW5jdGlvbihlKXt0LnN1YkZvbGRzLnB1c2goZS5jbG9uZSgpKX0pLHQuY29sbGFwc2VDaGlsZHJlbj10aGlzLmNvbGxhcHNlQ2hpbGRyZW4sdH0sdGhpcy5hZGRTdWJGb2xkPWZ1bmN0aW9uKGUpe2lmKHRoaXMucmFuZ2UuaXNFcXVhbChlKSlyZXR1cm47dShlLHRoaXMuc3RhcnQpO3ZhciB0PWUuc3RhcnQucm93LG49ZS5zdGFydC5jb2x1bW47Zm9yKHZhciByPTAsaT0tMTtyPHRoaXMuc3ViRm9sZHMubGVuZ3RoO3IrKyl7aT10aGlzLnN1YkZvbGRzW3JdLnJhbmdlLmNvbXBhcmUodCxuKTtpZihpIT0xKWJyZWFrfXZhciBzPXRoaXMuc3ViRm9sZHNbcl0sbz0wO2lmKGk9PTApe2lmKHMucmFuZ2UuY29udGFpbnNSYW5nZShlKSlyZXR1cm4gcy5hZGRTdWJGb2xkKGUpO289MX12YXIgdD1lLnJhbmdlLmVuZC5yb3csbj1lLnJhbmdlLmVuZC5jb2x1bW47Zm9yKHZhciBhPXIsaT0tMTthPHRoaXMuc3ViRm9sZHMubGVuZ3RoO2ErKyl7aT10aGlzLnN1YkZvbGRzW2FdLnJhbmdlLmNvbXBhcmUodCxuKTtpZihpIT0xKWJyZWFrfWk9PTAmJmErKzt2YXIgZj10aGlzLnN1YkZvbGRzLnNwbGljZShyLGEtcixlKSxsPWk9PTA/Zi5sZW5ndGgtMTpmLmxlbmd0aDtmb3IodmFyIGM9bztjPGw7YysrKWUuYWRkU3ViRm9sZChmW2NdKTtyZXR1cm4gZS5zZXRGb2xkTGluZSh0aGlzLmZvbGRMaW5lKSxlfSx0aGlzLnJlc3RvcmVSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gZihlLHRoaXMuc3RhcnQpfX0uY2FsbChzLnByb3RvdHlwZSl9KSxhY2UuZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGRpbmciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiLCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGRfbGluZSIsImFjZS9lZGl0X3Nlc3Npb24vZm9sZCIsImFjZS90b2tlbl9pdGVyYXRvciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdSgpe3RoaXMuZ2V0Rm9sZEF0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmdldEZvbGRMaW5lKGUpO2lmKCFyKXJldHVybiBudWxsO3ZhciBpPXIuZm9sZHM7Zm9yKHZhciBzPTA7czxpLmxlbmd0aDtzKyspe3ZhciBvPWlbc10ucmFuZ2U7aWYoby5jb250YWlucyhlLHQpKXtpZihuPT0xJiZvLmlzRW5kKGUsdCkmJiFvLmlzRW1wdHkoKSljb250aW51ZTtpZihuPT0tMSYmby5pc1N0YXJ0KGUsdCkmJiFvLmlzRW1wdHkoKSljb250aW51ZTtyZXR1cm4gaVtzXX19fSx0aGlzLmdldEZvbGRzSW5SYW5nZT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0YXJ0LG49ZS5lbmQscj10aGlzLiRmb2xkRGF0YSxpPVtdO3QuY29sdW1uKz0xLG4uY29sdW1uLT0xO2Zvcih2YXIgcz0wO3M8ci5sZW5ndGg7cysrKXt2YXIgbz1yW3NdLnJhbmdlLmNvbXBhcmVSYW5nZShlKTtpZihvPT0yKWNvbnRpbnVlO2lmKG89PS0yKWJyZWFrO3ZhciB1PXJbc10uZm9sZHM7Zm9yKHZhciBhPTA7YTx1Lmxlbmd0aDthKyspe3ZhciBmPXVbYV07bz1mLnJhbmdlLmNvbXBhcmVSYW5nZShlKTtpZihvPT0tMilicmVhaztpZihvPT0yKWNvbnRpbnVlO2lmKG89PTQyKWJyZWFrO2kucHVzaChmKX19cmV0dXJuIHQuY29sdW1uLT0xLG4uY29sdW1uKz0xLGl9LHRoaXMuZ2V0Rm9sZHNJblJhbmdlTGlzdD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgdD1bXTtlLmZvckVhY2goZnVuY3Rpb24oZSl7dD10LmNvbmNhdCh0aGlzLmdldEZvbGRzSW5SYW5nZShlKSl9LHRoaXMpfWVsc2UgdmFyIHQ9dGhpcy5nZXRGb2xkc0luUmFuZ2UoZSk7cmV0dXJuIHR9LHRoaXMuZ2V0QWxsRm9sZHM9ZnVuY3Rpb24oKXt2YXIgZT1bXSx0PXRoaXMuJGZvbGREYXRhO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWZvcih2YXIgcj0wO3I8dFtuXS5mb2xkcy5sZW5ndGg7cisrKWUucHVzaCh0W25dLmZvbGRzW3JdKTtyZXR1cm4gZX0sdGhpcy5nZXRGb2xkU3RyaW5nQXQ9ZnVuY3Rpb24oZSx0LG4scil7cj1yfHx0aGlzLmdldEZvbGRMaW5lKGUpO2lmKCFyKXJldHVybiBudWxsO3ZhciBpPXtlbmQ6e2NvbHVtbjowfX0scyxvO2Zvcih2YXIgdT0wO3U8ci5mb2xkcy5sZW5ndGg7dSsrKXtvPXIuZm9sZHNbdV07dmFyIGE9by5yYW5nZS5jb21wYXJlRW5kKGUsdCk7aWYoYT09LTEpe3M9dGhpcy5nZXRMaW5lKG8uc3RhcnQucm93KS5zdWJzdHJpbmcoaS5lbmQuY29sdW1uLG8uc3RhcnQuY29sdW1uKTticmVha31pZihhPT09MClyZXR1cm4gbnVsbDtpPW99cmV0dXJuIHN8fChzPXRoaXMuZ2V0TGluZShvLnN0YXJ0LnJvdykuc3Vic3RyaW5nKGkuZW5kLmNvbHVtbikpLG49PS0xP3Muc3Vic3RyaW5nKDAsdC1pLmVuZC5jb2x1bW4pOm49PTE/cy5zdWJzdHJpbmcodC1pLmVuZC5jb2x1bW4pOnN9LHRoaXMuZ2V0Rm9sZExpbmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRmb2xkRGF0YSxyPTA7dCYmKHI9bi5pbmRleE9mKHQpKSxyPT0tMSYmKHI9MCk7Zm9yKHI7cjxuLmxlbmd0aDtyKyspe3ZhciBpPW5bcl07aWYoaS5zdGFydC5yb3c8PWUmJmkuZW5kLnJvdz49ZSlyZXR1cm4gaTtpZihpLmVuZC5yb3c+ZSlyZXR1cm4gbnVsbH1yZXR1cm4gbnVsbH0sdGhpcy5nZXROZXh0Rm9sZExpbmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRmb2xkRGF0YSxyPTA7dCYmKHI9bi5pbmRleE9mKHQpKSxyPT0tMSYmKHI9MCk7Zm9yKHI7cjxuLmxlbmd0aDtyKyspe3ZhciBpPW5bcl07aWYoaS5lbmQucm93Pj1lKXJldHVybiBpfXJldHVybiBudWxsfSx0aGlzLmdldEZvbGRlZFJvd0NvdW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kZm9sZERhdGEscj10LWUrMTtmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIHM9bltpXSxvPXMuZW5kLnJvdyx1PXMuc3RhcnQucm93O2lmKG8+PXQpe3U8dCYmKHU+PWU/ci09dC11OnI9MCk7YnJlYWt9bz49ZSYmKHU+PWU/ci09by11OnItPW8tZSsxKX1yZXR1cm4gcn0sdGhpcy4kYWRkRm9sZExpbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJGZvbGREYXRhLnB1c2goZSksdGhpcy4kZm9sZERhdGEuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLnN0YXJ0LnJvdy10LnN0YXJ0LnJvd30pLGV9LHRoaXMuYWRkRm9sZD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGZvbGREYXRhLHI9ITEsbztlIGluc3RhbmNlb2Ygcz9vPWU6KG89bmV3IHModCxlKSxvLmNvbGxhcHNlQ2hpbGRyZW49dC5jb2xsYXBzZUNoaWxkcmVuKSx0aGlzLiRjbGlwUmFuZ2VUb0RvY3VtZW50KG8ucmFuZ2UpO3ZhciB1PW8uc3RhcnQucm93LGE9by5zdGFydC5jb2x1bW4sZj1vLmVuZC5yb3csbD1vLmVuZC5jb2x1bW4sYz10aGlzLmdldEZvbGRBdCh1LGEsMSksaD10aGlzLmdldEZvbGRBdChmLGwsLTEpO2lmKGMmJmg9PWMpcmV0dXJuIGMuYWRkU3ViRm9sZChvKTtjJiYhYy5yYW5nZS5pc1N0YXJ0KHUsYSkmJnRoaXMucmVtb3ZlRm9sZChjKSxoJiYhaC5yYW5nZS5pc0VuZChmLGwpJiZ0aGlzLnJlbW92ZUZvbGQoaCk7dmFyIHA9dGhpcy5nZXRGb2xkc0luUmFuZ2Uoby5yYW5nZSk7cC5sZW5ndGg+MCYmKHRoaXMucmVtb3ZlRm9sZHMocCkscC5mb3JFYWNoKGZ1bmN0aW9uKGUpe28uYWRkU3ViRm9sZChlKX0pKTtmb3IodmFyIGQ9MDtkPG4ubGVuZ3RoO2QrKyl7dmFyIHY9bltkXTtpZihmPT12LnN0YXJ0LnJvdyl7di5hZGRGb2xkKG8pLHI9ITA7YnJlYWt9aWYodT09di5lbmQucm93KXt2LmFkZEZvbGQobykscj0hMDtpZighby5zYW1lUm93KXt2YXIgbT1uW2QrMV07aWYobSYmbS5zdGFydC5yb3c9PWYpe3YubWVyZ2UobSk7YnJlYWt9fWJyZWFrfWlmKGY8PXYuc3RhcnQucm93KWJyZWFrfXJldHVybiByfHwodj10aGlzLiRhZGRGb2xkTGluZShuZXcgaSh0aGlzLiRmb2xkRGF0YSxvKSkpLHRoaXMuJHVzZVdyYXBNb2RlP3RoaXMuJHVwZGF0ZVdyYXBEYXRhKHYuc3RhcnQucm93LHYuc3RhcnQucm93KTp0aGlzLiR1cGRhdGVSb3dMZW5ndGhDYWNoZSh2LnN0YXJ0LnJvdyx2LnN0YXJ0LnJvdyksdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy5fc2lnbmFsKCJjaGFuZ2VGb2xkIix7ZGF0YTpvLGFjdGlvbjoiYWRkIn0pLG99LHRoaXMuYWRkRm9sZHM9ZnVuY3Rpb24oZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RoaXMuYWRkRm9sZChlKX0sdGhpcyl9LHRoaXMucmVtb3ZlRm9sZD1mdW5jdGlvbihlKXt2YXIgdD1lLmZvbGRMaW5lLG49dC5zdGFydC5yb3cscj10LmVuZC5yb3csaT10aGlzLiRmb2xkRGF0YSxzPXQuZm9sZHM7aWYocy5sZW5ndGg9PTEpaS5zcGxpY2UoaS5pbmRleE9mKHQpLDEpO2Vsc2UgaWYodC5yYW5nZS5pc0VuZChlLmVuZC5yb3csZS5lbmQuY29sdW1uKSlzLnBvcCgpLHQuZW5kLnJvdz1zW3MubGVuZ3RoLTFdLmVuZC5yb3csdC5lbmQuY29sdW1uPXNbcy5sZW5ndGgtMV0uZW5kLmNvbHVtbjtlbHNlIGlmKHQucmFuZ2UuaXNTdGFydChlLnN0YXJ0LnJvdyxlLnN0YXJ0LmNvbHVtbikpcy5zaGlmdCgpLHQuc3RhcnQucm93PXNbMF0uc3RhcnQucm93LHQuc3RhcnQuY29sdW1uPXNbMF0uc3RhcnQuY29sdW1uO2Vsc2UgaWYoZS5zYW1lUm93KXMuc3BsaWNlKHMuaW5kZXhPZihlKSwxKTtlbHNle3ZhciBvPXQuc3BsaXQoZS5zdGFydC5yb3csZS5zdGFydC5jb2x1bW4pO3M9by5mb2xkcyxzLnNoaWZ0KCksby5zdGFydC5yb3c9c1swXS5zdGFydC5yb3csby5zdGFydC5jb2x1bW49c1swXS5zdGFydC5jb2x1bW59dGhpcy4kdXBkYXRpbmd8fCh0aGlzLiR1c2VXcmFwTW9kZT90aGlzLiR1cGRhdGVXcmFwRGF0YShuLHIpOnRoaXMuJHVwZGF0ZVJvd0xlbmd0aENhY2hlKG4scikpLHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuX3NpZ25hbCgiY2hhbmdlRm9sZCIse2RhdGE6ZSxhY3Rpb246InJlbW92ZSJ9KX0sdGhpcy5yZW1vdmVGb2xkcz1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goZVtuXSk7dC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RoaXMucmVtb3ZlRm9sZChlKX0sdGhpcyksdGhpcy4kbW9kaWZpZWQ9ITB9LHRoaXMuZXhwYW5kRm9sZD1mdW5jdGlvbihlKXt0aGlzLnJlbW92ZUZvbGQoZSksZS5zdWJGb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UucmVzdG9yZVJhbmdlKHQpLHRoaXMuYWRkRm9sZCh0KX0sdGhpcyksZS5jb2xsYXBzZUNoaWxkcmVuPjAmJnRoaXMuZm9sZEFsbChlLnN0YXJ0LnJvdysxLGUuZW5kLnJvdyxlLmNvbGxhcHNlQ2hpbGRyZW4tMSksZS5zdWJGb2xkcz1bXX0sdGhpcy5leHBhbmRGb2xkcz1mdW5jdGlvbihlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7dGhpcy5leHBhbmRGb2xkKGUpfSx0aGlzKX0sdGhpcy51bmZvbGQ9ZnVuY3Rpb24oZSx0KXt2YXIgbixpO2U9PW51bGw/KG49bmV3IHIoMCwwLHRoaXMuZ2V0TGVuZ3RoKCksMCksdD0hMCk6dHlwZW9mIGU9PSJudW1iZXIiP249bmV3IHIoZSwwLGUsdGhpcy5nZXRMaW5lKGUpLmxlbmd0aCk6InJvdyJpbiBlP249ci5mcm9tUG9pbnRzKGUsZSk6bj1lLGk9dGhpcy5nZXRGb2xkc0luUmFuZ2VMaXN0KG4pO2lmKHQpdGhpcy5yZW1vdmVGb2xkcyhpKTtlbHNle3ZhciBzPWk7d2hpbGUocy5sZW5ndGgpdGhpcy5leHBhbmRGb2xkcyhzKSxzPXRoaXMuZ2V0Rm9sZHNJblJhbmdlTGlzdChuKX1pZihpLmxlbmd0aClyZXR1cm4gaX0sdGhpcy5pc1Jvd0ZvbGRlZD1mdW5jdGlvbihlLHQpe3JldHVybiEhdGhpcy5nZXRGb2xkTGluZShlLHQpfSx0aGlzLmdldFJvd0ZvbGRFbmQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldEZvbGRMaW5lKGUsdCk7cmV0dXJuIG4/bi5lbmQucm93OmV9LHRoaXMuZ2V0Um93Rm9sZFN0YXJ0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRGb2xkTGluZShlLHQpO3JldHVybiBuP24uc3RhcnQucm93OmV9LHRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lPWZ1bmN0aW9uKGUsdCxuLHIsaSl7cj09bnVsbCYmKHI9ZS5zdGFydC5yb3cpLGk9PW51bGwmJihpPTApLHQ9PW51bGwmJih0PWUuZW5kLnJvdyksbj09bnVsbCYmKG49dGhpcy5nZXRMaW5lKHQpLmxlbmd0aCk7dmFyIHM9dGhpcy5kb2Msbz0iIjtyZXR1cm4gZS53YWxrKGZ1bmN0aW9uKGUsdCxuLHUpe2lmKHQ8cilyZXR1cm47aWYodD09cil7aWYobjxpKXJldHVybjt1PU1hdGgubWF4KGksdSl9ZSE9bnVsbD9vKz1lOm8rPXMuZ2V0TGluZSh0KS5zdWJzdHJpbmcodSxuKX0sdCxuKSxvfSx0aGlzLmdldERpc3BsYXlMaW5lPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuZ2V0Rm9sZExpbmUoZSk7aWYoIWkpe3ZhciBzO3JldHVybiBzPXRoaXMuZG9jLmdldExpbmUoZSkscy5zdWJzdHJpbmcocnx8MCx0fHxzLmxlbmd0aCl9cmV0dXJuIHRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lKGksZSx0LG4scil9LHRoaXMuJGNsb25lRm9sZERhdGE9ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gZT10aGlzLiRmb2xkRGF0YS5tYXAoZnVuY3Rpb24odCl7dmFyIG49dC5mb2xkcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvbmUoKX0pO3JldHVybiBuZXcgaShlLG4pfSksZX0sdGhpcy50b2dnbGVGb2xkPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2VsZWN0aW9uLG49dC5nZXRSYW5nZSgpLHIsaTtpZihuLmlzRW1wdHkoKSl7dmFyIHM9bi5zdGFydDtyPXRoaXMuZ2V0Rm9sZEF0KHMucm93LHMuY29sdW1uKTtpZihyKXt0aGlzLmV4cGFuZEZvbGQocik7cmV0dXJufShpPXRoaXMuZmluZE1hdGNoaW5nQnJhY2tldChzKSk/bi5jb21wYXJlUG9pbnQoaSk9PTE/bi5lbmQ9aToobi5zdGFydD1pLG4uc3RhcnQuY29sdW1uKyssbi5lbmQuY29sdW1uLS0pOihpPXRoaXMuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OnMucm93LGNvbHVtbjpzLmNvbHVtbisxfSkpPyhuLmNvbXBhcmVQb2ludChpKT09MT9uLmVuZD1pOm4uc3RhcnQ9aSxuLnN0YXJ0LmNvbHVtbisrKTpuPXRoaXMuZ2V0Q29tbWVudEZvbGRSYW5nZShzLnJvdyxzLmNvbHVtbil8fG59ZWxzZXt2YXIgbz10aGlzLmdldEZvbGRzSW5SYW5nZShuKTtpZihlJiZvLmxlbmd0aCl7dGhpcy5leHBhbmRGb2xkcyhvKTtyZXR1cm59by5sZW5ndGg9PTEmJihyPW9bMF0pfXJ8fChyPXRoaXMuZ2V0Rm9sZEF0KG4uc3RhcnQucm93LG4uc3RhcnQuY29sdW1uKSk7aWYociYmci5yYW5nZS50b1N0cmluZygpPT1uLnRvU3RyaW5nKCkpe3RoaXMuZXhwYW5kRm9sZChyKTtyZXR1cm59dmFyIHU9Ii4uLiI7aWYoIW4uaXNNdWx0aUxpbmUoKSl7dT10aGlzLmdldFRleHRSYW5nZShuKTtpZih1Lmxlbmd0aDw0KXJldHVybjt1PXUudHJpbSgpLnN1YnN0cmluZygwLDIpKyIuLiJ9dGhpcy5hZGRGb2xkKHUsbil9LHRoaXMuZ2V0Q29tbWVudEZvbGRSYW5nZT1mdW5jdGlvbihlLHQsbil7dmFyIGk9bmV3IG8odGhpcyxlLHQpLHM9aS5nZXRDdXJyZW50VG9rZW4oKSx1PXMudHlwZTtpZihzJiYvXmNvbW1lbnR8c3RyaW5nLy50ZXN0KHUpKXt1PXUubWF0Y2goL2NvbW1lbnR8c3RyaW5nLylbMF0sdT09ImNvbW1lbnQiJiYodSs9Inxkb2Mtc3RhcnQiKTt2YXIgYT1uZXcgUmVnRXhwKHUpLGY9bmV3IHI7aWYobiE9MSl7ZG8gcz1pLnN0ZXBCYWNrd2FyZCgpO3doaWxlKHMmJmEudGVzdChzLnR5cGUpKTtpLnN0ZXBGb3J3YXJkKCl9Zi5zdGFydC5yb3c9aS5nZXRDdXJyZW50VG9rZW5Sb3coKSxmLnN0YXJ0LmNvbHVtbj1pLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpKzIsaT1uZXcgbyh0aGlzLGUsdCk7aWYobiE9LTEpe3ZhciBsPS0xO2Rve3M9aS5zdGVwRm9yd2FyZCgpO2lmKGw9PS0xKXt2YXIgYz10aGlzLmdldFN0YXRlKGkuJHJvdyk7YS50ZXN0KGMpfHwobD1pLiRyb3cpfWVsc2UgaWYoaS4kcm93PmwpYnJlYWt9d2hpbGUocyYmYS50ZXN0KHMudHlwZSkpO3M9aS5zdGVwQmFja3dhcmQoKX1lbHNlIHM9aS5nZXRDdXJyZW50VG9rZW4oKTtyZXR1cm4gZi5lbmQucm93PWkuZ2V0Q3VycmVudFRva2VuUm93KCksZi5lbmQuY29sdW1uPWkuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrcy52YWx1ZS5sZW5ndGgtMixmfX0sdGhpcy5mb2xkQWxsPWZ1bmN0aW9uKGUsdCxuKXtuPT11bmRlZmluZWQmJihuPTFlNSk7dmFyIHI9dGhpcy5mb2xkV2lkZ2V0cztpZighcilyZXR1cm47dD10fHx0aGlzLmdldExlbmd0aCgpLGU9ZXx8MDtmb3IodmFyIGk9ZTtpPHQ7aSsrKXtyW2ldPT1udWxsJiYocltpXT10aGlzLmdldEZvbGRXaWRnZXQoaSkpO2lmKHJbaV0hPSJzdGFydCIpY29udGludWU7dmFyIHM9dGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UoaSk7aWYocyYmcy5pc011bHRpTGluZSgpJiZzLmVuZC5yb3c8PXQmJnMuc3RhcnQucm93Pj1lKXtpPXMuZW5kLnJvdzt0cnl7dmFyIG89dGhpcy5hZGRGb2xkKCIuLi4iLHMpO28mJihvLmNvbGxhcHNlQ2hpbGRyZW49bil9Y2F0Y2godSl7fX19fSx0aGlzLiRmb2xkU3R5bGVzPXttYW51YWw6MSxtYXJrYmVnaW46MSxtYXJrYmVnaW5lbmQ6MX0sdGhpcy4kZm9sZFN0eWxlPSJtYXJrYmVnaW4iLHRoaXMuc2V0Rm9sZFN0eWxlPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRmb2xkU3R5bGVzW2VdKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb2xkIHN0eWxlOiAiK2UrIlsiK09iamVjdC5rZXlzKHRoaXMuJGZvbGRTdHlsZXMpLmpvaW4oIiwgIikrIl0iKTtpZih0aGlzLiRmb2xkU3R5bGU9PWUpcmV0dXJuO3RoaXMuJGZvbGRTdHlsZT1lLGU9PSJtYW51YWwiJiZ0aGlzLnVuZm9sZCgpO3ZhciB0PXRoaXMuJGZvbGRNb2RlO3RoaXMuJHNldEZvbGRpbmcobnVsbCksdGhpcy4kc2V0Rm9sZGluZyh0KX0sdGhpcy4kc2V0Rm9sZGluZz1mdW5jdGlvbihlKXtpZih0aGlzLiRmb2xkTW9kZT09ZSlyZXR1cm47dGhpcy4kZm9sZE1vZGU9ZSx0aGlzLm9mZigiY2hhbmdlIix0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cyksdGhpcy5vZmYoInRva2VuaXplclVwZGF0ZSIsdGhpcy4kdG9rZW5pemVyVXBkYXRlRm9sZFdpZGdldHMpLHRoaXMuX3NpZ25hbCgiY2hhbmdlQW5ub3RhdGlvbiIpO2lmKCFlfHx0aGlzLiRmb2xkU3R5bGU9PSJtYW51YWwiKXt0aGlzLmZvbGRXaWRnZXRzPW51bGw7cmV0dXJufXRoaXMuZm9sZFdpZGdldHM9W10sdGhpcy5nZXRGb2xkV2lkZ2V0PWUuZ2V0Rm9sZFdpZGdldC5iaW5kKGUsdGhpcyx0aGlzLiRmb2xkU3R5bGUpLHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWUuZ2V0Rm9sZFdpZGdldFJhbmdlLmJpbmQoZSx0aGlzLHRoaXMuJGZvbGRTdHlsZSksdGhpcy4kdXBkYXRlRm9sZFdpZGdldHM9dGhpcy51cGRhdGVGb2xkV2lkZ2V0cy5iaW5kKHRoaXMpLHRoaXMuJHRva2VuaXplclVwZGF0ZUZvbGRXaWRnZXRzPXRoaXMudG9rZW5pemVyVXBkYXRlRm9sZFdpZGdldHMuYmluZCh0aGlzKSx0aGlzLm9uKCJjaGFuZ2UiLHRoaXMuJHVwZGF0ZUZvbGRXaWRnZXRzKSx0aGlzLm9uKCJ0b2tlbml6ZXJVcGRhdGUiLHRoaXMuJHRva2VuaXplclVwZGF0ZUZvbGRXaWRnZXRzKX0sdGhpcy5nZXRQYXJlbnRGb2xkUmFuZ2VEYXRhPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5mb2xkV2lkZ2V0cztpZighbnx8dCYmbltlXSlyZXR1cm57fTt2YXIgcj1lLTEsaTt3aGlsZShyPj0wKXt2YXIgcz1uW3JdO3M9PW51bGwmJihzPW5bcl09dGhpcy5nZXRGb2xkV2lkZ2V0KHIpKTtpZihzPT0ic3RhcnQiKXt2YXIgbz10aGlzLmdldEZvbGRXaWRnZXRSYW5nZShyKTtpfHwoaT1vKTtpZihvJiZvLmVuZC5yb3c+PWUpYnJlYWt9ci0tfXJldHVybntyYW5nZTpyIT09LTEmJm8sZmlyc3RSYW5nZTppfX0sdGhpcy5vbkZvbGRXaWRnZXRDbGljaz1mdW5jdGlvbihlLHQpe3Q9dC5kb21FdmVudDt2YXIgbj17Y2hpbGRyZW46dC5zaGlmdEtleSxhbGw6dC5jdHJsS2V5fHx0Lm1ldGFLZXksc2libGluZ3M6dC5hbHRLZXl9LHI9dGhpcy4kdG9nZ2xlRm9sZFdpZGdldChlLG4pO2lmKCFyKXt2YXIgaT10LnRhcmdldHx8dC5zcmNFbGVtZW50O2kmJi9hY2VfZm9sZC13aWRnZXQvLnRlc3QoaS5jbGFzc05hbWUpJiYoaS5jbGFzc05hbWUrPSIgYWNlX2ludmFsaWQiKX19LHRoaXMuJHRvZ2dsZUZvbGRXaWRnZXQ9ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5nZXRGb2xkV2lkZ2V0KXJldHVybjt2YXIgbj10aGlzLmdldEZvbGRXaWRnZXQoZSkscj10aGlzLmdldExpbmUoZSksaT1uPT09ImVuZCI/LTE6MSxzPXRoaXMuZ2V0Rm9sZEF0KGUsaT09PS0xPzA6ci5sZW5ndGgsaSk7aWYocylyZXR1cm4gdC5jaGlsZHJlbnx8dC5hbGw/dGhpcy5yZW1vdmVGb2xkKHMpOnRoaXMuZXhwYW5kRm9sZChzKSxzO3ZhciBvPXRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlKGUsITApO2lmKG8mJiFvLmlzTXVsdGlMaW5lKCkpe3M9dGhpcy5nZXRGb2xkQXQoby5zdGFydC5yb3csby5zdGFydC5jb2x1bW4sMSk7aWYocyYmby5pc0VxdWFsKHMucmFuZ2UpKXJldHVybiB0aGlzLnJlbW92ZUZvbGQocyksc31pZih0LnNpYmxpbmdzKXt2YXIgdT10aGlzLmdldFBhcmVudEZvbGRSYW5nZURhdGEoZSk7aWYodS5yYW5nZSl2YXIgYT11LnJhbmdlLnN0YXJ0LnJvdysxLGY9dS5yYW5nZS5lbmQucm93O3RoaXMuZm9sZEFsbChhLGYsdC5hbGw/MWU0OjApfWVsc2UgdC5jaGlsZHJlbj8oZj1vP28uZW5kLnJvdzp0aGlzLmdldExlbmd0aCgpLHRoaXMuZm9sZEFsbChlKzEsZix0LmFsbD8xZTQ6MCkpOm8mJih0LmFsbCYmKG8uY29sbGFwc2VDaGlsZHJlbj0xZTQpLHRoaXMuYWRkRm9sZCgiLi4uIixvKSk7cmV0dXJuIG99LHRoaXMudG9nZ2xlRm9sZFdpZGdldD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKS5yb3c7dD10aGlzLmdldFJvd0ZvbGRTdGFydCh0KTt2YXIgbj10aGlzLiR0b2dnbGVGb2xkV2lkZ2V0KHQse30pO2lmKG4pcmV0dXJuO3ZhciByPXRoaXMuZ2V0UGFyZW50Rm9sZFJhbmdlRGF0YSh0LCEwKTtuPXIucmFuZ2V8fHIuZmlyc3RSYW5nZTtpZihuKXt0PW4uc3RhcnQucm93O3ZhciBpPXRoaXMuZ2V0Rm9sZEF0KHQsdGhpcy5nZXRMaW5lKHQpLmxlbmd0aCwxKTtpP3RoaXMucmVtb3ZlRm9sZChpKTp0aGlzLmFkZEZvbGQoIi4uLiIsbil9fSx0aGlzLnVwZGF0ZUZvbGRXaWRnZXRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhcnQucm93LG49ZS5lbmQucm93LXQ7aWYobj09PTApdGhpcy5mb2xkV2lkZ2V0c1t0XT1udWxsO2Vsc2UgaWYoZS5hY3Rpb249PSJyZW1vdmUiKXRoaXMuZm9sZFdpZGdldHMuc3BsaWNlKHQsbisxLG51bGwpO2Vsc2V7dmFyIHI9QXJyYXkobisxKTtyLnVuc2hpZnQodCwxKSx0aGlzLmZvbGRXaWRnZXRzLnNwbGljZS5hcHBseSh0aGlzLmZvbGRXaWRnZXRzLHIpfX0sdGhpcy50b2tlbml6ZXJVcGRhdGVGb2xkV2lkZ2V0cz1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7dC5maXJzdCE9dC5sYXN0JiZ0aGlzLmZvbGRXaWRnZXRzLmxlbmd0aD50LmZpcnN0JiZ0aGlzLmZvbGRXaWRnZXRzLnNwbGljZSh0LmZpcnN0LHRoaXMuZm9sZFdpZGdldHMubGVuZ3RoKX19dmFyIHI9ZSgiLi4vcmFuZ2UiKS5SYW5nZSxpPWUoIi4vZm9sZF9saW5lIikuRm9sZExpbmUscz1lKCIuL2ZvbGQiKS5Gb2xkLG89ZSgiLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yO3QuRm9sZGluZz11fSksYWNlLmRlZmluZSgiYWNlL2VkaXRfc2Vzc2lvbi9icmFja2V0X21hdGNoIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBzKCl7dGhpcy5maW5kTWF0Y2hpbmdCcmFja2V0PWZ1bmN0aW9uKGUsdCl7aWYoZS5jb2x1bW49PTApcmV0dXJuIG51bGw7dmFyIG49dHx8dGhpcy5nZXRMaW5lKGUucm93KS5jaGFyQXQoZS5jb2x1bW4tMSk7aWYobj09IiIpcmV0dXJuIG51bGw7dmFyIHI9bi5tYXRjaCgvKFtcKFxbXHtdKXwoW1wpXF1cfV0pLyk7cmV0dXJuIHI/clsxXT90aGlzLiRmaW5kQ2xvc2luZ0JyYWNrZXQoclsxXSxlKTp0aGlzLiRmaW5kT3BlbmluZ0JyYWNrZXQoclsyXSxlKTpudWxsfSx0aGlzLmdldEJyYWNrZXRSYW5nZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldExpbmUoZS5yb3cpLG49ITAscixzPXQuY2hhckF0KGUuY29sdW1uLTEpLG89cyYmcy5tYXRjaCgvKFtcKFxbXHtdKXwoW1wpXF1cfV0pLyk7b3x8KHM9dC5jaGFyQXQoZS5jb2x1bW4pLGU9e3JvdzplLnJvdyxjb2x1bW46ZS5jb2x1bW4rMX0sbz1zJiZzLm1hdGNoKC8oW1woXFtce10pfChbXClcXVx9XSkvKSxuPSExKTtpZighbylyZXR1cm4gbnVsbDtpZihvWzFdKXt2YXIgdT10aGlzLiRmaW5kQ2xvc2luZ0JyYWNrZXQob1sxXSxlKTtpZighdSlyZXR1cm4gbnVsbDtyPWkuZnJvbVBvaW50cyhlLHUpLG58fChyLmVuZC5jb2x1bW4rKyxyLnN0YXJ0LmNvbHVtbi0tKSxyLmN1cnNvcj1yLmVuZH1lbHNle3ZhciB1PXRoaXMuJGZpbmRPcGVuaW5nQnJhY2tldChvWzJdLGUpO2lmKCF1KXJldHVybiBudWxsO3I9aS5mcm9tUG9pbnRzKHUsZSksbnx8KHIuc3RhcnQuY29sdW1uKyssci5lbmQuY29sdW1uLS0pLHIuY3Vyc29yPXIuc3RhcnR9cmV0dXJuIHJ9LHRoaXMuJGJyYWNrZXRzPXsiKSI6IigiLCIoIjoiKSIsIl0iOiJbIiwiWyI6Il0iLCJ7IjoifSIsIn0iOiJ7IiwiPCI6Ij4iLCI+IjoiPCJ9LHRoaXMuJGZpbmRPcGVuaW5nQnJhY2tldD1mdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcy4kYnJhY2tldHNbZV0scz0xLG89bmV3IHIodGhpcyx0LnJvdyx0LmNvbHVtbiksdT1vLmdldEN1cnJlbnRUb2tlbigpO3V8fCh1PW8uc3RlcEZvcndhcmQoKSk7aWYoIXUpcmV0dXJuO258fChuPW5ldyBSZWdFeHAoIihcXC4/Iit1LnR5cGUucmVwbGFjZSgiLiIsIlxcLiIpLnJlcGxhY2UoInJwYXJlbiIsIi5wYXJlbiIpLnJlcGxhY2UoL1xiKD86ZW5kKVxiLywiKD86c3RhcnR8YmVnaW58ZW5kKSIpKyIpKyIpKTt2YXIgYT10LmNvbHVtbi1vLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpLTIsZj11LnZhbHVlO2Zvcig7Oyl7d2hpbGUoYT49MCl7dmFyIGw9Zi5jaGFyQXQoYSk7aWYobD09aSl7cy09MTtpZihzPT0wKXJldHVybntyb3c6by5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46YStvLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfX1lbHNlIGw9PWUmJihzKz0xKTthLT0xfWRvIHU9by5zdGVwQmFja3dhcmQoKTt3aGlsZSh1JiYhbi50ZXN0KHUudHlwZSkpO2lmKHU9PW51bGwpYnJlYWs7Zj11LnZhbHVlLGE9Zi5sZW5ndGgtMX1yZXR1cm4gbnVsbH0sdGhpcy4kZmluZENsb3NpbmdCcmFja2V0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzLiRicmFja2V0c1tlXSxzPTEsbz1uZXcgcih0aGlzLHQucm93LHQuY29sdW1uKSx1PW8uZ2V0Q3VycmVudFRva2VuKCk7dXx8KHU9by5zdGVwRm9yd2FyZCgpKTtpZighdSlyZXR1cm47bnx8KG49bmV3IFJlZ0V4cCgiKFxcLj8iK3UudHlwZS5yZXBsYWNlKCIuIiwiXFwuIikucmVwbGFjZSgibHBhcmVuIiwiLnBhcmVuIikucmVwbGFjZSgvXGIoPzpzdGFydHxiZWdpbilcYi8sIig/OnN0YXJ0fGJlZ2lufGVuZCkiKSsiKSsiKSk7dmFyIGE9dC5jb2x1bW4tby5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKTtmb3IoOzspe3ZhciBmPXUudmFsdWUsbD1mLmxlbmd0aDt3aGlsZShhPGwpe3ZhciBjPWYuY2hhckF0KGEpO2lmKGM9PWkpe3MtPTE7aWYocz09MClyZXR1cm57cm93Om8uZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmErby5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX19ZWxzZSBjPT1lJiYocys9MSk7YSs9MX1kbyB1PW8uc3RlcEZvcndhcmQoKTt3aGlsZSh1JiYhbi50ZXN0KHUudHlwZSkpO2lmKHU9PW51bGwpYnJlYWs7YT0wfXJldHVybiBudWxsfX12YXIgcj1lKCIuLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3IsaT1lKCIuLi9yYW5nZSIpLlJhbmdlO3QuQnJhY2tldE1hdGNoPXN9KSxhY2UuZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvYmlkaWhhbmRsZXIiLCJhY2UvY29uZmlnIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL3NlbGVjdGlvbiIsImFjZS9tb2RlL3RleHQiLCJhY2UvcmFuZ2UiLCJhY2UvZG9jdW1lbnQiLCJhY2UvYmFja2dyb3VuZF90b2tlbml6ZXIiLCJhY2Uvc2VhcmNoX2hpZ2hsaWdodCIsImFjZS9lZGl0X3Nlc3Npb24vZm9sZGluZyIsImFjZS9lZGl0X3Nlc3Npb24vYnJhY2tldF9tYXRjaCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9sYW5nIikscz1lKCIuL2JpZGloYW5kbGVyIikuQmlkaUhhbmRsZXIsbz1lKCIuL2NvbmZpZyIpLHU9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixhPWUoIi4vc2VsZWN0aW9uIikuU2VsZWN0aW9uLGY9ZSgiLi9tb2RlL3RleHQiKS5Nb2RlLGw9ZSgiLi9yYW5nZSIpLlJhbmdlLGM9ZSgiLi9kb2N1bWVudCIpLkRvY3VtZW50LGg9ZSgiLi9iYWNrZ3JvdW5kX3Rva2VuaXplciIpLkJhY2tncm91bmRUb2tlbml6ZXIscD1lKCIuL3NlYXJjaF9oaWdobGlnaHQiKS5TZWFyY2hIaWdobGlnaHQsZD1mdW5jdGlvbihlLHQpe3RoaXMuJGJyZWFrcG9pbnRzPVtdLHRoaXMuJGRlY29yYXRpb25zPVtdLHRoaXMuJGZyb250TWFya2Vycz17fSx0aGlzLiRiYWNrTWFya2Vycz17fSx0aGlzLiRtYXJrZXJJZD0xLHRoaXMuJHVuZG9TZWxlY3Q9ITAsdGhpcy4kZm9sZERhdGE9W10sdGhpcy5pZD0ic2Vzc2lvbiIrICsrZC4kdWlkLHRoaXMuJGZvbGREYXRhLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam9pbigiXG4iKX0sdGhpcy5vbigiY2hhbmdlRm9sZCIsdGhpcy5vbkNoYW5nZUZvbGQuYmluZCh0aGlzKSksdGhpcy4kb25DaGFuZ2U9dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8IWUuZ2V0TGluZSllPW5ldyBjKGUpO3RoaXMuc2V0RG9jdW1lbnQoZSksdGhpcy5zZWxlY3Rpb249bmV3IGEodGhpcyksdGhpcy4kYmlkaUhhbmRsZXI9bmV3IHModGhpcyksby5yZXNldE9wdGlvbnModGhpcyksdGhpcy5zZXRNb2RlKHQpLG8uX3NpZ25hbCgic2Vzc2lvbiIsdGhpcyl9O2QuJHVpZD0wLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbShlKXtyZXR1cm4gZTw0MzUyPyExOmU+PTQzNTImJmU8PTQ0NDd8fGU+PTQ1MTUmJmU8PTQ1MTl8fGU+PTQ2MDImJmU8PTQ2MDd8fGU+PTkwMDEmJmU8PTkwMDJ8fGU+PTExOTA0JiZlPD0xMTkyOXx8ZT49MTE5MzEmJmU8PTEyMDE5fHxlPj0xMjAzMiYmZTw9MTIyNDV8fGU+PTEyMjcyJiZlPD0xMjI4M3x8ZT49MTIyODgmJmU8PTEyMzUwfHxlPj0xMjM1MyYmZTw9MTI0Mzh8fGU+PTEyNDQxJiZlPD0xMjU0M3x8ZT49MTI1NDkmJmU8PTEyNTg5fHxlPj0xMjU5MyYmZTw9MTI2ODZ8fGU+PTEyNjg4JiZlPD0xMjczMHx8ZT49MTI3MzYmJmU8PTEyNzcxfHxlPj0xMjc4NCYmZTw9MTI4MzB8fGU+PTEyODMyJiZlPD0xMjg3MXx8ZT49MTI4ODAmJmU8PTEzMDU0fHxlPj0xMzA1NiYmZTw9MTk5MDN8fGU+PTE5OTY4JiZlPD00MjEyNHx8ZT49NDIxMjgmJmU8PTQyMTgyfHxlPj00MzM2MCYmZTw9NDMzODh8fGU+PTQ0MDMyJiZlPD01NTIwM3x8ZT49NTUyMTYmJmU8PTU1MjM4fHxlPj01NTI0MyYmZTw9NTUyOTF8fGU+PTYzNzQ0JiZlPD02NDI1NXx8ZT49NjUwNDAmJmU8PTY1MDQ5fHxlPj02NTA3MiYmZTw9NjUxMDZ8fGU+PTY1MTA4JiZlPD02NTEyNnx8ZT49NjUxMjgmJmU8PTY1MTMxfHxlPj02NTI4MSYmZTw9NjUzNzZ8fGU+PTY1NTA0JiZlPD02NTUxMH1yLmltcGxlbWVudCh0aGlzLHUpLHRoaXMuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dGhpcy5kb2MmJnRoaXMuZG9jLnJlbW92ZUxpc3RlbmVyKCJjaGFuZ2UiLHRoaXMuJG9uQ2hhbmdlKSx0aGlzLmRvYz1lLGUub24oImNoYW5nZSIsdGhpcy4kb25DaGFuZ2UpLHRoaXMuYmdUb2tlbml6ZXImJnRoaXMuYmdUb2tlbml6ZXIuc2V0RG9jdW1lbnQodGhpcy5nZXREb2N1bWVudCgpKSx0aGlzLnJlc2V0Q2FjaGVzKCl9LHRoaXMuZ2V0RG9jdW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2N9LHRoaXMuJHJlc2V0Um93Q2FjaGU9ZnVuY3Rpb24oZSl7aWYoIWUpe3RoaXMuJGRvY1Jvd0NhY2hlPVtdLHRoaXMuJHNjcmVlblJvd0NhY2hlPVtdO3JldHVybn12YXIgdD10aGlzLiRkb2NSb3dDYWNoZS5sZW5ndGgsbj10aGlzLiRnZXRSb3dDYWNoZUluZGV4KHRoaXMuJGRvY1Jvd0NhY2hlLGUpKzE7dD5uJiYodGhpcy4kZG9jUm93Q2FjaGUuc3BsaWNlKG4sdCksdGhpcy4kc2NyZWVuUm93Q2FjaGUuc3BsaWNlKG4sdCkpfSx0aGlzLiRnZXRSb3dDYWNoZUluZGV4PWZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPWUubGVuZ3RoLTE7d2hpbGUobjw9cil7dmFyIGk9bityPj4xLHM9ZVtpXTtpZih0PnMpbj1pKzE7ZWxzZXtpZighKHQ8cykpcmV0dXJuIGk7cj1pLTF9fXJldHVybiBuLTF9LHRoaXMucmVzZXRDYWNoZXM9ZnVuY3Rpb24oKXt0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiR3cmFwRGF0YT1bXSx0aGlzLiRyb3dMZW5ndGhDYWNoZT1bXSx0aGlzLiRyZXNldFJvd0NhY2hlKDApLHRoaXMuYmdUb2tlbml6ZXImJnRoaXMuYmdUb2tlbml6ZXIuc3RhcnQoMCl9LHRoaXMub25DaGFuZ2VGb2xkPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTt0aGlzLiRyZXNldFJvd0NhY2hlKHQuc3RhcnQucm93KX0sdGhpcy5vbkNoYW5nZT1mdW5jdGlvbihlKXt0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiRiaWRpSGFuZGxlci5vbkNoYW5nZShlKSx0aGlzLiRyZXNldFJvd0NhY2hlKGUuc3RhcnQucm93KTt2YXIgdD10aGlzLiR1cGRhdGVJbnRlcm5hbERhdGFPbkNoYW5nZShlKTshdGhpcy4kZnJvbVVuZG8mJnRoaXMuJHVuZG9NYW5hZ2VyJiYodCYmdC5sZW5ndGgmJih0aGlzLiR1bmRvTWFuYWdlci5hZGQoe2FjdGlvbjoicmVtb3ZlRm9sZHMiLGZvbGRzOnR9LHRoaXMubWVyZ2VVbmRvRGVsdGFzKSx0aGlzLm1lcmdlVW5kb0RlbHRhcz0hMCksdGhpcy4kdW5kb01hbmFnZXIuYWRkKGUsdGhpcy5tZXJnZVVuZG9EZWx0YXMpLHRoaXMubWVyZ2VVbmRvRGVsdGFzPSEwLHRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyLnNjaGVkdWxlKCkpLHRoaXMuYmdUb2tlbml6ZXImJnRoaXMuYmdUb2tlbml6ZXIuJHVwZGF0ZU9uQ2hhbmdlKGUpLHRoaXMuX3NpZ25hbCgiY2hhbmdlIixlKX0sdGhpcy5zZXRWYWx1ZT1mdW5jdGlvbihlKXt0aGlzLmRvYy5zZXRWYWx1ZShlKSx0aGlzLnNlbGVjdGlvbi5tb3ZlVG8oMCwwKSx0aGlzLiRyZXNldFJvd0NhY2hlKDApLHRoaXMuc2V0VW5kb01hbmFnZXIodGhpcy4kdW5kb01hbmFnZXIpLHRoaXMuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpfSx0aGlzLmdldFZhbHVlPXRoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2MuZ2V0VmFsdWUoKX0sdGhpcy5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb259LHRoaXMuZ2V0U3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYmdUb2tlbml6ZXIuZ2V0U3RhdGUoZSl9LHRoaXMuZ2V0VG9rZW5zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJnVG9rZW5pemVyLmdldFRva2VucyhlKX0sdGhpcy5nZXRUb2tlbkF0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5iZ1Rva2VuaXplci5nZXRUb2tlbnMoZSkscixpPTA7aWYodD09bnVsbCl7dmFyIHM9bi5sZW5ndGgtMTtpPXRoaXMuZ2V0TGluZShlKS5sZW5ndGh9ZWxzZSBmb3IodmFyIHM9MDtzPG4ubGVuZ3RoO3MrKyl7aSs9bltzXS52YWx1ZS5sZW5ndGg7aWYoaT49dClicmVha31yZXR1cm4gcj1uW3NdLHI/KHIuaW5kZXg9cyxyLnN0YXJ0PWktci52YWx1ZS5sZW5ndGgscik6bnVsbH0sdGhpcy5zZXRVbmRvTWFuYWdlcj1mdW5jdGlvbihlKXt0aGlzLiR1bmRvTWFuYWdlcj1lLHRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyJiZ0aGlzLiRpbmZvcm1VbmRvTWFuYWdlci5jYW5jZWwoKTtpZihlKXt2YXIgdD10aGlzO2UuYWRkU2Vzc2lvbih0aGlzKSx0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXI9ZnVuY3Rpb24oKXt0LiRpbmZvcm1VbmRvTWFuYWdlci5jYW5jZWwoKSx0Lm1lcmdlVW5kb0RlbHRhcz0hMX0sdGhpcy4kaW5mb3JtVW5kb01hbmFnZXI9aS5kZWxheWVkQ2FsbCh0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXIpfWVsc2UgdGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyPWZ1bmN0aW9uKCl7fX0sdGhpcy5tYXJrVW5kb0dyb3VwPWZ1bmN0aW9uKCl7dGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyJiZ0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXIoKX0sdGhpcy4kZGVmYXVsdFVuZG9NYW5hZ2VyPXt1bmRvOmZ1bmN0aW9uKCl7fSxyZWRvOmZ1bmN0aW9uKCl7fSxoYXNVbmRvOmZ1bmN0aW9uKCl7fSxoYXNSZWRvOmZ1bmN0aW9uKCl7fSxyZXNldDpmdW5jdGlvbigpe30sYWRkOmZ1bmN0aW9uKCl7fSxhZGRTZWxlY3Rpb246ZnVuY3Rpb24oKXt9LHN0YXJ0TmV3R3JvdXA6ZnVuY3Rpb24oKXt9LGFkZFNlc3Npb246ZnVuY3Rpb24oKXt9fSx0aGlzLmdldFVuZG9NYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVuZG9NYW5hZ2VyfHx0aGlzLiRkZWZhdWx0VW5kb01hbmFnZXJ9LHRoaXMuZ2V0VGFiU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VXNlU29mdFRhYnMoKT9pLnN0cmluZ1JlcGVhdCgiICIsdGhpcy5nZXRUYWJTaXplKCkpOiIJIn0sdGhpcy5zZXRVc2VTb2Z0VGFicz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigidXNlU29mdFRhYnMiLGUpfSx0aGlzLmdldFVzZVNvZnRUYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVzZVNvZnRUYWJzJiYhdGhpcy4kbW9kZS4kaW5kZW50V2l0aFRhYnN9LHRoaXMuc2V0VGFiU2l6ZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigidGFiU2l6ZSIsZSl9LHRoaXMuZ2V0VGFiU2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR0YWJTaXplfSx0aGlzLmlzVGFiU3RvcD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kdXNlU29mdFRhYnMmJmUuY29sdW1uJXRoaXMuJHRhYlNpemU9PT0wfSx0aGlzLnNldE5hdmlnYXRlV2l0aGluU29mdFRhYnM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oIm5hdmlnYXRlV2l0aGluU29mdFRhYnMiLGUpfSx0aGlzLmdldE5hdmlnYXRlV2l0aGluU29mdFRhYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbmF2aWdhdGVXaXRoaW5Tb2Z0VGFic30sdGhpcy4kb3ZlcndyaXRlPSExLHRoaXMuc2V0T3ZlcndyaXRlPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJvdmVyd3JpdGUiLGUpfSx0aGlzLmdldE92ZXJ3cml0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRvdmVyd3JpdGV9LHRoaXMudG9nZ2xlT3ZlcndyaXRlPWZ1bmN0aW9uKCl7dGhpcy5zZXRPdmVyd3JpdGUoIXRoaXMuJG92ZXJ3cml0ZSl9LHRoaXMuYWRkR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihlLHQpe3RoaXMuJGRlY29yYXRpb25zW2VdfHwodGhpcy4kZGVjb3JhdGlvbnNbZV09IiIpLHRoaXMuJGRlY29yYXRpb25zW2VdKz0iICIrdCx0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy4kZGVjb3JhdGlvbnNbZV09KHRoaXMuJGRlY29yYXRpb25zW2VdfHwiIikucmVwbGFjZSgiICIrdCwiIiksdGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuZ2V0QnJlYWtwb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYnJlYWtwb2ludHN9LHRoaXMuc2V0QnJlYWtwb2ludHM9ZnVuY3Rpb24oZSl7dGhpcy4kYnJlYWtwb2ludHM9W107Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy4kYnJlYWtwb2ludHNbZVt0XV09ImFjZV9icmVha3BvaW50Ijt0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5jbGVhckJyZWFrcG9pbnRzPWZ1bmN0aW9uKCl7dGhpcy4kYnJlYWtwb2ludHM9W10sdGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuc2V0QnJlYWtwb2ludD1mdW5jdGlvbihlLHQpe3Q9PT11bmRlZmluZWQmJih0PSJhY2VfYnJlYWtwb2ludCIpLHQ/dGhpcy4kYnJlYWtwb2ludHNbZV09dDpkZWxldGUgdGhpcy4kYnJlYWtwb2ludHNbZV0sdGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuY2xlYXJCcmVha3BvaW50PWZ1bmN0aW9uKGUpe2RlbGV0ZSB0aGlzLiRicmVha3BvaW50c1tlXSx0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5hZGRNYXJrZXI9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy4kbWFya2VySWQrKyxzPXtyYW5nZTplLHR5cGU6bnx8ImxpbmUiLHJlbmRlcmVyOnR5cGVvZiBuPT0iZnVuY3Rpb24iP246bnVsbCxjbGF6ejp0LGluRnJvbnQ6ISFyLGlkOml9O3JldHVybiByPyh0aGlzLiRmcm9udE1hcmtlcnNbaV09cyx0aGlzLl9zaWduYWwoImNoYW5nZUZyb250TWFya2VyIikpOih0aGlzLiRiYWNrTWFya2Vyc1tpXT1zLHRoaXMuX3NpZ25hbCgiY2hhbmdlQmFja01hcmtlciIpKSxpfSx0aGlzLmFkZER5bmFtaWNNYXJrZXI9ZnVuY3Rpb24oZSx0KXtpZighZS51cGRhdGUpcmV0dXJuO3ZhciBuPXRoaXMuJG1hcmtlcklkKys7cmV0dXJuIGUuaWQ9bixlLmluRnJvbnQ9ISF0LHQ/KHRoaXMuJGZyb250TWFya2Vyc1tuXT1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlRnJvbnRNYXJrZXIiKSk6KHRoaXMuJGJhY2tNYXJrZXJzW25dPWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VCYWNrTWFya2VyIikpLGV9LHRoaXMucmVtb3ZlTWFya2VyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJGZyb250TWFya2Vyc1tlXXx8dGhpcy4kYmFja01hcmtlcnNbZV07aWYoIXQpcmV0dXJuO3ZhciBuPXQuaW5Gcm9udD90aGlzLiRmcm9udE1hcmtlcnM6dGhpcy4kYmFja01hcmtlcnM7ZGVsZXRlIG5bZV0sdGhpcy5fc2lnbmFsKHQuaW5Gcm9udD8iY2hhbmdlRnJvbnRNYXJrZXIiOiJjaGFuZ2VCYWNrTWFya2VyIil9LHRoaXMuZ2V0TWFya2Vycz1mdW5jdGlvbihlKXtyZXR1cm4gZT90aGlzLiRmcm9udE1hcmtlcnM6dGhpcy4kYmFja01hcmtlcnN9LHRoaXMuaGlnaGxpZ2h0PWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRzZWFyY2hIaWdobGlnaHQpe3ZhciB0PW5ldyBwKG51bGwsImFjZV9zZWxlY3RlZC13b3JkIiwidGV4dCIpO3RoaXMuJHNlYXJjaEhpZ2hsaWdodD10aGlzLmFkZER5bmFtaWNNYXJrZXIodCl9dGhpcy4kc2VhcmNoSGlnaGxpZ2h0LnNldFJlZ2V4cChlKX0sdGhpcy5oaWdobGlnaHRMaW5lcz1mdW5jdGlvbihlLHQsbixyKXt0eXBlb2YgdCE9Im51bWJlciImJihuPXQsdD1lKSxufHwobj0iYWNlX3N0ZXAiKTt2YXIgaT1uZXcgbChlLDAsdCxJbmZpbml0eSk7cmV0dXJuIGkuaWQ9dGhpcy5hZGRNYXJrZXIoaSxuLCJmdWxsTGluZSIsciksaX0sdGhpcy5zZXRBbm5vdGF0aW9ucz1mdW5jdGlvbihlKXt0aGlzLiRhbm5vdGF0aW9ucz1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlQW5ub3RhdGlvbiIse30pfSx0aGlzLmdldEFubm90YXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGFubm90YXRpb25zfHxbXX0sdGhpcy5jbGVhckFubm90YXRpb25zPWZ1bmN0aW9uKCl7dGhpcy5zZXRBbm5vdGF0aW9ucyhbXSl9LHRoaXMuJGRldGVjdE5ld0xpbmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXRjaCgvXi4qPyhccj9cbikvbSk7dD90aGlzLiRhdXRvTmV3TGluZT10WzFdOnRoaXMuJGF1dG9OZXdMaW5lPSJcbiJ9LHRoaXMuZ2V0V29yZFJhbmdlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRMaW5lKGUpLHI9ITE7dD4wJiYocj0hIW4uY2hhckF0KHQtMSkubWF0Y2godGhpcy50b2tlblJlKSkscnx8KHI9ISFuLmNoYXJBdCh0KS5tYXRjaCh0aGlzLnRva2VuUmUpKTtpZihyKXZhciBpPXRoaXMudG9rZW5SZTtlbHNlIGlmKC9eXHMrJC8udGVzdChuLnNsaWNlKHQtMSx0KzEpKSl2YXIgaT0vXHMvO2Vsc2UgdmFyIGk9dGhpcy5ub25Ub2tlblJlO3ZhciBzPXQ7aWYocz4wKXtkbyBzLS07d2hpbGUocz49MCYmbi5jaGFyQXQocykubWF0Y2goaSkpO3MrK312YXIgbz10O3doaWxlKG88bi5sZW5ndGgmJm4uY2hhckF0KG8pLm1hdGNoKGkpKW8rKztyZXR1cm4gbmV3IGwoZSxzLGUsbyl9LHRoaXMuZ2V0QVdvcmRSYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0V29yZFJhbmdlKGUsdCkscj10aGlzLmdldExpbmUobi5lbmQucm93KTt3aGlsZShyLmNoYXJBdChuLmVuZC5jb2x1bW4pLm1hdGNoKC9bIFx0XS8pKW4uZW5kLmNvbHVtbis9MTtyZXR1cm4gbn0sdGhpcy5zZXROZXdMaW5lTW9kZT1mdW5jdGlvbihlKXt0aGlzLmRvYy5zZXROZXdMaW5lTW9kZShlKX0sdGhpcy5nZXROZXdMaW5lTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvYy5nZXROZXdMaW5lTW9kZSgpfSx0aGlzLnNldFVzZVdvcmtlcj1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigidXNlV29ya2VyIixlKX0sdGhpcy5nZXRVc2VXb3JrZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdXNlV29ya2VyfSx0aGlzLm9uUmVsb2FkVG9rZW5pemVyPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTt0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KHQuZmlyc3QpLHRoaXMuX3NpZ25hbCgidG9rZW5pemVyVXBkYXRlIixlKX0sdGhpcy4kbW9kZXM9by4kbW9kZXMsdGhpcy4kbW9kZT1udWxsLHRoaXMuJG1vZGVJZD1udWxsLHRoaXMuc2V0TW9kZT1mdW5jdGlvbihlLHQpe2lmKGUmJnR5cGVvZiBlPT0ib2JqZWN0Iil7aWYoZS5nZXRUb2tlbml6ZXIpcmV0dXJuIHRoaXMuJG9uQ2hhbmdlTW9kZShlKTt2YXIgbj1lLHI9bi5wYXRofWVsc2Ugcj1lfHwiYWNlL21vZGUvdGV4dCI7dGhpcy4kbW9kZXNbImFjZS9tb2RlL3RleHQiXXx8KHRoaXMuJG1vZGVzWyJhY2UvbW9kZS90ZXh0Il09bmV3IGYpO2lmKHRoaXMuJG1vZGVzW3JdJiYhbil7dGhpcy4kb25DaGFuZ2VNb2RlKHRoaXMuJG1vZGVzW3JdKSx0JiZ0KCk7cmV0dXJufXRoaXMuJG1vZGVJZD1yLG8ubG9hZE1vZHVsZShbIm1vZGUiLHJdLGZ1bmN0aW9uKGUpe2lmKHRoaXMuJG1vZGVJZCE9PXIpcmV0dXJuIHQmJnQoKTt0aGlzLiRtb2Rlc1tyXSYmIW4/dGhpcy4kb25DaGFuZ2VNb2RlKHRoaXMuJG1vZGVzW3JdKTplJiZlLk1vZGUmJihlPW5ldyBlLk1vZGUobiksbnx8KHRoaXMuJG1vZGVzW3JdPWUsZS4kaWQ9ciksdGhpcy4kb25DaGFuZ2VNb2RlKGUpKSx0JiZ0KCl9LmJpbmQodGhpcykpLHRoaXMuJG1vZGV8fHRoaXMuJG9uQ2hhbmdlTW9kZSh0aGlzLiRtb2Rlc1siYWNlL21vZGUvdGV4dCJdLCEwKX0sdGhpcy4kb25DaGFuZ2VNb2RlPWZ1bmN0aW9uKGUsdCl7dHx8KHRoaXMuJG1vZGVJZD1lLiRpZCk7aWYodGhpcy4kbW9kZT09PWUpcmV0dXJuO3RoaXMuJG1vZGU9ZSx0aGlzLiRzdG9wV29ya2VyKCksdGhpcy4kdXNlV29ya2VyJiZ0aGlzLiRzdGFydFdvcmtlcigpO3ZhciBuPWUuZ2V0VG9rZW5pemVyKCk7aWYobi5hZGRFdmVudExpc3RlbmVyIT09dW5kZWZpbmVkKXt2YXIgcj10aGlzLm9uUmVsb2FkVG9rZW5pemVyLmJpbmQodGhpcyk7bi5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGUiLHIpfWlmKCF0aGlzLmJnVG9rZW5pemVyKXt0aGlzLmJnVG9rZW5pemVyPW5ldyBoKG4pO3ZhciBpPXRoaXM7dGhpcy5iZ1Rva2VuaXplci5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGUiLGZ1bmN0aW9uKGUpe2kuX3NpZ25hbCgidG9rZW5pemVyVXBkYXRlIixlKX0pfWVsc2UgdGhpcy5iZ1Rva2VuaXplci5zZXRUb2tlbml6ZXIobik7dGhpcy5iZ1Rva2VuaXplci5zZXREb2N1bWVudCh0aGlzLmdldERvY3VtZW50KCkpLHRoaXMudG9rZW5SZT1lLnRva2VuUmUsdGhpcy5ub25Ub2tlblJlPWUubm9uVG9rZW5SZSx0fHwoZS5hdHRhY2hUb1Nlc3Npb24mJmUuYXR0YWNoVG9TZXNzaW9uKHRoaXMpLHRoaXMuJG9wdGlvbnMud3JhcE1ldGhvZC5zZXQuY2FsbCh0aGlzLHRoaXMuJHdyYXBNZXRob2QpLHRoaXMuJHNldEZvbGRpbmcoZS5mb2xkaW5nUnVsZXMpLHRoaXMuYmdUb2tlbml6ZXIuc3RhcnQoMCksdGhpcy5fZW1pdCgiY2hhbmdlTW9kZSIpKX0sdGhpcy4kc3RvcFdvcmtlcj1mdW5jdGlvbigpe3RoaXMuJHdvcmtlciYmKHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKSx0aGlzLiR3b3JrZXI9bnVsbCl9LHRoaXMuJHN0YXJ0V29ya2VyPWZ1bmN0aW9uKCl7dHJ5e3RoaXMuJHdvcmtlcj10aGlzLiRtb2RlLmNyZWF0ZVdvcmtlcih0aGlzKX1jYXRjaChlKXtvLndhcm4oIkNvdWxkIG5vdCBsb2FkIHdvcmtlciIsZSksdGhpcy4kd29ya2VyPW51bGx9fSx0aGlzLmdldE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbW9kZX0sdGhpcy4kc2Nyb2xsVG9wPTAsdGhpcy5zZXRTY3JvbGxUb3A9ZnVuY3Rpb24oZSl7aWYodGhpcy4kc2Nyb2xsVG9wPT09ZXx8aXNOYU4oZSkpcmV0dXJuO3RoaXMuJHNjcm9sbFRvcD1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlU2Nyb2xsVG9wIixlKX0sdGhpcy5nZXRTY3JvbGxUb3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2Nyb2xsVG9wfSx0aGlzLiRzY3JvbGxMZWZ0PTAsdGhpcy5zZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKGUpe2lmKHRoaXMuJHNjcm9sbExlZnQ9PT1lfHxpc05hTihlKSlyZXR1cm47dGhpcy4kc2Nyb2xsTGVmdD1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlU2Nyb2xsTGVmdCIsZSl9LHRoaXMuZ2V0U2Nyb2xsTGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzY3JvbGxMZWZ0fSx0aGlzLmdldFNjcmVlbldpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGNvbXB1dGVXaWR0aCgpLHRoaXMubGluZVdpZGdldHM/TWF0aC5tYXgodGhpcy5nZXRMaW5lV2lkZ2V0TWF4V2lkdGgoKSx0aGlzLnNjcmVlbldpZHRoKTp0aGlzLnNjcmVlbldpZHRofSx0aGlzLmdldExpbmVXaWRnZXRNYXhXaWR0aD1mdW5jdGlvbigpe2lmKHRoaXMubGluZVdpZGdldHNXaWR0aCE9bnVsbClyZXR1cm4gdGhpcy5saW5lV2lkZ2V0c1dpZHRoO3ZhciBlPTA7cmV0dXJuIHRoaXMubGluZVdpZGdldHMuZm9yRWFjaChmdW5jdGlvbih0KXt0JiZ0LnNjcmVlbldpZHRoPmUmJihlPXQuc2NyZWVuV2lkdGgpfSksdGhpcy5saW5lV2lkZ2V0V2lkdGg9ZX0sdGhpcy4kY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJG1vZGlmaWVkfHxlKXt0aGlzLiRtb2RpZmllZD0hMTtpZih0aGlzLiR1c2VXcmFwTW9kZSlyZXR1cm4gdGhpcy5zY3JlZW5XaWR0aD10aGlzLiR3cmFwTGltaXQ7dmFyIHQ9dGhpcy5kb2MuZ2V0QWxsTGluZXMoKSxuPXRoaXMuJHJvd0xlbmd0aENhY2hlLHI9MCxpPTAscz10aGlzLiRmb2xkRGF0YVtpXSxvPXM/cy5zdGFydC5yb3c6SW5maW5pdHksdT10Lmxlbmd0aDtmb3IodmFyIGE9MDthPHU7YSsrKXtpZihhPm8pe2E9cy5lbmQucm93KzE7aWYoYT49dSlicmVhaztzPXRoaXMuJGZvbGREYXRhW2krK10sbz1zP3Muc3RhcnQucm93OkluZmluaXR5fW5bYV09PW51bGwmJihuW2FdPXRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoKHRbYV0pWzBdKSxuW2FdPnImJihyPW5bYV0pfXRoaXMuc2NyZWVuV2lkdGg9cn19LHRoaXMuZ2V0TGluZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kb2MuZ2V0TGluZShlKX0sdGhpcy5nZXRMaW5lcz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRvYy5nZXRMaW5lcyhlLHQpfSx0aGlzLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvYy5nZXRMZW5ndGgoKX0sdGhpcy5nZXRUZXh0UmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZG9jLmdldFRleHRSYW5nZShlfHx0aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpKX0sdGhpcy5pbnNlcnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5kb2MuaW5zZXJ0KGUsdCl9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRvYy5yZW1vdmUoZSl9LHRoaXMucmVtb3ZlRnVsbExpbmVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZG9jLnJlbW92ZUZ1bGxMaW5lcyhlLHQpfSx0aGlzLnVuZG9DaGFuZ2VzPWZ1bmN0aW9uKGUsdCl7aWYoIWUubGVuZ3RoKXJldHVybjt0aGlzLiRmcm9tVW5kbz0hMDtmb3IodmFyIG49ZS5sZW5ndGgtMTtuIT0tMTtuLS0pe3ZhciByPWVbbl07ci5hY3Rpb249PSJpbnNlcnQifHxyLmFjdGlvbj09InJlbW92ZSI/dGhpcy5kb2MucmV2ZXJ0RGVsdGEocik6ci5mb2xkcyYmdGhpcy5hZGRGb2xkcyhyLmZvbGRzKX0hdCYmdGhpcy4kdW5kb1NlbGVjdCYmKGUuc2VsZWN0aW9uQmVmb3JlP3RoaXMuc2VsZWN0aW9uLmZyb21KU09OKGUuc2VsZWN0aW9uQmVmb3JlKTp0aGlzLnNlbGVjdGlvbi5zZXRSYW5nZSh0aGlzLiRnZXRVbmRvU2VsZWN0aW9uKGUsITApKSksdGhpcy4kZnJvbVVuZG89ITF9LHRoaXMucmVkb0NoYW5nZXM9ZnVuY3Rpb24oZSx0KXtpZighZS5sZW5ndGgpcmV0dXJuO3RoaXMuJGZyb21VbmRvPSEwO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dOyhyLmFjdGlvbj09Imluc2VydCJ8fHIuYWN0aW9uPT0icmVtb3ZlIikmJnRoaXMuZG9jLmFwcGx5RGVsdGEocil9IXQmJnRoaXMuJHVuZG9TZWxlY3QmJihlLnNlbGVjdGlvbkFmdGVyP3RoaXMuc2VsZWN0aW9uLmZyb21KU09OKGUuc2VsZWN0aW9uQWZ0ZXIpOnRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKHRoaXMuJGdldFVuZG9TZWxlY3Rpb24oZSwhMSkpKSx0aGlzLiRmcm9tVW5kbz0hMX0sdGhpcy5zZXRVbmRvU2VsZWN0PWZ1bmN0aW9uKGUpe3RoaXMuJHVuZG9TZWxlY3Q9ZX0sdGhpcy4kZ2V0VW5kb1NlbGVjdGlvbj1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHQ/ZS5hY3Rpb24hPT0iaW5zZXJ0IjplLmFjdGlvbj09PSJpbnNlcnQifXZhciByLGkscztmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIHU9ZVtvXTtpZighdS5zdGFydCljb250aW51ZTtpZighcil7bih1KT8ocj1sLmZyb21Qb2ludHModS5zdGFydCx1LmVuZCkscz0hMCk6KHI9bC5mcm9tUG9pbnRzKHUuc3RhcnQsdS5zdGFydCkscz0hMSk7Y29udGludWV9bih1KT8oaT11LnN0YXJ0LHIuY29tcGFyZShpLnJvdyxpLmNvbHVtbik9PS0xJiZyLnNldFN0YXJ0KGkpLGk9dS5lbmQsci5jb21wYXJlKGkucm93LGkuY29sdW1uKT09MSYmci5zZXRFbmQoaSkscz0hMCk6KGk9dS5zdGFydCxyLmNvbXBhcmUoaS5yb3csaS5jb2x1bW4pPT0tMSYmKHI9bC5mcm9tUG9pbnRzKHUuc3RhcnQsdS5zdGFydCkpLHM9ITEpfXJldHVybiByfSx0aGlzLnJlcGxhY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5kb2MucmVwbGFjZShlLHQpfSx0aGlzLm1vdmVUZXh0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmdldFRleHRSYW5nZShlKSxpPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKGUpLHM9bC5mcm9tUG9pbnRzKHQsdCk7aWYoIW4pe3RoaXMucmVtb3ZlKGUpO3ZhciBvPWUuc3RhcnQucm93LWUuZW5kLnJvdyx1PW8/LWUuZW5kLmNvbHVtbjplLnN0YXJ0LmNvbHVtbi1lLmVuZC5jb2x1bW47dSYmKHMuc3RhcnQucm93PT1lLmVuZC5yb3cmJnMuc3RhcnQuY29sdW1uPmUuZW5kLmNvbHVtbiYmKHMuc3RhcnQuY29sdW1uKz11KSxzLmVuZC5yb3c9PWUuZW5kLnJvdyYmcy5lbmQuY29sdW1uPmUuZW5kLmNvbHVtbiYmKHMuZW5kLmNvbHVtbis9dSkpLG8mJnMuc3RhcnQucm93Pj1lLmVuZC5yb3cmJihzLnN0YXJ0LnJvdys9byxzLmVuZC5yb3crPW8pfXMuZW5kPXRoaXMuaW5zZXJ0KHMuc3RhcnQscik7aWYoaS5sZW5ndGgpe3ZhciBhPWUuc3RhcnQsZj1zLnN0YXJ0LG89Zi5yb3ctYS5yb3csdT1mLmNvbHVtbi1hLmNvbHVtbjt0aGlzLmFkZEZvbGRzKGkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlPWUuY2xvbmUoKSxlLnN0YXJ0LnJvdz09YS5yb3cmJihlLnN0YXJ0LmNvbHVtbis9dSksZS5lbmQucm93PT1hLnJvdyYmKGUuZW5kLmNvbHVtbis9dSksZS5zdGFydC5yb3crPW8sZS5lbmQucm93Kz1vLGV9KSl9cmV0dXJuIHN9LHRoaXMuaW5kZW50Um93cz1mdW5jdGlvbihlLHQsbil7bj1uLnJlcGxhY2UoL1x0L2csdGhpcy5nZXRUYWJTdHJpbmcoKSk7Zm9yKHZhciByPWU7cjw9dDtyKyspdGhpcy5kb2MuaW5zZXJ0SW5MaW5lKHtyb3c6cixjb2x1bW46MH0sbil9LHRoaXMub3V0ZGVudFJvd3M9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb2xsYXBzZVJvd3MoKSxuPW5ldyBsKDAsMCwwLDApLHI9dGhpcy5nZXRUYWJTaXplKCk7Zm9yKHZhciBpPXQuc3RhcnQucm93O2k8PXQuZW5kLnJvdzsrK2kpe3ZhciBzPXRoaXMuZ2V0TGluZShpKTtuLnN0YXJ0LnJvdz1pLG4uZW5kLnJvdz1pO2Zvcih2YXIgbz0wO288cjsrK28paWYocy5jaGFyQXQobykhPSIgIilicmVhaztvPHImJnMuY2hhckF0KG8pPT0iCSI/KG4uc3RhcnQuY29sdW1uPW8sbi5lbmQuY29sdW1uPW8rMSk6KG4uc3RhcnQuY29sdW1uPTAsbi5lbmQuY29sdW1uPW8pLHRoaXMucmVtb3ZlKG4pfX0sdGhpcy4kbW92ZUxpbmVzPWZ1bmN0aW9uKGUsdCxuKXtlPXRoaXMuZ2V0Um93Rm9sZFN0YXJ0KGUpLHQ9dGhpcy5nZXRSb3dGb2xkRW5kKHQpO2lmKG48MCl7dmFyIHI9dGhpcy5nZXRSb3dGb2xkU3RhcnQoZStuKTtpZihyPDApcmV0dXJuIDA7dmFyIGk9ci1lfWVsc2UgaWYobj4wKXt2YXIgcj10aGlzLmdldFJvd0ZvbGRFbmQodCtuKTtpZihyPnRoaXMuZG9jLmdldExlbmd0aCgpLTEpcmV0dXJuIDA7dmFyIGk9ci10fWVsc2V7ZT10aGlzLiRjbGlwUm93VG9Eb2N1bWVudChlKSx0PXRoaXMuJGNsaXBSb3dUb0RvY3VtZW50KHQpO3ZhciBpPXQtZSsxfXZhciBzPW5ldyBsKGUsMCx0LE51bWJlci5NQVhfVkFMVUUpLG89dGhpcy5nZXRGb2xkc0luUmFuZ2UocykubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlPWUuY2xvbmUoKSxlLnN0YXJ0LnJvdys9aSxlLmVuZC5yb3crPWksZX0pLHU9bj09MD90aGlzLmRvYy5nZXRMaW5lcyhlLHQpOnRoaXMuZG9jLnJlbW92ZUZ1bGxMaW5lcyhlLHQpO3JldHVybiB0aGlzLmRvYy5pbnNlcnRGdWxsTGluZXMoZStpLHUpLG8ubGVuZ3RoJiZ0aGlzLmFkZEZvbGRzKG8pLGl9LHRoaXMubW92ZUxpbmVzVXA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy4kbW92ZUxpbmVzKGUsdCwtMSl9LHRoaXMubW92ZUxpbmVzRG93bj1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLiRtb3ZlTGluZXMoZSx0LDEpfSx0aGlzLmR1cGxpY2F0ZUxpbmVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuJG1vdmVMaW5lcyhlLHQsMCl9LHRoaXMuJGNsaXBSb3dUb0RvY3VtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKGUsdGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSkpfSx0aGlzLiRjbGlwQ29sdW1uVG9Sb3c9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdDwwPzA6TWF0aC5taW4odGhpcy5kb2MuZ2V0TGluZShlKS5sZW5ndGgsdCl9LHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQ9ZnVuY3Rpb24oZSx0KXt0PU1hdGgubWF4KDAsdCk7aWYoZTwwKWU9MCx0PTA7ZWxzZXt2YXIgbj10aGlzLmRvYy5nZXRMZW5ndGgoKTtlPj1uPyhlPW4tMSx0PXRoaXMuZG9jLmdldExpbmUobi0xKS5sZW5ndGgpOnQ9TWF0aC5taW4odGhpcy5kb2MuZ2V0TGluZShlKS5sZW5ndGgsdCl9cmV0dXJue3JvdzplLGNvbHVtbjp0fX0sdGhpcy4kY2xpcFJhbmdlVG9Eb2N1bWVudD1mdW5jdGlvbihlKXtlLnN0YXJ0LnJvdzwwPyhlLnN0YXJ0LnJvdz0wLGUuc3RhcnQuY29sdW1uPTApOmUuc3RhcnQuY29sdW1uPXRoaXMuJGNsaXBDb2x1bW5Ub1JvdyhlLnN0YXJ0LnJvdyxlLnN0YXJ0LmNvbHVtbik7dmFyIHQ9dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMTtyZXR1cm4gZS5lbmQucm93PnQ/KGUuZW5kLnJvdz10LGUuZW5kLmNvbHVtbj10aGlzLmRvYy5nZXRMaW5lKHQpLmxlbmd0aCk6ZS5lbmQuY29sdW1uPXRoaXMuJGNsaXBDb2x1bW5Ub1JvdyhlLmVuZC5yb3csZS5lbmQuY29sdW1uKSxlfSx0aGlzLiR3cmFwTGltaXQ9ODAsdGhpcy4kdXNlV3JhcE1vZGU9ITEsdGhpcy4kd3JhcExpbWl0UmFuZ2U9e21pbjpudWxsLG1heDpudWxsfSx0aGlzLnNldFVzZVdyYXBNb2RlPWZ1bmN0aW9uKGUpe2lmKGUhPXRoaXMuJHVzZVdyYXBNb2RlKXt0aGlzLiR1c2VXcmFwTW9kZT1lLHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJHJlc2V0Um93Q2FjaGUoMCk7aWYoZSl7dmFyIHQ9dGhpcy5nZXRMZW5ndGgoKTt0aGlzLiR3cmFwRGF0YT1BcnJheSh0KSx0aGlzLiR1cGRhdGVXcmFwRGF0YSgwLHQtMSl9dGhpcy5fc2lnbmFsKCJjaGFuZ2VXcmFwTW9kZSIpfX0sdGhpcy5nZXRVc2VXcmFwTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1c2VXcmFwTW9kZX0sdGhpcy5zZXRXcmFwTGltaXRSYW5nZT1mdW5jdGlvbihlLHQpe2lmKHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1pbiE9PWV8fHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1heCE9PXQpdGhpcy4kd3JhcExpbWl0UmFuZ2U9e21pbjplLG1heDp0fSx0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiRiaWRpSGFuZGxlci5tYXJrQXNEaXJ0eSgpLHRoaXMuJHVzZVdyYXBNb2RlJiZ0aGlzLl9zaWduYWwoImNoYW5nZVdyYXBNb2RlIil9LHRoaXMuYWRqdXN0V3JhcExpbWl0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kd3JhcExpbWl0UmFuZ2U7bi5tYXg8MCYmKG49e21pbjp0LG1heDp0fSk7dmFyIHI9dGhpcy4kY29uc3RyYWluV3JhcExpbWl0KGUsbi5taW4sbi5tYXgpO3JldHVybiByIT10aGlzLiR3cmFwTGltaXQmJnI+MT8odGhpcy4kd3JhcExpbWl0PXIsdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kdXNlV3JhcE1vZGUmJih0aGlzLiR1cGRhdGVXcmFwRGF0YSgwLHRoaXMuZ2V0TGVuZ3RoKCktMSksdGhpcy4kcmVzZXRSb3dDYWNoZSgwKSx0aGlzLl9zaWduYWwoImNoYW5nZVdyYXBMaW1pdCIpKSwhMCk6ITF9LHRoaXMuJGNvbnN0cmFpbldyYXBMaW1pdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQmJihlPU1hdGgubWF4KHQsZSkpLG4mJihlPU1hdGgubWluKG4sZSkpLGV9LHRoaXMuZ2V0V3JhcExpbWl0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHdyYXBMaW1pdH0sdGhpcy5zZXRXcmFwTGltaXQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRXcmFwTGltaXRSYW5nZShlLGUpfSx0aGlzLmdldFdyYXBMaW1pdFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJue21pbjp0aGlzLiR3cmFwTGltaXRSYW5nZS5taW4sbWF4OnRoaXMuJHdyYXBMaW1pdFJhbmdlLm1heH19LHRoaXMuJHVwZGF0ZUludGVybmFsRGF0YU9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJHVzZVdyYXBNb2RlLG49ZS5hY3Rpb24scj1lLnN0YXJ0LGk9ZS5lbmQscz1yLnJvdyxvPWkucm93LHU9by1zLGE9bnVsbDt0aGlzLiR1cGRhdGluZz0hMDtpZih1IT0wKWlmKG49PT0icmVtb3ZlIil7dGhpc1t0PyIkd3JhcERhdGEiOiIkcm93TGVuZ3RoQ2FjaGUiXS5zcGxpY2Uocyx1KTt2YXIgZj10aGlzLiRmb2xkRGF0YTthPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKGUpLHRoaXMucmVtb3ZlRm9sZHMoYSk7dmFyIGw9dGhpcy5nZXRGb2xkTGluZShpLnJvdyksYz0wO2lmKGwpe2wuYWRkUmVtb3ZlQ2hhcnMoaS5yb3csaS5jb2x1bW4sci5jb2x1bW4taS5jb2x1bW4pLGwuc2hpZnRSb3coLXUpO3ZhciBoPXRoaXMuZ2V0Rm9sZExpbmUocyk7aCYmaCE9PWwmJihoLm1lcmdlKGwpLGw9aCksYz1mLmluZGV4T2YobCkrMX1mb3IoYztjPGYubGVuZ3RoO2MrKyl7dmFyIGw9ZltjXTtsLnN0YXJ0LnJvdz49aS5yb3cmJmwuc2hpZnRSb3coLXUpfW89c31lbHNle3ZhciBwPUFycmF5KHUpO3AudW5zaGlmdChzLDApO3ZhciBkPXQ/dGhpcy4kd3JhcERhdGE6dGhpcy4kcm93TGVuZ3RoQ2FjaGU7ZC5zcGxpY2UuYXBwbHkoZCxwKTt2YXIgZj10aGlzLiRmb2xkRGF0YSxsPXRoaXMuZ2V0Rm9sZExpbmUocyksYz0wO2lmKGwpe3ZhciB2PWwucmFuZ2UuY29tcGFyZUluc2lkZShyLnJvdyxyLmNvbHVtbik7dj09MD8obD1sLnNwbGl0KHIucm93LHIuY29sdW1uKSxsJiYobC5zaGlmdFJvdyh1KSxsLmFkZFJlbW92ZUNoYXJzKG8sMCxpLmNvbHVtbi1yLmNvbHVtbikpKTp2PT0tMSYmKGwuYWRkUmVtb3ZlQ2hhcnMocywwLGkuY29sdW1uLXIuY29sdW1uKSxsLnNoaWZ0Um93KHUpKSxjPWYuaW5kZXhPZihsKSsxfWZvcihjO2M8Zi5sZW5ndGg7YysrKXt2YXIgbD1mW2NdO2wuc3RhcnQucm93Pj1zJiZsLnNoaWZ0Um93KHUpfX1lbHNle3U9TWF0aC5hYnMoZS5zdGFydC5jb2x1bW4tZS5lbmQuY29sdW1uKSxuPT09InJlbW92ZSImJihhPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKGUpLHRoaXMucmVtb3ZlRm9sZHMoYSksdT0tdSk7dmFyIGw9dGhpcy5nZXRGb2xkTGluZShzKTtsJiZsLmFkZFJlbW92ZUNoYXJzKHMsci5jb2x1bW4sdSl9cmV0dXJuIHQmJnRoaXMuJHdyYXBEYXRhLmxlbmd0aCE9dGhpcy5kb2MuZ2V0TGVuZ3RoKCkmJmNvbnNvbGUuZXJyb3IoImRvYy5nZXRMZW5ndGgoKSBhbmQgJHdyYXBEYXRhLmxlbmd0aCBoYXZlIHRvIGJlIHRoZSBzYW1lISIpLHRoaXMuJHVwZGF0aW5nPSExLHQ/dGhpcy4kdXBkYXRlV3JhcERhdGEocyxvKTp0aGlzLiR1cGRhdGVSb3dMZW5ndGhDYWNoZShzLG8pLGF9LHRoaXMuJHVwZGF0ZVJvd0xlbmd0aENhY2hlPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLiRyb3dMZW5ndGhDYWNoZVtlXT1udWxsLHRoaXMuJHJvd0xlbmd0aENhY2hlW3RdPW51bGx9LHRoaXMuJHVwZGF0ZVdyYXBEYXRhPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5kb2MuZ2V0QWxsTGluZXMoKSxpPXRoaXMuZ2V0VGFiU2l6ZSgpLG89dGhpcy4kd3JhcERhdGEsdT10aGlzLiR3cmFwTGltaXQsYSxmLGw9ZTt0PU1hdGgubWluKHQsci5sZW5ndGgtMSk7d2hpbGUobDw9dClmPXRoaXMuZ2V0Rm9sZExpbmUobCxmKSxmPyhhPVtdLGYud2FsayhmdW5jdGlvbihlLHQsaSxvKXt2YXIgdTtpZihlIT1udWxsKXt1PXRoaXMuJGdldERpc3BsYXlUb2tlbnMoZSxhLmxlbmd0aCksdVswXT1uO2Zvcih2YXIgZj0xO2Y8dS5sZW5ndGg7ZisrKXVbZl09c31lbHNlIHU9dGhpcy4kZ2V0RGlzcGxheVRva2VucyhyW3RdLnN1YnN0cmluZyhvLGkpLGEubGVuZ3RoKTthPWEuY29uY2F0KHUpfS5iaW5kKHRoaXMpLGYuZW5kLnJvdyxyW2YuZW5kLnJvd10ubGVuZ3RoKzEpLG9bZi5zdGFydC5yb3ddPXRoaXMuJGNvbXB1dGVXcmFwU3BsaXRzKGEsdSxpKSxsPWYuZW5kLnJvdysxKTooYT10aGlzLiRnZXREaXNwbGF5VG9rZW5zKHJbbF0pLG9bbF09dGhpcy4kY29tcHV0ZVdyYXBTcGxpdHMoYSx1LGkpLGwrKyl9O3ZhciBlPTEsdD0yLG49MyxzPTQsYT05LGM9MTAsZD0xMSx2PTEyO3RoaXMuJGNvbXB1dGVXcmFwU3BsaXRzPWZ1bmN0aW9uKGUscixpKXtmdW5jdGlvbiBnKCl7dmFyIHQ9MDtpZihtPT09MClyZXR1cm4gdDtpZihwKWZvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO2lmKHI9PWMpdCs9MTtlbHNle2lmKHIhPWQpe2lmKHI9PXYpY29udGludWU7YnJlYWt9dCs9aX19cmV0dXJuIGgmJnAhPT0hMSYmKHQrPWkpLE1hdGgubWluKHQsbSl9ZnVuY3Rpb24geSh0KXt2YXIgbj10LWY7Zm9yKHZhciByPWY7cjx0O3IrKyl7dmFyIGk9ZVtyXTtpZihpPT09MTJ8fGk9PT0yKW4tPTF9by5sZW5ndGh8fChiPWcoKSxvLmluZGVudD1iKSxsKz1uLG8ucHVzaChsKSxmPXR9aWYoZS5sZW5ndGg9PTApcmV0dXJuW107dmFyIG89W10sdT1lLmxlbmd0aCxmPTAsbD0wLGg9dGhpcy4kd3JhcEFzQ29kZSxwPXRoaXMuJGluZGVudGVkU29mdFdyYXAsbT1yPD1NYXRoLm1heCgyKmksOCl8fHA9PT0hMT8wOk1hdGguZmxvb3Ioci8yKSxiPTA7d2hpbGUodS1mPnItYil7dmFyIHc9ZityLWI7aWYoZVt3LTFdPj1jJiZlW3ddPj1jKXt5KHcpO2NvbnRpbnVlfWlmKGVbd109PW58fGVbd109PXMpe2Zvcih3O3chPWYtMTt3LS0paWYoZVt3XT09bilicmVhaztpZih3PmYpe3kodyk7Y29udGludWV9dz1mK3I7Zm9yKHc7dzxlLmxlbmd0aDt3KyspaWYoZVt3XSE9cylicmVhaztpZih3PT1lLmxlbmd0aClicmVhazt5KHcpO2NvbnRpbnVlfXZhciBFPU1hdGgubWF4KHctKHItKHI+PjIpKSxmLTEpO3doaWxlKHc+RSYmZVt3XTxuKXctLTtpZihoKXt3aGlsZSh3PkUmJmVbd108bil3LS07d2hpbGUodz5FJiZlW3ddPT1hKXctLX1lbHNlIHdoaWxlKHc+RSYmZVt3XTxjKXctLTtpZih3PkUpe3koKyt3KTtjb250aW51ZX13PWYrcixlW3ddPT10JiZ3LS0seSh3LWIpfXJldHVybiBvfSx0aGlzLiRnZXREaXNwbGF5VG9rZW5zPWZ1bmN0aW9uKG4scil7dmFyIGk9W10scztyPXJ8fDA7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspe3ZhciB1PW4uY2hhckNvZGVBdChvKTtpZih1PT05KXtzPXRoaXMuZ2V0U2NyZWVuVGFiU2l6ZShpLmxlbmd0aCtyKSxpLnB1c2goZCk7Zm9yKHZhciBmPTE7ZjxzO2YrKylpLnB1c2godil9ZWxzZSB1PT0zMj9pLnB1c2goYyk6dT4zOSYmdTw0OHx8dT41NyYmdTw2ND9pLnB1c2goYSk6dT49NDM1MiYmbSh1KT9pLnB1c2goZSx0KTppLnB1c2goZSl9cmV0dXJuIGl9LHRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoPWZ1bmN0aW9uKGUsdCxuKXtpZih0PT0wKXJldHVyblswLDBdO3Q9PW51bGwmJih0PUluZmluaXR5KSxuPW58fDA7dmFyIHIsaTtmb3IoaT0wO2k8ZS5sZW5ndGg7aSsrKXtyPWUuY2hhckNvZGVBdChpKSxyPT05P24rPXRoaXMuZ2V0U2NyZWVuVGFiU2l6ZShuKTpyPj00MzUyJiZtKHIpP24rPTI6bis9MTtpZihuPnQpYnJlYWt9cmV0dXJuW24saV19LHRoaXMubGluZVdpZGdldHM9bnVsbCx0aGlzLmdldFJvd0xlbmd0aD1mdW5jdGlvbihlKXtpZih0aGlzLmxpbmVXaWRnZXRzKXZhciB0PXRoaXMubGluZVdpZGdldHNbZV0mJnRoaXMubGluZVdpZGdldHNbZV0ucm93Q291bnR8fDA7ZWxzZSB0PTA7cmV0dXJuIXRoaXMuJHVzZVdyYXBNb2RlfHwhdGhpcy4kd3JhcERhdGFbZV0/MSt0OnRoaXMuJHdyYXBEYXRhW2VdLmxlbmd0aCsxK3R9LHRoaXMuZ2V0Um93TGluZUNvdW50PWZ1bmN0aW9uKGUpe3JldHVybiF0aGlzLiR1c2VXcmFwTW9kZXx8IXRoaXMuJHdyYXBEYXRhW2VdPzE6dGhpcy4kd3JhcERhdGFbZV0ubGVuZ3RoKzF9LHRoaXMuZ2V0Um93V3JhcEluZGVudD1mdW5jdGlvbihlKXtpZih0aGlzLiR1c2VXcmFwTW9kZSl7dmFyIHQ9dGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZSxOdW1iZXIuTUFYX1ZBTFVFKSxuPXRoaXMuJHdyYXBEYXRhW3Qucm93XTtyZXR1cm4gbi5sZW5ndGgmJm5bMF08dC5jb2x1bW4/bi5pbmRlbnQ6MH1yZXR1cm4gMH0sdGhpcy5nZXRTY3JlZW5MYXN0Um93Q29sdW1uPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGUsTnVtYmVyLk1BWF9WQUxVRSk7cmV0dXJuIHRoaXMuZG9jdW1lbnRUb1NjcmVlbkNvbHVtbih0LnJvdyx0LmNvbHVtbil9LHRoaXMuZ2V0RG9jdW1lbnRMYXN0Um93Q29sdW1uPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5kb2N1bWVudFRvU2NyZWVuUm93KGUsdCk7cmV0dXJuIHRoaXMuZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbihuKX0sdGhpcy5nZXREb2N1bWVudExhc3RSb3dDb2x1bW5Qb3NpdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdyhlLHQpO3JldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihuLE51bWJlci5NQVhfVkFMVUUvMTApfSx0aGlzLmdldFJvd1NwbGl0RGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kdXNlV3JhcE1vZGU/dGhpcy4kd3JhcERhdGFbZV06dW5kZWZpbmVkfSx0aGlzLmdldFNjcmVlblRhYlNpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJHRhYlNpemUtKGUldGhpcy4kdGFiU2l6ZXwwKX0sdGhpcy5zY3JlZW5Ub0RvY3VtZW50Um93PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGUsdCkucm93fSx0aGlzLnNjcmVlblRvRG9jdW1lbnRDb2x1bW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZSx0KS5jb2x1bW59LHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uPWZ1bmN0aW9uKGUsdCxuKXtpZihlPDApcmV0dXJue3JvdzowLGNvbHVtbjowfTt2YXIgcixpPTAscz0wLG8sdT0wLGE9MCxmPXRoaXMuJHNjcmVlblJvd0NhY2hlLGw9dGhpcy4kZ2V0Um93Q2FjaGVJbmRleChmLGUpLGM9Zi5sZW5ndGg7aWYoYyYmbD49MCl2YXIgdT1mW2xdLGk9dGhpcy4kZG9jUm93Q2FjaGVbbF0saD1lPmZbYy0xXTtlbHNlIHZhciBoPSFjO3ZhciBwPXRoaXMuZ2V0TGVuZ3RoKCktMSxkPXRoaXMuZ2V0TmV4dEZvbGRMaW5lKGkpLHY9ZD9kLnN0YXJ0LnJvdzpJbmZpbml0eTt3aGlsZSh1PD1lKXthPXRoaXMuZ2V0Um93TGVuZ3RoKGkpO2lmKHUrYT5lfHxpPj1wKWJyZWFrO3UrPWEsaSsrLGk+diYmKGk9ZC5lbmQucm93KzEsZD10aGlzLmdldE5leHRGb2xkTGluZShpLGQpLHY9ZD9kLnN0YXJ0LnJvdzpJbmZpbml0eSksaCYmKHRoaXMuJGRvY1Jvd0NhY2hlLnB1c2goaSksdGhpcy4kc2NyZWVuUm93Q2FjaGUucHVzaCh1KSl9aWYoZCYmZC5zdGFydC5yb3c8PWkpcj10aGlzLmdldEZvbGREaXNwbGF5TGluZShkKSxpPWQuc3RhcnQucm93O2Vsc2V7aWYodSthPD1lfHxpPnApcmV0dXJue3JvdzpwLGNvbHVtbjp0aGlzLmdldExpbmUocCkubGVuZ3RofTtyPXRoaXMuZ2V0TGluZShpKSxkPW51bGx9dmFyIG09MCxnPU1hdGguZmxvb3IoZS11KTtpZih0aGlzLiR1c2VXcmFwTW9kZSl7dmFyIHk9dGhpcy4kd3JhcERhdGFbaV07eSYmKG89eVtnXSxnPjAmJnkubGVuZ3RoJiYobT15LmluZGVudCxzPXlbZy0xXXx8eVt5Lmxlbmd0aC0xXSxyPXIuc3Vic3RyaW5nKHMpKSl9cmV0dXJuIG4hPT11bmRlZmluZWQmJnRoaXMuJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyh1K2csaSxnKSYmKHQ9dGhpcy4kYmlkaUhhbmRsZXIub2Zmc2V0VG9Db2wobikpLHMrPXRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoKHIsdC1tKVsxXSx0aGlzLiR1c2VXcmFwTW9kZSYmcz49byYmKHM9by0xKSxkP2QuaWR4VG9Qb3NpdGlvbihzKTp7cm93OmksY29sdW1uOnN9fSx0aGlzLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbj1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiB0PT0idW5kZWZpbmVkIil2YXIgbj10aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KGUucm93LGUuY29sdW1uKTtlbHNlIG49dGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChlLHQpO2U9bi5yb3csdD1uLmNvbHVtbjt2YXIgcj0wLGk9bnVsbCxzPW51bGw7cz10aGlzLmdldEZvbGRBdChlLHQsMSkscyYmKGU9cy5zdGFydC5yb3csdD1zLnN0YXJ0LmNvbHVtbik7dmFyIG8sdT0wLGE9dGhpcy4kZG9jUm93Q2FjaGUsZj10aGlzLiRnZXRSb3dDYWNoZUluZGV4KGEsZSksbD1hLmxlbmd0aDtpZihsJiZmPj0wKXZhciB1PWFbZl0scj10aGlzLiRzY3JlZW5Sb3dDYWNoZVtmXSxjPWU+YVtsLTFdO2Vsc2UgdmFyIGM9IWw7dmFyIGg9dGhpcy5nZXROZXh0Rm9sZExpbmUodSkscD1oP2guc3RhcnQucm93OkluZmluaXR5O3doaWxlKHU8ZSl7aWYodT49cCl7bz1oLmVuZC5yb3crMTtpZihvPmUpYnJlYWs7aD10aGlzLmdldE5leHRGb2xkTGluZShvLGgpLHA9aD9oLnN0YXJ0LnJvdzpJbmZpbml0eX1lbHNlIG89dSsxO3IrPXRoaXMuZ2V0Um93TGVuZ3RoKHUpLHU9byxjJiYodGhpcy4kZG9jUm93Q2FjaGUucHVzaCh1KSx0aGlzLiRzY3JlZW5Sb3dDYWNoZS5wdXNoKHIpKX12YXIgZD0iIjtoJiZ1Pj1wPyhkPXRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lKGgsZSx0KSxpPWguc3RhcnQucm93KTooZD10aGlzLmdldExpbmUoZSkuc3Vic3RyaW5nKDAsdCksaT1lKTt2YXIgdj0wO2lmKHRoaXMuJHVzZVdyYXBNb2RlKXt2YXIgbT10aGlzLiR3cmFwRGF0YVtpXTtpZihtKXt2YXIgZz0wO3doaWxlKGQubGVuZ3RoPj1tW2ddKXIrKyxnKys7ZD1kLnN1YnN0cmluZyhtW2ctMV18fDAsZC5sZW5ndGgpLHY9Zz4wP20uaW5kZW50OjB9fXJldHVybntyb3c6cixjb2x1bW46dit0aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aChkKVswXX19LHRoaXMuZG9jdW1lbnRUb1NjcmVlbkNvbHVtbj1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihlLHQpLmNvbHVtbn0sdGhpcy5kb2N1bWVudFRvU2NyZWVuUm93PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGUsdCkucm93fSx0aGlzLmdldFNjcmVlbkxlbmd0aD1mdW5jdGlvbigpe3ZhciBlPTAsdD1udWxsO2lmKCF0aGlzLiR1c2VXcmFwTW9kZSl7ZT10aGlzLmdldExlbmd0aCgpO3ZhciBuPXRoaXMuJGZvbGREYXRhO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXQ9bltyXSxlLT10LmVuZC5yb3ctdC5zdGFydC5yb3d9ZWxzZXt2YXIgaT10aGlzLiR3cmFwRGF0YS5sZW5ndGgscz0wLHI9MCx0PXRoaXMuJGZvbGREYXRhW3IrK10sbz10P3Quc3RhcnQucm93OkluZmluaXR5O3doaWxlKHM8aSl7dmFyIHU9dGhpcy4kd3JhcERhdGFbc107ZSs9dT91Lmxlbmd0aCsxOjEscysrLHM+byYmKHM9dC5lbmQucm93KzEsdD10aGlzLiRmb2xkRGF0YVtyKytdLG89dD90LnN0YXJ0LnJvdzpJbmZpbml0eSl9fXJldHVybiB0aGlzLmxpbmVXaWRnZXRzJiYoZSs9dGhpcy4kZ2V0V2lkZ2V0U2NyZWVuTGVuZ3RoKCkpLGV9LHRoaXMuJHNldEZvbnRNZXRyaWNzPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRlbmFibGVWYXJDaGFyKXJldHVybjt0aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aD1mdW5jdGlvbih0LG4scil7aWYobj09PTApcmV0dXJuWzAsMF07bnx8KG49SW5maW5pdHkpLHI9cnx8MDt2YXIgaSxzO2ZvcihzPTA7czx0Lmxlbmd0aDtzKyspe2k9dC5jaGFyQXQocyksaT09PSIJIj9yKz10aGlzLmdldFNjcmVlblRhYlNpemUocik6cis9ZS5nZXRDaGFyYWN0ZXJXaWR0aChpKTtpZihyPm4pYnJlYWt9cmV0dXJuW3Isc119fSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmJnVG9rZW5pemVyJiYodGhpcy5iZ1Rva2VuaXplci5zZXREb2N1bWVudChudWxsKSx0aGlzLmJnVG9rZW5pemVyPW51bGwpLHRoaXMuJHN0b3BXb3JrZXIoKX0sdGhpcy5pc0Z1bGxXaWR0aD1tfS5jYWxsKGQucHJvdG90eXBlKSxlKCIuL2VkaXRfc2Vzc2lvbi9mb2xkaW5nIikuRm9sZGluZy5jYWxsKGQucHJvdG90eXBlKSxlKCIuL2VkaXRfc2Vzc2lvbi9icmFja2V0X21hdGNoIikuQnJhY2tldE1hdGNoLmNhbGwoZC5wcm90b3R5cGUpLG8uZGVmaW5lT3B0aW9ucyhkLnByb3RvdHlwZSwic2Vzc2lvbiIse3dyYXA6e3NldDpmdW5jdGlvbihlKXshZXx8ZT09Im9mZiI/ZT0hMTplPT0iZnJlZSI/ZT0hMDplPT0icHJpbnRNYXJnaW4iP2U9LTE6dHlwZW9mIGU9PSJzdHJpbmciJiYoZT1wYXJzZUludChlLDEwKXx8ITEpO2lmKHRoaXMuJHdyYXA9PWUpcmV0dXJuO3RoaXMuJHdyYXA9ZTtpZighZSl0aGlzLnNldFVzZVdyYXBNb2RlKCExKTtlbHNle3ZhciB0PXR5cGVvZiBlPT0ibnVtYmVyIj9lOm51bGw7dGhpcy5zZXRXcmFwTGltaXRSYW5nZSh0LHQpLHRoaXMuc2V0VXNlV3JhcE1vZGUoITApfX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VXNlV3JhcE1vZGUoKT90aGlzLiR3cmFwPT0tMT8icHJpbnRNYXJnaW4iOnRoaXMuZ2V0V3JhcExpbWl0UmFuZ2UoKS5taW4/dGhpcy4kd3JhcDoiZnJlZSI6Im9mZiJ9LGhhbmRsZXNTZXQ6ITB9LHdyYXBNZXRob2Q6e3NldDpmdW5jdGlvbihlKXtlPWU9PSJhdXRvIj90aGlzLiRtb2RlLnR5cGUhPSJ0ZXh0IjplIT0idGV4dCIsZSE9dGhpcy4kd3JhcEFzQ29kZSYmKHRoaXMuJHdyYXBBc0NvZGU9ZSx0aGlzLiR1c2VXcmFwTW9kZSYmKHRoaXMuJHVzZVdyYXBNb2RlPSExLHRoaXMuc2V0VXNlV3JhcE1vZGUoITApKSl9LGluaXRpYWxWYWx1ZToiYXV0byJ9LGluZGVudGVkU29mdFdyYXA6e3NldDpmdW5jdGlvbigpe3RoaXMuJHVzZVdyYXBNb2RlJiYodGhpcy4kdXNlV3JhcE1vZGU9ITEsdGhpcy5zZXRVc2VXcmFwTW9kZSghMCkpfSxpbml0aWFsVmFsdWU6ITB9LGZpcnN0TGluZU51bWJlcjp7c2V0OmZ1bmN0aW9uKCl7dGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iil9LGluaXRpYWxWYWx1ZToxfSx1c2VXb3JrZXI6e3NldDpmdW5jdGlvbihlKXt0aGlzLiR1c2VXb3JrZXI9ZSx0aGlzLiRzdG9wV29ya2VyKCksZSYmdGhpcy4kc3RhcnRXb3JrZXIoKX0saW5pdGlhbFZhbHVlOiEwfSx1c2VTb2Z0VGFiczp7aW5pdGlhbFZhbHVlOiEwfSx0YWJTaXplOntzZXQ6ZnVuY3Rpb24oZSl7ZT1wYXJzZUludChlKSxlPjAmJnRoaXMuJHRhYlNpemUhPT1lJiYodGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kcm93TGVuZ3RoQ2FjaGU9W10sdGhpcy4kdGFiU2l6ZT1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlVGFiU2l6ZSIpKX0saW5pdGlhbFZhbHVlOjQsaGFuZGxlc1NldDohMH0sbmF2aWdhdGVXaXRoaW5Tb2Z0VGFiczp7aW5pdGlhbFZhbHVlOiExfSxmb2xkU3R5bGU6e3NldDpmdW5jdGlvbihlKXt0aGlzLnNldEZvbGRTdHlsZShlKX0saGFuZGxlc1NldDohMH0sb3ZlcndyaXRlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fc2lnbmFsKCJjaGFuZ2VPdmVyd3JpdGUiKX0saW5pdGlhbFZhbHVlOiExfSxuZXdMaW5lTW9kZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuZG9jLnNldE5ld0xpbmVNb2RlKGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2MuZ2V0TmV3TGluZU1vZGUoKX0saGFuZGxlc1NldDohMH0sbW9kZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2V0TW9kZShlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG1vZGVJZH0saGFuZGxlc1NldDohMH19KSx0LkVkaXRTZXNzaW9uPWR9KSxhY2UuZGVmaW5lKCJhY2Uvc2VhcmNoIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHUoZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybi9cdy8udGVzdChlKXx8dC5yZWdFeHA/IlxcYiI6IiJ9cmV0dXJuIG4oZVswXSkrZStuKGVbZS5sZW5ndGgtMV0pfXZhciByPWUoIi4vbGliL2xhbmciKSxpPWUoIi4vbGliL29vcCIpLHM9ZSgiLi9yYW5nZSIpLlJhbmdlLG89ZnVuY3Rpb24oKXt0aGlzLiRvcHRpb25zPXt9fTsoZnVuY3Rpb24oKXt0aGlzLnNldD1mdW5jdGlvbihlKXtyZXR1cm4gaS5taXhpbih0aGlzLiRvcHRpb25zLGUpLHRoaXN9LHRoaXMuZ2V0T3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiByLmNvcHlPYmplY3QodGhpcy4kb3B0aW9ucyl9LHRoaXMuc2V0T3B0aW9ucz1mdW5jdGlvbihlKXt0aGlzLiRvcHRpb25zPWV9LHRoaXMuZmluZD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRvcHRpb25zLG49dGhpcy4kbWF0Y2hJdGVyYXRvcihlLHQpO2lmKCFuKXJldHVybiExO3ZhciByPW51bGw7cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihlLG4saSxvKXtyZXR1cm4gcj1uZXcgcyhlLG4saSxvKSxuPT1vJiZ0LnN0YXJ0JiZ0LnN0YXJ0LnN0YXJ0JiZ0LnNraXBDdXJyZW50IT0wJiZyLmlzRXF1YWwodC5zdGFydCk/KHI9bnVsbCwhMSk6ITB9KSxyfSx0aGlzLmZpbmRBbGw9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kb3B0aW9ucztpZighdC5uZWVkbGUpcmV0dXJuW107dGhpcy4kYXNzZW1ibGVSZWdFeHAodCk7dmFyIG49dC5yYW5nZSxpPW4/ZS5nZXRMaW5lcyhuLnN0YXJ0LnJvdyxuLmVuZC5yb3cpOmUuZG9jLmdldEFsbExpbmVzKCksbz1bXSx1PXQucmU7aWYodC4kaXNNdWx0aUxpbmUpe3ZhciBhPXUubGVuZ3RoLGY9aS5sZW5ndGgtYSxsO2U6Zm9yKHZhciBjPXUub2Zmc2V0fHwwO2M8PWY7YysrKXtmb3IodmFyIGg9MDtoPGE7aCsrKWlmKGlbYytoXS5zZWFyY2godVtoXSk9PS0xKWNvbnRpbnVlIGU7dmFyIHA9aVtjXSxkPWlbYythLTFdLHY9cC5sZW5ndGgtcC5tYXRjaCh1WzBdKVswXS5sZW5ndGgsbT1kLm1hdGNoKHVbYS0xXSlbMF0ubGVuZ3RoO2lmKGwmJmwuZW5kLnJvdz09PWMmJmwuZW5kLmNvbHVtbj52KWNvbnRpbnVlO28ucHVzaChsPW5ldyBzKGMsdixjK2EtMSxtKSksYT4yJiYoYz1jK2EtMil9fWVsc2UgZm9yKHZhciBnPTA7ZzxpLmxlbmd0aDtnKyspe3ZhciB5PXIuZ2V0TWF0Y2hPZmZzZXRzKGlbZ10sdSk7Zm9yKHZhciBoPTA7aDx5Lmxlbmd0aDtoKyspe3ZhciBiPXlbaF07by5wdXNoKG5ldyBzKGcsYi5vZmZzZXQsZyxiLm9mZnNldCtiLmxlbmd0aCkpfX1pZihuKXt2YXIgdz1uLnN0YXJ0LmNvbHVtbixFPW4uc3RhcnQuY29sdW1uLGc9MCxoPW8ubGVuZ3RoLTE7d2hpbGUoZzxoJiZvW2ddLnN0YXJ0LmNvbHVtbjx3JiZvW2ddLnN0YXJ0LnJvdz09bi5zdGFydC5yb3cpZysrO3doaWxlKGc8aCYmb1toXS5lbmQuY29sdW1uPkUmJm9baF0uZW5kLnJvdz09bi5lbmQucm93KWgtLTtvPW8uc2xpY2UoZyxoKzEpO2ZvcihnPTAsaD1vLmxlbmd0aDtnPGg7ZysrKW9bZ10uc3RhcnQucm93Kz1uLnN0YXJ0LnJvdyxvW2ddLmVuZC5yb3crPW4uc3RhcnQucm93fXJldHVybiBvfSx0aGlzLnJlcGxhY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRvcHRpb25zLHI9dGhpcy4kYXNzZW1ibGVSZWdFeHAobik7aWYobi4kaXNNdWx0aUxpbmUpcmV0dXJuIHQ7aWYoIXIpcmV0dXJuO3ZhciBpPXIuZXhlYyhlKTtpZighaXx8aVswXS5sZW5ndGghPWUubGVuZ3RoKXJldHVybiBudWxsO3Q9ZS5yZXBsYWNlKHIsdCk7aWYobi5wcmVzZXJ2ZUNhc2Upe3Q9dC5zcGxpdCgiIik7Zm9yKHZhciBzPU1hdGgubWluKGUubGVuZ3RoLGUubGVuZ3RoKTtzLS07KXt2YXIgbz1lW3NdO28mJm8udG9Mb3dlckNhc2UoKSE9bz90W3NdPXRbc10udG9VcHBlckNhc2UoKTp0W3NdPXRbc10udG9Mb3dlckNhc2UoKX10PXQuam9pbigiIil9cmV0dXJuIHR9LHRoaXMuJGFzc2VtYmxlUmVnRXhwPWZ1bmN0aW9uKGUsdCl7aWYoZS5uZWVkbGUgaW5zdGFuY2VvZiBSZWdFeHApcmV0dXJuIGUucmU9ZS5uZWVkbGU7dmFyIG49ZS5uZWVkbGU7aWYoIWUubmVlZGxlKXJldHVybiBlLnJlPSExO2UucmVnRXhwfHwobj1yLmVzY2FwZVJlZ0V4cChuKSksZS53aG9sZVdvcmQmJihuPXUobixlKSk7dmFyIGk9ZS5jYXNlU2Vuc2l0aXZlPyJnbSI6ImdtaSI7ZS4kaXNNdWx0aUxpbmU9IXQmJi9bXG5ccl0vLnRlc3Qobik7aWYoZS4kaXNNdWx0aUxpbmUpcmV0dXJuIGUucmU9dGhpcy4kYXNzZW1ibGVNdWx0aWxpbmVSZWdFeHAobixpKTt0cnl7dmFyIHM9bmV3IFJlZ0V4cChuLGkpfWNhdGNoKG8pe3M9ITF9cmV0dXJuIGUucmU9c30sdGhpcy4kYXNzZW1ibGVNdWx0aWxpbmVSZWdFeHA9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnJlcGxhY2UoL1xyXG58XHJ8XG4vZywiJFxuXiIpLnNwbGl0KCJcbiIpLHI9W107Zm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspdHJ5e3IucHVzaChuZXcgUmVnRXhwKG5baV0sdCkpfWNhdGNoKHMpe3JldHVybiExfXJldHVybiByfSx0aGlzLiRtYXRjaEl0ZXJhdG9yPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kYXNzZW1ibGVSZWdFeHAodCk7aWYoIW4pcmV0dXJuITE7dmFyIHI9dC5iYWNrd2FyZHM9PTEsaT10LnNraXBDdXJyZW50IT0wLHM9dC5yYW5nZSxvPXQuc3RhcnQ7b3x8KG89cz9zW3I/ImVuZCI6InN0YXJ0Il06ZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSksby5zdGFydCYmKG89b1tpIT1yPyJlbmQiOiJzdGFydCJdKTt2YXIgdT1zP3Muc3RhcnQucm93OjAsYT1zP3MuZW5kLnJvdzplLmdldExlbmd0aCgpLTE7aWYocil2YXIgZj1mdW5jdGlvbihlKXt2YXIgbj1vLnJvdztpZihjKG4sby5jb2x1bW4sZSkpcmV0dXJuO2ZvcihuLS07bj49dTtuLS0paWYoYyhuLE51bWJlci5NQVhfVkFMVUUsZSkpcmV0dXJuO2lmKHQud3JhcD09MClyZXR1cm47Zm9yKG49YSx1PW8ucm93O24+PXU7bi0tKWlmKGMobixOdW1iZXIuTUFYX1ZBTFVFLGUpKXJldHVybn07ZWxzZSB2YXIgZj1mdW5jdGlvbihlKXt2YXIgbj1vLnJvdztpZihjKG4sby5jb2x1bW4sZSkpcmV0dXJuO2ZvcihuKz0xO248PWE7bisrKWlmKGMobiwwLGUpKXJldHVybjtpZih0LndyYXA9PTApcmV0dXJuO2ZvcihuPXUsYT1vLnJvdztuPD1hO24rKylpZihjKG4sMCxlKSlyZXR1cm59O2lmKHQuJGlzTXVsdGlMaW5lKXZhciBsPW4ubGVuZ3RoLGM9ZnVuY3Rpb24odCxpLHMpe3ZhciBvPXI/dC1sKzE6dDtpZihvPDApcmV0dXJuO3ZhciB1PWUuZ2V0TGluZShvKSxhPXUuc2VhcmNoKG5bMF0pO2lmKCFyJiZhPGl8fGE9PT0tMSlyZXR1cm47Zm9yKHZhciBmPTE7ZjxsO2YrKyl7dT1lLmdldExpbmUobytmKTtpZih1LnNlYXJjaChuW2ZdKT09LTEpcmV0dXJufXZhciBjPXUubWF0Y2gobltsLTFdKVswXS5sZW5ndGg7aWYociYmYz5pKXJldHVybjtpZihzKG8sYSxvK2wtMSxjKSlyZXR1cm4hMH07ZWxzZSBpZihyKXZhciBjPWZ1bmN0aW9uKHQscixpKXt2YXIgcz1lLmdldExpbmUodCksbz1bXSx1LGE9MDtuLmxhc3RJbmRleD0wO3doaWxlKHU9bi5leGVjKHMpKXt2YXIgZj11WzBdLmxlbmd0aDthPXUuaW5kZXg7aWYoIWYpe2lmKGE+PXMubGVuZ3RoKWJyZWFrO24ubGFzdEluZGV4PWErPTF9aWYodS5pbmRleCtmPnIpYnJlYWs7by5wdXNoKHUuaW5kZXgsZil9Zm9yKHZhciBsPW8ubGVuZ3RoLTE7bD49MDtsLT0yKXt2YXIgYz1vW2wtMV0sZj1vW2xdO2lmKGkodCxjLHQsYytmKSlyZXR1cm4hMH19O2Vsc2UgdmFyIGM9ZnVuY3Rpb24odCxyLGkpe3ZhciBzPWUuZ2V0TGluZSh0KSxvLHU7bi5sYXN0SW5kZXg9cjt3aGlsZSh1PW4uZXhlYyhzKSl7dmFyIGE9dVswXS5sZW5ndGg7bz11LmluZGV4O2lmKGkodCxvLHQsbythKSlyZXR1cm4hMDtpZighYSl7bi5sYXN0SW5kZXg9bys9MTtpZihvPj1zLmxlbmd0aClyZXR1cm4hMX19fTtyZXR1cm57Zm9yRWFjaDpmfX19KS5jYWxsKG8ucHJvdG90eXBlKSx0LlNlYXJjaD1vfSksYWNlLmRlZmluZSgiYWNlL2tleWJvYXJkL2hhc2hfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIva2V5cyIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCl7dGhpcy5wbGF0Zm9ybT10fHwoaS5pc01hYz8ibWFjIjoid2luIiksdGhpcy5jb21tYW5kcz17fSx0aGlzLmNvbW1hbmRLZXlCaW5kaW5nPXt9LHRoaXMuYWRkQ29tbWFuZHMoZSksdGhpcy4kc2luZ2xlQ29tbWFuZD0hMH1mdW5jdGlvbiB1KGUsdCl7by5jYWxsKHRoaXMsZSx0KSx0aGlzLiRzaW5nbGVDb21tYW5kPSExfXZhciByPWUoIi4uL2xpYi9rZXlzIiksaT1lKCIuLi9saWIvdXNlcmFnZW50Iikscz1yLktFWV9NT0RTO3UucHJvdG90eXBlPW8ucHJvdG90eXBlLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlLmJpbmRLZXkmJmUuYmluZEtleS5wb3NpdGlvbnx8KGUuaXNEZWZhdWx0Py0xMDA6MCl9dGhpcy5hZGRDb21tYW5kPWZ1bmN0aW9uKGUpe3RoaXMuY29tbWFuZHNbZS5uYW1lXSYmdGhpcy5yZW1vdmVDb21tYW5kKGUpLHRoaXMuY29tbWFuZHNbZS5uYW1lXT1lLGUuYmluZEtleSYmdGhpcy5fYnVpbGRLZXlIYXNoKGUpfSx0aGlzLnJlbW92ZUNvbW1hbmQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lJiYodHlwZW9mIGU9PSJzdHJpbmciP2U6ZS5uYW1lKTtlPXRoaXMuY29tbWFuZHNbbl0sdHx8ZGVsZXRlIHRoaXMuY29tbWFuZHNbbl07dmFyIHI9dGhpcy5jb21tYW5kS2V5QmluZGluZztmb3IodmFyIGkgaW4gcil7dmFyIHM9cltpXTtpZihzPT1lKWRlbGV0ZSByW2ldO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShzKSl7dmFyIG89cy5pbmRleE9mKGUpO28hPS0xJiYocy5zcGxpY2UobywxKSxzLmxlbmd0aD09MSYmKHJbaV09c1swXSkpfX19LHRoaXMuYmluZEtleT1mdW5jdGlvbihlLHQsbil7dHlwZW9mIGU9PSJvYmplY3QiJiZlJiYobj09dW5kZWZpbmVkJiYobj1lLnBvc2l0aW9uKSxlPWVbdGhpcy5wbGF0Zm9ybV0pO2lmKCFlKXJldHVybjtpZih0eXBlb2YgdD09ImZ1bmN0aW9uIilyZXR1cm4gdGhpcy5hZGRDb21tYW5kKHtleGVjOnQsYmluZEtleTplLG5hbWU6dC5uYW1lfHxlfSk7ZS5zcGxpdCgifCIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9IiI7aWYoZS5pbmRleE9mKCIgIikhPS0xKXt2YXIgaT1lLnNwbGl0KC9ccysvKTtlPWkucG9wKCksaS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyc2VLZXlzKGUpLG49c1t0Lmhhc2hJZF0rdC5rZXk7cis9KHI/IiAiOiIiKStuLHRoaXMuX2FkZENvbW1hbmRUb0JpbmRpbmcociwiY2hhaW5LZXlzIil9LHRoaXMpLHIrPSIgIn12YXIgbz10aGlzLnBhcnNlS2V5cyhlKSx1PXNbby5oYXNoSWRdK28ua2V5O3RoaXMuX2FkZENvbW1hbmRUb0JpbmRpbmcocit1LHQsbil9LHRoaXMpfSx0aGlzLl9hZGRDb21tYW5kVG9CaW5kaW5nPWZ1bmN0aW9uKHQsbixyKXt2YXIgaT10aGlzLmNvbW1hbmRLZXlCaW5kaW5nLHM7aWYoIW4pZGVsZXRlIGlbdF07ZWxzZSBpZighaVt0XXx8dGhpcy4kc2luZ2xlQ29tbWFuZClpW3RdPW47ZWxzZXtBcnJheS5pc0FycmF5KGlbdF0pPyhzPWlbdF0uaW5kZXhPZihuKSkhPS0xJiZpW3RdLnNwbGljZShzLDEpOmlbdF09W2lbdF1dLHR5cGVvZiByIT0ibnVtYmVyIiYmKHI9ZShuKSk7dmFyIG89aVt0XTtmb3Iocz0wO3M8by5sZW5ndGg7cysrKXt2YXIgdT1vW3NdLGE9ZSh1KTtpZihhPnIpYnJlYWt9by5zcGxpY2UocywwLG4pfX0sdGhpcy5hZGRDb21tYW5kcz1mdW5jdGlvbihlKXtlJiZPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPWVbdF07aWYoIW4pcmV0dXJuO2lmKHR5cGVvZiBuPT0ic3RyaW5nIilyZXR1cm4gdGhpcy5iaW5kS2V5KG4sdCk7dHlwZW9mIG49PSJmdW5jdGlvbiImJihuPXtleGVjOm59KTtpZih0eXBlb2YgbiE9Im9iamVjdCIpcmV0dXJuO24ubmFtZXx8KG4ubmFtZT10KSx0aGlzLmFkZENvbW1hbmQobil9LHRoaXMpfSx0aGlzLnJlbW92ZUNvbW1hbmRzPWZ1bmN0aW9uKGUpe09iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy5yZW1vdmVDb21tYW5kKGVbdF0pfSx0aGlzKX0sdGhpcy5iaW5kS2V5cz1mdW5jdGlvbihlKXtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RoaXMuYmluZEtleSh0LGVbdF0pfSx0aGlzKX0sdGhpcy5fYnVpbGRLZXlIYXNoPWZ1bmN0aW9uKGUpe3RoaXMuYmluZEtleShlLmJpbmRLZXksZSl9LHRoaXMucGFyc2VLZXlzPWZ1bmN0aW9uKGUpe3ZhciB0PWUudG9Mb3dlckNhc2UoKS5zcGxpdCgvW1wtXCtdKFtcLVwrXSk/LykuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSksbj10LnBvcCgpLGk9cltuXTtpZihyLkZVTkNUSU9OX0tFWVNbaV0pbj1yLkZVTkNUSU9OX0tFWVNbaV0udG9Mb3dlckNhc2UoKTtlbHNle2lmKCF0Lmxlbmd0aClyZXR1cm57a2V5Om4saGFzaElkOi0xfTtpZih0Lmxlbmd0aD09MSYmdFswXT09InNoaWZ0IilyZXR1cm57a2V5Om4udG9VcHBlckNhc2UoKSxoYXNoSWQ6LTF9fXZhciBzPTA7Zm9yKHZhciBvPXQubGVuZ3RoO28tLTspe3ZhciB1PXIuS0VZX01PRFNbdFtvXV07aWYodT09bnVsbClyZXR1cm4gdHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiJiZjb25zb2xlLmVycm9yKCJpbnZhbGlkIG1vZGlmaWVyICIrdFtvXSsiIGluICIrZSksITE7c3w9dX1yZXR1cm57a2V5Om4saGFzaElkOnN9fSx0aGlzLmZpbmRLZXlDb21tYW5kPWZ1bmN0aW9uKHQsbil7dmFyIHI9c1t0XStuO3JldHVybiB0aGlzLmNvbW1hbmRLZXlCaW5kaW5nW3JdfSx0aGlzLmhhbmRsZUtleWJvYXJkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKHI8MClyZXR1cm47dmFyIGk9c1t0XStuLG89dGhpcy5jb21tYW5kS2V5QmluZGluZ1tpXTtlLiRrZXlDaGFpbiYmKGUuJGtleUNoYWluKz0iICIraSxvPXRoaXMuY29tbWFuZEtleUJpbmRpbmdbZS4ka2V5Q2hhaW5dfHxvKTtpZihvKWlmKG89PSJjaGFpbktleXMifHxvW28ubGVuZ3RoLTFdPT0iY2hhaW5LZXlzIilyZXR1cm4gZS4ka2V5Q2hhaW49ZS4ka2V5Q2hhaW58fGkse2NvbW1hbmQ6Im51bGwifTtpZihlLiRrZXlDaGFpbilpZighIXQmJnQhPTR8fG4ubGVuZ3RoIT0xKXtpZih0PT0tMXx8cj4wKWUuJGtleUNoYWluPSIifWVsc2UgZS4ka2V5Q2hhaW49ZS4ka2V5Q2hhaW4uc2xpY2UoMCwtaS5sZW5ndGgtMSk7cmV0dXJue2NvbW1hbmQ6b319LHRoaXMuZ2V0U3RhdHVzVGV4dD1mdW5jdGlvbihlLHQpe3JldHVybiB0LiRrZXlDaGFpbnx8IiJ9fS5jYWxsKG8ucHJvdG90eXBlKSx0Lkhhc2hIYW5kbGVyPW8sdC5NdWx0aUhhc2hIYW5kbGVyPXV9KSxhY2UuZGVmaW5lKCJhY2UvY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2Uva2V5Ym9hcmQvaGFzaF9oYW5kbGVyIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvb29wIiksaT1lKCIuLi9rZXlib2FyZC9oYXNoX2hhbmRsZXIiKS5NdWx0aUhhc2hIYW5kbGVyLHM9ZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsbz1mdW5jdGlvbihlLHQpe2kuY2FsbCh0aGlzLHQsZSksdGhpcy5ieU5hbWU9dGhpcy5jb21tYW5kcyx0aGlzLnNldERlZmF1bHRIYW5kbGVyKCJleGVjIixmdW5jdGlvbihlKXtyZXR1cm4gZS5jb21tYW5kLmV4ZWMoZS5lZGl0b3IsZS5hcmdzfHx7fSl9KX07ci5pbmhlcml0cyhvLGkpLGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxzKSx0aGlzLmV4ZWM9ZnVuY3Rpb24oZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgcj1lLmxlbmd0aDtyLS07KWlmKHRoaXMuZXhlYyhlW3JdLHQsbikpcmV0dXJuITA7cmV0dXJuITF9dHlwZW9mIGU9PSJzdHJpbmciJiYoZT10aGlzLmNvbW1hbmRzW2VdKTtpZighZSlyZXR1cm4hMTtpZih0JiZ0LiRyZWFkT25seSYmIWUucmVhZE9ubHkpcmV0dXJuITE7aWYodGhpcy4kY2hlY2tDb21tYW5kU3RhdGUhPTAmJmUuaXNBdmFpbGFibGUmJiFlLmlzQXZhaWxhYmxlKHQpKXJldHVybiExO3ZhciBpPXtlZGl0b3I6dCxjb21tYW5kOmUsYXJnczpufTtyZXR1cm4gaS5yZXR1cm5WYWx1ZT10aGlzLl9lbWl0KCJleGVjIixpKSx0aGlzLl9zaWduYWwoImFmdGVyRXhlYyIsaSksaS5yZXR1cm5WYWx1ZT09PSExPyExOiEwfSx0aGlzLnRvZ2dsZVJlY29yZGluZz1mdW5jdGlvbihlKXtpZih0aGlzLiRpblJlcGxheSlyZXR1cm47cmV0dXJuIGUmJmUuX2VtaXQoImNoYW5nZVN0YXR1cyIpLHRoaXMucmVjb3JkaW5nPyh0aGlzLm1hY3JvLnBvcCgpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXhlYyIsdGhpcy4kYWRkQ29tbWFuZFRvTWFjcm8pLHRoaXMubWFjcm8ubGVuZ3RofHwodGhpcy5tYWNybz10aGlzLm9sZE1hY3JvKSx0aGlzLnJlY29yZGluZz0hMSk6KHRoaXMuJGFkZENvbW1hbmRUb01hY3JvfHwodGhpcy4kYWRkQ29tbWFuZFRvTWFjcm89ZnVuY3Rpb24oZSl7dGhpcy5tYWNyby5wdXNoKFtlLmNvbW1hbmQsZS5hcmdzXSl9LmJpbmQodGhpcykpLHRoaXMub2xkTWFjcm89dGhpcy5tYWNybyx0aGlzLm1hY3JvPVtdLHRoaXMub24oImV4ZWMiLHRoaXMuJGFkZENvbW1hbmRUb01hY3JvKSx0aGlzLnJlY29yZGluZz0hMCl9LHRoaXMucmVwbGF5PWZ1bmN0aW9uKGUpe2lmKHRoaXMuJGluUmVwbGF5fHwhdGhpcy5tYWNybylyZXR1cm47aWYodGhpcy5yZWNvcmRpbmcpcmV0dXJuIHRoaXMudG9nZ2xlUmVjb3JkaW5nKGUpO3RyeXt0aGlzLiRpblJlcGxheT0hMCx0aGlzLm1hY3JvLmZvckVhY2goZnVuY3Rpb24odCl7dHlwZW9mIHQ9PSJzdHJpbmciP3RoaXMuZXhlYyh0LGUpOnRoaXMuZXhlYyh0WzBdLGUsdFsxXSl9LHRoaXMpfWZpbmFsbHl7dGhpcy4kaW5SZXBsYXk9ITF9fSx0aGlzLnRyaW1NYWNybz1mdW5jdGlvbihlKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlWzBdIT0ic3RyaW5nIiYmKGVbMF09ZVswXS5uYW1lKSxlWzFdfHwoZT1lWzBdKSxlfSl9fS5jYWxsKG8ucHJvdG90eXBlKSx0LkNvbW1hbmRNYW5hZ2VyPW99KSxhY2UuZGVmaW5lKCJhY2UvY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyIsImFjZS9jb25maWciLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSx0KXtyZXR1cm57d2luOmUsbWFjOnR9fXZhciByPWUoIi4uL2xpYi9sYW5nIiksaT1lKCIuLi9jb25maWciKSxzPWUoIi4uL3JhbmdlIikuUmFuZ2U7dC5jb21tYW5kcz1be25hbWU6InNob3dTZXR0aW5nc01lbnUiLGJpbmRLZXk6bygiQ3RybC0sIiwiQ29tbWFuZC0sIiksZXhlYzpmdW5jdGlvbihlKXtpLmxvYWRNb2R1bGUoImFjZS9leHQvc2V0dGluZ3NfbWVudSIsZnVuY3Rpb24odCl7dC5pbml0KGUpLGUuc2hvd1NldHRpbmdzTWVudSgpfSl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ29Ub05leHRFcnJvciIsYmluZEtleTpvKCJBbHQtRSIsIkY0IiksZXhlYzpmdW5jdGlvbihlKXtpLmxvYWRNb2R1bGUoIi4vZXh0L2Vycm9yX21hcmtlciIsZnVuY3Rpb24odCl7dC5zaG93RXJyb3JNYXJrZXIoZSwxKX0pfSxzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb1RvUHJldmlvdXNFcnJvciIsYmluZEtleTpvKCJBbHQtU2hpZnQtRSIsIlNoaWZ0LUY0IiksZXhlYzpmdW5jdGlvbihlKXtpLmxvYWRNb2R1bGUoIi4vZXh0L2Vycm9yX21hcmtlciIsZnVuY3Rpb24odCl7dC5zaG93RXJyb3JNYXJrZXIoZSwtMSl9KX0sc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0YWxsIixkZXNjcmlwdGlvbjoiU2VsZWN0IGFsbCIsYmluZEtleTpvKCJDdHJsLUEiLCJDb21tYW5kLUEiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0QWxsKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiY2VudGVyc2VsZWN0aW9uIixkZXNjcmlwdGlvbjoiQ2VudGVyIHNlbGVjdGlvbiIsYmluZEtleTpvKG51bGwsIkN0cmwtTCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5jZW50ZXJTZWxlY3Rpb24oKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvbGluZSIsZGVzY3JpcHRpb246IkdvIHRvIGxpbmUuLi4iLGJpbmRLZXk6bygiQ3RybC1MIiwiQ29tbWFuZC1MIiksZXhlYzpmdW5jdGlvbihlLHQpe3R5cGVvZiB0PT0ibnVtYmVyIiYmIWlzTmFOKHQpJiZlLmdvdG9MaW5lKHQpLGUucHJvbXB0KHskdHlwZToiZ290b0xpbmUifSl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZm9sZCIsYmluZEtleTpvKCJBbHQtTHxDdHJsLUYxIiwiQ29tbWFuZC1BbHQtTHxDb21tYW5kLUYxIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24udG9nZ2xlRm9sZCghMSl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6InVuZm9sZCIsYmluZEtleTpvKCJBbHQtU2hpZnQtTHxDdHJsLVNoaWZ0LUYxIiwiQ29tbWFuZC1BbHQtU2hpZnQtTHxDb21tYW5kLVNoaWZ0LUYxIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24udG9nZ2xlRm9sZCghMCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6InRvZ2dsZUZvbGRXaWRnZXQiLGJpbmRLZXk6bygiRjIiLCJGMiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLnRvZ2dsZUZvbGRXaWRnZXQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToidG9nZ2xlUGFyZW50Rm9sZFdpZGdldCIsYmluZEtleTpvKCJBbHQtRjIiLCJBbHQtRjIiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi50b2dnbGVGb2xkV2lkZ2V0KCEwKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToiZm9sZGFsbCIsZGVzY3JpcHRpb246IkZvbGQgYWxsIixiaW5kS2V5Om8obnVsbCwiQ3RybC1Db21tYW5kLU9wdGlvbi0wIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24uZm9sZEFsbCgpfSxzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6ImZvbGRPdGhlciIsZGVzY3JpcHRpb246IkZvbGQgb3RoZXIiLGJpbmRLZXk6bygiQWx0LTAiLCJDb21tYW5kLU9wdGlvbi0wIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24uZm9sZEFsbCgpLGUuc2Vzc2lvbi51bmZvbGQoZS5zZWxlY3Rpb24uZ2V0QWxsUmFuZ2VzKCkpfSxzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6InVuZm9sZGFsbCIsZGVzY3JpcHRpb246IlVuZm9sZCBhbGwiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LTAiLCJDb21tYW5kLU9wdGlvbi1TaGlmdC0wIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24udW5mb2xkKCl9LHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToiZmluZG5leHQiLGRlc2NyaXB0aW9uOiJGaW5kIG5leHQiLGJpbmRLZXk6bygiQ3RybC1LIiwiQ29tbWFuZC1HIiksZXhlYzpmdW5jdGlvbihlKXtlLmZpbmROZXh0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6ImZpbmRwcmV2aW91cyIsZGVzY3JpcHRpb246IkZpbmQgcHJldmlvdXMiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1LIiwiQ29tbWFuZC1TaGlmdC1HIiksZXhlYzpmdW5jdGlvbihlKXtlLmZpbmRQcmV2aW91cygpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RPckZpbmROZXh0IixkZXNjcmlwdGlvbjoiU2VsZWN0IG9yIGZpbmQgbmV4dCIsYmluZEtleTpvKCJBbHQtSyIsIkN0cmwtRyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3Rpb24uaXNFbXB0eSgpP2Uuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTplLmZpbmROZXh0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0T3JGaW5kUHJldmlvdXMiLGRlc2NyaXB0aW9uOiJTZWxlY3Qgb3IgZmluZCBwcmV2aW91cyIsYmluZEtleTpvKCJBbHQtU2hpZnQtSyIsIkN0cmwtU2hpZnQtRyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3Rpb24uaXNFbXB0eSgpP2Uuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTplLmZpbmRQcmV2aW91cygpfSxyZWFkT25seTohMH0se25hbWU6ImZpbmQiLGRlc2NyaXB0aW9uOiJGaW5kIixiaW5kS2V5Om8oIkN0cmwtRiIsIkNvbW1hbmQtRiIpLGV4ZWM6ZnVuY3Rpb24oZSl7aS5sb2FkTW9kdWxlKCJhY2UvZXh0L3NlYXJjaGJveCIsZnVuY3Rpb24odCl7dC5TZWFyY2goZSl9KX0scmVhZE9ubHk6ITB9LHtuYW1lOiJvdmVyd3JpdGUiLGRlc2NyaXB0aW9uOiJPdmVyd3JpdGUiLGJpbmRLZXk6Ikluc2VydCIsZXhlYzpmdW5jdGlvbihlKXtlLnRvZ2dsZU92ZXJ3cml0ZSgpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvc3RhcnQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgdG8gc3RhcnQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1Ib21lIiwiQ29tbWFuZC1TaGlmdC1Ib21lfENvbW1hbmQtU2hpZnQtVXAiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0RmlsZVN0YXJ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixyZWFkT25seTohMCxzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIsYWNlQ29tbWFuZEdyb3VwOiJmaWxlSnVtcCJ9LHtuYW1lOiJnb3Rvc3RhcnQiLGRlc2NyaXB0aW9uOiJHbyB0byBzdGFydCIsYmluZEtleTpvKCJDdHJsLUhvbWUiLCJDb21tYW5kLUhvbWV8Q29tbWFuZC1VcCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5uYXZpZ2F0ZUZpbGVTdGFydCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIscmVhZE9ubHk6ITAsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLGFjZUNvbW1hbmRHcm91cDoiZmlsZUp1bXAifSx7bmFtZToic2VsZWN0dXAiLGRlc2NyaXB0aW9uOiJTZWxlY3QgdXAiLGJpbmRLZXk6bygiU2hpZnQtVXAiLCJTaGlmdC1VcHxDdHJsLVNoaWZ0LVAiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0VXAoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ29saW5ldXAiLGRlc2NyaXB0aW9uOiJHbyBsaW5lIHVwIixiaW5kS2V5Om8oIlVwIiwiVXB8Q3RybC1QIiksZXhlYzpmdW5jdGlvbihlLHQpe2UubmF2aWdhdGVVcCh0LnRpbWVzKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9lbmQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgdG8gZW5kIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtRW5kIiwiQ29tbWFuZC1TaGlmdC1FbmR8Q29tbWFuZC1TaGlmdC1Eb3duIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdEZpbGVFbmQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHJlYWRPbmx5OiEwLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixhY2VDb21tYW5kR3JvdXA6ImZpbGVKdW1wIn0se25hbWU6ImdvdG9lbmQiLGRlc2NyaXB0aW9uOiJHbyB0byBlbmQiLGJpbmRLZXk6bygiQ3RybC1FbmQiLCJDb21tYW5kLUVuZHxDb21tYW5kLURvd24iKSxleGVjOmZ1bmN0aW9uKGUpe2UubmF2aWdhdGVGaWxlRW5kKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixyZWFkT25seTohMCxzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIsYWNlQ29tbWFuZEdyb3VwOiJmaWxlSnVtcCJ9LHtuYW1lOiJzZWxlY3Rkb3duIixkZXNjcmlwdGlvbjoiU2VsZWN0IGRvd24iLGJpbmRLZXk6bygiU2hpZnQtRG93biIsIlNoaWZ0LURvd258Q3RybC1TaGlmdC1OIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdERvd24oKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ29saW5lZG93biIsZGVzY3JpcHRpb246IkdvIGxpbmUgZG93biIsYmluZEtleTpvKCJEb3duIiwiRG93bnxDdHJsLU4iKSxleGVjOmZ1bmN0aW9uKGUsdCl7ZS5uYXZpZ2F0ZURvd24odC50aW1lcyl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHdvcmRsZWZ0IixkZXNjcmlwdGlvbjoiU2VsZWN0IHdvcmQgbGVmdCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUxlZnQiLCJPcHRpb24tU2hpZnQtTGVmdCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RXb3JkTGVmdCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb3Rvd29yZGxlZnQiLGRlc2NyaXB0aW9uOiJHbyB0byB3b3JkIGxlZnQiLGJpbmRLZXk6bygiQ3RybC1MZWZ0IiwiT3B0aW9uLUxlZnQiKSxleGVjOmZ1bmN0aW9uKGUpe2UubmF2aWdhdGVXb3JkTGVmdCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b2xpbmVzdGFydCIsZGVzY3JpcHRpb246IlNlbGVjdCB0byBsaW5lIHN0YXJ0IixiaW5kS2V5Om8oIkFsdC1TaGlmdC1MZWZ0IiwiQ29tbWFuZC1TaGlmdC1MZWZ0fEN0cmwtU2hpZnQtQSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lU3RhcnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b2xpbmVzdGFydCIsZGVzY3JpcHRpb246IkdvIHRvIGxpbmUgc3RhcnQiLGJpbmRLZXk6bygiQWx0LUxlZnR8SG9tZSIsIkNvbW1hbmQtTGVmdHxIb21lfEN0cmwtQSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5uYXZpZ2F0ZUxpbmVTdGFydCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RsZWZ0IixkZXNjcmlwdGlvbjoiU2VsZWN0IGxlZnQiLGJpbmRLZXk6bygiU2hpZnQtTGVmdCIsIlNoaWZ0LUxlZnR8Q3RybC1TaGlmdC1CIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdExlZnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b2xlZnQiLGRlc2NyaXB0aW9uOiJHbyB0byBsZWZ0IixiaW5kS2V5Om8oIkxlZnQiLCJMZWZ0fEN0cmwtQiIpLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLm5hdmlnYXRlTGVmdCh0LnRpbWVzKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0d29yZHJpZ2h0IixkZXNjcmlwdGlvbjoiU2VsZWN0IHdvcmQgcmlnaHQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1SaWdodCIsIk9wdGlvbi1TaGlmdC1SaWdodCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RXb3JkUmlnaHQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3dvcmRyaWdodCIsZGVzY3JpcHRpb246IkdvIHRvIHdvcmQgcmlnaHQiLGJpbmRLZXk6bygiQ3RybC1SaWdodCIsIk9wdGlvbi1SaWdodCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5uYXZpZ2F0ZVdvcmRSaWdodCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b2xpbmVlbmQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgdG8gbGluZSBlbmQiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LVJpZ2h0IiwiQ29tbWFuZC1TaGlmdC1SaWdodHxTaGlmdC1FbmR8Q3RybC1TaGlmdC1FIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVFbmQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b2xpbmVlbmQiLGRlc2NyaXB0aW9uOiJHbyB0byBsaW5lIGVuZCIsYmluZEtleTpvKCJBbHQtUmlnaHR8RW5kIiwiQ29tbWFuZC1SaWdodHxFbmR8Q3RybC1FIiksZXhlYzpmdW5jdGlvbihlKXtlLm5hdmlnYXRlTGluZUVuZCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RyaWdodCIsZGVzY3JpcHRpb246IlNlbGVjdCByaWdodCIsYmluZEtleTpvKCJTaGlmdC1SaWdodCIsIlNoaWZ0LVJpZ2h0IiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdFJpZ2h0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvdG9yaWdodCIsZGVzY3JpcHRpb246IkdvIHRvIHJpZ2h0IixiaW5kS2V5Om8oIlJpZ2h0IiwiUmlnaHR8Q3RybC1GIiksZXhlYzpmdW5jdGlvbihlLHQpe2UubmF2aWdhdGVSaWdodCh0LnRpbWVzKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0cGFnZWRvd24iLGRlc2NyaXB0aW9uOiJTZWxlY3QgcGFnZSBkb3duIixiaW5kS2V5OiJTaGlmdC1QYWdlRG93biIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdFBhZ2VEb3duKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToicGFnZWRvd24iLGRlc2NyaXB0aW9uOiJQYWdlIGRvd24iLGJpbmRLZXk6byhudWxsLCJPcHRpb24tUGFnZURvd24iKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Nyb2xsUGFnZURvd24oKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvcGFnZWRvd24iLGRlc2NyaXB0aW9uOiJHbyB0byBwYWdlIGRvd24iLGJpbmRLZXk6bygiUGFnZURvd24iLCJQYWdlRG93bnxDdHJsLVYiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ290b1BhZ2VEb3duKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0cGFnZXVwIixkZXNjcmlwdGlvbjoiU2VsZWN0IHBhZ2UgdXAiLGJpbmRLZXk6IlNoaWZ0LVBhZ2VVcCIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdFBhZ2VVcCgpfSxyZWFkT25seTohMH0se25hbWU6InBhZ2V1cCIsZGVzY3JpcHRpb246IlBhZ2UgdXAiLGJpbmRLZXk6byhudWxsLCJPcHRpb24tUGFnZVVwIiksZXhlYzpmdW5jdGlvbihlKXtlLnNjcm9sbFBhZ2VVcCgpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9wYWdldXAiLGRlc2NyaXB0aW9uOiJHbyB0byBwYWdlIHVwIixiaW5kS2V5OiJQYWdlVXAiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nb3RvUGFnZVVwKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2Nyb2xsdXAiLGRlc2NyaXB0aW9uOiJTY3JvbGwgdXAiLGJpbmRLZXk6bygiQ3RybC1VcCIsbnVsbCksZXhlYzpmdW5jdGlvbihlKXtlLnJlbmRlcmVyLnNjcm9sbEJ5KDAsLTIqZS5yZW5kZXJlci5sYXllckNvbmZpZy5saW5lSGVpZ2h0KX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzY3JvbGxkb3duIixkZXNjcmlwdGlvbjoiU2Nyb2xsIGRvd24iLGJpbmRLZXk6bygiQ3RybC1Eb3duIixudWxsKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVuZGVyZXIuc2Nyb2xsQnkoMCwyKmUucmVuZGVyZXIubGF5ZXJDb25maWcubGluZUhlaWdodCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0bGluZXN0YXJ0IixkZXNjcmlwdGlvbjoiU2VsZWN0IGxpbmUgc3RhcnQiLGJpbmRLZXk6IlNoaWZ0LUhvbWUiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lU3RhcnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0bGluZWVuZCIsZGVzY3JpcHRpb246IlNlbGVjdCBsaW5lIGVuZCIsYmluZEtleToiU2hpZnQtRW5kIixleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZUVuZCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJ0b2dnbGVyZWNvcmRpbmciLGRlc2NyaXB0aW9uOiJUb2dnbGUgcmVjb3JkaW5nIixiaW5kS2V5Om8oIkN0cmwtQWx0LUUiLCJDb21tYW5kLU9wdGlvbi1FIiksZXhlYzpmdW5jdGlvbihlKXtlLmNvbW1hbmRzLnRvZ2dsZVJlY29yZGluZyhlKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJyZXBsYXltYWNybyIsZGVzY3JpcHRpb246IlJlcGxheSBtYWNybyIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUUiLCJDb21tYW5kLVNoaWZ0LUUiKSxleGVjOmZ1bmN0aW9uKGUpe2UuY29tbWFuZHMucmVwbGF5KGUpfSxyZWFkT25seTohMH0se25hbWU6Imp1bXB0b21hdGNoaW5nIixkZXNjcmlwdGlvbjoiSnVtcCB0byBtYXRjaGluZyIsYmluZEtleTpvKCJDdHJsLVxcfEN0cmwtUCIsIkNvbW1hbmQtXFwiKSxleGVjOmZ1bmN0aW9uKGUpe2UuanVtcFRvTWF0Y2hpbmcoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvbWF0Y2hpbmciLGRlc2NyaXB0aW9uOiJTZWxlY3QgdG8gbWF0Y2hpbmciLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1cXHxDdHJsLVNoaWZ0LVAiLCJDb21tYW5kLVNoaWZ0LVxcIiksZXhlYzpmdW5jdGlvbihlKXtlLmp1bXBUb01hdGNoaW5nKCEwKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixyZWFkT25seTohMH0se25hbWU6ImV4cGFuZFRvTWF0Y2hpbmciLGRlc2NyaXB0aW9uOiJFeHBhbmQgdG8gbWF0Y2hpbmciLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1NIiwiQ3RybC1TaGlmdC1NIiksZXhlYzpmdW5jdGlvbihlKXtlLmp1bXBUb01hdGNoaW5nKCEwLCEwKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixyZWFkT25seTohMH0se25hbWU6InBhc3NLZXlzVG9Ccm93c2VyIixkZXNjcmlwdGlvbjoiUGFzcyBrZXlzIHRvIGJyb3dzZXIiLGJpbmRLZXk6byhudWxsLG51bGwpLGV4ZWM6ZnVuY3Rpb24oKXt9LHBhc3NFdmVudDohMCxyZWFkT25seTohMH0se25hbWU6ImNvcHkiLGRlc2NyaXB0aW9uOiJDb3B5IixleGVjOmZ1bmN0aW9uKGUpe30scmVhZE9ubHk6ITB9LHtuYW1lOiJjdXQiLGRlc2NyaXB0aW9uOiJDdXQiLGV4ZWM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kY29weVdpdGhFbXB0eVNlbGVjdGlvbiYmZS5zZWxlY3Rpb24uaXNFbXB0eSgpLG49dD9lLnNlbGVjdGlvbi5nZXRMaW5lUmFuZ2UoKTplLnNlbGVjdGlvbi5nZXRSYW5nZSgpO2UuX2VtaXQoImN1dCIsbiksbi5pc0VtcHR5KCl8fGUuc2Vzc2lvbi5yZW1vdmUobiksZS5jbGVhclNlbGVjdGlvbigpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCJ9LHtuYW1lOiJwYXN0ZSIsZGVzY3JpcHRpb246IlBhc3RlIixleGVjOmZ1bmN0aW9uKGUsdCl7ZS4kaGFuZGxlUGFzdGUodCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3ZlbGluZSIsZGVzY3JpcHRpb246IlJlbW92ZSBsaW5lIixiaW5kS2V5Om8oIkN0cmwtRCIsIkNvbW1hbmQtRCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmVMaW5lcygpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaExpbmUifSx7bmFtZToiZHVwbGljYXRlU2VsZWN0aW9uIixkZXNjcmlwdGlvbjoiRHVwbGljYXRlIHNlbGVjdGlvbiIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUQiLCJDb21tYW5kLVNoaWZ0LUQiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZHVwbGljYXRlU2VsZWN0aW9uKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIn0se25hbWU6InNvcnRsaW5lcyIsZGVzY3JpcHRpb246IlNvcnQgbGluZXMiLGJpbmRLZXk6bygiQ3RybC1BbHQtUyIsIkNvbW1hbmQtQWx0LVMiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc29ydExpbmVzKCl9LHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb24iLG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoTGluZSJ9LHtuYW1lOiJ0b2dnbGVjb21tZW50IixkZXNjcmlwdGlvbjoiVG9nZ2xlIGNvbW1lbnQiLGJpbmRLZXk6bygiQ3RybC0vIiwiQ29tbWFuZC0vIiksZXhlYzpmdW5jdGlvbihlKXtlLnRvZ2dsZUNvbW1lbnRMaW5lcygpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaExpbmUiLHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb25QYXJ0In0se25hbWU6InRvZ2dsZUJsb2NrQ29tbWVudCIsZGVzY3JpcHRpb246IlRvZ2dsZSBibG9jayBjb21tZW50IixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtLyIsIkNvbW1hbmQtU2hpZnQtLyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS50b2dnbGVCbG9ja0NvbW1lbnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb25QYXJ0In0se25hbWU6Im1vZGlmeU51bWJlclVwIixkZXNjcmlwdGlvbjoiTW9kaWZ5IG51bWJlciB1cCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LVVwIiwiQWx0LVNoaWZ0LVVwIiksZXhlYzpmdW5jdGlvbihlKXtlLm1vZGlmeU51bWJlcigxKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIsbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2gifSx7bmFtZToibW9kaWZ5TnVtYmVyRG93biIsZGVzY3JpcHRpb246Ik1vZGlmeSBudW1iZXIgZG93biIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LURvd24iLCJBbHQtU2hpZnQtRG93biIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5tb2RpZnlOdW1iZXIoLTEpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCJ9LHtuYW1lOiJyZXBsYWNlIixkZXNjcmlwdGlvbjoiUmVwbGFjZSIsYmluZEtleTpvKCJDdHJsLUgiLCJDb21tYW5kLU9wdGlvbi1GIiksZXhlYzpmdW5jdGlvbihlKXtpLmxvYWRNb2R1bGUoImFjZS9leHQvc2VhcmNoYm94IixmdW5jdGlvbih0KXt0LlNlYXJjaChlLCEwKX0pfX0se25hbWU6InVuZG8iLGRlc2NyaXB0aW9uOiJVbmRvIixiaW5kS2V5Om8oIkN0cmwtWiIsIkNvbW1hbmQtWiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS51bmRvKCl9fSx7bmFtZToicmVkbyIsZGVzY3JpcHRpb246IlJlZG8iLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1afEN0cmwtWSIsIkNvbW1hbmQtU2hpZnQtWnxDb21tYW5kLVkiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVkbygpfX0se25hbWU6ImNvcHlsaW5lc3VwIixkZXNjcmlwdGlvbjoiQ29weSBsaW5lcyB1cCIsYmluZEtleTpvKCJBbHQtU2hpZnQtVXAiLCJDb21tYW5kLU9wdGlvbi1VcCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5jb3B5TGluZXNVcCgpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6Im1vdmVsaW5lc3VwIixkZXNjcmlwdGlvbjoiTW92ZSBsaW5lcyB1cCIsYmluZEtleTpvKCJBbHQtVXAiLCJPcHRpb24tVXAiKSxleGVjOmZ1bmN0aW9uKGUpe2UubW92ZUxpbmVzVXAoKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJjb3B5bGluZXNkb3duIixkZXNjcmlwdGlvbjoiQ29weSBsaW5lcyBkb3duIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1Eb3duIiwiQ29tbWFuZC1PcHRpb24tRG93biIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5jb3B5TGluZXNEb3duKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToibW92ZWxpbmVzZG93biIsZGVzY3JpcHRpb246Ik1vdmUgbGluZXMgZG93biIsYmluZEtleTpvKCJBbHQtRG93biIsIk9wdGlvbi1Eb3duIiksZXhlYzpmdW5jdGlvbihlKXtlLm1vdmVMaW5lc0Rvd24oKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJkZWwiLGRlc2NyaXB0aW9uOiJEZWxldGUiLGJpbmRLZXk6bygiRGVsZXRlIiwiRGVsZXRlfEN0cmwtRHxTaGlmdC1EZWxldGUiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlKCJyaWdodCIpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJiYWNrc3BhY2UiLGRlc2NyaXB0aW9uOiJCYWNrc3BhY2UiLGJpbmRLZXk6bygiU2hpZnQtQmFja3NwYWNlfEJhY2tzcGFjZSIsIkN0cmwtQmFja3NwYWNlfFNoaWZ0LUJhY2tzcGFjZXxCYWNrc3BhY2V8Q3RybC1IIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZSgibGVmdCIpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJjdXRfb3JfZGVsZXRlIixkZXNjcmlwdGlvbjoiQ3V0IG9yIGRlbGV0ZSIsYmluZEtleTpvKCJTaGlmdC1EZWxldGUiLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7aWYoIWUuc2VsZWN0aW9uLmlzRW1wdHkoKSlyZXR1cm4hMTtlLnJlbW92ZSgibGVmdCIpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmV0b2xpbmVzdGFydCIsZGVzY3JpcHRpb246IlJlbW92ZSB0byBsaW5lIHN0YXJ0IixiaW5kS2V5Om8oIkFsdC1CYWNrc3BhY2UiLCJDb21tYW5kLUJhY2tzcGFjZSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmVUb0xpbmVTdGFydCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmV0b2xpbmVlbmQiLGRlc2NyaXB0aW9uOiJSZW1vdmUgdG8gbGluZSBlbmQiLGJpbmRLZXk6bygiQWx0LURlbGV0ZSIsIkN0cmwtS3xDb21tYW5kLURlbGV0ZSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmVUb0xpbmVFbmQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3ZldG9saW5lc3RhcnRoYXJkIixkZXNjcmlwdGlvbjoiUmVtb3ZlIHRvIGxpbmUgc3RhcnQgaGFyZCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUJhY2tzcGFjZSIsbnVsbCksZXhlYzpmdW5jdGlvbihlKXt2YXIgdD1lLnNlbGVjdGlvbi5nZXRSYW5nZSgpO3Quc3RhcnQuY29sdW1uPTAsZS5zZXNzaW9uLnJlbW92ZSh0KX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3ZldG9saW5lZW5kaGFyZCIsZGVzY3JpcHRpb246IlJlbW92ZSB0byBsaW5lIGVuZCBoYXJkIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtRGVsZXRlIixudWxsKSxleGVjOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VsZWN0aW9uLmdldFJhbmdlKCk7dC5lbmQuY29sdW1uPU51bWJlci5NQVhfVkFMVUUsZS5zZXNzaW9uLnJlbW92ZSh0KX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3Zld29yZGxlZnQiLGRlc2NyaXB0aW9uOiJSZW1vdmUgd29yZCBsZWZ0IixiaW5kS2V5Om8oIkN0cmwtQmFja3NwYWNlIiwiQWx0LUJhY2tzcGFjZXxDdHJsLUFsdC1CYWNrc3BhY2UiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlV29yZExlZnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3Zld29yZHJpZ2h0IixkZXNjcmlwdGlvbjoiUmVtb3ZlIHdvcmQgcmlnaHQiLGJpbmRLZXk6bygiQ3RybC1EZWxldGUiLCJBbHQtRGVsZXRlIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZVdvcmRSaWdodCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJvdXRkZW50IixkZXNjcmlwdGlvbjoiT3V0ZGVudCIsYmluZEtleTpvKCJTaGlmdC1UYWIiLCJTaGlmdC1UYWIiKSxleGVjOmZ1bmN0aW9uKGUpe2UuYmxvY2tPdXRkZW50KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uUGFydCJ9LHtuYW1lOiJpbmRlbnQiLGRlc2NyaXB0aW9uOiJJbmRlbnQiLGJpbmRLZXk6bygiVGFiIiwiVGFiIiksZXhlYzpmdW5jdGlvbihlKXtlLmluZGVudCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvblBhcnQifSx7bmFtZToiYmxvY2tvdXRkZW50IixkZXNjcmlwdGlvbjoiQmxvY2sgb3V0ZGVudCIsYmluZEtleTpvKCJDdHJsLVsiLCJDdHJsLVsiKSxleGVjOmZ1bmN0aW9uKGUpe2UuYmxvY2tPdXRkZW50KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoTGluZSIsc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvblBhcnQifSx7bmFtZToiYmxvY2tpbmRlbnQiLGRlc2NyaXB0aW9uOiJCbG9jayBpbmRlbnQiLGJpbmRLZXk6bygiQ3RybC1dIiwiQ3RybC1dIiksZXhlYzpmdW5jdGlvbihlKXtlLmJsb2NrSW5kZW50KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoTGluZSIsc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvblBhcnQifSx7bmFtZToiaW5zZXJ0c3RyaW5nIixkZXNjcmlwdGlvbjoiSW5zZXJ0IHN0cmluZyIsZXhlYzpmdW5jdGlvbihlLHQpe2UuaW5zZXJ0KHQpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJpbnNlcnR0ZXh0IixkZXNjcmlwdGlvbjoiSW5zZXJ0IHRleHQiLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLmluc2VydChyLnN0cmluZ1JlcGVhdCh0LnRleHR8fCIiLHQudGltZXN8fDEpKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToic3BsaXRsaW5lIixkZXNjcmlwdGlvbjoiU3BsaXQgbGluZSIsYmluZEtleTpvKG51bGwsIkN0cmwtTyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zcGxpdExpbmUoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToidHJhbnNwb3NlbGV0dGVycyIsZGVzY3JpcHRpb246IlRyYW5zcG9zZSBsZXR0ZXJzIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1YIiwiQ3RybC1UIiksZXhlYzpmdW5jdGlvbihlKXtlLnRyYW5zcG9zZUxldHRlcnMoKX0sbXVsdGlTZWxlY3RBY3Rpb246ZnVuY3Rpb24oZSl7ZS50cmFuc3Bvc2VTZWxlY3Rpb25zKDEpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InRvdXBwZXJjYXNlIixkZXNjcmlwdGlvbjoiVG8gdXBwZXJjYXNlIixiaW5kS2V5Om8oIkN0cmwtVSIsIkN0cmwtVSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS50b1VwcGVyQ2FzZSgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJ0b2xvd2VyY2FzZSIsZGVzY3JpcHRpb246IlRvIGxvd2VyY2FzZSIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LVUiLCJDdHJsLVNoaWZ0LVUiKSxleGVjOmZ1bmN0aW9uKGUpe2UudG9Mb3dlckNhc2UoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiZXhwYW5kdG9saW5lIixkZXNjcmlwdGlvbjoiRXhwYW5kIHRvIGxpbmUiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1MIiwiQ29tbWFuZC1TaGlmdC1MIiksZXhlYzpmdW5jdGlvbihlKXt2YXIgdD1lLnNlbGVjdGlvbi5nZXRSYW5nZSgpO3Quc3RhcnQuY29sdW1uPXQuZW5kLmNvbHVtbj0wLHQuZW5kLnJvdysrLGUuc2VsZWN0aW9uLnNldFJhbmdlKHQsITEpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJqb2lubGluZXMiLGRlc2NyaXB0aW9uOiJKb2luIGxpbmVzIixiaW5kS2V5Om8obnVsbCxudWxsKSxleGVjOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VsZWN0aW9uLmlzQmFja3dhcmRzKCksbj10P2Uuc2VsZWN0aW9uLmdldFNlbGVjdGlvbkxlYWQoKTplLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb25BbmNob3IoKSxpPXQ/ZS5zZWxlY3Rpb24uZ2V0U2VsZWN0aW9uQW5jaG9yKCk6ZS5zZWxlY3Rpb24uZ2V0U2VsZWN0aW9uTGVhZCgpLG89ZS5zZXNzaW9uLmRvYy5nZXRMaW5lKG4ucm93KS5sZW5ndGgsdT1lLnNlc3Npb24uZG9jLmdldFRleHRSYW5nZShlLnNlbGVjdGlvbi5nZXRSYW5nZSgpKSxhPXUucmVwbGFjZSgvXG5ccyovLCIgIikubGVuZ3RoLGY9ZS5zZXNzaW9uLmRvYy5nZXRMaW5lKG4ucm93KTtmb3IodmFyIGw9bi5yb3crMTtsPD1pLnJvdysxO2wrKyl7dmFyIGM9ci5zdHJpbmdUcmltTGVmdChyLnN0cmluZ1RyaW1SaWdodChlLnNlc3Npb24uZG9jLmdldExpbmUobCkpKTtjLmxlbmd0aCE9PTAmJihjPSIgIitjKSxmKz1jfWkucm93KzE8ZS5zZXNzaW9uLmRvYy5nZXRMZW5ndGgoKS0xJiYoZis9ZS5zZXNzaW9uLmRvYy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpLGUuY2xlYXJTZWxlY3Rpb24oKSxlLnNlc3Npb24uZG9jLnJlcGxhY2UobmV3IHMobi5yb3csMCxpLnJvdysyLDApLGYpLGE+MD8oZS5zZWxlY3Rpb24ubW92ZUN1cnNvclRvKG4ucm93LG4uY29sdW1uKSxlLnNlbGVjdGlvbi5zZWxlY3RUbyhuLnJvdyxuLmNvbHVtbithKSk6KG89ZS5zZXNzaW9uLmRvYy5nZXRMaW5lKG4ucm93KS5sZW5ndGg+bz9vKzE6byxlLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8obi5yb3csbykpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIscmVhZE9ubHk6ITB9LHtuYW1lOiJpbnZlcnRTZWxlY3Rpb24iLGRlc2NyaXB0aW9uOiJJbnZlcnQgc2VsZWN0aW9uIixiaW5kS2V5Om8obnVsbCxudWxsKSxleGVjOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2Vzc2lvbi5kb2MuZ2V0TGVuZ3RoKCktMSxuPWUuc2Vzc2lvbi5kb2MuZ2V0TGluZSh0KS5sZW5ndGgscj1lLnNlbGVjdGlvbi5yYW5nZUxpc3QucmFuZ2VzLGk9W107ci5sZW5ndGg8MSYmKHI9W2Uuc2VsZWN0aW9uLmdldFJhbmdlKCldKTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylvPT1yLmxlbmd0aC0xJiYocltvXS5lbmQucm93IT09dHx8cltvXS5lbmQuY29sdW1uIT09bikmJmkucHVzaChuZXcgcyhyW29dLmVuZC5yb3cscltvXS5lbmQuY29sdW1uLHQsbikpLG89PT0wPyhyW29dLnN0YXJ0LnJvdyE9PTB8fHJbb10uc3RhcnQuY29sdW1uIT09MCkmJmkucHVzaChuZXcgcygwLDAscltvXS5zdGFydC5yb3cscltvXS5zdGFydC5jb2x1bW4pKTppLnB1c2gobmV3IHMocltvLTFdLmVuZC5yb3cscltvLTFdLmVuZC5jb2x1bW4scltvXS5zdGFydC5yb3cscltvXS5zdGFydC5jb2x1bW4pKTtlLmV4aXRNdWx0aVNlbGVjdE1vZGUoKSxlLmNsZWFyU2VsZWN0aW9uKCk7Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspZS5zZWxlY3Rpb24uYWRkUmFuZ2UoaVtvXSwhMSl9LHJlYWRPbmx5OiEwLHNjcm9sbEludG9WaWV3OiJub25lIn0se25hbWU6Im9wZW5Db21tYW5kUGFsbGV0ZSIsZGVzY3JpcHRpb246Ik9wZW4gY29tbWFuZCBwYWxsZXRlIixiaW5kS2V5Om8oIkYxIiwiRjEiKSxleGVjOmZ1bmN0aW9uKGUpe2UucHJvbXB0KHskdHlwZToiY29tbWFuZHMifSl9LHJlYWRPbmx5OiEwfSx7bmFtZToibW9kZVNlbGVjdCIsZGVzY3JpcHRpb246IkNoYW5nZSBsYW5ndWFnZSBtb2RlLi4uIixiaW5kS2V5Om8obnVsbCxudWxsKSxleGVjOmZ1bmN0aW9uKGUpe2UucHJvbXB0KHskdHlwZToibW9kZXMifSl9LHJlYWRPbmx5OiEwfV19KSxhY2UuZGVmaW5lKCJhY2UvZWRpdG9yIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9maXhvbGRicm93c2VycyIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL3VzZXJhZ2VudCIsImFjZS9rZXlib2FyZC90ZXh0aW5wdXQiLCJhY2UvbW91c2UvbW91c2VfaGFuZGxlciIsImFjZS9tb3VzZS9mb2xkX2hhbmRsZXIiLCJhY2Uva2V5Ym9hcmQva2V5YmluZGluZyIsImFjZS9lZGl0X3Nlc3Npb24iLCJhY2Uvc2VhcmNoIiwiYWNlL3JhbmdlIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL2NvbW1hbmRzL2NvbW1hbmRfbWFuYWdlciIsImFjZS9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzIiwiYWNlL2NvbmZpZyIsImFjZS90b2tlbl9pdGVyYXRvciIsImFjZS9jbGlwYm9hcmQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UoIi4vbGliL2ZpeG9sZGJyb3dzZXJzIik7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9kb20iKSxzPWUoIi4vbGliL2xhbmciKSxvPWUoIi4vbGliL3VzZXJhZ2VudCIpLHU9ZSgiLi9rZXlib2FyZC90ZXh0aW5wdXQiKS5UZXh0SW5wdXQsYT1lKCIuL21vdXNlL21vdXNlX2hhbmRsZXIiKS5Nb3VzZUhhbmRsZXIsZj1lKCIuL21vdXNlL2ZvbGRfaGFuZGxlciIpLkZvbGRIYW5kbGVyLGw9ZSgiLi9rZXlib2FyZC9rZXliaW5kaW5nIikuS2V5QmluZGluZyxjPWUoIi4vZWRpdF9zZXNzaW9uIikuRWRpdFNlc3Npb24saD1lKCIuL3NlYXJjaCIpLlNlYXJjaCxwPWUoIi4vcmFuZ2UiKS5SYW5nZSxkPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsdj1lKCIuL2NvbW1hbmRzL2NvbW1hbmRfbWFuYWdlciIpLkNvbW1hbmRNYW5hZ2VyLG09ZSgiLi9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzIikuY29tbWFuZHMsZz1lKCIuL2NvbmZpZyIpLHk9ZSgiLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3IsYj1lKCIuL2NsaXBib2FyZCIpLHc9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0Q29udGFpbmVyRWxlbWVudCgpO3RoaXMuY29udGFpbmVyPXIsdGhpcy5yZW5kZXJlcj1lLHRoaXMuaWQ9ImVkaXRvciIrICsrdy4kdWlkLHRoaXMuY29tbWFuZHM9bmV3IHYoby5pc01hYz8ibWFjIjoid2luIixtKSx0eXBlb2YgZG9jdW1lbnQ9PSJvYmplY3QiJiYodGhpcy50ZXh0SW5wdXQ9bmV3IHUoZS5nZXRUZXh0QXJlYUNvbnRhaW5lcigpLHRoaXMpLHRoaXMucmVuZGVyZXIudGV4dGFyZWE9dGhpcy50ZXh0SW5wdXQuZ2V0RWxlbWVudCgpLHRoaXMuJG1vdXNlSGFuZGxlcj1uZXcgYSh0aGlzKSxuZXcgZih0aGlzKSksdGhpcy5rZXlCaW5kaW5nPW5ldyBsKHRoaXMpLHRoaXMuJHNlYXJjaD0obmV3IGgpLnNldCh7d3JhcDohMH0pLHRoaXMuJGhpc3RvcnlUcmFja2VyPXRoaXMuJGhpc3RvcnlUcmFja2VyLmJpbmQodGhpcyksdGhpcy5jb21tYW5kcy5vbigiZXhlYyIsdGhpcy4kaGlzdG9yeVRyYWNrZXIpLHRoaXMuJGluaXRPcGVyYXRpb25MaXN0ZW5lcnMoKSx0aGlzLl8kZW1pdElucHV0RXZlbnQ9cy5kZWxheWVkQ2FsbChmdW5jdGlvbigpe3RoaXMuX3NpZ25hbCgiaW5wdXQiLHt9KSx0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi5iZ1Rva2VuaXplciYmdGhpcy5zZXNzaW9uLmJnVG9rZW5pemVyLnNjaGVkdWxlU3RhcnQoKX0uYmluZCh0aGlzKSksdGhpcy5vbigiY2hhbmdlIixmdW5jdGlvbihlLHQpe3QuXyRlbWl0SW5wdXRFdmVudC5zY2hlZHVsZSgzMSl9KSx0aGlzLnNldFNlc3Npb24odHx8biYmbi5zZXNzaW9ufHxuZXcgYygiIikpLGcucmVzZXRPcHRpb25zKHRoaXMpLG4mJnRoaXMuc2V0T3B0aW9ucyhuKSxnLl9zaWduYWwoImVkaXRvciIsdGhpcyl9O3cuJHVpZD0wLGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxkKSx0aGlzLiRpbml0T3BlcmF0aW9uTGlzdGVuZXJzPWZ1bmN0aW9uKCl7dGhpcy5jb21tYW5kcy5vbigiZXhlYyIsdGhpcy5zdGFydE9wZXJhdGlvbi5iaW5kKHRoaXMpLCEwKSx0aGlzLmNvbW1hbmRzLm9uKCJhZnRlckV4ZWMiLHRoaXMuZW5kT3BlcmF0aW9uLmJpbmQodGhpcyksITApLHRoaXMuJG9wUmVzZXRUaW1lcj1zLmRlbGF5ZWRDYWxsKHRoaXMuZW5kT3BlcmF0aW9uLmJpbmQodGhpcywhMCkpLHRoaXMub24oImNoYW5nZSIsZnVuY3Rpb24oKXt0aGlzLmN1ck9wfHwodGhpcy5zdGFydE9wZXJhdGlvbigpLHRoaXMuY3VyT3Auc2VsZWN0aW9uQmVmb3JlPXRoaXMuJGxhc3RTZWwpLHRoaXMuY3VyT3AuZG9jQ2hhbmdlZD0hMH0uYmluZCh0aGlzKSwhMCksdGhpcy5vbigiY2hhbmdlU2VsZWN0aW9uIixmdW5jdGlvbigpe3RoaXMuY3VyT3B8fCh0aGlzLnN0YXJ0T3BlcmF0aW9uKCksdGhpcy5jdXJPcC5zZWxlY3Rpb25CZWZvcmU9dGhpcy4kbGFzdFNlbCksdGhpcy5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkPSEwfS5iaW5kKHRoaXMpLCEwKX0sdGhpcy5jdXJPcD1udWxsLHRoaXMucHJldk9wPXt9LHRoaXMuc3RhcnRPcGVyYXRpb249ZnVuY3Rpb24oZSl7aWYodGhpcy5jdXJPcCl7aWYoIWV8fHRoaXMuY3VyT3AuY29tbWFuZClyZXR1cm47dGhpcy5wcmV2T3A9dGhpcy5jdXJPcH1lfHwodGhpcy5wcmV2aW91c0NvbW1hbmQ9bnVsbCxlPXt9KSx0aGlzLiRvcFJlc2V0VGltZXIuc2NoZWR1bGUoKSx0aGlzLmN1ck9wPXRoaXMuc2Vzc2lvbi5jdXJPcD17Y29tbWFuZDplLmNvbW1hbmR8fHt9LGFyZ3M6ZS5hcmdzLHNjcm9sbFRvcDp0aGlzLnJlbmRlcmVyLnNjcm9sbFRvcH0sdGhpcy5jdXJPcC5zZWxlY3Rpb25CZWZvcmU9dGhpcy5zZWxlY3Rpb24udG9KU09OKCl9LHRoaXMuZW5kT3BlcmF0aW9uPWZ1bmN0aW9uKGUpe2lmKHRoaXMuY3VyT3Ape2lmKGUmJmUucmV0dXJuVmFsdWU9PT0hMSlyZXR1cm4gdGhpcy5jdXJPcD1udWxsO2lmKGU9PTEmJnRoaXMuY3VyT3AuY29tbWFuZCYmdGhpcy5jdXJPcC5jb21tYW5kLm5hbWU9PSJtb3VzZSIpcmV0dXJuO3RoaXMuX3NpZ25hbCgiYmVmb3JlRW5kT3BlcmF0aW9uIik7aWYoIXRoaXMuY3VyT3ApcmV0dXJuO3ZhciB0PXRoaXMuY3VyT3AuY29tbWFuZCxuPXQmJnQuc2Nyb2xsSW50b1ZpZXc7aWYobil7c3dpdGNoKG4pe2Nhc2UiY2VudGVyLWFuaW1hdGUiOm49ImFuaW1hdGUiO2Nhc2UiY2VudGVyIjp0aGlzLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsLjUpO2JyZWFrO2Nhc2UiYW5pbWF0ZSI6Y2FzZSJjdXJzb3IiOnRoaXMucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKTticmVhaztjYXNlInNlbGVjdGlvblBhcnQiOnZhciByPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCksaT10aGlzLnJlbmRlcmVyLmxheWVyQ29uZmlnOyhyLnN0YXJ0LnJvdz49aS5sYXN0Um93fHxyLmVuZC5yb3c8PWkuZmlyc3RSb3cpJiZ0aGlzLnJlbmRlcmVyLnNjcm9sbFNlbGVjdGlvbkludG9WaWV3KHRoaXMuc2VsZWN0aW9uLmFuY2hvcix0aGlzLnNlbGVjdGlvbi5sZWFkKTticmVhaztkZWZhdWx0On1uPT0iYW5pbWF0ZSImJnRoaXMucmVuZGVyZXIuYW5pbWF0ZVNjcm9sbGluZyh0aGlzLmN1ck9wLnNjcm9sbFRvcCl9dmFyIHM9dGhpcy5zZWxlY3Rpb24udG9KU09OKCk7dGhpcy5jdXJPcC5zZWxlY3Rpb25BZnRlcj1zLHRoaXMuJGxhc3RTZWw9dGhpcy5zZWxlY3Rpb24udG9KU09OKCksdGhpcy5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCkuYWRkU2VsZWN0aW9uKHMpLHRoaXMucHJldk9wPXRoaXMuY3VyT3AsdGhpcy5jdXJPcD1udWxsfX0sdGhpcy4kbWVyZ2VhYmxlQ29tbWFuZHM9WyJiYWNrc3BhY2UiLCJkZWwiLCJpbnNlcnRzdHJpbmciXSx0aGlzLiRoaXN0b3J5VHJhY2tlcj1mdW5jdGlvbihlKXtpZighdGhpcy4kbWVyZ2VVbmRvRGVsdGFzKXJldHVybjt2YXIgdD10aGlzLnByZXZPcCxuPXRoaXMuJG1lcmdlYWJsZUNvbW1hbmRzLHI9dC5jb21tYW5kJiZlLmNvbW1hbmQubmFtZT09dC5jb21tYW5kLm5hbWU7aWYoZS5jb21tYW5kLm5hbWU9PSJpbnNlcnRzdHJpbmciKXt2YXIgaT1lLmFyZ3M7dGhpcy5tZXJnZU5leHRDb21tYW5kPT09dW5kZWZpbmVkJiYodGhpcy5tZXJnZU5leHRDb21tYW5kPSEwKSxyPXImJnRoaXMubWVyZ2VOZXh0Q29tbWFuZCYmKCEvXHMvLnRlc3QoaSl8fC9ccy8udGVzdCh0LmFyZ3MpKSx0aGlzLm1lcmdlTmV4dENvbW1hbmQ9ITB9ZWxzZSByPXImJm4uaW5kZXhPZihlLmNvbW1hbmQubmFtZSkhPT0tMTt0aGlzLiRtZXJnZVVuZG9EZWx0YXMhPSJhbHdheXMiJiZEYXRlLm5vdygpLXRoaXMuc2VxdWVuY2VTdGFydFRpbWU+MmUzJiYocj0hMSkscj90aGlzLnNlc3Npb24ubWVyZ2VVbmRvRGVsdGFzPSEwOm4uaW5kZXhPZihlLmNvbW1hbmQubmFtZSkhPT0tMSYmKHRoaXMuc2VxdWVuY2VTdGFydFRpbWU9RGF0ZS5ub3coKSl9LHRoaXMuc2V0S2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKGUsdCl7aWYoZSYmdHlwZW9mIGU9PSJzdHJpbmciJiZlIT0iYWNlIil7dGhpcy4ka2V5YmluZGluZ0lkPWU7dmFyIG49dGhpcztnLmxvYWRNb2R1bGUoWyJrZXliaW5kaW5nIixlXSxmdW5jdGlvbihyKXtuLiRrZXliaW5kaW5nSWQ9PWUmJm4ua2V5QmluZGluZy5zZXRLZXlib2FyZEhhbmRsZXIociYmci5oYW5kbGVyKSx0JiZ0KCl9KX1lbHNlIHRoaXMuJGtleWJpbmRpbmdJZD1udWxsLHRoaXMua2V5QmluZGluZy5zZXRLZXlib2FyZEhhbmRsZXIoZSksdCYmdCgpfSx0aGlzLmdldEtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmtleUJpbmRpbmcuZ2V0S2V5Ym9hcmRIYW5kbGVyKCl9LHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihlKXtpZih0aGlzLnNlc3Npb249PWUpcmV0dXJuO3RoaXMuY3VyT3AmJnRoaXMuZW5kT3BlcmF0aW9uKCksdGhpcy5jdXJPcD17fTt2YXIgdD10aGlzLnNlc3Npb247aWYodCl7dGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlIix0aGlzLiRvbkRvY3VtZW50Q2hhbmdlKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VNb2RlIix0aGlzLiRvbkNoYW5nZU1vZGUpLHRoaXMuc2Vzc2lvbi5vZmYoInRva2VuaXplclVwZGF0ZSIsdGhpcy4kb25Ub2tlbml6ZXJVcGRhdGUpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZVRhYlNpemUiLHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZSksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlV3JhcExpbWl0Iix0aGlzLiRvbkNoYW5nZVdyYXBMaW1pdCksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlV3JhcE1vZGUiLHRoaXMuJG9uQ2hhbmdlV3JhcE1vZGUpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZUZvbGQiLHRoaXMuJG9uQ2hhbmdlRm9sZCksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlRnJvbnRNYXJrZXIiLHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXIpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZUJhY2tNYXJrZXIiLHRoaXMuJG9uQ2hhbmdlQmFja01hcmtlciksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlQnJlYWtwb2ludCIsdGhpcy4kb25DaGFuZ2VCcmVha3BvaW50KSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VBbm5vdGF0aW9uIix0aGlzLiRvbkNoYW5nZUFubm90YXRpb24pLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZU92ZXJ3cml0ZSIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZVNjcm9sbFRvcCIsdGhpcy4kb25TY3JvbGxUb3BDaGFuZ2UpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZVNjcm9sbExlZnQiLHRoaXMuJG9uU2Nyb2xsTGVmdENoYW5nZSk7dmFyIG49dGhpcy5zZXNzaW9uLmdldFNlbGVjdGlvbigpO24ub2ZmKCJjaGFuZ2VDdXJzb3IiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKSxuLm9mZigiY2hhbmdlU2VsZWN0aW9uIix0aGlzLiRvblNlbGVjdGlvbkNoYW5nZSl9dGhpcy5zZXNzaW9uPWUsZT8odGhpcy4kb25Eb2N1bWVudENoYW5nZT10aGlzLm9uRG9jdW1lbnRDaGFuZ2UuYmluZCh0aGlzKSxlLm9uKCJjaGFuZ2UiLHRoaXMuJG9uRG9jdW1lbnRDaGFuZ2UpLHRoaXMucmVuZGVyZXIuc2V0U2Vzc2lvbihlKSx0aGlzLiRvbkNoYW5nZU1vZGU9dGhpcy5vbkNoYW5nZU1vZGUuYmluZCh0aGlzKSxlLm9uKCJjaGFuZ2VNb2RlIix0aGlzLiRvbkNoYW5nZU1vZGUpLHRoaXMuJG9uVG9rZW5pemVyVXBkYXRlPXRoaXMub25Ub2tlbml6ZXJVcGRhdGUuYmluZCh0aGlzKSxlLm9uKCJ0b2tlbml6ZXJVcGRhdGUiLHRoaXMuJG9uVG9rZW5pemVyVXBkYXRlKSx0aGlzLiRvbkNoYW5nZVRhYlNpemU9dGhpcy5yZW5kZXJlci5vbkNoYW5nZVRhYlNpemUuYmluZCh0aGlzLnJlbmRlcmVyKSxlLm9uKCJjaGFuZ2VUYWJTaXplIix0aGlzLiRvbkNoYW5nZVRhYlNpemUpLHRoaXMuJG9uQ2hhbmdlV3JhcExpbWl0PXRoaXMub25DaGFuZ2VXcmFwTGltaXQuYmluZCh0aGlzKSxlLm9uKCJjaGFuZ2VXcmFwTGltaXQiLHRoaXMuJG9uQ2hhbmdlV3JhcExpbWl0KSx0aGlzLiRvbkNoYW5nZVdyYXBNb2RlPXRoaXMub25DaGFuZ2VXcmFwTW9kZS5iaW5kKHRoaXMpLGUub24oImNoYW5nZVdyYXBNb2RlIix0aGlzLiRvbkNoYW5nZVdyYXBNb2RlKSx0aGlzLiRvbkNoYW5nZUZvbGQ9dGhpcy5vbkNoYW5nZUZvbGQuYmluZCh0aGlzKSxlLm9uKCJjaGFuZ2VGb2xkIix0aGlzLiRvbkNoYW5nZUZvbGQpLHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXI9dGhpcy5vbkNoYW5nZUZyb250TWFya2VyLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VGcm9udE1hcmtlciIsdGhpcy4kb25DaGFuZ2VGcm9udE1hcmtlciksdGhpcy4kb25DaGFuZ2VCYWNrTWFya2VyPXRoaXMub25DaGFuZ2VCYWNrTWFya2VyLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VCYWNrTWFya2VyIix0aGlzLiRvbkNoYW5nZUJhY2tNYXJrZXIpLHRoaXMuJG9uQ2hhbmdlQnJlYWtwb2ludD10aGlzLm9uQ2hhbmdlQnJlYWtwb2ludC5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlQnJlYWtwb2ludCIsdGhpcy4kb25DaGFuZ2VCcmVha3BvaW50KSx0aGlzLiRvbkNoYW5nZUFubm90YXRpb249dGhpcy5vbkNoYW5nZUFubm90YXRpb24uYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZUFubm90YXRpb24iLHRoaXMuJG9uQ2hhbmdlQW5ub3RhdGlvbiksdGhpcy4kb25DdXJzb3JDaGFuZ2U9dGhpcy5vbkN1cnNvckNoYW5nZS5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlT3ZlcndyaXRlIix0aGlzLiRvbkN1cnNvckNoYW5nZSksdGhpcy4kb25TY3JvbGxUb3BDaGFuZ2U9dGhpcy5vblNjcm9sbFRvcENoYW5nZS5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlU2Nyb2xsVG9wIix0aGlzLiRvblNjcm9sbFRvcENoYW5nZSksdGhpcy4kb25TY3JvbGxMZWZ0Q2hhbmdlPXRoaXMub25TY3JvbGxMZWZ0Q2hhbmdlLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VTY3JvbGxMZWZ0Iix0aGlzLiRvblNjcm9sbExlZnRDaGFuZ2UpLHRoaXMuc2VsZWN0aW9uPWUuZ2V0U2VsZWN0aW9uKCksdGhpcy5zZWxlY3Rpb24ub24oImNoYW5nZUN1cnNvciIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlPXRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlbGVjdGlvbi5vbigiY2hhbmdlU2VsZWN0aW9uIix0aGlzLiRvblNlbGVjdGlvbkNoYW5nZSksdGhpcy5vbkNoYW5nZU1vZGUoKSx0aGlzLm9uQ3Vyc29yQ2hhbmdlKCksdGhpcy5vblNjcm9sbFRvcENoYW5nZSgpLHRoaXMub25TY3JvbGxMZWZ0Q2hhbmdlKCksdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpLHRoaXMub25DaGFuZ2VGcm9udE1hcmtlcigpLHRoaXMub25DaGFuZ2VCYWNrTWFya2VyKCksdGhpcy5vbkNoYW5nZUJyZWFrcG9pbnQoKSx0aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbigpLHRoaXMuc2Vzc2lvbi5nZXRVc2VXcmFwTW9kZSgpJiZ0aGlzLnJlbmRlcmVyLmFkanVzdFdyYXBMaW1pdCgpLHRoaXMucmVuZGVyZXIudXBkYXRlRnVsbCgpKToodGhpcy5zZWxlY3Rpb249bnVsbCx0aGlzLnJlbmRlcmVyLnNldFNlc3Npb24oZSkpLHRoaXMuX3NpZ25hbCgiY2hhbmdlU2Vzc2lvbiIse3Nlc3Npb246ZSxvbGRTZXNzaW9uOnR9KSx0aGlzLmN1ck9wPW51bGwsdCYmdC5fc2lnbmFsKCJjaGFuZ2VFZGl0b3IiLHtvbGRFZGl0b3I6dGhpc30pLGUmJmUuX3NpZ25hbCgiY2hhbmdlRWRpdG9yIix7ZWRpdG9yOnRoaXN9KSxlJiZlLmJnVG9rZW5pemVyJiZlLmJnVG9rZW5pemVyLnNjaGVkdWxlU3RhcnQoKX0sdGhpcy5nZXRTZXNzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbn0sdGhpcy5zZXRWYWx1ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnNlc3Npb24uZG9jLnNldFZhbHVlKGUpLHQ/dD09MT90aGlzLm5hdmlnYXRlRmlsZUVuZCgpOnQ9PS0xJiZ0aGlzLm5hdmlnYXRlRmlsZVN0YXJ0KCk6dGhpcy5zZWxlY3RBbGwoKSxlfSx0aGlzLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRWYWx1ZSgpfSx0aGlzLmdldFNlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbn0sdGhpcy5yZXNpemU9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5vblJlc2l6ZShlKX0sdGhpcy5zZXRUaGVtZT1mdW5jdGlvbihlLHQpe3RoaXMucmVuZGVyZXIuc2V0VGhlbWUoZSx0KX0sdGhpcy5nZXRUaGVtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFRoZW1lKCl9LHRoaXMuc2V0U3R5bGU9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXRTdHlsZShlKX0sdGhpcy51bnNldFN0eWxlPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIudW5zZXRTdHlsZShlKX0sdGhpcy5nZXRGb250U2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiZm9udFNpemUiKXx8aS5jb21wdXRlZFN0eWxlKHRoaXMuY29udGFpbmVyKS5mb250U2l6ZX0sdGhpcy5zZXRGb250U2l6ZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiZm9udFNpemUiLGUpfSx0aGlzLiRoaWdobGlnaHRCcmFja2V0cz1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi4kYnJhY2tldEhpZ2hsaWdodCYmKHRoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIodGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0KSx0aGlzLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQ9bnVsbCk7aWYodGhpcy4kaGlnaGxpZ2h0UGVuZGluZylyZXR1cm47dmFyIGU9dGhpczt0aGlzLiRoaWdobGlnaHRQZW5kaW5nPSEwLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLiRoaWdobGlnaHRQZW5kaW5nPSExO3ZhciB0PWUuc2Vzc2lvbjtpZighdHx8IXQuYmdUb2tlbml6ZXIpcmV0dXJuO3ZhciBuPXQuZmluZE1hdGNoaW5nQnJhY2tldChlLmdldEN1cnNvclBvc2l0aW9uKCkpO2lmKG4pdmFyIHI9bmV3IHAobi5yb3csbi5jb2x1bW4sbi5yb3csbi5jb2x1bW4rMSk7ZWxzZSBpZih0LiRtb2RlLmdldE1hdGNoaW5nKXZhciByPXQuJG1vZGUuZ2V0TWF0Y2hpbmcoZS5zZXNzaW9uKTtyJiYodC4kYnJhY2tldEhpZ2hsaWdodD10LmFkZE1hcmtlcihyLCJhY2VfYnJhY2tldCIsInRleHQiKSl9LDUwKX0sdGhpcy4kaGlnaGxpZ2h0VGFncz1mdW5jdGlvbigpe2lmKHRoaXMuJGhpZ2hsaWdodFRhZ1BlbmRpbmcpcmV0dXJuO3ZhciBlPXRoaXM7dGhpcy4kaGlnaGxpZ2h0VGFnUGVuZGluZz0hMCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS4kaGlnaGxpZ2h0VGFnUGVuZGluZz0hMTt2YXIgdD1lLnNlc3Npb247aWYoIXR8fCF0LmJnVG9rZW5pemVyKXJldHVybjt2YXIgbj1lLmdldEN1cnNvclBvc2l0aW9uKCkscj1uZXcgeShlLnNlc3Npb24sbi5yb3csbi5jb2x1bW4pLGk9ci5nZXRDdXJyZW50VG9rZW4oKTtpZighaXx8IS9cYig/OnRhZy1vcGVufHRhZy1uYW1lKS8udGVzdChpLnR5cGUpKXt0LnJlbW92ZU1hcmtlcih0LiR0YWdIaWdobGlnaHQpLHQuJHRhZ0hpZ2hsaWdodD1udWxsO3JldHVybn1pZihpLnR5cGUuaW5kZXhPZigidGFnLW9wZW4iKSE9LTEpe2k9ci5zdGVwRm9yd2FyZCgpO2lmKCFpKXJldHVybn12YXIgcz1pLnZhbHVlLG89MCx1PXIuc3RlcEJhY2t3YXJkKCk7aWYodS52YWx1ZT09IjwiKXtkbyB1PWksaT1yLnN0ZXBGb3J3YXJkKCksaSYmaS52YWx1ZT09PXMmJmkudHlwZS5pbmRleE9mKCJ0YWctbmFtZSIpIT09LTEmJih1LnZhbHVlPT09IjwiP28rKzp1LnZhbHVlPT09IjwvIiYmby0tKTt3aGlsZShpJiZvPj0wKX1lbHNle2RvIGk9dSx1PXIuc3RlcEJhY2t3YXJkKCksaSYmaS52YWx1ZT09PXMmJmkudHlwZS5pbmRleE9mKCJ0YWctbmFtZSIpIT09LTEmJih1LnZhbHVlPT09IjwiP28rKzp1LnZhbHVlPT09IjwvIiYmby0tKTt3aGlsZSh1JiZvPD0wKTtyLnN0ZXBGb3J3YXJkKCl9aWYoIWkpe3QucmVtb3ZlTWFya2VyKHQuJHRhZ0hpZ2hsaWdodCksdC4kdGFnSGlnaGxpZ2h0PW51bGw7cmV0dXJufXZhciBhPXIuZ2V0Q3VycmVudFRva2VuUm93KCksZj1yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpLGw9bmV3IHAoYSxmLGEsZitpLnZhbHVlLmxlbmd0aCksYz10LiRiYWNrTWFya2Vyc1t0LiR0YWdIaWdobGlnaHRdO3QuJHRhZ0hpZ2hsaWdodCYmYyE9dW5kZWZpbmVkJiZsLmNvbXBhcmVSYW5nZShjLnJhbmdlKSE9PTAmJih0LnJlbW92ZU1hcmtlcih0LiR0YWdIaWdobGlnaHQpLHQuJHRhZ0hpZ2hsaWdodD1udWxsKSx0LiR0YWdIaWdobGlnaHR8fCh0LiR0YWdIaWdobGlnaHQ9dC5hZGRNYXJrZXIobCwiYWNlX2JyYWNrZXQiLCJ0ZXh0IikpfSw1MCl9LHRoaXMuZm9jdXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlzRm9jdXNlZCgpfHxlLnRleHRJbnB1dC5mb2N1cygpfSksdGhpcy50ZXh0SW5wdXQuZm9jdXMoKX0sdGhpcy5pc0ZvY3VzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0SW5wdXQuaXNGb2N1c2VkKCl9LHRoaXMuYmx1cj1mdW5jdGlvbigpe3RoaXMudGV4dElucHV0LmJsdXIoKX0sdGhpcy5vbkZvY3VzPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJGlzRm9jdXNlZClyZXR1cm47dGhpcy4kaXNGb2N1c2VkPSEwLHRoaXMucmVuZGVyZXIuc2hvd0N1cnNvcigpLHRoaXMucmVuZGVyZXIudmlzdWFsaXplRm9jdXMoKSx0aGlzLl9lbWl0KCJmb2N1cyIsZSl9LHRoaXMub25CbHVyPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRpc0ZvY3VzZWQpcmV0dXJuO3RoaXMuJGlzRm9jdXNlZD0hMSx0aGlzLnJlbmRlcmVyLmhpZGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnZpc3VhbGl6ZUJsdXIoKSx0aGlzLl9lbWl0KCJibHVyIixlKX0sdGhpcy4kY3Vyc29yQ2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKX0sdGhpcy5vbkRvY3VtZW50Q2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbi4kdXNlV3JhcE1vZGUsbj1lLnN0YXJ0LnJvdz09ZS5lbmQucm93P2UuZW5kLnJvdzpJbmZpbml0eTt0aGlzLnJlbmRlcmVyLnVwZGF0ZUxpbmVzKGUuc3RhcnQucm93LG4sdCksdGhpcy5fc2lnbmFsKCJjaGFuZ2UiLGUpLHRoaXMuJGN1cnNvckNoYW5nZSgpLHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKX0sdGhpcy5vblRva2VuaXplclVwZGF0ZT1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7dGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyh0LmZpcnN0LHQubGFzdCl9LHRoaXMub25TY3JvbGxUb3BDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvWSh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkpfSx0aGlzLm9uU2Nyb2xsTGVmdENoYW5nZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9YKHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCkpfSx0aGlzLm9uQ3Vyc29yQ2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy4kY3Vyc29yQ2hhbmdlKCksdGhpcy4kaGlnaGxpZ2h0QnJhY2tldHMoKSx0aGlzLiRoaWdobGlnaHRUYWdzKCksdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpLHRoaXMuX3NpZ25hbCgiY2hhbmdlU2VsZWN0aW9uIil9LHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFNlc3Npb24oKSx0O2lmKHRoaXMuJGhpZ2hsaWdodEFjdGl2ZUxpbmUpe2lmKHRoaXMuJHNlbGVjdGlvblN0eWxlIT0ibGluZSJ8fCF0aGlzLnNlbGVjdGlvbi5pc011bHRpTGluZSgpKXQ9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpO3RoaXMucmVuZGVyZXIudGhlbWUmJnRoaXMucmVuZGVyZXIudGhlbWUuJHNlbGVjdGlvbkNvbG9yQ29uZmxpY3QmJiF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJih0PSExKSx0aGlzLnJlbmRlcmVyLiRtYXhMaW5lcyYmdGhpcy5zZXNzaW9uLmdldExlbmd0aCgpPT09MSYmISh0aGlzLnJlbmRlcmVyLiRtaW5MaW5lcz4xKSYmKHQ9ITEpfWlmKGUuJGhpZ2hsaWdodExpbmVNYXJrZXImJiF0KWUucmVtb3ZlTWFya2VyKGUuJGhpZ2hsaWdodExpbmVNYXJrZXIuaWQpLGUuJGhpZ2hsaWdodExpbmVNYXJrZXI9bnVsbDtlbHNlIGlmKCFlLiRoaWdobGlnaHRMaW5lTWFya2VyJiZ0KXt2YXIgbj1uZXcgcCh0LnJvdyx0LmNvbHVtbix0LnJvdyxJbmZpbml0eSk7bi5pZD1lLmFkZE1hcmtlcihuLCJhY2VfYWN0aXZlLWxpbmUiLCJzY3JlZW5MaW5lIiksZS4kaGlnaGxpZ2h0TGluZU1hcmtlcj1ufWVsc2UgdCYmKGUuJGhpZ2hsaWdodExpbmVNYXJrZXIuc3RhcnQucm93PXQucm93LGUuJGhpZ2hsaWdodExpbmVNYXJrZXIuZW5kLnJvdz10LnJvdyxlLiRoaWdobGlnaHRMaW5lTWFya2VyLnN0YXJ0LmNvbHVtbj10LmNvbHVtbixlLl9zaWduYWwoImNoYW5nZUJhY2tNYXJrZXIiKSl9LHRoaXMub25TZWxlY3Rpb25DaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uO3QuJHNlbGVjdGlvbk1hcmtlciYmdC5yZW1vdmVNYXJrZXIodC4kc2VsZWN0aW9uTWFya2VyKSx0LiRzZWxlY3Rpb25NYXJrZXI9bnVsbDtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXt2YXIgbj10aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpLHI9dGhpcy5nZXRTZWxlY3Rpb25TdHlsZSgpO3QuJHNlbGVjdGlvbk1hcmtlcj10LmFkZE1hcmtlcihuLCJhY2Vfc2VsZWN0aW9uIixyKX1lbHNlIHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKTt2YXIgaT10aGlzLiRoaWdobGlnaHRTZWxlY3RlZFdvcmQmJnRoaXMuJGdldFNlbGVjdGlvbkhpZ2hMaWdodFJlZ2V4cCgpO3RoaXMuc2Vzc2lvbi5oaWdobGlnaHQoaSksdGhpcy5fc2lnbmFsKCJjaGFuZ2VTZWxlY3Rpb24iKX0sdGhpcy4kZ2V0U2VsZWN0aW9uSGlnaExpZ2h0UmVnZXhwPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO2lmKHQuaXNFbXB0eSgpfHx0LmlzTXVsdGlMaW5lKCkpcmV0dXJuO3ZhciBuPXQuc3RhcnQuY29sdW1uLHI9dC5lbmQuY29sdW1uLGk9ZS5nZXRMaW5lKHQuc3RhcnQucm93KSxzPWkuc3Vic3RyaW5nKG4scik7aWYocy5sZW5ndGg+NWUzfHwhL1tcd1xkXS8udGVzdChzKSlyZXR1cm47dmFyIG89dGhpcy4kc2VhcmNoLiRhc3NlbWJsZVJlZ0V4cCh7d2hvbGVXb3JkOiEwLGNhc2VTZW5zaXRpdmU6ITAsbmVlZGxlOnN9KSx1PWkuc3Vic3RyaW5nKG4tMSxyKzEpO2lmKCFvLnRlc3QodSkpcmV0dXJuO3JldHVybiBvfSx0aGlzLm9uQ2hhbmdlRnJvbnRNYXJrZXI9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZUZyb250TWFya2VycygpfSx0aGlzLm9uQ2hhbmdlQmFja01hcmtlcj1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKX0sdGhpcy5vbkNoYW5nZUJyZWFrcG9pbnQ9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZUJyZWFrcG9pbnRzKCl9LHRoaXMub25DaGFuZ2VBbm5vdGF0aW9uPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5zZXRBbm5vdGF0aW9ucyh0aGlzLnNlc3Npb24uZ2V0QW5ub3RhdGlvbnMoKSl9LHRoaXMub25DaGFuZ2VNb2RlPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIudXBkYXRlVGV4dCgpLHRoaXMuX2VtaXQoImNoYW5nZU1vZGUiLGUpfSx0aGlzLm9uQ2hhbmdlV3JhcExpbWl0PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCl9LHRoaXMub25DaGFuZ2VXcmFwTW9kZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIub25SZXNpemUoITApfSx0aGlzLm9uQ2hhbmdlRm9sZD1mdW5jdGlvbigpe3RoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKX0sdGhpcy5nZXRTZWxlY3RlZFRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpfSx0aGlzLmdldENvcHlUZXh0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTZWxlY3RlZFRleHQoKSx0PXRoaXMuc2Vzc2lvbi5kb2MuZ2V0TmV3TGluZUNoYXJhY3RlcigpLG49ITE7aWYoIWUmJnRoaXMuJGNvcHlXaXRoRW1wdHlTZWxlY3Rpb24pe249ITA7dmFyIHI9dGhpcy5zZWxlY3Rpb24uZ2V0QWxsUmFuZ2VzKCk7Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBzPXJbaV07aWYoaSYmcltpLTFdLnN0YXJ0LnJvdz09cy5zdGFydC5yb3cpY29udGludWU7ZSs9dGhpcy5zZXNzaW9uLmdldExpbmUocy5zdGFydC5yb3cpK3R9fXZhciBvPXt0ZXh0OmV9O3JldHVybiB0aGlzLl9zaWduYWwoImNvcHkiLG8pLGIubGluZU1vZGU9bj9vLnRleHQ6IiIsby50ZXh0fSx0aGlzLm9uQ29weT1mdW5jdGlvbigpe3RoaXMuY29tbWFuZHMuZXhlYygiY29weSIsdGhpcyl9LHRoaXMub25DdXQ9ZnVuY3Rpb24oKXt0aGlzLmNvbW1hbmRzLmV4ZWMoImN1dCIsdGhpcyl9LHRoaXMub25QYXN0ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXt0ZXh0OmUsZXZlbnQ6dH07dGhpcy5jb21tYW5kcy5leGVjKCJwYXN0ZSIsdGhpcyxuKX0sdGhpcy4kaGFuZGxlUGFzdGU9ZnVuY3Rpb24oZSl7dHlwZW9mIGU9PSJzdHJpbmciJiYoZT17dGV4dDplfSksdGhpcy5fc2lnbmFsKCJwYXN0ZSIsZSk7dmFyIHQ9ZS50ZXh0LG49dD09Yi5saW5lTW9kZSxyPXRoaXMuc2Vzc2lvbjtpZighdGhpcy5pbk11bHRpU2VsZWN0TW9kZXx8dGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlKW4/ci5pbnNlcnQoe3Jvdzp0aGlzLnNlbGVjdGlvbi5sZWFkLnJvdyxjb2x1bW46MH0sdCk6dGhpcy5pbnNlcnQodCk7ZWxzZSBpZihuKXRoaXMuc2VsZWN0aW9uLnJhbmdlTGlzdC5yYW5nZXMuZm9yRWFjaChmdW5jdGlvbihlKXtyLmluc2VydCh7cm93OmUuc3RhcnQucm93LGNvbHVtbjowfSx0KX0pO2Vsc2V7dmFyIGk9dC5zcGxpdCgvXHJcbnxccnxcbi8pLHM9dGhpcy5zZWxlY3Rpb24ucmFuZ2VMaXN0LnJhbmdlcyxvPWkubGVuZ3RoPT0yJiYoIWlbMF18fCFpWzFdKTtpZihpLmxlbmd0aCE9cy5sZW5ndGh8fG8pcmV0dXJuIHRoaXMuY29tbWFuZHMuZXhlYygiaW5zZXJ0c3RyaW5nIix0aGlzLHQpO2Zvcih2YXIgdT1zLmxlbmd0aDt1LS07KXt2YXIgYT1zW3VdO2EuaXNFbXB0eSgpfHxyLnJlbW92ZShhKSxyLmluc2VydChhLnN0YXJ0LGlbdV0pfX19LHRoaXMuZXhlY0NvbW1hbmQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5jb21tYW5kcy5leGVjKGUsdGhpcyx0KX0sdGhpcy5pbnNlcnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNlc3Npb24scj1uLmdldE1vZGUoKSxpPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKTtpZih0aGlzLmdldEJlaGF2aW91cnNFbmFibGVkKCkmJiF0KXt2YXIgcz1yLnRyYW5zZm9ybUFjdGlvbihuLmdldFN0YXRlKGkucm93KSwiaW5zZXJ0aW9uIix0aGlzLG4sZSk7cyYmKGUhPT1zLnRleHQmJih0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGV8fCh0aGlzLnNlc3Npb24ubWVyZ2VVbmRvRGVsdGFzPSExLHRoaXMubWVyZ2VOZXh0Q29tbWFuZD0hMSkpLGU9cy50ZXh0KX1lPT0iCSImJihlPXRoaXMuc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7aWYoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSl7dmFyIG89dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO2k9dGhpcy5zZXNzaW9uLnJlbW92ZShvKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9ZWxzZSBpZih0aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCkmJmUuaW5kZXhPZigiXG4iKT09LTEpe3ZhciBvPW5ldyBwLmZyb21Qb2ludHMoaSxpKTtvLmVuZC5jb2x1bW4rPWUubGVuZ3RoLHRoaXMuc2Vzc2lvbi5yZW1vdmUobyl9aWYoZT09IlxuInx8ZT09IlxyXG4iKXt2YXIgdT1uLmdldExpbmUoaS5yb3cpO2lmKGkuY29sdW1uPnUuc2VhcmNoKC9cU3wkLykpe3ZhciBhPXUuc3Vic3RyKGkuY29sdW1uKS5zZWFyY2goL1xTfCQvKTtuLmRvYy5yZW1vdmVJbkxpbmUoaS5yb3csaS5jb2x1bW4saS5jb2x1bW4rYSl9fXRoaXMuY2xlYXJTZWxlY3Rpb24oKTt2YXIgZj1pLmNvbHVtbixsPW4uZ2V0U3RhdGUoaS5yb3cpLHU9bi5nZXRMaW5lKGkucm93KSxjPXIuY2hlY2tPdXRkZW50KGwsdSxlKTtuLmluc2VydChpLGUpLHMmJnMuc2VsZWN0aW9uJiYocy5zZWxlY3Rpb24ubGVuZ3RoPT0yP3RoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKG5ldyBwKGkucm93LGYrcy5zZWxlY3Rpb25bMF0saS5yb3csZitzLnNlbGVjdGlvblsxXSkpOnRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKG5ldyBwKGkucm93K3Muc2VsZWN0aW9uWzBdLHMuc2VsZWN0aW9uWzFdLGkucm93K3Muc2VsZWN0aW9uWzJdLHMuc2VsZWN0aW9uWzNdKSkpO2lmKG4uZ2V0RG9jdW1lbnQoKS5pc05ld0xpbmUoZSkpe3ZhciBoPXIuZ2V0TmV4dExpbmVJbmRlbnQobCx1LnNsaWNlKDAsaS5jb2x1bW4pLG4uZ2V0VGFiU3RyaW5nKCkpO24uaW5zZXJ0KHtyb3c6aS5yb3crMSxjb2x1bW46MH0saCl9YyYmci5hdXRvT3V0ZGVudChsLG4saS5yb3cpfSx0aGlzLm9uVGV4dElucHV0PWZ1bmN0aW9uKGUsdCl7aWYoIXQpcmV0dXJuIHRoaXMua2V5QmluZGluZy5vblRleHRJbnB1dChlKTt0aGlzLnN0YXJ0T3BlcmF0aW9uKHtjb21tYW5kOntuYW1lOiJpbnNlcnRzdHJpbmcifX0pO3ZhciBuPXRoaXMuYXBwbHlDb21wb3NpdGlvbi5iaW5kKHRoaXMsZSx0KTt0aGlzLnNlbGVjdGlvbi5yYW5nZUNvdW50P3RoaXMuZm9yRWFjaFNlbGVjdGlvbihuKTpuKCksdGhpcy5lbmRPcGVyYXRpb24oKX0sdGhpcy5hcHBseUNvbXBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7aWYodC5leHRlbmRMZWZ0fHx0LmV4dGVuZFJpZ2h0KXt2YXIgbj10aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpO24uc3RhcnQuY29sdW1uLT10LmV4dGVuZExlZnQsbi5lbmQuY29sdW1uKz10LmV4dGVuZFJpZ2h0LHRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKG4pLCFlJiYhbi5pc0VtcHR5KCkmJnRoaXMucmVtb3ZlKCl9KGV8fCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpJiZ0aGlzLmluc2VydChlLCEwKTtpZih0LnJlc3RvcmVTdGFydHx8dC5yZXN0b3JlRW5kKXt2YXIgbj10aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpO24uc3RhcnQuY29sdW1uLT10LnJlc3RvcmVTdGFydCxuLmVuZC5jb2x1bW4tPXQucmVzdG9yZUVuZCx0aGlzLnNlbGVjdGlvbi5zZXRSYW5nZShuKX19LHRoaXMub25Db21tYW5kS2V5PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5rZXlCaW5kaW5nLm9uQ29tbWFuZEtleShlLHQsbil9LHRoaXMuc2V0T3ZlcndyaXRlPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbi5zZXRPdmVyd3JpdGUoZSl9LHRoaXMuZ2V0T3ZlcndyaXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKX0sdGhpcy50b2dnbGVPdmVyd3JpdGU9ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24udG9nZ2xlT3ZlcndyaXRlKCl9LHRoaXMuc2V0U2Nyb2xsU3BlZWQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInNjcm9sbFNwZWVkIixlKX0sdGhpcy5nZXRTY3JvbGxTcGVlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigic2Nyb2xsU3BlZWQiKX0sdGhpcy5zZXREcmFnRGVsYXk9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImRyYWdEZWxheSIsZSl9LHRoaXMuZ2V0RHJhZ0RlbGF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJkcmFnRGVsYXkiKX0sdGhpcy5zZXRTZWxlY3Rpb25TdHlsZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigic2VsZWN0aW9uU3R5bGUiLGUpfSx0aGlzLmdldFNlbGVjdGlvblN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJzZWxlY3Rpb25TdHlsZSIpfSx0aGlzLnNldEhpZ2hsaWdodEFjdGl2ZUxpbmU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImhpZ2hsaWdodEFjdGl2ZUxpbmUiLGUpfSx0aGlzLmdldEhpZ2hsaWdodEFjdGl2ZUxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImhpZ2hsaWdodEFjdGl2ZUxpbmUiKX0sdGhpcy5zZXRIaWdobGlnaHRHdXR0ZXJMaW5lPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJoaWdobGlnaHRHdXR0ZXJMaW5lIixlKX0sdGhpcy5nZXRIaWdobGlnaHRHdXR0ZXJMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJoaWdobGlnaHRHdXR0ZXJMaW5lIil9LHRoaXMuc2V0SGlnaGxpZ2h0U2VsZWN0ZWRXb3JkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJoaWdobGlnaHRTZWxlY3RlZFdvcmQiLGUpfSx0aGlzLmdldEhpZ2hsaWdodFNlbGVjdGVkV29yZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRoaWdobGlnaHRTZWxlY3RlZFdvcmR9LHRoaXMuc2V0QW5pbWF0ZWRTY3JvbGw9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXRBbmltYXRlZFNjcm9sbChlKX0sdGhpcy5nZXRBbmltYXRlZFNjcm9sbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldEFuaW1hdGVkU2Nyb2xsKCl9LHRoaXMuc2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXRTaG93SW52aXNpYmxlcyhlKX0sdGhpcy5nZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFNob3dJbnZpc2libGVzKCl9LHRoaXMuc2V0RGlzcGxheUluZGVudEd1aWRlcz1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldERpc3BsYXlJbmRlbnRHdWlkZXMoZSl9LHRoaXMuZ2V0RGlzcGxheUluZGVudEd1aWRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldERpc3BsYXlJbmRlbnRHdWlkZXMoKX0sdGhpcy5zZXRTaG93UHJpbnRNYXJnaW49ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXRTaG93UHJpbnRNYXJnaW4oZSl9LHRoaXMuZ2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2hvd1ByaW50TWFyZ2luKCl9LHRoaXMuc2V0UHJpbnRNYXJnaW5Db2x1bW49ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXRQcmludE1hcmdpbkNvbHVtbihlKX0sdGhpcy5nZXRQcmludE1hcmdpbkNvbHVtbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFByaW50TWFyZ2luQ29sdW1uKCl9LHRoaXMuc2V0UmVhZE9ubHk9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInJlYWRPbmx5IixlKX0sdGhpcy5nZXRSZWFkT25seT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigicmVhZE9ubHkiKX0sdGhpcy5zZXRCZWhhdmlvdXJzRW5hYmxlZD1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiYmVoYXZpb3Vyc0VuYWJsZWQiLGUpfSx0aGlzLmdldEJlaGF2aW91cnNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJiZWhhdmlvdXJzRW5hYmxlZCIpfSx0aGlzLnNldFdyYXBCZWhhdmlvdXJzRW5hYmxlZD1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigid3JhcEJlaGF2aW91cnNFbmFibGVkIixlKX0sdGhpcy5nZXRXcmFwQmVoYXZpb3Vyc0VuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oIndyYXBCZWhhdmlvdXJzRW5hYmxlZCIpfSx0aGlzLnNldFNob3dGb2xkV2lkZ2V0cz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigic2hvd0ZvbGRXaWRnZXRzIixlKX0sdGhpcy5nZXRTaG93Rm9sZFdpZGdldHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInNob3dGb2xkV2lkZ2V0cyIpfSx0aGlzLnNldEZhZGVGb2xkV2lkZ2V0cz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiZmFkZUZvbGRXaWRnZXRzIixlKX0sdGhpcy5nZXRGYWRlRm9sZFdpZGdldHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImZhZGVGb2xkV2lkZ2V0cyIpfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihlKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJihlPT0ibGVmdCI/dGhpcy5zZWxlY3Rpb24uc2VsZWN0TGVmdCgpOnRoaXMuc2VsZWN0aW9uLnNlbGVjdFJpZ2h0KCkpO3ZhciB0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpZih0aGlzLmdldEJlaGF2aW91cnNFbmFibGVkKCkpe3ZhciBuPXRoaXMuc2Vzc2lvbixyPW4uZ2V0U3RhdGUodC5zdGFydC5yb3cpLGk9bi5nZXRNb2RlKCkudHJhbnNmb3JtQWN0aW9uKHIsImRlbGV0aW9uIix0aGlzLG4sdCk7aWYodC5lbmQuY29sdW1uPT09MCl7dmFyIHM9bi5nZXRUZXh0UmFuZ2UodCk7aWYoc1tzLmxlbmd0aC0xXT09IlxuIil7dmFyIG89bi5nZXRMaW5lKHQuZW5kLnJvdyk7L15ccyskLy50ZXN0KG8pJiYodC5lbmQuY29sdW1uPW8ubGVuZ3RoKX19aSYmKHQ9aSl9dGhpcy5zZXNzaW9uLnJlbW92ZSh0KSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVtb3ZlV29yZFJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkUmlnaHQoKSx0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlbW92ZVdvcmRMZWZ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkTGVmdCgpLHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVtb3ZlVG9MaW5lU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdExpbmVTdGFydCgpLHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0TGVmdCgpLHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVtb3ZlVG9MaW5lRW5kPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RMaW5lRW5kKCk7dmFyIGU9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO2Uuc3RhcnQuY29sdW1uPT1lLmVuZC5jb2x1bW4mJmUuc3RhcnQucm93PT1lLmVuZC5yb3cmJihlLmVuZC5jb2x1bW49MCxlLmVuZC5yb3crKyksdGhpcy5zZXNzaW9uLnJlbW92ZShlKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMuc3BsaXRMaW5lPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpfHwodGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKSk7dmFyIGU9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpO3RoaXMuaW5zZXJ0KCJcbiIpLHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oZSl9LHRoaXMudHJhbnNwb3NlTGV0dGVycz1mdW5jdGlvbigpe2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpcmV0dXJuO3ZhciBlPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSx0PWUuY29sdW1uO2lmKHQ9PT0wKXJldHVybjt2YXIgbj10aGlzLnNlc3Npb24uZ2V0TGluZShlLnJvdykscixpO3Q8bi5sZW5ndGg/KHI9bi5jaGFyQXQodCkrbi5jaGFyQXQodC0xKSxpPW5ldyBwKGUucm93LHQtMSxlLnJvdyx0KzEpKToocj1uLmNoYXJBdCh0LTEpK24uY2hhckF0KHQtMiksaT1uZXcgcChlLnJvdyx0LTIsZS5yb3csdCkpLHRoaXMuc2Vzc2lvbi5yZXBsYWNlKGksciksdGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihpLmVuZCl9LHRoaXMudG9Mb3dlckNhc2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk7dmFyIHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLG49dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0KTt0aGlzLnNlc3Npb24ucmVwbGFjZSh0LG4udG9Mb3dlckNhc2UoKSksdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoZSl9LHRoaXMudG9VcHBlckNhc2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk7dmFyIHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLG49dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0KTt0aGlzLnNlc3Npb24ucmVwbGFjZSh0LG4udG9VcHBlckNhc2UoKSksdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoZSl9LHRoaXMuaW5kZW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO2lmKHQuc3RhcnQucm93PHQuZW5kLnJvdyl7dmFyIG49dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7ZS5pbmRlbnRSb3dzKG4uZmlyc3Qsbi5sYXN0LCIJIik7cmV0dXJufWlmKHQuc3RhcnQuY29sdW1uPHQuZW5kLmNvbHVtbil7dmFyIHI9ZS5nZXRUZXh0UmFuZ2UodCk7aWYoIS9eXHMrJC8udGVzdChyKSl7dmFyIG49dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7ZS5pbmRlbnRSb3dzKG4uZmlyc3Qsbi5sYXN0LCIJIik7cmV0dXJufX12YXIgaT1lLmdldExpbmUodC5zdGFydC5yb3cpLG89dC5zdGFydCx1PWUuZ2V0VGFiU2l6ZSgpLGE9ZS5kb2N1bWVudFRvU2NyZWVuQ29sdW1uKG8ucm93LG8uY29sdW1uKTtpZih0aGlzLnNlc3Npb24uZ2V0VXNlU29mdFRhYnMoKSl2YXIgZj11LWEldSxsPXMuc3RyaW5nUmVwZWF0KCIgIixmKTtlbHNle3ZhciBmPWEldTt3aGlsZShpW3Quc3RhcnQuY29sdW1uLTFdPT0iICImJmYpdC5zdGFydC5jb2x1bW4tLSxmLS07dGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UodCksbD0iCSJ9cmV0dXJuIHRoaXMuaW5zZXJ0KGwpfSx0aGlzLmJsb2NrSW5kZW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7dGhpcy5zZXNzaW9uLmluZGVudFJvd3MoZS5maXJzdCxlLmxhc3QsIgkiKX0sdGhpcy5ibG9ja091dGRlbnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24uZ2V0U2VsZWN0aW9uKCk7dGhpcy5zZXNzaW9uLm91dGRlbnRSb3dzKGUuZ2V0UmFuZ2UoKSl9LHRoaXMuc29ydExpbmVzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCksdD10aGlzLnNlc3Npb24sbj1bXTtmb3IodmFyIHI9ZS5maXJzdDtyPD1lLmxhc3Q7cisrKW4ucHVzaCh0LmdldExpbmUocikpO24uc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLnRvTG93ZXJDYXNlKCk8dC50b0xvd2VyQ2FzZSgpPy0xOmUudG9Mb3dlckNhc2UoKT50LnRvTG93ZXJDYXNlKCk/MTowfSk7dmFyIGk9bmV3IHAoMCwwLDAsMCk7Zm9yKHZhciByPWUuZmlyc3Q7cjw9ZS5sYXN0O3IrKyl7dmFyIHM9dC5nZXRMaW5lKHIpO2kuc3RhcnQucm93PXIsaS5lbmQucm93PXIsaS5lbmQuY29sdW1uPXMubGVuZ3RoLHQucmVwbGFjZShpLG5bci1lLmZpcnN0XSl9fSx0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRTdGF0ZSh0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkucm93KSx0PXRoaXMuJGdldFNlbGVjdGVkUm93cygpO3RoaXMuc2Vzc2lvbi5nZXRNb2RlKCkudG9nZ2xlQ29tbWVudExpbmVzKGUsdGhpcy5zZXNzaW9uLHQuZmlyc3QsdC5sYXN0KX0sdGhpcy50b2dnbGVCbG9ja0NvbW1lbnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEN1cnNvclBvc2l0aW9uKCksdD10aGlzLnNlc3Npb24uZ2V0U3RhdGUoZS5yb3cpLG49dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO3RoaXMuc2Vzc2lvbi5nZXRNb2RlKCkudG9nZ2xlQmxvY2tDb21tZW50KHQsdGhpcy5zZXNzaW9uLG4sZSl9LHRoaXMuZ2V0TnVtYmVyQXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj0vW1wtXT9bMC05XSsoPzpcLlswLTldKyk/L2c7bi5sYXN0SW5kZXg9MDt2YXIgcj10aGlzLnNlc3Npb24uZ2V0TGluZShlKTt3aGlsZShuLmxhc3RJbmRleDx0KXt2YXIgaT1uLmV4ZWMocik7aWYoaS5pbmRleDw9dCYmaS5pbmRleCtpWzBdLmxlbmd0aD49dCl7dmFyIHM9e3ZhbHVlOmlbMF0sc3RhcnQ6aS5pbmRleCxlbmQ6aS5pbmRleCtpWzBdLmxlbmd0aH07cmV0dXJuIHN9fXJldHVybiBudWxsfSx0aGlzLm1vZGlmeU51bWJlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKS5yb3csbj10aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKS5jb2x1bW4scj1uZXcgcCh0LG4tMSx0LG4pLGk9dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShyKTtpZighaXNOYU4ocGFyc2VGbG9hdChpKSkmJmlzRmluaXRlKGkpKXt2YXIgcz10aGlzLmdldE51bWJlckF0KHQsbik7aWYocyl7dmFyIG89cy52YWx1ZS5pbmRleE9mKCIuIik+PTA/cy5zdGFydCtzLnZhbHVlLmluZGV4T2YoIi4iKSsxOnMuZW5kLHU9cy5zdGFydCtzLnZhbHVlLmxlbmd0aC1vLGE9cGFyc2VGbG9hdChzLnZhbHVlKTthKj1NYXRoLnBvdygxMCx1KSxvIT09cy5lbmQmJm48bz9lKj1NYXRoLnBvdygxMCxzLmVuZC1uLTEpOmUqPU1hdGgucG93KDEwLHMuZW5kLW4pLGErPWUsYS89TWF0aC5wb3coMTAsdSk7dmFyIGY9YS50b0ZpeGVkKHUpLGw9bmV3IHAodCxzLnN0YXJ0LHQscy5lbmQpO3RoaXMuc2Vzc2lvbi5yZXBsYWNlKGwsZiksdGhpcy5tb3ZlQ3Vyc29yVG8odCxNYXRoLm1heChzLnN0YXJ0KzEsbitmLmxlbmd0aC1zLnZhbHVlLmxlbmd0aCkpfX1lbHNlIHRoaXMudG9nZ2xlV29yZCgpfSx0aGlzLiR0b2dnbGVXb3JkUGFpcnM9W1siZmlyc3QiLCJsYXN0Il0sWyJ0cnVlIiwiZmFsc2UiXSxbInllcyIsIm5vIl0sWyJ3aWR0aCIsImhlaWdodCJdLFsidG9wIiwiYm90dG9tIl0sWyJyaWdodCIsImxlZnQiXSxbIm9uIiwib2ZmIl0sWyJ4IiwieSJdLFsiZ2V0Iiwic2V0Il0sWyJtYXgiLCJtaW4iXSxbImhvcml6b250YWwiLCJ2ZXJ0aWNhbCJdLFsic2hvdyIsImhpZGUiXSxbImFkZCIsInJlbW92ZSJdLFsidXAiLCJkb3duIl0sWyJiZWZvcmUiLCJhZnRlciJdLFsiZXZlbiIsIm9kZCJdLFsiaW5zaWRlIiwib3V0c2lkZSJdLFsibmV4dCIsInByZXZpb3VzIl0sWyJpbmNyZWFzZSIsImRlY3JlYXNlIl0sWyJhdHRhY2giLCJkZXRhY2giXSxbIiYmIiwifHwiXSxbIj09IiwiIT0iXV0sdGhpcy50b2dnbGVXb3JkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkucm93LHQ9dGhpcy5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkuY29sdW1uO3RoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTt2YXIgbj10aGlzLmdldFNlbGVjdGVkVGV4dCgpLHI9dGhpcy5zZWxlY3Rpb24uZ2V0V29yZFJhbmdlKCkuc3RhcnQuY29sdW1uLGk9bi5yZXBsYWNlKC8oW2Etel0rfFtBLVpdKykoPz1bQS1aX118JCkvZywiJDEgIikuc3BsaXQoL1xzLyksbz10LXItMTtvPDAmJihvPTApO3ZhciB1PTAsYT0wLGY9dGhpcztuLm1hdGNoKC9bQS1aYS16MC05X10rLykmJmkuZm9yRWFjaChmdW5jdGlvbih0LGkpe2E9dSt0Lmxlbmd0aCxvPj11JiZvPD1hJiYobj10LGYuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCksZi5tb3ZlQ3Vyc29yVG8oZSx1K3IpLGYuc2VsZWN0aW9uLnNlbGVjdFRvKGUsYStyKSksdT1hfSk7dmFyIGw9dGhpcy4kdG9nZ2xlV29yZFBhaXJzLGM7Zm9yKHZhciBoPTA7aDxsLmxlbmd0aDtoKyspe3ZhciBwPWxbaF07Zm9yKHZhciBkPTA7ZDw9MTtkKyspe3ZhciB2PSshZCxtPW4ubWF0Y2gobmV3IFJlZ0V4cCgiXlxccz9fPygiK3MuZXNjYXBlUmVnRXhwKHBbZF0pKyIpXFxzPyQiLCJpIikpO2lmKG0pe3ZhciBnPW4ubWF0Y2gobmV3IFJlZ0V4cCgiKFtfXXxefFxccykoIitzLmVzY2FwZVJlZ0V4cChtWzFdKSsiKSgkfFxccykiLCJnIikpO2cmJihjPW4ucmVwbGFjZShuZXcgUmVnRXhwKHMuZXNjYXBlUmVnRXhwKHBbZF0pLCJpIiksZnVuY3Rpb24oZSl7dmFyIHQ9cFt2XTtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpPT1lP3Q9dC50b1VwcGVyQ2FzZSgpOmUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCk9PWUuY2hhckF0KDApJiYodD10LnN1YnN0cigwLDApK3Bbdl0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSkpLHR9KSx0aGlzLmluc2VydChjKSxjPSIiKX19fX0sdGhpcy5yZW1vdmVMaW5lcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJGdldFNlbGVjdGVkUm93cygpO3RoaXMuc2Vzc2lvbi5yZW1vdmVGdWxsTGluZXMoZS5maXJzdCxlLmxhc3QpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5kdXBsaWNhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlbGVjdGlvbix0PXRoaXMuc2Vzc2lvbixuPWUuZ2V0UmFuZ2UoKSxyPWUuaXNCYWNrd2FyZHMoKTtpZihuLmlzRW1wdHkoKSl7dmFyIGk9bi5zdGFydC5yb3c7dC5kdXBsaWNhdGVMaW5lcyhpLGkpfWVsc2V7dmFyIHM9cj9uLnN0YXJ0Om4uZW5kLG89dC5pbnNlcnQocyx0LmdldFRleHRSYW5nZShuKSwhMSk7bi5zdGFydD1zLG4uZW5kPW8sZS5zZXRTZWxlY3Rpb25SYW5nZShuLHIpfX0sdGhpcy5tb3ZlTGluZXNEb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUxpbmVzKDEsITEpfSx0aGlzLm1vdmVMaW5lc1VwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUxpbmVzKC0xLCExKX0sdGhpcy5tb3ZlVGV4dD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuc2Vzc2lvbi5tb3ZlVGV4dChlLHQsbil9LHRoaXMuY29weUxpbmVzVXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlTGluZXMoLTEsITApfSx0aGlzLmNvcHlMaW5lc0Rvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlTGluZXMoMSwhMCl9LHRoaXMuJG1vdmVMaW5lcz1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaT10aGlzLnNlbGVjdGlvbjtpZighaS5pbk11bHRpU2VsZWN0TW9kZXx8dGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlKXt2YXIgcz1pLnRvT3JpZW50ZWRSYW5nZSgpO249dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKHMpLHI9dGhpcy5zZXNzaW9uLiRtb3ZlTGluZXMobi5maXJzdCxuLmxhc3QsdD8wOmUpLHQmJmU9PS0xJiYocj0wKSxzLm1vdmVCeShyLDApLGkuZnJvbU9yaWVudGVkUmFuZ2Uocyl9ZWxzZXt2YXIgbz1pLnJhbmdlTGlzdC5yYW5nZXM7aS5yYW5nZUxpc3QuZGV0YWNoKHRoaXMuc2Vzc2lvbiksdGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSEwO3ZhciB1PTAsYT0wLGY9by5sZW5ndGg7Zm9yKHZhciBsPTA7bDxmO2wrKyl7dmFyIGM9bDtvW2xdLm1vdmVCeSh1LDApLG49dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKG9bbF0pO3ZhciBoPW4uZmlyc3QscD1uLmxhc3Q7d2hpbGUoKytsPGYpe2EmJm9bbF0ubW92ZUJ5KGEsMCk7dmFyIGQ9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKG9bbF0pO2lmKHQmJmQuZmlyc3QhPXApYnJlYWs7aWYoIXQmJmQuZmlyc3Q+cCsxKWJyZWFrO3A9ZC5sYXN0fWwtLSx1PXRoaXMuc2Vzc2lvbi4kbW92ZUxpbmVzKGgscCx0PzA6ZSksdCYmZT09LTEmJihjPWwrMSk7d2hpbGUoYzw9bClvW2NdLm1vdmVCeSh1LDApLGMrKzt0fHwodT0wKSxhKz11fWkuZnJvbU9yaWVudGVkUmFuZ2UoaS5yYW5nZXNbMF0pLGkucmFuZ2VMaXN0LmF0dGFjaCh0aGlzLnNlc3Npb24pLHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMX19LHRoaXMuJGdldFNlbGVjdGVkUm93cz1mdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKS5jb2xsYXBzZVJvd3MoKSx7Zmlyc3Q6dGhpcy5zZXNzaW9uLmdldFJvd0ZvbGRTdGFydChlLnN0YXJ0LnJvdyksbGFzdDp0aGlzLnNlc3Npb24uZ2V0Um93Rm9sZEVuZChlLmVuZC5yb3cpfX0sdGhpcy5vbkNvbXBvc2l0aW9uU3RhcnQ9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zaG93Q29tcG9zaXRpb24oZSl9LHRoaXMub25Db21wb3NpdGlvblVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldENvbXBvc2l0aW9uVGV4dChlKX0sdGhpcy5vbkNvbXBvc2l0aW9uRW5kPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5oaWRlQ29tcG9zaXRpb24oKX0sdGhpcy5nZXRGaXJzdFZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRGaXJzdFZpc2libGVSb3coKX0sdGhpcy5nZXRMYXN0VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldExhc3RWaXNpYmxlUm93KCl9LHRoaXMuaXNSb3dWaXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiBlPj10aGlzLmdldEZpcnN0VmlzaWJsZVJvdygpJiZlPD10aGlzLmdldExhc3RWaXNpYmxlUm93KCl9LHRoaXMuaXNSb3dGdWxseVZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PXRoaXMucmVuZGVyZXIuZ2V0Rmlyc3RGdWxseVZpc2libGVSb3coKSYmZTw9dGhpcy5yZW5kZXJlci5nZXRMYXN0RnVsbHlWaXNpYmxlUm93KCl9LHRoaXMuJGdldFZpc2libGVSb3dDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFNjcm9sbEJvdHRvbVJvdygpLXRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsVG9wUm93KCkrMX0sdGhpcy4kbW92ZUJ5UGFnZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMucmVuZGVyZXIscj10aGlzLnJlbmRlcmVyLmxheWVyQ29uZmlnLGk9ZSpNYXRoLmZsb29yKHIuaGVpZ2h0L3IubGluZUhlaWdodCk7dD09PSEwP3RoaXMuc2VsZWN0aW9uLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yQnkoaSwwKX0pOnQ9PT0hMSYmKHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JCeShpLDApLHRoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCkpO3ZhciBzPW4uc2Nyb2xsVG9wO24uc2Nyb2xsQnkoMCxpKnIubGluZUhlaWdodCksdCE9bnVsbCYmbi5zY3JvbGxDdXJzb3JJbnRvVmlldyhudWxsLC41KSxuLmFuaW1hdGVTY3JvbGxpbmcocyl9LHRoaXMuc2VsZWN0UGFnZURvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlQnlQYWdlKDEsITApfSx0aGlzLnNlbGVjdFBhZ2VVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVCeVBhZ2UoLTEsITApfSx0aGlzLmdvdG9QYWdlRG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVCeVBhZ2UoMSwhMSl9LHRoaXMuZ290b1BhZ2VVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVCeVBhZ2UoLTEsITEpfSx0aGlzLnNjcm9sbFBhZ2VEb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUJ5UGFnZSgxKX0sdGhpcy5zY3JvbGxQYWdlVXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlQnlQYWdlKC0xKX0sdGhpcy5zY3JvbGxUb1Jvdz1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvUm93KGUpfSx0aGlzLnNjcm9sbFRvTGluZT1mdW5jdGlvbihlLHQsbixyKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvTGluZShlLHQsbixyKX0sdGhpcy5jZW50ZXJTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCksdD17cm93Ok1hdGguZmxvb3IoZS5zdGFydC5yb3crKGUuZW5kLnJvdy1lLnN0YXJ0LnJvdykvMiksY29sdW1uOk1hdGguZmxvb3IoZS5zdGFydC5jb2x1bW4rKGUuZW5kLmNvbHVtbi1lLnN0YXJ0LmNvbHVtbikvMil9O3RoaXMucmVuZGVyZXIuYWxpZ25DdXJzb3IodCwuNSl9LHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCl9LHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb25TY3JlZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkpfSx0aGlzLmdldFNlbGVjdGlvblJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCl9LHRoaXMuc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uc2VsZWN0QWxsKCl9LHRoaXMuY2xlYXJTZWxlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm1vdmVDdXJzb3JUbz1mdW5jdGlvbihlLHQpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JUbyhlLHQpfSx0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uPWZ1bmN0aW9uKGUpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGUpfSx0aGlzLmp1bXBUb01hdGNoaW5nPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLHI9bmV3IHkodGhpcy5zZXNzaW9uLG4ucm93LG4uY29sdW1uKSxpPXIuZ2V0Q3VycmVudFRva2VuKCkscz1pfHxyLnN0ZXBGb3J3YXJkKCk7aWYoIXMpcmV0dXJuO3ZhciBvLHU9ITEsYT17fSxmPW4uY29sdW1uLXMuc3RhcnQsbCxjPXsiKSI6IigiLCIoIjoiKCIsIl0iOiJbIiwiWyI6IlsiLCJ7IjoieyIsIn0iOiJ7In07ZG97aWYocy52YWx1ZS5tYXRjaCgvW3t9KClcW1xdXS9nKSlmb3IoO2Y8cy52YWx1ZS5sZW5ndGgmJiF1O2YrKyl7aWYoIWNbcy52YWx1ZVtmXV0pY29udGludWU7bD1jW3MudmFsdWVbZl1dKyIuIitzLnR5cGUucmVwbGFjZSgicnBhcmVuIiwibHBhcmVuIiksaXNOYU4oYVtsXSkmJihhW2xdPTApO3N3aXRjaChzLnZhbHVlW2ZdKXtjYXNlIigiOmNhc2UiWyI6Y2FzZSJ7IjphW2xdKys7YnJlYWs7Y2FzZSIpIjpjYXNlIl0iOmNhc2UifSI6YVtsXS0tLGFbbF09PT0tMSYmKG89ImJyYWNrZXQiLHU9ITApfX1lbHNlIHMudHlwZS5pbmRleE9mKCJ0YWctbmFtZSIpIT09LTEmJihpc05hTihhW3MudmFsdWVdKSYmKGFbcy52YWx1ZV09MCksaS52YWx1ZT09PSI8Ij9hW3MudmFsdWVdKys6aS52YWx1ZT09PSI8LyImJmFbcy52YWx1ZV0tLSxhW3MudmFsdWVdPT09LTEmJihvPSJ0YWciLHU9ITApKTt1fHwoaT1zLHM9ci5zdGVwRm9yd2FyZCgpLGY9MCl9d2hpbGUocyYmIXUpO2lmKCFvKXJldHVybjt2YXIgaCxkO2lmKG89PT0iYnJhY2tldCIpe2g9dGhpcy5zZXNzaW9uLmdldEJyYWNrZXRSYW5nZShuKTtpZighaCl7aD1uZXcgcChyLmdldEN1cnJlbnRUb2tlblJvdygpLHIuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrZi0xLHIuZ2V0Q3VycmVudFRva2VuUm93KCksci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKStmLTEpLGQ9aC5zdGFydDtpZih0fHxkLnJvdz09PW4ucm93JiZNYXRoLmFicyhkLmNvbHVtbi1uLmNvbHVtbik8MiloPXRoaXMuc2Vzc2lvbi5nZXRCcmFja2V0UmFuZ2UoZCl9fWVsc2UgaWYobz09PSJ0YWciKXtpZighc3x8cy50eXBlLmluZGV4T2YoInRhZy1uYW1lIik9PT0tMSlyZXR1cm47dmFyIHY9cy52YWx1ZTtoPW5ldyBwKHIuZ2V0Q3VycmVudFRva2VuUm93KCksci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKS0yLHIuZ2V0Q3VycmVudFRva2VuUm93KCksci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKS0yKTtpZihoLmNvbXBhcmUobi5yb3csbi5jb2x1bW4pPT09MCl7dT0hMTtkbyBzPWksaT1yLnN0ZXBCYWNrd2FyZCgpLGkmJihpLnR5cGUuaW5kZXhPZigidGFnLWNsb3NlIikhPT0tMSYmaC5zZXRFbmQoci5nZXRDdXJyZW50VG9rZW5Sb3coKSxyLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpKzEpLHMudmFsdWU9PT12JiZzLnR5cGUuaW5kZXhPZigidGFnLW5hbWUiKSE9PS0xJiYoaS52YWx1ZT09PSI8Ij9hW3ZdKys6aS52YWx1ZT09PSI8LyImJmFbdl0tLSxhW3ZdPT09MCYmKHU9ITApKSk7d2hpbGUoaSYmIXUpfXMmJnMudHlwZS5pbmRleE9mKCJ0YWctbmFtZSIpJiYoZD1oLnN0YXJ0LGQucm93PT1uLnJvdyYmTWF0aC5hYnMoZC5jb2x1bW4tbi5jb2x1bW4pPDImJihkPWguZW5kKSl9ZD1oJiZoLmN1cnNvcnx8ZCxkJiYoZT9oJiZ0P3RoaXMuc2VsZWN0aW9uLnNldFJhbmdlKGgpOmgmJmguaXNFcXVhbCh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpP3RoaXMuY2xlYXJTZWxlY3Rpb24oKTp0aGlzLnNlbGVjdGlvbi5zZWxlY3RUbyhkLnJvdyxkLmNvbHVtbik6dGhpcy5zZWxlY3Rpb24ubW92ZVRvKGQucm93LGQuY29sdW1uKSl9LHRoaXMuZ290b0xpbmU9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5zZXNzaW9uLnVuZm9sZCh7cm93OmUtMSxjb2x1bW46dHx8MH0pLHRoaXMuZXhpdE11bHRpU2VsZWN0TW9kZSYmdGhpcy5leGl0TXVsdGlTZWxlY3RNb2RlKCksdGhpcy5tb3ZlQ3Vyc29yVG8oZS0xLHR8fDApLHRoaXMuaXNSb3dGdWxseVZpc2libGUoZS0xKXx8dGhpcy5zY3JvbGxUb0xpbmUoZS0xLCEwLG4pfSx0aGlzLm5hdmlnYXRlVG89ZnVuY3Rpb24oZSx0KXt0aGlzLnNlbGVjdGlvbi5tb3ZlVG8oZSx0KX0sdGhpcy5uYXZpZ2F0ZVVwPWZ1bmN0aW9uKGUpe2lmKHRoaXMuc2VsZWN0aW9uLmlzTXVsdGlMaW5lKCkmJiF0aGlzLnNlbGVjdGlvbi5pc0JhY2t3YXJkcygpKXt2YXIgdD10aGlzLnNlbGVjdGlvbi5hbmNob3IuZ2V0UG9zaXRpb24oKTtyZXR1cm4gdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbih0KX10aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpLHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JCeSgtZXx8LTEsMCl9LHRoaXMubmF2aWdhdGVEb3duPWZ1bmN0aW9uKGUpe2lmKHRoaXMuc2VsZWN0aW9uLmlzTXVsdGlMaW5lKCkmJnRoaXMuc2VsZWN0aW9uLmlzQmFja3dhcmRzKCkpe3ZhciB0PXRoaXMuc2VsZWN0aW9uLmFuY2hvci5nZXRQb3NpdGlvbigpO3JldHVybiB0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHQpfXRoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckJ5KGV8fDEsMCl9LHRoaXMubmF2aWdhdGVMZWZ0PWZ1bmN0aW9uKGUpe2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpe3ZhciB0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKS5zdGFydDt0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHQpfWVsc2V7ZT1lfHwxO3doaWxlKGUtLSl0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yTGVmdCgpfXRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZVJpZ2h0PWZ1bmN0aW9uKGUpe2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpe3ZhciB0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKS5lbmQ7dGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbih0KX1lbHNle2U9ZXx8MTt3aGlsZShlLS0pdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclJpZ2h0KCl9dGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlTGluZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckxpbmVTdGFydCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZUxpbmVFbmQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yTGluZUVuZCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZUZpbGVFbmQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yRmlsZUVuZCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZUZpbGVTdGFydD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JGaWxlU3RhcnQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yV29yZFJpZ2h0KCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlV29yZExlZnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yV29yZExlZnQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVwbGFjZT1mdW5jdGlvbihlLHQpe3QmJnRoaXMuJHNlYXJjaC5zZXQodCk7dmFyIG49dGhpcy4kc2VhcmNoLmZpbmQodGhpcy5zZXNzaW9uKSxyPTA7cmV0dXJuIG4/KHRoaXMuJHRyeVJlcGxhY2UobixlKSYmKHI9MSksdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UobiksdGhpcy5yZW5kZXJlci5zY3JvbGxTZWxlY3Rpb25JbnRvVmlldyhuLnN0YXJ0LG4uZW5kKSxyKTpyfSx0aGlzLnJlcGxhY2VBbGw9ZnVuY3Rpb24oZSx0KXt0JiZ0aGlzLiRzZWFyY2guc2V0KHQpO3ZhciBuPXRoaXMuJHNlYXJjaC5maW5kQWxsKHRoaXMuc2Vzc2lvbikscj0wO2lmKCFuLmxlbmd0aClyZXR1cm4gcjt2YXIgaT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7dGhpcy5zZWxlY3Rpb24ubW92ZVRvKDAsMCk7Zm9yKHZhciBzPW4ubGVuZ3RoLTE7cz49MDstLXMpdGhpcy4kdHJ5UmVwbGFjZShuW3NdLGUpJiZyKys7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGkpLHJ9LHRoaXMuJHRyeVJlcGxhY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKGUpO3JldHVybiB0PXRoaXMuJHNlYXJjaC5yZXBsYWNlKG4sdCksdCE9PW51bGw/KGUuZW5kPXRoaXMuc2Vzc2lvbi5yZXBsYWNlKGUsdCksZSk6bnVsbH0sdGhpcy5nZXRMYXN0U2VhcmNoT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzZWFyY2guZ2V0T3B0aW9ucygpfSx0aGlzLmZpbmQ9ZnVuY3Rpb24oZSx0LG4pe3R8fCh0PXt9KSx0eXBlb2YgZT09InN0cmluZyJ8fGUgaW5zdGFuY2VvZiBSZWdFeHA/dC5uZWVkbGU9ZTp0eXBlb2YgZT09Im9iamVjdCImJnIubWl4aW4odCxlKTt2YXIgaT10aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpO3QubmVlZGxlPT1udWxsJiYoZT10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKGkpfHx0aGlzLiRzZWFyY2guJG9wdGlvbnMubmVlZGxlLGV8fChpPXRoaXMuc2Vzc2lvbi5nZXRXb3JkUmFuZ2UoaS5zdGFydC5yb3csaS5zdGFydC5jb2x1bW4pLGU9dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShpKSksdGhpcy4kc2VhcmNoLnNldCh7bmVlZGxlOmV9KSksdGhpcy4kc2VhcmNoLnNldCh0KSx0LnN0YXJ0fHx0aGlzLiRzZWFyY2guc2V0KHtzdGFydDppfSk7dmFyIHM9dGhpcy4kc2VhcmNoLmZpbmQodGhpcy5zZXNzaW9uKTtpZih0LnByZXZlbnRTY3JvbGwpcmV0dXJuIHM7aWYocylyZXR1cm4gdGhpcy5yZXZlYWxSYW5nZShzLG4pLHM7dC5iYWNrd2FyZHM/aS5zdGFydD1pLmVuZDppLmVuZD1pLnN0YXJ0LHRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKGkpfSx0aGlzLmZpbmROZXh0PWZ1bmN0aW9uKGUsdCl7dGhpcy5maW5kKHtza2lwQ3VycmVudDohMCxiYWNrd2FyZHM6ITF9LGUsdCl9LHRoaXMuZmluZFByZXZpb3VzPWZ1bmN0aW9uKGUsdCl7dGhpcy5maW5kKGUse3NraXBDdXJyZW50OiEwLGJhY2t3YXJkczohMH0sdCl9LHRoaXMucmV2ZWFsUmFuZ2U9ZnVuY3Rpb24oZSx0KXt0aGlzLnNlc3Npb24udW5mb2xkKGUpLHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGUpO3ZhciBuPXRoaXMucmVuZGVyZXIuc2Nyb2xsVG9wO3RoaXMucmVuZGVyZXIuc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXcoZS5zdGFydCxlLmVuZCwuNSksdCE9PSExJiZ0aGlzLnJlbmRlcmVyLmFuaW1hdGVTY3JvbGxpbmcobil9LHRoaXMudW5kbz1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi5nZXRVbmRvTWFuYWdlcigpLnVuZG8odGhpcy5zZXNzaW9uKSx0aGlzLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsLjUpfSx0aGlzLnJlZG89ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKS5yZWRvKHRoaXMuc2Vzc2lvbiksdGhpcy5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyhudWxsLC41KX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5kZXN0cm95KCksdGhpcy5fc2lnbmFsKCJkZXN0cm95Iix0aGlzKSx0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi5kZXN0cm95KCl9LHRoaXMuc2V0QXV0b1Njcm9sbEVkaXRvckludG9WaWV3PWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybjt2YXIgdCxuPXRoaXMscj0hMTt0aGlzLiRzY3JvbGxBbmNob3J8fCh0aGlzLiRzY3JvbGxBbmNob3I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpO3ZhciBpPXRoaXMuJHNjcm9sbEFuY2hvcjtpLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlIix0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUoaSx0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKTt2YXIgcz10aGlzLm9uKCJjaGFuZ2VTZWxlY3Rpb24iLGZ1bmN0aW9uKCl7cj0hMH0pLG89dGhpcy5yZW5kZXJlci5vbigiYmVmb3JlUmVuZGVyIixmdW5jdGlvbigpe3ImJih0PW4ucmVuZGVyZXIuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKX0pLHU9dGhpcy5yZW5kZXJlci5vbigiYWZ0ZXJSZW5kZXIiLGZ1bmN0aW9uKCl7aWYociYmdCYmKG4uaXNGb2N1c2VkKCl8fG4uc2VhcmNoQm94JiZuLnNlYXJjaEJveC5pc0ZvY3VzZWQoKSkpe3ZhciBlPW4ucmVuZGVyZXIscz1lLiRjdXJzb3JMYXllci4kcGl4ZWxQb3Msbz1lLmxheWVyQ29uZmlnLHU9cy50b3Atby5vZmZzZXQ7cy50b3A+PTAmJnUrdC50b3A8MD9yPSEwOnMudG9wPG8uaGVpZ2h0JiZzLnRvcCt0LnRvcCtvLmxpbmVIZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0P3I9ITE6cj1udWxsLHIhPW51bGwmJihpLnN0eWxlLnRvcD11KyJweCIsaS5zdHlsZS5sZWZ0PXMubGVmdCsicHgiLGkuc3R5bGUuaGVpZ2h0PW8ubGluZUhlaWdodCsicHgiLGkuc2Nyb2xsSW50b1ZpZXcocikpLHI9dD1udWxsfX0pO3RoaXMuc2V0QXV0b1Njcm9sbEVkaXRvckludG9WaWV3PWZ1bmN0aW9uKGUpe2lmKGUpcmV0dXJuO2RlbGV0ZSB0aGlzLnNldEF1dG9TY3JvbGxFZGl0b3JJbnRvVmlldyx0aGlzLm9mZigiY2hhbmdlU2VsZWN0aW9uIixzKSx0aGlzLnJlbmRlcmVyLm9mZigiYWZ0ZXJSZW5kZXIiLHUpLHRoaXMucmVuZGVyZXIub2ZmKCJiZWZvcmVSZW5kZXIiLG8pfX0sdGhpcy4kcmVzZXRDdXJzb3JTdHlsZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJGN1cnNvclN0eWxlfHwiYWNlIix0PXRoaXMucmVuZGVyZXIuJGN1cnNvckxheWVyO2lmKCF0KXJldHVybjt0LnNldFNtb290aEJsaW5raW5nKC9zbW9vdGgvLnRlc3QoZSkpLHQuaXNCbGlua2luZz0hdGhpcy4kcmVhZE9ubHkmJmUhPSJ3aWRlIixpLnNldENzc0NsYXNzKHQuZWxlbWVudCwiYWNlX3NsaW0tY3Vyc29ycyIsL3NsaW0vLnRlc3QoZSkpfSx0aGlzLnByb21wdD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztnLmxvYWRNb2R1bGUoIi4vZXh0L3Byb21wdCIsZnVuY3Rpb24oaSl7aS5wcm9tcHQocixlLHQsbil9KX19LmNhbGwody5wcm90b3R5cGUpLGcuZGVmaW5lT3B0aW9ucyh3LnByb3RvdHlwZSwiZWRpdG9yIix7c2VsZWN0aW9uU3R5bGU6e3NldDpmdW5jdGlvbihlKXt0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCksdGhpcy5fc2lnbmFsKCJjaGFuZ2VTZWxlY3Rpb25TdHlsZSIse2RhdGE6ZX0pfSxpbml0aWFsVmFsdWU6ImxpbmUifSxoaWdobGlnaHRBY3RpdmVMaW5lOntzZXQ6ZnVuY3Rpb24oKXt0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCl9LGluaXRpYWxWYWx1ZTohMH0saGlnaGxpZ2h0U2VsZWN0ZWRXb3JkOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kb25TZWxlY3Rpb25DaGFuZ2UoKX0saW5pdGlhbFZhbHVlOiEwfSxyZWFkT25seTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMudGV4dElucHV0LnNldFJlYWRPbmx5KGUpLHRoaXMuJHJlc2V0Q3Vyc29yU3R5bGUoKX0saW5pdGlhbFZhbHVlOiExfSxjb3B5V2l0aEVtcHR5U2VsZWN0aW9uOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy50ZXh0SW5wdXQuc2V0Q29weVdpdGhFbXB0eVNlbGVjdGlvbihlKX0saW5pdGlhbFZhbHVlOiExfSxjdXJzb3JTdHlsZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJHJlc2V0Q3Vyc29yU3R5bGUoKX0sdmFsdWVzOlsiYWNlIiwic2xpbSIsInNtb290aCIsIndpZGUiXSxpbml0aWFsVmFsdWU6ImFjZSJ9LG1lcmdlVW5kb0RlbHRhczp7dmFsdWVzOlshMSwhMCwiYWx3YXlzIl0saW5pdGlhbFZhbHVlOiEwfSxiZWhhdmlvdXJzRW5hYmxlZDp7aW5pdGlhbFZhbHVlOiEwfSx3cmFwQmVoYXZpb3Vyc0VuYWJsZWQ6e2luaXRpYWxWYWx1ZTohMH0sYXV0b1Njcm9sbEVkaXRvckludG9WaWV3OntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXRBdXRvU2Nyb2xsRWRpdG9ySW50b1ZpZXcoZSl9fSxrZXlib2FyZEhhbmRsZXI6e3NldDpmdW5jdGlvbihlKXt0aGlzLnNldEtleWJvYXJkSGFuZGxlcihlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGtleWJpbmRpbmdJZH0saGFuZGxlc1NldDohMH0sdmFsdWU6e3NldDpmdW5jdGlvbihlKXt0aGlzLnNlc3Npb24uc2V0VmFsdWUoZSl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFZhbHVlKCl9LGhhbmRsZXNTZXQ6ITAsaGlkZGVuOiEwfSxzZXNzaW9uOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXRTZXNzaW9uKGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9ufSxoYW5kbGVzU2V0OiEwLGhpZGRlbjohMH0sc2hvd0xpbmVOdW1iZXJzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuc2V0U2hvd0xpbmVOdW1iZXJzKGUpLHRoaXMucmVuZGVyZXIuJGxvb3Auc2NoZWR1bGUodGhpcy5yZW5kZXJlci5DSEFOR0VfR1VUVEVSKSxlJiZ0aGlzLiRyZWxhdGl2ZUxpbmVOdW1iZXJzP0UuYXR0YWNoKHRoaXMpOkUuZGV0YWNoKHRoaXMpfSxpbml0aWFsVmFsdWU6ITB9LHJlbGF0aXZlTGluZU51bWJlcnM6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRzaG93TGluZU51bWJlcnMmJmU/RS5hdHRhY2godGhpcyk6RS5kZXRhY2godGhpcyl9fSxoU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZToicmVuZGVyZXIiLHZTY3JvbGxCYXJBbHdheXNWaXNpYmxlOiJyZW5kZXJlciIsaGlnaGxpZ2h0R3V0dGVyTGluZToicmVuZGVyZXIiLGFuaW1hdGVkU2Nyb2xsOiJyZW5kZXJlciIsc2hvd0ludmlzaWJsZXM6InJlbmRlcmVyIixzaG93UHJpbnRNYXJnaW46InJlbmRlcmVyIixwcmludE1hcmdpbkNvbHVtbjoicmVuZGVyZXIiLHByaW50TWFyZ2luOiJyZW5kZXJlciIsZmFkZUZvbGRXaWRnZXRzOiJyZW5kZXJlciIsc2hvd0ZvbGRXaWRnZXRzOiJyZW5kZXJlciIsZGlzcGxheUluZGVudEd1aWRlczoicmVuZGVyZXIiLHNob3dHdXR0ZXI6InJlbmRlcmVyIixmb250U2l6ZToicmVuZGVyZXIiLGZvbnRGYW1pbHk6InJlbmRlcmVyIixtYXhMaW5lczoicmVuZGVyZXIiLG1pbkxpbmVzOiJyZW5kZXJlciIsc2Nyb2xsUGFzdEVuZDoicmVuZGVyZXIiLGZpeGVkV2lkdGhHdXR0ZXI6InJlbmRlcmVyIix0aGVtZToicmVuZGVyZXIiLGhhc0Nzc1RyYW5zZm9ybXM6InJlbmRlcmVyIixtYXhQaXhlbEhlaWdodDoicmVuZGVyZXIiLHVzZVRleHRhcmVhRm9ySU1FOiJyZW5kZXJlciIsc2Nyb2xsU3BlZWQ6IiRtb3VzZUhhbmRsZXIiLGRyYWdEZWxheToiJG1vdXNlSGFuZGxlciIsZHJhZ0VuYWJsZWQ6IiRtb3VzZUhhbmRsZXIiLGZvY3VzVGltZW91dDoiJG1vdXNlSGFuZGxlciIsdG9vbHRpcEZvbGxvd3NNb3VzZToiJG1vdXNlSGFuZGxlciIsZmlyc3RMaW5lTnVtYmVyOiJzZXNzaW9uIixvdmVyd3JpdGU6InNlc3Npb24iLG5ld0xpbmVNb2RlOiJzZXNzaW9uIix1c2VXb3JrZXI6InNlc3Npb24iLHVzZVNvZnRUYWJzOiJzZXNzaW9uIixuYXZpZ2F0ZVdpdGhpblNvZnRUYWJzOiJzZXNzaW9uIix0YWJTaXplOiJzZXNzaW9uIix3cmFwOiJzZXNzaW9uIixpbmRlbnRlZFNvZnRXcmFwOiJzZXNzaW9uIixmb2xkU3R5bGU6InNlc3Npb24iLG1vZGU6InNlc3Npb24ifSk7dmFyIEU9e2dldFRleHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4oTWF0aC5hYnMoZS5zZWxlY3Rpb24ubGVhZC5yb3ctdCl8fHQrMSsodDw5PyJcdTAwYjciOiIiKSkrIiJ9LGdldFdpZHRoOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gTWF0aC5tYXgodC50b1N0cmluZygpLmxlbmd0aCwobi5sYXN0Um93KzEpLnRvU3RyaW5nKCkubGVuZ3RoLDIpKm4uY2hhcmFjdGVyV2lkdGh9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe3QucmVuZGVyZXIuJGxvb3Auc2NoZWR1bGUodC5yZW5kZXJlci5DSEFOR0VfR1VUVEVSKX0sYXR0YWNoOmZ1bmN0aW9uKGUpe2UucmVuZGVyZXIuJGd1dHRlckxheWVyLiRyZW5kZXJlcj10aGlzLGUub24oImNoYW5nZVNlbGVjdGlvbiIsdGhpcy51cGRhdGUpLHRoaXMudXBkYXRlKG51bGwsZSl9LGRldGFjaDpmdW5jdGlvbihlKXtlLnJlbmRlcmVyLiRndXR0ZXJMYXllci4kcmVuZGVyZXI9PXRoaXMmJihlLnJlbmRlcmVyLiRndXR0ZXJMYXllci4kcmVuZGVyZXI9bnVsbCksZS5vZmYoImNoYW5nZVNlbGVjdGlvbiIsdGhpcy51cGRhdGUpLHRoaXMudXBkYXRlKG51bGwsZSl9fTt0LkVkaXRvcj13fSksYWNlLmRlZmluZSgiYWNlL3VuZG9tYW5hZ2VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUsdCl7Zm9yKHZhciBuPXQ7bi0tOyl7dmFyIHI9ZVtuXTtpZihyJiYhclswXS5pZ25vcmUpe3doaWxlKG48dC0xKXt2YXIgaT1kKGVbbl0sZVtuKzFdKTtlW25dPWlbMF0sZVtuKzFdPWlbMV0sbisrfXJldHVybiEwfX19ZnVuY3Rpb24gYShlKXt2YXIgdD1lLmFjdGlvbj09Imluc2VydCIsbj1lLnN0YXJ0LHI9ZS5lbmQsaT0oci5yb3ctbi5yb3cpKih0PzE6LTEpLHM9KHIuY29sdW1uLW4uY29sdW1uKSoodD8xOi0xKTt0JiYocj1uKTtmb3IodmFyIG8gaW4gdGhpcy5tYXJrcyl7dmFyIGE9dGhpcy5tYXJrc1tvXSxmPXUoYSxuKTtpZihmPDApY29udGludWU7aWYoZj09PTAmJnQpe2lmKGEuYmlhcyE9MSl7YS5iaWFzPT0tMTtjb250aW51ZX1mPTF9dmFyIGw9dD9mOnUoYSxyKTtpZihsPjApe2Eucm93Kz1pLGEuY29sdW1uKz1hLnJvdz09ci5yb3c/czowO2NvbnRpbnVlfSF0JiZsPD0wJiYoYS5yb3c9bi5yb3csYS5jb2x1bW49bi5jb2x1bW4sbD09PTAmJihhLmJpYXM9MSkpfX1mdW5jdGlvbiBmKGUpe3JldHVybntyb3c6ZS5yb3csY29sdW1uOmUuY29sdW1ufX1mdW5jdGlvbiBsKGUpe3JldHVybntzdGFydDpmKGUuc3RhcnQpLGVuZDpmKGUuZW5kKSxhY3Rpb246ZS5hY3Rpb24sbGluZXM6ZS5saW5lcy5zbGljZSgpfX1mdW5jdGlvbiBjKGUpe2U9ZXx8dGhpcztpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlLm1hcChjKS5qb2luKCJcbiIpO3ZhciB0PSIiO2UuYWN0aW9uPyh0PWUuYWN0aW9uPT0iaW5zZXJ0Ij8iKyI6Ii0iLHQrPSJbIitlLmxpbmVzKyJdIik6ZS52YWx1ZSYmKEFycmF5LmlzQXJyYXkoZS52YWx1ZSk/dD1lLnZhbHVlLm1hcChoKS5qb2luKCJcbiIpOnQ9aChlLnZhbHVlKSksZS5zdGFydCYmKHQrPWgoZSkpO2lmKGUuaWR8fGUucmV2KXQrPSIJKCIrKGUuaWR8fGUucmV2KSsiKSI7cmV0dXJuIHR9ZnVuY3Rpb24gaChlKXtyZXR1cm4gZS5zdGFydC5yb3crIjoiK2Uuc3RhcnQuY29sdW1uKyI9PiIrZS5lbmQucm93KyI6IitlLmVuZC5jb2x1bW59ZnVuY3Rpb24gcChlLHQpe3ZhciBuPWUuYWN0aW9uPT0iaW5zZXJ0IixyPXQuYWN0aW9uPT0iaW5zZXJ0IjtpZihuJiZyKWlmKG8odC5zdGFydCxlLmVuZCk+PTApbSh0LGUsLTEpO2Vsc2V7aWYoIShvKHQuc3RhcnQsZS5zdGFydCk8PTApKXJldHVybiBudWxsO20oZSx0LDEpfWVsc2UgaWYobiYmIXIpaWYobyh0LnN0YXJ0LGUuZW5kKT49MCltKHQsZSwtMSk7ZWxzZXtpZighKG8odC5lbmQsZS5zdGFydCk8PTApKXJldHVybiBudWxsO20oZSx0LC0xKX1lbHNlIGlmKCFuJiZyKWlmKG8odC5zdGFydCxlLnN0YXJ0KT49MCltKHQsZSwxKTtlbHNle2lmKCEobyh0LnN0YXJ0LGUuc3RhcnQpPD0wKSlyZXR1cm4gbnVsbDttKGUsdCwxKX1lbHNlIGlmKCFuJiYhcilpZihvKHQuc3RhcnQsZS5zdGFydCk+PTApbSh0LGUsMSk7ZWxzZXtpZighKG8odC5lbmQsZS5zdGFydCk8PTApKXJldHVybiBudWxsO20oZSx0LC0xKX1yZXR1cm5bdCxlXX1mdW5jdGlvbiBkKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoO24tLTspZm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspaWYoIXAoZVtuXSx0W3JdKSl7d2hpbGUobjxlLmxlbmd0aCl7d2hpbGUoci0tKXAodFtyXSxlW25dKTtyPXQubGVuZ3RoLG4rK31yZXR1cm5bZSx0XX1yZXR1cm4gZS5zZWxlY3Rpb25CZWZvcmU9dC5zZWxlY3Rpb25CZWZvcmU9ZS5zZWxlY3Rpb25BZnRlcj10LnNlbGVjdGlvbkFmdGVyPW51bGwsW3QsZV19ZnVuY3Rpb24gdihlLHQpe3ZhciBuPWUuYWN0aW9uPT0iaW5zZXJ0IixyPXQuYWN0aW9uPT0iaW5zZXJ0IjtpZihuJiZyKW8oZS5zdGFydCx0LnN0YXJ0KTwwP20odCxlLDEpOm0oZSx0LDEpO2Vsc2UgaWYobiYmIXIpbyhlLnN0YXJ0LHQuZW5kKT49MD9tKGUsdCwtMSk6byhlLnN0YXJ0LHQuc3RhcnQpPD0wP20odCxlLDEpOihtKGUscy5mcm9tUG9pbnRzKHQuc3RhcnQsZS5zdGFydCksLTEpLG0odCxlLDEpKTtlbHNlIGlmKCFuJiZyKW8odC5zdGFydCxlLmVuZCk+PTA/bSh0LGUsLTEpOm8odC5zdGFydCxlLnN0YXJ0KTw9MD9tKGUsdCwxKToobSh0LHMuZnJvbVBvaW50cyhlLnN0YXJ0LHQuc3RhcnQpLC0xKSxtKGUsdCwxKSk7ZWxzZSBpZighbiYmIXIpaWYobyh0LnN0YXJ0LGUuZW5kKT49MCltKHQsZSwtMSk7ZWxzZXtpZighKG8odC5lbmQsZS5zdGFydCk8PTApKXt2YXIgaSx1O3JldHVybiBvKGUuc3RhcnQsdC5zdGFydCk8MCYmKGk9ZSxlPXkoZSx0LnN0YXJ0KSksbyhlLmVuZCx0LmVuZCk+MCYmKHU9eShlLHQuZW5kKSksZyh0LmVuZCxlLnN0YXJ0LGUuZW5kLC0xKSx1JiYhaSYmKGUubGluZXM9dS5saW5lcyxlLnN0YXJ0PXUuc3RhcnQsZS5lbmQ9dS5lbmQsdT1lKSxbdCxpLHVdLmZpbHRlcihCb29sZWFuKX1tKGUsdCwtMSl9cmV0dXJuW3QsZV19ZnVuY3Rpb24gbShlLHQsbil7ZyhlLnN0YXJ0LHQuc3RhcnQsdC5lbmQsbiksZyhlLmVuZCx0LnN0YXJ0LHQuZW5kLG4pfWZ1bmN0aW9uIGcoZSx0LG4scil7ZS5yb3c9PShyPT0xP3Q6bikucm93JiYoZS5jb2x1bW4rPXIqKG4uY29sdW1uLXQuY29sdW1uKSksZS5yb3crPXIqKG4ucm93LXQucm93KX1mdW5jdGlvbiB5KGUsdCl7dmFyIG49ZS5saW5lcyxyPWUuZW5kO2UuZW5kPWYodCk7dmFyIGk9ZS5lbmQucm93LWUuc3RhcnQucm93LHM9bi5zcGxpY2UoaSxuLmxlbmd0aCksbz1pP3QuY29sdW1uOnQuY29sdW1uLWUuc3RhcnQuY29sdW1uO24ucHVzaChzWzBdLnN1YnN0cmluZygwLG8pKSxzWzBdPXNbMF0uc3Vic3RyKG8pO3ZhciB1PXtzdGFydDpmKHQpLGVuZDpyLGxpbmVzOnMsYWN0aW9uOmUuYWN0aW9ufTtyZXR1cm4gdX1mdW5jdGlvbiBiKGUsdCl7dD1sKHQpO2Zvcih2YXIgbj1lLmxlbmd0aDtuLS07KXt2YXIgcj1lW25dO2Zvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgcz1yW2ldLG89dihzLHQpO3Q9b1swXSxvLmxlbmd0aCE9MiYmKG9bMl0/KHIuc3BsaWNlKGkrMSwxLG9bMV0sb1syXSksaSsrKTpvWzFdfHwoci5zcGxpY2UoaSwxKSxpLS0pKX1yLmxlbmd0aHx8ZS5zcGxpY2UobiwxKX1yZXR1cm4gZX1mdW5jdGlvbiB3KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspYihlLHJbaV0pfX12YXIgcj1mdW5jdGlvbigpe3RoaXMuJG1heFJldj0wLHRoaXMuJGZyb21VbmRvPSExLHRoaXMucmVzZXQoKX07KGZ1bmN0aW9uKCl7dGhpcy5hZGRTZXNzaW9uPWZ1bmN0aW9uKGUpe3RoaXMuJHNlc3Npb249ZX0sdGhpcy5hZGQ9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuJGZyb21VbmRvKXJldHVybjtpZihlPT10aGlzLiRsYXN0RGVsdGEpcmV0dXJuO2lmKHQ9PT0hMXx8IXRoaXMubGFzdERlbHRhcyl0aGlzLmxhc3REZWx0YXM9W10sdGhpcy4kdW5kb1N0YWNrLnB1c2godGhpcy5sYXN0RGVsdGFzKSxlLmlkPXRoaXMuJHJldj0rK3RoaXMuJG1heFJldjtpZihlLmFjdGlvbj09InJlbW92ZSJ8fGUuYWN0aW9uPT0iaW5zZXJ0Iil0aGlzLiRsYXN0RGVsdGE9ZTt0aGlzLmxhc3REZWx0YXMucHVzaChlKX0sdGhpcy5hZGRTZWxlY3Rpb249ZnVuY3Rpb24oZSx0KXt0aGlzLnNlbGVjdGlvbnMucHVzaCh7dmFsdWU6ZSxyZXY6dHx8dGhpcy4kcmV2fSl9LHRoaXMuc3RhcnROZXdHcm91cD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxhc3REZWx0YXM9bnVsbCx0aGlzLiRyZXZ9LHRoaXMubWFya0lnbm9yZWQ9ZnVuY3Rpb24oZSx0KXt0PT1udWxsJiYodD10aGlzLiRyZXYrMSk7dmFyIG49dGhpcy4kdW5kb1N0YWNrO2Zvcih2YXIgcj1uLmxlbmd0aDtyLS07KXt2YXIgaT1uW3JdWzBdO2lmKGkuaWQ8PWUpYnJlYWs7aS5pZDx0JiYoaS5pZ25vcmU9ITApfXRoaXMubGFzdERlbHRhcz1udWxsfSx0aGlzLmdldFNlbGVjdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2VsZWN0aW9ucztmb3IodmFyIHI9bi5sZW5ndGg7ci0tOyl7dmFyIGk9bltyXTtpZihpLnJldjxlKXJldHVybiB0JiYoaT1uW3IrMV0pLGl9fSx0aGlzLmdldFJldmlzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJldn0sdGhpcy5nZXREZWx0YXM9ZnVuY3Rpb24oZSx0KXt0PT1udWxsJiYodD10aGlzLiRyZXYrMSk7dmFyIG49dGhpcy4kdW5kb1N0YWNrLHI9bnVsbCxpPTA7Zm9yKHZhciBzPW4ubGVuZ3RoO3MtLTspe3ZhciBvPW5bc11bMF07by5pZDx0JiYhciYmKHI9cysxKTtpZihvLmlkPD1lKXtpPXMrMTticmVha319cmV0dXJuIG4uc2xpY2UoaSxyKX0sdGhpcy5nZXRDaGFuZ2VkUmFuZ2VzPWZ1bmN0aW9uKGUsdCl7dD09bnVsbCYmKHQ9dGhpcy4kcmV2KzEpfSx0aGlzLmdldENoYW5nZWRMaW5lcz1mdW5jdGlvbihlLHQpe3Q9PW51bGwmJih0PXRoaXMuJHJldisxKX0sdGhpcy51bmRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5sYXN0RGVsdGFzPW51bGw7dmFyIG49dGhpcy4kdW5kb1N0YWNrO2lmKCFpKG4sbi5sZW5ndGgpKXJldHVybjtlfHwoZT10aGlzLiRzZXNzaW9uKSx0aGlzLiRyZWRvU3RhY2tCYXNlUmV2IT09dGhpcy4kcmV2JiZ0aGlzLiRyZWRvU3RhY2subGVuZ3RoJiYodGhpcy4kcmVkb1N0YWNrPVtdKSx0aGlzLiRmcm9tVW5kbz0hMDt2YXIgcj1uLnBvcCgpLHM9bnVsbDtyZXR1cm4gciYmci5sZW5ndGgmJihzPWUudW5kb0NoYW5nZXMocix0KSx0aGlzLiRyZWRvU3RhY2sucHVzaChyKSx0aGlzLiRzeW5jUmV2KCkpLHRoaXMuJGZyb21VbmRvPSExLHN9LHRoaXMucmVkbz1mdW5jdGlvbihlLHQpe3RoaXMubGFzdERlbHRhcz1udWxsLGV8fChlPXRoaXMuJHNlc3Npb24pLHRoaXMuJGZyb21VbmRvPSEwO2lmKHRoaXMuJHJlZG9TdGFja0Jhc2VSZXYhPXRoaXMuJHJldil7dmFyIG49dGhpcy5nZXREZWx0YXModGhpcy4kcmVkb1N0YWNrQmFzZVJldix0aGlzLiRyZXYrMSk7dyh0aGlzLiRyZWRvU3RhY2ssbiksdGhpcy4kcmVkb1N0YWNrQmFzZVJldj10aGlzLiRyZXYsdGhpcy4kcmVkb1N0YWNrLmZvckVhY2goZnVuY3Rpb24oZSl7ZVswXS5pZD0rK3RoaXMuJG1heFJldn0sdGhpcyl9dmFyIHI9dGhpcy4kcmVkb1N0YWNrLnBvcCgpLGk9bnVsbDtyZXR1cm4gciYmKGk9ZS5yZWRvQ2hhbmdlcyhyLHQpLHRoaXMuJHVuZG9TdGFjay5wdXNoKHIpLHRoaXMuJHN5bmNSZXYoKSksdGhpcy4kZnJvbVVuZG89ITEsaX0sdGhpcy4kc3luY1Jldj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJHVuZG9TdGFjayx0PWVbZS5sZW5ndGgtMV0sbj10JiZ0WzBdLmlkfHwwO3RoaXMuJHJlZG9TdGFja0Jhc2VSZXY9bix0aGlzLiRyZXY9bn0sdGhpcy5yZXNldD1mdW5jdGlvbigpe3RoaXMubGFzdERlbHRhcz1udWxsLHRoaXMuJGxhc3REZWx0YT1udWxsLHRoaXMuJHVuZG9TdGFjaz1bXSx0aGlzLiRyZWRvU3RhY2s9W10sdGhpcy4kcmV2PTAsdGhpcy5tYXJrPTAsdGhpcy4kcmVkb1N0YWNrQmFzZVJldj10aGlzLiRyZXYsdGhpcy5zZWxlY3Rpb25zPVtdfSx0aGlzLmNhblVuZG89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdW5kb1N0YWNrLmxlbmd0aD4wfSx0aGlzLmNhblJlZG89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcmVkb1N0YWNrLmxlbmd0aD4wfSx0aGlzLmJvb2ttYXJrPWZ1bmN0aW9uKGUpe2U9PXVuZGVmaW5lZCYmKGU9dGhpcy4kcmV2KSx0aGlzLm1hcms9ZX0sdGhpcy5pc0F0Qm9va21hcms9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcmV2PT09dGhpcy5tYXJrfSx0aGlzLnRvSlNPTj1mdW5jdGlvbigpe30sdGhpcy5mcm9tSlNPTj1mdW5jdGlvbigpe30sdGhpcy5oYXNVbmRvPXRoaXMuY2FuVW5kbyx0aGlzLmhhc1JlZG89dGhpcy5jYW5SZWRvLHRoaXMuaXNDbGVhbj10aGlzLmlzQXRCb29rbWFyayx0aGlzLm1hcmtDbGVhbj10aGlzLmJvb2ttYXJrLHRoaXMuJHByZXR0eVByaW50PWZ1bmN0aW9uKGUpe3JldHVybiBlP2MoZSk6Yyh0aGlzLiR1bmRvU3RhY2spKyJcbi0tLVxuIitjKHRoaXMuJHJlZG9TdGFjayl9fSkuY2FsbChyLnByb3RvdHlwZSk7dmFyIHM9ZSgiLi9yYW5nZSIpLlJhbmdlLG89cy5jb21wYXJlUG9pbnRzLHU9cy5jb21wYXJlUG9pbnRzO3QuVW5kb01hbmFnZXI9cn0pLGFjZS5kZWZpbmUoImFjZS9sYXllci9saW5lcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvZG9tIiksaT1mdW5jdGlvbihlLHQpe3RoaXMuZWxlbWVudD1lLHRoaXMuY2FudmFzSGVpZ2h0PXR8fDVlNSx0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0PXRoaXMuY2FudmFzSGVpZ2h0KjIrInB4Iix0aGlzLmNlbGxzPVtdLHRoaXMuY2VsbENhY2hlPVtdLHRoaXMuJG9mZnNldENvZWZmaWNpZW50PTB9OyhmdW5jdGlvbigpe3RoaXMubW92ZUNvbnRhaW5lcj1mdW5jdGlvbihlKXtyLnRyYW5zbGF0ZSh0aGlzLmVsZW1lbnQsMCwtKGUuZmlyc3RSb3dTY3JlZW4qZS5saW5lSGVpZ2h0JXRoaXMuY2FudmFzSGVpZ2h0KS1lLm9mZnNldCp0aGlzLiRvZmZzZXRDb2VmZmljaWVudCl9LHRoaXMucGFnZUNoYW5nZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTWF0aC5mbG9vcihlLmZpcnN0Um93U2NyZWVuKmUubGluZUhlaWdodC90aGlzLmNhbnZhc0hlaWdodCkhPT1NYXRoLmZsb29yKHQuZmlyc3RSb3dTY3JlZW4qdC5saW5lSGVpZ2h0L3RoaXMuY2FudmFzSGVpZ2h0KX0sdGhpcy5jb21wdXRlTGluZVRvcD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5maXJzdFJvd1NjcmVlbip0LmxpbmVIZWlnaHQsaT1NYXRoLmZsb29yKHIvdGhpcy5jYW52YXNIZWlnaHQpLHM9bi5kb2N1bWVudFRvU2NyZWVuUm93KGUsMCkqdC5saW5lSGVpZ2h0O3JldHVybiBzLWkqdGhpcy5jYW52YXNIZWlnaHR9LHRoaXMuY29tcHV0ZUxpbmVIZWlnaHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0LmxpbmVIZWlnaHQqbi5nZXRSb3dMZW5ndGgoZSl9LHRoaXMuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbHMubGVuZ3RofSx0aGlzLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jZWxsc1tlXX0sdGhpcy5zaGlmdD1mdW5jdGlvbigpe3RoaXMuJGNhY2hlQ2VsbCh0aGlzLmNlbGxzLnNoaWZ0KCkpfSx0aGlzLnBvcD1mdW5jdGlvbigpe3RoaXMuJGNhY2hlQ2VsbCh0aGlzLmNlbGxzLnBvcCgpKX0sdGhpcy5wdXNoPWZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpe3RoaXMuY2VsbHMucHVzaC5hcHBseSh0aGlzLmNlbGxzLGUpO3ZhciB0PXIuY3JlYXRlRnJhZ21lbnQodGhpcy5lbGVtZW50KTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0LmFwcGVuZENoaWxkKGVbbl0uZWxlbWVudCk7dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHQpfWVsc2UgdGhpcy5jZWxscy5wdXNoKGUpLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChlLmVsZW1lbnQpfSx0aGlzLnVuc2hpZnQ9ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSl7dGhpcy5jZWxscy51bnNoaWZ0LmFwcGx5KHRoaXMuY2VsbHMsZSk7dmFyIHQ9ci5jcmVhdGVGcmFnbWVudCh0aGlzLmVsZW1lbnQpO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXQuYXBwZW5kQ2hpbGQoZVtuXS5lbGVtZW50KTt0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZD90aGlzLmVsZW1lbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5lbGVtZW50LmZpcnN0Q2hpbGQpOnRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0KX1lbHNlIHRoaXMuY2VsbHMudW5zaGlmdChlKSx0aGlzLmVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJhZnRlcmJlZ2luIixlLmVsZW1lbnQpfSx0aGlzLmxhc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxscy5sZW5ndGg/dGhpcy5jZWxsc1t0aGlzLmNlbGxzLmxlbmd0aC0xXTpudWxsfSx0aGlzLiRjYWNoZUNlbGw9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuO2UuZWxlbWVudC5yZW1vdmUoKSx0aGlzLmNlbGxDYWNoZS5wdXNoKGUpfSx0aGlzLmNyZWF0ZUNlbGw9ZnVuY3Rpb24oZSx0LG4saSl7dmFyIHM9dGhpcy5jZWxsQ2FjaGUucG9wKCk7aWYoIXMpe3ZhciBvPXIuY3JlYXRlRWxlbWVudCgiZGl2Iik7aSYmaShvKSx0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQobykscz17ZWxlbWVudDpvLHRleHQ6IiIscm93OmV9fXJldHVybiBzLnJvdz1lLHN9fSkuY2FsbChpLnByb3RvdHlwZSksdC5MaW5lcz1pfSksYWNlLmRlZmluZSgiYWNlL2xheWVyL2d1dHRlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvbGF5ZXIvbGluZXMiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGYoZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO2UuYXBwZW5kQ2hpbGQodCk7dmFyIG49ci5jcmVhdGVFbGVtZW50KCJzcGFuIik7cmV0dXJuIGUuYXBwZW5kQ2hpbGQobiksZX12YXIgcj1lKCIuLi9saWIvZG9tIiksaT1lKCIuLi9saWIvb29wIikscz1lKCIuLi9saWIvbGFuZyIpLG89ZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsdT1lKCIuL2xpbmVzIikuTGluZXMsYT1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQ9ci5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX2d1dHRlci1sYXllciIsZS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpLHRoaXMuc2V0U2hvd0ZvbGRXaWRnZXRzKHRoaXMuJHNob3dGb2xkV2lkZ2V0cyksdGhpcy5ndXR0ZXJXaWR0aD0wLHRoaXMuJGFubm90YXRpb25zPVtdLHRoaXMuJHVwZGF0ZUFubm90YXRpb25zPXRoaXMuJHVwZGF0ZUFubm90YXRpb25zLmJpbmQodGhpcyksdGhpcy4kbGluZXM9bmV3IHUodGhpcy5lbGVtZW50KSx0aGlzLiRsaW5lcy4kb2Zmc2V0Q29lZmZpY2llbnQ9MX07KGZ1bmN0aW9uKCl7aS5pbXBsZW1lbnQodGhpcyxvKSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiR1cGRhdGVBbm5vdGF0aW9ucyksdGhpcy5zZXNzaW9uPWUsZSYmZS5vbigiY2hhbmdlIix0aGlzLiR1cGRhdGVBbm5vdGF0aW9ucyl9LHRoaXMuYWRkR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihlLHQpe3dpbmRvdy5jb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybigiZGVwcmVjYXRlZCB1c2Ugc2Vzc2lvbi5hZGRHdXR0ZXJEZWNvcmF0aW9uIiksdGhpcy5zZXNzaW9uLmFkZEd1dHRlckRlY29yYXRpb24oZSx0KX0sdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGUsdCl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKCJkZXByZWNhdGVkIHVzZSBzZXNzaW9uLnJlbW92ZUd1dHRlckRlY29yYXRpb24iKSx0aGlzLnNlc3Npb24ucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbihlLHQpfSx0aGlzLnNldEFubm90YXRpb25zPWZ1bmN0aW9uKGUpe3RoaXMuJGFubm90YXRpb25zPVtdO2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdLHI9bi5yb3csaT10aGlzLiRhbm5vdGF0aW9uc1tyXTtpfHwoaT10aGlzLiRhbm5vdGF0aW9uc1tyXT17dGV4dDpbXX0pO3ZhciBvPW4udGV4dDtvPW8/cy5lc2NhcGVIVE1MKG8pOm4uaHRtbHx8IiIsaS50ZXh0LmluZGV4T2Yobyk9PT0tMSYmaS50ZXh0LnB1c2gobyk7dmFyIHU9bi50eXBlO3U9PSJlcnJvciI/aS5jbGFzc05hbWU9IiBhY2VfZXJyb3IiOnU9PSJ3YXJuaW5nIiYmaS5jbGFzc05hbWUhPSIgYWNlX2Vycm9yIj9pLmNsYXNzTmFtZT0iIGFjZV93YXJuaW5nIjp1PT0iaW5mbyImJiFpLmNsYXNzTmFtZSYmKGkuY2xhc3NOYW1lPSIgYWNlX2luZm8iKX19LHRoaXMuJHVwZGF0ZUFubm90YXRpb25zPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRhbm5vdGF0aW9ucy5sZW5ndGgpcmV0dXJuO3ZhciB0PWUuc3RhcnQucm93LG49ZS5lbmQucm93LXQ7aWYobiE9PTApaWYoZS5hY3Rpb249PSJyZW1vdmUiKXRoaXMuJGFubm90YXRpb25zLnNwbGljZSh0LG4rMSxudWxsKTtlbHNle3ZhciByPW5ldyBBcnJheShuKzEpO3IudW5zaGlmdCh0LDEpLHRoaXMuJGFubm90YXRpb25zLnNwbGljZS5hcHBseSh0aGlzLiRhbm5vdGF0aW9ucyxyKX19LHRoaXMudXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMuY29uZmlnPWU7dmFyIHQ9dGhpcy5zZXNzaW9uLG49ZS5maXJzdFJvdyxyPU1hdGgubWluKGUubGFzdFJvdytlLmd1dHRlck9mZnNldCx0LmdldExlbmd0aCgpLTEpO3RoaXMub2xkTGFzdFJvdz1yLHRoaXMuY29uZmlnPWUsdGhpcy4kbGluZXMubW92ZUNvbnRhaW5lcihlKSx0aGlzLiR1cGRhdGVDdXJzb3JSb3coKTt2YXIgaT10LmdldE5leHRGb2xkTGluZShuKSxzPWk/aS5zdGFydC5yb3c6SW5maW5pdHksbz1udWxsLHU9LTEsYT1uO2Zvcig7Oyl7YT5zJiYoYT1pLmVuZC5yb3crMSxpPXQuZ2V0TmV4dEZvbGRMaW5lKGEsaSkscz1pP2kuc3RhcnQucm93OkluZmluaXR5KTtpZihhPnIpe3doaWxlKHRoaXMuJGxpbmVzLmdldExlbmd0aCgpPnUrMSl0aGlzLiRsaW5lcy5wb3AoKTticmVha31vPXRoaXMuJGxpbmVzLmdldCgrK3UpLG8/by5yb3c9YToobz10aGlzLiRsaW5lcy5jcmVhdGVDZWxsKGEsZSx0aGlzLnNlc3Npb24sZiksdGhpcy4kbGluZXMucHVzaChvKSksdGhpcy4kcmVuZGVyQ2VsbChvLGUsaSxhKSxhKyt9dGhpcy5fc2lnbmFsKCJhZnRlclJlbmRlciIpLHRoaXMuJHVwZGF0ZUd1dHRlcldpZHRoKGUpfSx0aGlzLiR1cGRhdGVHdXR0ZXJXaWR0aD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24sbj10Lmd1dHRlclJlbmRlcmVyfHx0aGlzLiRyZW5kZXJlcixyPXQuJGZpcnN0TGluZU51bWJlcixpPXRoaXMuJGxpbmVzLmxhc3QoKT90aGlzLiRsaW5lcy5sYXN0KCkudGV4dDoiIjtpZih0aGlzLiRmaXhlZFdpZHRofHx0LiR1c2VXcmFwTW9kZSlpPXQuZ2V0TGVuZ3RoKCkrci0xO3ZhciBzPW4/bi5nZXRXaWR0aCh0LGksZSk6aS50b1N0cmluZygpLmxlbmd0aCplLmNoYXJhY3RlcldpZHRoLG89dGhpcy4kcGFkZGluZ3x8dGhpcy4kY29tcHV0ZVBhZGRpbmcoKTtzKz1vLmxlZnQrby5yaWdodCxzIT09dGhpcy5ndXR0ZXJXaWR0aCYmIWlzTmFOKHMpJiYodGhpcy5ndXR0ZXJXaWR0aD1zLHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLnN0eWxlLndpZHRoPXRoaXMuZWxlbWVudC5zdHlsZS53aWR0aD1NYXRoLmNlaWwodGhpcy5ndXR0ZXJXaWR0aCkrInB4Iix0aGlzLl9zaWduYWwoImNoYW5nZUd1dHRlcldpZHRoIixzKSl9LHRoaXMuJHVwZGF0ZUN1cnNvclJvdz1mdW5jdGlvbigpe2lmKCF0aGlzLiRoaWdobGlnaHRHdXR0ZXJMaW5lKXJldHVybjt2YXIgZT10aGlzLnNlc3Npb24uc2VsZWN0aW9uLmdldEN1cnNvcigpO2lmKHRoaXMuJGN1cnNvclJvdz09PWUucm93KXJldHVybjt0aGlzLiRjdXJzb3JSb3c9ZS5yb3d9LHRoaXMudXBkYXRlTGluZUhpZ2hsaWdodD1mdW5jdGlvbigpe2lmKCF0aGlzLiRoaWdobGlnaHRHdXR0ZXJMaW5lKXJldHVybjt2YXIgZT10aGlzLnNlc3Npb24uc2VsZWN0aW9uLmN1cnNvci5yb3c7dGhpcy4kY3Vyc29yUm93PWU7aWYodGhpcy4kY3Vyc29yQ2VsbCYmdGhpcy4kY3Vyc29yQ2VsbC5yb3c9PWUpcmV0dXJuO3RoaXMuJGN1cnNvckNlbGwmJih0aGlzLiRjdXJzb3JDZWxsLmVsZW1lbnQuY2xhc3NOYW1lPXRoaXMuJGN1cnNvckNlbGwuZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZSgiYWNlX2d1dHRlci1hY3RpdmUtbGluZSAiLCIiKSk7dmFyIHQ9dGhpcy4kbGluZXMuY2VsbHM7dGhpcy4kY3Vyc29yQ2VsbD1udWxsO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO2lmKHIucm93Pj10aGlzLiRjdXJzb3JSb3cpe2lmKHIucm93PnRoaXMuJGN1cnNvclJvdyl7dmFyIGk9dGhpcy5zZXNzaW9uLmdldEZvbGRMaW5lKHRoaXMuJGN1cnNvclJvdyk7aWYoIShuPjAmJmkmJmkuc3RhcnQucm93PT10W24tMV0ucm93KSlicmVhaztyPXRbbi0xXX1yLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfZ3V0dGVyLWFjdGl2ZS1saW5lICIrci5lbGVtZW50LmNsYXNzTmFtZSx0aGlzLiRjdXJzb3JDZWxsPXI7YnJlYWt9fX0sdGhpcy5zY3JvbGxMaW5lcz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNvbmZpZzt0aGlzLmNvbmZpZz1lLHRoaXMuJHVwZGF0ZUN1cnNvclJvdygpO2lmKHRoaXMuJGxpbmVzLnBhZ2VDaGFuZ2VkKHQsZSkpcmV0dXJuIHRoaXMudXBkYXRlKGUpO3RoaXMuJGxpbmVzLm1vdmVDb250YWluZXIoZSk7dmFyIG49TWF0aC5taW4oZS5sYXN0Um93K2UuZ3V0dGVyT2Zmc2V0LHRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKS0xKSxyPXRoaXMub2xkTGFzdFJvdzt0aGlzLm9sZExhc3RSb3c9bjtpZighdHx8cjxlLmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTtpZihuPHQuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO2lmKHQuZmlyc3RSb3c8ZS5maXJzdFJvdylmb3IodmFyIGk9dGhpcy5zZXNzaW9uLmdldEZvbGRlZFJvd0NvdW50KHQuZmlyc3RSb3csZS5maXJzdFJvdy0xKTtpPjA7aS0tKXRoaXMuJGxpbmVzLnNoaWZ0KCk7aWYocj5uKWZvcih2YXIgaT10aGlzLnNlc3Npb24uZ2V0Rm9sZGVkUm93Q291bnQobisxLHIpO2k+MDtpLS0pdGhpcy4kbGluZXMucG9wKCk7ZS5maXJzdFJvdzx0LmZpcnN0Um93JiZ0aGlzLiRsaW5lcy51bnNoaWZ0KHRoaXMuJHJlbmRlckxpbmVzKGUsZS5maXJzdFJvdyx0LmZpcnN0Um93LTEpKSxuPnImJnRoaXMuJGxpbmVzLnB1c2godGhpcy4kcmVuZGVyTGluZXMoZSxyKzEsbikpLHRoaXMudXBkYXRlTGluZUhpZ2hsaWdodCgpLHRoaXMuX3NpZ25hbCgiYWZ0ZXJSZW5kZXIiKSx0aGlzLiR1cGRhdGVHdXR0ZXJXaWR0aChlKX0sdGhpcy4kcmVuZGVyTGluZXM9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLGk9dCxzPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUoaSksbz1zP3Muc3RhcnQucm93OkluZmluaXR5O2Zvcig7Oyl7aT5vJiYoaT1zLmVuZC5yb3crMSxzPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUoaSxzKSxvPXM/cy5zdGFydC5yb3c6SW5maW5pdHkpO2lmKGk+bilicmVhazt2YXIgdT10aGlzLiRsaW5lcy5jcmVhdGVDZWxsKGksZSx0aGlzLnNlc3Npb24sZik7dGhpcy4kcmVuZGVyQ2VsbCh1LGUscyxpKSxyLnB1c2godSksaSsrfXJldHVybiByfSx0aGlzLiRyZW5kZXJDZWxsPWZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBzPWUuZWxlbWVudCxvPXRoaXMuc2Vzc2lvbix1PXMuY2hpbGROb2Rlc1swXSxhPXMuY2hpbGROb2Rlc1sxXSxmPW8uJGZpcnN0TGluZU51bWJlcixsPW8uJGJyZWFrcG9pbnRzLGM9by4kZGVjb3JhdGlvbnMsaD1vLmd1dHRlclJlbmRlcmVyfHx0aGlzLiRyZW5kZXJlcixwPXRoaXMuJHNob3dGb2xkV2lkZ2V0cyYmby5mb2xkV2lkZ2V0cyxkPW4/bi5zdGFydC5yb3c6TnVtYmVyLk1BWF9WQUxVRSx2PSJhY2VfZ3V0dGVyLWNlbGwgIjt0aGlzLiRoaWdobGlnaHRHdXR0ZXJMaW5lJiYoaT09dGhpcy4kY3Vyc29yUm93fHxuJiZpPHRoaXMuJGN1cnNvclJvdyYmaT49ZCYmdGhpcy4kY3Vyc29yUm93PD1uLmVuZC5yb3cpJiYodis9ImFjZV9ndXR0ZXItYWN0aXZlLWxpbmUgIix0aGlzLiRjdXJzb3JDZWxsIT1lJiYodGhpcy4kY3Vyc29yQ2VsbCYmKHRoaXMuJGN1cnNvckNlbGwuZWxlbWVudC5jbGFzc05hbWU9dGhpcy4kY3Vyc29yQ2VsbC5lbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKCJhY2VfZ3V0dGVyLWFjdGl2ZS1saW5lICIsIiIpKSx0aGlzLiRjdXJzb3JDZWxsPWUpKSxsW2ldJiYodis9bFtpXSksY1tpXSYmKHYrPWNbaV0pLHRoaXMuJGFubm90YXRpb25zW2ldJiYodis9dGhpcy4kYW5ub3RhdGlvbnNbaV0uY2xhc3NOYW1lKSxzLmNsYXNzTmFtZSE9diYmKHMuY2xhc3NOYW1lPXYpO2lmKHApe3ZhciBtPXBbaV07bT09bnVsbCYmKG09cFtpXT1vLmdldEZvbGRXaWRnZXQoaSkpfWlmKG0pe3ZhciB2PSJhY2VfZm9sZC13aWRnZXQgYWNlXyIrbTttPT0ic3RhcnQiJiZpPT1kJiZpPG4uZW5kLnJvdz92Kz0iIGFjZV9jbG9zZWQiOnYrPSIgYWNlX29wZW4iLGEuY2xhc3NOYW1lIT12JiYoYS5jbGFzc05hbWU9dik7dmFyIGc9dC5saW5lSGVpZ2h0KyJweCI7ci5zZXRTdHlsZShhLnN0eWxlLCJoZWlnaHQiLGcpLHIuc2V0U3R5bGUoYS5zdHlsZSwiZGlzcGxheSIsImlubGluZS1ibG9jayIpfWVsc2UgYSYmci5zZXRTdHlsZShhLnN0eWxlLCJkaXNwbGF5Iiwibm9uZSIpO3ZhciB5PShoP2guZ2V0VGV4dChvLGkpOmkrZikudG9TdHJpbmcoKTtyZXR1cm4geSE9PXUuZGF0YSYmKHUuZGF0YT15KSxyLnNldFN0eWxlKGUuZWxlbWVudC5zdHlsZSwiaGVpZ2h0Iix0aGlzLiRsaW5lcy5jb21wdXRlTGluZUhlaWdodChpLHQsbykrInB4Iiksci5zZXRTdHlsZShlLmVsZW1lbnQuc3R5bGUsInRvcCIsdGhpcy4kbGluZXMuY29tcHV0ZUxpbmVUb3AoaSx0LG8pKyJweCIpLGUudGV4dD15LGV9LHRoaXMuJGZpeGVkV2lkdGg9ITEsdGhpcy4kaGlnaGxpZ2h0R3V0dGVyTGluZT0hMCx0aGlzLiRyZW5kZXJlcj0iIix0aGlzLnNldEhpZ2hsaWdodEd1dHRlckxpbmU9ZnVuY3Rpb24oZSl7dGhpcy4kaGlnaGxpZ2h0R3V0dGVyTGluZT1lfSx0aGlzLiRzaG93TGluZU51bWJlcnM9ITAsdGhpcy4kcmVuZGVyZXI9IiIsdGhpcy5zZXRTaG93TGluZU51bWJlcnM9ZnVuY3Rpb24oZSl7dGhpcy4kcmVuZGVyZXI9IWUmJntnZXRXaWR0aDpmdW5jdGlvbigpe3JldHVybiAwfSxnZXRUZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIiJ9fX0sdGhpcy5nZXRTaG93TGluZU51bWJlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2hvd0xpbmVOdW1iZXJzfSx0aGlzLiRzaG93Rm9sZFdpZGdldHM9ITAsdGhpcy5zZXRTaG93Rm9sZFdpZGdldHM9ZnVuY3Rpb24oZSl7ZT9yLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2ZvbGRpbmctZW5hYmxlZCIpOnIucmVtb3ZlQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfZm9sZGluZy1lbmFibGVkIiksdGhpcy4kc2hvd0ZvbGRXaWRnZXRzPWUsdGhpcy4kcGFkZGluZz1udWxsfSx0aGlzLmdldFNob3dGb2xkV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzaG93Rm9sZFdpZGdldHN9LHRoaXMuJGNvbXB1dGVQYWRkaW5nPWZ1bmN0aW9uKCl7aWYoIXRoaXMuZWxlbWVudC5maXJzdENoaWxkKXJldHVybntsZWZ0OjAscmlnaHQ6MH07dmFyIGU9ci5jb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudC5maXJzdENoaWxkKTtyZXR1cm4gdGhpcy4kcGFkZGluZz17fSx0aGlzLiRwYWRkaW5nLmxlZnQ9KHBhcnNlSW50KGUuYm9yZGVyTGVmdFdpZHRoKXx8MCkrKHBhcnNlSW50KGUucGFkZGluZ0xlZnQpfHwwKSsxLHRoaXMuJHBhZGRpbmcucmlnaHQ9KHBhcnNlSW50KGUuYm9yZGVyUmlnaHRXaWR0aCl8fDApKyhwYXJzZUludChlLnBhZGRpbmdSaWdodCl8fDApLHRoaXMuJHBhZGRpbmd9LHRoaXMuZ2V0UmVnaW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJHBhZGRpbmd8fHRoaXMuJGNvbXB1dGVQYWRkaW5nKCksbj10aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoZS54PHQubGVmdCtuLmxlZnQpcmV0dXJuIm1hcmtlcnMiO2lmKHRoaXMuJHNob3dGb2xkV2lkZ2V0cyYmZS54Pm4ucmlnaHQtdC5yaWdodClyZXR1cm4iZm9sZFdpZGdldHMifX0pLmNhbGwoYS5wcm90b3R5cGUpLHQuR3V0dGVyPWF9KSxhY2UuZGVmaW5lKCJhY2UvbGF5ZXIvbWFya2VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL3JhbmdlIikuUmFuZ2UsaT1lKCIuLi9saWIvZG9tIikscz1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQ9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX21hcmtlci1sYXllciIsZS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpfTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxuLHIpe3JldHVybihlPzE6MCl8KHQ/MjowKXwobj80OjApfChyPzg6MCl9dGhpcy4kcGFkZGluZz0wLHRoaXMuc2V0UGFkZGluZz1mdW5jdGlvbihlKXt0aGlzLiRwYWRkaW5nPWV9LHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb249ZX0sdGhpcy5zZXRNYXJrZXJzPWZ1bmN0aW9uKGUpe3RoaXMubWFya2Vycz1lfSx0aGlzLmVsdD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuaSE9LTEmJnRoaXMuZWxlbWVudC5jaGlsZE5vZGVzW3RoaXMuaV07bj90aGlzLmkrKzoobj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQobiksdGhpcy5pPS0xKSxuLnN0eWxlLmNzc1RleHQ9dCxuLmNsYXNzTmFtZT1lfSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihlKXtpZighZSlyZXR1cm47dGhpcy5jb25maWc9ZSx0aGlzLmk9MDt2YXIgdDtmb3IodmFyIG4gaW4gdGhpcy5tYXJrZXJzKXt2YXIgcj10aGlzLm1hcmtlcnNbbl07aWYoIXIucmFuZ2Upe3IudXBkYXRlKHQsdGhpcyx0aGlzLnNlc3Npb24sZSk7Y29udGludWV9dmFyIGk9ci5yYW5nZS5jbGlwUm93cyhlLmZpcnN0Um93LGUubGFzdFJvdyk7aWYoaS5pc0VtcHR5KCkpY29udGludWU7aT1pLnRvU2NyZWVuUmFuZ2UodGhpcy5zZXNzaW9uKTtpZihyLnJlbmRlcmVyKXt2YXIgcz10aGlzLiRnZXRUb3AoaS5zdGFydC5yb3csZSksbz10aGlzLiRwYWRkaW5nK2kuc3RhcnQuY29sdW1uKmUuY2hhcmFjdGVyV2lkdGg7ci5yZW5kZXJlcih0LGksbyxzLGUpfWVsc2Ugci50eXBlPT0iZnVsbExpbmUiP3RoaXMuZHJhd0Z1bGxMaW5lTWFya2VyKHQsaSxyLmNsYXp6LGUpOnIudHlwZT09InNjcmVlbkxpbmUiP3RoaXMuZHJhd1NjcmVlbkxpbmVNYXJrZXIodCxpLHIuY2xhenosZSk6aS5pc011bHRpTGluZSgpP3IudHlwZT09InRleHQiP3RoaXMuZHJhd1RleHRNYXJrZXIodCxpLHIuY2xhenosZSk6dGhpcy5kcmF3TXVsdGlMaW5lTWFya2VyKHQsaSxyLmNsYXp6LGUpOnRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIodCxpLHIuY2xhenorIiBhY2Vfc3RhcnQiKyIgYWNlX2JyMTUiLGUpfWlmKHRoaXMuaSE9LTEpd2hpbGUodGhpcy5pPHRoaXMuZWxlbWVudC5jaGlsZEVsZW1lbnRDb3VudCl0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50Lmxhc3RDaGlsZCl9LHRoaXMuJGdldFRvcD1mdW5jdGlvbihlLHQpe3JldHVybihlLXQuZmlyc3RSb3dTY3JlZW4pKnQubGluZUhlaWdodH0sdGhpcy5kcmF3VGV4dE1hcmtlcj1mdW5jdGlvbih0LG4saSxzLG8pe3ZhciB1PXRoaXMuc2Vzc2lvbixhPW4uc3RhcnQucm93LGY9bi5lbmQucm93LGw9YSxjPTAsaD0wLHA9dS5nZXRTY3JlZW5MYXN0Um93Q29sdW1uKGwpLGQ9bmV3IHIobCxuLnN0YXJ0LmNvbHVtbixsLGgpO2Zvcig7bDw9ZjtsKyspZC5zdGFydC5yb3c9ZC5lbmQucm93PWwsZC5zdGFydC5jb2x1bW49bD09YT9uLnN0YXJ0LmNvbHVtbjp1LmdldFJvd1dyYXBJbmRlbnQobCksZC5lbmQuY29sdW1uPXAsYz1oLGg9cCxwPWwrMTxmP3UuZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbihsKzEpOmw9PWY/MDpuLmVuZC5jb2x1bW4sdGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlcih0LGQsaSsobD09YT8iIGFjZV9zdGFydCI6IiIpKyIgYWNlX2JyIitlKGw9PWF8fGw9PWErMSYmbi5zdGFydC5jb2x1bW4sYzxoLGg+cCxsPT1mKSxzLGw9PWY/MDoxLG8pfSx0aGlzLmRyYXdNdWx0aUxpbmVNYXJrZXI9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz10aGlzLiRwYWRkaW5nLG89ci5saW5lSGVpZ2h0LHU9dGhpcy4kZ2V0VG9wKHQuc3RhcnQucm93LHIpLGE9cyt0LnN0YXJ0LmNvbHVtbipyLmNoYXJhY3RlcldpZHRoO2k9aXx8IiI7aWYodGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5pc0JpZGlSb3codC5zdGFydC5yb3cpKXt2YXIgZj10LmNsb25lKCk7Zi5lbmQucm93PWYuc3RhcnQucm93LGYuZW5kLmNvbHVtbj10aGlzLnNlc3Npb24uZ2V0TGluZShmLnN0YXJ0LnJvdykubGVuZ3RoLHRoaXMuZHJhd0JpZGlTaW5nbGVMaW5lTWFya2VyKGUsZixuKyIgYWNlX2JyMSBhY2Vfc3RhcnQiLHIsbnVsbCxpKX1lbHNlIHRoaXMuZWx0KG4rIiBhY2VfYnIxIGFjZV9zdGFydCIsImhlaWdodDoiK28rInB4OyIrInJpZ2h0OjA7IisidG9wOiIrdSsicHg7bGVmdDoiK2ErInB4OyIrKGl8fCIiKSk7aWYodGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5pc0JpZGlSb3codC5lbmQucm93KSl7dmFyIGY9dC5jbG9uZSgpO2Yuc3RhcnQucm93PWYuZW5kLnJvdyxmLnN0YXJ0LmNvbHVtbj0wLHRoaXMuZHJhd0JpZGlTaW5nbGVMaW5lTWFya2VyKGUsZixuKyIgYWNlX2JyMTIiLHIsbnVsbCxpKX1lbHNle3U9dGhpcy4kZ2V0VG9wKHQuZW5kLnJvdyxyKTt2YXIgbD10LmVuZC5jb2x1bW4qci5jaGFyYWN0ZXJXaWR0aDt0aGlzLmVsdChuKyIgYWNlX2JyMTIiLCJoZWlnaHQ6IitvKyJweDsiKyJ3aWR0aDoiK2wrInB4OyIrInRvcDoiK3UrInB4OyIrImxlZnQ6IitzKyJweDsiKyhpfHwiIikpfW89KHQuZW5kLnJvdy10LnN0YXJ0LnJvdy0xKSpyLmxpbmVIZWlnaHQ7aWYobzw9MClyZXR1cm47dT10aGlzLiRnZXRUb3AodC5zdGFydC5yb3crMSxyKTt2YXIgYz0odC5zdGFydC5jb2x1bW4/MTowKXwodC5lbmQuY29sdW1uPzA6OCk7dGhpcy5lbHQobisoYz8iIGFjZV9iciIrYzoiIiksImhlaWdodDoiK28rInB4OyIrInJpZ2h0OjA7IisidG9wOiIrdSsicHg7IisibGVmdDoiK3MrInB4OyIrKGl8fCIiKSl9LHRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXI9ZnVuY3Rpb24oZSx0LG4scixpLHMpe2lmKHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KHQuc3RhcnQucm93KSlyZXR1cm4gdGhpcy5kcmF3QmlkaVNpbmdsZUxpbmVNYXJrZXIoZSx0LG4scixpLHMpO3ZhciBvPXIubGluZUhlaWdodCx1PSh0LmVuZC5jb2x1bW4rKGl8fDApLXQuc3RhcnQuY29sdW1uKSpyLmNoYXJhY3RlcldpZHRoLGE9dGhpcy4kZ2V0VG9wKHQuc3RhcnQucm93LHIpLGY9dGhpcy4kcGFkZGluZyt0LnN0YXJ0LmNvbHVtbipyLmNoYXJhY3RlcldpZHRoO3RoaXMuZWx0KG4sImhlaWdodDoiK28rInB4OyIrIndpZHRoOiIrdSsicHg7IisidG9wOiIrYSsicHg7IisibGVmdDoiK2YrInB4OyIrKHN8fCIiKSl9LHRoaXMuZHJhd0JpZGlTaW5nbGVMaW5lTWFya2VyPWZ1bmN0aW9uKGUsdCxuLHIsaSxzKXt2YXIgbz1yLmxpbmVIZWlnaHQsdT10aGlzLiRnZXRUb3AodC5zdGFydC5yb3csciksYT10aGlzLiRwYWRkaW5nLGY9dGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5nZXRTZWxlY3Rpb25zKHQuc3RhcnQuY29sdW1uLHQuZW5kLmNvbHVtbik7Zi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RoaXMuZWx0KG4sImhlaWdodDoiK28rInB4OyIrIndpZHRoOiIrZS53aWR0aCsoaXx8MCkrInB4OyIrInRvcDoiK3UrInB4OyIrImxlZnQ6IisoYStlLmxlZnQpKyJweDsiKyhzfHwiIikpfSx0aGlzKX0sdGhpcy5kcmF3RnVsbExpbmVNYXJrZXI9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz10aGlzLiRnZXRUb3AodC5zdGFydC5yb3csciksbz1yLmxpbmVIZWlnaHQ7dC5zdGFydC5yb3chPXQuZW5kLnJvdyYmKG8rPXRoaXMuJGdldFRvcCh0LmVuZC5yb3csciktcyksdGhpcy5lbHQobiwiaGVpZ2h0OiIrbysicHg7IisidG9wOiIrcysicHg7IisibGVmdDowO3JpZ2h0OjA7IisoaXx8IiIpKX0sdGhpcy5kcmF3U2NyZWVuTGluZU1hcmtlcj1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXRoaXMuJGdldFRvcCh0LnN0YXJ0LnJvdyxyKSxvPXIubGluZUhlaWdodDt0aGlzLmVsdChuLCJoZWlnaHQ6IitvKyJweDsiKyJ0b3A6IitzKyJweDsiKyJsZWZ0OjA7cmlnaHQ6MDsiKyhpfHwiIikpfX0pLmNhbGwocy5wcm90b3R5cGUpLHQuTWFya2VyPXN9KSxhY2UuZGVmaW5lKCJhY2UvbGF5ZXIvdGV4dCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2xhbmciLCJhY2UvbGF5ZXIvbGluZXMiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4uL2xpYi9kb20iKSxzPWUoIi4uL2xpYi9sYW5nIiksbz1lKCIuL2xpbmVzIikuTGluZXMsdT1lKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixhPWZ1bmN0aW9uKGUpe3RoaXMuZG9tPWksdGhpcy5lbGVtZW50PXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfdGV4dC1sYXllciIsZS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpLHRoaXMuJHVwZGF0ZUVvbENoYXI9dGhpcy4kdXBkYXRlRW9sQ2hhci5iaW5kKHRoaXMpLHRoaXMuJGxpbmVzPW5ldyBvKHRoaXMuZWxlbWVudCl9OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMsdSksdGhpcy5FT0ZfQ0hBUj0iXHUwMGI2Iix0aGlzLkVPTF9DSEFSX0xGPSJcdTAwYWMiLHRoaXMuRU9MX0NIQVJfQ1JMRj0iXHUwMGE0Iix0aGlzLkVPTF9DSEFSPXRoaXMuRU9MX0NIQVJfTEYsdGhpcy5UQUJfQ0hBUj0iXHUyMDE0Iix0aGlzLlNQQUNFX0NIQVI9Ilx1MDBiNyIsdGhpcy4kcGFkZGluZz0wLHRoaXMuTUFYX0xJTkVfTEVOR1RIPTFlNCx0aGlzLiR1cGRhdGVFb2xDaGFyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmRvYyx0PWUuZ2V0TmV3TGluZUNoYXJhY3RlcigpPT0iXG4iJiZlLmdldE5ld0xpbmVNb2RlKCkhPSJ3aW5kb3dzIixuPXQ/dGhpcy5FT0xfQ0hBUl9MRjp0aGlzLkVPTF9DSEFSX0NSTEY7aWYodGhpcy5FT0xfQ0hBUiE9bilyZXR1cm4gdGhpcy5FT0xfQ0hBUj1uLCEwfSx0aGlzLnNldFBhZGRpbmc9ZnVuY3Rpb24oZSl7dGhpcy4kcGFkZGluZz1lLHRoaXMuZWxlbWVudC5zdHlsZS5tYXJnaW49IjAgIitlKyJweCJ9LHRoaXMuZ2V0TGluZUhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRmb250TWV0cmljcy4kY2hhcmFjdGVyU2l6ZS5oZWlnaHR8fDB9LHRoaXMuZ2V0Q2hhcmFjdGVyV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZm9udE1ldHJpY3MuJGNoYXJhY3RlclNpemUud2lkdGh8fDB9LHRoaXMuJHNldEZvbnRNZXRyaWNzPWZ1bmN0aW9uKGUpe3RoaXMuJGZvbnRNZXRyaWNzPWUsdGhpcy4kZm9udE1ldHJpY3Mub24oImNoYW5nZUNoYXJhY3RlclNpemUiLGZ1bmN0aW9uKGUpe3RoaXMuX3NpZ25hbCgiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIsZSl9LmJpbmQodGhpcykpLHRoaXMuJHBvbGxTaXplQ2hhbmdlcygpfSx0aGlzLmNoZWNrRm9yU2l6ZUNoYW5nZXM9ZnVuY3Rpb24oKXt0aGlzLiRmb250TWV0cmljcy5jaGVja0ZvclNpemVDaGFuZ2VzKCl9LHRoaXMuJHBvbGxTaXplQ2hhbmdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lcj10aGlzLiRmb250TWV0cmljcy4kcG9sbFNpemVDaGFuZ2VzKCl9LHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb249ZSxlJiZ0aGlzLiRjb21wdXRlVGFiU3RyaW5nKCl9LHRoaXMuc2hvd0ludmlzaWJsZXM9ITEsdGhpcy5zZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zaG93SW52aXNpYmxlcz09ZT8hMToodGhpcy5zaG93SW52aXNpYmxlcz1lLHRoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKSwhMCl9LHRoaXMuZGlzcGxheUluZGVudEd1aWRlcz0hMCx0aGlzLnNldERpc3BsYXlJbmRlbnRHdWlkZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZGlzcGxheUluZGVudEd1aWRlcz09ZT8hMToodGhpcy5kaXNwbGF5SW5kZW50R3VpZGVzPWUsdGhpcy4kY29tcHV0ZVRhYlN0cmluZygpLCEwKX0sdGhpcy4kdGFiU3RyaW5ncz1bXSx0aGlzLm9uQ2hhbmdlVGFiU2l6ZT10aGlzLiRjb21wdXRlVGFiU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmdldFRhYlNpemUoKTt0aGlzLnRhYlNpemU9ZTt2YXIgdD10aGlzLiR0YWJTdHJpbmdzPVswXTtmb3IodmFyIG49MTtuPGUrMTtuKyspaWYodGhpcy5zaG93SW52aXNpYmxlcyl7dmFyIHI9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO3IuY2xhc3NOYW1lPSJhY2VfaW52aXNpYmxlIGFjZV9pbnZpc2libGVfdGFiIixyLnRleHRDb250ZW50PXMuc3RyaW5nUmVwZWF0KHRoaXMuVEFCX0NIQVIsbiksdC5wdXNoKHIpfWVsc2UgdC5wdXNoKHRoaXMuZG9tLmNyZWF0ZVRleHROb2RlKHMuc3RyaW5nUmVwZWF0KCIgIixuKSx0aGlzLmVsZW1lbnQpKTtpZih0aGlzLmRpc3BsYXlJbmRlbnRHdWlkZXMpe3RoaXMuJGluZGVudEd1aWRlUmU9L1xzXFN8IFx0fFx0IHxccyQvO3ZhciBpPSJhY2VfaW5kZW50LWd1aWRlIixvPSIiLHU9IiI7aWYodGhpcy5zaG93SW52aXNpYmxlcyl7aSs9IiBhY2VfaW52aXNpYmxlIixvPSIgYWNlX2ludmlzaWJsZV9zcGFjZSIsdT0iIGFjZV9pbnZpc2libGVfdGFiIjt2YXIgYT1zLnN0cmluZ1JlcGVhdCh0aGlzLlNQQUNFX0NIQVIsdGhpcy50YWJTaXplKSxmPXMuc3RyaW5nUmVwZWF0KHRoaXMuVEFCX0NIQVIsdGhpcy50YWJTaXplKX1lbHNlIHZhciBhPXMuc3RyaW5nUmVwZWF0KCIgIix0aGlzLnRhYlNpemUpLGY9YTt2YXIgcj10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7ci5jbGFzc05hbWU9aStvLHIudGV4dENvbnRlbnQ9YSx0aGlzLiR0YWJTdHJpbmdzWyIgIl09cjt2YXIgcj10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7ci5jbGFzc05hbWU9aSt1LHIudGV4dENvbnRlbnQ9Zix0aGlzLiR0YWJTdHJpbmdzWyIJIl09cn19LHRoaXMudXBkYXRlTGluZXM9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuY29uZmlnLmxhc3RSb3chPWUubGFzdFJvd3x8dGhpcy5jb25maWcuZmlyc3RSb3chPWUuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO3RoaXMuY29uZmlnPWU7dmFyIHI9TWF0aC5tYXgodCxlLmZpcnN0Um93KSxpPU1hdGgubWluKG4sZS5sYXN0Um93KSxzPXRoaXMuZWxlbWVudC5jaGlsZE5vZGVzLG89MDtmb3IodmFyIHU9ZS5maXJzdFJvdzt1PHI7dSsrKXt2YXIgYT10aGlzLnNlc3Npb24uZ2V0Rm9sZExpbmUodSk7aWYoYSl7aWYoYS5jb250YWluc1JvdyhyKSl7cj1hLnN0YXJ0LnJvdzticmVha311PWEuZW5kLnJvd31vKyt9dmFyIGY9ITEsdT1yLGE9dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZSh1KSxsPWE/YS5zdGFydC5yb3c6SW5maW5pdHk7Zm9yKDs7KXt1PmwmJih1PWEuZW5kLnJvdysxLGE9dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZSh1LGEpLGw9YT9hLnN0YXJ0LnJvdzpJbmZpbml0eSk7aWYodT5pKWJyZWFrO3ZhciBjPXNbbysrXTtpZihjKXt0aGlzLmRvbS5yZW1vdmVDaGlsZHJlbihjKSx0aGlzLiRyZW5kZXJMaW5lKGMsdSx1PT1sP2E6ITEpLGYmJihjLnN0eWxlLnRvcD10aGlzLiRsaW5lcy5jb21wdXRlTGluZVRvcCh1LGUsdGhpcy5zZXNzaW9uKSsicHgiKTt2YXIgaD1lLmxpbmVIZWlnaHQqdGhpcy5zZXNzaW9uLmdldFJvd0xlbmd0aCh1KSsicHgiO2Muc3R5bGUuaGVpZ2h0IT1oJiYoZj0hMCxjLnN0eWxlLmhlaWdodD1oKX11Kyt9aWYoZil3aGlsZShvPHRoaXMuJGxpbmVzLmNlbGxzLmxlbmd0aCl7dmFyIHA9dGhpcy4kbGluZXMuY2VsbHNbbysrXTtwLmVsZW1lbnQuc3R5bGUudG9wPXRoaXMuJGxpbmVzLmNvbXB1dGVMaW5lVG9wKHAucm93LGUsdGhpcy5zZXNzaW9uKSsicHgifX0sdGhpcy5zY3JvbGxMaW5lcz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNvbmZpZzt0aGlzLmNvbmZpZz1lO2lmKHRoaXMuJGxpbmVzLnBhZ2VDaGFuZ2VkKHQsZSkpcmV0dXJuIHRoaXMudXBkYXRlKGUpO3RoaXMuJGxpbmVzLm1vdmVDb250YWluZXIoZSk7dmFyIG49ZS5sYXN0Um93LHI9dD90Lmxhc3RSb3c6LTE7aWYoIXR8fHI8ZS5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7aWYobjx0LmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTtpZighdHx8dC5sYXN0Um93PGUuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO2lmKGUubGFzdFJvdzx0LmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTtpZih0LmZpcnN0Um93PGUuZmlyc3RSb3cpZm9yKHZhciBpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkZWRSb3dDb3VudCh0LmZpcnN0Um93LGUuZmlyc3RSb3ctMSk7aT4wO2ktLSl0aGlzLiRsaW5lcy5zaGlmdCgpO2lmKHQubGFzdFJvdz5lLmxhc3RSb3cpZm9yKHZhciBpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkZWRSb3dDb3VudChlLmxhc3RSb3crMSx0Lmxhc3RSb3cpO2k+MDtpLS0pdGhpcy4kbGluZXMucG9wKCk7ZS5maXJzdFJvdzx0LmZpcnN0Um93JiZ0aGlzLiRsaW5lcy51bnNoaWZ0KHRoaXMuJHJlbmRlckxpbmVzRnJhZ21lbnQoZSxlLmZpcnN0Um93LHQuZmlyc3RSb3ctMSkpLGUubGFzdFJvdz50Lmxhc3RSb3cmJnRoaXMuJGxpbmVzLnB1c2godGhpcy4kcmVuZGVyTGluZXNGcmFnbWVudChlLHQubGFzdFJvdysxLGUubGFzdFJvdykpfSx0aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxzPXQsbz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKHMpLHU9bz9vLnN0YXJ0LnJvdzpJbmZpbml0eTtmb3IoOzspe3M+dSYmKHM9by5lbmQucm93KzEsbz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKHMsbyksdT1vP28uc3RhcnQucm93OkluZmluaXR5KTtpZihzPm4pYnJlYWs7dmFyIGE9dGhpcy4kbGluZXMuY3JlYXRlQ2VsbChzLGUsdGhpcy5zZXNzaW9uKSxmPWEuZWxlbWVudDt0aGlzLmRvbS5yZW1vdmVDaGlsZHJlbihmKSxpLnNldFN0eWxlKGYuc3R5bGUsImhlaWdodCIsdGhpcy4kbGluZXMuY29tcHV0ZUxpbmVIZWlnaHQocyxlLHRoaXMuc2Vzc2lvbikrInB4IiksaS5zZXRTdHlsZShmLnN0eWxlLCJ0b3AiLHRoaXMuJGxpbmVzLmNvbXB1dGVMaW5lVG9wKHMsZSx0aGlzLnNlc3Npb24pKyJweCIpLHRoaXMuJHJlbmRlckxpbmUoZixzLHM9PXU/bzohMSksdGhpcy4kdXNlTGluZUdyb3VwcygpP2YuY2xhc3NOYW1lPSJhY2VfbGluZV9ncm91cCI6Zi5jbGFzc05hbWU9ImFjZV9saW5lIixyLnB1c2goYSkscysrfXJldHVybiByfSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLiRsaW5lcy5tb3ZlQ29udGFpbmVyKGUpLHRoaXMuY29uZmlnPWU7dmFyIHQ9ZS5maXJzdFJvdyxuPWUubGFzdFJvdyxyPXRoaXMuJGxpbmVzO3doaWxlKHIuZ2V0TGVuZ3RoKCkpci5wb3AoKTtyLnB1c2godGhpcy4kcmVuZGVyTGluZXNGcmFnbWVudChlLHQsbikpfSx0aGlzLiR0ZXh0VG9rZW49e3RleHQ6ITAscnBhcmVuOiEwLGxwYXJlbjohMH0sdGhpcy4kcmVuZGVyVG9rZW49ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcyxvPS8oXHQpfCggKyl8KFtceDAwLVx4MWZceDgwLVx4YTBceGFkXHUxNjgwXHUxODBFXHUyMDAwLVx1MjAwZlx1MjAyOFx1MjAyOVx1MjAyRlx1MjA1Rlx1RkVGRlx1RkZGOS1cdUZGRkNdKyl8KFx1MzAwMCl8KFtcdTExMDAtXHUxMTVGXHUxMUEzLVx1MTFBN1x1MTFGQS1cdTExRkZcdTIzMjktXHUyMzJBXHUyRTgwLVx1MkU5OVx1MkU5Qi1cdTJFRjNcdTJGMDAtXHUyRkQ1XHUyRkYwLVx1MkZGQlx1MzAwMS1cdTMwM0VcdTMwNDEtXHUzMDk2XHUzMDk5LVx1MzBGRlx1MzEwNS1cdTMxMkRcdTMxMzEtXHUzMThFXHUzMTkwLVx1MzFCQVx1MzFDMC1cdTMxRTNcdTMxRjAtXHUzMjFFXHUzMjIwLVx1MzI0N1x1MzI1MC1cdTMyRkVcdTMzMDAtXHU0REJGXHU0RTAwLVx1QTQ4Q1x1QTQ5MC1cdUE0QzZcdUE5NjAtXHVBOTdDXHVBQzAwLVx1RDdBM1x1RDdCMC1cdUQ3QzZcdUQ3Q0ItXHVEN0ZCXHVGOTAwLVx1RkFGRlx1RkUxMC1cdUZFMTlcdUZFMzAtXHVGRTUyXHVGRTU0LVx1RkU2Nlx1RkU2OC1cdUZFNkJcdUZGMDEtXHVGRjYwXHVGRkUwLVx1RkZFNl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdKS9nLHU9dGhpcy5kb20uY3JlYXRlRnJhZ21lbnQodGhpcy5lbGVtZW50KSxhLGY9MDt3aGlsZShhPW8uZXhlYyhyKSl7dmFyIGw9YVsxXSxjPWFbMl0saD1hWzNdLHA9YVs0XSxkPWFbNV07aWYoIWkuc2hvd0ludmlzaWJsZXMmJmMpY29udGludWU7dmFyIHY9ZiE9YS5pbmRleD9yLnNsaWNlKGYsYS5pbmRleCk6IiI7Zj1hLmluZGV4K2FbMF0ubGVuZ3RoLHYmJnUuYXBwZW5kQ2hpbGQodGhpcy5kb20uY3JlYXRlVGV4dE5vZGUodix0aGlzLmVsZW1lbnQpKTtpZihsKXt2YXIgbT1pLnNlc3Npb24uZ2V0U2NyZWVuVGFiU2l6ZSh0K2EuaW5kZXgpO3UuYXBwZW5kQ2hpbGQoaS4kdGFiU3RyaW5nc1ttXS5jbG9uZU5vZGUoITApKSx0Kz1tLTF9ZWxzZSBpZihjKWlmKGkuc2hvd0ludmlzaWJsZXMpe3ZhciBnPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtnLmNsYXNzTmFtZT0iYWNlX2ludmlzaWJsZSBhY2VfaW52aXNpYmxlX3NwYWNlIixnLnRleHRDb250ZW50PXMuc3RyaW5nUmVwZWF0KGkuU1BBQ0VfQ0hBUixjLmxlbmd0aCksdS5hcHBlbmRDaGlsZChnKX1lbHNlIHUuYXBwZW5kQ2hpbGQodGhpcy5jb20uY3JlYXRlVGV4dE5vZGUoYyx0aGlzLmVsZW1lbnQpKTtlbHNlIGlmKGgpe3ZhciBnPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtnLmNsYXNzTmFtZT0iYWNlX2ludmlzaWJsZSBhY2VfaW52aXNpYmxlX3NwYWNlIGFjZV9pbnZhbGlkIixnLnRleHRDb250ZW50PXMuc3RyaW5nUmVwZWF0KGkuU1BBQ0VfQ0hBUixoLmxlbmd0aCksdS5hcHBlbmRDaGlsZChnKX1lbHNlIGlmKHApe3QrPTE7dmFyIGc9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO2cuc3R5bGUud2lkdGg9aS5jb25maWcuY2hhcmFjdGVyV2lkdGgqMisicHgiLGcuY2xhc3NOYW1lPWkuc2hvd0ludmlzaWJsZXM/ImFjZV9jamsgYWNlX2ludmlzaWJsZSBhY2VfaW52aXNpYmxlX3NwYWNlIjoiYWNlX2NqayIsZy50ZXh0Q29udGVudD1pLnNob3dJbnZpc2libGVzP2kuU1BBQ0VfQ0hBUjpwLHUuYXBwZW5kQ2hpbGQoZyl9ZWxzZSBpZihkKXt0Kz0xO3ZhciBnPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtnLnN0eWxlLndpZHRoPWkuY29uZmlnLmNoYXJhY3RlcldpZHRoKjIrInB4IixnLmNsYXNzTmFtZT0iYWNlX2NqayIsZy50ZXh0Q29udGVudD1kLHUuYXBwZW5kQ2hpbGQoZyl9fXUuYXBwZW5kQ2hpbGQodGhpcy5kb20uY3JlYXRlVGV4dE5vZGUoZj9yLnNsaWNlKGYpOnIsdGhpcy5lbGVtZW50KSk7aWYoIXRoaXMuJHRleHRUb2tlbltuLnR5cGVdKXt2YXIgeT0iYWNlXyIrbi50eXBlLnJlcGxhY2UoL1wuL2csIiBhY2VfIiksZz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7bi50eXBlPT0iZm9sZCImJihnLnN0eWxlLndpZHRoPW4udmFsdWUubGVuZ3RoKnRoaXMuY29uZmlnLmNoYXJhY3RlcldpZHRoKyJweCIpLGcuY2xhc3NOYW1lPXksZy5hcHBlbmRDaGlsZCh1KSxlLmFwcGVuZENoaWxkKGcpfWVsc2UgZS5hcHBlbmRDaGlsZCh1KTtyZXR1cm4gdCtyLmxlbmd0aH0sdGhpcy5yZW5kZXJJbmRlbnRHdWlkZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5zZWFyY2godGhpcy4kaW5kZW50R3VpZGVSZSk7aWYocjw9MHx8cj49bilyZXR1cm4gdDtpZih0WzBdPT0iICIpe3ItPXIldGhpcy50YWJTaXplO3ZhciBpPXIvdGhpcy50YWJTaXplO2Zvcih2YXIgcz0wO3M8aTtzKyspZS5hcHBlbmRDaGlsZCh0aGlzLiR0YWJTdHJpbmdzWyIgIl0uY2xvbmVOb2RlKCEwKSk7cmV0dXJuIHQuc3Vic3RyKHIpfWlmKHRbMF09PSIJIil7Zm9yKHZhciBzPTA7czxyO3MrKyllLmFwcGVuZENoaWxkKHRoaXMuJHRhYlN0cmluZ3NbIgkiXS5jbG9uZU5vZGUoITApKTtyZXR1cm4gdC5zdWJzdHIocil9cmV0dXJuIHR9LHRoaXMuJGNyZWF0ZUxpbmVFbGVtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiB0LmNsYXNzTmFtZT0iYWNlX2xpbmUiLHQuc3R5bGUuaGVpZ2h0PXRoaXMuY29uZmlnLmxpbmVIZWlnaHQrInB4Iix0fSx0aGlzLiRyZW5kZXJXcmFwcGVkTGluZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9MCxpPTAsbz1uWzBdLHU9MCxhPXRoaXMuJGNyZWF0ZUxpbmVFbGVtZW50KCk7ZS5hcHBlbmRDaGlsZChhKTtmb3IodmFyIGY9MDtmPHQubGVuZ3RoO2YrKyl7dmFyIGw9dFtmXSxjPWwudmFsdWU7aWYoZj09MCYmdGhpcy5kaXNwbGF5SW5kZW50R3VpZGVzKXtyPWMubGVuZ3RoLGM9dGhpcy5yZW5kZXJJbmRlbnRHdWlkZShhLGMsbyk7aWYoIWMpY29udGludWU7ci09Yy5sZW5ndGh9aWYocitjLmxlbmd0aDxvKXU9dGhpcy4kcmVuZGVyVG9rZW4oYSx1LGwsYykscis9Yy5sZW5ndGg7ZWxzZXt3aGlsZShyK2MubGVuZ3RoPj1vKXU9dGhpcy4kcmVuZGVyVG9rZW4oYSx1LGwsYy5zdWJzdHJpbmcoMCxvLXIpKSxjPWMuc3Vic3RyaW5nKG8tcikscj1vLGE9dGhpcy4kY3JlYXRlTGluZUVsZW1lbnQoKSxlLmFwcGVuZENoaWxkKGEpLGEuYXBwZW5kQ2hpbGQodGhpcy5kb20uY3JlYXRlVGV4dE5vZGUocy5zdHJpbmdSZXBlYXQoIlx1MDBhMCIsbi5pbmRlbnQpLHRoaXMuZWxlbWVudCkpLGkrKyx1PTAsbz1uW2ldfHxOdW1iZXIuTUFYX1ZBTFVFO2MubGVuZ3RoIT0wJiYocis9Yy5sZW5ndGgsdT10aGlzLiRyZW5kZXJUb2tlbihhLHUsbCxjKSl9fW5bbi5sZW5ndGgtMV0+dGhpcy5NQVhfTElORV9MRU5HVEgmJnRoaXMuJHJlbmRlck92ZXJmbG93TWVzc2FnZShhLHUsbnVsbCwiIiwhMCl9LHRoaXMuJHJlbmRlclNpbXBsZUxpbmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI9dFswXSxpPXIudmFsdWU7dGhpcy5kaXNwbGF5SW5kZW50R3VpZGVzJiYoaT10aGlzLnJlbmRlckluZGVudEd1aWRlKGUsaSkpLGkmJihuPXRoaXMuJHJlbmRlclRva2VuKGUsbixyLGkpKTtmb3IodmFyIHM9MTtzPHQubGVuZ3RoO3MrKyl7cj10W3NdLGk9ci52YWx1ZTtpZihuK2kubGVuZ3RoPnRoaXMuTUFYX0xJTkVfTEVOR1RIKXJldHVybiB0aGlzLiRyZW5kZXJPdmVyZmxvd01lc3NhZ2UoZSxuLHIsaSk7bj10aGlzLiRyZW5kZXJUb2tlbihlLG4scixpKX19LHRoaXMuJHJlbmRlck92ZXJmbG93TWVzc2FnZT1mdW5jdGlvbihlLHQsbixyLGkpe24mJnRoaXMuJHJlbmRlclRva2VuKGUsdCxuLHIuc2xpY2UoMCx0aGlzLk1BWF9MSU5FX0xFTkdUSC10KSk7dmFyIHM9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO3MuY2xhc3NOYW1lPSJhY2VfaW5saW5lX2J1dHRvbiBhY2Vfa2V5d29yZCBhY2VfdG9nZ2xlX3dyYXAiLHMudGV4dENvbnRlbnQ9aT8iPGhpZGU+IjoiPGNsaWNrIHRvIHNlZSBtb3JlLi4uPiIsZS5hcHBlbmRDaGlsZChzKX0sdGhpcy4kcmVuZGVyTGluZT1mdW5jdGlvbihlLHQsbil7IW4mJm4hPTAmJihuPXRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZSh0KSk7aWYobil2YXIgcj10aGlzLiRnZXRGb2xkTGluZVRva2Vucyh0LG4pO2Vsc2UgdmFyIHI9dGhpcy5zZXNzaW9uLmdldFRva2Vucyh0KTt2YXIgaT1lO2lmKHIubGVuZ3RoKXt2YXIgcz10aGlzLnNlc3Npb24uZ2V0Um93U3BsaXREYXRhKHQpO2lmKHMmJnMubGVuZ3RoKXt0aGlzLiRyZW5kZXJXcmFwcGVkTGluZShlLHIscyk7dmFyIGk9ZS5sYXN0Q2hpbGR9ZWxzZXt2YXIgaT1lO3RoaXMuJHVzZUxpbmVHcm91cHMoKSYmKGk9dGhpcy4kY3JlYXRlTGluZUVsZW1lbnQoKSxlLmFwcGVuZENoaWxkKGkpKSx0aGlzLiRyZW5kZXJTaW1wbGVMaW5lKGkscil9fWVsc2UgdGhpcy4kdXNlTGluZUdyb3VwcygpJiYoaT10aGlzLiRjcmVhdGVMaW5lRWxlbWVudCgpLGUuYXBwZW5kQ2hpbGQoaSkpO2lmKHRoaXMuc2hvd0ludmlzaWJsZXMmJmkpe24mJih0PW4uZW5kLnJvdyk7dmFyIG89dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO28uY2xhc3NOYW1lPSJhY2VfaW52aXNpYmxlIGFjZV9pbnZpc2libGVfZW9sIixvLnRleHRDb250ZW50PXQ9PXRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKS0xP3RoaXMuRU9GX0NIQVI6dGhpcy5FT0xfQ0hBUixpLmFwcGVuZENoaWxkKG8pfX0sdGhpcy4kZ2V0Rm9sZExpbmVUb2tlbnM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBpKGUsdCxuKXt2YXIgaT0wLHM9MDt3aGlsZShzK2VbaV0udmFsdWUubGVuZ3RoPHQpe3MrPWVbaV0udmFsdWUubGVuZ3RoLGkrKztpZihpPT1lLmxlbmd0aClyZXR1cm59aWYocyE9dCl7dmFyIG89ZVtpXS52YWx1ZS5zdWJzdHJpbmcodC1zKTtvLmxlbmd0aD5uLXQmJihvPW8uc3Vic3RyaW5nKDAsbi10KSksci5wdXNoKHt0eXBlOmVbaV0udHlwZSx2YWx1ZTpvfSkscz10K28ubGVuZ3RoLGkrPTF9d2hpbGUoczxuJiZpPGUubGVuZ3RoKXt2YXIgbz1lW2ldLnZhbHVlO28ubGVuZ3RoK3M+bj9yLnB1c2goe3R5cGU6ZVtpXS50eXBlLHZhbHVlOm8uc3Vic3RyaW5nKDAsbi1zKX0pOnIucHVzaChlW2ldKSxzKz1vLmxlbmd0aCxpKz0xfX12YXIgbj10aGlzLnNlc3Npb24scj1bXSxzPW4uZ2V0VG9rZW5zKGUpO3JldHVybiB0LndhbGsoZnVuY3Rpb24oZSx0LG8sdSxhKXtlIT1udWxsP3IucHVzaCh7dHlwZToiZm9sZCIsdmFsdWU6ZX0pOihhJiYocz1uLmdldFRva2Vucyh0KSkscy5sZW5ndGgmJmkocyx1LG8pKX0sdC5lbmQucm93LHRoaXMuc2Vzc2lvbi5nZXRMaW5lKHQuZW5kLnJvdykubGVuZ3RoKSxyfSx0aGlzLiR1c2VMaW5lR3JvdXBzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRVc2VXcmFwTW9kZSgpfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9fSkuY2FsbChhLnByb3RvdHlwZSksdC5UZXh0PWF9KSxhY2UuZGVmaW5lKCJhY2UvbGF5ZXIvY3Vyc29yIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9kb20iKSxpPWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudD1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfY3Vyc29yLWxheWVyIixlLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy5pc1Zpc2libGU9ITEsdGhpcy5pc0JsaW5raW5nPSEwLHRoaXMuYmxpbmtJbnRlcnZhbD0xZTMsdGhpcy5zbW9vdGhCbGlua2luZz0hMSx0aGlzLmN1cnNvcnM9W10sdGhpcy5jdXJzb3I9dGhpcy5hZGRDdXJzb3IoKSxyLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2hpZGRlbi1jdXJzb3JzIiksdGhpcy4kdXBkYXRlQ3Vyc29ycz10aGlzLiR1cGRhdGVPcGFjaXR5LmJpbmQodGhpcyl9OyhmdW5jdGlvbigpe3RoaXMuJHVwZGF0ZU9wYWNpdHk9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jdXJzb3JzO2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KXIuc2V0U3R5bGUodFtuXS5zdHlsZSwib3BhY2l0eSIsZT8iIjoiMCIpfSx0aGlzLiRzdGFydENzc0FuaW1hdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuY3Vyc29ycztmb3IodmFyIHQ9ZS5sZW5ndGg7dC0tOyllW3RdLnN0eWxlLmFuaW1hdGlvbkR1cmF0aW9uPXRoaXMuYmxpbmtJbnRlcnZhbCsibXMiO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2FuaW1hdGUtYmxpbmtpbmciKX0uYmluZCh0aGlzKSl9LHRoaXMuJHN0b3BDc3NBbmltYXRpb249ZnVuY3Rpb24oKXtyLnJlbW92ZUNzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2FuaW1hdGUtYmxpbmtpbmciKX0sdGhpcy4kcGFkZGluZz0wLHRoaXMuc2V0UGFkZGluZz1mdW5jdGlvbihlKXt0aGlzLiRwYWRkaW5nPWV9LHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb249ZX0sdGhpcy5zZXRCbGlua2luZz1mdW5jdGlvbihlKXtlIT10aGlzLmlzQmxpbmtpbmcmJih0aGlzLmlzQmxpbmtpbmc9ZSx0aGlzLnJlc3RhcnRUaW1lcigpKX0sdGhpcy5zZXRCbGlua0ludGVydmFsPWZ1bmN0aW9uKGUpe2UhPXRoaXMuYmxpbmtJbnRlcnZhbCYmKHRoaXMuYmxpbmtJbnRlcnZhbD1lLHRoaXMucmVzdGFydFRpbWVyKCkpfSx0aGlzLnNldFNtb290aEJsaW5raW5nPWZ1bmN0aW9uKGUpe2UhPXRoaXMuc21vb3RoQmxpbmtpbmcmJih0aGlzLnNtb290aEJsaW5raW5nPWUsci5zZXRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9zbW9vdGgtYmxpbmtpbmciLGUpLHRoaXMuJHVwZGF0ZUN1cnNvcnMoITApLHRoaXMucmVzdGFydFRpbWVyKCkpfSx0aGlzLmFkZEN1cnNvcj1mdW5jdGlvbigpe3ZhciBlPXIuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGUuY2xhc3NOYW1lPSJhY2VfY3Vyc29yIix0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoZSksdGhpcy5jdXJzb3JzLnB1c2goZSksZX0sdGhpcy5yZW1vdmVDdXJzb3I9ZnVuY3Rpb24oKXtpZih0aGlzLmN1cnNvcnMubGVuZ3RoPjEpe3ZhciBlPXRoaXMuY3Vyc29ycy5wb3AoKTtyZXR1cm4gZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLGV9fSx0aGlzLmhpZGVDdXJzb3I9ZnVuY3Rpb24oKXt0aGlzLmlzVmlzaWJsZT0hMSxyLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2hpZGRlbi1jdXJzb3JzIiksdGhpcy5yZXN0YXJ0VGltZXIoKX0sdGhpcy5zaG93Q3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy5pc1Zpc2libGU9ITAsci5yZW1vdmVDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9oaWRkZW4tY3Vyc29ycyIpLHRoaXMucmVzdGFydFRpbWVyKCl9LHRoaXMucmVzdGFydFRpbWVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kdXBkYXRlQ3Vyc29ycztjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCksY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKSx0aGlzLiRzdG9wQ3NzQW5pbWF0aW9uKCksdGhpcy5zbW9vdGhCbGlua2luZyYmci5yZW1vdmVDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9zbW9vdGgtYmxpbmtpbmciKSxlKCEwKTtpZighdGhpcy5pc0JsaW5raW5nfHwhdGhpcy5ibGlua0ludGVydmFsfHwhdGhpcy5pc1Zpc2libGUpe3RoaXMuJHN0b3BDc3NBbmltYXRpb24oKTtyZXR1cm59dGhpcy5zbW9vdGhCbGlua2luZyYmc2V0VGltZW91dChmdW5jdGlvbigpe3IuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2Vfc21vb3RoLWJsaW5raW5nIil9LmJpbmQodGhpcykpO2lmKHIuSEFTX0NTU19BTklNQVRJT04pdGhpcy4kc3RhcnRDc3NBbmltYXRpb24oKTtlbHNle3ZhciB0PWZ1bmN0aW9uKCl7dGhpcy50aW1lb3V0SWQ9c2V0VGltZW91dChmdW5jdGlvbigpe2UoITEpfSwuNip0aGlzLmJsaW5rSW50ZXJ2YWwpfS5iaW5kKHRoaXMpO3RoaXMuaW50ZXJ2YWxJZD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2UoITApLHQoKX0sdGhpcy5ibGlua0ludGVydmFsKSx0KCl9fSx0aGlzLmdldFBpeGVsUG9zaXRpb249ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5jb25maWd8fCF0aGlzLnNlc3Npb24pcmV0dXJue2xlZnQ6MCx0b3A6MH07ZXx8KGU9dGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5nZXRDdXJzb3IoKSk7dmFyIG49dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihlKSxyPXRoaXMuJHBhZGRpbmcrKHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KG4ucm93LGUucm93KT90aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmdldFBvc0xlZnQobi5jb2x1bW4pOm4uY29sdW1uKnRoaXMuY29uZmlnLmNoYXJhY3RlcldpZHRoKSxpPShuLnJvdy0odD90aGlzLmNvbmZpZy5maXJzdFJvd1NjcmVlbjowKSkqdGhpcy5jb25maWcubGluZUhlaWdodDtyZXR1cm57bGVmdDpyLHRvcDppfX0sdGhpcy5pc0N1cnNvckluVmlldz1mdW5jdGlvbihlLHQpe3JldHVybiBlLnRvcD49MCYmZS50b3A8dC5tYXhIZWlnaHR9LHRoaXMudXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMuY29uZmlnPWU7dmFyIHQ9dGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzLG49MCxpPTA7aWYodD09PXVuZGVmaW5lZHx8dC5sZW5ndGg9PT0wKXQ9W3tjdXJzb3I6bnVsbH1dO2Zvcih2YXIgbj0wLHM9dC5sZW5ndGg7bjxzO24rKyl7dmFyIG89dGhpcy5nZXRQaXhlbFBvc2l0aW9uKHRbbl0uY3Vyc29yLCEwKTtpZigoby50b3A+ZS5oZWlnaHQrZS5vZmZzZXR8fG8udG9wPDApJiZuPjEpY29udGludWU7dmFyIHU9dGhpcy5jdXJzb3JzW2krK118fHRoaXMuYWRkQ3Vyc29yKCksYT11LnN0eWxlO3RoaXMuZHJhd0N1cnNvcj90aGlzLmRyYXdDdXJzb3IodSxvLGUsdFtuXSx0aGlzLnNlc3Npb24pOnRoaXMuaXNDdXJzb3JJblZpZXcobyxlKT8oci5zZXRTdHlsZShhLCJkaXNwbGF5IiwiYmxvY2siKSxyLnRyYW5zbGF0ZSh1LG8ubGVmdCxvLnRvcCksci5zZXRTdHlsZShhLCJ3aWR0aCIsTWF0aC5yb3VuZChlLmNoYXJhY3RlcldpZHRoKSsicHgiKSxyLnNldFN0eWxlKGEsImhlaWdodCIsZS5saW5lSGVpZ2h0KyJweCIpKTpyLnNldFN0eWxlKGEsImRpc3BsYXkiLCJub25lIil9d2hpbGUodGhpcy5jdXJzb3JzLmxlbmd0aD5pKXRoaXMucmVtb3ZlQ3Vyc29yKCk7dmFyIGY9dGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpO3RoaXMuJHNldE92ZXJ3cml0ZShmKSx0aGlzLiRwaXhlbFBvcz1vLHRoaXMucmVzdGFydFRpbWVyKCl9LHRoaXMuZHJhd0N1cnNvcj1udWxsLHRoaXMuJHNldE92ZXJ3cml0ZT1mdW5jdGlvbihlKXtlIT10aGlzLm92ZXJ3cml0ZSYmKHRoaXMub3ZlcndyaXRlPWUsZT9yLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX292ZXJ3cml0ZS1jdXJzb3JzIik6ci5yZW1vdmVDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9vdmVyd3JpdGUtY3Vyc29ycyIpKX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpLGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCl9fSkuY2FsbChpLnByb3RvdHlwZSksdC5DdXJzb3I9aX0pLGFjZS5kZWZpbmUoImFjZS9zY3JvbGxiYXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9kb20iKSxzPWUoIi4vbGliL2V2ZW50Iiksbz1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHU9MzI3NjgsYT1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQ9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2Vfc2Nyb2xsYmFyIGFjZV9zY3JvbGxiYXIiK3RoaXMuY2xhc3NTdWZmaXgsdGhpcy5pbm5lcj1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuaW5uZXIuY2xhc3NOYW1lPSJhY2Vfc2Nyb2xsYmFyLWlubmVyIix0aGlzLmlubmVyLnRleHRDb250ZW50PSJcdTAwYTAiLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmlubmVyKSxlLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy5zZXRWaXNpYmxlKCExKSx0aGlzLnNraXBFdmVudD0hMSxzLmFkZExpc3RlbmVyKHRoaXMuZWxlbWVudCwic2Nyb2xsIix0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcykpLHMuYWRkTGlzdGVuZXIodGhpcy5lbGVtZW50LCJtb3VzZWRvd24iLHMucHJldmVudERlZmF1bHQpfTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLG8pLHRoaXMuc2V0VmlzaWJsZT1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheT1lPyIiOiJub25lIix0aGlzLmlzVmlzaWJsZT1lLHRoaXMuY29lZmY9MX19KS5jYWxsKGEucHJvdG90eXBlKTt2YXIgZj1mdW5jdGlvbihlLHQpe2EuY2FsbCh0aGlzLGUpLHRoaXMuc2Nyb2xsVG9wPTAsdGhpcy5zY3JvbGxIZWlnaHQ9MCx0LiRzY3JvbGxiYXJXaWR0aD10aGlzLndpZHRoPWkuc2Nyb2xsYmFyV2lkdGgoZS5vd25lckRvY3VtZW50KSx0aGlzLmlubmVyLnN0eWxlLndpZHRoPXRoaXMuZWxlbWVudC5zdHlsZS53aWR0aD0odGhpcy53aWR0aHx8MTUpKzUrInB4Iix0aGlzLiRtaW5XaWR0aD0wfTtyLmluaGVyaXRzKGYsYSksZnVuY3Rpb24oKXt0aGlzLmNsYXNzU3VmZml4PSItdiIsdGhpcy5vblNjcm9sbD1mdW5jdGlvbigpe2lmKCF0aGlzLnNraXBFdmVudCl7dGhpcy5zY3JvbGxUb3A9dGhpcy5lbGVtZW50LnNjcm9sbFRvcDtpZih0aGlzLmNvZWZmIT0xKXt2YXIgZT10aGlzLmVsZW1lbnQuY2xpZW50SGVpZ2h0L3RoaXMuc2Nyb2xsSGVpZ2h0O3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wKigxLWUpLyh0aGlzLmNvZWZmLWUpfXRoaXMuX2VtaXQoInNjcm9sbCIse2RhdGE6dGhpcy5zY3JvbGxUb3B9KX10aGlzLnNraXBFdmVudD0hMX0sdGhpcy5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1heCh0aGlzLmlzVmlzaWJsZT90aGlzLndpZHRoOjAsdGhpcy4kbWluV2lkdGh8fDApfSx0aGlzLnNldEhlaWdodD1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0PWUrInB4In0sdGhpcy5zZXRJbm5lckhlaWdodD10aGlzLnNldFNjcm9sbEhlaWdodD1mdW5jdGlvbihlKXt0aGlzLnNjcm9sbEhlaWdodD1lLGU+dT8odGhpcy5jb2VmZj11L2UsZT11KTp0aGlzLmNvZWZmIT0xJiYodGhpcy5jb2VmZj0xKSx0aGlzLmlubmVyLnN0eWxlLmhlaWdodD1lKyJweCJ9LHRoaXMuc2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKGUpe3RoaXMuc2Nyb2xsVG9wIT1lJiYodGhpcy5za2lwRXZlbnQ9ITAsdGhpcy5zY3JvbGxUb3A9ZSx0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wPWUqdGhpcy5jb2VmZil9fS5jYWxsKGYucHJvdG90eXBlKTt2YXIgbD1mdW5jdGlvbihlLHQpe2EuY2FsbCh0aGlzLGUpLHRoaXMuc2Nyb2xsTGVmdD0wLHRoaXMuaGVpZ2h0PXQuJHNjcm9sbGJhcldpZHRoLHRoaXMuaW5uZXIuc3R5bGUuaGVpZ2h0PXRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQ9KHRoaXMuaGVpZ2h0fHwxNSkrNSsicHgifTtyLmluaGVyaXRzKGwsYSksZnVuY3Rpb24oKXt0aGlzLmNsYXNzU3VmZml4PSItaCIsdGhpcy5vblNjcm9sbD1mdW5jdGlvbigpe3RoaXMuc2tpcEV2ZW50fHwodGhpcy5zY3JvbGxMZWZ0PXRoaXMuZWxlbWVudC5zY3JvbGxMZWZ0LHRoaXMuX2VtaXQoInNjcm9sbCIse2RhdGE6dGhpcy5zY3JvbGxMZWZ0fSkpLHRoaXMuc2tpcEV2ZW50PSExfSx0aGlzLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzVmlzaWJsZT90aGlzLmhlaWdodDowfSx0aGlzLnNldFdpZHRoPWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudC5zdHlsZS53aWR0aD1lKyJweCJ9LHRoaXMuc2V0SW5uZXJXaWR0aD1mdW5jdGlvbihlKXt0aGlzLmlubmVyLnN0eWxlLndpZHRoPWUrInB4In0sdGhpcy5zZXRTY3JvbGxXaWR0aD1mdW5jdGlvbihlKXt0aGlzLmlubmVyLnN0eWxlLndpZHRoPWUrInB4In0sdGhpcy5zZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKGUpe3RoaXMuc2Nyb2xsTGVmdCE9ZSYmKHRoaXMuc2tpcEV2ZW50PSEwLHRoaXMuc2Nyb2xsTGVmdD10aGlzLmVsZW1lbnQuc2Nyb2xsTGVmdD1lKX19LmNhbGwobC5wcm90b3R5cGUpLHQuU2Nyb2xsQmFyPWYsdC5TY3JvbGxCYXJWPWYsdC5TY3JvbGxCYXJIPWwsdC5WU2Nyb2xsQmFyPWYsdC5IU2Nyb2xsQmFyPWx9KSxhY2UuZGVmaW5lKCJhY2UvcmVuZGVybG9vcCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL2V2ZW50IiksaT1mdW5jdGlvbihlLHQpe3RoaXMub25SZW5kZXI9ZSx0aGlzLnBlbmRpbmc9ITEsdGhpcy5jaGFuZ2VzPTAsdGhpcy4kcmVjdXJzaW9uTGltaXQ9Mix0aGlzLndpbmRvdz10fHx3aW5kb3c7dmFyIG49dGhpczt0aGlzLl9mbHVzaD1mdW5jdGlvbihlKXtuLnBlbmRpbmc9ITE7dmFyIHQ9bi5jaGFuZ2VzO3QmJihyLmJsb2NrSWRsZSgxMDApLG4uY2hhbmdlcz0wLG4ub25SZW5kZXIodCkpO2lmKG4uY2hhbmdlcyl7aWYobi4kcmVjdXJzaW9uTGltaXQtLTwwKXJldHVybjtuLnNjaGVkdWxlKCl9ZWxzZSBuLiRyZWN1cnNpb25MaW1pdD0yfX07KGZ1bmN0aW9uKCl7dGhpcy5zY2hlZHVsZT1mdW5jdGlvbihlKXt0aGlzLmNoYW5nZXM9dGhpcy5jaGFuZ2VzfGUsdGhpcy5jaGFuZ2VzJiYhdGhpcy5wZW5kaW5nJiYoci5uZXh0RnJhbWUodGhpcy5fZmx1c2gpLHRoaXMucGVuZGluZz0hMCl9LHRoaXMuY2xlYXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jaGFuZ2VzO3JldHVybiB0aGlzLmNoYW5nZXM9MCx0fX0pLmNhbGwoaS5wcm90b3R5cGUpLHQuUmVuZGVyTG9vcD1pfSksYWNlLmRlZmluZSgiYWNlL2xheWVyL2ZvbnRfbWV0cmljcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vbGliL29vcCIpLGk9ZSgiLi4vbGliL2RvbSIpLHM9ZSgiLi4vbGliL2xhbmciKSxvPWUoIi4uL2xpYi9ldmVudCIpLHU9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLGE9ZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsZj0yNTYsbD10eXBlb2YgUmVzaXplT2JzZXJ2ZXI9PSJmdW5jdGlvbiIsYz0yMDAsaD10LkZvbnRNZXRyaWNzPWZ1bmN0aW9uKGUpe3RoaXMuZWw9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRzZXRNZWFzdXJlTm9kZVN0eWxlcyh0aGlzLmVsLnN0eWxlLCEwKSx0aGlzLiRtYWluPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kc2V0TWVhc3VyZU5vZGVTdHlsZXModGhpcy4kbWFpbi5zdHlsZSksdGhpcy4kbWVhc3VyZU5vZGU9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRzZXRNZWFzdXJlTm9kZVN0eWxlcyh0aGlzLiRtZWFzdXJlTm9kZS5zdHlsZSksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLiRtYWluKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMuJG1lYXN1cmVOb2RlKSxlLmFwcGVuZENoaWxkKHRoaXMuZWwpLHRoaXMuJG1lYXN1cmVOb2RlLmlubmVySFRNTD1zLnN0cmluZ1JlcGVhdCgiWCIsZiksdGhpcy4kY2hhcmFjdGVyU2l6ZT17d2lkdGg6MCxoZWlnaHQ6MH0sbD90aGlzLiRhZGRPYnNlcnZlcigpOnRoaXMuY2hlY2tGb3JTaXplQ2hhbmdlcygpfTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLGEpLHRoaXMuJGNoYXJhY3RlclNpemU9e3dpZHRoOjAsaGVpZ2h0OjB9LHRoaXMuJHNldE1lYXN1cmVOb2RlU3R5bGVzPWZ1bmN0aW9uKGUsdCl7ZS53aWR0aD1lLmhlaWdodD0iYXV0byIsZS5sZWZ0PWUudG9wPSIwcHgiLGUudmlzaWJpbGl0eT0iaGlkZGVuIixlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS53aGl0ZVNwYWNlPSJwcmUiLHUuaXNJRTw4P2VbImZvbnQtZmFtaWx5Il09ImluaGVyaXQiOmUuZm9udD0iaW5oZXJpdCIsZS5vdmVyZmxvdz10PyJoaWRkZW4iOiJ2aXNpYmxlIn0sdGhpcy5jaGVja0ZvclNpemVDaGFuZ2VzPWZ1bmN0aW9uKGUpe2U9PT11bmRlZmluZWQmJihlPXRoaXMuJG1lYXN1cmVTaXplcygpKTtpZihlJiYodGhpcy4kY2hhcmFjdGVyU2l6ZS53aWR0aCE9PWUud2lkdGh8fHRoaXMuJGNoYXJhY3RlclNpemUuaGVpZ2h0IT09ZS5oZWlnaHQpKXt0aGlzLiRtZWFzdXJlTm9kZS5zdHlsZS5mb250V2VpZ2h0PSJib2xkIjt2YXIgdD10aGlzLiRtZWFzdXJlU2l6ZXMoKTt0aGlzLiRtZWFzdXJlTm9kZS5zdHlsZS5mb250V2VpZ2h0PSIiLHRoaXMuJGNoYXJhY3RlclNpemU9ZSx0aGlzLmNoYXJTaXplcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuYWxsb3dCb2xkRm9udHM9dCYmdC53aWR0aD09PWUud2lkdGgmJnQuaGVpZ2h0PT09ZS5oZWlnaHQsdGhpcy5fZW1pdCgiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIse2RhdGE6ZX0pfX0sdGhpcy4kYWRkT2JzZXJ2ZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuJG9ic2VydmVyPW5ldyB3aW5kb3cuUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24odCl7dmFyIG49dFswXS5jb250ZW50UmVjdDtlLmNoZWNrRm9yU2l6ZUNoYW5nZXMoe2hlaWdodDpuLmhlaWdodCx3aWR0aDpuLndpZHRoL2Z9KX0pLHRoaXMuJG9ic2VydmVyLm9ic2VydmUodGhpcy4kbWVhc3VyZU5vZGUpfSx0aGlzLiRwb2xsU2l6ZUNoYW5nZXM9ZnVuY3Rpb24oKXtpZih0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lcnx8dGhpcy4kb2JzZXJ2ZXIpcmV0dXJuIHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyO3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyPW8ub25JZGxlKGZ1bmN0aW9uIHQoKXtlLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKSxvLm9uSWRsZSh0LDUwMCl9LDUwMCl9LHRoaXMuc2V0UG9sbGluZz1mdW5jdGlvbihlKXtlP3RoaXMuJHBvbGxTaXplQ2hhbmdlcygpOnRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyJiYoY2xlYXJJbnRlcnZhbCh0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lciksdGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXI9MCl9LHRoaXMuJG1lYXN1cmVTaXplcz1mdW5jdGlvbihlKXt2YXIgdD17aGVpZ2h0OihlfHx0aGlzLiRtZWFzdXJlTm9kZSkuY2xpZW50SGVpZ2h0LHdpZHRoOihlfHx0aGlzLiRtZWFzdXJlTm9kZSkuY2xpZW50V2lkdGgvZn07cmV0dXJuIHQud2lkdGg9PT0wfHx0LmhlaWdodD09PTA/bnVsbDp0fSx0aGlzLiRtZWFzdXJlQ2hhcldpZHRoPWZ1bmN0aW9uKGUpe3RoaXMuJG1haW4uaW5uZXJIVE1MPXMuc3RyaW5nUmVwZWF0KGUsZik7dmFyIHQ9dGhpcy4kbWFpbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gdC53aWR0aC9mfSx0aGlzLmdldENoYXJhY3RlcldpZHRoPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY2hhclNpemVzW2VdO3JldHVybiB0PT09dW5kZWZpbmVkJiYodD10aGlzLmNoYXJTaXplc1tlXT10aGlzLiRtZWFzdXJlQ2hhcldpZHRoKGUpL3RoaXMuJGNoYXJhY3RlclNpemUud2lkdGgpLHR9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwodGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXIpLHRoaXMuJG9ic2VydmVyJiZ0aGlzLiRvYnNlcnZlci5kaXNjb25uZWN0KCksdGhpcy5lbCYmdGhpcy5lbC5wYXJlbnROb2RlJiZ0aGlzLmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbCl9LHRoaXMuJGdldFpvb209ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdD8od2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuem9vbXx8MSkqZSh0LnBhcmVudEVsZW1lbnQpOjF9LHRoaXMuJGluaXRUcmFuc2Zvcm1NZWFzdXJlTm9kZXM9ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbihlLHQpe3JldHVyblsiZGl2Iix7c3R5bGU6InBvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6IitlKyJweDtsZWZ0OiIrdCsicHg7In1dfTt0aGlzLmVscz1pLmJ1aWxkRG9tKFtlKDAsMCksZShjLDApLGUoMCxjKSxlKGMsYyldLHRoaXMuZWwpfSx0aGlzLnRyYW5zZm9ybUNvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gcihlLHQsbil7dmFyIHI9ZVsxXSp0WzBdLWVbMF0qdFsxXTtyZXR1cm5bKC10WzFdKm5bMF0rdFswXSpuWzFdKS9yLCgrZVsxXSpuWzBdLWVbMF0qblsxXSkvcl19ZnVuY3Rpb24gaShlLHQpe3JldHVybltlWzBdLXRbMF0sZVsxXS10WzFdXX1mdW5jdGlvbiBzKGUsdCl7cmV0dXJuW2VbMF0rdFswXSxlWzFdK3RbMV1dfWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm5bZSp0WzBdLGUqdFsxXV19ZnVuY3Rpb24gdShlKXt2YXIgdD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVyblt0LmxlZnQsdC50b3BdfWlmKGUpe3ZhciBuPXRoaXMuJGdldFpvb20odGhpcy5lbCk7ZT1vKDEvbixlKX10aGlzLmVsc3x8dGhpcy4kaW5pdFRyYW5zZm9ybU1lYXN1cmVOb2RlcygpO3ZhciBhPXUodGhpcy5lbHNbMF0pLGY9dSh0aGlzLmVsc1sxXSksbD11KHRoaXMuZWxzWzJdKSxoPXUodGhpcy5lbHNbM10pLHA9cihpKGgsZiksaShoLGwpLGkocyhmLGwpLHMoaCxhKSkpLGQ9bygxK3BbMF0saShmLGEpKSx2PW8oMStwWzFdLGkobCxhKSk7aWYodCl7dmFyIG09dCxnPXBbMF0qbVswXS9jK3BbMV0qbVsxXS9jKzEseT1zKG8obVswXSxkKSxvKG1bMV0sdikpO3JldHVybiBzKG8oMS9nL2MseSksYSl9dmFyIGI9aShlLGEpLHc9cihpKGQsbyhwWzBdLGIpKSxpKHYsbyhwWzFdLGIpKSxiKTtyZXR1cm4gbyhjLHcpfX0pLmNhbGwoaC5wcm90b3R5cGUpfSksYWNlLmRlZmluZSgiYWNlL3ZpcnR1YWxfcmVuZGVyZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL2NvbmZpZyIsImFjZS9sYXllci9ndXR0ZXIiLCJhY2UvbGF5ZXIvbWFya2VyIiwiYWNlL2xheWVyL3RleHQiLCJhY2UvbGF5ZXIvY3Vyc29yIiwiYWNlL3Njcm9sbGJhciIsImFjZS9zY3JvbGxiYXIiLCJhY2UvcmVuZGVybG9vcCIsImFjZS9sYXllci9mb250X21ldHJpY3MiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9kb20iKSxzPWUoIi4vY29uZmlnIiksbz1lKCIuL2xheWVyL2d1dHRlciIpLkd1dHRlcix1PWUoIi4vbGF5ZXIvbWFya2VyIikuTWFya2VyLGE9ZSgiLi9sYXllci90ZXh0IikuVGV4dCxmPWUoIi4vbGF5ZXIvY3Vyc29yIikuQ3Vyc29yLGw9ZSgiLi9zY3JvbGxiYXIiKS5IU2Nyb2xsQmFyLGM9ZSgiLi9zY3JvbGxiYXIiKS5WU2Nyb2xsQmFyLGg9ZSgiLi9yZW5kZXJsb29wIikuUmVuZGVyTG9vcCxwPWUoIi4vbGF5ZXIvZm9udF9tZXRyaWNzIikuRm9udE1ldHJpY3MsZD1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHY9Jy5hY2VfYnIxIHtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4O30uYWNlX2JyMiB7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXMgICA6IDNweDt9LmFjZV9icjMge2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAgICAzcHg7fS5hY2VfYnI0IHtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4O30uYWNlX2JyNSB7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDt9LmFjZV9icjYge2JvcmRlci10b3AtcmlnaHQtcmFkaXVzICAgOiAzcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7fS5hY2VfYnI3IHtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogICAgM3B4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4O30uYWNlX2JyOCB7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyA6IDNweDt9LmFjZV9icjkge2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICAzcHg7fS5hY2VfYnIxMHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyAgIDogM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAgM3B4O30uYWNlX2JyMTF7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICAgIDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogIDNweDt9LmFjZV9icjEye2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICAzcHg7fS5hY2VfYnIxM3tib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAgM3B4O30uYWNlX2JyMTR7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXMgICA6IDNweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogIDNweDt9LmFjZV9icjE1e2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAgICAzcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDt9LmFjZV9lZGl0b3Ige3Bvc2l0aW9uOiByZWxhdGl2ZTtvdmVyZmxvdzogaGlkZGVuO2ZvbnQ6IDEycHgvbm9ybWFsIFwnTW9uYWNvXCcsIFwnTWVubG9cJywgXCdVYnVudHUgTW9ub1wnLCBcJ0NvbnNvbGFzXCcsIFwnc291cmNlLWNvZGUtcHJvXCcsIG1vbm9zcGFjZTtkaXJlY3Rpb246IGx0cjt0ZXh0LWFsaWduOiBsZWZ0Oy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTt9LmFjZV9zY3JvbGxlciB7cG9zaXRpb246IGFic29sdXRlO292ZXJmbG93OiBoaWRkZW47dG9wOiAwO2JvdHRvbTogMDtiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0Oy1tcy11c2VyLXNlbGVjdDogbm9uZTstbW96LXVzZXItc2VsZWN0OiBub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7dXNlci1zZWxlY3Q6IG5vbmU7Y3Vyc29yOiB0ZXh0O30uYWNlX2NvbnRlbnQge3Bvc2l0aW9uOiBhYnNvbHV0ZTtib3gtc2l6aW5nOiBib3JkZXItYm94O21pbi13aWR0aDogMTAwJTtjb250YWluOiBzdHlsZSBzaXplIGxheW91dDt9LmFjZV9kcmFnZ2luZyAuYWNlX3Njcm9sbGVyOmJlZm9yZXtwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiAwO2xlZnQ6IDA7cmlnaHQ6IDA7Ym90dG9tOiAwO2NvbnRlbnQ6IFwnXCc7YmFja2dyb3VuZDogcmdiYSgyNTAsIDI1MCwgMjUwLCAwLjAxKTt6LWluZGV4OiAxMDAwO30uYWNlX2RyYWdnaW5nLmFjZV9kYXJrIC5hY2Vfc2Nyb2xsZXI6YmVmb3Jle2JhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wMSk7fS5hY2Vfc2VsZWN0aW5nLCAuYWNlX3NlbGVjdGluZyAqIHtjdXJzb3I6IHRleHQgIWltcG9ydGFudDt9LmFjZV9ndXR0ZXIge3Bvc2l0aW9uOiBhYnNvbHV0ZTtvdmVyZmxvdyA6IGhpZGRlbjt3aWR0aDogYXV0bzt0b3A6IDA7Ym90dG9tOiAwO2xlZnQ6IDA7Y3Vyc29yOiBkZWZhdWx0O3otaW5kZXg6IDQ7LW1zLXVzZXItc2VsZWN0OiBub25lOy1tb3otdXNlci1zZWxlY3Q6IG5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTt1c2VyLXNlbGVjdDogbm9uZTtjb250YWluOiBzdHlsZSBzaXplIGxheW91dDt9LmFjZV9ndXR0ZXItYWN0aXZlLWxpbmUge3Bvc2l0aW9uOiBhYnNvbHV0ZTtsZWZ0OiAwO3JpZ2h0OiAwO30uYWNlX3Njcm9sbGVyLmFjZV9zY3JvbGwtbGVmdCB7Ym94LXNoYWRvdzogMTdweCAwIDE2cHggLTE2cHggcmdiYSgwLCAwLCAwLCAwLjQpIGluc2V0O30uYWNlX2d1dHRlci1jZWxsIHtwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiAwO2xlZnQ6IDA7cmlnaHQ6IDA7cGFkZGluZy1sZWZ0OiAxOXB4O3BhZGRpbmctcmlnaHQ6IDZweDtiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O30uYWNlX2d1dHRlci1jZWxsLmFjZV9lcnJvciB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQU1BQUFBb0xROVRBQUFCT0ZCTVZFWC8vLy8vLy8vL1FSc3dGQWIvVWk0d0ZBWXdGQVl3RkFhV0dBZkRSeW16T1NIL1B4c3dGQWIvU2lVd0ZBWXdGQWJVUFJ2alFpRGxsb2c1SGhIZFJ5YnNUaTMvVHl2OVRpcitTeWovVUMzLy8vL1h1cmViTUJJd0ZBYi9SU0hiUHgvZ1V6ZmR3TDNrek1pdktCQXdGQWJidmJuaFB4NjZOaG93RkFZd0ZBYVpKZzh3RkFheEtCRFp1cmYvUkI2bU14Yi9TQ013RkFZd0ZBYnhRQjMrUkI0d0ZBYi9RaHk0T2grNFFpZmJOUmN3RkFZd0ZBWXdGQWIvUVJ6ZE5oZ3dGQVl3RkFiYXY3di9VeTdvYUU2OE1CSzVMeExld3IvcjJOWGV3THN3RkFheEp3NHdGQWJrUFJ5MlB5WXdGQWF4S2hMbTF0TXdGQWF6UGlRd0ZBYVVHQWIvUUJyZk94M2J2cnYvVkMvbWFFNHdGQWJSUEJxNk1STzhReW5ldzhEcDJ0amZ3YjB3RkFieDZlanU1K2J5NnVuczR1SDkvZjM2K3ZyL0drSGpBQUFBWW5SU1RsTUFHdCs2NHJuV3UvYm84ZUFBNEluSDMrRHdvTjdqNGVMaTR4UDk5TmZnNCtiKy91OUIvZURzMU1EMW1PNys0UEhnMk1YYTM0N2c3dkRpek1MTjRlRytQdjdpNWV2cy92Nzl5dTdTMy9EVjcvNDk4WXYyNGVIKzR1ZlEzT3p1L3Y3K3kxM3NScXdBQUFETFNVUkJWSGphWmMvWERzRmdHSUJodERyc2hsaXRtazJJcmJIRnFMMnB2WGYvKzc4RFBva2o3K0Z6OXFwVS85VVhKSWxobVBhVGFRNlFQYXowbW0rNWd3a2dvdmNWNkdaemQ1SnRDUXdnc3hvSE92Sk8xNWtsZVJMQW5NZ0hGSUVTVUVQbWF3QjluZ21lbFR0aXB3d2ZBU2lseE9MeWlWNVVWVXlWQWZiRzBjQ1BIaWcrR0JrekFFTkhTMEFzdFZGNmJhY1pJT3pnTG14c0hidDJPZWNOZ0pDODNKRVJtZVBVWXE4QVJHa0p4Nlh0RnNkZGRCUWdaRTJuUFI2Q0lDWmhhd2pBNEZiL2NodiszOTlrZlIrTU1NREdPUUFBQUFCSlJVNUVya0pnZ2c9PSIpO2JhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjogMnB4IGNlbnRlcjt9LmFjZV9ndXR0ZXItY2VsbC5hY2Vfd2FybmluZyB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQU1BQUFBb0xROVRBQUFBbVZCTVZFWC8vLzhBQUFELy8vOEFBQUFBQUFCUFN6Yi81c0FBQUFCL2JsSC83M3ovdWxrQUFBQUFBQUQ4NXBrQUFBQUFBQUFDQWdQL3ZHei9ya0RlckdiR3JWNy9wa1FJQ0FmLy8vL2UwSXNBQUFEL29FRC9xVHZocm5VQUFBRC95SEQvbmpjQUFBRHV2MnIvbnovL29Uai9wMDY0b0dmL3pIQUFBQUE5TmlyL3RGSUFBQUQvdGxUaXVXZi90a0lBQUFDeW5YRUFBQUFBQUFBdElSVzd6QnBCQUFBQU0zUlNUbE1BQUJSMW03UlhPOExuMzFaMzZ6VCtuZVhlNU96b29SRGZuK1RaNHAzaDJoVGY0dDNrM3VjeXJOMUs1K1hha3M1MlNmczlDWGdyQUFBQWprbEVRVlI0Mm8zUGJRK0NJQlFGWUV3Ym9QaFNZZ29ZdW5JcXFMbjYvejh1WWRIOFZtZG51OXZ6NFd3WGdOL3hUUFJEMitzZ09jWmpzZ2Uvd2hYWmdVYVlZdlQ4UW51SmFVcmpySFVRcmVHY3p1RWFmUUNPL1NKVHVmVGJyb1dzUGdzbGxWaHEzd0pFazJqVVN6WDNDVUVESkM4NDcwN2RqUmM1TVRBUXhvTGd1cFdSd1c2VUI1ZlMrK05WOEFiT1pnbnNDN0JwRUFBQUFBQkpSVTVFcmtKZ2dnPT0iKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO30uYWNlX2d1dHRlci1jZWxsLmFjZV9pbmZvIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBQUFBQUE2bUtDOUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBQUowVWs1VEFBQjJrODA0QUFBQVBrbEVRVlFZMDJOZ0lCNjhRdU8zdGlMem5qQXdwS1RnTnlEYk1lZ3dpc0NIWlVFVFVaVjBacU9xdUJwWGoycnRucFNKVDFBRW5uUm1MMk9nR2dBQUlLa1JRYXAyaHRnQUFBQUFTVVZPUks1Q1lJST0iKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO30uYWNlX2RhcmsgLmFjZV9ndXR0ZXItY2VsbC5hY2VfaW5mbyB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFCQU1BQUFEdDNlSlNBQUFBSkZCTVZFVUFBQUNob2FHQWdJQXFLaXErdnI2dHJhMVpXVm1VbEpTYm01czhQRHh1Ym01NmVucmRnemczQUFBQUFYUlNUbE1BUU9iWVpnQUFBQ2xKUkVGVWVOcGpZTUFQZHNNWUhlZ3lKWkZRQmxzVWxNRlZDV1VZS2tBWk14WkFHZHhsRE1RQkFHK1RCUDRCNlJ5SkFBQUFBRWxGVGtTdVFtQ0MiKTt9LmFjZV9zY3JvbGxiYXIge2NvbnRhaW46IHN0cmljdDtwb3NpdGlvbjogYWJzb2x1dGU7cmlnaHQ6IDA7Ym90dG9tOiAwO3otaW5kZXg6IDY7fS5hY2Vfc2Nyb2xsYmFyLWlubmVyIHtwb3NpdGlvbjogYWJzb2x1dGU7Y3Vyc29yOiB0ZXh0O2xlZnQ6IDA7dG9wOiAwO30uYWNlX3Njcm9sbGJhci12e292ZXJmbG93LXg6IGhpZGRlbjtvdmVyZmxvdy15OiBzY3JvbGw7dG9wOiAwO30uYWNlX3Njcm9sbGJhci1oIHtvdmVyZmxvdy14OiBzY3JvbGw7b3ZlcmZsb3cteTogaGlkZGVuO2xlZnQ6IDA7fS5hY2VfcHJpbnQtbWFyZ2luIHtwb3NpdGlvbjogYWJzb2x1dGU7aGVpZ2h0OiAxMDAlO30uYWNlX3RleHQtaW5wdXQge3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiAwO3dpZHRoOiAwLjVlbTtoZWlnaHQ6IDFlbTtvcGFjaXR5OiAwO2JhY2tncm91bmQ6IHRyYW5zcGFyZW50Oy1tb3otYXBwZWFyYW5jZTogbm9uZTthcHBlYXJhbmNlOiBub25lO2JvcmRlcjogbm9uZTtyZXNpemU6IG5vbmU7b3V0bGluZTogbm9uZTtvdmVyZmxvdzogaGlkZGVuO2ZvbnQ6IGluaGVyaXQ7cGFkZGluZzogMCAxcHg7bWFyZ2luOiAwIC0xcHg7Y29udGFpbjogc3RyaWN0Oy1tcy11c2VyLXNlbGVjdDogdGV4dDstbW96LXVzZXItc2VsZWN0OiB0ZXh0Oy13ZWJraXQtdXNlci1zZWxlY3Q6IHRleHQ7dXNlci1zZWxlY3Q6IHRleHQ7d2hpdGUtc3BhY2U6IHByZSFpbXBvcnRhbnQ7fS5hY2VfdGV4dC1pbnB1dC5hY2VfY29tcG9zaXRpb24ge2JhY2tncm91bmQ6IHRyYW5zcGFyZW50O2NvbG9yOiBpbmhlcml0O3otaW5kZXg6IDEwMDA7b3BhY2l0eTogMTt9LmFjZV9jb21wb3NpdGlvbl9wbGFjZWhvbGRlciB7IGNvbG9yOiB0cmFuc3BhcmVudCB9LmFjZV9jb21wb3NpdGlvbl9tYXJrZXIgeyBib3JkZXItYm90dG9tOiAxcHggc29saWQ7cG9zaXRpb246IGFic29sdXRlO2JvcmRlci1yYWRpdXM6IDA7bWFyZ2luLXRvcDogMXB4O31bYWNlX25vY29udGV4dD10cnVlXSB7dHJhbnNmb3JtOiBub25lIWltcG9ydGFudDtmaWx0ZXI6IG5vbmUhaW1wb3J0YW50O3BlcnNwZWN0aXZlOiBub25lIWltcG9ydGFudDtjbGlwLXBhdGg6IG5vbmUhaW1wb3J0YW50O21hc2sgOiBub25lIWltcG9ydGFudDtjb250YWluOiBub25lIWltcG9ydGFudDtwZXJzcGVjdGl2ZTogbm9uZSFpbXBvcnRhbnQ7bWl4LWJsZW5kLW1vZGU6IGluaXRpYWwhaW1wb3J0YW50O3otaW5kZXg6IGF1dG87fS5hY2VfbGF5ZXIge3otaW5kZXg6IDE7cG9zaXRpb246IGFic29sdXRlO292ZXJmbG93OiBoaWRkZW47d29yZC13cmFwOiBub3JtYWw7d2hpdGUtc3BhY2U6IHByZTtoZWlnaHQ6IDEwMCU7d2lkdGg6IDEwMCU7Ym94LXNpemluZzogYm9yZGVyLWJveDtwb2ludGVyLWV2ZW50czogbm9uZTt9LmFjZV9ndXR0ZXItbGF5ZXIge3Bvc2l0aW9uOiByZWxhdGl2ZTt3aWR0aDogYXV0bzt0ZXh0LWFsaWduOiByaWdodDtwb2ludGVyLWV2ZW50czogYXV0bztoZWlnaHQ6IDEwMDAwMDBweDtjb250YWluOiBzdHlsZSBzaXplIGxheW91dDt9LmFjZV90ZXh0LWxheWVyIHtmb250OiBpbmhlcml0ICFpbXBvcnRhbnQ7cG9zaXRpb246IGFic29sdXRlO2hlaWdodDogMTAwMDAwMHB4O3dpZHRoOiAxMDAwMDAwcHg7Y29udGFpbjogc3R5bGUgc2l6ZSBsYXlvdXQ7fS5hY2VfdGV4dC1sYXllciA+IC5hY2VfbGluZSwgLmFjZV90ZXh0LWxheWVyID4gLmFjZV9saW5lX2dyb3VwIHtjb250YWluOiBzdHlsZSBzaXplIGxheW91dDtwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiAwO2xlZnQ6IDA7cmlnaHQ6IDA7fS5hY2VfaGlkcGkgLmFjZV90ZXh0LWxheWVyLC5hY2VfaGlkcGkgLmFjZV9ndXR0ZXItbGF5ZXIsLmFjZV9oaWRwaSAuYWNlX2NvbnRlbnQsLmFjZV9oaWRwaSAuYWNlX2d1dHRlciB7Y29udGFpbjogc3RyaWN0O3dpbGwtY2hhbmdlOiB0cmFuc2Zvcm07fS5hY2VfaGlkcGkgLmFjZV90ZXh0LWxheWVyID4gLmFjZV9saW5lLCAuYWNlX2hpZHBpIC5hY2VfdGV4dC1sYXllciA+IC5hY2VfbGluZV9ncm91cCB7Y29udGFpbjogc3RyaWN0O30uYWNlX2NqayB7ZGlzcGxheTogaW5saW5lLWJsb2NrO3RleHQtYWxpZ246IGNlbnRlcjt9LmFjZV9jdXJzb3ItbGF5ZXIge3otaW5kZXg6IDQ7fS5hY2VfY3Vyc29yIHt6LWluZGV4OiA0O3Bvc2l0aW9uOiBhYnNvbHV0ZTtib3gtc2l6aW5nOiBib3JkZXItYm94O2JvcmRlci1sZWZ0OiAycHggc29saWQ7dHJhbnNmb3JtOiB0cmFuc2xhdGV6KDApO30uYWNlX211bHRpc2VsZWN0IC5hY2VfY3Vyc29yIHtib3JkZXItbGVmdC13aWR0aDogMXB4O30uYWNlX3NsaW0tY3Vyc29ycyAuYWNlX2N1cnNvciB7Ym9yZGVyLWxlZnQtd2lkdGg6IDFweDt9LmFjZV9vdmVyd3JpdGUtY3Vyc29ycyAuYWNlX2N1cnNvciB7Ym9yZGVyLWxlZnQtd2lkdGg6IDA7Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO30uYWNlX2hpZGRlbi1jdXJzb3JzIC5hY2VfY3Vyc29yIHtvcGFjaXR5OiAwLjI7fS5hY2Vfc21vb3RoLWJsaW5raW5nIC5hY2VfY3Vyc29yIHt0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMThzO30uYWNlX2FuaW1hdGUtYmxpbmtpbmcgLmFjZV9jdXJzb3Ige2FuaW1hdGlvbi1kdXJhdGlvbjogMTAwMG1zO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHN0ZXAtZW5kO2FuaW1hdGlvbi1uYW1lOiBibGluay1hY2UtYW5pbWF0ZTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTt9LmFjZV9hbmltYXRlLWJsaW5raW5nLmFjZV9zbW9vdGgtYmxpbmtpbmcgLmFjZV9jdXJzb3Ige2FuaW1hdGlvbi1kdXJhdGlvbjogMTAwMG1zO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW4tb3V0O2FuaW1hdGlvbi1uYW1lOiBibGluay1hY2UtYW5pbWF0ZS1zbW9vdGg7fUBrZXlmcmFtZXMgYmxpbmstYWNlLWFuaW1hdGUge2Zyb20sIHRvIHsgb3BhY2l0eTogMTsgfTYwJSB7IG9wYWNpdHk6IDA7IH19QGtleWZyYW1lcyBibGluay1hY2UtYW5pbWF0ZS1zbW9vdGgge2Zyb20sIHRvIHsgb3BhY2l0eTogMTsgfTQ1JSB7IG9wYWNpdHk6IDE7IH02MCUgeyBvcGFjaXR5OiAwOyB9ODUlIHsgb3BhY2l0eTogMDsgfX0uYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAsIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RhY2sge3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiAzO30uYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDU7fS5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDY7fS5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlLWxpbmUge3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiAyO30uYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkLXdvcmQge3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiA0O2JveC1zaXppbmc6IGJvcmRlci1ib3g7fS5hY2VfbGluZSAuYWNlX2ZvbGQge2JveC1zaXppbmc6IGJvcmRlci1ib3g7ZGlzcGxheTogaW5saW5lLWJsb2NrO2hlaWdodDogMTFweDttYXJnaW4tdG9wOiAtMnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkVBQUFBSkNBWUFBQURVNk1jTUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBSnBKUkVGVWVOcGkvUC8vUHdPbGdBWEdZR1JrbEFWU29rRDhHbWp3WTF3YXNLbGpRcFlBQ3RwQ0ZlQURjSFZRZlF5TVFBd3p3QVpJM3dKS3ZDTGtmS0JhTVNDbEJsUjdCT1Fpa0NGR1FFRXJJSDBWcWthYmlHQ0Fxd1VhZEF6WkpSeFFyLzBnd2lYSWFsOHpRUVBuTlZUZ0oxVGRhd0wwVDVnQklQMU1VSk5oQnYySEtvUUhIanFOckE0V080elkwZ2x5TktMVDJLSWZJTUFBUXNkZ0dpWHZnbllBQUFBQVNVVk9SSzVDWUlJPSIpLHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUEzQ0FZQUFBRE5OaUE1QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFDSkpSRUZVZU5waStQLy9meGdUQXdQREJ4RHhEMDc4UlNYK1llRXlERk1DSU1BQUkzSU5tWGl3ZjJZQUFBQUFTVVZPUks1Q1lJST0iKTtiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0LCByZXBlYXQteDtiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyLCB0b3AgbGVmdDtjb2xvcjogdHJhbnNwYXJlbnQ7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7Ym9yZGVyLXJhZGl1czogMnB4O2N1cnNvcjogcG9pbnRlcjtwb2ludGVyLWV2ZW50czogYXV0bzt9LmFjZV9kYXJrIC5hY2VfZm9sZCB7fS5hY2VfZm9sZDpob3ZlcntiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCRUFBQUFKQ0FZQUFBRFU2TWNNQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFKcEpSRUZVZU5waS9QLy9Qd09sZ0FYR1lHUmtsQVZTb2tEOEdtandZMXdhc0tsalFwWUFDdHBDRmVBRGNIVlFmUXlNUUF3endBWkkzd0pLdkNMa2ZLQmFNU0NsQmxSN0JPUWlrQ0ZHUUVFcklIMFZxa2FiaUdDQXF3VWFkQXpaSlJ4UXIvMGd3aVhJYWw4elFRUG5OVlRnSjFUZGF3TDBUNWdCSVAxTVVKTmhCdjJIS29RSEhqcU5yQTRXTzR6WTBnbHlOS0xUMktJZklNQUFRc2RnR2lYdmduWUFBQUFBU1VWT1JLNUNZSUk9IiksdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQTNDQVlBQUFETk5pQTVBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUNCSlJFRlVlTnBpK1AvL2Z6NFRBd1BEWnhEeEQ1WDRpNWZMTUV3SmdBQURBRVBWRGJqTnc4N1pBQUFBQUVsRlRrU3VRbUNDIik7fS5hY2VfdG9vbHRpcCB7YmFja2dyb3VuZC1jb2xvcjogI0ZGRjtiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCB0cmFuc3BhcmVudCwgcmdiYSgwLCAwLCAwLCAwLjEpKTtib3JkZXI6IDFweCBzb2xpZCBncmF5O2JvcmRlci1yYWRpdXM6IDFweDtib3gtc2hhZG93OiAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjMpO2NvbG9yOiBibGFjazttYXgtd2lkdGg6IDEwMCU7cGFkZGluZzogM3B4IDRweDtwb3NpdGlvbjogZml4ZWQ7ei1pbmRleDogOTk5OTk5O2JveC1zaXppbmc6IGJvcmRlci1ib3g7Y3Vyc29yOiBkZWZhdWx0O3doaXRlLXNwYWNlOiBwcmU7d29yZC13cmFwOiBicmVhay13b3JkO2xpbmUtaGVpZ2h0OiBub3JtYWw7Zm9udC1zdHlsZTogbm9ybWFsO2ZvbnQtd2VpZ2h0OiBub3JtYWw7bGV0dGVyLXNwYWNpbmc6IG5vcm1hbDtwb2ludGVyLWV2ZW50czogbm9uZTt9LmFjZV9mb2xkaW5nLWVuYWJsZWQgPiAuYWNlX2d1dHRlci1jZWxsIHtwYWRkaW5nLXJpZ2h0OiAxM3B4O30uYWNlX2ZvbGQtd2lkZ2V0IHtib3gtc2l6aW5nOiBib3JkZXItYm94O21hcmdpbjogMCAtMTJweCAwIDFweDtkaXNwbGF5OiBub25lO3dpZHRoOiAxMXB4O3ZlcnRpY2FsLWFsaWduOiB0b3A7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFVQUFBQUZDQVlBQUFDTmJ5YmxBQUFBTkVsRVFWUjQybVdLc1EwQU1BekM4aXhMbHJ6UWp6bUJpRWpwMEE2V3dCQ1NQZ0tBWG9Ma3FTb3Q3bk4zeU13UjdwWjMyTnpwS2tWb0RCVXhLQUFBQUFCSlJVNUVya0pnZ2c9PSIpO2JhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO2JvcmRlci1yYWRpdXM6IDNweDtib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtjdXJzb3I6IHBvaW50ZXI7fS5hY2VfZm9sZGluZy1lbmFibGVkIC5hY2VfZm9sZC13aWRnZXQge2Rpc3BsYXk6IGlubGluZS1ibG9jazsgICB9LmFjZV9mb2xkLXdpZGdldC5hY2VfZW5kIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVVBQUFBRkNBWUFBQUNOYnlibEFBQUFORWxFUVZSNDJtM0h3UWtBTUFoRDBZenNSY2hGS0k3c0Fpa2VXa3J4d1NjRUIwbmg1ZTdLVFBXaW1aa2k0dFlmVmJYK01ObDRweVpYZWpVTzFRQUFBQUJKUlU1RXJrSmdnZz09Iik7fS5hY2VfZm9sZC13aWRnZXQuYWNlX2Nsb3NlZCB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFNQUFBQUdDQVlBQUFBRzVTUU1BQUFBT1VsRVFWUjQyalhLd1FrQU1BZ0R3S3dxS0Q0RXdRMjZzU09rVldqZ0lJSEF6UGlDZ2FxaXFuSkhabktJQ0JFUkhOMTk0TzViOXZiTHVBVlJMK2wwWVduWkFBQUFBRWxGVGtTdVFtQ0NYQT09Iik7fS5hY2VfZm9sZC13aWRnZXQ6aG92ZXIge2JvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4zKTtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7Ym94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTt9LmFjZV9mb2xkLXdpZGdldDphY3RpdmUge2JvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC40KTtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpO2JveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7fS5hY2VfZGFyayAuYWNlX2ZvbGQtd2lkZ2V0IHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVVBQUFBRkNBWUFBQUNOYnlibEFBQUFIa2xFUVZRSVcyUDQvLzgvQXpvR0VRN29HQ2FMTEFoV2lTd0IxNDZCQVFDU1RQWW9jcVQwQUFBQUFFbEZUa1N1UW1DQyIpO30uYWNlX2RhcmsgLmFjZV9mb2xkLXdpZGdldC5hY2VfZW5kIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVVBQUFBRkNBWUFBQUNOYnlibEFBQUFIMGxFUVZRSVcyUDQvLzgvQXhRN3dOaklBakRNZ0M0QXhqQ1ZLQmlySUFBRjBrejJybGh4cEFBQUFBQkpSVTVFcmtKZ2dnPT0iKTt9LmFjZV9kYXJrIC5hY2VfZm9sZC13aWRnZXQuYWNlX2Nsb3NlZCB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFNQUFBQUZDQVlBQUFDQWNWYWlBQUFBSEVsRVFWUUlXMlA0Ly8rL0F4QXpnREFEbE9PQXpuSEFLZ1BXQXdBUmppOFVJRFRmUVFBQUFBQkpSVTVFcmtKZ2dnPT0iKTt9LmFjZV9kYXJrIC5hY2VfZm9sZC13aWRnZXQ6aG92ZXIge2JveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7YmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpO30uYWNlX2RhcmsgLmFjZV9mb2xkLXdpZGdldDphY3RpdmUge2JveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7fS5hY2VfaW5saW5lX2J1dHRvbiB7Ym9yZGVyOiAxcHggc29saWQgbGlnaHRncmF5O2Rpc3BsYXk6IGlubGluZS1ibG9jazttYXJnaW46IC0xcHggOHB4O3BhZGRpbmc6IDAgNXB4O3BvaW50ZXItZXZlbnRzOiBhdXRvO2N1cnNvcjogcG9pbnRlcjt9LmFjZV9pbmxpbmVfYnV0dG9uOmhvdmVyIHtib3JkZXItY29sb3I6IGdyYXk7YmFja2dyb3VuZDogcmdiYSgyMDAsMjAwLDIwMCwwLjIpO2Rpc3BsYXk6IGlubGluZS1ibG9jaztwb2ludGVyLWV2ZW50czogYXV0bzt9LmFjZV9mb2xkLXdpZGdldC5hY2VfaW52YWxpZCB7YmFja2dyb3VuZC1jb2xvcjogI0ZGQjRCNDtib3JkZXItY29sb3I6ICNERTU1NTU7fS5hY2VfZmFkZS1mb2xkLXdpZGdldHMgLmFjZV9mb2xkLXdpZGdldCB7dHJhbnNpdGlvbjogb3BhY2l0eSAwLjRzIGVhc2UgMC4wNXM7b3BhY2l0eTogMDt9LmFjZV9mYWRlLWZvbGQtd2lkZ2V0czpob3ZlciAuYWNlX2ZvbGQtd2lkZ2V0IHt0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMDVzIGVhc2UgMC4wNXM7b3BhY2l0eToxO30uYWNlX3VuZGVybGluZSB7dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7fS5hY2VfYm9sZCB7Zm9udC13ZWlnaHQ6IGJvbGQ7fS5hY2Vfbm9ib2xkIC5hY2VfYm9sZCB7Zm9udC13ZWlnaHQ6IG5vcm1hbDt9LmFjZV9pdGFsaWMge2ZvbnQtc3R5bGU6IGl0YWxpYzt9LmFjZV9lcnJvci1tYXJrZXIge2JhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAwLCAwLDAuMik7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDk7fS5hY2VfaGlnaGxpZ2h0LW1hcmtlciB7YmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMCwwLjIpO3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiA4O30uYWNlX21vYmlsZS1tZW51IHtwb3NpdGlvbjogYWJzb2x1dGU7bGluZS1oZWlnaHQ6IDEuNTtib3JkZXItcmFkaXVzOiA0cHg7LW1zLXVzZXItc2VsZWN0OiBub25lOy1tb3otdXNlci1zZWxlY3Q6IG5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTt1c2VyLXNlbGVjdDogbm9uZTtiYWNrZ3JvdW5kOiB3aGl0ZTtib3gtc2hhZG93OiAxcHggM3B4IDJweCBncmV5O2JvcmRlcjogMXB4IHNvbGlkICNkY2RjZGM7Y29sb3I6IGJsYWNrO30uYWNlX2RhcmsgPiAuYWNlX21vYmlsZS1tZW51IHtiYWNrZ3JvdW5kOiAjMzMzO2NvbG9yOiAjY2NjO2JveC1zaGFkb3c6IDFweCAzcHggMnB4IGdyZXk7Ym9yZGVyOiAxcHggc29saWQgIzQ0NDt9LmFjZV9tb2JpbGUtYnV0dG9uIHtwYWRkaW5nOiAycHg7Y3Vyc29yOiBwb2ludGVyO292ZXJmbG93OiBoaWRkZW47fS5hY2VfbW9iaWxlLWJ1dHRvbjpob3ZlciB7YmFja2dyb3VuZC1jb2xvcjogI2VlZTtvcGFjaXR5OjE7fS5hY2VfbW9iaWxlLWJ1dHRvbjphY3RpdmUge2JhY2tncm91bmQtY29sb3I6ICNkZGQ7fScsbT1lKCIuL2xpYi91c2VyYWdlbnQiKSxnPW0uaXNJRTtpLmltcG9ydENzc1N0cmluZyh2LCJhY2VfZWRpdG9yLmNzcyIpO3ZhciB5PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt0aGlzLmNvbnRhaW5lcj1lfHxpLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGkuYWRkQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsImFjZV9lZGl0b3IiKSxpLkhJX0RQSSYmaS5hZGRDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwiYWNlX2hpZHBpIiksdGhpcy5zZXRUaGVtZSh0KSx0aGlzLiRndXR0ZXI9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRndXR0ZXIuY2xhc3NOYW1lPSJhY2VfZ3V0dGVyIix0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLiRndXR0ZXIpLHRoaXMuJGd1dHRlci5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwhMCksdGhpcy5zY3JvbGxlcj1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2Nyb2xsZXIuY2xhc3NOYW1lPSJhY2Vfc2Nyb2xsZXIiLHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2Nyb2xsZXIpLHRoaXMuY29udGVudD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29udGVudC5jbGFzc05hbWU9ImFjZV9jb250ZW50Iix0aGlzLnNjcm9sbGVyLmFwcGVuZENoaWxkKHRoaXMuY29udGVudCksdGhpcy4kZ3V0dGVyTGF5ZXI9bmV3IG8odGhpcy4kZ3V0dGVyKSx0aGlzLiRndXR0ZXJMYXllci5vbigiY2hhbmdlR3V0dGVyV2lkdGgiLHRoaXMub25HdXR0ZXJSZXNpemUuYmluZCh0aGlzKSksdGhpcy4kbWFya2VyQmFjaz1uZXcgdSh0aGlzLmNvbnRlbnQpO3ZhciByPXRoaXMuJHRleHRMYXllcj1uZXcgYSh0aGlzLmNvbnRlbnQpO3RoaXMuY2FudmFzPXIuZWxlbWVudCx0aGlzLiRtYXJrZXJGcm9udD1uZXcgdSh0aGlzLmNvbnRlbnQpLHRoaXMuJGN1cnNvckxheWVyPW5ldyBmKHRoaXMuY29udGVudCksdGhpcy4kaG9yaXpTY3JvbGw9ITEsdGhpcy4kdlNjcm9sbD0hMSx0aGlzLnNjcm9sbEJhcj10aGlzLnNjcm9sbEJhclY9bmV3IGModGhpcy5jb250YWluZXIsdGhpcyksdGhpcy5zY3JvbGxCYXJIPW5ldyBsKHRoaXMuY29udGFpbmVyLHRoaXMpLHRoaXMuc2Nyb2xsQmFyVi5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGZ1bmN0aW9uKGUpe24uJHNjcm9sbEFuaW1hdGlvbnx8bi5zZXNzaW9uLnNldFNjcm9sbFRvcChlLmRhdGEtbi5zY3JvbGxNYXJnaW4udG9wKX0pLHRoaXMuc2Nyb2xsQmFySC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGZ1bmN0aW9uKGUpe24uJHNjcm9sbEFuaW1hdGlvbnx8bi5zZXNzaW9uLnNldFNjcm9sbExlZnQoZS5kYXRhLW4uc2Nyb2xsTWFyZ2luLmxlZnQpfSksdGhpcy5zY3JvbGxUb3A9MCx0aGlzLnNjcm9sbExlZnQ9MCx0aGlzLmN1cnNvclBvcz17cm93OjAsY29sdW1uOjB9LHRoaXMuJGZvbnRNZXRyaWNzPW5ldyBwKHRoaXMuY29udGFpbmVyKSx0aGlzLiR0ZXh0TGF5ZXIuJHNldEZvbnRNZXRyaWNzKHRoaXMuJGZvbnRNZXRyaWNzKSx0aGlzLiR0ZXh0TGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIsZnVuY3Rpb24oZSl7bi51cGRhdGVDaGFyYWN0ZXJTaXplKCksbi5vblJlc2l6ZSghMCxuLmd1dHRlcldpZHRoLG4uJHNpemUud2lkdGgsbi4kc2l6ZS5oZWlnaHQpLG4uX3NpZ25hbCgiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIsZSl9KSx0aGlzLiRzaXplPXt3aWR0aDowLGhlaWdodDowLHNjcm9sbGVySGVpZ2h0OjAsc2Nyb2xsZXJXaWR0aDowLCRkaXJ0eTohMH0sdGhpcy5sYXllckNvbmZpZz17d2lkdGg6MSxwYWRkaW5nOjAsZmlyc3RSb3c6MCxmaXJzdFJvd1NjcmVlbjowLGxhc3RSb3c6MCxsaW5lSGVpZ2h0OjAsY2hhcmFjdGVyV2lkdGg6MCxtaW5IZWlnaHQ6MSxtYXhIZWlnaHQ6MSxvZmZzZXQ6MCxoZWlnaHQ6MSxndXR0ZXJPZmZzZXQ6MX0sdGhpcy5zY3JvbGxNYXJnaW49e2xlZnQ6MCxyaWdodDowLHRvcDowLGJvdHRvbTowLHY6MCxoOjB9LHRoaXMubWFyZ2luPXtsZWZ0OjAscmlnaHQ6MCx0b3A6MCxib3R0b206MCx2OjAsaDowfSx0aGlzLiRrZWVwVGV4dEFyZWFBdEN1cnNvcj0hbS5pc0lPUyx0aGlzLiRsb29wPW5ldyBoKHRoaXMuJHJlbmRlckNoYW5nZXMuYmluZCh0aGlzKSx0aGlzLmNvbnRhaW5lci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpLHRoaXMudXBkYXRlQ2hhcmFjdGVyU2l6ZSgpLHRoaXMuc2V0UGFkZGluZyg0KSxzLnJlc2V0T3B0aW9ucyh0aGlzKSxzLl9zaWduYWwoInJlbmRlcmVyIix0aGlzKX07KGZ1bmN0aW9uKCl7dGhpcy5DSEFOR0VfQ1VSU09SPTEsdGhpcy5DSEFOR0VfTUFSS0VSPTIsdGhpcy5DSEFOR0VfR1VUVEVSPTQsdGhpcy5DSEFOR0VfU0NST0xMPTgsdGhpcy5DSEFOR0VfTElORVM9MTYsdGhpcy5DSEFOR0VfVEVYVD0zMix0aGlzLkNIQU5HRV9TSVpFPTY0LHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLPTEyOCx0aGlzLkNIQU5HRV9NQVJLRVJfRlJPTlQ9MjU2LHRoaXMuQ0hBTkdFX0ZVTEw9NTEyLHRoaXMuQ0hBTkdFX0hfU0NST0xMPTEwMjQsci5pbXBsZW1lbnQodGhpcyxkKSx0aGlzLnVwZGF0ZUNoYXJhY3RlclNpemU9ZnVuY3Rpb24oKXt0aGlzLiR0ZXh0TGF5ZXIuYWxsb3dCb2xkRm9udHMhPXRoaXMuJGFsbG93Qm9sZEZvbnRzJiYodGhpcy4kYWxsb3dCb2xkRm9udHM9dGhpcy4kdGV4dExheWVyLmFsbG93Qm9sZEZvbnRzLHRoaXMuc2V0U3R5bGUoImFjZV9ub2JvbGQiLCF0aGlzLiRhbGxvd0JvbGRGb250cykpLHRoaXMubGF5ZXJDb25maWcuY2hhcmFjdGVyV2lkdGg9dGhpcy5jaGFyYWN0ZXJXaWR0aD10aGlzLiR0ZXh0TGF5ZXIuZ2V0Q2hhcmFjdGVyV2lkdGgoKSx0aGlzLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQ9dGhpcy5saW5lSGVpZ2h0PXRoaXMuJHRleHRMYXllci5nZXRMaW5lSGVpZ2h0KCksdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKSxpLnNldFN0eWxlKHRoaXMuc2Nyb2xsZXIuc3R5bGUsImxpbmUtaGVpZ2h0Iix0aGlzLmxpbmVIZWlnaHQrInB4Iil9LHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi5kb2Mub2ZmKCJjaGFuZ2VOZXdMaW5lTW9kZSIsdGhpcy5vbkNoYW5nZU5ld0xpbmVNb2RlKSx0aGlzLnNlc3Npb249ZSxlJiZ0aGlzLnNjcm9sbE1hcmdpbi50b3AmJmUuZ2V0U2Nyb2xsVG9wKCk8PTAmJmUuc2V0U2Nyb2xsVG9wKC10aGlzLnNjcm9sbE1hcmdpbi50b3ApLHRoaXMuJGN1cnNvckxheWVyLnNldFNlc3Npb24oZSksdGhpcy4kbWFya2VyQmFjay5zZXRTZXNzaW9uKGUpLHRoaXMuJG1hcmtlckZyb250LnNldFNlc3Npb24oZSksdGhpcy4kZ3V0dGVyTGF5ZXIuc2V0U2Vzc2lvbihlKSx0aGlzLiR0ZXh0TGF5ZXIuc2V0U2Vzc2lvbihlKTtpZighZSlyZXR1cm47dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKSx0aGlzLnNlc3Npb24uJHNldEZvbnRNZXRyaWNzKHRoaXMuJGZvbnRNZXRyaWNzKSx0aGlzLnNjcm9sbEJhckguc2Nyb2xsTGVmdD10aGlzLnNjcm9sbEJhclYuc2Nyb2xsVG9wPW51bGwsdGhpcy5vbkNoYW5nZU5ld0xpbmVNb2RlPXRoaXMub25DaGFuZ2VOZXdMaW5lTW9kZS5iaW5kKHRoaXMpLHRoaXMub25DaGFuZ2VOZXdMaW5lTW9kZSgpLHRoaXMuc2Vzc2lvbi5kb2Mub24oImNoYW5nZU5ld0xpbmVNb2RlIix0aGlzLm9uQ2hhbmdlTmV3TGluZU1vZGUpfSx0aGlzLnVwZGF0ZUxpbmVzPWZ1bmN0aW9uKGUsdCxuKXt0PT09dW5kZWZpbmVkJiYodD1JbmZpbml0eSksdGhpcy4kY2hhbmdlZExpbmVzPyh0aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3c+ZSYmKHRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdz1lKSx0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdzx0JiYodGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c9dCkpOnRoaXMuJGNoYW5nZWRMaW5lcz17Zmlyc3RSb3c6ZSxsYXN0Um93OnR9O2lmKHRoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93PHRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3cpe2lmKCFuKXJldHVybjt0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdz10aGlzLmxheWVyQ29uZmlnLmxhc3RSb3d9aWYodGhpcy4kY2hhbmdlZExpbmVzLmZpcnN0Um93PnRoaXMubGF5ZXJDb25maWcubGFzdFJvdylyZXR1cm47dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9MSU5FUyl9LHRoaXMub25DaGFuZ2VOZXdMaW5lTW9kZT1mdW5jdGlvbigpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVCksdGhpcy4kdGV4dExheWVyLiR1cGRhdGVFb2xDaGFyKCksdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5zZXRFb2xDaGFyKHRoaXMuJHRleHRMYXllci5FT0xfQ0hBUil9LHRoaXMub25DaGFuZ2VUYWJTaXplPWZ1bmN0aW9uKCl7dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9URVhUfHRoaXMuQ0hBTkdFX01BUktFUiksdGhpcy4kdGV4dExheWVyLm9uQ2hhbmdlVGFiU2l6ZSgpfSx0aGlzLnVwZGF0ZVRleHQ9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpfSx0aGlzLnVwZGF0ZUZ1bGw9ZnVuY3Rpb24oZSl7ZT90aGlzLiRyZW5kZXJDaGFuZ2VzKHRoaXMuQ0hBTkdFX0ZVTEwsITApOnRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCl9LHRoaXMudXBkYXRlRm9udFNpemU9ZnVuY3Rpb24oKXt0aGlzLiR0ZXh0TGF5ZXIuY2hlY2tGb3JTaXplQ2hhbmdlcygpfSx0aGlzLiRjaGFuZ2VzPTAsdGhpcy4kdXBkYXRlU2l6ZUFzeW5jPWZ1bmN0aW9uKCl7dGhpcy4kbG9vcC5wZW5kaW5nP3RoaXMuJHNpemUuJGRpcnR5PSEwOnRoaXMub25SZXNpemUoKX0sdGhpcy5vblJlc2l6ZT1mdW5jdGlvbihlLHQsbixyKXtpZih0aGlzLnJlc2l6aW5nPjIpcmV0dXJuO3RoaXMucmVzaXppbmc+MD90aGlzLnJlc2l6aW5nKys6dGhpcy5yZXNpemluZz1lPzE6MDt2YXIgaT10aGlzLmNvbnRhaW5lcjtyfHwocj1pLmNsaWVudEhlaWdodHx8aS5zY3JvbGxIZWlnaHQpLG58fChuPWkuY2xpZW50V2lkdGh8fGkuc2Nyb2xsV2lkdGgpO3ZhciBzPXRoaXMuJHVwZGF0ZUNhY2hlZFNpemUoZSx0LG4scik7aWYoIXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHR8fCFuJiYhcilyZXR1cm4gdGhpcy5yZXNpemluZz0wO2UmJih0aGlzLiRndXR0ZXJMYXllci4kcGFkZGluZz1udWxsKSxlP3RoaXMuJHJlbmRlckNoYW5nZXMoc3x0aGlzLiRjaGFuZ2VzLCEwKTp0aGlzLiRsb29wLnNjaGVkdWxlKHN8dGhpcy4kY2hhbmdlcyksdGhpcy5yZXNpemluZyYmKHRoaXMucmVzaXppbmc9MCksdGhpcy5zY3JvbGxCYXJWLnNjcm9sbExlZnQ9dGhpcy5zY3JvbGxCYXJWLnNjcm9sbFRvcD1udWxsfSx0aGlzLiR1cGRhdGVDYWNoZWRTaXplPWZ1bmN0aW9uKGUsdCxuLHIpe3ItPXRoaXMuJGV4dHJhSGVpZ2h0fHwwO3ZhciBzPTAsbz10aGlzLiRzaXplLHU9e3dpZHRoOm8ud2lkdGgsaGVpZ2h0Om8uaGVpZ2h0LHNjcm9sbGVySGVpZ2h0Om8uc2Nyb2xsZXJIZWlnaHQsc2Nyb2xsZXJXaWR0aDpvLnNjcm9sbGVyV2lkdGh9O3ImJihlfHxvLmhlaWdodCE9cikmJihvLmhlaWdodD1yLHN8PXRoaXMuQ0hBTkdFX1NJWkUsby5zY3JvbGxlckhlaWdodD1vLmhlaWdodCx0aGlzLiRob3JpelNjcm9sbCYmKG8uc2Nyb2xsZXJIZWlnaHQtPXRoaXMuc2Nyb2xsQmFySC5nZXRIZWlnaHQoKSksdGhpcy5zY3JvbGxCYXJWLmVsZW1lbnQuc3R5bGUuYm90dG9tPXRoaXMuc2Nyb2xsQmFySC5nZXRIZWlnaHQoKSsicHgiLHN8PXRoaXMuQ0hBTkdFX1NDUk9MTCk7aWYobiYmKGV8fG8ud2lkdGghPW4pKXtzfD10aGlzLkNIQU5HRV9TSVpFLG8ud2lkdGg9bix0PT1udWxsJiYodD10aGlzLiRzaG93R3V0dGVyP3RoaXMuJGd1dHRlci5vZmZzZXRXaWR0aDowKSx0aGlzLmd1dHRlcldpZHRoPXQsaS5zZXRTdHlsZSh0aGlzLnNjcm9sbEJhckguZWxlbWVudC5zdHlsZSwibGVmdCIsdCsicHgiKSxpLnNldFN0eWxlKHRoaXMuc2Nyb2xsZXIuc3R5bGUsImxlZnQiLHQrdGhpcy5tYXJnaW4ubGVmdCsicHgiKSxvLnNjcm9sbGVyV2lkdGg9TWF0aC5tYXgoMCxuLXQtdGhpcy5zY3JvbGxCYXJWLmdldFdpZHRoKCktdGhpcy5tYXJnaW4uaCksaS5zZXRTdHlsZSh0aGlzLiRndXR0ZXIuc3R5bGUsImxlZnQiLHRoaXMubWFyZ2luLmxlZnQrInB4Iik7dmFyIGE9dGhpcy5zY3JvbGxCYXJWLmdldFdpZHRoKCkrInB4IjtpLnNldFN0eWxlKHRoaXMuc2Nyb2xsQmFySC5lbGVtZW50LnN0eWxlLCJyaWdodCIsYSksaS5zZXRTdHlsZSh0aGlzLnNjcm9sbGVyLnN0eWxlLCJyaWdodCIsYSksaS5zZXRTdHlsZSh0aGlzLnNjcm9sbGVyLnN0eWxlLCJib3R0b20iLHRoaXMuc2Nyb2xsQmFySC5nZXRIZWlnaHQoKSk7aWYodGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uZ2V0VXNlV3JhcE1vZGUoKSYmdGhpcy5hZGp1c3RXcmFwTGltaXQoKXx8ZSlzfD10aGlzLkNIQU5HRV9GVUxMfXJldHVybiBvLiRkaXJ0eT0hbnx8IXIscyYmdGhpcy5fc2lnbmFsKCJyZXNpemUiLHUpLHN9LHRoaXMub25HdXR0ZXJSZXNpemU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kc2hvd0d1dHRlcj9lOjA7dCE9dGhpcy5ndXR0ZXJXaWR0aCYmKHRoaXMuJGNoYW5nZXN8PXRoaXMuJHVwZGF0ZUNhY2hlZFNpemUoITAsdCx0aGlzLiRzaXplLndpZHRoLHRoaXMuJHNpemUuaGVpZ2h0KSksdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCkmJnRoaXMuYWRqdXN0V3JhcExpbWl0KCk/dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKTp0aGlzLiRzaXplLiRkaXJ0eT90aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpOnRoaXMuJGNvbXB1dGVMYXllckNvbmZpZygpfSx0aGlzLmFkanVzdFdyYXBMaW1pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC10aGlzLiRwYWRkaW5nKjIsdD1NYXRoLmZsb29yKGUvdGhpcy5jaGFyYWN0ZXJXaWR0aCk7cmV0dXJuIHRoaXMuc2Vzc2lvbi5hZGp1c3RXcmFwTGltaXQodCx0aGlzLiRzaG93UHJpbnRNYXJnaW4mJnRoaXMuJHByaW50TWFyZ2luQ29sdW1uKX0sdGhpcy5zZXRBbmltYXRlZFNjcm9sbD1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiYW5pbWF0ZWRTY3JvbGwiLGUpfSx0aGlzLmdldEFuaW1hdGVkU2Nyb2xsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGFuaW1hdGVkU2Nyb2xsfSx0aGlzLnNldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJzaG93SW52aXNpYmxlcyIsZSksdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5zZXRTaG93SW52aXNpYmxlcyhlKX0sdGhpcy5nZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigic2hvd0ludmlzaWJsZXMiKX0sdGhpcy5nZXREaXNwbGF5SW5kZW50R3VpZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJkaXNwbGF5SW5kZW50R3VpZGVzIil9LHRoaXMuc2V0RGlzcGxheUluZGVudEd1aWRlcz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiZGlzcGxheUluZGVudEd1aWRlcyIsZSl9LHRoaXMuc2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJzaG93UHJpbnRNYXJnaW4iLGUpfSx0aGlzLmdldFNob3dQcmludE1hcmdpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigic2hvd1ByaW50TWFyZ2luIil9LHRoaXMuc2V0UHJpbnRNYXJnaW5Db2x1bW49ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInByaW50TWFyZ2luQ29sdW1uIixlKX0sdGhpcy5nZXRQcmludE1hcmdpbkNvbHVtbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigicHJpbnRNYXJnaW5Db2x1bW4iKX0sdGhpcy5nZXRTaG93R3V0dGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJzaG93R3V0dGVyIil9LHRoaXMuc2V0U2hvd0d1dHRlcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zZXRPcHRpb24oInNob3dHdXR0ZXIiLGUpfSx0aGlzLmdldEZhZGVGb2xkV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiZmFkZUZvbGRXaWRnZXRzIil9LHRoaXMuc2V0RmFkZUZvbGRXaWRnZXRzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJmYWRlRm9sZFdpZGdldHMiLGUpfSx0aGlzLnNldEhpZ2hsaWdodEd1dHRlckxpbmU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImhpZ2hsaWdodEd1dHRlckxpbmUiLGUpfSx0aGlzLmdldEhpZ2hsaWdodEd1dHRlckxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImhpZ2hsaWdodEd1dHRlckxpbmUiKX0sdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW49ZnVuY3Rpb24oKXtpZighdGhpcy4kc2hvd1ByaW50TWFyZ2luJiYhdGhpcy4kcHJpbnRNYXJnaW5FbClyZXR1cm47aWYoIXRoaXMuJHByaW50TWFyZ2luRWwpe3ZhciBlPWkuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfcHJpbnQtbWFyZ2luLWxheWVyIix0aGlzLiRwcmludE1hcmdpbkVsPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kcHJpbnRNYXJnaW5FbC5jbGFzc05hbWU9ImFjZV9wcmludC1tYXJnaW4iLGUuYXBwZW5kQ2hpbGQodGhpcy4kcHJpbnRNYXJnaW5FbCksdGhpcy5jb250ZW50Lmluc2VydEJlZm9yZShlLHRoaXMuY29udGVudC5maXJzdENoaWxkKX12YXIgdD10aGlzLiRwcmludE1hcmdpbkVsLnN0eWxlO3QubGVmdD1NYXRoLnJvdW5kKHRoaXMuY2hhcmFjdGVyV2lkdGgqdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW4rdGhpcy4kcGFkZGluZykrInB4Iix0LnZpc2liaWxpdHk9dGhpcy4kc2hvd1ByaW50TWFyZ2luPyJ2aXNpYmxlIjoiaGlkZGVuIix0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi4kd3JhcD09LTEmJnRoaXMuYWRqdXN0V3JhcExpbWl0KCl9LHRoaXMuZ2V0Q29udGFpbmVyRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lcn0sdGhpcy5nZXRNb3VzZUV2ZW50VGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Nyb2xsZXJ9LHRoaXMuZ2V0VGV4dEFyZWFDb250YWluZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWluZXJ9LHRoaXMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yPWZ1bmN0aW9uKCl7aWYodGhpcy4kaXNNb3VzZVByZXNzZWQpcmV0dXJuO3ZhciBlPXRoaXMudGV4dGFyZWEuc3R5bGUsdD10aGlzLiRjb21wb3NpdGlvbjtpZighdGhpcy4ka2VlcFRleHRBcmVhQXRDdXJzb3ImJiF0KXtpLnRyYW5zbGF0ZSh0aGlzLnRleHRhcmVhLC0xMDAsMCk7cmV0dXJufXZhciBuPXRoaXMuJGN1cnNvckxheWVyLiRwaXhlbFBvcztpZighbilyZXR1cm47dCYmdC5tYXJrZXJSYW5nZSYmKG49dGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbih0Lm1hcmtlclJhbmdlLnN0YXJ0LCEwKSk7dmFyIHI9dGhpcy5sYXllckNvbmZpZyxzPW4udG9wLG89bi5sZWZ0O3MtPXIub2Zmc2V0O3ZhciB1PXQmJnQudXNlVGV4dGFyZWFGb3JJTUU/dGhpcy5saW5lSGVpZ2h0Omc/MDoxO2lmKHM8MHx8cz5yLmhlaWdodC11KXtpLnRyYW5zbGF0ZSh0aGlzLnRleHRhcmVhLDAsMCk7cmV0dXJufXZhciBhPTEsZj10aGlzLiRzaXplLmhlaWdodC11O2lmKCF0KXMrPXRoaXMubGluZUhlaWdodDtlbHNlIGlmKHQudXNlVGV4dGFyZWFGb3JJTUUpe3ZhciBsPXRoaXMudGV4dGFyZWEudmFsdWU7YT10aGlzLmNoYXJhY3RlcldpZHRoKnRoaXMuc2Vzc2lvbi4kZ2V0U3RyaW5nU2NyZWVuV2lkdGgobClbMF0sdSs9Mn1lbHNlIHMrPXRoaXMubGluZUhlaWdodCsyO28tPXRoaXMuc2Nyb2xsTGVmdCxvPnRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC1hJiYobz10aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtYSksbys9dGhpcy5ndXR0ZXJXaWR0aCt0aGlzLm1hcmdpbi5sZWZ0LGkuc2V0U3R5bGUoZSwiaGVpZ2h0Iix1KyJweCIpLGkuc2V0U3R5bGUoZSwid2lkdGgiLGErInB4IiksaS50cmFuc2xhdGUodGhpcy50ZXh0YXJlYSxNYXRoLm1pbihvLHRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC1hKSxNYXRoLm1pbihzLGYpKX0sdGhpcy5nZXRGaXJzdFZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXllckNvbmZpZy5maXJzdFJvd30sdGhpcy5nZXRGaXJzdEZ1bGx5VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93Kyh0aGlzLmxheWVyQ29uZmlnLm9mZnNldD09PTA/MDoxKX0sdGhpcy5nZXRMYXN0RnVsbHlWaXNpYmxlUm93PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sYXllckNvbmZpZyx0PWUubGFzdFJvdyxuPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUm93KHQsMCkqZS5saW5lSGVpZ2h0O3JldHVybiBuLXRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKT5lLmhlaWdodC1lLmxpbmVIZWlnaHQ/dC0xOnR9LHRoaXMuZ2V0TGFzdFZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXllckNvbmZpZy5sYXN0Um93fSx0aGlzLiRwYWRkaW5nPW51bGwsdGhpcy5zZXRQYWRkaW5nPWZ1bmN0aW9uKGUpe3RoaXMuJHBhZGRpbmc9ZSx0aGlzLiR0ZXh0TGF5ZXIuc2V0UGFkZGluZyhlKSx0aGlzLiRjdXJzb3JMYXllci5zZXRQYWRkaW5nKGUpLHRoaXMuJG1hcmtlckZyb250LnNldFBhZGRpbmcoZSksdGhpcy4kbWFya2VyQmFjay5zZXRQYWRkaW5nKGUpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCksdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKX0sdGhpcy5zZXRTY3JvbGxNYXJnaW49ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy5zY3JvbGxNYXJnaW47aS50b3A9ZXwwLGkuYm90dG9tPXR8MCxpLnJpZ2h0PXJ8MCxpLmxlZnQ9bnwwLGkudj1pLnRvcCtpLmJvdHRvbSxpLmg9aS5sZWZ0K2kucmlnaHQsaS50b3AmJnRoaXMuc2Nyb2xsVG9wPD0wJiZ0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoLWkudG9wKSx0aGlzLnVwZGF0ZUZ1bGwoKX0sdGhpcy5zZXRNYXJnaW49ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy5tYXJnaW47aS50b3A9ZXwwLGkuYm90dG9tPXR8MCxpLnJpZ2h0PXJ8MCxpLmxlZnQ9bnwwLGkudj1pLnRvcCtpLmJvdHRvbSxpLmg9aS5sZWZ0K2kucmlnaHQsdGhpcy4kdXBkYXRlQ2FjaGVkU2l6ZSghMCx0aGlzLmd1dHRlcldpZHRoLHRoaXMuJHNpemUud2lkdGgsdGhpcy4kc2l6ZS5oZWlnaHQpLHRoaXMudXBkYXRlRnVsbCgpfSx0aGlzLmdldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGhTY3JvbGxCYXJBbHdheXNWaXNpYmxlfSx0aGlzLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJoU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZSIsZSl9LHRoaXMuZ2V0VlNjcm9sbEJhckFsd2F5c1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdlNjcm9sbEJhckFsd2F5c1Zpc2libGV9LHRoaXMuc2V0VlNjcm9sbEJhckFsd2F5c1Zpc2libGU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInZTY3JvbGxCYXJBbHdheXNWaXNpYmxlIixlKX0sdGhpcy4kdXBkYXRlU2Nyb2xsQmFyVj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGF5ZXJDb25maWcubWF4SGVpZ2h0LHQ9dGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodDshdGhpcy4kbWF4TGluZXMmJnRoaXMuJHNjcm9sbFBhc3RFbmQmJihlLT0odC10aGlzLmxpbmVIZWlnaHQpKnRoaXMuJHNjcm9sbFBhc3RFbmQsdGhpcy5zY3JvbGxUb3A+ZS10JiYoZT10aGlzLnNjcm9sbFRvcCt0LHRoaXMuc2Nyb2xsQmFyVi5zY3JvbGxUb3A9bnVsbCkpLHRoaXMuc2Nyb2xsQmFyVi5zZXRTY3JvbGxIZWlnaHQoZSt0aGlzLnNjcm9sbE1hcmdpbi52KSx0aGlzLnNjcm9sbEJhclYuc2V0U2Nyb2xsVG9wKHRoaXMuc2Nyb2xsVG9wK3RoaXMuc2Nyb2xsTWFyZ2luLnRvcCl9LHRoaXMuJHVwZGF0ZVNjcm9sbEJhckg9ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbEJhckguc2V0U2Nyb2xsV2lkdGgodGhpcy5sYXllckNvbmZpZy53aWR0aCsyKnRoaXMuJHBhZGRpbmcrdGhpcy5zY3JvbGxNYXJnaW4uaCksdGhpcy5zY3JvbGxCYXJILnNldFNjcm9sbExlZnQodGhpcy5zY3JvbGxMZWZ0K3RoaXMuc2Nyb2xsTWFyZ2luLmxlZnQpfSx0aGlzLiRmcm96ZW49ITEsdGhpcy5mcmVlemU9ZnVuY3Rpb24oKXt0aGlzLiRmcm96ZW49ITB9LHRoaXMudW5mcmVlemU9ZnVuY3Rpb24oKXt0aGlzLiRmcm96ZW49ITF9LHRoaXMuJHJlbmRlckNoYW5nZXM9ZnVuY3Rpb24oZSx0KXt0aGlzLiRjaGFuZ2VzJiYoZXw9dGhpcy4kY2hhbmdlcyx0aGlzLiRjaGFuZ2VzPTApO2lmKCF0aGlzLnNlc3Npb258fCF0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aHx8dGhpcy4kZnJvemVufHwhZSYmIXQpe3RoaXMuJGNoYW5nZXN8PWU7cmV0dXJufWlmKHRoaXMuJHNpemUuJGRpcnR5KXJldHVybiB0aGlzLiRjaGFuZ2VzfD1lLHRoaXMub25SZXNpemUoITApO3RoaXMubGluZUhlaWdodHx8dGhpcy4kdGV4dExheWVyLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKSx0aGlzLl9zaWduYWwoImJlZm9yZVJlbmRlciIpLHRoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlciYmdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci51cGRhdGVDaGFyYWN0ZXJXaWR0aHModGhpcy4kZm9udE1ldHJpY3MpO3ZhciBuPXRoaXMubGF5ZXJDb25maWc7aWYoZSZ0aGlzLkNIQU5HRV9GVUxMfHxlJnRoaXMuQ0hBTkdFX1NJWkV8fGUmdGhpcy5DSEFOR0VfVEVYVHx8ZSZ0aGlzLkNIQU5HRV9MSU5FU3x8ZSZ0aGlzLkNIQU5HRV9TQ1JPTEx8fGUmdGhpcy5DSEFOR0VfSF9TQ1JPTEwpe2V8PXRoaXMuJGNvbXB1dGVMYXllckNvbmZpZygpfHRoaXMuJGxvb3AuY2xlYXIoKTtpZihuLmZpcnN0Um93IT10aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93JiZuLmZpcnN0Um93U2NyZWVuPT10aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93U2NyZWVuKXt2YXIgcj10aGlzLnNjcm9sbFRvcCsobi5maXJzdFJvdy10aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93KSp0aGlzLmxpbmVIZWlnaHQ7cj4wJiYodGhpcy5zY3JvbGxUb3A9cixlfD10aGlzLkNIQU5HRV9TQ1JPTEwsZXw9dGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnKCl8dGhpcy4kbG9vcC5jbGVhcigpKX1uPXRoaXMubGF5ZXJDb25maWcsdGhpcy4kdXBkYXRlU2Nyb2xsQmFyVigpLGUmdGhpcy5DSEFOR0VfSF9TQ1JPTEwmJnRoaXMuJHVwZGF0ZVNjcm9sbEJhckgoKSxpLnRyYW5zbGF0ZSh0aGlzLmNvbnRlbnQsLXRoaXMuc2Nyb2xsTGVmdCwtbi5vZmZzZXQpO3ZhciBzPW4ud2lkdGgrMip0aGlzLiRwYWRkaW5nKyJweCIsbz1uLm1pbkhlaWdodCsicHgiO2kuc2V0U3R5bGUodGhpcy5jb250ZW50LnN0eWxlLCJ3aWR0aCIscyksaS5zZXRTdHlsZSh0aGlzLmNvbnRlbnQuc3R5bGUsImhlaWdodCIsbyl9ZSZ0aGlzLkNIQU5HRV9IX1NDUk9MTCYmKGkudHJhbnNsYXRlKHRoaXMuY29udGVudCwtdGhpcy5zY3JvbGxMZWZ0LC1uLm9mZnNldCksdGhpcy5zY3JvbGxlci5jbGFzc05hbWU9dGhpcy5zY3JvbGxMZWZ0PD0wPyJhY2Vfc2Nyb2xsZXIiOiJhY2Vfc2Nyb2xsZXIgYWNlX3Njcm9sbC1sZWZ0Iik7aWYoZSZ0aGlzLkNIQU5HRV9GVUxMKXt0aGlzLiRjaGFuZ2VkTGluZXM9bnVsbCx0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKG4pLHRoaXMuJHNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZShuKSx0aGlzLiRtYXJrZXJCYWNrLnVwZGF0ZShuKSx0aGlzLiRtYXJrZXJGcm9udC51cGRhdGUobiksdGhpcy4kY3Vyc29yTGF5ZXIudXBkYXRlKG4pLHRoaXMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCksdGhpcy5fc2lnbmFsKCJhZnRlclJlbmRlciIpO3JldHVybn1pZihlJnRoaXMuQ0hBTkdFX1NDUk9MTCl7dGhpcy4kY2hhbmdlZExpbmVzPW51bGwsZSZ0aGlzLkNIQU5HRV9URVhUfHxlJnRoaXMuQ0hBTkdFX0xJTkVTP3RoaXMuJHRleHRMYXllci51cGRhdGUobik6dGhpcy4kdGV4dExheWVyLnNjcm9sbExpbmVzKG4pLHRoaXMuJHNob3dHdXR0ZXImJihlJnRoaXMuQ0hBTkdFX0dVVFRFUnx8ZSZ0aGlzLkNIQU5HRV9MSU5FUz90aGlzLiRndXR0ZXJMYXllci51cGRhdGUobik6dGhpcy4kZ3V0dGVyTGF5ZXIuc2Nyb2xsTGluZXMobikpLHRoaXMuJG1hcmtlckJhY2sudXBkYXRlKG4pLHRoaXMuJG1hcmtlckZyb250LnVwZGF0ZShuKSx0aGlzLiRjdXJzb3JMYXllci51cGRhdGUobiksdGhpcy4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKSx0aGlzLl9zaWduYWwoImFmdGVyUmVuZGVyIik7cmV0dXJufWUmdGhpcy5DSEFOR0VfVEVYVD8odGhpcy4kY2hhbmdlZExpbmVzPW51bGwsdGhpcy4kdGV4dExheWVyLnVwZGF0ZShuKSx0aGlzLiRzaG93R3V0dGVyJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUobikpOmUmdGhpcy5DSEFOR0VfTElORVM/KHRoaXMuJHVwZGF0ZUxpbmVzKCl8fGUmdGhpcy5DSEFOR0VfR1VUVEVSJiZ0aGlzLiRzaG93R3V0dGVyKSYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKG4pOmUmdGhpcy5DSEFOR0VfVEVYVHx8ZSZ0aGlzLkNIQU5HRV9HVVRURVI/dGhpcy4kc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKG4pOmUmdGhpcy5DSEFOR0VfQ1VSU09SJiZ0aGlzLiRoaWdobGlnaHRHdXR0ZXJMaW5lJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGVMaW5lSGlnaGxpZ2h0KG4pLGUmdGhpcy5DSEFOR0VfQ1VSU09SJiYodGhpcy4kY3Vyc29yTGF5ZXIudXBkYXRlKG4pLHRoaXMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCkpLGUmKHRoaXMuQ0hBTkdFX01BUktFUnx0aGlzLkNIQU5HRV9NQVJLRVJfRlJPTlQpJiZ0aGlzLiRtYXJrZXJGcm9udC51cGRhdGUobiksZSYodGhpcy5DSEFOR0VfTUFSS0VSfHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLKSYmdGhpcy4kbWFya2VyQmFjay51cGRhdGUobiksdGhpcy5fc2lnbmFsKCJhZnRlclJlbmRlciIpfSx0aGlzLiRhdXRvc2l6ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5MZW5ndGgoKSp0aGlzLmxpbmVIZWlnaHQsdD10aGlzLiRtYXhMaW5lcyp0aGlzLmxpbmVIZWlnaHQsbj1NYXRoLm1pbih0LE1hdGgubWF4KCh0aGlzLiRtaW5MaW5lc3x8MSkqdGhpcy5saW5lSGVpZ2h0LGUpKSt0aGlzLnNjcm9sbE1hcmdpbi52Kyh0aGlzLiRleHRyYUhlaWdodHx8MCk7dGhpcy4kaG9yaXpTY3JvbGwmJihuKz10aGlzLnNjcm9sbEJhckguZ2V0SGVpZ2h0KCkpLHRoaXMuJG1heFBpeGVsSGVpZ2h0JiZuPnRoaXMuJG1heFBpeGVsSGVpZ2h0JiYobj10aGlzLiRtYXhQaXhlbEhlaWdodCk7dmFyIHI9bjw9Mip0aGlzLmxpbmVIZWlnaHQsaT0hciYmZT50O2lmKG4hPXRoaXMuZGVzaXJlZEhlaWdodHx8dGhpcy4kc2l6ZS5oZWlnaHQhPXRoaXMuZGVzaXJlZEhlaWdodHx8aSE9dGhpcy4kdlNjcm9sbCl7aSE9dGhpcy4kdlNjcm9sbCYmKHRoaXMuJHZTY3JvbGw9aSx0aGlzLnNjcm9sbEJhclYuc2V0VmlzaWJsZShpKSk7dmFyIHM9dGhpcy5jb250YWluZXIuY2xpZW50V2lkdGg7dGhpcy5jb250YWluZXIuc3R5bGUuaGVpZ2h0PW4rInB4Iix0aGlzLiR1cGRhdGVDYWNoZWRTaXplKCEwLHRoaXMuJGd1dHRlcldpZHRoLHMsbiksdGhpcy5kZXNpcmVkSGVpZ2h0PW4sdGhpcy5fc2lnbmFsKCJhdXRvc2l6ZSIpfX0sdGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLHQ9dGhpcy4kc2l6ZSxuPXQuaGVpZ2h0PD0yKnRoaXMubGluZUhlaWdodCxyPXRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5MZW5ndGgoKSxpPXIqdGhpcy5saW5lSGVpZ2h0LHM9dGhpcy4kZ2V0TG9uZ2VzdExpbmUoKSxvPSFuJiYodGhpcy4kaFNjcm9sbEJhckFsd2F5c1Zpc2libGV8fHQuc2Nyb2xsZXJXaWR0aC1zLTIqdGhpcy4kcGFkZGluZzwwKSx1PXRoaXMuJGhvcml6U2Nyb2xsIT09bzt1JiYodGhpcy4kaG9yaXpTY3JvbGw9byx0aGlzLnNjcm9sbEJhckguc2V0VmlzaWJsZShvKSk7dmFyIGE9dGhpcy4kdlNjcm9sbDt0aGlzLiRtYXhMaW5lcyYmdGhpcy5saW5lSGVpZ2h0PjEmJnRoaXMuJGF1dG9zaXplKCk7dmFyIGY9dC5zY3JvbGxlckhlaWdodCt0aGlzLmxpbmVIZWlnaHQsbD0hdGhpcy4kbWF4TGluZXMmJnRoaXMuJHNjcm9sbFBhc3RFbmQ/KHQuc2Nyb2xsZXJIZWlnaHQtdGhpcy5saW5lSGVpZ2h0KSp0aGlzLiRzY3JvbGxQYXN0RW5kOjA7aSs9bDt2YXIgYz10aGlzLnNjcm9sbE1hcmdpbjt0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKE1hdGgubWF4KC1jLnRvcCxNYXRoLm1pbih0aGlzLnNjcm9sbFRvcCxpLXQuc2Nyb2xsZXJIZWlnaHQrYy5ib3R0b20pKSksdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQoTWF0aC5tYXgoLWMubGVmdCxNYXRoLm1pbih0aGlzLnNjcm9sbExlZnQscysyKnRoaXMuJHBhZGRpbmctdC5zY3JvbGxlcldpZHRoK2MucmlnaHQpKSk7dmFyIGg9IW4mJih0aGlzLiR2U2Nyb2xsQmFyQWx3YXlzVmlzaWJsZXx8dC5zY3JvbGxlckhlaWdodC1pK2w8MHx8dGhpcy5zY3JvbGxUb3A+Yy50b3ApLHA9YSE9PWg7cCYmKHRoaXMuJHZTY3JvbGw9aCx0aGlzLnNjcm9sbEJhclYuc2V0VmlzaWJsZShoKSk7dmFyIGQ9dGhpcy5zY3JvbGxUb3AldGhpcy5saW5lSGVpZ2h0LHY9TWF0aC5jZWlsKGYvdGhpcy5saW5lSGVpZ2h0KS0xLG09TWF0aC5tYXgoMCxNYXRoLnJvdW5kKCh0aGlzLnNjcm9sbFRvcC1kKS90aGlzLmxpbmVIZWlnaHQpKSxnPW0rdix5LGIsdz10aGlzLmxpbmVIZWlnaHQ7bT1lLnNjcmVlblRvRG9jdW1lbnRSb3cobSwwKTt2YXIgRT1lLmdldEZvbGRMaW5lKG0pO0UmJihtPUUuc3RhcnQucm93KSx5PWUuZG9jdW1lbnRUb1NjcmVlblJvdyhtLDApLGI9ZS5nZXRSb3dMZW5ndGgobSkqdyxnPU1hdGgubWluKGUuc2NyZWVuVG9Eb2N1bWVudFJvdyhnLDApLGUuZ2V0TGVuZ3RoKCktMSksZj10LnNjcm9sbGVySGVpZ2h0K2UuZ2V0Um93TGVuZ3RoKGcpKncrYixkPXRoaXMuc2Nyb2xsVG9wLXkqdzt2YXIgUz0wO2lmKHRoaXMubGF5ZXJDb25maWcud2lkdGghPXN8fHUpUz10aGlzLkNIQU5HRV9IX1NDUk9MTDtpZih1fHxwKVN8PXRoaXMuJHVwZGF0ZUNhY2hlZFNpemUoITAsdGhpcy5ndXR0ZXJXaWR0aCx0LndpZHRoLHQuaGVpZ2h0KSx0aGlzLl9zaWduYWwoInNjcm9sbGJhclZpc2liaWxpdHlDaGFuZ2VkIikscCYmKHM9dGhpcy4kZ2V0TG9uZ2VzdExpbmUoKSk7cmV0dXJuIHRoaXMubGF5ZXJDb25maWc9e3dpZHRoOnMscGFkZGluZzp0aGlzLiRwYWRkaW5nLGZpcnN0Um93Om0sZmlyc3RSb3dTY3JlZW46eSxsYXN0Um93OmcsbGluZUhlaWdodDp3LGNoYXJhY3RlcldpZHRoOnRoaXMuY2hhcmFjdGVyV2lkdGgsbWluSGVpZ2h0OmYsbWF4SGVpZ2h0Omksb2Zmc2V0OmQsZ3V0dGVyT2Zmc2V0Onc/TWF0aC5tYXgoMCxNYXRoLmNlaWwoKGQrdC5oZWlnaHQtdC5zY3JvbGxlckhlaWdodCkvdykpOjAsaGVpZ2h0OnRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHR9LHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXImJnRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuc2V0Q29udGVudFdpZHRoKHMtdGhpcy4kcGFkZGluZyksU30sdGhpcy4kdXBkYXRlTGluZXM9ZnVuY3Rpb24oKXtpZighdGhpcy4kY2hhbmdlZExpbmVzKXJldHVybjt2YXIgZT10aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3csdD10aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdzt0aGlzLiRjaGFuZ2VkTGluZXM9bnVsbDt2YXIgbj10aGlzLmxheWVyQ29uZmlnO2lmKGU+bi5sYXN0Um93KzEpcmV0dXJuO2lmKHQ8bi5maXJzdFJvdylyZXR1cm47aWYodD09PUluZmluaXR5KXt0aGlzLiRzaG93R3V0dGVyJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUobiksdGhpcy4kdGV4dExheWVyLnVwZGF0ZShuKTtyZXR1cm59cmV0dXJuIHRoaXMuJHRleHRMYXllci51cGRhdGVMaW5lcyhuLGUsdCksITB9LHRoaXMuJGdldExvbmdlc3RMaW5lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmdldFNjcmVlbldpZHRoKCk7cmV0dXJuIHRoaXMuc2hvd0ludmlzaWJsZXMmJiF0aGlzLnNlc3Npb24uJHVzZVdyYXBNb2RlJiYoZSs9MSksdGhpcy4kdGV4dExheWVyJiZlPnRoaXMuJHRleHRMYXllci5NQVhfTElORV9MRU5HVEgmJihlPXRoaXMuJHRleHRMYXllci5NQVhfTElORV9MRU5HVEgrMzApLE1hdGgubWF4KHRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC0yKnRoaXMuJHBhZGRpbmcsTWF0aC5yb3VuZChlKnRoaXMuY2hhcmFjdGVyV2lkdGgpKX0sdGhpcy51cGRhdGVGcm9udE1hcmtlcnM9ZnVuY3Rpb24oKXt0aGlzLiRtYXJrZXJGcm9udC5zZXRNYXJrZXJzKHRoaXMuc2Vzc2lvbi5nZXRNYXJrZXJzKCEwKSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9NQVJLRVJfRlJPTlQpfSx0aGlzLnVwZGF0ZUJhY2tNYXJrZXJzPWZ1bmN0aW9uKCl7dGhpcy4kbWFya2VyQmFjay5zZXRNYXJrZXJzKHRoaXMuc2Vzc2lvbi5nZXRNYXJrZXJzKCkpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTUFSS0VSX0JBQ0spfSx0aGlzLmFkZEd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oZSx0KXt0aGlzLiRndXR0ZXJMYXllci5hZGRHdXR0ZXJEZWNvcmF0aW9uKGUsdCl9LHRoaXMucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihlLHQpe3RoaXMuJGd1dHRlckxheWVyLnJlbW92ZUd1dHRlckRlY29yYXRpb24oZSx0KX0sdGhpcy51cGRhdGVCcmVha3BvaW50cz1mdW5jdGlvbihlKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUil9LHRoaXMuc2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oZSl7dGhpcy4kZ3V0dGVyTGF5ZXIuc2V0QW5ub3RhdGlvbnMoZSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfSx0aGlzLnVwZGF0ZUN1cnNvcj1mdW5jdGlvbigpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfQ1VSU09SKX0sdGhpcy5oaWRlQ3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy4kY3Vyc29yTGF5ZXIuaGlkZUN1cnNvcigpfSx0aGlzLnNob3dDdXJzb3I9ZnVuY3Rpb24oKXt0aGlzLiRjdXJzb3JMYXllci5zaG93Q3Vyc29yKCl9LHRoaXMuc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXc9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoZSxuKSx0aGlzLnNjcm9sbEN1cnNvckludG9WaWV3KHQsbil9LHRoaXMuc2Nyb2xsQ3Vyc29ySW50b1ZpZXc9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQ9PT0wKXJldHVybjt2YXIgcj10aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKGUpLGk9ci5sZWZ0LHM9ci50b3Asbz1uJiZuLnRvcHx8MCx1PW4mJm4uYm90dG9tfHwwLGE9dGhpcy4kc2Nyb2xsQW5pbWF0aW9uP3RoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKTp0aGlzLnNjcm9sbFRvcDthK28+cz8odCYmYStvPnMrdGhpcy5saW5lSGVpZ2h0JiYocy09dCp0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0KSxzPT09MCYmKHM9LXRoaXMuc2Nyb2xsTWFyZ2luLnRvcCksdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChzKSk6YSt0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0LXU8cyt0aGlzLmxpbmVIZWlnaHQmJih0JiZhK3RoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQtdTxzLXRoaXMubGluZUhlaWdodCYmKHMrPXQqdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCksdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChzK3RoaXMubGluZUhlaWdodCt1LXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpKTt2YXIgZj10aGlzLnNjcm9sbExlZnQ7Zj5pPyhpPHRoaXMuJHBhZGRpbmcrMip0aGlzLmxheWVyQ29uZmlnLmNoYXJhY3RlcldpZHRoJiYoaT0tdGhpcy5zY3JvbGxNYXJnaW4ubGVmdCksdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQoaSkpOmYrdGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoPGkrdGhpcy5jaGFyYWN0ZXJXaWR0aD90aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChNYXRoLnJvdW5kKGkrdGhpcy5jaGFyYWN0ZXJXaWR0aC10aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgpKTpmPD10aGlzLiRwYWRkaW5nJiZpLWY8dGhpcy5jaGFyYWN0ZXJXaWR0aCYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQoMCl9LHRoaXMuZ2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKX0sdGhpcy5nZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCl9LHRoaXMuZ2V0U2Nyb2xsVG9wUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Nyb2xsVG9wL3RoaXMubGluZUhlaWdodH0sdGhpcy5nZXRTY3JvbGxCb3R0b21Sb3c9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLmZsb29yKCh0aGlzLnNjcm9sbFRvcCt0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0KS90aGlzLmxpbmVIZWlnaHQpLTEpfSx0aGlzLnNjcm9sbFRvUm93PWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoZSp0aGlzLmxpbmVIZWlnaHQpfSx0aGlzLmFsaWduQ3Vyc29yPWZ1bmN0aW9uKGUsdCl7dHlwZW9mIGU9PSJudW1iZXIiJiYoZT17cm93OmUsY29sdW1uOjB9KTt2YXIgbj10aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKGUpLHI9dGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodC10aGlzLmxpbmVIZWlnaHQsaT1uLnRvcC1yKih0fHwwKTtyZXR1cm4gdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChpKSxpfSx0aGlzLlNURVBTPTgsdGhpcy4kY2FsY1N0ZXBzPWZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPXRoaXMuU1RFUFMsaT1bXSxzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbiooTWF0aC5wb3coZS0xLDMpKzEpK3R9O2ZvcihuPTA7bjxyOysrbilpLnB1c2gocyhuL3RoaXMuU1RFUFMsZSx0LWUpKTtyZXR1cm4gaX0sdGhpcy5zY3JvbGxUb0xpbmU9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbih7cm93OmUsY29sdW1uOjB9KSxzPWkudG9wO3QmJihzLT10aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0LzIpO3ZhciBvPXRoaXMuc2Nyb2xsVG9wO3RoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AocyksbiE9PSExJiZ0aGlzLmFuaW1hdGVTY3JvbGxpbmcobyxyKX0sdGhpcy5hbmltYXRlU2Nyb2xsaW5nPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zY3JvbGxUb3A7aWYoIXRoaXMuJGFuaW1hdGVkU2Nyb2xsKXJldHVybjt2YXIgcj10aGlzO2lmKGU9PW4pcmV0dXJuO2lmKHRoaXMuJHNjcm9sbEFuaW1hdGlvbil7dmFyIGk9dGhpcy4kc2Nyb2xsQW5pbWF0aW9uLnN0ZXBzO2lmKGkubGVuZ3RoKXtlPWlbMF07aWYoZT09bilyZXR1cm59fXZhciBzPXIuJGNhbGNTdGVwcyhlLG4pO3RoaXMuJHNjcm9sbEFuaW1hdGlvbj17ZnJvbTplLHRvOm4sc3RlcHM6c30sY2xlYXJJbnRlcnZhbCh0aGlzLiR0aW1lciksci5zZXNzaW9uLnNldFNjcm9sbFRvcChzLnNoaWZ0KCkpLHIuc2Vzc2lvbi4kc2Nyb2xsVG9wPW4sdGhpcy4kdGltZXI9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtzLmxlbmd0aD8oci5zZXNzaW9uLnNldFNjcm9sbFRvcChzLnNoaWZ0KCkpLHIuc2Vzc2lvbi4kc2Nyb2xsVG9wPW4pOm4hPW51bGw/KHIuc2Vzc2lvbi4kc2Nyb2xsVG9wPS0xLHIuc2Vzc2lvbi5zZXRTY3JvbGxUb3Aobiksbj1udWxsKTooci4kdGltZXI9Y2xlYXJJbnRlcnZhbChyLiR0aW1lciksci4kc2Nyb2xsQW5pbWF0aW9uPW51bGwsdCYmdCgpKX0sMTApfSx0aGlzLnNjcm9sbFRvWT1mdW5jdGlvbihlKXt0aGlzLnNjcm9sbFRvcCE9PWUmJih0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1NDUk9MTCksdGhpcy5zY3JvbGxUb3A9ZSl9LHRoaXMuc2Nyb2xsVG9YPWZ1bmN0aW9uKGUpe3RoaXMuc2Nyb2xsTGVmdCE9PWUmJih0aGlzLnNjcm9sbExlZnQ9ZSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9IX1NDUk9MTCl9LHRoaXMuc2Nyb2xsVG89ZnVuY3Rpb24oZSx0KXt0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHQpLHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KHQpfSx0aGlzLnNjcm9sbEJ5PWZ1bmN0aW9uKGUsdCl7dCYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcCh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkrdCksZSYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQodGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKStlKX0sdGhpcy5pc1Njcm9sbGFibGVCeT1mdW5jdGlvbihlLHQpe2lmKHQ8MCYmdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpPj0xLXRoaXMuc2Nyb2xsTWFyZ2luLnRvcClyZXR1cm4hMDtpZih0PjAmJnRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKSt0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0LXRoaXMubGF5ZXJDb25maWcubWF4SGVpZ2h0PC0xK3RoaXMuc2Nyb2xsTWFyZ2luLmJvdHRvbSlyZXR1cm4hMDtpZihlPDAmJnRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCk+PTEtdGhpcy5zY3JvbGxNYXJnaW4ubGVmdClyZXR1cm4hMDtpZihlPjAmJnRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCkrdGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLXRoaXMubGF5ZXJDb25maWcud2lkdGg8LTErdGhpcy5zY3JvbGxNYXJnaW4ucmlnaHQpcmV0dXJuITB9LHRoaXMucGl4ZWxUb1NjcmVlbkNvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCl7dmFyIG47aWYodGhpcy4kaGFzQ3NzVHJhbnNmb3Jtcyl7bj17dG9wOjAsbGVmdDowfTt2YXIgcj10aGlzLiRmb250TWV0cmljcy50cmFuc2Zvcm1Db29yZGluYXRlcyhbZSx0XSk7ZT1yWzFdLXRoaXMuZ3V0dGVyV2lkdGgtdGhpcy5tYXJnaW4ubGVmdCx0PXJbMF19ZWxzZSBuPXRoaXMuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dmFyIGk9ZSt0aGlzLnNjcm9sbExlZnQtbi5sZWZ0LXRoaXMuJHBhZGRpbmcscz1pL3RoaXMuY2hhcmFjdGVyV2lkdGgsbz1NYXRoLmZsb29yKCh0K3RoaXMuc2Nyb2xsVG9wLW4udG9wKS90aGlzLmxpbmVIZWlnaHQpLHU9dGhpcy4kYmxvY2tDdXJzb3I/TWF0aC5mbG9vcihzKTpNYXRoLnJvdW5kKHMpO3JldHVybntyb3c6byxjb2x1bW46dSxzaWRlOnMtdT4wPzE6LTEsb2Zmc2V0WDppfX0sdGhpcy5zY3JlZW5Ub1RleHRDb29yZGluYXRlcz1mdW5jdGlvbihlLHQpe3ZhciBuO2lmKHRoaXMuJGhhc0Nzc1RyYW5zZm9ybXMpe249e3RvcDowLGxlZnQ6MH07dmFyIHI9dGhpcy4kZm9udE1ldHJpY3MudHJhbnNmb3JtQ29vcmRpbmF0ZXMoW2UsdF0pO2U9clsxXS10aGlzLmd1dHRlcldpZHRoLXRoaXMubWFyZ2luLmxlZnQsdD1yWzBdfWVsc2Ugbj10aGlzLnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBpPWUrdGhpcy5zY3JvbGxMZWZ0LW4ubGVmdC10aGlzLiRwYWRkaW5nLHM9aS90aGlzLmNoYXJhY3RlcldpZHRoLG89dGhpcy4kYmxvY2tDdXJzb3I/TWF0aC5mbG9vcihzKTpNYXRoLnJvdW5kKHMpLHU9TWF0aC5mbG9vcigodCt0aGlzLnNjcm9sbFRvcC1uLnRvcCkvdGhpcy5saW5lSGVpZ2h0KTtyZXR1cm4gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbih1LE1hdGgubWF4KG8sMCksaSl9LHRoaXMudGV4dFRvU2NyZWVuQ29vcmRpbmF0ZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihlLHQpLGk9dGhpcy4kcGFkZGluZysodGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5pc0JpZGlSb3coci5yb3csZSk/dGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5nZXRQb3NMZWZ0KHIuY29sdW1uKTpNYXRoLnJvdW5kKHIuY29sdW1uKnRoaXMuY2hhcmFjdGVyV2lkdGgpKSxzPXIucm93KnRoaXMubGluZUhlaWdodDtyZXR1cm57cGFnZVg6bi5sZWZ0K2ktdGhpcy5zY3JvbGxMZWZ0LHBhZ2VZOm4udG9wK3MtdGhpcy5zY3JvbGxUb3B9fSx0aGlzLnZpc3VhbGl6ZUZvY3VzPWZ1bmN0aW9uKCl7aS5hZGRDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwiYWNlX2ZvY3VzIil9LHRoaXMudmlzdWFsaXplQmx1cj1mdW5jdGlvbigpe2kucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsImFjZV9mb2N1cyIpfSx0aGlzLnNob3dDb21wb3NpdGlvbj1mdW5jdGlvbihlKXt0aGlzLiRjb21wb3NpdGlvbj1lLGUuY3NzVGV4dHx8KGUuY3NzVGV4dD10aGlzLnRleHRhcmVhLnN0eWxlLmNzc1RleHQpLGUudXNlVGV4dGFyZWFGb3JJTUU9dGhpcy4kdXNlVGV4dGFyZWFGb3JJTUUsdGhpcy4kdXNlVGV4dGFyZWFGb3JJTUU/KGkuYWRkQ3NzQ2xhc3ModGhpcy50ZXh0YXJlYSwiYWNlX2NvbXBvc2l0aW9uIiksdGhpcy50ZXh0YXJlYS5zdHlsZS5jc3NUZXh0PSIiLHRoaXMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCksdGhpcy4kY3Vyc29yTGF5ZXIuZWxlbWVudC5zdHlsZS5kaXNwbGF5PSJub25lIik6ZS5tYXJrZXJJZD10aGlzLnNlc3Npb24uYWRkTWFya2VyKGUubWFya2VyUmFuZ2UsImFjZV9jb21wb3NpdGlvbl9tYXJrZXIiLCJ0ZXh0Iil9LHRoaXMuc2V0Q29tcG9zaXRpb25UZXh0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uY3Vyc29yO3RoaXMuYWRkVG9rZW4oZSwiY29tcG9zaXRpb25fcGxhY2Vob2xkZXIiLHQucm93LHQuY29sdW1uKSx0aGlzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpfSx0aGlzLmhpZGVDb21wb3NpdGlvbj1mdW5jdGlvbigpe2lmKCF0aGlzLiRjb21wb3NpdGlvbilyZXR1cm47dGhpcy4kY29tcG9zaXRpb24ubWFya2VySWQmJnRoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIodGhpcy4kY29tcG9zaXRpb24ubWFya2VySWQpLGkucmVtb3ZlQ3NzQ2xhc3ModGhpcy50ZXh0YXJlYSwiYWNlX2NvbXBvc2l0aW9uIiksdGhpcy50ZXh0YXJlYS5zdHlsZS5jc3NUZXh0PXRoaXMuJGNvbXBvc2l0aW9uLmNzc1RleHQsdGhpcy4kY29tcG9zaXRpb249bnVsbCx0aGlzLiRjdXJzb3JMYXllci5lbGVtZW50LnN0eWxlLmRpc3BsYXk9IiJ9LHRoaXMuYWRkVG9rZW49ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy5zZXNzaW9uO2kuYmdUb2tlbml6ZXIubGluZXNbbl09bnVsbDt2YXIgcz17dHlwZTp0LHZhbHVlOmV9LG89aS5nZXRUb2tlbnMobik7aWYocj09bnVsbClvLnB1c2gocyk7ZWxzZXt2YXIgdT0wO2Zvcih2YXIgYT0wO2E8by5sZW5ndGg7YSsrKXt2YXIgZj1vW2FdO3UrPWYudmFsdWUubGVuZ3RoO2lmKHI8PXUpe3ZhciBsPWYudmFsdWUubGVuZ3RoLSh1LXIpLGM9Zi52YWx1ZS5zbGljZSgwLGwpLGg9Zi52YWx1ZS5zbGljZShsKTtvLnNwbGljZShhLDEse3R5cGU6Zi50eXBlLHZhbHVlOmN9LHMse3R5cGU6Zi50eXBlLHZhbHVlOmh9KTticmVha319fXRoaXMudXBkYXRlTGluZXMobixuKX0sdGhpcy5zZXRUaGVtZT1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG8ocil7aWYobi4kdGhlbWVJZCE9ZSlyZXR1cm4gdCYmdCgpO2lmKCFyfHwhci5jc3NDbGFzcyl0aHJvdyBuZXcgRXJyb3IoImNvdWxkbid0IGxvYWQgbW9kdWxlICIrZSsiIG9yIGl0IGRpZG4ndCBjYWxsIGRlZmluZSIpO3IuJGlkJiYobi4kdGhlbWVJZD1yLiRpZCksaS5pbXBvcnRDc3NTdHJpbmcoci5jc3NUZXh0LHIuY3NzQ2xhc3Msbi5jb250YWluZXIpLG4udGhlbWUmJmkucmVtb3ZlQ3NzQ2xhc3Mobi5jb250YWluZXIsbi50aGVtZS5jc3NDbGFzcyk7dmFyIHM9InBhZGRpbmciaW4gcj9yLnBhZGRpbmc6InBhZGRpbmciaW4obi50aGVtZXx8e30pPzQ6bi4kcGFkZGluZztuLiRwYWRkaW5nJiZzIT1uLiRwYWRkaW5nJiZuLnNldFBhZGRpbmcocyksbi4kdGhlbWU9ci5jc3NDbGFzcyxuLnRoZW1lPXIsaS5hZGRDc3NDbGFzcyhuLmNvbnRhaW5lcixyLmNzc0NsYXNzKSxpLnNldENzc0NsYXNzKG4uY29udGFpbmVyLCJhY2VfZGFyayIsci5pc0RhcmspLG4uJHNpemUmJihuLiRzaXplLndpZHRoPTAsbi4kdXBkYXRlU2l6ZUFzeW5jKCkpLG4uX2Rpc3BhdGNoRXZlbnQoInRoZW1lTG9hZGVkIix7dGhlbWU6cn0pLHQmJnQoKX12YXIgbj10aGlzO3RoaXMuJHRoZW1lSWQ9ZSxuLl9kaXNwYXRjaEV2ZW50KCJ0aGVtZUNoYW5nZSIse3RoZW1lOmV9KTtpZighZXx8dHlwZW9mIGU9PSJzdHJpbmciKXt2YXIgcj1lfHx0aGlzLiRvcHRpb25zLnRoZW1lLmluaXRpYWxWYWx1ZTtzLmxvYWRNb2R1bGUoWyJ0aGVtZSIscl0sbyl9ZWxzZSBvKGUpfSx0aGlzLmdldFRoZW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRoZW1lSWR9LHRoaXMuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0KXtpLnNldENzc0NsYXNzKHRoaXMuY29udGFpbmVyLGUsdCE9PSExKX0sdGhpcy51bnNldFN0eWxlPWZ1bmN0aW9uKGUpe2kucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsZSl9LHRoaXMuc2V0Q3Vyc29yU3R5bGU9ZnVuY3Rpb24oZSl7aS5zZXRTdHlsZSh0aGlzLnNjcm9sbGVyLnN0eWxlLCJjdXJzb3IiLGUpfSx0aGlzLnNldE1vdXNlQ3Vyc29yPWZ1bmN0aW9uKGUpe2kuc2V0U3R5bGUodGhpcy5zY3JvbGxlci5zdHlsZSwiY3Vyc29yIixlKX0sdGhpcy5hdHRhY2hUb1NoYWRvd1Jvb3Q9ZnVuY3Rpb24oKXtpLmltcG9ydENzc1N0cmluZyh2LCJhY2VfZWRpdG9yLmNzcyIsdGhpcy5jb250YWluZXIpfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmZyZWV6ZSgpLHRoaXMuJGZvbnRNZXRyaWNzLmRlc3Ryb3koKSx0aGlzLiRjdXJzb3JMYXllci5kZXN0cm95KCl9fSkuY2FsbCh5LnByb3RvdHlwZSkscy5kZWZpbmVPcHRpb25zKHkucHJvdG90eXBlLCJyZW5kZXJlciIse2FuaW1hdGVkU2Nyb2xsOntpbml0aWFsVmFsdWU6ITF9LHNob3dJbnZpc2libGVzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kdGV4dExheWVyLnNldFNob3dJbnZpc2libGVzKGUpJiZ0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpfSxpbml0aWFsVmFsdWU6ITF9LHNob3dQcmludE1hcmdpbjp7c2V0OmZ1bmN0aW9uKCl7dGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKX0saW5pdGlhbFZhbHVlOiEwfSxwcmludE1hcmdpbkNvbHVtbjp7c2V0OmZ1bmN0aW9uKCl7dGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKX0saW5pdGlhbFZhbHVlOjgwfSxwcmludE1hcmdpbjp7c2V0OmZ1bmN0aW9uKGUpe3R5cGVvZiBlPT0ibnVtYmVyIiYmKHRoaXMuJHByaW50TWFyZ2luQ29sdW1uPWUpLHRoaXMuJHNob3dQcmludE1hcmdpbj0hIWUsdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNob3dQcmludE1hcmdpbiYmdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW59fSxzaG93R3V0dGVyOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kZ3V0dGVyLnN0eWxlLmRpc3BsYXk9ZT8iYmxvY2siOiJub25lIix0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpLHRoaXMub25HdXR0ZXJSZXNpemUoKX0saW5pdGlhbFZhbHVlOiEwfSxmYWRlRm9sZFdpZGdldHM6e3NldDpmdW5jdGlvbihlKXtpLnNldENzc0NsYXNzKHRoaXMuJGd1dHRlciwiYWNlX2ZhZGUtZm9sZC13aWRnZXRzIixlKX0saW5pdGlhbFZhbHVlOiExfSxzaG93Rm9sZFdpZGdldHM6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRndXR0ZXJMYXllci5zZXRTaG93Rm9sZFdpZGdldHMoZSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfSxpbml0aWFsVmFsdWU6ITB9LGRpc3BsYXlJbmRlbnRHdWlkZXM6e3NldDpmdW5jdGlvbihlKXt0aGlzLiR0ZXh0TGF5ZXIuc2V0RGlzcGxheUluZGVudEd1aWRlcyhlKSYmdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9URVhUKX0saW5pdGlhbFZhbHVlOiEwfSxoaWdobGlnaHRHdXR0ZXJMaW5lOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kZ3V0dGVyTGF5ZXIuc2V0SGlnaGxpZ2h0R3V0dGVyTGluZShlKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUil9LGluaXRpYWxWYWx1ZTohMH0saFNjcm9sbEJhckFsd2F5c1Zpc2libGU6e3NldDpmdW5jdGlvbihlKXsoIXRoaXMuJGhTY3JvbGxCYXJBbHdheXNWaXNpYmxlfHwhdGhpcy4kaG9yaXpTY3JvbGwpJiZ0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1NDUk9MTCl9LGluaXRpYWxWYWx1ZTohMX0sdlNjcm9sbEJhckFsd2F5c1Zpc2libGU6e3NldDpmdW5jdGlvbihlKXsoIXRoaXMuJHZTY3JvbGxCYXJBbHdheXNWaXNpYmxlfHwhdGhpcy4kdlNjcm9sbCkmJnRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfU0NST0xMKX0saW5pdGlhbFZhbHVlOiExfSxmb250U2l6ZTp7c2V0OmZ1bmN0aW9uKGUpe3R5cGVvZiBlPT0ibnVtYmVyIiYmKGUrPSJweCIpLHRoaXMuY29udGFpbmVyLnN0eWxlLmZvbnRTaXplPWUsdGhpcy51cGRhdGVGb250U2l6ZSgpfSxpbml0aWFsVmFsdWU6MTJ9LGZvbnRGYW1pbHk6e3NldDpmdW5jdGlvbihlKXt0aGlzLmNvbnRhaW5lci5zdHlsZS5mb250RmFtaWx5PWUsdGhpcy51cGRhdGVGb250U2l6ZSgpfX0sbWF4TGluZXM6e3NldDpmdW5jdGlvbihlKXt0aGlzLnVwZGF0ZUZ1bGwoKX19LG1pbkxpbmVzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kbWluTGluZXM8NTYyOTQ5OTUzNDIxMzExfHwodGhpcy4kbWluTGluZXM9MCksdGhpcy51cGRhdGVGdWxsKCl9fSxtYXhQaXhlbEhlaWdodDp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMudXBkYXRlRnVsbCgpfSxpbml0aWFsVmFsdWU6MH0sc2Nyb2xsUGFzdEVuZDp7c2V0OmZ1bmN0aW9uKGUpe2U9K2V8fDA7aWYodGhpcy4kc2Nyb2xsUGFzdEVuZD09ZSlyZXR1cm47dGhpcy4kc2Nyb2xsUGFzdEVuZD1lLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfU0NST0xMKX0saW5pdGlhbFZhbHVlOjAsaGFuZGxlc1NldDohMH0sZml4ZWRXaWR0aEd1dHRlcjp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJGd1dHRlckxheWVyLiRmaXhlZFdpZHRoPSEhZSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUil9fSx0aGVtZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2V0VGhlbWUoZSl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR0aGVtZUlkfHx0aGlzLnRoZW1lfSxpbml0aWFsVmFsdWU6Ii4vdGhlbWUvdGV4dG1hdGUiLGhhbmRsZXNTZXQ6ITB9LGhhc0Nzc1RyYW5zZm9ybXM6e30sdXNlVGV4dGFyZWFGb3JJTUU6e2luaXRpYWxWYWx1ZTohbS5pc01vYmlsZSYmIW0uaXNJRX19KSx0LlZpcnR1YWxSZW5kZXJlcj15fSksYWNlLmRlZmluZSgiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL25ldCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9jb25maWciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHUoZSl7dmFyIHQ9ImltcG9ydFNjcmlwdHMoJyIraS5xdWFsaWZ5VVJMKGUpKyInKTsiO3RyeXtyZXR1cm4gbmV3IEJsb2IoW3RdLHt0eXBlOiJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0In0pfWNhdGNoKG4pe3ZhciByPXdpbmRvdy5CbG9iQnVpbGRlcnx8d2luZG93LldlYktpdEJsb2JCdWlsZGVyfHx3aW5kb3cuTW96QmxvYkJ1aWxkZXIscz1uZXcgcjtyZXR1cm4gcy5hcHBlbmQodCkscy5nZXRCbG9iKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil9fWZ1bmN0aW9uIGEoZSl7aWYodHlwZW9mIFdvcmtlcj09InVuZGVmaW5lZCIpcmV0dXJue3Bvc3RNZXNzYWdlOmZ1bmN0aW9uKCl7fSx0ZXJtaW5hdGU6ZnVuY3Rpb24oKXt9fTtpZihvLmdldCgibG9hZFdvcmtlckZyb21CbG9iIikpe3ZhciB0PXUoZSksbj13aW5kb3cuVVJMfHx3aW5kb3cud2Via2l0VVJMLHI9bi5jcmVhdGVPYmplY3RVUkwodCk7cmV0dXJuIG5ldyBXb3JrZXIocil9cmV0dXJuIG5ldyBXb3JrZXIoZSl9dmFyIHI9ZSgiLi4vbGliL29vcCIpLGk9ZSgiLi4vbGliL25ldCIpLHM9ZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsbz1lKCIuLi9jb25maWciKSxmPWZ1bmN0aW9uKGUpe2UucG9zdE1lc3NhZ2V8fChlPXRoaXMuJGNyZWF0ZVdvcmtlckZyb21PbGRDb25maWcuYXBwbHkodGhpcyxhcmd1bWVudHMpKSx0aGlzLiR3b3JrZXI9ZSx0aGlzLiRzZW5kRGVsdGFRdWV1ZT10aGlzLiRzZW5kRGVsdGFRdWV1ZS5iaW5kKHRoaXMpLHRoaXMuY2hhbmdlTGlzdGVuZXI9dGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpLHRoaXMub25NZXNzYWdlPXRoaXMub25NZXNzYWdlLmJpbmQodGhpcyksdGhpcy5jYWxsYmFja0lkPTEsdGhpcy5jYWxsYmFja3M9e30sdGhpcy4kd29ya2VyLm9ubWVzc2FnZT10aGlzLm9uTWVzc2FnZX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxzKSx0aGlzLiRjcmVhdGVXb3JrZXJGcm9tT2xkQ29uZmlnPWZ1bmN0aW9uKHQsbixyLGkscyl7ZS5uYW1lVG9VcmwmJiFlLnRvVXJsJiYoZS50b1VybD1lLm5hbWVUb1VybCk7aWYoby5nZXQoInBhY2thZ2VkIil8fCFlLnRvVXJsKWk9aXx8by5tb2R1bGVVcmwobiwid29ya2VyIik7ZWxzZXt2YXIgdT10aGlzLiRub3JtYWxpemVQYXRoO2k9aXx8dShlLnRvVXJsKCJhY2Uvd29ya2VyL3dvcmtlci5qcyIsbnVsbCwiXyIpKTt2YXIgZj17fTt0LmZvckVhY2goZnVuY3Rpb24odCl7Zlt0XT11KGUudG9VcmwodCxudWxsLCJfIikucmVwbGFjZSgvKFwuanMpPyhcPy4qKT8kLywiIikpfSl9cmV0dXJuIHRoaXMuJHdvcmtlcj1hKGkpLHMmJnRoaXMuc2VuZCgiaW1wb3J0U2NyaXB0cyIscyksdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtpbml0OiEwLHRsbnM6Zixtb2R1bGU6bixjbGFzc25hbWU6cn0pLHRoaXMuJHdvcmtlcn0sdGhpcy5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3N3aXRjaCh0LnR5cGUpe2Nhc2UiZXZlbnQiOnRoaXMuX3NpZ25hbCh0Lm5hbWUse2RhdGE6dC5kYXRhfSk7YnJlYWs7Y2FzZSJjYWxsIjp2YXIgbj10aGlzLmNhbGxiYWNrc1t0LmlkXTtuJiYobih0LmRhdGEpLGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1t0LmlkXSk7YnJlYWs7Y2FzZSJlcnJvciI6dGhpcy5yZXBvcnRFcnJvcih0LmRhdGEpO2JyZWFrO2Nhc2UibG9nIjp3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsdC5kYXRhKX19LHRoaXMucmVwb3J0RXJyb3I9ZnVuY3Rpb24oZSl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUuZXJyb3ImJmNvbnNvbGUuZXJyb3IoZSl9LHRoaXMuJG5vcm1hbGl6ZVBhdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGkucXVhbGlmeVVSTChlKX0sdGhpcy50ZXJtaW5hdGU9ZnVuY3Rpb24oKXt0aGlzLl9zaWduYWwoInRlcm1pbmF0ZSIse30pLHRoaXMuZGVsdGFRdWV1ZT1udWxsLHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKSx0aGlzLiR3b3JrZXI9bnVsbCx0aGlzLiRkb2MmJnRoaXMuJGRvYy5vZmYoImNoYW5nZSIsdGhpcy5jaGFuZ2VMaXN0ZW5lciksdGhpcy4kZG9jPW51bGx9LHRoaXMuc2VuZD1mdW5jdGlvbihlLHQpe3RoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDplLGFyZ3M6dH0pfSx0aGlzLmNhbGw9ZnVuY3Rpb24oZSx0LG4pe2lmKG4pe3ZhciByPXRoaXMuY2FsbGJhY2tJZCsrO3RoaXMuY2FsbGJhY2tzW3JdPW4sdC5wdXNoKHIpfXRoaXMuc2VuZChlLHQpfSx0aGlzLmVtaXQ9ZnVuY3Rpb24oZSx0KXt0cnl7dC5kYXRhJiZ0LmRhdGEuZXJyJiYodC5kYXRhLmVycj17bWVzc2FnZTp0LmRhdGEuZXJyLm1lc3NhZ2Usc3RhY2s6dC5kYXRhLmVyci5zdGFjayxjb2RlOnQuZGF0YS5lcnIuY29kZX0pLHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7ZXZlbnQ6ZSxkYXRhOntkYXRhOnQuZGF0YX19KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKG4uc3RhY2spfX0sdGhpcy5hdHRhY2hUb0RvY3VtZW50PWZ1bmN0aW9uKGUpe3RoaXMuJGRvYyYmdGhpcy50ZXJtaW5hdGUoKSx0aGlzLiRkb2M9ZSx0aGlzLmNhbGwoInNldFZhbHVlIixbZS5nZXRWYWx1ZSgpXSksZS5vbigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKX0sdGhpcy5jaGFuZ2VMaXN0ZW5lcj1mdW5jdGlvbihlKXt0aGlzLmRlbHRhUXVldWV8fCh0aGlzLmRlbHRhUXVldWU9W10sc2V0VGltZW91dCh0aGlzLiRzZW5kRGVsdGFRdWV1ZSwwKSksZS5hY3Rpb249PSJpbnNlcnQiP3RoaXMuZGVsdGFRdWV1ZS5wdXNoKGUuc3RhcnQsZS5saW5lcyk6dGhpcy5kZWx0YVF1ZXVlLnB1c2goZS5zdGFydCxlLmVuZCl9LHRoaXMuJHNlbmREZWx0YVF1ZXVlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kZWx0YVF1ZXVlO2lmKCFlKXJldHVybjt0aGlzLmRlbHRhUXVldWU9bnVsbCxlLmxlbmd0aD41MCYmZS5sZW5ndGg+dGhpcy4kZG9jLmdldExlbmd0aCgpPj4xP3RoaXMuY2FsbCgic2V0VmFsdWUiLFt0aGlzLiRkb2MuZ2V0VmFsdWUoKV0pOnRoaXMuZW1pdCgiY2hhbmdlIix7ZGF0YTplfSl9fSkuY2FsbChmLnByb3RvdHlwZSk7dmFyIGw9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW51bGwsaT0hMSx1PU9iamVjdC5jcmVhdGUocyksYT1bXSxsPW5ldyBmKHttZXNzYWdlQnVmZmVyOmEsdGVybWluYXRlOmZ1bmN0aW9uKCl7fSxwb3N0TWVzc2FnZTpmdW5jdGlvbihlKXthLnB1c2goZSk7aWYoIXIpcmV0dXJuO2k/c2V0VGltZW91dChjKTpjKCl9fSk7bC5zZXRFbWl0U3luYz1mdW5jdGlvbihlKXtpPWV9O3ZhciBjPWZ1bmN0aW9uKCl7dmFyIGU9YS5zaGlmdCgpO2UuY29tbWFuZD9yW2UuY29tbWFuZF0uYXBwbHkocixlLmFyZ3MpOmUuZXZlbnQmJnUuX3NpZ25hbChlLmV2ZW50LGUuZGF0YSl9O3JldHVybiB1LnBvc3RNZXNzYWdlPWZ1bmN0aW9uKGUpe2wub25NZXNzYWdlKHtkYXRhOmV9KX0sdS5jYWxsYmFjaz1mdW5jdGlvbihlLHQpe3RoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6ImNhbGwiLGlkOnQsZGF0YTplfSl9LHUuZW1pdD1mdW5jdGlvbihlLHQpe3RoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6ImV2ZW50IixuYW1lOmUsZGF0YTp0fSl9LG8ubG9hZE1vZHVsZShbIndvcmtlciIsdF0sZnVuY3Rpb24oZSl7cj1uZXcgZVtuXSh1KTt3aGlsZShhLmxlbmd0aCljKCl9KSxsfTt0LlVJV29ya2VyQ2xpZW50PWwsdC5Xb3JrZXJDbGllbnQ9Zix0LmNyZWF0ZVdvcmtlcj1hfSksYWNlLmRlZmluZSgiYWNlL3BsYWNlaG9sZGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL2xpYi9vb3AiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vcmFuZ2UiKS5SYW5nZSxpPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIscz1lKCIuL2xpYi9vb3AiKSxvPWZ1bmN0aW9uKGUsdCxuLHIsaSxzKXt2YXIgbz10aGlzO3RoaXMubGVuZ3RoPXQsdGhpcy5zZXNzaW9uPWUsdGhpcy5kb2M9ZS5nZXREb2N1bWVudCgpLHRoaXMubWFpbkNsYXNzPWksdGhpcy5vdGhlcnNDbGFzcz1zLHRoaXMuJG9uVXBkYXRlPXRoaXMub25VcGRhdGUuYmluZCh0aGlzKSx0aGlzLmRvYy5vbigiY2hhbmdlIix0aGlzLiRvblVwZGF0ZSksdGhpcy4kb3RoZXJzPXIsdGhpcy4kb25DdXJzb3JDaGFuZ2U9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5vbkN1cnNvckNoYW5nZSgpfSl9LHRoaXMuJHBvcz1uO3ZhciB1PWUuZ2V0VW5kb01hbmFnZXIoKS4kdW5kb1N0YWNrfHxlLmdldFVuZG9NYW5hZ2VyKCkuJHVuZG9zdGFja3x8e2xlbmd0aDotMX07dGhpcy4kdW5kb1N0YWNrRGVwdGg9dS5sZW5ndGgsdGhpcy5zZXR1cCgpLGUuc2VsZWN0aW9uLm9uKCJjaGFuZ2VDdXJzb3IiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKX07KGZ1bmN0aW9uKCl7cy5pbXBsZW1lbnQodGhpcyxpKSx0aGlzLnNldHVwPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuZG9jLG49dGhpcy5zZXNzaW9uO3RoaXMuc2VsZWN0aW9uQmVmb3JlPW4uc2VsZWN0aW9uLnRvSlNPTigpLG4uc2VsZWN0aW9uLmluTXVsdGlTZWxlY3RNb2RlJiZuLnNlbGVjdGlvbi50b1NpbmdsZVJhbmdlKCksdGhpcy5wb3M9dC5jcmVhdGVBbmNob3IodGhpcy4kcG9zLnJvdyx0aGlzLiRwb3MuY29sdW1uKTt2YXIgaT10aGlzLnBvcztpLiRpbnNlcnRSaWdodD0hMCxpLmRldGFjaCgpLGkubWFya2VySWQ9bi5hZGRNYXJrZXIobmV3IHIoaS5yb3csaS5jb2x1bW4saS5yb3csaS5jb2x1bW4rdGhpcy5sZW5ndGgpLHRoaXMubWFpbkNsYXNzLG51bGwsITEpLHRoaXMub3RoZXJzPVtdLHRoaXMuJG90aGVycy5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciByPXQuY3JlYXRlQW5jaG9yKG4ucm93LG4uY29sdW1uKTtyLiRpbnNlcnRSaWdodD0hMCxyLmRldGFjaCgpLGUub3RoZXJzLnB1c2gocil9KSxuLnNldFVuZG9TZWxlY3QoITEpfSx0aGlzLnNob3dPdGhlck1hcmtlcnM9ZnVuY3Rpb24oKXtpZih0aGlzLm90aGVyc0FjdGl2ZSlyZXR1cm47dmFyIGU9dGhpcy5zZXNzaW9uLHQ9dGhpczt0aGlzLm90aGVyc0FjdGl2ZT0hMCx0aGlzLm90aGVycy5mb3JFYWNoKGZ1bmN0aW9uKG4pe24ubWFya2VySWQ9ZS5hZGRNYXJrZXIobmV3IHIobi5yb3csbi5jb2x1bW4sbi5yb3csbi5jb2x1bW4rdC5sZW5ndGgpLHQub3RoZXJzQ2xhc3MsbnVsbCwhMSl9KX0sdGhpcy5oaWRlT3RoZXJNYXJrZXJzPWZ1bmN0aW9uKCl7aWYoIXRoaXMub3RoZXJzQWN0aXZlKXJldHVybjt0aGlzLm90aGVyc0FjdGl2ZT0hMTtmb3IodmFyIGU9MDtlPHRoaXMub3RoZXJzLmxlbmd0aDtlKyspdGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcih0aGlzLm90aGVyc1tlXS5tYXJrZXJJZCl9LHRoaXMub25VcGRhdGU9ZnVuY3Rpb24oZSl7aWYodGhpcy4kdXBkYXRpbmcpcmV0dXJuIHRoaXMudXBkYXRlQW5jaG9ycyhlKTt2YXIgdD1lO2lmKHQuc3RhcnQucm93IT09dC5lbmQucm93KXJldHVybjtpZih0LnN0YXJ0LnJvdyE9PXRoaXMucG9zLnJvdylyZXR1cm47dGhpcy4kdXBkYXRpbmc9ITA7dmFyIG49ZS5hY3Rpb249PT0iaW5zZXJ0Ij90LmVuZC5jb2x1bW4tdC5zdGFydC5jb2x1bW46dC5zdGFydC5jb2x1bW4tdC5lbmQuY29sdW1uLGk9dC5zdGFydC5jb2x1bW4+PXRoaXMucG9zLmNvbHVtbiYmdC5zdGFydC5jb2x1bW48PXRoaXMucG9zLmNvbHVtbit0aGlzLmxlbmd0aCsxLHM9dC5zdGFydC5jb2x1bW4tdGhpcy5wb3MuY29sdW1uO3RoaXMudXBkYXRlQW5jaG9ycyhlKSxpJiYodGhpcy5sZW5ndGgrPW4pO2lmKGkmJiF0aGlzLnNlc3Npb24uJGZyb21VbmRvKWlmKGUuYWN0aW9uPT09Imluc2VydCIpZm9yKHZhciBvPXRoaXMub3RoZXJzLmxlbmd0aC0xO28+PTA7by0tKXt2YXIgdT10aGlzLm90aGVyc1tvXSxhPXtyb3c6dS5yb3csY29sdW1uOnUuY29sdW1uK3N9O3RoaXMuZG9jLmluc2VydE1lcmdlZExpbmVzKGEsZS5saW5lcyl9ZWxzZSBpZihlLmFjdGlvbj09PSJyZW1vdmUiKWZvcih2YXIgbz10aGlzLm90aGVycy5sZW5ndGgtMTtvPj0wO28tLSl7dmFyIHU9dGhpcy5vdGhlcnNbb10sYT17cm93OnUucm93LGNvbHVtbjp1LmNvbHVtbitzfTt0aGlzLmRvYy5yZW1vdmUobmV3IHIoYS5yb3csYS5jb2x1bW4sYS5yb3csYS5jb2x1bW4tbikpfXRoaXMuJHVwZGF0aW5nPSExLHRoaXMudXBkYXRlTWFya2VycygpfSx0aGlzLnVwZGF0ZUFuY2hvcnM9ZnVuY3Rpb24oZSl7dGhpcy5wb3Mub25DaGFuZ2UoZSk7Zm9yKHZhciB0PXRoaXMub3RoZXJzLmxlbmd0aDt0LS07KXRoaXMub3RoZXJzW3RdLm9uQ2hhbmdlKGUpO3RoaXMudXBkYXRlTWFya2VycygpfSx0aGlzLnVwZGF0ZU1hcmtlcnM9ZnVuY3Rpb24oKXtpZih0aGlzLiR1cGRhdGluZylyZXR1cm47dmFyIGU9dGhpcyx0PXRoaXMuc2Vzc2lvbixuPWZ1bmN0aW9uKG4saSl7dC5yZW1vdmVNYXJrZXIobi5tYXJrZXJJZCksbi5tYXJrZXJJZD10LmFkZE1hcmtlcihuZXcgcihuLnJvdyxuLmNvbHVtbixuLnJvdyxuLmNvbHVtbitlLmxlbmd0aCksaSxudWxsLCExKX07bih0aGlzLnBvcyx0aGlzLm1haW5DbGFzcyk7Zm9yKHZhciBpPXRoaXMub3RoZXJzLmxlbmd0aDtpLS07KW4odGhpcy5vdGhlcnNbaV0sdGhpcy5vdGhlcnNDbGFzcyl9LHRoaXMub25DdXJzb3JDaGFuZ2U9ZnVuY3Rpb24oZSl7aWYodGhpcy4kdXBkYXRpbmd8fCF0aGlzLnNlc3Npb24pcmV0dXJuO3ZhciB0PXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCk7dC5yb3c9PT10aGlzLnBvcy5yb3cmJnQuY29sdW1uPj10aGlzLnBvcy5jb2x1bW4mJnQuY29sdW1uPD10aGlzLnBvcy5jb2x1bW4rdGhpcy5sZW5ndGg/KHRoaXMuc2hvd090aGVyTWFya2VycygpLHRoaXMuX2VtaXQoImN1cnNvckVudGVyIixlKSk6KHRoaXMuaGlkZU90aGVyTWFya2VycygpLHRoaXMuX2VtaXQoImN1cnNvckxlYXZlIixlKSl9LHRoaXMuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcih0aGlzLnBvcyYmdGhpcy5wb3MubWFya2VySWQpLHRoaXMuaGlkZU90aGVyTWFya2VycygpLHRoaXMuZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy4kb25VcGRhdGUpLHRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlQ3Vyc29yIix0aGlzLiRvbkN1cnNvckNoYW5nZSksdGhpcy5zZXNzaW9uLnNldFVuZG9TZWxlY3QoITApLHRoaXMuc2Vzc2lvbj1udWxsfSx0aGlzLmNhbmNlbD1mdW5jdGlvbigpe2lmKHRoaXMuJHVuZG9TdGFja0RlcHRoPT09LTEpcmV0dXJuO3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRVbmRvTWFuYWdlcigpLHQ9KGUuJHVuZG9TdGFja3x8ZS4kdW5kb3N0YWNrKS5sZW5ndGgtdGhpcy4kdW5kb1N0YWNrRGVwdGg7Zm9yKHZhciBuPTA7bjx0O24rKyllLnVuZG8odGhpcy5zZXNzaW9uLCEwKTt0aGlzLnNlbGVjdGlvbkJlZm9yZSYmdGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5mcm9tSlNPTih0aGlzLnNlbGVjdGlvbkJlZm9yZSl9fSkuY2FsbChvLnByb3RvdHlwZSksdC5QbGFjZUhvbGRlcj1vfSksYWNlLmRlZmluZSgiYWNlL21vdXNlL211bHRpX3NlbGVjdF9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHMoZSx0KXtyZXR1cm4gZS5yb3c9PXQucm93JiZlLmNvbHVtbj09dC5jb2x1bW59ZnVuY3Rpb24gbyhlKXt2YXIgdD1lLmRvbUV2ZW50LG49dC5hbHRLZXksbz10LnNoaWZ0S2V5LHU9dC5jdHJsS2V5LGE9ZS5nZXRBY2NlbEtleSgpLGY9ZS5nZXRCdXR0b24oKTt1JiZpLmlzTWFjJiYoZj10LmJ1dHRvbik7aWYoZS5lZGl0b3IuaW5NdWx0aVNlbGVjdE1vZGUmJmY9PTIpe2UuZWRpdG9yLnRleHRJbnB1dC5vbkNvbnRleHRNZW51KGUuZG9tRXZlbnQpO3JldHVybn1pZighdSYmIW4mJiFhKXtmPT09MCYmZS5lZGl0b3IuaW5NdWx0aVNlbGVjdE1vZGUmJmUuZWRpdG9yLmV4aXRNdWx0aVNlbGVjdE1vZGUoKTtyZXR1cm59aWYoZiE9PTApcmV0dXJuO3ZhciBsPWUuZWRpdG9yLGM9bC5zZWxlY3Rpb24saD1sLmluTXVsdGlTZWxlY3RNb2RlLHA9ZS5nZXREb2N1bWVudFBvc2l0aW9uKCksZD1jLmdldEN1cnNvcigpLHY9ZS5pblNlbGVjdGlvbigpfHxjLmlzRW1wdHkoKSYmcyhwLGQpLG09ZS54LGc9ZS55LHk9ZnVuY3Rpb24oZSl7bT1lLmNsaWVudFgsZz1lLmNsaWVudFl9LGI9bC5zZXNzaW9uLHc9bC5yZW5kZXJlci5waXhlbFRvU2NyZWVuQ29vcmRpbmF0ZXMobSxnKSxFPXcsUztpZihsLiRtb3VzZUhhbmRsZXIuJGVuYWJsZUp1bXBUb0RlZil1JiZufHxhJiZuP1M9bz8iYmxvY2siOiJhZGQiOm4mJmwuJGJsb2NrU2VsZWN0RW5hYmxlZCYmKFM9ImJsb2NrIik7ZWxzZSBpZihhJiYhbil7Uz0iYWRkIjtpZighaCYmbylyZXR1cm59ZWxzZSBuJiZsLiRibG9ja1NlbGVjdEVuYWJsZWQmJihTPSJibG9jayIpO1MmJmkuaXNNYWMmJnQuY3RybEtleSYmbC4kbW91c2VIYW5kbGVyLmNhbmNlbENvbnRleHRNZW51KCk7aWYoUz09ImFkZCIpe2lmKCFoJiZ2KXJldHVybjtpZighaCl7dmFyIHg9Yy50b09yaWVudGVkUmFuZ2UoKTtsLmFkZFNlbGVjdGlvbk1hcmtlcih4KX12YXIgVD1jLnJhbmdlTGlzdC5yYW5nZUF0UG9pbnQocCk7bC5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSEwLG8mJihUPW51bGwseD1jLnJhbmdlc1swXXx8eCxsLnJlbW92ZVNlbGVjdGlvbk1hcmtlcih4KSksbC5vbmNlKCJtb3VzZXVwIixmdW5jdGlvbigpe3ZhciBlPWMudG9PcmllbnRlZFJhbmdlKCk7VCYmZS5pc0VtcHR5KCkmJnMoVC5jdXJzb3IsZS5jdXJzb3IpP2Muc3Vic3RyYWN0UG9pbnQoZS5jdXJzb3IpOihvP2Muc3Vic3RyYWN0UG9pbnQoeC5jdXJzb3IpOngmJihsLnJlbW92ZVNlbGVjdGlvbk1hcmtlcih4KSxjLmFkZFJhbmdlKHgpKSxjLmFkZFJhbmdlKGUpKSxsLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITF9KX1lbHNlIGlmKFM9PSJibG9jayIpe2Uuc3RvcCgpLGwuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMDt2YXIgTixDPVtdLGs9ZnVuY3Rpb24oKXt2YXIgZT1sLnJlbmRlcmVyLnBpeGVsVG9TY3JlZW5Db29yZGluYXRlcyhtLGcpLHQ9Yi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZS5yb3csZS5jb2x1bW4sZS5vZmZzZXRYKTtpZihzKEUsZSkmJnModCxjLmxlYWQpKXJldHVybjtFPWUsbC5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24odCksbC5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpLGwucmVtb3ZlU2VsZWN0aW9uTWFya2VycyhDKSxDPWMucmVjdGFuZ3VsYXJSYW5nZUJsb2NrKEUsdyksbC4kbW91c2VIYW5kbGVyLiRjbGlja1NlbGVjdGlvbiYmQy5sZW5ndGg9PTEmJkNbMF0uaXNFbXB0eSgpJiYoQ1swXT1sLiRtb3VzZUhhbmRsZXIuJGNsaWNrU2VsZWN0aW9uLmNsb25lKCkpLEMuZm9yRWFjaChsLmFkZFNlbGVjdGlvbk1hcmtlcixsKSxsLnVwZGF0ZVNlbGVjdGlvbk1hcmtlcnMoKX07aCYmIWE/Yy50b1NpbmdsZVJhbmdlKCk6IWgmJmEmJihOPWMudG9PcmllbnRlZFJhbmdlKCksbC5hZGRTZWxlY3Rpb25NYXJrZXIoTikpLG8/dz1iLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihjLmxlYWQpOmMubW92ZVRvUG9zaXRpb24ocCksRT17cm93Oi0xLGNvbHVtbjotMX07dmFyIEw9ZnVuY3Rpb24oZSl7aygpLGNsZWFySW50ZXJ2YWwoTyksbC5yZW1vdmVTZWxlY3Rpb25NYXJrZXJzKEMpLEMubGVuZ3RofHwoQz1bYy50b09yaWVudGVkUmFuZ2UoKV0pLE4mJihsLnJlbW92ZVNlbGVjdGlvbk1hcmtlcihOKSxjLnRvU2luZ2xlUmFuZ2UoTikpO2Zvcih2YXIgdD0wO3Q8Qy5sZW5ndGg7dCsrKWMuYWRkUmFuZ2UoQ1t0XSk7bC5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSExLGwuJG1vdXNlSGFuZGxlci4kY2xpY2tTZWxlY3Rpb249bnVsbH0sQT1rO3IuY2FwdHVyZShsLmNvbnRhaW5lcix5LEwpO3ZhciBPPXNldEludGVydmFsKGZ1bmN0aW9uKCl7QSgpfSwyMCk7cmV0dXJuIGUucHJldmVudERlZmF1bHQoKX19dmFyIHI9ZSgiLi4vbGliL2V2ZW50IiksaT1lKCIuLi9saWIvdXNlcmFnZW50Iik7dC5vbk1vdXNlRG93bj1vfSksYWNlLmRlZmluZSgiYWNlL2NvbW1hbmRzL211bHRpX3NlbGVjdF9jb21tYW5kcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9rZXlib2FyZC9oYXNoX2hhbmRsZXIiXSxmdW5jdGlvbihlLHQsbil7dC5kZWZhdWx0Q29tbWFuZHM9W3tuYW1lOiJhZGRDdXJzb3JBYm92ZSIsZGVzY3JpcHRpb246IkFkZCBjdXJzb3IgYWJvdmUiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlTGluZXMoLTEpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LVVwIixtYWM6IkN0cmwtQWx0LVVwIn0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJhZGRDdXJzb3JCZWxvdyIsZGVzY3JpcHRpb246IkFkZCBjdXJzb3IgYmVsb3ciLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlTGluZXMoMSl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtRG93biIsbWFjOiJDdHJsLUFsdC1Eb3duIn0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJhZGRDdXJzb3JBYm92ZVNraXBDdXJyZW50IixkZXNjcmlwdGlvbjoiQWRkIGN1cnNvciBhYm92ZSAoc2tpcCBjdXJyZW50KSIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmVMaW5lcygtMSwhMCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtU2hpZnQtVXAiLG1hYzoiQ3RybC1BbHQtU2hpZnQtVXAifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImFkZEN1cnNvckJlbG93U2tpcEN1cnJlbnQiLGRlc2NyaXB0aW9uOiJBZGQgY3Vyc29yIGJlbG93IChza2lwIGN1cnJlbnQpIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZUxpbmVzKDEsITApfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LVNoaWZ0LURvd24iLG1hYzoiQ3RybC1BbHQtU2hpZnQtRG93biJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0TW9yZUJlZm9yZSIsZGVzY3JpcHRpb246IlNlbGVjdCBtb3JlIGJlZm9yZSIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmUoLTEpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LUxlZnQiLG1hYzoiQ3RybC1BbHQtTGVmdCJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0TW9yZUFmdGVyIixkZXNjcmlwdGlvbjoiU2VsZWN0IG1vcmUgYWZ0ZXIiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlKDEpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LVJpZ2h0IixtYWM6IkN0cmwtQWx0LVJpZ2h0In0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3ROZXh0QmVmb3JlIixkZXNjcmlwdGlvbjoiU2VsZWN0IG5leHQgYmVmb3JlIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZSgtMSwhMCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtU2hpZnQtTGVmdCIsbWFjOiJDdHJsLUFsdC1TaGlmdC1MZWZ0In0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3ROZXh0QWZ0ZXIiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbmV4dCBhZnRlciIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmUoMSwhMCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtU2hpZnQtUmlnaHQiLG1hYzoiQ3RybC1BbHQtU2hpZnQtUmlnaHQifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNwbGl0SW50b0xpbmVzIixkZXNjcmlwdGlvbjoiU3BsaXQgaW50byBsaW5lcyIsZXhlYzpmdW5jdGlvbihlKXtlLm11bHRpU2VsZWN0LnNwbGl0SW50b0xpbmVzKCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtTCIsbWFjOiJDdHJsLUFsdC1MIn0scmVhZE9ubHk6ITB9LHtuYW1lOiJhbGlnbkN1cnNvcnMiLGRlc2NyaXB0aW9uOiJBbGlnbiBjdXJzb3JzIixleGVjOmZ1bmN0aW9uKGUpe2UuYWxpZ25DdXJzb3JzKCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtQSIsbWFjOiJDdHJsLUFsdC1BIn0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJmaW5kQWxsIixkZXNjcmlwdGlvbjoiRmluZCBhbGwiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5maW5kQWxsKCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtSyIsbWFjOiJDdHJsLUFsdC1HIn0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9XSx0Lm11bHRpU2VsZWN0Q29tbWFuZHM9W3tuYW1lOiJzaW5nbGVTZWxlY3Rpb24iLGRlc2NyaXB0aW9uOiJTaW5nbGUgc2VsZWN0aW9uIixiaW5kS2V5OiJlc2MiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5leGl0TXVsdGlTZWxlY3RNb2RlKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwLGlzQXZhaWxhYmxlOmZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLmluTXVsdGlTZWxlY3RNb2RlfX1dO3ZhciByPWUoIi4uL2tleWJvYXJkL2hhc2hfaGFuZGxlciIpLkhhc2hIYW5kbGVyO3Qua2V5Ym9hcmRIYW5kbGVyPW5ldyByKHQubXVsdGlTZWxlY3RDb21tYW5kcyl9KSxhY2UuZGVmaW5lKCJhY2UvbXVsdGlfc2VsZWN0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlX2xpc3QiLCJhY2UvcmFuZ2UiLCJhY2Uvc2VsZWN0aW9uIiwiYWNlL21vdXNlL211bHRpX3NlbGVjdF9oYW5kbGVyIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvbGFuZyIsImFjZS9jb21tYW5kcy9tdWx0aV9zZWxlY3RfY29tbWFuZHMiLCJhY2Uvc2VhcmNoIiwiYWNlL2VkaXRfc2Vzc2lvbiIsImFjZS9lZGl0b3IiLCJhY2UvY29uZmlnIl0sZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIGgoZSx0LG4pe3JldHVybiBjLiRvcHRpb25zLndyYXA9ITAsYy4kb3B0aW9ucy5uZWVkbGU9dCxjLiRvcHRpb25zLmJhY2t3YXJkcz1uPT0tMSxjLmZpbmQoZSl9ZnVuY3Rpb24gdihlLHQpe3JldHVybiBlLnJvdz09dC5yb3cmJmUuY29sdW1uPT10LmNvbHVtbn1mdW5jdGlvbiBtKGUpe2lmKGUuJG11bHRpc2VsZWN0T25TZXNzaW9uQ2hhbmdlKXJldHVybjtlLiRvbkFkZFJhbmdlPWUuJG9uQWRkUmFuZ2UuYmluZChlKSxlLiRvblJlbW92ZVJhbmdlPWUuJG9uUmVtb3ZlUmFuZ2UuYmluZChlKSxlLiRvbk11bHRpU2VsZWN0PWUuJG9uTXVsdGlTZWxlY3QuYmluZChlKSxlLiRvblNpbmdsZVNlbGVjdD1lLiRvblNpbmdsZVNlbGVjdC5iaW5kKGUpLGUuJG11bHRpc2VsZWN0T25TZXNzaW9uQ2hhbmdlPXQub25TZXNzaW9uQ2hhbmdlLmJpbmQoZSksZS4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZT1lLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlLmJpbmQoZSksZS4kbXVsdGlzZWxlY3RPblNlc3Npb25DaGFuZ2UoZSksZS5vbigiY2hhbmdlU2Vzc2lvbiIsZS4kbXVsdGlzZWxlY3RPblNlc3Npb25DaGFuZ2UpLGUub24oIm1vdXNlZG93biIsbyksZS5jb21tYW5kcy5hZGRDb21tYW5kcyhmLmRlZmF1bHRDb21tYW5kcyksZyhlKX1mdW5jdGlvbiBnKGUpe2Z1bmN0aW9uIHIodCl7biYmKGUucmVuZGVyZXIuc2V0TW91c2VDdXJzb3IoIiIpLG49ITEpfWlmKCFlLnRleHRJbnB1dClyZXR1cm47dmFyIHQ9ZS50ZXh0SW5wdXQuZ2V0RWxlbWVudCgpLG49ITE7dS5hZGRMaXN0ZW5lcih0LCJrZXlkb3duIixmdW5jdGlvbih0KXt2YXIgaT10LmtleUNvZGU9PTE4JiYhKHQuY3RybEtleXx8dC5zaGlmdEtleXx8dC5tZXRhS2V5KTtlLiRibG9ja1NlbGVjdEVuYWJsZWQmJmk/bnx8KGUucmVuZGVyZXIuc2V0TW91c2VDdXJzb3IoImNyb3NzaGFpciIpLG49ITApOm4mJnIoKX0pLHUuYWRkTGlzdGVuZXIodCwia2V5dXAiLHIpLHUuYWRkTGlzdGVuZXIodCwiYmx1ciIscil9dmFyIHI9ZSgiLi9yYW5nZV9saXN0IikuUmFuZ2VMaXN0LGk9ZSgiLi9yYW5nZSIpLlJhbmdlLHM9ZSgiLi9zZWxlY3Rpb24iKS5TZWxlY3Rpb24sbz1lKCIuL21vdXNlL211bHRpX3NlbGVjdF9oYW5kbGVyIikub25Nb3VzZURvd24sdT1lKCIuL2xpYi9ldmVudCIpLGE9ZSgiLi9saWIvbGFuZyIpLGY9ZSgiLi9jb21tYW5kcy9tdWx0aV9zZWxlY3RfY29tbWFuZHMiKTt0LmNvbW1hbmRzPWYuZGVmYXVsdENvbW1hbmRzLmNvbmNhdChmLm11bHRpU2VsZWN0Q29tbWFuZHMpO3ZhciBsPWUoIi4vc2VhcmNoIikuU2VhcmNoLGM9bmV3IGwscD1lKCIuL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uOyhmdW5jdGlvbigpe3RoaXMuZ2V0U2VsZWN0aW9uTWFya2Vycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzZWxlY3Rpb25NYXJrZXJzfX0pLmNhbGwocC5wcm90b3R5cGUpLGZ1bmN0aW9uKCl7dGhpcy5yYW5nZXM9bnVsbCx0aGlzLnJhbmdlTGlzdD1udWxsLHRoaXMuYWRkUmFuZ2U9ZnVuY3Rpb24oZSx0KXtpZighZSlyZXR1cm47aWYoIXRoaXMuaW5NdWx0aVNlbGVjdE1vZGUmJnRoaXMucmFuZ2VDb3VudD09PTApe3ZhciBuPXRoaXMudG9PcmllbnRlZFJhbmdlKCk7dGhpcy5yYW5nZUxpc3QuYWRkKG4pLHRoaXMucmFuZ2VMaXN0LmFkZChlKTtpZih0aGlzLnJhbmdlTGlzdC5yYW5nZXMubGVuZ3RoIT0yKXJldHVybiB0aGlzLnJhbmdlTGlzdC5yZW1vdmVBbGwoKSx0fHx0aGlzLmZyb21PcmllbnRlZFJhbmdlKGUpO3RoaXMucmFuZ2VMaXN0LnJlbW92ZUFsbCgpLHRoaXMucmFuZ2VMaXN0LmFkZChuKSx0aGlzLiRvbkFkZFJhbmdlKG4pfWUuY3Vyc29yfHwoZS5jdXJzb3I9ZS5lbmQpO3ZhciByPXRoaXMucmFuZ2VMaXN0LmFkZChlKTtyZXR1cm4gdGhpcy4kb25BZGRSYW5nZShlKSxyLmxlbmd0aCYmdGhpcy4kb25SZW1vdmVSYW5nZShyKSx0aGlzLnJhbmdlQ291bnQ+MSYmIXRoaXMuaW5NdWx0aVNlbGVjdE1vZGUmJih0aGlzLl9zaWduYWwoIm11bHRpU2VsZWN0IiksdGhpcy5pbk11bHRpU2VsZWN0TW9kZT0hMCx0aGlzLnNlc3Npb24uJHVuZG9TZWxlY3Q9ITEsdGhpcy5yYW5nZUxpc3QuYXR0YWNoKHRoaXMuc2Vzc2lvbikpLHR8fHRoaXMuZnJvbU9yaWVudGVkUmFuZ2UoZSl9LHRoaXMudG9TaW5nbGVSYW5nZT1mdW5jdGlvbihlKXtlPWV8fHRoaXMucmFuZ2VzWzBdO3ZhciB0PXRoaXMucmFuZ2VMaXN0LnJlbW92ZUFsbCgpO3QubGVuZ3RoJiZ0aGlzLiRvblJlbW92ZVJhbmdlKHQpLGUmJnRoaXMuZnJvbU9yaWVudGVkUmFuZ2UoZSl9LHRoaXMuc3Vic3RyYWN0UG9pbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5yYW5nZUxpc3Quc3Vic3RyYWN0UG9pbnQoZSk7aWYodClyZXR1cm4gdGhpcy4kb25SZW1vdmVSYW5nZSh0KSx0WzBdfSx0aGlzLm1lcmdlT3ZlcmxhcHBpbmdSYW5nZXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJhbmdlTGlzdC5tZXJnZSgpO2UubGVuZ3RoJiZ0aGlzLiRvblJlbW92ZVJhbmdlKGUpfSx0aGlzLiRvbkFkZFJhbmdlPWZ1bmN0aW9uKGUpe3RoaXMucmFuZ2VDb3VudD10aGlzLnJhbmdlTGlzdC5yYW5nZXMubGVuZ3RoLHRoaXMucmFuZ2VzLnVuc2hpZnQoZSksdGhpcy5fc2lnbmFsKCJhZGRSYW5nZSIse3JhbmdlOmV9KX0sdGhpcy4kb25SZW1vdmVSYW5nZT1mdW5jdGlvbihlKXt0aGlzLnJhbmdlQ291bnQ9dGhpcy5yYW5nZUxpc3QucmFuZ2VzLmxlbmd0aDtpZih0aGlzLnJhbmdlQ291bnQ9PTEmJnRoaXMuaW5NdWx0aVNlbGVjdE1vZGUpe3ZhciB0PXRoaXMucmFuZ2VMaXN0LnJhbmdlcy5wb3AoKTtlLnB1c2godCksdGhpcy5yYW5nZUNvdW50PTB9Zm9yKHZhciBuPWUubGVuZ3RoO24tLTspe3ZhciByPXRoaXMucmFuZ2VzLmluZGV4T2YoZVtuXSk7dGhpcy5yYW5nZXMuc3BsaWNlKHIsMSl9dGhpcy5fc2lnbmFsKCJyZW1vdmVSYW5nZSIse3JhbmdlczplfSksdGhpcy5yYW5nZUNvdW50PT09MCYmdGhpcy5pbk11bHRpU2VsZWN0TW9kZSYmKHRoaXMuaW5NdWx0aVNlbGVjdE1vZGU9ITEsdGhpcy5fc2lnbmFsKCJzaW5nbGVTZWxlY3QiKSx0aGlzLnNlc3Npb24uJHVuZG9TZWxlY3Q9ITAsdGhpcy5yYW5nZUxpc3QuZGV0YWNoKHRoaXMuc2Vzc2lvbikpLHQ9dHx8dGhpcy5yYW5nZXNbMF0sdCYmIXQuaXNFcXVhbCh0aGlzLmdldFJhbmdlKCkpJiZ0aGlzLmZyb21PcmllbnRlZFJhbmdlKHQpfSx0aGlzLiRpbml0UmFuZ2VMaXN0PWZ1bmN0aW9uKCl7aWYodGhpcy5yYW5nZUxpc3QpcmV0dXJuO3RoaXMucmFuZ2VMaXN0PW5ldyByLHRoaXMucmFuZ2VzPVtdLHRoaXMucmFuZ2VDb3VudD0wfSx0aGlzLmdldEFsbFJhbmdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJhbmdlQ291bnQ/dGhpcy5yYW5nZUxpc3QucmFuZ2VzLmNvbmNhdCgpOlt0aGlzLmdldFJhbmdlKCldfSx0aGlzLnNwbGl0SW50b0xpbmVzPWZ1bmN0aW9uKCl7aWYodGhpcy5yYW5nZUNvdW50PjEpe3ZhciBlPXRoaXMucmFuZ2VMaXN0LnJhbmdlcyx0PWVbZS5sZW5ndGgtMV0sbj1pLmZyb21Qb2ludHMoZVswXS5zdGFydCx0LmVuZCk7dGhpcy50b1NpbmdsZVJhbmdlKCksdGhpcy5zZXRTZWxlY3Rpb25SYW5nZShuLHQuY3Vyc29yPT10LnN0YXJ0KX1lbHNle3ZhciBuPXRoaXMuZ2V0UmFuZ2UoKSxyPXRoaXMuaXNCYWNrd2FyZHMoKSxzPW4uc3RhcnQucm93LG89bi5lbmQucm93O2lmKHM9PW8pe2lmKHIpdmFyIHU9bi5lbmQsYT1uLnN0YXJ0O2Vsc2UgdmFyIHU9bi5zdGFydCxhPW4uZW5kO3RoaXMuYWRkUmFuZ2UoaS5mcm9tUG9pbnRzKGEsYSkpLHRoaXMuYWRkUmFuZ2UoaS5mcm9tUG9pbnRzKHUsdSkpO3JldHVybn12YXIgZj1bXSxsPXRoaXMuZ2V0TGluZVJhbmdlKHMsITApO2wuc3RhcnQuY29sdW1uPW4uc3RhcnQuY29sdW1uLGYucHVzaChsKTtmb3IodmFyIGM9cysxO2M8bztjKyspZi5wdXNoKHRoaXMuZ2V0TGluZVJhbmdlKGMsITApKTtsPXRoaXMuZ2V0TGluZVJhbmdlKG8sITApLGwuZW5kLmNvbHVtbj1uLmVuZC5jb2x1bW4sZi5wdXNoKGwpLGYuZm9yRWFjaCh0aGlzLmFkZFJhbmdlLHRoaXMpfX0sdGhpcy50b2dnbGVCbG9ja1NlbGVjdGlvbj1mdW5jdGlvbigpe2lmKHRoaXMucmFuZ2VDb3VudD4xKXt2YXIgZT10aGlzLnJhbmdlTGlzdC5yYW5nZXMsdD1lW2UubGVuZ3RoLTFdLG49aS5mcm9tUG9pbnRzKGVbMF0uc3RhcnQsdC5lbmQpO3RoaXMudG9TaW5nbGVSYW5nZSgpLHRoaXMuc2V0U2VsZWN0aW9uUmFuZ2Uobix0LmN1cnNvcj09dC5zdGFydCl9ZWxzZXt2YXIgcj10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuY3Vyc29yKSxzPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5hbmNob3IpLG89dGhpcy5yZWN0YW5ndWxhclJhbmdlQmxvY2socixzKTtvLmZvckVhY2godGhpcy5hZGRSYW5nZSx0aGlzKX19LHRoaXMucmVjdGFuZ3VsYXJSYW5nZUJsb2NrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxzPWUuY29sdW1uPHQuY29sdW1uO2lmKHMpdmFyIG89ZS5jb2x1bW4sdT10LmNvbHVtbixhPWUub2Zmc2V0WCxmPXQub2Zmc2V0WDtlbHNlIHZhciBvPXQuY29sdW1uLHU9ZS5jb2x1bW4sYT10Lm9mZnNldFgsZj1lLm9mZnNldFg7dmFyIGw9ZS5yb3c8dC5yb3c7aWYobCl2YXIgYz1lLnJvdyxoPXQucm93O2Vsc2UgdmFyIGM9dC5yb3csaD1lLnJvdztvPDAmJihvPTApLGM8MCYmKGM9MCksYz09aCYmKG49ITApO3ZhciBwO2Zvcih2YXIgZD1jO2Q8PWg7ZCsrKXt2YXIgbT1pLmZyb21Qb2ludHModGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihkLG8sYSksdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihkLHUsZikpO2lmKG0uaXNFbXB0eSgpKXtpZihwJiZ2KG0uZW5kLHApKWJyZWFrO3A9bS5lbmR9bS5jdXJzb3I9cz9tLnN0YXJ0Om0uZW5kLHIucHVzaChtKX1sJiZyLnJldmVyc2UoKTtpZighbil7dmFyIGc9ci5sZW5ndGgtMTt3aGlsZShyW2ddLmlzRW1wdHkoKSYmZz4wKWctLTtpZihnPjApe3ZhciB5PTA7d2hpbGUoclt5XS5pc0VtcHR5KCkpeSsrfWZvcih2YXIgYj1nO2I+PXk7Yi0tKXJbYl0uaXNFbXB0eSgpJiZyLnNwbGljZShiLDEpfXJldHVybiByfX0uY2FsbChzLnByb3RvdHlwZSk7dmFyIGQ9ZSgiLi9lZGl0b3IiKS5FZGl0b3I7KGZ1bmN0aW9uKCl7dGhpcy51cGRhdGVTZWxlY3Rpb25NYXJrZXJzPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCl9LHRoaXMuYWRkU2VsZWN0aW9uTWFya2VyPWZ1bmN0aW9uKGUpe2UuY3Vyc29yfHwoZS5jdXJzb3I9ZS5lbmQpO3ZhciB0PXRoaXMuZ2V0U2VsZWN0aW9uU3R5bGUoKTtyZXR1cm4gZS5tYXJrZXI9dGhpcy5zZXNzaW9uLmFkZE1hcmtlcihlLCJhY2Vfc2VsZWN0aW9uIix0KSx0aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnMucHVzaChlKSx0aGlzLnNlc3Npb24uc2VsZWN0aW9uTWFya2VyQ291bnQ9dGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzLmxlbmd0aCxlfSx0aGlzLnJlbW92ZVNlbGVjdGlvbk1hcmtlcj1mdW5jdGlvbihlKXtpZighZS5tYXJrZXIpcmV0dXJuO3RoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIoZS5tYXJrZXIpO3ZhciB0PXRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2Vycy5pbmRleE9mKGUpO3QhPS0xJiZ0aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnMuc3BsaWNlKHQsMSksdGhpcy5zZXNzaW9uLnNlbGVjdGlvbk1hcmtlckNvdW50PXRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2Vycy5sZW5ndGh9LHRoaXMucmVtb3ZlU2VsZWN0aW9uTWFya2Vycz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnM7Zm9yKHZhciBuPWUubGVuZ3RoO24tLTspe3ZhciByPWVbbl07aWYoIXIubWFya2VyKWNvbnRpbnVlO3RoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIoci5tYXJrZXIpO3ZhciBpPXQuaW5kZXhPZihyKTtpIT0tMSYmdC5zcGxpY2UoaSwxKX10aGlzLnNlc3Npb24uc2VsZWN0aW9uTWFya2VyQ291bnQ9dC5sZW5ndGh9LHRoaXMuJG9uQWRkUmFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5hZGRTZWxlY3Rpb25NYXJrZXIoZS5yYW5nZSksdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCl9LHRoaXMuJG9uUmVtb3ZlUmFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5yZW1vdmVTZWxlY3Rpb25NYXJrZXJzKGUucmFuZ2VzKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKX0sdGhpcy4kb25NdWx0aVNlbGVjdD1mdW5jdGlvbihlKXtpZih0aGlzLmluTXVsdGlTZWxlY3RNb2RlKXJldHVybjt0aGlzLmluTXVsdGlTZWxlY3RNb2RlPSEwLHRoaXMuc2V0U3R5bGUoImFjZV9tdWx0aXNlbGVjdCIpLHRoaXMua2V5QmluZGluZy5hZGRLZXlib2FyZEhhbmRsZXIoZi5rZXlib2FyZEhhbmRsZXIpLHRoaXMuY29tbWFuZHMuc2V0RGVmYXVsdEhhbmRsZXIoImV4ZWMiLHRoaXMuJG9uTXVsdGlTZWxlY3RFeGVjKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKX0sdGhpcy4kb25TaW5nbGVTZWxlY3Q9ZnVuY3Rpb24oZSl7aWYodGhpcy5zZXNzaW9uLm11bHRpU2VsZWN0LmluVmlydHVhbE1vZGUpcmV0dXJuO3RoaXMuaW5NdWx0aVNlbGVjdE1vZGU9ITEsdGhpcy51bnNldFN0eWxlKCJhY2VfbXVsdGlzZWxlY3QiKSx0aGlzLmtleUJpbmRpbmcucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyKGYua2V5Ym9hcmRIYW5kbGVyKSx0aGlzLmNvbW1hbmRzLnJlbW92ZURlZmF1bHRIYW5kbGVyKCJleGVjIix0aGlzLiRvbk11bHRpU2VsZWN0RXhlYyksdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCksdGhpcy5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uIil9LHRoaXMuJG9uTXVsdGlTZWxlY3RFeGVjPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY29tbWFuZCxuPWUuZWRpdG9yO2lmKCFuLm11bHRpU2VsZWN0KXJldHVybjtpZighdC5tdWx0aVNlbGVjdEFjdGlvbil7dmFyIHI9dC5leGVjKG4sZS5hcmdzfHx7fSk7bi5tdWx0aVNlbGVjdC5hZGRSYW5nZShuLm11bHRpU2VsZWN0LnRvT3JpZW50ZWRSYW5nZSgpKSxuLm11bHRpU2VsZWN0Lm1lcmdlT3ZlcmxhcHBpbmdSYW5nZXMoKX1lbHNlIHQubXVsdGlTZWxlY3RBY3Rpb249PSJmb3JFYWNoIj9yPW4uZm9yRWFjaFNlbGVjdGlvbih0LGUuYXJncyk6dC5tdWx0aVNlbGVjdEFjdGlvbj09ImZvckVhY2hMaW5lIj9yPW4uZm9yRWFjaFNlbGVjdGlvbih0LGUuYXJncywhMCk6dC5tdWx0aVNlbGVjdEFjdGlvbj09InNpbmdsZSI/KG4uZXhpdE11bHRpU2VsZWN0TW9kZSgpLHI9dC5leGVjKG4sZS5hcmdzfHx7fSkpOnI9dC5tdWx0aVNlbGVjdEFjdGlvbihuLGUuYXJnc3x8e30pO3JldHVybiByfSx0aGlzLmZvckVhY2hTZWxlY3Rpb249ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZSlyZXR1cm47dmFyIHI9biYmbi5rZWVwT3JkZXIsaT1uPT0xfHxuJiZuLiRieUxpbmVzLG89dGhpcy5zZXNzaW9uLHU9dGhpcy5zZWxlY3Rpb24sYT11LnJhbmdlTGlzdCxmPShyP3U6YSkucmFuZ2VzLGw7aWYoIWYubGVuZ3RoKXJldHVybiBlLmV4ZWM/ZS5leGVjKHRoaXMsdHx8e30pOmUodGhpcyx0fHx7fSk7dmFyIGM9dS5fZXZlbnRSZWdpc3RyeTt1Ll9ldmVudFJlZ2lzdHJ5PXt9O3ZhciBoPW5ldyBzKG8pO3RoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMDtmb3IodmFyIHA9Zi5sZW5ndGg7cC0tOyl7aWYoaSl3aGlsZShwPjAmJmZbcF0uc3RhcnQucm93PT1mW3AtMV0uZW5kLnJvdylwLS07aC5mcm9tT3JpZW50ZWRSYW5nZShmW3BdKSxoLmluZGV4PXAsdGhpcy5zZWxlY3Rpb249by5zZWxlY3Rpb249aDt2YXIgZD1lLmV4ZWM/ZS5leGVjKHRoaXMsdHx8e30pOmUodGhpcyx0fHx7fSk7IWwmJmQhPT11bmRlZmluZWQmJihsPWQpLGgudG9PcmllbnRlZFJhbmdlKGZbcF0pfWguZGV0YWNoKCksdGhpcy5zZWxlY3Rpb249by5zZWxlY3Rpb249dSx0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITEsdS5fZXZlbnRSZWdpc3RyeT1jLHUubWVyZ2VPdmVybGFwcGluZ1JhbmdlcygpLHUucmFuZ2VzWzBdJiZ1LmZyb21PcmllbnRlZFJhbmdlKHUucmFuZ2VzWzBdKTt2YXIgdj10aGlzLnJlbmRlcmVyLiRzY3JvbGxBbmltYXRpb247cmV0dXJuIHRoaXMub25DdXJzb3JDaGFuZ2UoKSx0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCksdiYmdi5mcm9tPT12LnRvJiZ0aGlzLnJlbmRlcmVyLmFuaW1hdGVTY3JvbGxpbmcodi5mcm9tKSxsfSx0aGlzLmV4aXRNdWx0aVNlbGVjdE1vZGU9ZnVuY3Rpb24oKXtpZighdGhpcy5pbk11bHRpU2VsZWN0TW9kZXx8dGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlKXJldHVybjt0aGlzLm11bHRpU2VsZWN0LnRvU2luZ2xlUmFuZ2UoKX0sdGhpcy5nZXRTZWxlY3RlZFRleHQ9ZnVuY3Rpb24oKXt2YXIgZT0iIjtpZih0aGlzLmluTXVsdGlTZWxlY3RNb2RlJiYhdGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlKXt2YXIgdD10aGlzLm11bHRpU2VsZWN0LnJhbmdlTGlzdC5yYW5nZXMsbj1bXTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyluLnB1c2godGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0W3JdKSk7dmFyIGk9dGhpcy5zZXNzaW9uLmdldERvY3VtZW50KCkuZ2V0TmV3TGluZUNoYXJhY3RlcigpO2U9bi5qb2luKGkpLGUubGVuZ3RoPT0obi5sZW5ndGgtMSkqaS5sZW5ndGgmJihlPSIiKX1lbHNlIHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKXx8KGU9dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpKTtyZXR1cm4gZX0sdGhpcy4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZT1mdW5jdGlvbihlLHQpe2lmKHRoaXMuaW5NdWx0aVNlbGVjdE1vZGUmJiF0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGUpe3ZhciBuPXRoaXMubXVsdGlTZWxlY3QucmFuZ2VzWzBdO2lmKHRoaXMubXVsdGlTZWxlY3QuaXNFbXB0eSgpJiZ0PT10aGlzLm11bHRpU2VsZWN0LmFuY2hvcilyZXR1cm47dmFyIHI9dD09dGhpcy5tdWx0aVNlbGVjdC5hbmNob3I/bi5jdXJzb3I9PW4uc3RhcnQ/bi5lbmQ6bi5zdGFydDpuLmN1cnNvcjtyLnJvdyE9dC5yb3d8fHRoaXMuc2Vzc2lvbi4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChyLnJvdyxyLmNvbHVtbikuY29sdW1uIT10LmNvbHVtbj90aGlzLm11bHRpU2VsZWN0LnRvU2luZ2xlUmFuZ2UodGhpcy5tdWx0aVNlbGVjdC50b09yaWVudGVkUmFuZ2UoKSk6dGhpcy5tdWx0aVNlbGVjdC5tZXJnZU92ZXJsYXBwaW5nUmFuZ2VzKCl9fSx0aGlzLmZpbmRBbGw9ZnVuY3Rpb24oZSx0LG4pe3Q9dHx8e30sdC5uZWVkbGU9ZXx8dC5uZWVkbGU7aWYodC5uZWVkbGU9PXVuZGVmaW5lZCl7dmFyIHI9dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpP3RoaXMuc2VsZWN0aW9uLmdldFdvcmRSYW5nZSgpOnRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCk7dC5uZWVkbGU9dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShyKX10aGlzLiRzZWFyY2guc2V0KHQpO3ZhciBpPXRoaXMuJHNlYXJjaC5maW5kQWxsKHRoaXMuc2Vzc2lvbik7aWYoIWkubGVuZ3RoKXJldHVybiAwO3ZhciBzPXRoaXMubXVsdGlTZWxlY3Q7bnx8cy50b1NpbmdsZVJhbmdlKGlbMF0pO2Zvcih2YXIgbz1pLmxlbmd0aDtvLS07KXMuYWRkUmFuZ2UoaVtvXSwhMCk7cmV0dXJuIHImJnMucmFuZ2VMaXN0LnJhbmdlQXRQb2ludChyLnN0YXJ0KSYmcy5hZGRSYW5nZShyLCEwKSxpLmxlbmd0aH0sdGhpcy5zZWxlY3RNb3JlTGluZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNlbGVjdGlvbi50b09yaWVudGVkUmFuZ2UoKSxyPW4uY3Vyc29yPT1uLmVuZCxzPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24obi5jdXJzb3IpO3RoaXMuc2VsZWN0aW9uLiRkZXNpcmVkQ29sdW1uJiYocy5jb2x1bW49dGhpcy5zZWxlY3Rpb24uJGRlc2lyZWRDb2x1bW4pO3ZhciBvPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24ocy5yb3crZSxzLmNvbHVtbik7aWYoIW4uaXNFbXB0eSgpKXZhciB1PXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24ocj9uLmVuZDpuLnN0YXJ0KSxhPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24odS5yb3crZSx1LmNvbHVtbik7ZWxzZSB2YXIgYT1vO2lmKHIpe3ZhciBmPWkuZnJvbVBvaW50cyhvLGEpO2YuY3Vyc29yPWYuc3RhcnR9ZWxzZXt2YXIgZj1pLmZyb21Qb2ludHMoYSxvKTtmLmN1cnNvcj1mLmVuZH1mLmRlc2lyZWRDb2x1bW49cy5jb2x1bW47aWYoIXRoaXMuc2VsZWN0aW9uLmluTXVsdGlTZWxlY3RNb2RlKXRoaXMuc2VsZWN0aW9uLmFkZFJhbmdlKG4pO2Vsc2UgaWYodCl2YXIgbD1uLmN1cnNvcjt0aGlzLnNlbGVjdGlvbi5hZGRSYW5nZShmKSxsJiZ0aGlzLnNlbGVjdGlvbi5zdWJzdHJhY3RQb2ludChsKX0sdGhpcy50cmFuc3Bvc2VTZWxlY3Rpb25zPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbixuPXQubXVsdGlTZWxlY3Qscj1uLnJhbmdlcztmb3IodmFyIGk9ci5sZW5ndGg7aS0tOyl7dmFyIHM9cltpXTtpZihzLmlzRW1wdHkoKSl7dmFyIG89dC5nZXRXb3JkUmFuZ2Uocy5zdGFydC5yb3cscy5zdGFydC5jb2x1bW4pO3Muc3RhcnQucm93PW8uc3RhcnQucm93LHMuc3RhcnQuY29sdW1uPW8uc3RhcnQuY29sdW1uLHMuZW5kLnJvdz1vLmVuZC5yb3cscy5lbmQuY29sdW1uPW8uZW5kLmNvbHVtbn19bi5tZXJnZU92ZXJsYXBwaW5nUmFuZ2VzKCk7dmFyIHU9W107Zm9yKHZhciBpPXIubGVuZ3RoO2ktLTspe3ZhciBzPXJbaV07dS51bnNoaWZ0KHQuZ2V0VGV4dFJhbmdlKHMpKX1lPDA/dS51bnNoaWZ0KHUucG9wKCkpOnUucHVzaCh1LnNoaWZ0KCkpO2Zvcih2YXIgaT1yLmxlbmd0aDtpLS07KXt2YXIgcz1yW2ldLG89cy5jbG9uZSgpO3QucmVwbGFjZShzLHVbaV0pLHMuc3RhcnQucm93PW8uc3RhcnQucm93LHMuc3RhcnQuY29sdW1uPW8uc3RhcnQuY29sdW1ufW4uZnJvbU9yaWVudGVkUmFuZ2Uobi5yYW5nZXNbMF0pfSx0aGlzLnNlbGVjdE1vcmU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuc2Vzc2lvbixpPXIubXVsdGlTZWxlY3Qscz1pLnRvT3JpZW50ZWRSYW5nZSgpO2lmKHMuaXNFbXB0eSgpKXtzPXIuZ2V0V29yZFJhbmdlKHMuc3RhcnQucm93LHMuc3RhcnQuY29sdW1uKSxzLmN1cnNvcj1lPT0tMT9zLnN0YXJ0OnMuZW5kLHRoaXMubXVsdGlTZWxlY3QuYWRkUmFuZ2Uocyk7aWYobilyZXR1cm59dmFyIG89ci5nZXRUZXh0UmFuZ2UocyksdT1oKHIsbyxlKTt1JiYodS5jdXJzb3I9ZT09LTE/dS5zdGFydDp1LmVuZCx0aGlzLnNlc3Npb24udW5mb2xkKHUpLHRoaXMubXVsdGlTZWxlY3QuYWRkUmFuZ2UodSksdGhpcy5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyhudWxsLC41KSksdCYmdGhpcy5tdWx0aVNlbGVjdC5zdWJzdHJhY3RQb2ludChzLmN1cnNvcil9LHRoaXMuYWxpZ25DdXJzb3JzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLHQ9ZS5tdWx0aVNlbGVjdCxuPXQucmFuZ2VzLHI9LTEscz1uLmZpbHRlcihmdW5jdGlvbihlKXtpZihlLmN1cnNvci5yb3c9PXIpcmV0dXJuITA7cj1lLmN1cnNvci5yb3d9KTtpZighbi5sZW5ndGh8fHMubGVuZ3RoPT1uLmxlbmd0aC0xKXt2YXIgbz10aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpLHU9by5zdGFydC5yb3csZj1vLmVuZC5yb3csbD11PT1mO2lmKGwpe3ZhciBjPXRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKSxoO2RvIGg9dGhpcy5zZXNzaW9uLmdldExpbmUoZik7d2hpbGUoL1s9Ol0vLnRlc3QoaCkmJisrZjxjKTtkbyBoPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKHUpO3doaWxlKC9bPTpdLy50ZXN0KGgpJiYtLXU+MCk7dTwwJiYodT0wKSxmPj1jJiYoZj1jLTEpfXZhciBwPXRoaXMuc2Vzc2lvbi5yZW1vdmVGdWxsTGluZXModSxmKTtwPXRoaXMuJHJlQWxpZ25UZXh0KHAsbCksdGhpcy5zZXNzaW9uLmluc2VydCh7cm93OnUsY29sdW1uOjB9LHAuam9pbigiXG4iKSsiXG4iKSxsfHwoby5zdGFydC5jb2x1bW49MCxvLmVuZC5jb2x1bW49cFtwLmxlbmd0aC0xXS5sZW5ndGgpLHRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKG8pfWVsc2V7cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Quc3Vic3RyYWN0UG9pbnQoZS5jdXJzb3IpfSk7dmFyIGQ9MCx2PUluZmluaXR5LG09bi5tYXAoZnVuY3Rpb24odCl7dmFyIG49dC5jdXJzb3Iscj1lLmdldExpbmUobi5yb3cpLGk9ci5zdWJzdHIobi5jb2x1bW4pLnNlYXJjaCgvXFMvZyk7cmV0dXJuIGk9PS0xJiYoaT0wKSxuLmNvbHVtbj5kJiYoZD1uLmNvbHVtbiksaTx2JiYodj1pKSxpfSk7bi5mb3JFYWNoKGZ1bmN0aW9uKHQsbil7dmFyIHI9dC5jdXJzb3Iscz1kLXIuY29sdW1uLG89bVtuXS12O3M+bz9lLmluc2VydChyLGEuc3RyaW5nUmVwZWF0KCIgIixzLW8pKTplLnJlbW92ZShuZXcgaShyLnJvdyxyLmNvbHVtbixyLnJvdyxyLmNvbHVtbi1zK28pKSx0LnN0YXJ0LmNvbHVtbj10LmVuZC5jb2x1bW49ZCx0LnN0YXJ0LnJvdz10LmVuZC5yb3c9ci5yb3csdC5jdXJzb3I9dC5lbmR9KSx0LmZyb21PcmllbnRlZFJhbmdlKG5bMF0pLHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfX0sdGhpcy4kcmVBbGlnblRleHQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiB1KGUpe3JldHVybiBhLnN0cmluZ1JlcGVhdCgiICIsZSl9ZnVuY3Rpb24gZihlKXtyZXR1cm4gZVsyXT91KGkpK2VbMl0rdShzLWVbMl0ubGVuZ3RoK28pK2VbNF0ucmVwbGFjZSgvXihbPTpdKVxzKy8sIiQxICIpOmVbMF19ZnVuY3Rpb24gbChlKXtyZXR1cm4gZVsyXT91KGkrcy1lWzJdLmxlbmd0aCkrZVsyXSt1KG8pK2VbNF0ucmVwbGFjZSgvXihbPTpdKVxzKy8sIiQxICIpOmVbMF19ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZVsyXT91KGkpK2VbMl0rdShvKStlWzRdLnJlcGxhY2UoL14oWz06XSlccysvLCIkMSAiKTplWzBdfXZhciBuPSEwLHI9ITAsaSxzLG87cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PWUubWF0Y2goLyhccyopKC4qPykoXHMqKShbPTpdLiopLyk7cmV0dXJuIHQ/aT09bnVsbD8oaT10WzFdLmxlbmd0aCxzPXRbMl0ubGVuZ3RoLG89dFszXS5sZW5ndGgsdCk6KGkrcytvIT10WzFdLmxlbmd0aCt0WzJdLmxlbmd0aCt0WzNdLmxlbmd0aCYmKHI9ITEpLGkhPXRbMV0ubGVuZ3RoJiYobj0hMSksaT50WzFdLmxlbmd0aCYmKGk9dFsxXS5sZW5ndGgpLHM8dFsyXS5sZW5ndGgmJihzPXRbMl0ubGVuZ3RoKSxvPnRbM10ubGVuZ3RoJiYobz10WzNdLmxlbmd0aCksdCk6W2VdfSkubWFwKHQ/ZjpuP3I/bDpmOmMpfX0pLmNhbGwoZC5wcm90b3R5cGUpLHQub25TZXNzaW9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc2Vzc2lvbjt0JiYhdC5tdWx0aVNlbGVjdCYmKHQuJHNlbGVjdGlvbk1hcmtlcnM9W10sdC5zZWxlY3Rpb24uJGluaXRSYW5nZUxpc3QoKSx0Lm11bHRpU2VsZWN0PXQuc2VsZWN0aW9uKSx0aGlzLm11bHRpU2VsZWN0PXQmJnQubXVsdGlTZWxlY3Q7dmFyIG49ZS5vbGRTZXNzaW9uO24mJihuLm11bHRpU2VsZWN0Lm9mZigiYWRkUmFuZ2UiLHRoaXMuJG9uQWRkUmFuZ2UpLG4ubXVsdGlTZWxlY3Qub2ZmKCJyZW1vdmVSYW5nZSIsdGhpcy4kb25SZW1vdmVSYW5nZSksbi5tdWx0aVNlbGVjdC5vZmYoIm11bHRpU2VsZWN0Iix0aGlzLiRvbk11bHRpU2VsZWN0KSxuLm11bHRpU2VsZWN0Lm9mZigic2luZ2xlU2VsZWN0Iix0aGlzLiRvblNpbmdsZVNlbGVjdCksbi5tdWx0aVNlbGVjdC5sZWFkLm9mZigiY2hhbmdlIix0aGlzLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlKSxuLm11bHRpU2VsZWN0LmFuY2hvci5vZmYoImNoYW5nZSIsdGhpcy4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZSkpLHQmJih0Lm11bHRpU2VsZWN0Lm9uKCJhZGRSYW5nZSIsdGhpcy4kb25BZGRSYW5nZSksdC5tdWx0aVNlbGVjdC5vbigicmVtb3ZlUmFuZ2UiLHRoaXMuJG9uUmVtb3ZlUmFuZ2UpLHQubXVsdGlTZWxlY3Qub24oIm11bHRpU2VsZWN0Iix0aGlzLiRvbk11bHRpU2VsZWN0KSx0Lm11bHRpU2VsZWN0Lm9uKCJzaW5nbGVTZWxlY3QiLHRoaXMuJG9uU2luZ2xlU2VsZWN0KSx0Lm11bHRpU2VsZWN0LmxlYWQub24oImNoYW5nZSIsdGhpcy4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZSksdC5tdWx0aVNlbGVjdC5hbmNob3Iub24oImNoYW5nZSIsdGhpcy4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZSkpLHQmJnRoaXMuaW5NdWx0aVNlbGVjdE1vZGUhPXQuc2VsZWN0aW9uLmluTXVsdGlTZWxlY3RNb2RlJiYodC5zZWxlY3Rpb24uaW5NdWx0aVNlbGVjdE1vZGU/dGhpcy4kb25NdWx0aVNlbGVjdCgpOnRoaXMuJG9uU2luZ2xlU2VsZWN0KCkpfSx0Lk11bHRpU2VsZWN0PW0sZSgiLi9jb25maWciKS5kZWZpbmVPcHRpb25zKGQucHJvdG90eXBlLCJlZGl0b3IiLHtlbmFibGVNdWx0aXNlbGVjdDp7c2V0OmZ1bmN0aW9uKGUpe20odGhpcyksZT8odGhpcy5vbigiY2hhbmdlU2Vzc2lvbiIsdGhpcy4kbXVsdGlzZWxlY3RPblNlc3Npb25DaGFuZ2UpLHRoaXMub24oIm1vdXNlZG93biIsbykpOih0aGlzLm9mZigiY2hhbmdlU2Vzc2lvbiIsdGhpcy4kbXVsdGlzZWxlY3RPblNlc3Npb25DaGFuZ2UpLHRoaXMub2ZmKCJtb3VzZWRvd24iLG8pKX0sdmFsdWU6ITB9LGVuYWJsZUJsb2NrU2VsZWN0OntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kYmxvY2tTZWxlY3RFbmFibGVkPWV9LHZhbHVlOiEwfX0pfSksYWNlLmRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uLy4uL3JhbmdlIikuUmFuZ2UsaT10LkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTsoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0TGluZShuKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChyKT8ic3RhcnQiOnQ9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3Qocik/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT0vXFMvLHM9ZS5nZXRMaW5lKHQpLG89cy5zZWFyY2goaSk7aWYobz09LTEpcmV0dXJuO3ZhciB1PW58fHMubGVuZ3RoLGE9ZS5nZXRMZW5ndGgoKSxmPXQsbD10O3doaWxlKCsrdDxhKXt2YXIgYz1lLmdldExpbmUodCkuc2VhcmNoKGkpO2lmKGM9PS0xKWNvbnRpbnVlO2lmKGM8PW8pe3ZhciBoPWUuZ2V0VG9rZW5BdCh0LDApO2lmKCFofHxoLnR5cGUhPT0ic3RyaW5nIilicmVha31sPXR9aWYobD5mKXt2YXIgcD1lLmdldExpbmUobCkubGVuZ3RoO3JldHVybiBuZXcgcihmLHUsbCxwKX19LHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jaz1mdW5jdGlvbihlLHQsbixpLHMpe3ZhciBvPXtyb3c6bixjb2x1bW46aSsxfSx1PWUuJGZpbmRDbG9zaW5nQnJhY2tldCh0LG8scyk7aWYoIXUpcmV0dXJuO3ZhciBhPWUuZm9sZFdpZGdldHNbdS5yb3ddO3JldHVybiBhPT1udWxsJiYoYT1lLmdldEZvbGRXaWRnZXQodS5yb3cpKSxhPT0ic3RhcnQiJiZ1LnJvdz5vLnJvdyYmKHUucm93LS0sdS5jb2x1bW49ZS5nZXRMaW5lKHUucm93KS5sZW5ndGgpLHIuZnJvbVBvaW50cyhvLHUpfSx0aGlzLmNsb3NpbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oZSx0LG4saSxzKXt2YXIgbz17cm93Om4sY29sdW1uOml9LHU9ZS4kZmluZE9wZW5pbmdCcmFja2V0KHQsbyk7aWYoIXUpcmV0dXJuO3JldHVybiB1LmNvbHVtbisrLG8uY29sdW1uLS0sci5mcm9tUG9pbnRzKHUsbyl9fSkuY2FsbChpLnByb3RvdHlwZSl9KSxhY2UuZGVmaW5lKCJhY2UvdGhlbWUvdGV4dG1hdGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5pc0Rhcms9ITEsdC5jc3NDbGFzcz0iYWNlLXRtIix0LmNzc1RleHQ9Jy5hY2UtdG0gLmFjZV9ndXR0ZXIge2JhY2tncm91bmQ6ICNmMGYwZjA7Y29sb3I6ICMzMzM7fS5hY2UtdG0gLmFjZV9wcmludC1tYXJnaW4ge3dpZHRoOiAxcHg7YmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS10bSAuYWNlX2ZvbGQge2JhY2tncm91bmQtY29sb3I6ICM2QjcyRTY7fS5hY2UtdG0ge2JhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Y29sb3I6IGJsYWNrO30uYWNlLXRtIC5hY2VfY3Vyc29yIHtjb2xvcjogYmxhY2s7fS5hY2UtdG0gLmFjZV9pbnZpc2libGUge2NvbG9yOiByZ2IoMTkxLCAxOTEsIDE5MSk7fS5hY2UtdG0gLmFjZV9zdG9yYWdlLC5hY2UtdG0gLmFjZV9rZXl3b3JkIHtjb2xvcjogYmx1ZTt9LmFjZS10bSAuYWNlX2NvbnN0YW50IHtjb2xvcjogcmdiKDE5NywgNiwgMTEpO30uYWNlLXRtIC5hY2VfY29uc3RhbnQuYWNlX2J1aWxkaW4ge2NvbG9yOiByZ2IoODgsIDcyLCAyNDYpO30uYWNlLXRtIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtjb2xvcjogcmdiKDg4LCA5MiwgMjQ2KTt9LmFjZS10bSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHtjb2xvcjogcmdiKDYsIDE1MCwgMTQpO30uYWNlLXRtIC5hY2VfaW52YWxpZCB7YmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDAsIDAsIDAuMSk7Y29sb3I6IHJlZDt9LmFjZS10bSAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtjb2xvcjogcmdiKDYwLCA3NiwgMTE0KTt9LmFjZS10bSAuYWNlX3N1cHBvcnQuYWNlX2NvbnN0YW50IHtjb2xvcjogcmdiKDYsIDE1MCwgMTQpO30uYWNlLXRtIC5hY2Vfc3VwcG9ydC5hY2VfdHlwZSwuYWNlLXRtIC5hY2Vfc3VwcG9ydC5hY2VfY2xhc3Mge2NvbG9yOiByZ2IoMTA5LCAxMjEsIDIyMik7fS5hY2UtdG0gLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7Y29sb3I6IHJnYigxMDQsIDExOCwgMTM1KTt9LmFjZS10bSAuYWNlX3N0cmluZyB7Y29sb3I6IHJnYigzLCAxMDYsIDcpO30uYWNlLXRtIC5hY2VfY29tbWVudCB7Y29sb3I6IHJnYig3NiwgMTM2LCAxMDcpO30uYWNlLXRtIC5hY2VfY29tbWVudC5hY2VfZG9jIHtjb2xvcjogcmdiKDAsIDEwMiwgMjU1KTt9LmFjZS10bSAuYWNlX2NvbW1lbnQuYWNlX2RvYy5hY2VfdGFnIHtjb2xvcjogcmdiKDEyOCwgMTU5LCAxOTEpO30uYWNlLXRtIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge2NvbG9yOiByZ2IoMCwgMCwgMjA1KTt9LmFjZS10bSAuYWNlX3ZhcmlhYmxlIHtjb2xvcjogcmdiKDQ5LCAxMzIsIDE0OSk7fS5hY2UtdG0gLmFjZV94bWwtcGUge2NvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTt9LmFjZS10bSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge2NvbG9yOiAjMDAwMEEyO30uYWNlLXRtIC5hY2VfaGVhZGluZyB7Y29sb3I6IHJnYigxMiwgNywgMjU1KTt9LmFjZS10bSAuYWNlX2xpc3Qge2NvbG9yOnJnYigxODUsIDYsIDE0NCk7fS5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcge2NvbG9yOnJnYigwLCAyMiwgMTQyKTt9LmFjZS10bSAuYWNlX3N0cmluZy5hY2VfcmVnZXgge2NvbG9yOiByZ2IoMjU1LCAwLCAwKX0uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtiYWNrZ3JvdW5kOiByZ2IoMTgxLCAyMTMsIDI1NSk7fS5hY2UtdG0uYWNlX211bHRpc2VsZWN0IC5hY2Vfc2VsZWN0aW9uLmFjZV9zdGFydCB7Ym94LXNoYWRvdzogMCAwIDNweCAwcHggd2hpdGU7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyNTUsIDApO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RhY2sge2JhY2tncm91bmQ6IHJnYigxNjQsIDIyOSwgMTAxKTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge21hcmdpbjogLTFweCAwIDAgLTFweDtib3JkZXI6IDFweCBzb2xpZCByZ2IoMTkyLCAxOTIsIDE5Mik7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmUtbGluZSB7YmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA3KTt9LmFjZS10bSAuYWNlX2d1dHRlci1hY3RpdmUtbGluZSB7YmFja2dyb3VuZC1jb2xvciA6ICNkY2RjZGM7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZC13b3JkIHtiYWNrZ3JvdW5kOiByZ2IoMjUwLCAyNTAsIDI1NSk7Ym9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO30uYWNlLXRtIC5hY2VfaW5kZW50LWd1aWRlIHtiYWNrZ3JvdW5kOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQ0NBWUFBQUNaZ2JZbkFBQUFFMGxFUVZRSW1XUDQvLy8vZjRiTGx5Ly9Cd0FtVmdkMS93MTEvZ0FBQUFCSlJVNUVya0pnZ2c9PSIpIHJpZ2h0IHJlcGVhdC15O30nLHQuJGlkPSJhY2UvdGhlbWUvdGV4dG1hdGUiO3ZhciByPWUoIi4uL2xpYi9kb20iKTtyLmltcG9ydENzc1N0cmluZyh0LmNzc1RleHQsdC5jc3NDbGFzcyl9KSxhY2UuZGVmaW5lKCJhY2UvbGluZV93aWRnZXRzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXt0aGlzLnNlc3Npb249ZSx0aGlzLnNlc3Npb24ud2lkZ2V0TWFuYWdlcj10aGlzLHRoaXMuc2Vzc2lvbi5nZXRSb3dMZW5ndGg9dGhpcy5nZXRSb3dMZW5ndGgsdGhpcy5zZXNzaW9uLiRnZXRXaWRnZXRTY3JlZW5MZW5ndGg9dGhpcy4kZ2V0V2lkZ2V0U2NyZWVuTGVuZ3RoLHRoaXMudXBkYXRlT25DaGFuZ2U9dGhpcy51cGRhdGVPbkNoYW5nZS5iaW5kKHRoaXMpLHRoaXMucmVuZGVyV2lkZ2V0cz10aGlzLnJlbmRlcldpZGdldHMuYmluZCh0aGlzKSx0aGlzLm1lYXN1cmVXaWRnZXRzPXRoaXMubWVhc3VyZVdpZGdldHMuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24uX2NoYW5nZWRXaWRnZXRzPVtdLHRoaXMuJG9uQ2hhbmdlRWRpdG9yPXRoaXMuJG9uQ2hhbmdlRWRpdG9yLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2UiLHRoaXMudXBkYXRlT25DaGFuZ2UpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlRm9sZCIsdGhpcy51cGRhdGVPbkZvbGQpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlRWRpdG9yIix0aGlzLiRvbkNoYW5nZUVkaXRvcil9dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9kb20iKSxzPWUoIi4vcmFuZ2UiKS5SYW5nZTsoZnVuY3Rpb24oKXt0aGlzLmdldFJvd0xlbmd0aD1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpcy5saW5lV2lkZ2V0cz90PXRoaXMubGluZVdpZGdldHNbZV0mJnRoaXMubGluZVdpZGdldHNbZV0ucm93Q291bnR8fDA6dD0wLCF0aGlzLiR1c2VXcmFwTW9kZXx8IXRoaXMuJHdyYXBEYXRhW2VdPzErdDp0aGlzLiR3cmFwRGF0YVtlXS5sZW5ndGgrMSt0fSx0aGlzLiRnZXRXaWRnZXRTY3JlZW5MZW5ndGg9ZnVuY3Rpb24oKXt2YXIgZT0wO3JldHVybiB0aGlzLmxpbmVXaWRnZXRzLmZvckVhY2goZnVuY3Rpb24odCl7dCYmdC5yb3dDb3VudCYmIXQuaGlkZGVuJiYoZSs9dC5yb3dDb3VudCl9KSxlfSx0aGlzLiRvbkNoYW5nZUVkaXRvcj1mdW5jdGlvbihlKXt0aGlzLmF0dGFjaChlLmVkaXRvcil9LHRoaXMuYXR0YWNoPWZ1bmN0aW9uKGUpe2UmJmUud2lkZ2V0TWFuYWdlciYmZS53aWRnZXRNYW5hZ2VyIT10aGlzJiZlLndpZGdldE1hbmFnZXIuZGV0YWNoKCk7aWYodGhpcy5lZGl0b3I9PWUpcmV0dXJuO3RoaXMuZGV0YWNoKCksdGhpcy5lZGl0b3I9ZSxlJiYoZS53aWRnZXRNYW5hZ2VyPXRoaXMsZS5yZW5kZXJlci5vbigiYmVmb3JlUmVuZGVyIix0aGlzLm1lYXN1cmVXaWRnZXRzKSxlLnJlbmRlcmVyLm9uKCJhZnRlclJlbmRlciIsdGhpcy5yZW5kZXJXaWRnZXRzKSl9LHRoaXMuZGV0YWNoPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZWRpdG9yO2lmKCF0KXJldHVybjt0aGlzLmVkaXRvcj1udWxsLHQud2lkZ2V0TWFuYWdlcj1udWxsLHQucmVuZGVyZXIub2ZmKCJiZWZvcmVSZW5kZXIiLHRoaXMubWVhc3VyZVdpZGdldHMpLHQucmVuZGVyZXIub2ZmKCJhZnRlclJlbmRlciIsdGhpcy5yZW5kZXJXaWRnZXRzKTt2YXIgbj10aGlzLnNlc3Npb24ubGluZVdpZGdldHM7biYmbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UmJmUuZWwmJmUuZWwucGFyZW50Tm9kZSYmKGUuX2luRG9jdW1lbnQ9ITEsZS5lbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUuZWwpKX0pfSx0aGlzLnVwZGF0ZU9uRm9sZD1mdW5jdGlvbihlLHQpe3ZhciBuPXQubGluZVdpZGdldHM7aWYoIW58fCFlLmFjdGlvbilyZXR1cm47dmFyIHI9ZS5kYXRhLGk9ci5zdGFydC5yb3cscz1yLmVuZC5yb3csbz1lLmFjdGlvbj09ImFkZCI7Zm9yKHZhciB1PWkrMTt1PHM7dSsrKW5bdV0mJihuW3VdLmhpZGRlbj1vKTtuW3NdJiYobz9uW2ldP25bc10uaGlkZGVuPW86bltpXT1uW3NdOihuW2ldPT1uW3NdJiYobltpXT11bmRlZmluZWQpLG5bc10uaGlkZGVuPW8pKX0sdGhpcy51cGRhdGVPbkNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24ubGluZVdpZGdldHM7aWYoIXQpcmV0dXJuO3ZhciBuPWUuc3RhcnQucm93LHI9ZS5lbmQucm93LW47aWYociE9PTApaWYoZS5hY3Rpb249PSJyZW1vdmUiKXt2YXIgaT10LnNwbGljZShuKzEscik7aS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UmJnRoaXMucmVtb3ZlTGluZVdpZGdldChlKX0sdGhpcyksdGhpcy4kdXBkYXRlUm93cygpfWVsc2V7dmFyIHM9bmV3IEFycmF5KHIpO3MudW5zaGlmdChuLDApLHQuc3BsaWNlLmFwcGx5KHQscyksdGhpcy4kdXBkYXRlUm93cygpfX0sdGhpcy4kdXBkYXRlUm93cz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cztpZighZSlyZXR1cm47dmFyIHQ9ITA7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUsbil7aWYoZSl7dD0hMSxlLnJvdz1uO3doaWxlKGUuJG9sZFdpZGdldCllLiRvbGRXaWRnZXQucm93PW4sZT1lLiRvbGRXaWRnZXR9fSksdCYmKHRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cz1udWxsKX0sdGhpcy5hZGRMaW5lV2lkZ2V0PWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c3x8KHRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cz1uZXcgQXJyYXkodGhpcy5zZXNzaW9uLmdldExlbmd0aCgpKSk7dmFyIHQ9dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzW2Uucm93XTt0JiYoZS4kb2xkV2lkZ2V0PXQsdC5lbCYmdC5lbC5wYXJlbnROb2RlJiYodC5lbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQuZWwpLHQuX2luRG9jdW1lbnQ9ITEpKSx0aGlzLnNlc3Npb24ubGluZVdpZGdldHNbZS5yb3ddPWUsZS5zZXNzaW9uPXRoaXMuc2Vzc2lvbjt2YXIgbj10aGlzLmVkaXRvci5yZW5kZXJlcjtlLmh0bWwmJiFlLmVsJiYoZS5lbD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuZWwuaW5uZXJIVE1MPWUuaHRtbCksZS5lbCYmKGkuYWRkQ3NzQ2xhc3MoZS5lbCwiYWNlX2xpbmVXaWRnZXRDb250YWluZXIiKSxlLmVsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5lbC5zdHlsZS56SW5kZXg9NSxuLmNvbnRhaW5lci5hcHBlbmRDaGlsZChlLmVsKSxlLl9pbkRvY3VtZW50PSEwKSxlLmNvdmVyR3V0dGVyfHwoZS5lbC5zdHlsZS56SW5kZXg9MyksZS5waXhlbEhlaWdodD09bnVsbCYmKGUucGl4ZWxIZWlnaHQ9ZS5lbC5vZmZzZXRIZWlnaHQpLGUucm93Q291bnQ9PW51bGwmJihlLnJvd0NvdW50PWUucGl4ZWxIZWlnaHQvbi5sYXllckNvbmZpZy5saW5lSGVpZ2h0KTt2YXIgcj10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUucm93LDApO2UuJGZvbGQ9cjtpZihyKXt2YXIgcz10aGlzLnNlc3Npb24ubGluZVdpZGdldHM7ZS5yb3c9PXIuZW5kLnJvdyYmIXNbci5zdGFydC5yb3ddP3Nbci5zdGFydC5yb3ddPWU6ZS5oaWRkZW49ITB9cmV0dXJuIHRoaXMuc2Vzc2lvbi5fZW1pdCgiY2hhbmdlRm9sZCIse2RhdGE6e3N0YXJ0Ontyb3c6ZS5yb3d9fX0pLHRoaXMuJHVwZGF0ZVJvd3MoKSx0aGlzLnJlbmRlcldpZGdldHMobnVsbCxuKSx0aGlzLm9uV2lkZ2V0Q2hhbmdlZChlKSxlfSx0aGlzLnJlbW92ZUxpbmVXaWRnZXQ9ZnVuY3Rpb24oZSl7ZS5faW5Eb2N1bWVudD0hMSxlLnNlc3Npb249bnVsbCxlLmVsJiZlLmVsLnBhcmVudE5vZGUmJmUuZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlLmVsKTtpZihlLmVkaXRvciYmZS5lZGl0b3IuZGVzdHJveSl0cnl7ZS5lZGl0b3IuZGVzdHJveSgpfWNhdGNoKHQpe31pZih0aGlzLnNlc3Npb24ubGluZVdpZGdldHMpe3ZhciBuPXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c1tlLnJvd107aWYobj09ZSl0aGlzLnNlc3Npb24ubGluZVdpZGdldHNbZS5yb3ddPWUuJG9sZFdpZGdldCxlLiRvbGRXaWRnZXQmJnRoaXMub25XaWRnZXRDaGFuZ2VkKGUuJG9sZFdpZGdldCk7ZWxzZSB3aGlsZShuKXtpZihuLiRvbGRXaWRnZXQ9PWUpe24uJG9sZFdpZGdldD1lLiRvbGRXaWRnZXQ7YnJlYWt9bj1uLiRvbGRXaWRnZXR9fXRoaXMuc2Vzc2lvbi5fZW1pdCgiY2hhbmdlRm9sZCIse2RhdGE6e3N0YXJ0Ontyb3c6ZS5yb3d9fX0pLHRoaXMuJHVwZGF0ZVJvd3MoKX0sdGhpcy5nZXRXaWRnZXRzQXRSb3c9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzLG49dCYmdFtlXSxyPVtdO3doaWxlKG4pci5wdXNoKG4pLG49bi4kb2xkV2lkZ2V0O3JldHVybiByfSx0aGlzLm9uV2lkZ2V0Q2hhbmdlZD1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24uX2NoYW5nZWRXaWRnZXRzLnB1c2goZSksdGhpcy5lZGl0b3ImJnRoaXMuZWRpdG9yLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKX0sdGhpcy5tZWFzdXJlV2lkZ2V0cz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2Vzc2lvbi5fY2hhbmdlZFdpZGdldHMscj10LmxheWVyQ29uZmlnO2lmKCFufHwhbi5sZW5ndGgpcmV0dXJuO3ZhciBpPUluZmluaXR5O2Zvcih2YXIgcz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgbz1uW3NdO2lmKCFvfHwhby5lbCljb250aW51ZTtpZihvLnNlc3Npb24hPXRoaXMuc2Vzc2lvbiljb250aW51ZTtpZighby5faW5Eb2N1bWVudCl7aWYodGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzW28ucm93XSE9byljb250aW51ZTtvLl9pbkRvY3VtZW50PSEwLHQuY29udGFpbmVyLmFwcGVuZENoaWxkKG8uZWwpfW8uaD1vLmVsLm9mZnNldEhlaWdodCxvLmZpeGVkV2lkdGh8fChvLnc9by5lbC5vZmZzZXRXaWR0aCxvLnNjcmVlbldpZHRoPU1hdGguY2VpbChvLncvci5jaGFyYWN0ZXJXaWR0aCkpO3ZhciB1PW8uaC9yLmxpbmVIZWlnaHQ7by5jb3ZlckxpbmUmJih1LT10aGlzLnNlc3Npb24uZ2V0Um93TGluZUNvdW50KG8ucm93KSx1PDAmJih1PTApKSxvLnJvd0NvdW50IT11JiYoby5yb3dDb3VudD11LG8ucm93PGkmJihpPW8ucm93KSl9aSE9SW5maW5pdHkmJih0aGlzLnNlc3Npb24uX2VtaXQoImNoYW5nZUZvbGQiLHtkYXRhOntzdGFydDp7cm93Oml9fX0pLHRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0V2lkdGg9bnVsbCksdGhpcy5zZXNzaW9uLl9jaGFuZ2VkV2lkZ2V0cz1bXX0sdGhpcy5yZW5kZXJXaWRnZXRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dC5sYXllckNvbmZpZyxyPXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cztpZighcilyZXR1cm47dmFyIGk9TWF0aC5taW4odGhpcy5maXJzdFJvdyxuLmZpcnN0Um93KSxzPU1hdGgubWF4KHRoaXMubGFzdFJvdyxuLmxhc3RSb3csci5sZW5ndGgpO3doaWxlKGk+MCYmIXJbaV0paS0tO3RoaXMuZmlyc3RSb3c9bi5maXJzdFJvdyx0aGlzLmxhc3RSb3c9bi5sYXN0Um93LHQuJGN1cnNvckxheWVyLmNvbmZpZz1uO2Zvcih2YXIgbz1pO288PXM7bysrKXt2YXIgdT1yW29dO2lmKCF1fHwhdS5lbCljb250aW51ZTtpZih1LmhpZGRlbil7dS5lbC5zdHlsZS50b3A9LTEwMC0odS5waXhlbEhlaWdodHx8MCkrInB4Ijtjb250aW51ZX11Ll9pbkRvY3VtZW50fHwodS5faW5Eb2N1bWVudD0hMCx0LmNvbnRhaW5lci5hcHBlbmRDaGlsZCh1LmVsKSk7dmFyIGE9dC4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbih7cm93Om8sY29sdW1uOjB9LCEwKS50b3A7dS5jb3ZlckxpbmV8fChhKz1uLmxpbmVIZWlnaHQqdGhpcy5zZXNzaW9uLmdldFJvd0xpbmVDb3VudCh1LnJvdykpLHUuZWwuc3R5bGUudG9wPWEtbi5vZmZzZXQrInB4Ijt2YXIgZj11LmNvdmVyR3V0dGVyPzA6dC5ndXR0ZXJXaWR0aDt1LmZpeGVkV2lkdGh8fChmLT10LnNjcm9sbExlZnQpLHUuZWwuc3R5bGUubGVmdD1mKyJweCIsdS5mdWxsV2lkdGgmJnUuc2NyZWVuV2lkdGgmJih1LmVsLnN0eWxlLm1pbldpZHRoPW4ud2lkdGgrMipuLnBhZGRpbmcrInB4IiksdS5maXhlZFdpZHRoP3UuZWwuc3R5bGUucmlnaHQ9dC5zY3JvbGxCYXIuZ2V0V2lkdGgoKSsicHgiOnUuZWwuc3R5bGUucmlnaHQ9IiJ9fX0pLmNhbGwoby5wcm90b3R5cGUpLHQuTGluZVdpZGdldHM9b30pLGFjZS5kZWZpbmUoImFjZS9leHQvZXJyb3JfbWFya2VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpbmVfd2lkZ2V0cyIsImFjZS9saWIvZG9tIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCxuKXt2YXIgcj0wLGk9ZS5sZW5ndGgtMTt3aGlsZShyPD1pKXt2YXIgcz1yK2k+PjEsbz1uKHQsZVtzXSk7aWYobz4wKXI9cysxO2Vsc2V7aWYoIShvPDApKXJldHVybiBzO2k9cy0xfX1yZXR1cm4tKHIrMSl9ZnVuY3Rpb24gdShlLHQsbil7dmFyIHI9ZS5nZXRBbm5vdGF0aW9ucygpLnNvcnQocy5jb21wYXJlUG9pbnRzKTtpZighci5sZW5ndGgpcmV0dXJuO3ZhciBpPW8ocix7cm93OnQsY29sdW1uOi0xfSxzLmNvbXBhcmVQb2ludHMpO2k8MCYmKGk9LWktMSksaT49ci5sZW5ndGg/aT1uPjA/MDpyLmxlbmd0aC0xOmk9PT0wJiZuPDAmJihpPXIubGVuZ3RoLTEpO3ZhciB1PXJbaV07aWYoIXV8fCFuKXJldHVybjtpZih1LnJvdz09PXQpe2RvIHU9cltpKz1uXTt3aGlsZSh1JiZ1LnJvdz09PXQpO2lmKCF1KXJldHVybiByLnNsaWNlKCl9dmFyIGE9W107dD11LnJvdztkbyBhW248MD8idW5zaGlmdCI6InB1c2giXSh1KSx1PXJbaSs9bl07d2hpbGUodSYmdS5yb3c9PXQpO3JldHVybiBhLmxlbmd0aCYmYX12YXIgcj1lKCIuLi9saW5lX3dpZGdldHMiKS5MaW5lV2lkZ2V0cyxpPWUoIi4uL2xpYi9kb20iKSxzPWUoIi4uL3JhbmdlIikuUmFuZ2U7dC5zaG93RXJyb3JNYXJrZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnNlc3Npb247bi53aWRnZXRNYW5hZ2VyfHwobi53aWRnZXRNYW5hZ2VyPW5ldyByKG4pLG4ud2lkZ2V0TWFuYWdlci5hdHRhY2goZSkpO3ZhciBzPWUuZ2V0Q3Vyc29yUG9zaXRpb24oKSxvPXMucm93LGE9bi53aWRnZXRNYW5hZ2VyLmdldFdpZGdldHNBdFJvdyhvKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09ImVycm9yTWFya2VyIn0pWzBdO2E/YS5kZXN0cm95KCk6by09dDt2YXIgZj11KG4sbyx0KSxsO2lmKGYpe3ZhciBjPWZbMF07cy5jb2x1bW49KGMucG9zJiZ0eXBlb2YgYy5jb2x1bW4hPSJudW1iZXIiP2MucG9zLnNjOmMuY29sdW1uKXx8MCxzLnJvdz1jLnJvdyxsPWUucmVuZGVyZXIuJGd1dHRlckxheWVyLiRhbm5vdGF0aW9uc1tzLnJvd119ZWxzZXtpZihhKXJldHVybjtsPXt0ZXh0OlsiTG9va3MgZ29vZCEiXSxjbGFzc05hbWU6ImFjZV9vayJ9fWUuc2Vzc2lvbi51bmZvbGQocy5yb3cpLGUuc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKHMpO3ZhciBoPXtyb3c6cy5yb3csZml4ZWRXaWR0aDohMCxjb3Zlckd1dHRlcjohMCxlbDppLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHR5cGU6ImVycm9yTWFya2VyIn0scD1oLmVsLmFwcGVuZENoaWxkKGkuY3JlYXRlRWxlbWVudCgiZGl2IikpLGQ9aC5lbC5hcHBlbmRDaGlsZChpLmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtkLmNsYXNzTmFtZT0iZXJyb3Jfd2lkZ2V0X2Fycm93ICIrbC5jbGFzc05hbWU7dmFyIHY9ZS5yZW5kZXJlci4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbihzKS5sZWZ0O2Quc3R5bGUubGVmdD12K2UucmVuZGVyZXIuZ3V0dGVyV2lkdGgtNSsicHgiLGguZWwuY2xhc3NOYW1lPSJlcnJvcl93aWRnZXRfd3JhcHBlciIscC5jbGFzc05hbWU9ImVycm9yX3dpZGdldCAiK2wuY2xhc3NOYW1lLHAuaW5uZXJIVE1MPWwudGV4dC5qb2luKCI8YnI+IikscC5hcHBlbmRDaGlsZChpLmNyZWF0ZUVsZW1lbnQoImRpdiIpKTt2YXIgbT1mdW5jdGlvbihlLHQsbil7aWYodD09PTAmJihuPT09ImVzYyJ8fG49PT0icmV0dXJuIikpcmV0dXJuIGguZGVzdHJveSgpLHtjb21tYW5kOiJudWxsIn19O2guZGVzdHJveT1mdW5jdGlvbigpe2lmKGUuJG1vdXNlSGFuZGxlci5pc01vdXNlUHJlc3NlZClyZXR1cm47ZS5rZXlCaW5kaW5nLnJlbW92ZUtleWJvYXJkSGFuZGxlcihtKSxuLndpZGdldE1hbmFnZXIucmVtb3ZlTGluZVdpZGdldChoKSxlLm9mZigiY2hhbmdlU2VsZWN0aW9uIixoLmRlc3Ryb3kpLGUub2ZmKCJjaGFuZ2VTZXNzaW9uIixoLmRlc3Ryb3kpLGUub2ZmKCJtb3VzZXVwIixoLmRlc3Ryb3kpLGUub2ZmKCJjaGFuZ2UiLGguZGVzdHJveSl9LGUua2V5QmluZGluZy5hZGRLZXlib2FyZEhhbmRsZXIobSksZS5vbigiY2hhbmdlU2VsZWN0aW9uIixoLmRlc3Ryb3kpLGUub24oImNoYW5nZVNlc3Npb24iLGguZGVzdHJveSksZS5vbigibW91c2V1cCIsaC5kZXN0cm95KSxlLm9uKCJjaGFuZ2UiLGguZGVzdHJveSksZS5zZXNzaW9uLndpZGdldE1hbmFnZXIuYWRkTGluZVdpZGdldChoKSxoLmVsLm9ubW91c2Vkb3duPWUuZm9jdXMuYmluZChlKSxlLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsLjUse2JvdHRvbTpoLmVsLm9mZnNldEhlaWdodH0pfSxpLmltcG9ydENzc1N0cmluZygiICAgIC5lcnJvcl93aWRnZXRfd3JhcHBlciB7ICAgICAgICBiYWNrZ3JvdW5kOiBpbmhlcml0OyAgICAgICAgY29sb3I6IGluaGVyaXQ7ICAgICAgICBib3JkZXI6bm9uZSAgICB9ICAgIC5lcnJvcl93aWRnZXQgeyAgICAgICAgYm9yZGVyLXRvcDogc29saWQgMnB4OyAgICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMnB4OyAgICAgICAgbWFyZ2luOiA1cHggMDsgICAgICAgIHBhZGRpbmc6IDEwcHggNDBweDsgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgICAgfSAgICAuZXJyb3Jfd2lkZ2V0LmFjZV9lcnJvciwgLmVycm9yX3dpZGdldF9hcnJvdy5hY2VfZXJyb3J7ICAgICAgICBib3JkZXItY29sb3I6ICNmZjVhNWEgICAgfSAgICAuZXJyb3Jfd2lkZ2V0LmFjZV93YXJuaW5nLCAuZXJyb3Jfd2lkZ2V0X2Fycm93LmFjZV93YXJuaW5neyAgICAgICAgYm9yZGVyLWNvbG9yOiAjRjFEODE3ICAgIH0gICAgLmVycm9yX3dpZGdldC5hY2VfaW5mbywgLmVycm9yX3dpZGdldF9hcnJvdy5hY2VfaW5mb3sgICAgICAgIGJvcmRlci1jb2xvcjogIzVhNWE1YSAgICB9ICAgIC5lcnJvcl93aWRnZXQuYWNlX29rLCAuZXJyb3Jfd2lkZ2V0X2Fycm93LmFjZV9va3sgICAgICAgIGJvcmRlci1jb2xvcjogIzVhYWE1YSAgICB9ICAgIC5lcnJvcl93aWRnZXRfYXJyb3cgeyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOyAgICAgICAgYm9yZGVyOiBzb2xpZCA1cHg7ICAgICAgICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudCFpbXBvcnRhbnQ7ICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50IWltcG9ydGFudDsgICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudCFpbXBvcnRhbnQ7ICAgICAgICB0b3A6IC01cHg7ICAgIH0iLCIiKX0pLGFjZS5kZWZpbmUoImFjZS9hY2UiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2V2ZW50IiwiYWNlL3JhbmdlIiwiYWNlL2VkaXRvciIsImFjZS9lZGl0X3Nlc3Npb24iLCJhY2UvdW5kb21hbmFnZXIiLCJhY2UvdmlydHVhbF9yZW5kZXJlciIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9rZXlib2FyZC9oYXNoX2hhbmRsZXIiLCJhY2UvcGxhY2Vob2xkZXIiLCJhY2UvbXVsdGlfc2VsZWN0IiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiLCJhY2UvdGhlbWUvdGV4dG1hdGUiLCJhY2UvZXh0L2Vycm9yX21hcmtlciIsImFjZS9jb25maWciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UoIi4vbGliL2ZpeG9sZGJyb3dzZXJzIik7dmFyIHI9ZSgiLi9saWIvZG9tIiksaT1lKCIuL2xpYi9ldmVudCIpLHM9ZSgiLi9yYW5nZSIpLlJhbmdlLG89ZSgiLi9lZGl0b3IiKS5FZGl0b3IsdT1lKCIuL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uLGE9ZSgiLi91bmRvbWFuYWdlciIpLlVuZG9NYW5hZ2VyLGY9ZSgiLi92aXJ0dWFsX3JlbmRlcmVyIikuVmlydHVhbFJlbmRlcmVyO2UoIi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKSxlKCIuL2tleWJvYXJkL2hhc2hfaGFuZGxlciIpLGUoIi4vcGxhY2Vob2xkZXIiKSxlKCIuL211bHRpX3NlbGVjdCIpLGUoIi4vbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIpLGUoIi4vdGhlbWUvdGV4dG1hdGUiKSxlKCIuL2V4dC9lcnJvcl9tYXJrZXIiKSx0LmNvbmZpZz1lKCIuL2NvbmZpZyIpLHQucmVxdWlyZT1lLHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJih0LmRlZmluZT1kZWZpbmUpLHQuZWRpdD1mdW5jdGlvbihlLG4pe2lmKHR5cGVvZiBlPT0ic3RyaW5nIil7dmFyIHM9ZTtlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHMpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiYWNlLmVkaXQgY2FuJ3QgZmluZCBkaXYgIyIrcyl9aWYoZSYmZS5lbnYmJmUuZW52LmVkaXRvciBpbnN0YW5jZW9mIG8pcmV0dXJuIGUuZW52LmVkaXRvcjt2YXIgdT0iIjtpZihlJiYvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGUudGFnTmFtZSkpe3ZhciBhPWU7dT1hLnZhbHVlLGU9ci5jcmVhdGVFbGVtZW50KCJwcmUiKSxhLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYSl9ZWxzZSBlJiYodT1lLnRleHRDb250ZW50LGUuaW5uZXJIVE1MPSIiKTt2YXIgbD10LmNyZWF0ZUVkaXRTZXNzaW9uKHUpLGM9bmV3IG8obmV3IGYoZSksbCxuKSxoPXtkb2N1bWVudDpsLGVkaXRvcjpjLG9uUmVzaXplOmMucmVzaXplLmJpbmQoYyxudWxsKX07cmV0dXJuIGEmJihoLnRleHRhcmVhPWEpLGkuYWRkTGlzdGVuZXIod2luZG93LCJyZXNpemUiLGgub25SZXNpemUpLGMub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7aS5yZW1vdmVMaXN0ZW5lcih3aW5kb3csInJlc2l6ZSIsaC5vblJlc2l6ZSksaC5lZGl0b3IuY29udGFpbmVyLmVudj1udWxsfSksYy5jb250YWluZXIuZW52PWMuZW52PWgsY30sdC5jcmVhdGVFZGl0U2Vzc2lvbj1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyB1KGUsdCk7cmV0dXJuIG4uc2V0VW5kb01hbmFnZXIobmV3IGEpLG59LHQuUmFuZ2U9cyx0LkVkaXRvcj1vLHQuRWRpdFNlc3Npb249dSx0LlVuZG9NYW5hZ2VyPWEsdC5WaXJ0dWFsUmVuZGVyZXI9Zix0LnZlcnNpb249dC5jb25maWcudmVyc2lvbn0pOyAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGFjZS5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5jb25maWcuaW5pdCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5kZWZpbmUgPSBhY2UuZGVmaW5lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSBhOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZVsiZGVmYXVsdCJdID0gd2luZG93LmFjZTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IiAmJiB0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiBtb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwo=",
- ],
-
- [
- "ace.режим-js",
- "Ly8gSmF2YVNjcmlwdCBtb2RlIGZvciBBQ0UuCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS1idWlsZHMvYmxvYi9tYXN0ZXIvc3JjLW1pbi1ub2NvbmZsaWN0L21vZGUtamF2YXNjcmlwdC5qcwphY2UuZGVmaW5lKCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvb29wIiksaT1lKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLHM9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiY29tbWVudC5kb2MudGFnIixyZWdleDoiQFtcXHdcXGRfXSsifSxzLmdldFRhZ1J1bGUoKSx7ZGVmYXVsdFRva2VuOiJjb21tZW50LmRvYyIsY2FzZUluc2Vuc2l0aXZlOiEwfV19fTtyLmluaGVyaXRzKHMsaSkscy5nZXRUYWdSdWxlPWZ1bmN0aW9uKGUpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MudGFnLnN0b3JhZ2UudHlwZSIscmVnZXg6IlxcYig/OlRPRE98RklYTUV8WFhYfEhBQ0spXFxiIn19LHMuZ2V0U3RhcnRSdWxlPWZ1bmN0aW9uKGUpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLHJlZ2V4OiJcXC9cXCooPz1cXCopIixuZXh0OmV9fSxzLmdldEVuZFJ1bGU9ZnVuY3Rpb24oZSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIscmVnZXg6IlxcKlxcLyIsbmV4dDplfX0sdC5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXM9c30pLGFjZS5kZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYSgpe3ZhciBlPW8ucmVwbGFjZSgiXFxkIiwiXFxkXFwtIiksdD17b25NYXRjaDpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5jaGFyQXQoMSk9PSIvIj8yOjE7aWYocj09MSl0IT10aGlzLm5leHRTdGF0ZT9uLnVuc2hpZnQodGhpcy5uZXh0LHRoaXMubmV4dFN0YXRlLDApOm4udW5zaGlmdCh0aGlzLm5leHQpLG5bMl0rKztlbHNlIGlmKHI9PTImJnQ9PXRoaXMubmV4dFN0YXRlKXtuWzFdLS07aWYoIW5bMV18fG5bMV08MCluLnNoaWZ0KCksbi5zaGlmdCgpfXJldHVyblt7dHlwZToibWV0YS50YWcucHVuY3R1YXRpb24uIisocj09MT8iIjoiZW5kLSIpKyJ0YWctb3Blbi54bWwiLHZhbHVlOmUuc2xpY2UoMCxyKX0se3R5cGU6Im1ldGEudGFnLnRhZy1uYW1lLnhtbCIsdmFsdWU6ZS5zdWJzdHIocil9XX0scmVnZXg6IjwvPyIrZSsiIixuZXh0OiJqc3hBdHRyaWJ1dGVzIixuZXh0U3RhdGU6ImpzeCJ9O3RoaXMuJHJ1bGVzLnN0YXJ0LnVuc2hpZnQodCk7dmFyIG49e3JlZ2V4OiJ7Iix0b2tlbjoicGFyZW4ucXVhc2kuc3RhcnQiLHB1c2g6InN0YXJ0In07dGhpcy4kcnVsZXMuanN4PVtuLHQse2luY2x1ZGU6InJlZmVyZW5jZSJ9LHtkZWZhdWx0VG9rZW46InN0cmluZyJ9XSx0aGlzLiRydWxlcy5qc3hBdHRyaWJ1dGVzPVt7dG9rZW46Im1ldGEudGFnLnB1bmN0dWF0aW9uLnRhZy1jbG9zZS54bWwiLHJlZ2V4OiIvPz4iLG9uTWF0Y2g6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PT1uWzBdJiZuLnNoaWZ0KCksZS5sZW5ndGg9PTImJihuWzBdPT10aGlzLm5leHRTdGF0ZSYmblsxXS0tLCghblsxXXx8blsxXTwwKSYmbi5zcGxpY2UoMCwyKSksdGhpcy5uZXh0PW5bMF18fCJzdGFydCIsW3t0eXBlOnRoaXMudG9rZW4sdmFsdWU6ZX1dfSxuZXh0U3RhdGU6ImpzeCJ9LG4sZigianN4QXR0cmlidXRlcyIpLHt0b2tlbjoiZW50aXR5Lm90aGVyLmF0dHJpYnV0ZS1uYW1lLnhtbCIscmVnZXg6ZX0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yLmF0dHJpYnV0ZS1lcXVhbHMueG1sIixyZWdleDoiPSJ9LHt0b2tlbjoidGV4dC50YWctd2hpdGVzcGFjZS54bWwiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCIscmVnZXg6IiciLHN0YXRlTmFtZToianN4X2F0dHJfcSIscHVzaDpbe3Rva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCIscmVnZXg6IiciLG5leHQ6InBvcCJ9LHtpbmNsdWRlOiJyZWZlcmVuY2UifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCJ9XX0se3Rva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCIscmVnZXg6JyInLHN0YXRlTmFtZToianN4X2F0dHJfcXEiLHB1c2g6W3t0b2tlbjoic3RyaW5nLmF0dHJpYnV0ZS12YWx1ZS54bWwiLHJlZ2V4OiciJyxuZXh0OiJwb3AifSx7aW5jbHVkZToicmVmZXJlbmNlIn0se2RlZmF1bHRUb2tlbjoic3RyaW5nLmF0dHJpYnV0ZS12YWx1ZS54bWwifV19LHRdLHRoaXMuJHJ1bGVzLnJlZmVyZW5jZT1be3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUucmVmZXJlbmNlLnhtbCIscmVnZXg6Iig/OiYjWzAtOV0rOyl8KD86JiN4WzAtOWEtZkEtRl0rOyl8KD86JlthLXpBLVowLTlfOlxcLi1dKzspIn1dfWZ1bmN0aW9uIGYoZSl7cmV0dXJuW3t0b2tlbjoiY29tbWVudCIscmVnZXg6L1wvXCovLG5leHQ6W2kuZ2V0VGFnUnVsZSgpLHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcKlxcLyIsbmV4dDplfHwicG9wIn0se2RlZmF1bHRUb2tlbjoiY29tbWVudCIsY2FzZUluc2Vuc2l0aXZlOiEwfV19LHt0b2tlbjoiY29tbWVudCIscmVnZXg6IlxcL1xcLyIsbmV4dDpbaS5nZXRUYWdSdWxlKCkse3Rva2VuOiJjb21tZW50IixyZWdleDoiJHxeIixuZXh0OmV8fCJwb3AifSx7ZGVmYXVsdFRva2VuOiJjb21tZW50IixjYXNlSW5zZW5zaXRpdmU6ITB9XX1dfXZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4vZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIikuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzLHM9ZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxvPSJbYS16QS1aXFwkX1x1MDBhMS1cdWZmZmZdW2EtekEtWlxcZFxcJF9cdTAwYTEtXHVmZmZmXSoiLHU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jcmVhdGVLZXl3b3JkTWFwcGVyKHsidmFyaWFibGUubGFuZ3VhZ2UiOiJBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258SXRlcmF0b3J8TnVtYmVyfE9iamVjdHxSZWdFeHB8U3RyaW5nfFByb3h5fE5hbWVzcGFjZXxRTmFtZXxYTUx8WE1MTGlzdHxBcnJheUJ1ZmZlcnxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8VWludDE2QXJyYXl8VWludDMyQXJyYXl8VWludDhBcnJheXxVaW50OENsYW1wZWRBcnJheXxFcnJvcnxFdmFsRXJyb3J8SW50ZXJuYWxFcnJvcnxSYW5nZUVycm9yfFJlZmVyZW5jZUVycm9yfFN0b3BJdGVyYXRpb258U3ludGF4RXJyb3J8VHlwZUVycm9yfFVSSUVycm9yfGRlY29kZVVSSXxkZWNvZGVVUklDb21wb25lbnR8ZW5jb2RlVVJJfGVuY29kZVVSSUNvbXBvbmVudHxldmFsfGlzRmluaXRlfGlzTmFOfHBhcnNlRmxvYXR8cGFyc2VJbnR8SlNPTnxNYXRofHRoaXN8YXJndW1lbnRzfHByb3RvdHlwZXx3aW5kb3d8ZG9jdW1lbnQiLGtleXdvcmQ6ImNvbnN0fHlpZWxkfGltcG9ydHxnZXR8c2V0fGFzeW5jfGF3YWl0fGJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxmaW5hbGx5fGZvcnxmdW5jdGlvbnxpZnxpbnxvZnxpbnN0YW5jZW9mfG5ld3xyZXR1cm58c3dpdGNofHRocm93fHRyeXx0eXBlb2Z8bGV0fHZhcnx3aGlsZXx3aXRofGRlYnVnZ2VyfF9fcGFyZW50X198X19jb3VudF9ffGVzY2FwZXx1bmVzY2FwZXx3aXRofF9fcHJvdG9fX3xjbGFzc3xlbnVtfGV4dGVuZHN8c3VwZXJ8ZXhwb3J0fGltcGxlbWVudHN8cHJpdmF0ZXxwdWJsaWN8aW50ZXJmYWNlfHBhY2thZ2V8cHJvdGVjdGVkfHN0YXRpYyIsInN0b3JhZ2UudHlwZSI6ImNvbnN0fGxldHx2YXJ8ZnVuY3Rpb24iLCJjb25zdGFudC5sYW5ndWFnZSI6Im51bGx8SW5maW5pdHl8TmFOfHVuZGVmaW5lZCIsInN1cHBvcnQuZnVuY3Rpb24iOiJhbGVydCIsImNvbnN0YW50Lmxhbmd1YWdlLmJvb2xlYW4iOiJ0cnVlfGZhbHNlIn0sImlkZW50aWZpZXIiKSxuPSJjYXNlfGRvfGVsc2V8ZmluYWxseXxpbnxpbnN0YW5jZW9mfHJldHVybnx0aHJvd3x0cnl8dHlwZW9mfHlpZWxkfHZvaWQiLHI9IlxcXFwoPzp4WzAtOWEtZkEtRl17Mn18dVswLTlhLWZBLUZdezR9fHV7WzAtOWEtZkEtRl17MSw2fX18WzAtMl1bMC03XXswLDJ9fDNbMC03XVswLTddP3xbNC03XVswLTddP3wuKSI7dGhpcy4kcnVsZXM9e25vX3JlZ2V4OltpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksZigibm9fcmVnZXgiKSx7dG9rZW46InN0cmluZyIscmVnZXg6IicoPz0uKSIsbmV4dDoicXN0cmluZyJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDonIig/PS4pJyxuZXh0OiJxcXN0cmluZyJ9LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6LzAoPzpbeFhdWzAtOWEtZkEtRl0rfFtvT11bMC03XSt8W2JCXVswMV0rKVxiL30se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDovKD86XGRcZCooPzpcLlxkKik/fFwuXGQrKSg/OltlRV1bKy1dP1xkK1xiKT8vfSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsInN1cHBvcnQuZnVuY3Rpb24iLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsImtleXdvcmQub3BlcmF0b3IiXSxyZWdleDoiKCIrbysiKShcXC4pKHByb3RvdHlwZSkoXFwuKSgiK28rIikoXFxzKikoPSkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbInN0b3JhZ2UudHlwZSIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0Iiwia2V5d29yZC5vcGVyYXRvciIsInRleHQiLCJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6IigiK28rIikoXFwuKSgiK28rIikoXFxzKikoPSkoXFxzKikoZnVuY3Rpb24pKFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsImtleXdvcmQub3BlcmF0b3IiLCJ0ZXh0Iiwic3RvcmFnZS50eXBlIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoIitvKyIpKFxccyopKD0pKFxccyopKGZ1bmN0aW9uKShcXHMqKShcXCgpIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsImtleXdvcmQub3BlcmF0b3IiLCJ0ZXh0Iiwic3RvcmFnZS50eXBlIiwidGV4dCIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoIitvKyIpKFxcLikoIitvKyIpKFxccyopKD0pKFxccyopKGZ1bmN0aW9uKShcXHMrKShcXHcrKShcXHMqKShcXCgpIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6IihmdW5jdGlvbikoXFxzKykoIitvKyIpKFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwidGV4dCIsInN0b3JhZ2UudHlwZSIsInRleHQiLCJwYXJlbi5scGFyZW4iXSxyZWdleDoiKCIrbysiKShcXHMqKSg6KShcXHMqKShmdW5jdGlvbikoXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOlsidGV4dCIsInRleHQiLCJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6Iig6KShcXHMqKShmdW5jdGlvbikoXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiZnJvbSg/PVxccyooJ3xcIikpIn0se3Rva2VuOiJrZXl3b3JkIixyZWdleDoiKD86IituKyIpXFxiIixuZXh0OiJzdGFydCJ9LHt0b2tlbjpbInN1cHBvcnQuY29uc3RhbnQiXSxyZWdleDovdGhhdFxiL30se3Rva2VuOlsic3RvcmFnZS50eXBlIiwicHVuY3R1YXRpb24ub3BlcmF0b3IiLCJzdXBwb3J0LmZ1bmN0aW9uLmZpcmVidWciXSxyZWdleDovKGNvbnNvbGUpKFwuKSh3YXJufGluZm98bG9nfGVycm9yfHRpbWV8dHJhY2V8dGltZUVuZHxhc3NlcnQpXGIvfSx7dG9rZW46dCxyZWdleDpvfSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDovWy5dKD8hWy5dKS8sbmV4dDoicHJvcGVydHkifSx7dG9rZW46InN0b3JhZ2UudHlwZSIscmVnZXg6Lz0+LyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvciIscmVnZXg6Ly0tfFwrXCt8XC57M318PT09fD09fD18IT18IT09fDwrPT98Pis9P3whfCYmfFx8XHx8XD86fFshJCUmKitcLX5cL15dPT8vLG5leHQ6InN0YXJ0In0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6L1s/Oiw7Ll0vLG5leHQ6InN0YXJ0In0se3Rva2VuOiJwYXJlbi5scGFyZW4iLHJlZ2V4Oi9bXFsoe10vLG5leHQ6InN0YXJ0In0se3Rva2VuOiJwYXJlbi5ycGFyZW4iLHJlZ2V4Oi9bXF0pfV0vfSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4Oi9eIyEuKiQvfV0scHJvcGVydHk6W3t0b2tlbjoidGV4dCIscmVnZXg6IlxccysifSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsImtleXdvcmQub3BlcmF0b3IiLCJ0ZXh0Iiwic3RvcmFnZS50eXBlIiwidGV4dCIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoIitvKyIpKFxcLikoIitvKyIpKFxccyopKD0pKFxccyopKGZ1bmN0aW9uKSg/OihcXHMrKShcXHcrKSk/KFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4Oi9bLl0oPyFbLl0pL30se3Rva2VuOiJzdXBwb3J0LmZ1bmN0aW9uIixyZWdleDovKHMoPzpoKD86aWZ0fG93KD86TW9kKD86ZWxlc3NEaWFsb2d8YWxEaWFsb2cpfEhlbHApKXxjcm9sbCg/Olh8QnkoPzpQYWdlc3xMaW5lcyk/fFl8VG8pP3x0KD86b3B8cmlrZSl8aSg/Om58emVUb0NvbnRlbnR8ZGViYXJ8Z25UZXh0KXxvcnR8dSg/OnB8Yig/OnN0cig/OmluZyk/KT8pfHBsaSg/OmNlfHQpfGUoPzpuZHx0KD86UmUoPzpzaXphYmxlfHF1ZXN0SGVhZGVyKXxNKD86aSg/Om51dGVzfGxsaXNlY29uZHMpfG9udGgpfFNlY29uZHN8SG8oPzp0S2V5c3x1cnMpfFllYXJ8Q3Vyc29yfFRpbWUoPzpvdXQpP3xJbnRlcnZhbHxaT3B0aW9uc3xEYXRlfFVUQyg/Ok0oPzppKD86bnV0ZXN8bGxpc2Vjb25kcyl8b250aCl8U2Vjb25kc3xIb3Vyc3xEYXRlfEZ1bGxZZWFyKXxGdWxsWWVhcnxBY3RpdmUpfGFyY2gpfHFydHxsaWNlfGF2ZVByZWZlcmVuY2VzfG1hbGwpfGgoPzpvbWV8YW5kbGVFdmVudCl8bmF2aWdhdGV8Yyg/Omhhcig/OkNvZGVBdHxBdCl8byg/OnN8big/OmNhdHx0ZXh0dWFsfGZpcm0pfG1waWxlKXxlaWx8bGVhcig/OlRpbWVvdXR8SW50ZXJ2YWwpP3xhKD86cHR1cmVFdmVudHN8bGwpfHJlYXRlKD86U3R5bGVTaGVldHxQb3B1cHxFdmVudE9iamVjdCkpfHQoPzpvKD86R01UU3RyaW5nfFMoPzp0cmluZ3xvdXJjZSl8VSg/OlRDU3RyaW5nfHBwZXJDYXNlKXxMbyg/OmNhbGVTdHJpbmd8d2VyQ2FzZSkpfGVzdHxhKD86bnxpbnQoPzpFbmFibGVkKT8pKXxpKD86cyg/Ok5hTnxGaW5pdGUpfG5kZXhPZnx0YWxpY3MpfGQoPzppc2FibGVFeHRlcm5hbENhcHR1cmV8dW1wfGV0YWNoRXZlbnQpfHUoPzpuKD86c2hpZnR8dGFpbnR8ZXNjYXBlfHdhdGNoKXxwZGF0ZUNvbW1hbmRzKXxqKD86b2lufGF2YUVuYWJsZWQpfHAoPzpvKD86cHx3KXx1c2h8bHVnaW5zLnJlZnJlc2h8YSg/OmRkaW5nc3xyc2UoPzpJbnR8RmxvYXQpPyl8cig/OmludHxvbXB0fGVmZXJlbmNlKSl8ZSg/OnNjYXBlfG5hYmxlRXh0ZXJuYWxDYXB0dXJlfHZhbHxsZW1lbnRGcm9tUG9pbnR8eCg/OnB8ZWMoPzpTY3JpcHR8Q29tbWFuZCk/KSl8dmFsdWVPZnxVVEN8cXVlcnlDb21tYW5kKD86U3RhdGV8SW5kZXRlcm18RW5hYmxlZHxWYWx1ZSl8Zig/OmkoPzpuZHxsZSg/Ok1vZGlmaWVkRGF0ZXxTaXplfENyZWF0ZWREYXRlfFVwZGF0ZWREYXRlKXx4ZWQpfG8oPzpudCg/OnNpemV8Y29sb3IpfHJ3YXJkKXxsb29yfHJvbUNoYXJDb2RlKXx3YXRjaHxsKD86aW5rfG8oPzphZHxnKXxhc3RJbmRleE9mKXxhKD86c2lufG5jaG9yfGNvc3x0KD86dGFjaEV2ZW50fG9ifGFuKD86Mik/KXxwcGx5fGxlcnR8Yig/OnN8b3J0KSl8cig/Om91KD86bmR8dGVFdmVudHMpfGUoPzpzaXplKD86Qnl8VG8pfGNhbGN8dHVyblZhbHVlfHBsYWNlfHZlcnNlfGwoPzpvYWR8ZWFzZSg/OkNhcHR1cmV8RXZlbnRzKSkpfGFuZG9tKXxnKD86b3xldCg/OlJlc3BvbnNlSGVhZGVyfE0oPzppKD86bnV0ZXN8bGxpc2Vjb25kcyl8b250aCl8U2UoPzpjb25kc3xsZWN0aW9uKXxIb3Vyc3xZZWFyfFRpbWUoPzp6b25lT2Zmc2V0KT98RGEoPzp5fHRlKXxVVEMoPzpNKD86aSg/Om51dGVzfGxsaXNlY29uZHMpfG9udGgpfFNlY29uZHN8SG91cnN8RGEoPzp5fHRlKXxGdWxsWWVhcil8RnVsbFllYXJ8QSg/OnR0ZW50aW9ufGxsUmVzcG9uc2VIZWFkZXJzKSkpfG0oPzppbnxvdmUoPzpCKD86eXxlbG93KXxUbyg/OkFic29sdXRlKT98QWJvdmUpfGVyZ2VBdHRyaWJ1dGVzfGEoPzp0Y2h8cmdpbnN8eCkpfGIoPzp0b2F8aWd8byg/OmxkfHJkZXJXaWR0aHMpfGxpbmt8YWNrKSlcYig/PVwoKS99LHt0b2tlbjoic3VwcG9ydC5mdW5jdGlvbi5kb20iLHJlZ2V4Oi8ocyg/OnViKD86c3RyaW5nRGF0YXxtaXQpfHBsaXRUZXh0fGUoPzp0KD86TmFtZWRJdGVtfEF0dHJpYnV0ZSg/Ok5vZGUpPyl8bGVjdCkpfGhhcyg/OkNoaWxkTm9kZXN8RmVhdHVyZSl8bmFtZWRJdGVtfGMoPzpsKD86aWNrfG8oPzpzZXxuZU5vZGUpKXxyZWF0ZSg/OkMoPzpvbW1lbnR8REFUQVNlY3Rpb258YXB0aW9uKXxUKD86SGVhZHxleHROb2RlfEZvb3QpfERvY3VtZW50RnJhZ21lbnR8UHJvY2Vzc2luZ0luc3RydWN0aW9ufEUoPzpudGl0eVJlZmVyZW5jZXxsZW1lbnQpfEF0dHJpYnV0ZSkpfHRhYkluZGV4fGkoPzpuc2VydCg/OlJvd3xCZWZvcmV8Q2VsbHxEYXRhKXx0ZW0pfG9wZW58ZGVsZXRlKD86Um93fEMoPzplbGx8YXB0aW9uKXxUKD86SGVhZHxGb290KXxEYXRhKXxmb2N1c3x3cml0ZSg/OmxuKT98YSg/OmRkfHBwZW5kKD86Q2hpbGR8RGF0YSkpfHJlKD86c2V0fHBsYWNlKD86Q2hpbGR8RGF0YSl8bW92ZSg/Ok5hbWVkSXRlbXxDaGlsZHxBdHRyaWJ1dGUoPzpOb2RlKT8pPyl8Z2V0KD86TmFtZWRJdGVtfEVsZW1lbnQoPzpzQnkoPzpOYW1lfFRhZ05hbWV8Q2xhc3NOYW1lKXxCeUlkKXxBdHRyaWJ1dGUoPzpOb2RlKT8pfGJsdXIpXGIoPz1cKCkvfSx7dG9rZW46InN1cHBvcnQuY29uc3RhbnQiLHJlZ2V4Oi8ocyg/OnlzdGVtTGFuZ3VhZ2V8Y3IoPzppcHRzfG9sbGJhcnN8ZWVuKD86WHxZfFRvcHxMZWZ0KSl8dCg/OnlsZSg/OlNoZWV0cyk/fGF0dXMoPzpUZXh0fGJhcik/KXxpYmxpbmcoPzpCZWxvd3xBYm92ZSl8b3VyY2V8dWZmaXhlc3xlKD86Y3VyaXR5KD86UG9saWN5KT98bCg/OmVjdGlvbnxmKSkpfGgoPzppc3Rvcnl8b3N0KD86bmFtZSk/fGFzKD86aHxGb2N1cykpfHl8WCg/Ok1MRG9jdW1lbnR8U0xEb2N1bWVudCl8big/OmV4dHxhbWUoPzpzcGFjZSg/OnN8VVJJKXxQcm9wKSl8TSg/OklOX1ZBTFVFfEFYX1ZBTFVFKXxjKD86aGFyYWN0ZXJTZXR8byg/Om4oPzpzdHJ1Y3Rvcnx0cm9sbGVycyl8b2tpZUVuYWJsZWR8bG9yRGVwdGh8bXAoPzpvbmVudHN8bGV0ZSkpfHVycmVudHxwdUNsYXNzfGwoPzppKD86cCg/OmJvYXJkRGF0YSk/fGVudEluZm9ybWF0aW9uKXxvc2VkfGFzc2VzKXxhbGxlKD86ZXxyKXxyeXB0byl8dCg/Om8oPzpvbGJhcnxwKXxleHQoPzpUcmFuc2Zvcm18SW5kZW50fERlY29yYXRpb258QWxpZ24pfGFncyl8U1FSVCg/OjFfMnwyKXxpKD86big/Om5lcig/OkhlaWdodHxXaWR0aCl8cHV0KXxkc3xnbm9yZUNhc2UpfHpJbmRleHxvKD86c2NwdXxuKD86cmVhZHlzdGF0ZWNoYW5nZXxMaW5lKXx1dGVyKD86SGVpZ2h0fFdpZHRoKXxwKD86c1Byb2ZpbGV8ZW5lcil8ZmZzY3JlZW5CdWZmZXJpbmcpfE5FR0FUSVZFX0lORklOSVRZfGQoPzppKD86c3BsYXl8YWxvZyg/OkhlaWdodHxUb3B8V2lkdGh8TGVmdHxBcmd1bWVudHMpfHJlY3Rvcmllcyl8ZSg/OnNjcmlwdGlvbnxmYXVsdCg/OlN0YXR1c3xDaCg/OmVja2VkfGFyc2V0KXxWaWV3KSkpfHUoPzpzZXIoPzpQcm9maWxlfExhbmd1YWdlfEFnZW50KXxuKD86aXF1ZUlEfGRlZmluZWQpfHBkYXRlSW50ZXJ2YWwpfF9jb250ZW50fHAoPzppeGVsRGVwdGh8b3J0fGVyc29uYWxiYXJ8a2NzMTF8bCg/OnVnaW5zfGF0Zm9ybSl8YSg/OnRobmFtZXxkZGluZyg/OlJpZ2h0fEJvdHRvbXxUb3B8TGVmdCl8cmVudCg/OldpbmRvd3xMYXllcik/fGdlKD86WCg/Ok9mZnNldCk/fFkoPzpPZmZzZXQpPykpfHIoPzpvKD86dG8oPzpjb2x8dHlwZSl8ZHVjdCg/OlN1Yik/fG1wdGVyKXxlKD86dmlvdXN8Zml4KSkpfGUoPzpuKD86Y29kaW5nfGFibGVkUGx1Z2luKXx4KD86dGVybmFsfHBhbmRvKXxtYmVkcyl8dig/OmlzaWJpbGl0eXxlbmRvcig/OlN1Yik/fExpbmtjb2xvcil8VVJMVW5lbmNvZGVkfFAoPzpJfE9TSVRJVkVfSU5GSU5JVFkpfGYoPzppbGVuYW1lfG8oPzpudCg/OlNpemV8RmFtaWx5fFdlaWdodCl8cm1OYW1lKXxyYW1lKD86c3xFbGVtZW50KXxnQ29sb3IpfEV8d2hpdGVTcGFjZXxsKD86aSg/OnN0U3R5bGVUeXBlfG4oPzplSGVpZ2h0fGtDb2xvcikpfG8oPzpjYSg/OnRpb24oPzpiYXIpP3xsTmFtZSl8d3NyYyl8ZSg/Om5ndGh8ZnQoPzpDb250ZXh0KT8pfGEoPzpzdCg/Ok0oPzpvZGlmaWVkfGF0Y2gpfEluZGV4fFBhcmVuKXx5ZXIoPzpzfFgpfG5ndWFnZSkpfGEoPzpwcCg/Ok1pbm9yVmVyc2lvbnxOYW1lfENvKD86ZGVOYW1lfHJlKXxWZXJzaW9uKXx2YWlsKD86SGVpZ2h0fFRvcHxXaWR0aHxMZWZ0KXxsbHxyKD86aXR5fGd1bWVudHMpfExpbmtjb2xvcnxib3ZlKXxyKD86aWdodCg/OkNvbnRleHQpP3xlKD86c3BvbnNlKD86WE1MfFRleHQpfGFkeVN0YXRlKSl8Z2xvYmFsfHh8bSg/OmltZVR5cGVzfHVsdGlsaW5lfGVudWJhcnxhcmdpbig/OlJpZ2h0fEJvdHRvbXxUb3B8TGVmdCkpfEwoPzpOKD86MTB8Mil8T0coPzoxMEV8MkUpKXxiKD86byg/OnR0b218cmRlcig/OldpZHRofFJpZ2h0V2lkdGh8Qm90dG9tV2lkdGh8U3R5bGV8Q29sb3J8VG9wV2lkdGh8TGVmdFdpZHRoKSl8dWZmZXJEZXB0aHxlbG93fGFja2dyb3VuZCg/OkNvbG9yfEltYWdlKSkpXGIvfSx7dG9rZW46ImlkZW50aWZpZXIiLHJlZ2V4Om99LHtyZWdleDoiIix0b2tlbjoiZW1wdHkiLG5leHQ6Im5vX3JlZ2V4In1dLHN0YXJ0OltpLmdldFN0YXJ0UnVsZSgiZG9jLXN0YXJ0IiksZigic3RhcnQiKSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiJcXC8iLG5leHQ6InJlZ2V4In0se3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzK3xeJCIsbmV4dDoic3RhcnQifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJub19yZWdleCJ9XSxyZWdleDpbe3Rva2VuOiJyZWdleHAua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIn0se3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiL1tzeG5naW15XSoiLG5leHQ6Im5vX3JlZ2V4In0se3Rva2VuOiJpbnZhbGlkIixyZWdleDovXHtcZCtcYiw/XGQqXH1bKypdfFsrKiReP11bKypdfFskXl1bP118XD97Myx9L30se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4Oi9cKFw/Wzo9IV18XCl8XHtcZCtcYiw/XGQqXH18WysqXVw/fFsoKSReKyo/Ll0vfSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmRlbGltaXRlciIscmVnZXg6L1x8L30se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4Oi9cW1xePy8sbmV4dDoicmVnZXhfY2hhcmFjdGVyX2NsYXNzIn0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiQiLG5leHQ6Im5vX3JlZ2V4In0se2RlZmF1bHRUb2tlbjoic3RyaW5nLnJlZ2V4cCJ9XSxyZWdleF9jaGFyYWN0ZXJfY2xhc3M6W3t0b2tlbjoicmVnZXhwLmNoYXJjbGFzcy5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6Il0iLG5leHQ6InJlZ2V4In0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4OiItIn0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiQiLG5leHQ6Im5vX3JlZ2V4In0se2RlZmF1bHRUb2tlbjoic3RyaW5nLnJlZ2V4cC5jaGFyYWNodGVyY2xhc3MifV0sZnVuY3Rpb25fYXJndW1lbnRzOlt7dG9rZW46InZhcmlhYmxlLnBhcmFtZXRlciIscmVnZXg6b30se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IlssIF0rIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6IiQifSx7dG9rZW46ImVtcHR5IixyZWdleDoiIixuZXh0OiJub19yZWdleCJ9XSxxcXN0cmluZzpbe3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4OnJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFxcXCQiLGNvbnN1bWVMaW5lRW5kOiEwfSx7dG9rZW46InN0cmluZyIscmVnZXg6JyJ8JCcsbmV4dDoibm9fcmVnZXgifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcifV0scXN0cmluZzpbe3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4OnJ9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiXFxcXCQiLGNvbnN1bWVMaW5lRW5kOiEwfSx7dG9rZW46InN0cmluZyIscmVnZXg6Iid8JCIsbmV4dDoibm9fcmVnZXgifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcifV19O2lmKCFlfHwhZS5ub0VTNil0aGlzLiRydWxlcy5ub19yZWdleC51bnNoaWZ0KHtyZWdleDoiW3t9XSIsb25NYXRjaDpmdW5jdGlvbihlLHQsbil7dGhpcy5uZXh0PWU9PSJ7Ij90aGlzLm5leHRTdGF0ZToiIjtpZihlPT0ieyImJm4ubGVuZ3RoKW4udW5zaGlmdCgic3RhcnQiLHQpO2Vsc2UgaWYoZT09In0iJiZuLmxlbmd0aCl7bi5zaGlmdCgpLHRoaXMubmV4dD1uLnNoaWZ0KCk7aWYodGhpcy5uZXh0LmluZGV4T2YoInN0cmluZyIpIT0tMXx8dGhpcy5uZXh0LmluZGV4T2YoImpzeCIpIT0tMSlyZXR1cm4icGFyZW4ucXVhc2kuZW5kIn1yZXR1cm4gZT09InsiPyJwYXJlbi5scGFyZW4iOiJwYXJlbi5ycGFyZW4ifSxuZXh0U3RhdGU6InN0YXJ0In0se3Rva2VuOiJzdHJpbmcucXVhc2kuc3RhcnQiLHJlZ2V4Oi9gLyxwdXNoOlt7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6cn0se3Rva2VuOiJwYXJlbi5xdWFzaS5zdGFydCIscmVnZXg6L1wkey8scHVzaDoic3RhcnQifSx7dG9rZW46InN0cmluZy5xdWFzaS5lbmQiLHJlZ2V4Oi9gLyxuZXh0OiJwb3AifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcucXVhc2kifV19KSwoIWV8fGUuanN4IT0wKSYmYS5jYWxsKHRoaXMpO3RoaXMuZW1iZWRSdWxlcyhpLCJkb2MtIixbaS5nZXRFbmRSdWxlKCJub19yZWdleCIpXSksdGhpcy5ub3JtYWxpemVSdWxlcygpfTtyLmluaGVyaXRzKHUscyksdC5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXM9dX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL3JhbmdlIikuUmFuZ2UsaT1mdW5jdGlvbigpe307KGZ1bmN0aW9uKCl7dGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4vXlxzKyQvLnRlc3QoZSk/L15ccypcfS8udGVzdCh0KTohMX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0TGluZSh0KSxpPW4ubWF0Y2goL14oXHMqXH0pLyk7aWYoIWkpcmV0dXJuIDA7dmFyIHM9aVsxXS5sZW5ndGgsbz1lLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzp0LGNvbHVtbjpzfSk7aWYoIW98fG8ucm93PT10KXJldHVybiAwO3ZhciB1PXRoaXMuJGdldEluZGVudChlLmdldExpbmUoby5yb3cpKTtlLnJlcGxhY2UobmV3IHIodCwwLHQscy0xKSx1KX0sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKC9eXHMqLylbMF19fSkuY2FsbChpLnByb3RvdHlwZSksdC5NYXRjaGluZ0JyYWNlT3V0ZGVudD1pfSksYWNlLmRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSIsImFjZS9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi8uLi9saWIvb29wIiksaT1lKCIuLi8uLi9yYW5nZSIpLlJhbmdlLHM9ZSgiLi9mb2xkX21vZGUiKS5Gb2xkTW9kZSxvPXQuRm9sZE1vZGU9ZnVuY3Rpb24oZSl7ZSYmKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW5ldyBSZWdFeHAodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIuc291cmNlLnJlcGxhY2UoL1x8W158XSo/JC8sInwiK2Uuc3RhcnQpKSx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPW5ldyBSZWdFeHAodGhpcy5mb2xkaW5nU3RvcE1hcmtlci5zb3VyY2UucmVwbGFjZSgvXHxbXnxdKj8kLywifCIrZS5lbmQpKSl9O3IuaW5oZXJpdHMobyxzKSxmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPS8oW1x7XFtcKF0pW15cfVxdXCldKiR8XlxzKihcL1wqKS8sdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj0vXlteXFtce1woXSooW1x9XF1cKV0pfF5bXHNcKl0qKFwqXC8pLyx0aGlzLnNpbmdsZUxpbmVCbG9ja0NvbW1lbnRSZT0vXlxzKihcL1wqKS4qXCpcL1xzKiQvLHRoaXMudHJpcGxlU3RhckJsb2NrQ29tbWVudFJlPS9eXHMqKFwvXCpcKlwqKS4qXCpcL1xzKiQvLHRoaXMuc3RhcnRSZWdpb25SZT0vXlxzKihcL1wqfFwvXC8pIz9yZWdpb25cYi8sdGhpcy5fZ2V0Rm9sZFdpZGdldEJhc2U9dGhpcy5nZXRGb2xkV2lkZ2V0LHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXRMaW5lKG4pO2lmKHRoaXMuc2luZ2xlTGluZUJsb2NrQ29tbWVudFJlLnRlc3QocikmJiF0aGlzLnN0YXJ0UmVnaW9uUmUudGVzdChyKSYmIXRoaXMudHJpcGxlU3RhckJsb2NrQ29tbWVudFJlLnRlc3QocikpcmV0dXJuIiI7dmFyIGk9dGhpcy5fZ2V0Rm9sZFdpZGdldEJhc2UoZSx0LG4pO3JldHVybiFpJiZ0aGlzLnN0YXJ0UmVnaW9uUmUudGVzdChyKT8ic3RhcnQiOml9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUuZ2V0TGluZShuKTtpZih0aGlzLnN0YXJ0UmVnaW9uUmUudGVzdChpKSlyZXR1cm4gdGhpcy5nZXRDb21tZW50UmVnaW9uQmxvY2soZSxpLG4pO3ZhciBzPWkubWF0Y2godGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIpO2lmKHMpe3ZhciBvPXMuaW5kZXg7aWYoc1sxXSlyZXR1cm4gdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrKGUsc1sxXSxuLG8pO3ZhciB1PWUuZ2V0Q29tbWVudEZvbGRSYW5nZShuLG8rc1swXS5sZW5ndGgsMSk7cmV0dXJuIHUmJiF1LmlzTXVsdGlMaW5lKCkmJihyP3U9dGhpcy5nZXRTZWN0aW9uUmFuZ2UoZSxuKTp0IT0iYWxsIiYmKHU9bnVsbCkpLHV9aWYodD09PSJtYXJrYmVnaW4iKXJldHVybjt2YXIgcz1pLm1hdGNoKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIpO2lmKHMpe3ZhciBvPXMuaW5kZXgrc1swXS5sZW5ndGg7cmV0dXJuIHNbMV0/dGhpcy5jbG9zaW5nQnJhY2tldEJsb2NrKGUsc1sxXSxuLG8pOmUuZ2V0Q29tbWVudEZvbGRSYW5nZShuLG8sLTEpfX0sdGhpcy5nZXRTZWN0aW9uUmFuZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldExpbmUodCkscj1uLnNlYXJjaCgvXFMvKSxzPXQsbz1uLmxlbmd0aDt0Kz0xO3ZhciB1PXQsYT1lLmdldExlbmd0aCgpO3doaWxlKCsrdDxhKXtuPWUuZ2V0TGluZSh0KTt2YXIgZj1uLnNlYXJjaCgvXFMvKTtpZihmPT09LTEpY29udGludWU7aWYocj5mKWJyZWFrO3ZhciBsPXRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlKGUsImFsbCIsdCk7aWYobCl7aWYobC5zdGFydC5yb3c8PXMpYnJlYWs7aWYobC5pc011bHRpTGluZSgpKXQ9bC5lbmQucm93O2Vsc2UgaWYocj09ZilicmVha311PXR9cmV0dXJuIG5ldyBpKHMsbyx1LGUuZ2V0TGluZSh1KS5sZW5ndGgpfSx0aGlzLmdldENvbW1lbnRSZWdpb25CbG9jaz1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5zZWFyY2goL1xzKiQvKSxzPWUuZ2V0TGVuZ3RoKCksbz1uLHU9L15ccyooPzpcL1wqfFwvXC98LS0pIz8oZW5kKT9yZWdpb25cYi8sYT0xO3doaWxlKCsrbjxzKXt0PWUuZ2V0TGluZShuKTt2YXIgZj11LmV4ZWModCk7aWYoIWYpY29udGludWU7ZlsxXT9hLS06YSsrO2lmKCFhKWJyZWFrfXZhciBsPW47aWYobD5vKXJldHVybiBuZXcgaShvLHIsbCx0Lmxlbmd0aCl9fS5jYWxsKG8ucHJvdG90eXBlKX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL2phdmFzY3JpcHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL3RleHQiLCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL21hdGNoaW5nX2JyYWNlX291dGRlbnQiLCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIiwiYWNlL21vZGUvZm9sZGluZy9jc3R5bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4vdGV4dCIpLk1vZGUscz1lKCIuL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIikuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzLG89ZSgiLi9tYXRjaGluZ19icmFjZV9vdXRkZW50IikuTWF0Y2hpbmdCcmFjZU91dGRlbnQsdT1lKCIuLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLldvcmtlckNsaWVudCxhPWUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cixmPWUoIi4vZm9sZGluZy9jc3R5bGUiKS5Gb2xkTW9kZSxsPWZ1bmN0aW9uKCl7dGhpcy5IaWdobGlnaHRSdWxlcz1zLHRoaXMuJG91dGRlbnQ9bmV3IG8sdGhpcy4kYmVoYXZpb3VyPW5ldyBhLHRoaXMuZm9sZGluZ1J1bGVzPW5ldyBmfTtyLmluaGVyaXRzKGwsaSksZnVuY3Rpb24oKXt0aGlzLmxpbmVDb21tZW50U3RhcnQ9Ii8vIix0aGlzLmJsb2NrQ29tbWVudD17c3RhcnQ6Ii8qIixlbmQ6IiovIn0sdGhpcy4kcXVvdGVzPXsnIic6JyInLCInIjoiJyIsImAiOiJgIn0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy4kZ2V0SW5kZW50KHQpLGk9dGhpcy5nZXRUb2tlbml6ZXIoKS5nZXRMaW5lVG9rZW5zKHQsZSkscz1pLnRva2VucyxvPWkuc3RhdGU7aWYocy5sZW5ndGgmJnNbcy5sZW5ndGgtMV0udHlwZT09ImNvbW1lbnQiKXJldHVybiByO2lmKGU9PSJzdGFydCJ8fGU9PSJub19yZWdleCIpe3ZhciB1PXQubWF0Y2goL14uKig/OlxiY2FzZVxiLio6fFtce1woXFtdKVxzKiQvKTt1JiYocis9bil9ZWxzZSBpZihlPT0iZG9jLXN0YXJ0Iil7aWYobz09InN0YXJ0Inx8bz09Im5vX3JlZ2V4IilyZXR1cm4iIjt2YXIgdT10Lm1hdGNoKC9eXHMqKFwvPylcKi8pO3UmJih1WzFdJiYocis9IiAiKSxyKz0iKiAiKX1yZXR1cm4gcn0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLiRvdXRkZW50LmNoZWNrT3V0ZGVudCh0LG4pfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGUsdCxuKXt0aGlzLiRvdXRkZW50LmF1dG9PdXRkZW50KHQsbil9LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyB1KFsiYWNlIl0sImFjZS9tb2RlL2phdmFzY3JpcHRfd29ya2VyIiwiSmF2YVNjcmlwdFdvcmtlciIpO3JldHVybiB0LmF0dGFjaFRvRG9jdW1lbnQoZS5nZXREb2N1bWVudCgpKSx0Lm9uKCJhbm5vdGF0ZSIsZnVuY3Rpb24odCl7ZS5zZXRBbm5vdGF0aW9ucyh0LmRhdGEpfSksdC5vbigidGVybWluYXRlIixmdW5jdGlvbigpe2UuY2xlYXJBbm5vdGF0aW9ucygpfSksdH0sdGhpcy4kaWQ9ImFjZS9tb2RlL2phdmFzY3JpcHQifS5jYWxsKGwucHJvdG90eXBlKSx0Lk1vZGU9bH0pOyAgICAgICAgICAgICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgYWNlLnJlcXVpcmUoWyJhY2UvbW9kZS9qYXZhc2NyaXB0Il0sIGZ1bmN0aW9uKG0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIgJiYgdHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgbW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IG07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKCk7",
- ],
-
- [
- "редактор",
- "ewogICAgdmFyINGA0LXQtNCw0LrRgtC+0YAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgINGA0LXQtNCw0LrRgtC+0YAuaWQgPSAi0YDQtdC00LDQutGC0L7RgCI7CiAgICDRgNC10LTQsNC60YLQvtGALnN0eWxlLmNzc1RleHQgPSAiaGVpZ2h0OiAxMDAlOyI7CiAgICB2YXIg0L7QsdC70LDRgdGC0YwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi0LvQtdCy0LDRjy3QvtCx0LvQsNGB0YLRjCIpOwogICAg0L7QsdC70LDRgdGC0YwuYXBwZW5kQ2hpbGQo0YDQtdC00LDQutGC0L7RgCk7CiAgICDQvNGD0YDQvtC8LtGA0LXQtNCw0LrRgtC+0YAgPSB3aW5kb3cuYWNlLmVkaXQoItGA0LXQtNCw0LrRgtC+0YAiKTsKICAgINC80YPRgNC+0Lwu0YDQtdC00LDQutGC0L7RgC5zZXNzaW9uLnNldE1vZGUoImFjZS9tb2RlL2phdmFzY3JpcHQiKTsKfQ==",
- ],
-
- [
- "муром.модули",
- "0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQgPSB7fTsKCtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGB0L7Qt9C00LDRgtGM0JjQvdGC0LXRgNGE0LXQudGBID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0L7QsdC7ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoItC/0YDQsNCy0LDRjy3QvtCx0LvQsNGB0YLRjCIpOwogICAgdmFyINC80L7QtNGD0LvQuCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAg0L7QsdC7LmFwcGVuZENoaWxkKNC80L7QtNGD0LvQuCk7CiAgICDQvNC+0LTRg9C70LguaWQgPSAi0LzRg9GA0L7QvC3QvNC+0LTRg9C70LgiOwogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQuaHRtbNCc0L7QtNGD0LvQuCA9INC80L7QtNGD0LvQuDsKfTsKCtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGB0L7Qt9C00LDRgtGM0JjQvdGC0LXRgNGE0LXQudGBKCk7",
- ],
-
- [
- "муром.модули.статус",
- "0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHRgtCw0YLRg9GB0JzQvtC00YPQu9GPID0gZnVuY3Rpb24o0LzQvtC00YPQu9GMKQp7CiAgICBpZiAo0LzQvtC00YPQu9GMWzJdID09IGZhbHNlKQogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIAogICAgcmV0dXJuIHRydWU7Cn07CgrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7Qt9Cw0LTQsNGC0YzQodGC0LDRgtGD0YHQnNC+0LTRg9C70Y8gPSBmdW5jdGlvbijQvNC+0LTRg9C70YwsINGB0YLQsNGC0YPRgSkKewogICAgLy8g0KPQtNCw0LvQuNGC0Ywg0YLQtdC60YPRidC40Lkg0YHRgtCw0YLRg9GBINCyINGB0LvRg9GH0LDQtSDQvdCw0LvQuNGH0LjRjy4KICAgIGlmICjQvNC+0LTRg9C70YwubGVuZ3RoID09IDMpCiAgICB7CiAgICAgICAg0LzQvtC00YPQu9GMLnBvcCgpOwogICAgfQogICAgaWYgKCHRgdGC0LDRgtGD0YEpCiAgICB7CiAgICAgICAg0LzQvtC00YPQu9GMWzJdID0gZmFsc2U7CiAgICB9Cn07Cg==",
- ],
-
- [
- "муром.модули.сохранение",
- "0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtGF0YDQsNC90LjRgtGMID0gbmV3INCj0LLQtdC00L7QvNC40YLQtdC70YwoKTsK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtGF0YDQsNC90LjQu9C4ID0gbmV3INCj0LLQtdC00L7QvNC40YLQtdC70YwoKTsKCtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGB0L7Qt9C00LDRgtGM0JjQvdGC0LXRgNGE0LXQudGB0KHQvtGF0YDQsNC90LXQvdC40Y8gPSBmdW5jdGlvbigpCnsKICAgINGB0L7RhdGA0LDQvdC10L3QuNC1ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC5odG1s0JzQvtC00YPQu9C4LmFwcGVuZENoaWxkKNGB0L7RhdGA0LDQvdC10L3QuNC1KTsKICAgINGB0L7RhdGA0LDQvdC10L3QuNC1LmlubmVySFRNTCA9ICLQodC+0YXRgNCw0L3QuNGC0Ywg0LLRgdGRIjsKICAgINGB0L7RhdGA0LDQvdC10L3QuNC1Lm9uY2xpY2sgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtGF0YDQsNC90LjRgtGMLtGD0LLQtdC00L7QvNC40YLRjCgpOwogICAgfTsKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0Lmh0bWzQodC+0YXRgNCw0L3QtdC90LjQtSA9INGB0L7RhdGA0LDQvdC10L3QuNC1Owp9OwoK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtGF0YDQsNC90LjRgtGM0JLRi9Cx0YDQsNC90L3Ri9C50JzQvtC00YPQu9GMID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0L3QvtC80LXRgCA9INC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC90L7QvNC10YDQnNC+0LTRg9C70Y8o0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LLRi9Cx0YDQsNC90L3Ri9C50JzQvtC00YPQu9GMKTsKICAgIGlmICgh0L3QvtC80LXRgCkKICAgIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICB2YXIg0LzQvtC00YPQu9GMID0g0LzRg9GA0L7QvC7QvNC+0LTRg9C70Lhb0L3QvtC80LXRgF07CiAgICB2YXIg0LrQvtC0ID0g0LzRg9GA0L7QvC7RgNC10LTQsNC60YLQvtGALnNlc3Npb24uZ2V0VmFsdWUoKTsKICAgINC80L7QtNGD0LvRjFsxXSA9IGJhc2U2NEVuY29kZSjQutC+0LQpOwp9OwoK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtGF0YDQsNC90LjRgtGM0JLQkdCw0LfQtSA9IGZ1bmN0aW9uKNC+0YLQutC70LjQuikKewogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQuaHRtbNCh0L7RhdGA0LDQvdC10L3QuNC1LmRpc2FibGVkID0gdHJ1ZTsKICAgIGxvY2FsZm9yYWdlLnNldEl0ZW0oItC80L7QtNGD0LvQuCIsINC80YPRgNC+0Lwu0LzQvtC00YPQu9C4LCBmdW5jdGlvbijQvtGI0LjQsdC60LAsINC30L3QsNGH0LXQvdC40LUpewogICAgICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0Lmh0bWzQodC+0YXRgNCw0L3QtdC90LjQtS5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgIGlmICjQvtGI0LjQsdC60LApCiAgICAgICAgewogICAgICAgICAgICBjb25zb2xlLmxvZygi0J7QqNCY0JHQmtCQINCd0LUg0YPQtNCw0LvQvtGB0Ywg0YHQvtGF0YDQsNC90LjRgtGMINC80L7QtNGD0LvQuDogJyIgKyDQvtGI0LjQsdC60LAgKyAiJyIpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICjQvtGC0LrQu9C40LopCiAgICAgICAgewogICAgICAgICAgICDQvtGC0LrQu9C40LooKTsKICAgICAgICB9CiAgICB9KTsKfTsKCtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGB0L7RhdGA0LDQvdC40YLRjNCS0YHRkSA9IGZ1bmN0aW9uKCkKewogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtGF0YDQsNC90LjRgtGM0JLRi9Cx0YDQsNC90L3Ri9C50JzQvtC00YPQu9GMKCk7CiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7RgdC+0YXRgNCw0L3QuNGC0YzQktCR0LDQt9C1KGZ1bmN0aW9uKCl7CiAgICAgICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtGF0YDQsNC90LjQu9C4LtGD0LLQtdC00L7QvNC40YLRjCgpOwogICAgfSk7Cn07CgrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7RgdC+0LfQtNCw0YLRjNCY0L3RgtC10YDRhNC10LnRgdCh0L7RhdGA0LDQvdC10L3QuNGPKCk7CtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGB0L7RhdGA0LDQvdC40YLRjC7Qv9C+0LTQv9C40YHQsNGC0Ywo0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtGF0YDQsNC90LjRgtGM0JLRgdGRKTs=",
- ],
-
- [
- "муром.модули.скачивание",
- "0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQutCw0YfQsNGC0YwgPSBuZXcg0KPQstC10LTQvtC80LjRgtC10LvRjCgpOwoK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtC30LTQsNGC0YzQmNC90YLQtdGA0YTQtdC50YHQodC60LDRh9C40LLQsNC90LjRjyA9IGZ1bmN0aW9uKCkKewogICAg0YHQutCw0YfQuNCy0LDQvdC40LUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0Lmh0bWzQnNC+0LTRg9C70LguYXBwZW5kQ2hpbGQo0YHQutCw0YfQuNCy0LDQvdC40LUpOwogICAg0YHQutCw0YfQuNCy0LDQvdC40LUuaW5uZXJIVE1MID0gItCh0LrQsNGH0LDRgtGMINGE0LDQudC7INGBINC40LfQvNC10L3QtdC90LjRj9C80LgiOwogICAg0YHQutCw0YfQuNCy0LDQvdC40LUub25jbGljayA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7RgdC60LDRh9Cw0YLRjC7Rg9Cy0LXQtNC+0LzQuNGC0YwoKTsKICAgIH07CiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC5odG1s0KHQutCw0YfQuNCy0LDQvdC40LUgPSDRgdC60LDRh9C40LLQsNC90LjQtTsKfTsKCtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC40LzRj9Ck0LDQudC70LAgPSBmdW5jdGlvbigpCnsKICAgIHZhciDQv9GD0YLRjCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgIHZhciDQuNC80Y/QpNCw0LnQu9CwID0g0L/Rg9GC0Ywuc3BsaXQoIi8iKS5wb3AoKTsKICAgINC40LzRj9Ck0LDQudC70LAgPSBkZWNvZGVVUkko0LjQvNGP0KTQsNC50LvQsCk7CiAgICByZXR1cm4g0LjQvNGP0KTQsNC50LvQsDsKfTsKCi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xODE5NzM0MQrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7RgdC60LDRh9Cw0YLRjNCk0LDQudC7ID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0YHQvtC00LXRgNC20LjQvNC+0LUgPSBiYXNlNjREZWNvZGUo0LzRg9GA0L7QvC7RhNCw0LnQuy7QvdCw0YfQsNC70L4pOwogICAgZm9yICh2YXIg0L3QvtC80LXRgCBpbiDQvNGD0YDQvtC8LtC80L7QtNGD0LvQuCkKICAgIHsKICAgICAgICB2YXIg0LzQvtC00YPQu9GMID0g0LzRg9GA0L7QvC7QvNC+0LTRg9C70Lhb0L3QvtC80LXRgF07CiAgICAgICAgdmFyINC40LzRjyA9INC80L7QtNGD0LvRjFswXTsKICAgICAgICB2YXIg0LfQvdCw0YfQtdC90LjQtSA9INC80L7QtNGD0LvRjFsxXTsKICAgICAgICB2YXIg0YHRgtCw0YLRg9GBID0gIiI7CiAgICAgICAgaWYgKNC80L7QtNGD0LvRjFsyXSA9PSBmYWxzZSkKICAgICAgICB7CiAgICAgICAgICAgINGB0YLQsNGC0YPRgSA9CmBmYWxzZSwKYDsKICAgICAgICB9CiAgICAgICAg0YHQvtC00LXRgNC20LjQvNC+0LUgKz0gYApbCiJgICsg0LjQvNGPICsgYCIsCiJgICsg0LfQvdCw0YfQtdC90LjQtSArIGAiLApgCisK0YHRgtCw0YLRg9GBCisKYF0sCmAKICAgICAgICA7CiAgICB9CiAgICDRgdC+0LTQtdGA0LbQuNC80L7QtSArPSBiYXNlNjREZWNvZGUo0LzRg9GA0L7QvC7RhNCw0LnQuy7QutC+0L3QtdGGKTsKICAgINGB0L7QtNC10YDQttC40LzQvtC1ID0gYmFzZTY0RW5jb2RlKNGB0L7QtNC10YDQttC40LzQvtC1KTsKICAgIAogICAgdmFyINGB0YHRi9C70YwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICDRgdGB0YvQu9GMLnNldEF0dHJpYnV0ZSgiaHJlZiIsICJkYXRhOmFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtjaGFyc2V0PXV0Zi04O2Jhc2U2NCwiICsg0YHQvtC00LXRgNC20LjQvNC+0LUpOwogICAgdmFyINC40LzRj9Ck0LDQudC70LAgPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QuNC80Y/QpNCw0LnQu9CwKCk7CiAgICDRgdGB0YvQu9GMLnNldEF0dHJpYnV0ZSgiZG93bmxvYWQiLCDQuNC80Y/QpNCw0LnQu9CwKTsKICAgINGB0YHRi9C70Ywuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQo0YHRgdGL0LvRjCk7CiAgICDRgdGB0YvQu9GMLmNsaWNrKCk7CiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKNGB0YHRi9C70YwpOwp9CgrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7RgdC+0LfQtNCw0YLRjNCY0L3RgtC10YDRhNC10LnRgdCh0LrQsNGH0LjQstCw0L3QuNGPKCk7CtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGB0LrQsNGH0LDRgtGMLtC/0L7QtNC/0LjRgdCw0YLRjCjQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7RgdC60LDRh9Cw0YLRjNCk0LDQudC7KTs=",
- ],
-
- [
- "муром.модули.список",
- "0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtC30LTQsNGC0YzQmNC90YLQtdGA0YTQtdC50YHQotCw0LHQu9C40YbRiyA9IGZ1bmN0aW9uKCkKewogICAgdmFyINC/0YDQvtC80L7RgtC60LAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgINC/0YDQvtC80L7RgtC60LAuaWQgPSAi0LzRg9GA0L7QvC3QvNC+0LTRg9C70Lgt0L/RgNC+0LzQvtGC0LrQsCI7CiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC5odG1s0JzQvtC00YPQu9C4LmFwcGVuZENoaWxkKNC/0YDQvtC80L7RgtC60LApOwogICAgdmFyINGC0LDQsdC70LjRhtCwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGFibGUiKTsKICAgINGC0LDQsdC70LjRhtCwLmlkID0gItC80YPRgNC+0Lwt0LzQvtC00YPQu9C4LdGC0LDQsdC70LjRhtCwIjsKICAgINC/0YDQvtC80L7RgtC60LAuYXBwZW5kQ2hpbGQo0YLQsNCx0LvQuNGG0LApOwogICAgCiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC5odG1s0KLQsNCx0LvQuNGG0LAgPSDRgtCw0LHQu9C40YbQsDsKICAgIAogICAgdmFyINCy0LjQtCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKNCy0LjQtCk7CiAgICAvLyBodHRwOi8vanNmaWRkbGUubmV0L1R3ZU5tLwogICAg0LLQuNC0LmlubmVySFRNTCA9CmAKI9C80YPRgNC+0Lwt0LzQvtC00YPQu9C4LdC/0YDQvtC80L7RgtC60LAKewogICAgaGVpZ2h0OiA5LjVlbTsKICAgIG92ZXJmbG93OiBhdXRvOwogICAgYm9yZGVyOiAxcHggc29saWQgI2FhYTsKfQou0LzRg9GA0L7QvC3QvNC+0LTRg9C70Lgt0YLQsNCx0LvQuNGG0LAt0LjQvNGPCnsKICAgIHdpZHRoOiAxMDAlOwogICAgY3Vyc29yOiBkZWZhdWx0Owp9Ci7QvNGD0YDQvtC8LdC80L7QtNGD0LvQuC3RgtCw0LHQu9C40YbQsC3QuNC80Y8t0LLRi9Cx0L7RgAp7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlOwp9CmA7Cn07CgrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QvtGC0L7QsdGA0LDQt9C40YLRjNCh0L/QuNGB0L7QutCc0L7QtNGD0LvQtdC5ID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0YIgPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC5odG1s0KLQsNCx0LvQuNGG0LA7CiAgICAvLyDQntGH0LjRgdGC0LjRgtGMINGC0LDQsdC70LjRhtGDLgogICAgd2hpbGUgKNGCLnJvd3MubGVuZ3RoKQogICAgewogICAgICAgINGCLmRlbGV0ZVJvdygwKTsKICAgIH07CiAgICAKICAgIHZhciDQvdC+0LzQtdGA0KDRj9C00LAgPSAwOwogICAgZm9yICh2YXIg0L3QvtC80LXRgNCc0L7QtNGD0LvRjyBpbiDQvNGD0YDQvtC8LtC80L7QtNGD0LvQuCkKICAgIHsKICAgICAgICB2YXIg0YDRj9C0ID0g0YIuaW5zZXJ0Um93KNC90L7QvNC10YDQoNGP0LTQsCsrKTsKICAgICAgICB2YXIg0L3QvtC80LXRgNCv0YfQtdC50LrQuCA9IDA7CiAgICAgICAgdmFyINC80L7QtNGD0LvRjCA9INC80YPRgNC+0Lwu0LzQvtC00YPQu9C4W9C90L7QvNC10YDQnNC+0LTRg9C70Y9dOwoKICAgICAgICB2YXIg0YHRgtCw0YLRg9GBID0gIiI7CiAgICAgICAgaWYgKNC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGB0YLQsNGC0YPRgdCc0L7QtNGD0LvRjyjQvNC+0LTRg9C70YwpKQogICAgICAgIHsKICAgICAgICAgICAgdmFyINGB0YLQsNGC0YPRgSA9ICJjaGVja2VkIjsKICAgICAgICB9CiAgICAgICAgdmFyINCy0LrQuyA9INGA0Y/QtC5pbnNlcnRDZWxsKNC90L7QvNC10YDQr9GH0LXQudC60LgrKyk7CiAgICAgICAg0LLQutC7LmlubmVySFRNTCA9IGA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGRpc2FibGVkIGAgKyDRgdGC0LDRgtGD0YEgKyBgPjwvaW5wdXQ+YDsKICAgICAgICAKICAgICAgICB2YXIg0LjQvNGPID0g0YDRj9C0Lmluc2VydENlbGwo0L3QvtC80LXRgNCv0YfQtdC50LrQuCsrKTsKICAgICAgICDQuNC80Y8uaW5uZXJIVE1MID0g0LzQvtC00YPQu9GMWzBdOwogICAgICAgINC40LzRjy5jbGFzc0xpc3QuYWRkKCLQvNGD0YDQvtC8LdC80L7QtNGD0LvQuC3RgtCw0LHQu9C40YbQsC3QuNC80Y8iKTsKICAgIH0KfTsKCtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGB0L7Qt9C00LDRgtGM0JjQvdGC0LXRgNGE0LXQudGB0KLQsNCx0LvQuNGG0YsoKTsK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L7RgtC+0LHRgNCw0LfQuNGC0YzQodC/0LjRgdC+0LrQnNC+0LTRg9C70LXQuSgpOw==",
- ],
-
- [
- "муром.модули.список.выбор",
- "0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YDQsNC90LXQtdCS0YvQsdGA0LDQvdC90YvQudCc0L7QtNGD0LvRjCA9IG51bGw7CtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtCy0YvQsdGA0LDQvdC90YvQudCc0L7QtNGD0LvRjCA9IG51bGw7CtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC90L7QvNC10YDQktGL0LHRgNCw0L3QvdC+0LPQvtCc0L7QtNGD0LvRjyA9IG51bGw7CtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtCy0YvQsdGA0LDQu9C40JzQvtC00YPQu9GMID0gbmV3INCj0LLQtdC00L7QvNC40YLQtdC70YwoKTsKCtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGD0LvQsNCy0LvQuNCy0LDRgtGM0JLRi9Cx0L7RgNCc0L7QtNGD0LvRjyA9IGZ1bmN0aW9uKCkKeyAgICAKICAgIHZhciDRgiA9INC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0Lmh0bWzQotCw0LHQu9C40YbQsDsKICAgIC8vINCj0YHRgtCw0L3QvtCy0LjRgtGMINGD0LLQtdC00L7QvNC40YLQtdC70Y8uCiAgICBmb3IgKHZhciDQvdC+0LzQtdGAID0gMCwg0YDRj9C0OyDRgNGP0LQgPSDRgi5yb3dzW9C90L7QvNC10YBdOyArK9C90L7QvNC10YApCiAgICB7CiAgICAgICAgdmFyINC40LzRjyA9INGA0Y/QtC5jZWxsc1sxXTsKICAgICAgICDQuNC80Y8ub25jbGljayA9IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGA0LDQvdC10LXQktGL0LHRgNCw0L3QvdGL0LnQnNC+0LTRg9C70YwgPQogICAgICAgICAgICAgICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LLRi9Cx0YDQsNC90L3Ri9C50JzQvtC00YPQu9GMOwogICAgICAgICAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QstGL0LHRgNCw0L3QvdGL0LnQnNC+0LTRg9C70YwgPSB0aGlzLmlubmVySFRNTDsKICAgICAgICAgICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L3QvtC80LXRgNCS0YvQsdGA0LDQvdC90L7Qs9C+0JzQvtC00YPQu9GPID0KICAgICAgICAgICAgICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC90L7QvNC10YDQnNC+0LTRg9C70Y8o0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LLRi9Cx0YDQsNC90L3Ri9C50JzQvtC00YPQu9GMKTsKICAgICAgICAgICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LLRi9Cx0YDQsNC70LjQnNC+0LTRg9C70Ywu0YPQstC10LTQvtC80LjRgtGMKCk7CiAgICAgICAgfTsKICAgIH0KfTsKCtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC90L7QvNC10YDQnNC+0LTRg9C70Y8gPSBmdW5jdGlvbijQuNC80Y8pCnsKICAgIGZvciAodmFyINC90L7QvNC10YAgaW4g0LzRg9GA0L7QvC7QvNC+0LTRg9C70LgpCiAgICB7CiAgICAgICAgdmFyINC80L7QtNGD0LvRjCA9INC80YPRgNC+0Lwu0LzQvtC00YPQu9C4W9C90L7QvNC10YBdOwogICAgICAgIHZhciDQuNC80Y/QnNC+0LTRg9C70Y8gPSDQvNC+0LTRg9C70YxbMF07CiAgICAgICAgaWYgKNC40LzRjyA9PSDQuNC80Y/QnNC+0LTRg9C70Y8pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4g0L3QvtC80LXRgDsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiBudWxsOwp9OwoK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L7RgtC+0LHRgNCw0LfQuNGC0YzQktGL0LHQvtGA0JzQvtC00YPQu9GPID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0YIgPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC5odG1s0KLQsNCx0LvQuNGG0LA7CiAgICAvLyDQo9Cx0YDQsNGC0Ywg0L/QvtC00YHQstC10YLQutGDLgogICAgdmFyINC90L7QvNC10YDQoNCw0L3QtdC1ID0g0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L3QvtC80LXRgNCc0L7QtNGD0LvRjyjQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7RgNCw0L3QtdC10JLRi9Cx0YDQsNC90L3Ri9C50JzQvtC00YPQu9GMKTsKICAgIGlmICjQvdC+0LzQtdGA0KDQsNC90LXQtSkKICAgIHsKICAgICAgICB2YXIg0Y/Rh9C10LnQutCwID0g0YIucm93c1vQvdC+0LzQtdGA0KDQsNC90LXQtV0uY2VsbHNbMV07CiAgICAgICAg0Y/Rh9C10LnQutCwLmNsYXNzTGlzdC5yZW1vdmUoItC80YPRgNC+0Lwt0LzQvtC00YPQu9C4LdGC0LDQsdC70LjRhtCwLdC40LzRjy3QstGL0LHQvtGAIik7CiAgICB9CiAgICAvLyDQn9C+0LTRgdCy0LXRgtC40YLRjC4KICAgIHZhciDQvdC+0LzQtdGA0J3Ri9C90YfQtSA9INC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC90L7QvNC10YDQktGL0LHRgNCw0L3QvdC+0LPQvtCc0L7QtNGD0LvRjzsKICAgIHZhciDRj9GH0LXQudC60LAgPSDRgi5yb3dzW9C90L7QvNC10YDQndGL0L3Rh9C1XS5jZWxsc1sxXTsKICAgINGP0YfQtdC50LrQsC5jbGFzc0xpc3QuYWRkKCLQvNGD0YDQvtC8LdC80L7QtNGD0LvQuC3RgtCw0LHQu9C40YbQsC3QuNC80Y8t0LLRi9Cx0L7RgCIpOwp9OwoK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YPQu9Cw0LLQu9C40LLQsNGC0YzQktGL0LHQvtGA0JzQvtC00YPQu9GPKCk7CgrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QstGL0LHRgNCw0LvQuNCc0L7QtNGD0LvRjC7Qv9C+0LTQv9C40YHQsNGC0YwoCiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QvtGC0L7QsdGA0LDQt9C40YLRjNCS0YvQsdC+0YDQnNC+0LTRg9C70Y8KKTs=",
- ],
-
- [
- "муром.модули.код-выбранного-модуля",
- "0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L7RgtC+0LHRgNCw0LfQuNGC0YzQmtC+0LTQktGL0LHRgNCw0L3QvdC+0LPQvtCc0L7QtNGD0LvRjyA9IGZ1bmN0aW9uKCkKewogICAgdmFyINC80L7QtNGD0LvRjCA9INC80YPRgNC+0Lwu0LzQvtC00YPQu9C4W9C80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC90L7QvNC10YDQktGL0LHRgNCw0L3QvdC+0LPQvtCc0L7QtNGD0LvRj107CiAgICB2YXIg0LrQvtC0ID0gYmFzZTY0RGVjb2RlKNC80L7QtNGD0LvRjFsxXSk7CiAgICDQvNGD0YDQvtC8LtGA0LXQtNCw0LrRgtC+0YAuc2Vzc2lvbi5zZXRWYWx1ZSjQutC+0LQpOwp9OwoK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LLRi9Cx0YDQsNC70LjQnNC+0LTRg9C70Ywu0L/QvtC00L/QuNGB0LDRgtGMKAogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L7RgtC+0LHRgNCw0LfQuNGC0YzQmtC+0LTQktGL0LHRgNCw0L3QvdC+0LPQvtCc0L7QtNGD0LvRjwopOw==",
- ],
-
- [
- "муром.модули.выбрать-первый-модуль",
- "0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LLRi9Cx0YDQsNGC0YzQn9C10YDQstGL0LnQnNC+0LTRg9C70YwgPSBmdW5jdGlvbigpCnsKICAgIHZhciDQvNC+0LTRg9C70YwgPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQuFswXTsKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGA0LDQvdC10LXQktGL0LHRgNCw0L3QvdGL0LnQnNC+0LTRg9C70YwgPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QstGL0LHRgNCw0L3QvdGL0LnQnNC+0LTRg9C70Yw7CiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QstGL0LHRgNCw0L3QvdGL0LnQnNC+0LTRg9C70YwgPSDQvNC+0LTRg9C70YxbMF07CiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QvdC+0LzQtdGA0JLRi9Cx0YDQsNC90L3QvtCz0L7QnNC+0LTRg9C70Y8gPSAwOwogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LLRi9Cx0YDQsNC70LjQnNC+0LTRg9C70Ywu0YPQstC10LTQvtC80LjRgtGMKCk7Cn07CgrQvNGD0YDQvtC8LtGB0YLQsNGA0YIu0L/QvtC00L/QuNGB0LDRgtGMKNC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtCy0YvQsdGA0LDRgtGM0J/QtdGA0LLRi9C50JzQvtC00YPQu9GMKTs=",
- ],
-
- [
- "муром.модули.редактирование",
- "0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtC30LTQsNGC0YzQmNC90YLQtdGA0YTQtdC50YHQoNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNGPID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0YDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjQtSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQuaHRtbNCc0L7QtNGD0LvQuC5hcHBlbmRDaGlsZCjRgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNC1KTsKICAgINGA0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40LUuaWQgPSAi0YDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjQtSIKICAgINGA0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40LUuaW5uZXJIVE1MID0gItCg0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40LUiOwogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQuaHRtbNCg0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40LUgPSDRgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNC1OwogICAgCiAgICB2YXIg0LLQuNC0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQo0LLQuNC0KTsKICAgINCy0LjQtC5pbm5lckhUTUwgPQpgCiPRgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNC1CnsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNhYWE7Cn0KYDsKfTsKCtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGB0L7Qt9C00LDRgtGM0JjQvdGC0LXRgNGE0LXQudGB0KDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjRjygpOw==",
- ],
-
- [
- "муром.модули.редактирование.имя",
- "0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L/QtdGA0LXQuNC80LXQvdC+0LLQsNGC0YwgPSBuZXcg0KPQstC10LTQvtC80LjRgtC10LvRjCgpOwrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7Qv9C10YDQtdC40LzQtdC90L7QstCw0LvQuCA9IG5ldyDQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMKCk7CgrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7RgdC+0LfQtNCw0YLRjNCY0L3RgtC10YDRhNC10LnRgdCg0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40Y/QmNC80LXQvdC4ID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0LjQvNGPID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC5odG1s0KDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjQtS5hcHBlbmRDaGlsZCjQuNC80Y8pOwogICAg0LjQvNGPLmlubmVySFRNTCA9CmAKPHRhYmxlIGlkID0gItGA0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40LUt0LjQvNGPIj4KICAgIDx0cj4KICAgICAgICA8dGQ+0JjQvNGPOjwvdGQ+CiAgICAgICAgPHRkPjxpbnB1dCBpZCA9ICLQuNC80Y8iPjwvaW5wdXQ+PC90ZD4KICAgICAgICA8dGQ+PGJ1dHRvbiBpZCA9ICLQv9C10YDQtdC40LzQtdC90L7QstCw0YLRjCI+0J/QtdGA0LXQuNC80LXQvdC+0LLQsNGC0Yw8L2J1dHRvbj48L3RkPgogICAgPC90cj4KPC90YWJsZT4KYDsKICAgIHZhciDQstC40LQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCjQstC40LQpOwogICAg0LLQuNC0LmlubmVySFRNTCA9CmAKI9GA0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40LUt0LjQvNGPCnsKICAgIHdpZHRoOiAxMDAlOwp9CiPQuNC80Y8KewogICAgd2lkdGg6IDEwMCU7Cn0KYDsKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0Lmh0bWzQmNC80Y8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi0LjQvNGPIik7CiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC5odG1s0J/QtdGA0LXQuNC80LXQvdC+0LLQsNGC0YwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi0L/QtdGA0LXQuNC80LXQvdC+0LLQsNGC0YwiKTsKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0Lmh0bWzQn9C10YDQtdC40LzQtdC90L7QstCw0YLRjC5vbmNsaWNrID0gZnVuY3Rpb24oKQogICAgewogICAgICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC/0LXRgNC10LjQvNC10L3QvtCy0LDRgtGMLtGD0LLQtdC00L7QvNC40YLRjCgpOwogICAgfTsKfTsKCtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC+0YLQvtCx0YDQsNC30LjRgtGM0JjQvNGP0JLRi9Cx0YDQsNC90L3QvtCz0L7QnNC+0LTRg9C70Y8gPSBmdW5jdGlvbigpCnsKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0Lmh0bWzQmNC80Y8udmFsdWUgPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QstGL0LHRgNCw0L3QvdGL0LnQnNC+0LTRg9C70Yw7Cn07CgrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7Qv9C10YDQtdC40LzQtdC90L7QstCw0YLRjNCS0YvQsdGA0LDQvdC90YvQudCc0L7QtNGD0LvRjCA9IGZ1bmN0aW9uKCkKewogICAgdmFyINC80L7QtNGD0LvRjCA9INC80YPRgNC+0Lwu0LzQvtC00YPQu9C4W9C80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC90L7QvNC10YDQktGL0LHRgNCw0L3QvdC+0LPQvtCc0L7QtNGD0LvRj107CiAgICDQvNC+0LTRg9C70YxbMF0gPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC5odG1s0JjQvNGPLnZhbHVlOwogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L/QtdGA0LXQuNC80LXQvdC+0LLQsNC70Lgu0YPQstC10LTQvtC80LjRgtGMKCk7Cn07CgrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7RgdC+0LfQtNCw0YLRjNCY0L3RgtC10YDRhNC10LnRgdCg0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40Y/QmNC80LXQvdC4KCk7CtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtCy0YvQsdGA0LDQu9C40JzQvtC00YPQu9GMLtC/0L7QtNC/0LjRgdCw0YLRjCgKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC+0YLQvtCx0YDQsNC30LjRgtGM0JjQvNGP0JLRi9Cx0YDQsNC90L3QvtCz0L7QnNC+0LTRg9C70Y8KKTsK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L/QtdGA0LXQuNC80LXQvdC+0LLQsNGC0Ywu0L/QvtC00L/QuNGB0LDRgtGMKAogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L/QtdGA0LXQuNC80LXQvdC+0LLQsNGC0YzQktGL0LHRgNCw0L3QvdGL0LnQnNC+0LTRg9C70YwKKTsK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L/QtdGA0LXQuNC80LXQvdC+0LLQsNC70Lgu0L/QvtC00L/QuNGB0LDRgtGM0JzQvdC+0LPQvihbCiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QvtGC0L7QsdGA0LDQt9C40YLRjNCh0L/QuNGB0L7QutCc0L7QtNGD0LvQtdC5LAogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YPQu9Cw0LLQu9C40LLQsNGC0YzQktGL0LHQvtGA0JzQvtC00YPQu9GPLAogICAgZnVuY3Rpb24oKXsKICAgICAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7RgNCw0L3QtdC10JLRi9Cx0YDQsNC90L3Ri9C50JzQvtC00YPQu9GMID0KICAgICAgICAgICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LLRi9Cx0YDQsNC90L3Ri9C50JzQvtC00YPQu9GMOwogICAgICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtCy0YvQsdGA0LDQvdC90YvQudCc0L7QtNGD0LvRjCA9INC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0Lmh0bWzQmNC80Y8udmFsdWU7CiAgICAgICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LLRi9Cx0YDQsNC70LjQnNC+0LTRg9C70Ywu0YPQstC10LTQvtC80LjRgtGMKCk7CiAgICB9LApdKTs=",
- ],
-
- [
- "муром.модули.редактирование.статус",
- "0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L/QtdGA0LXQutC70Y7Rh9C40YLRjCA9IG5ldyDQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMKCk7CtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC/0LXRgNC10LrQu9GO0YfQuNC70LggPSBuZXcg0KPQstC10LTQvtC80LjRgtC10LvRjCgpOwoK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtC30LTQsNGC0YzQmNC90YLQtdGA0YTQtdC50YHQoNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNGP0KHRgtCw0YLRg9GB0LAgPSBmdW5jdGlvbigpCnsKICAgIHZhciDRgdGC0LDRgtGD0YEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0Lmh0bWzQoNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNC1LmFwcGVuZENoaWxkKNGB0YLQsNGC0YPRgSk7CiAgICDRgdGC0LDRgtGD0YEuaW5uZXJIVE1MID0KYArQodGC0LDRgtGD0YE6IDxzcGFuIGlkID0gItGB0YLQsNGC0YPRgSI+PC9zcGFuPiA8YnV0dG9uIGlkID0gItC/0LXRgNC10LrQu9GO0YfQuNGC0YwiPjwvYnV0dG9uPgpgOwogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQuaHRtbNCh0YLQsNGC0YPRgSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCLRgdGC0LDRgtGD0YEiKTsKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0Lmh0bWzQn9C10YDQtdC60LvRjtGH0LjRgtGMID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoItC/0LXRgNC10LrQu9GO0YfQuNGC0YwiKTsKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0Lmh0bWzQn9C10YDQtdC60LvRjtGH0LjRgtGMLm9uY2xpY2sgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L/QtdGA0LXQutC70Y7Rh9C40YLRjC7Rg9Cy0LXQtNC+0LzQuNGC0YwoKTsKICAgIH07Cn07CgrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QvtGC0L7QsdGA0LDQt9C40YLRjNCh0YLQsNGC0YPRgdCS0YvQsdGA0LDQvdC90L7Qs9C+0JzQvtC00YPQu9GPID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0LzQvtC00YPQu9GMID0g0LzRg9GA0L7QvC7QvNC+0LTRg9C70Lhb0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L3QvtC80LXRgNCS0YvQsdGA0LDQvdC90L7Qs9C+0JzQvtC00YPQu9GPXTsKICAgIHZhciDRgdGC0LDRgtGD0YEgPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7RgdGC0LDRgtGD0YHQnNC+0LTRg9C70Y8o0LzQvtC00YPQu9GMKTsKICAgIHZhciDRgtC10LrRgdGC0KHRgtCw0YLRg9GB0LAgPSAn0JLQutC70Y7Rh9C10L3Qvic7CiAgICB2YXIg0YLQtdC60YHRgtCa0L3QvtC/0LrQuCA9ICfQntGC0LrQu9GO0YfQuNGC0YwnOwogICAgaWYgKCHRgdGC0LDRgtGD0YEpCiAgICB7CiAgICAgICAg0YLQtdC60YHRgtCh0YLQsNGC0YPRgdCwID0gJ9Ce0YLQutC70Y7Rh9C10L3Qvic7CiAgICAgICAg0YLQtdC60YHRgtCa0L3QvtC/0LrQuCA9ICfQktC60LvRjtGH0LjRgtGMJzsKICAgIH0KICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0Lmh0bWzQodGC0LDRgtGD0YEuaW5uZXJIVE1MID0g0YLQtdC60YHRgtCh0YLQsNGC0YPRgdCwOwogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQuaHRtbNCf0LXRgNC10LrQu9GO0YfQuNGC0YwuaW5uZXJIVE1MID0g0YLQtdC60YHRgtCa0L3QvtC/0LrQuDsKfTsKCtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC/0LXRgNC10LrQu9GO0YfQuNGC0YzQodGC0LDRgtGD0YHQktGL0LHRgNCw0L3QvdC+0LPQvtCc0L7QtNGD0LvRjyA9IGZ1bmN0aW9uKCkKewogICAgdmFyINC80L7QtNGD0LvRjCA9INC80YPRgNC+0Lwu0LzQvtC00YPQu9C4W9C80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC90L7QvNC10YDQktGL0LHRgNCw0L3QvdC+0LPQvtCc0L7QtNGD0LvRj107CiAgICB2YXIg0YHRgtCw0YLRg9GBID0g0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHRgtCw0YLRg9GB0JzQvtC00YPQu9GPKNC80L7QtNGD0LvRjCk7CiAgICDRgdGC0LDRgtGD0YEgPSAh0YHRgtCw0YLRg9GBOwogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LfQsNC00LDRgtGM0KHRgtCw0YLRg9GB0JzQvtC00YPQu9GPKNC80L7QtNGD0LvRjCwg0YHRgtCw0YLRg9GBKTsKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC/0LXRgNC10LrQu9GO0YfQuNC70Lgu0YPQstC10LTQvtC80LjRgtGMKCk7CiAgICAKICAgIGNvbnNvbGUubG9nKCLRgdGC0LDRgtGD0YEg0L/QvtGB0LvQtTogJyIrINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGB0YLQsNGC0YPRgdCc0L7QtNGD0LvRjyjQvNC+0LTRg9C70YwpICsgIiciKTsKfTsKCtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGB0L7Qt9C00LDRgtGM0JjQvdGC0LXRgNGE0LXQudGB0KDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjRj9Ch0YLQsNGC0YPRgdCwKCk7CgrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QstGL0LHRgNCw0LvQuNCc0L7QtNGD0LvRjC7Qv9C+0LTQv9C40YHQsNGC0YwoCiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QvtGC0L7QsdGA0LDQt9C40YLRjNCh0YLQsNGC0YPRgdCS0YvQsdGA0LDQvdC90L7Qs9C+0JzQvtC00YPQu9GPCik7CtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC/0LXRgNC10LrQu9GO0YfQuNGC0Ywu0L/QvtC00L/QuNGB0LDRgtGMKAogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0L/QtdGA0LXQutC70Y7Rh9C40YLRjNCh0YLQsNGC0YPRgdCS0YvQsdGA0LDQvdC90L7Qs9C+0JzQvtC00YPQu9GPCik7CtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC/0LXRgNC10LrQu9GO0YfQuNC70Lgu0L/QvtC00L/QuNGB0LDRgtGM0JzQvdC+0LPQvihbICAgICAgICAKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC+0YLQvtCx0YDQsNC30LjRgtGM0KHQv9C40YHQvtC60JzQvtC00YPQu9C10LksCiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7Rg9C70LDQstC70LjQstCw0YLRjNCS0YvQsdC+0YDQnNC+0LTRg9C70Y8sCiAgICBmdW5jdGlvbigpewogICAgICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGA0LDQvdC10LXQktGL0LHRgNCw0L3QvdGL0LnQnNC+0LTRg9C70YwgPQogICAgICAgICAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QstGL0LHRgNCw0L3QvdGL0LnQnNC+0LTRg9C70Yw7CiAgICAgICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LLRi9Cx0YDQsNC90L3Ri9C50JzQvtC00YPQu9GMID0g0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQuaHRtbNCY0LzRjy52YWx1ZTsKICAgICAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QstGL0LHRgNCw0LvQuNCc0L7QtNGD0LvRjC7Rg9Cy0LXQtNC+0LzQuNGC0YwoKTsKICAgIH0sCl0pOw==",
- ],
-
- [
- "муром.модули.добавление",
- "0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LTQvtCx0LDQstC40YLRjCA9IG5ldyDQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMKCk7CtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC00L7QsdCw0LLQuNC70LggPSBuZXcg0KPQstC10LTQvtC80LjRgtC10LvRjCgpOwoK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtC30LTQsNGC0YzQmNC90YLQtdGA0YTQtdC50YHQlNC+0LHQsNCy0LvQtdC90LjRjyA9IGZ1bmN0aW9uKCkKewogICAgdmFyINC00L7QsdCw0LLQu9C10L3QuNC1ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC5odG1s0JzQvtC00YPQu9C4LmFwcGVuZENoaWxkKNC00L7QsdCw0LLQu9C10L3QuNC1KTsKICAgINC00L7QsdCw0LLQu9C10L3QuNC1LmlubmVySFRNTCA9ICLQlNC+0LHQsNCy0LjRgtGMINC80L7QtNGD0LvRjCI7CiAgICDQtNC+0LHQsNCy0LvQtdC90LjQtS5vbmNsaWNrID0gZnVuY3Rpb24oKQogICAgewogICAgICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC00L7QsdCw0LLQuNGC0Ywu0YPQstC10LTQvtC80LjRgtGMKCk7CiAgICB9OwogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQuaHRtbNCU0L7QsdCw0LLQu9C10L3QuNC1ID0g0LTQvtCx0LDQstC70LXQvdC40LU7Cn07CgrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QtNC+0LHQsNCy0LjRgtGM0JzQvtC00YPQu9GMID0gZnVuY3Rpb24oKQp7CiAgICB2YXIg0YHQu9GD0YfQsNC50L3QvtC10KfQuNGB0LvQviA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE1hdGguZmxvb3IoMTAwMCkpOwogICAgdmFyINC40LzRjyA9ICLQvdC+0LLRi9C5LSIgKyDRgdC70YPRh9Cw0LnQvdC+0LXQp9C40YHQu9C+OyAKICAgIHZhciDQutC+0LQgPQpgCmNvbnNvbGUubG9nKCLQndCQ0JTQniDQlNC+0LHQsNCy0LjRgtGMINC60L7QtCDQsiDQvNC+0LTRg9C70YwgJ2AKKwrQuNC80Y8KKwpgJyIpO2A7CiAgICB2YXIg0LzQvtC00YPQu9GMID0gW9C40LzRjywgYmFzZTY0RW5jb2RlKNC60L7QtCldOwogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LgucHVzaCjQvNC+0LTRg9C70YwpOwogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LTQvtCx0LDQstC40LvQuC7Rg9Cy0LXQtNC+0LzQuNGC0YwoKTsKfTsKCtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtCy0YvQsdGA0LDRgtGM0J/QvtGB0LvQtdC00L3QuNC50JzQvtC00YPQu9GMID0gZnVuY3Rpb24oKQp7CiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QvtGC0L7QsdGA0LDQt9C40YLRjNCh0L/QuNGB0L7QutCc0L7QtNGD0LvQtdC5KCk7CiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7Rg9C70LDQstC70LjQstCw0YLRjNCS0YvQsdC+0YDQnNC+0LTRg9C70Y8oKTsKICAgIHZhciDQvdC+0LzQtdGAID0g0LzRg9GA0L7QvC7QvNC+0LTRg9C70LgubGVuZ3RoIC0gMTsKICAgIHZhciDQvNC+0LTRg9C70YwgPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQuFvQvdC+0LzQtdGAXTsKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGA0LDQvdC10LXQktGL0LHRgNCw0L3QvdGL0LnQnNC+0LTRg9C70YwgPSDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QstGL0LHRgNCw0L3QvdGL0LnQnNC+0LTRg9C70Yw7CiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QvdC+0LzQtdGA0JLRi9Cx0YDQsNC90L3QvtCz0L7QnNC+0LTRg9C70Y8gPSDQvdC+0LzQtdGAOwogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LLRi9Cx0YDQsNC90L3Ri9C50JzQvtC00YPQu9GMID0g0LzQvtC00YPQu9GMWzBdOwoKICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtCy0YvQsdGA0LDQu9C40JzQvtC00YPQu9GMLtGD0LLQtdC00L7QvNC40YLRjCgpOwp9OwoK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtC30LTQsNGC0YzQmNC90YLQtdGA0YTQtdC50YHQlNC+0LHQsNCy0LvQtdC90LjRjygpOwrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QtNC+0LHQsNCy0LjRgtGMLtC/0L7QtNC/0LjRgdCw0YLRjCjQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QtNC+0LHQsNCy0LjRgtGM0JzQvtC00YPQu9GMKTsK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LTQvtCx0LDQstC40LvQuC7Qv9C+0LTQv9C40YHQsNGC0Ywo0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0LLRi9Cx0YDQsNGC0YzQn9C+0YHQu9C10LTQvdC40LnQnNC+0LTRg9C70YwpOw==",
- ],
-
- [
- "муром.модули.удаление",
- "0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YPQtNCw0LvQuNGC0YwgPSBuZXcg0KPQstC10LTQvtC80LjRgtC10LvRjCgpOwrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7Rg9C00LDQu9C40LvQuCA9IG5ldyDQo9Cy0LXQtNC+0LzQuNGC0LXQu9GMKCk7CgrQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7RgdC+0LfQtNCw0YLRjNCY0L3RgtC10YDRhNC10LnRgdCj0LTQsNC70LXQvdC40Y8gPSBmdW5jdGlvbigpCnsKICAgIHZhciDRg9C00LDQu9C10L3QuNC1ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICDQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC5odG1s0JzQvtC00YPQu9C4LmFwcGVuZENoaWxkKNGD0LTQsNC70LXQvdC40LUpOwogICAg0YPQtNCw0LvQtdC90LjQtS5pbm5lckhUTUwgPSAi0KPQtNCw0LvQuNGC0Ywg0LLRi9Cx0YDQsNC90L3Ri9C5INC80L7QtNGD0LvRjCI7CiAgICDRg9C00LDQu9C10L3QuNC1Lm9uY2xpY2sgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YPQtNCw0LvQuNGC0Ywu0YPQstC10LTQvtC80LjRgtGMKCk7CiAgICB9OwogICAg0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQuaHRtbNCj0LTQsNC70LXQvdC40LUgPSDRg9C00LDQu9C10L3QuNC1Owp9OwoK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YPQtNCw0LvQuNGC0YzQktGL0LHRgNCw0L3QvdGL0LnQnNC+0LTRg9C70YwgPSBmdW5jdGlvbigpCnsKICAgIC8vINCj0LTQsNC70Y/QtdC8INC70LjRiNGMINCy0YvQutC70Y7Rh9C10L3QvdGL0Lkg0LzQvtC00YPQu9GMLgogICAgdmFyINC80L7QtNGD0LvRjCA9INC80YPRgNC+0Lwu0LzQvtC00YPQu9C4W9C80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtC90L7QvNC10YDQktGL0LHRgNCw0L3QvdC+0LPQvtCc0L7QtNGD0LvRj107CiAgICB2YXIg0YHRgtCw0YLRg9GBID0g0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHRgtCw0YLRg9GB0JzQvtC00YPQu9GPKNC80L7QtNGD0LvRjCk7CiAgICBpZiAo0YHRgtCw0YLRg9GBKQogICAgewogICAgICAgIGFsZXJ0KCLQntCo0JjQkdCa0JAg0KPQtNCw0LvQuNGC0Ywg0LzQvtC20L3QviDQu9C40YjRjCDQstGL0LrQu9GO0YfQtdC90L3Ri9C5INC80L7QtNGD0LvRjCIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C4LnNwbGljZSjQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QvdC+0LzQtdGA0JLRi9Cx0YDQsNC90L3QvtCz0L7QnNC+0LTRg9C70Y8sIDEpOwogICAgICAgINC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGD0LTQsNC70LjQu9C4LtGD0LLQtdC00L7QvNC40YLRjCgpOwogICAgfQp9OwoK0LzRg9GA0L7QvC7QvNC+0LTRg9C70LXQstC10LQu0YHQvtC30LTQsNGC0YzQmNC90YLQtdGA0YTQtdC50YHQo9C00LDQu9C10L3QuNGPKCk7CtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGD0LTQsNC70LjRgtGMLtC/0L7QtNC/0LjRgdCw0YLRjCjQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7Rg9C00LDQu9C40YLRjNCS0YvQsdGA0LDQvdC90YvQudCc0L7QtNGD0LvRjCk7CtC80YPRgNC+0Lwu0LzQvtC00YPQu9C10LLQtdC0LtGD0LTQsNC70LjQu9C4LtC/0L7QtNC/0LjRgdCw0YLRjCjQvNGD0YDQvtC8LtC80L7QtNGD0LvQtdCy0LXQtC7QstGL0LHRgNCw0YLRjNCf0L7RgdC70LXQtNC90LjQudCc0L7QtNGD0LvRjCk7",
- ],
- ];
- </script>
- <script>
- муром.модулиПодготовлены = new Уведомитель();
- муром.подготовитьМодули = function()
- {
- localforage.config({ name: "murom" });
- localforage.getItem("модули", function(ошибка, модули) {
- if (модули)
- {
- муром.модули = модули;
- }
- муром.модулиПодготовлены.уведомить();
- });
- };
-
- муром.модулиЗагружены = new Уведомитель();
- муром.загрузитьМодули = function()
- {
- for (var номер in муром.модули)
- {
- var модуль = муром.модули[номер];
- var код = base64Decode(модуль[1]);
- var статус = модуль[2];
- if (статус == false)
- {
- console.log("ВНИМАНИЕ Загрузка модуля '" + модуль[0] + "' пропущена, т.к. модуль отключен в настройках");
- }
- else
- {
- try
- {
- eval(код);
- }
- catch (e)
- {
- console.log("ОШИБКА Не удалось загрузить модуль '" + модуль[0] + "': '" + e + "'");
- }
- }
- }
- муром.модулиЗагружены.уведомить();
- }
-
- муром.подготовитьМодули();
-
- муром.модулиПодготовлены.подписать(муром.загрузитьМодули);
- муром.модулиЗагружены.подписать(function(){
- муром.старт.уведомить();
- });
-
- </script>
- </body>
- </html>
|