gl-draw 0.9.0-beta.261 → 0.9.0-beta.263

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- "use strict";var P=Object.defineProperty,v=Object.defineProperties;var E=Object.getOwnPropertyDescriptors;var g=Object.getOwnPropertySymbols;var e=Object.prototype.hasOwnProperty,D=Object.prototype.propertyIsEnumerable;var T=(X,l,Z)=>l in X?P(X,l,{enumerable:!0,configurable:!0,writable:!0,value:Z}):X[l]=Z,L=(X,l)=>{for(var Z in l||(l={}))e.call(l,Z)&&T(X,Z,l[Z]);if(g)for(var Z of g(l))D.call(l,Z)&&T(X,Z,l[Z]);return X},k=(X,l)=>v(X,E(l));var Y=(X,l,Z)=>new Promise((b,G)=>{var d=c=>{try{m(Z.next(c))}catch(V){G(V)}},W=c=>{try{m(Z.throw(c))}catch(V){G(V)}},m=c=>c.done?b(c.value):Promise.resolve(c.value).then(d,W);m((Z=Z.apply(X,l)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const K=require("esus-lite"),i=require("../BaseObject.js"),A=require("../index2.js"),I=require("idb-keyval"),O=require("three"),f=require("../getProjection.js"),r=require("../events.js"),M=require("three/examples/jsm/loaders/GLTFLoader"),q=require("three/examples/jsm/loaders/DRACOLoader"),$=require("three/examples/jsm/loaders/EXRLoader"),F=require("../colorCorrection.js");require("three/examples/jsm/renderers/CSS2DRenderer");require("three/examples/jsm/renderers/CSS3DRenderer");require("../disposeMesh.js");require("d3-geo");function _(X){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(X){for(const Z in X)if(Z!=="default"){const b=Object.getOwnPropertyDescriptor(X,Z);Object.defineProperty(l,Z,b.get?b:{enumerable:!0,get:()=>X[Z]})}}return l.default=X,Object.freeze(l)}const h=_(O);class ll{constructor(){this.cache=new Map}install(){}init(l){const Z=K.makePromiseCreator();this.cache.set(l,Z)}get(l,Z){return Y(this,null,function*(){if(!this.cache.get(l)&&Z){this.init(l);const b=yield Z();this.set(l,b)}if(this.cache.get(l))return yield this.cache.get(l).promise})}set(l,Z){const b=this.cache.get(l);b?b.resolve(Z):console.warn("init cache first")}dispose(){this.cache.forEach((l,Z)=>{l.reject(`stop set cache:${Z}`)}),this.cache.clear()}}class Zl{constructor(l){this.nodeGroupVisible=!0,this.objectNamesToFactories=new Map,this.objects=new Map,this.objects_=l}get objectsPromise(){const l=[];return this.objects.forEach(Z=>{l.push(Z.pm.promise)}),l}install(l){this.pencil=l,this.initObjectFactories()}initObjectFactories(){const{objects_:l}=this;Object.keys(l).forEach(Z=>{const b=class{create(d={}){return new l[Z](d)}};this.objectNamesToFactories.set(Z,b)}),this.objectNamesToFactories.set("@Group",class{create(){return new A.Group}})}getObject(l,Z){l.includes("#")&&console.warn("getObject:err:不支持 #",l);const{key:b}=Z||{},G=`${l}${b?`#${b}`:""}`;return this.objects.get(G)}getAllObject(l,Z){l.includes("#")&&console.warn("getAllObject:err:不支持 #",l);const{key:b}=Z||{},G=`${l}${b?`#${b}`:""}`,d=[];return this.objects.forEach((W,m)=>{(m.startsWith(`${G}#`)||m===G)&&d.push(W)}),d}instantiate(b){return Y(this,arguments,function*(l,{create:Z}={}){const{objectType:G,objectOptions:d}=l,[,W]=G.split("#"),m=yield this.draw(W,k(L({},d||{}),{create:Z,prefab:!1}));return m.setMaterialList("instantiate","clone"),m.useMaterial("instantiate"),m})}initGroup(){return Y(this,null,function*(){this.group||(this.group=yield this.draw("@Group",{target:this.pencil.scene})),this.prefabGroup||(this.prefabGroup=yield this.draw("@Group",{key:"Prefab",target:this.pencil.scene}),this.prefabGroup.hide())})}draw(l,Z,b){return Y(this,null,function*(){var d,W,m,c,V;const G=this.objectNamesToFactories.get(l);if(G){Z||(Z={}),Z.target=(d=Z.target)!=null?d:b;const{key:p}=Z;let a=`${l}${p?`#${p}`:""}`;this.objects.has(a)&&(a+=`#${K.generateUUID()}`);const R=Z.target,x=(W=Z.onTop)!=null?W:0,S=(m=Z.prefab)!=null?m:!1,C=(c=Z.create)!=null?c:!0,u=new G().create(Z);let y;return R===null?y=null:typeof R=="string"?y=this.objects.get(R):(V=R==null?void 0:R.objectType)!=null&&V.startsWith("BaseObject")||R?y=R:S&&this.prefabGroup?y=this.prefabGroup:!S&&this.group?y=this.group:y=this.pencil.scene,C===!1?u.create=()=>{}:C!==!0&&(u.create=()=>{C(u)}),u.pencil=this.pencil,u.drawController=this,u.key=a,u.prefab=S,u.objectType=`BaseObject#${l}`,u.objectOptions=Z,this.objects.set(a,u),yield this.addBaseObject(u,y,x),u}throw new Error(`Unrecognized:${l}`)})}addBaseObject(l,Z,b){return Y(this,null,function*(){yield l.create();const G=l.objectType==="BaseObject#Node";l.object3d&&(i.objMap.set(l.object3d,l),b&&l.setTop(b),Z!==null&&Z.add(l.object3d)),G&&(l.drawGroupShow=this.nodeGroupVisible),l.render(),l.pm.resolve()})}erase(...l){[...l].forEach(Z=>{const b=[];if(typeof Z=="string"){const[G,d]=Z.split("#");b.push(...this.getAllObject(G,{key:d}))}else b.push(Z);b.forEach(G=>{this.removeBaseObject(G)})})}removeBaseObject(l){const{parent:Z}=l;l.object3d&&Z&&Z.remove(l.object3d),l.traverse(b=>{b.dispose(),this.objects.delete(b.key),b.object3d&&i.objMap.delete(b.object3d)})}update(l,Z){this.objects.forEach(b=>{b.update(l,Z)})}setSize(l,Z){this.objects.forEach(b=>{b.resize(l,Z)})}setNodeGroupVisible(l){this.nodeGroupVisible!==l&&(this.nodeGroupVisible=l,this.objects.forEach(Z=>{if(Z.key.startsWith("Node")){const b=Z;b.drawGroupShow=l,b.checkVisible()}}))}show(){var l;(l=this.group)==null||l.show(),this.setNodeGroupVisible(!0)}hide(){var l;(l=this.group)==null||l.hide(),this.setNodeGroupVisible(!1)}showPrefab(l){var Z;this.hide(),(Z=this.prefabGroup)==null||Z.show(),this.objects.forEach(b=>{b.prefab&&(b.key===l?b.show():b.hide())})}hidePrefab(){var l;this.show(),(l=this.prefabGroup)==null||l.hide(),this.objects.forEach(Z=>{Z.prefab&&Z.show()})}eraseAll(){this.group&&(this.objects.forEach(l=>{l.key.startsWith("Node")&&this.erase(l)}),this.erase(this.group))}dispose(){this.objects.forEach((l,Z)=>{l.dispose(),l.pm.reject(`stop draw:${Z}`)}),this.objects.clear(),this.objectNamesToFactories.clear(),this.group=void 0,this.prefabGroup=void 0}}class bl{constructor(){this.data={}}install(){}setData(l,Z){var b;this.data[l]=Z,(b=this.cb)==null||b.call(this,l)}runAll(){Object.keys(this.data).forEach(l=>{var Z;(Z=this.cb)==null||Z.call(this,l)})}runType(l){var Z;this.data[l]!==void 0&&((Z=this.cb)==null||Z.call(this,l))}dispose(){this.data={},this.cb=void 0}}const t="dmFyIFFBPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxqQT1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgZVQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIG9jPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIHJfPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksc189T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgeHM9TWF0aC5wb3csaV89KGZ0LFJ0LFN0KT0+UnQgaW4gZnQ/UUEoZnQsUnQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlN0fSk6ZnRbUnRdPVN0LHZyPShmdCxSdCk9Pntmb3IodmFyIFN0IGluIFJ0fHwoUnQ9e30pKXJfLmNhbGwoUnQsU3QpJiZpXyhmdCxTdCxSdFtTdF0pO2lmKG9jKWZvcih2YXIgU3Qgb2Ygb2MoUnQpKXNfLmNhbGwoUnQsU3QpJiZpXyhmdCxTdCxSdFtTdF0pO3JldHVybiBmdH0sd2Y9KGZ0LFJ0KT0+akEoZnQsZVQoUnQpKTt2YXIgYV89KGZ0LFJ0KT0+e3ZhciBTdD17fTtmb3IodmFyIHNuIGluIGZ0KXJfLmNhbGwoZnQsc24pJiZSdC5pbmRleE9mKHNuKTwwJiYoU3Rbc25dPWZ0W3NuXSk7aWYoZnQhPW51bGwmJm9jKWZvcih2YXIgc24gb2Ygb2MoZnQpKVJ0LmluZGV4T2Yoc24pPDAmJnNfLmNhbGwoZnQsc24pJiYoU3Rbc25dPWZ0W3NuXSk7cmV0dXJuIFN0fTt2YXIgeXM9KGZ0LFJ0LFN0KT0+bmV3IFByb21pc2UoKHNuLE1yKT0+e3ZhciBVYT1Dbj0+e3RyeXt2cyhTdC5uZXh0KENuKSl9Y2F0Y2goU3Ipe01yKFNyKX19LGxjPUNuPT57dHJ5e3ZzKFN0LnRocm93KENuKSl9Y2F0Y2goU3Ipe01yKFNyKX19LHZzPUNuPT5Dbi5kb25lP3NuKENuLnZhbHVlKTpQcm9taXNlLnJlc29sdmUoQ24udmFsdWUpLnRoZW4oVWEsbGMpO3ZzKChTdD1TdC5hcHBseShmdCxSdCkpLm5leHQoKSl9KTsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7LyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCAyMDEwLTIwMjMgVGhyZWUuanMgQXV0aG9ycwogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAqL2NvbnN0IGZ0PSIxNTkiLFJ0PXtMRUZUOjAsTUlERExFOjEsUklHSFQ6MixST1RBVEU6MCxET0xMWToxLFBBTjoyfSxTdD17Uk9UQVRFOjAsUEFOOjEsRE9MTFlfUEFOOjIsRE9MTFlfUk9UQVRFOjN9LHNuPTAsTXI9MSxVYT0yLGxjPTMsdnM9MCxDbj0xLFNyPTIsa249MyxZbj0wLFl0PTEsR249MixsXz0yLFpuPTAsQmk9MSxjYz0yLGhjPTMsdWM9NCxFZj01LHhpPTEwMCxBZj0xMDEsVGY9MTAyLGZjPTEwMyxkYz0xMDQsQ2Y9MjAwLFJmPTIwMSxQZj0yMDIsTGY9MjAzLERhPTIwNCxOYT0yMDUsSWY9MjA2LFVmPTIwNyxEZj0yMDgsTmY9MjA5LEZmPTIxMCxPZj0yMTEsQmY9MjEyLHpmPTIxMyxrZj0yMTQsR2Y9MCxWZj0xLEhmPTIsTXM9MyxXZj00LFhmPTUscWY9NiwkZj03LFNzPTAsWWY9MSxaZj0yLEpuPTAsSmY9MSxLZj0yLFFmPTMsamY9NCxlZD01LHBjPSJhdHRhY2hlZCIsdGQ9ImRldGFjaGVkIixGYT0zMDAsS249MzAxLHlpPTMwMixicz0zMDMsd3M9MzA0LGJyPTMwNixFcz0xZTMsenQ9MTAwMSxBcz0xMDAyLGJ0PTEwMDMsT2E9MTAwNCxjXz0xMDA0LFRzPTEwMDUsaF89MTAwNSx3dD0xMDA2LG1jPTEwMDcsdV89MTAwNyx2aT0xMDA4LGZfPTEwMDgsUW49MTAwOSxuZD0xMDEwLGlkPTEwMTEsQmE9MTAxMixnYz0xMDEzLGpuPTEwMTQsUm49MTAxNSx3cj0xMDE2LF9jPTEwMTcseGM9MTAxOCxNaT0xMDIwLHJkPTEwMjEsYW49MTAyMyxzZD0xMDI0LGFkPTEwMjUsU2k9MTAyNix6aT0xMDI3LG9kPTEwMjgseWM9MTAyOSxsZD0xMDMwLHZjPTEwMzEsTWM9MTAzMyx6YT0zMzc3NixrYT0zMzc3NyxHYT0zMzc3OCxWYT0zMzc3OSxTYz0zNTg0MCxiYz0zNTg0MSx3Yz0zNTg0MixFYz0zNTg0MyxBYz0zNjE5NixUYz0zNzQ5MixDYz0zNzQ5NixSYz0zNzgwOCxQYz0zNzgwOSxMYz0zNzgxMCxJYz0zNzgxMSxVYz0zNzgxMixEYz0zNzgxMyxOYz0zNzgxNCxGYz0zNzgxNSxPYz0zNzgxNixCYz0zNzgxNyx6Yz0zNzgxOCxrYz0zNzgxOSxHYz0zNzgyMCxWYz0zNzgyMSxIYT0zNjQ5MixIYz0zNjQ5NCxXYz0zNjQ5NSxjZD0zNjI4MyxYYz0zNjI4NCxxYz0zNjI4NSwkYz0zNjI4NixoZD0yMjAwLHVkPTIyMDEsZmQ9MjIwMixDcz0yMzAwLFJzPTIzMDEsV2E9MjMwMixraT0yNDAwLEdpPTI0MDEsUHM9MjQwMixYYT0yNTAwLFljPTI1MDEsZF89MCxwXz0xLG1fPTIsWmM9M2UzLGJpPTMwMDEsZGQ9MzIwMCxwZD0zMjAxLHdpPTAsbWQ9MSxnbj0iIixQdD0ic3JnYiIsVm49InNyZ2ItbGluZWFyIixxYT0iZGlzcGxheS1wMyIsTHM9ImRpc3BsYXktcDMtbGluZWFyIixJcz0ibGluZWFyIixjdD0ic3JnYiIsVXM9InJlYzcwOSIsRHM9InAzIixnXz0wLFZpPTc2ODAsX189NzY4MSx4Xz03NjgyLHlfPTc2ODMsdl89MzQwNTUsTV89MzQwNTYsU189NTM4NixiXz01MTIsd189NTEzLEVfPTUxNCxBXz01MTUsVF89NTE2LENfPTUxNyxSXz01MTgsSmM9NTE5LGdkPTUxMixfZD01MTMseGQ9NTE0LEtjPTUxNSx5ZD01MTYsdmQ9NTE3LE1kPTUxOCxTZD01MTksTnM9MzUwNDQsUF89MzUwNDgsTF89MzUwNDAsSV89MzUwNDUsVV89MzUwNDksRF89MzUwNDEsTl89MzUwNDYsRl89MzUwNTAsT189MzUwNDIsQl89IjEwMCIsUWM9IjMwMCBlcyIsJGE9MTAzNSxQbj0yZTMsRXI9MjAwMTtjbGFzcyBlaXthZGRFdmVudExpc3RlbmVyKGUsdCl7dGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztuW2VdPT09dm9pZCAwJiYobltlXT1bXSksbltlXS5pbmRleE9mKHQpPT09LTEmJm5bZV0ucHVzaCh0KX1oYXNFdmVudExpc3RlbmVyKGUsdCl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybiExO2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiBuW2VdIT09dm9pZCAwJiZuW2VdLmluZGV4T2YodCkhPT0tMX1yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybjtjb25zdCBpPXRoaXMuX2xpc3RlbmVyc1tlXTtpZihpIT09dm9pZCAwKXtjb25zdCBzPWkuaW5kZXhPZih0KTtzIT09LTEmJmkuc3BsaWNlKHMsMSl9fWRpc3BhdGNoRXZlbnQoZSl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybjtjb25zdCBuPXRoaXMuX2xpc3RlbmVyc1tlLnR5cGVdO2lmKG4hPT12b2lkIDApe2UudGFyZ2V0PXRoaXM7Y29uc3QgaT1uLnNsaWNlKDApO2ZvcihsZXQgcz0wLGE9aS5sZW5ndGg7czxhO3MrKylpW3NdLmNhbGwodGhpcyxlKTtlLnRhcmdldD1udWxsfX19Y29uc3Qga3Q9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2xldCBiZD0xMjM0NTY3O2NvbnN0IEhpPU1hdGguUEkvMTgwLEFyPTE4MC9NYXRoLlBJO2Z1bmN0aW9uIF9uKCl7Y29uc3Qgcj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCxlPU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLHQ9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsbj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MDtyZXR1cm4oa3RbciYyNTVdK2t0W3I+PjgmMjU1XStrdFtyPj4xNiYyNTVdK2t0W3I+PjI0JjI1NV0rIi0iK2t0W2UmMjU1XStrdFtlPj44JjI1NV0rIi0iK2t0W2U+PjE2JjE1fDY0XStrdFtlPj4yNCYyNTVdKyItIitrdFt0JjYzfDEyOF0ra3RbdD4+OCYyNTVdKyItIitrdFt0Pj4xNiYyNTVdK2t0W3Q+PjI0JjI1NV0ra3RbbiYyNTVdK2t0W24+PjgmMjU1XStrdFtuPj4xNiYyNTVdK2t0W24+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gX3QocixlLHQpe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKHQscikpfWZ1bmN0aW9uIGpjKHIsZSl7cmV0dXJuKHIlZStlKSVlfWZ1bmN0aW9uIHpfKHIsZSx0LG4saSl7cmV0dXJuIG4rKHItZSkqKGktbikvKHQtZSl9ZnVuY3Rpb24ga18ocixlLHQpe3JldHVybiByIT09ZT8odC1yKS8oZS1yKTowfWZ1bmN0aW9uIEZzKHIsZSx0KXtyZXR1cm4oMS10KSpyK3QqZX1mdW5jdGlvbiBHXyhyLGUsdCxuKXtyZXR1cm4gRnMocixlLDEtTWF0aC5leHAoLXQqbikpfWZ1bmN0aW9uIFZfKHIsZT0xKXtyZXR1cm4gZS1NYXRoLmFicyhqYyhyLGUqMiktZSl9ZnVuY3Rpb24gSF8ocixlLHQpe3JldHVybiByPD1lPzA6cj49dD8xOihyPShyLWUpLyh0LWUpLHIqciooMy0yKnIpKX1mdW5jdGlvbiBXXyhyLGUsdCl7cmV0dXJuIHI8PWU/MDpyPj10PzE6KHI9KHItZSkvKHQtZSkscipyKnIqKHIqKHIqNi0xNSkrMTApKX1mdW5jdGlvbiBYXyhyLGUpe3JldHVybiByK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSooZS1yKzEpKX1mdW5jdGlvbiBxXyhyLGUpe3JldHVybiByK01hdGgucmFuZG9tKCkqKGUtcil9ZnVuY3Rpb24gJF8ocil7cmV0dXJuIHIqKC41LU1hdGgucmFuZG9tKCkpfWZ1bmN0aW9uIFlfKHIpe3IhPT12b2lkIDAmJihiZD1yKTtsZXQgZT1iZCs9MTgzMTU2NTgxMztyZXR1cm4gZT1NYXRoLmltdWwoZV5lPj4+MTUsZXwxKSxlXj1lK01hdGguaW11bChlXmU+Pj43LGV8NjEpLCgoZV5lPj4+MTQpPj4+MCkvNDI5NDk2NzI5Nn1mdW5jdGlvbiBaXyhyKXtyZXR1cm4gcipIaX1mdW5jdGlvbiBKXyhyKXtyZXR1cm4gcipBcn1mdW5jdGlvbiBlaChyKXtyZXR1cm4ociZyLTEpPT09MCYmciE9PTB9ZnVuY3Rpb24gS18ocil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5jZWlsKE1hdGgubG9nKHIpL01hdGguTE4yKSl9ZnVuY3Rpb24gWWEocil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMikpfWZ1bmN0aW9uIFFfKHIsZSx0LG4saSl7Y29uc3Qgcz1NYXRoLmNvcyxhPU1hdGguc2luLG89cyh0LzIpLGw9YSh0LzIpLGM9cygoZStuKS8yKSxoPWEoKGUrbikvMiksdT1zKChlLW4pLzIpLGY9YSgoZS1uKS8yKSxkPXMoKG4tZSkvMikscD1hKChuLWUpLzIpO3N3aXRjaChpKXtjYXNlIlhZWCI6ci5zZXQobypoLGwqdSxsKmYsbypjKTticmVhaztjYXNlIllaWSI6ci5zZXQobCpmLG8qaCxsKnUsbypjKTticmVhaztjYXNlIlpYWiI6ci5zZXQobCp1LGwqZixvKmgsbypjKTticmVhaztjYXNlIlhaWCI6ci5zZXQobypoLGwqcCxsKmQsbypjKTticmVhaztjYXNlIllYWSI6ci5zZXQobCpkLG8qaCxsKnAsbypjKTticmVhaztjYXNlIlpZWiI6ci5zZXQobCpwLGwqZCxvKmgsbypjKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuTWF0aFV0aWxzOiAuc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIraSl9fWZ1bmN0aW9uIG9uKHIsZSl7c3dpdGNoKGUuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiByO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIHIvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiByLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gci8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChyLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoci8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KHIvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24gcWUocixlKXtzd2l0Y2goZS5jb25zdHJ1Y3Rvcil7Y2FzZSBGbG9hdDMyQXJyYXk6cmV0dXJuIHI7Y2FzZSBVaW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjQyOTQ5NjcyOTUpO2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQocio2NTUzNSk7Y2FzZSBVaW50OEFycmF5OnJldHVybiBNYXRoLnJvdW5kKHIqMjU1KTtjYXNlIEludDMyQXJyYXk6cmV0dXJuIE1hdGgucm91bmQocioyMTQ3NDgzNjQ3KTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQociozMjc2Nyk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQocioxMjcpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX1jb25zdCBqXz17REVHMlJBRDpIaSxSQUQyREVHOkFyLGdlbmVyYXRlVVVJRDpfbixjbGFtcDpfdCxldWNsaWRlYW5Nb2R1bG86amMsbWFwTGluZWFyOnpfLGludmVyc2VMZXJwOmtfLGxlcnA6RnMsZGFtcDpHXyxwaW5ncG9uZzpWXyxzbW9vdGhzdGVwOkhfLHNtb290aGVyc3RlcDpXXyxyYW5kSW50OlhfLHJhbmRGbG9hdDpxXyxyYW5kRmxvYXRTcHJlYWQ6JF8sc2VlZGVkUmFuZG9tOllfLGRlZ1RvUmFkOlpfLHJhZFRvRGVnOkpfLGlzUG93ZXJPZlR3bzplaCxjZWlsUG93ZXJPZlR3bzpLXyxmbG9vclBvd2VyT2ZUd286WWEsc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcjpRXyxub3JtYWxpemU6cWUsZGVub3JtYWxpemU6b259O2NsYXNzIHF7Y29uc3RydWN0b3IoZT0wLHQ9MCl7cS5wcm90b3R5cGUuaXNWZWN0b3IyPSEwLHRoaXMueD1lLHRoaXMueT10fWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnh9c2V0IHdpZHRoKGUpe3RoaXMueD1lfWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy55fXNldCBoZWlnaHQoZSl7dGhpcy55PWV9c2V0KGUsdCl7cmV0dXJuIHRoaXMueD1lLHRoaXMueT10LHRoaXN9c2V0U2NhbGFyKGUpe3JldHVybiB0aGlzLng9ZSx0aGlzLnk9ZSx0aGlzfXNldFgoZSl7cmV0dXJuIHRoaXMueD1lLHRoaXN9c2V0WShlKXtyZXR1cm4gdGhpcy55PWUsdGhpc31zZXRDb21wb25lbnQoZSx0KXtzd2l0Y2goZSl7Y2FzZSAwOnRoaXMueD10O2JyZWFrO2Nhc2UgMTp0aGlzLnk9dDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2UpfXJldHVybiB0aGlzfWdldENvbXBvbmVudChlKXtzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIitlKX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSl9Y29weShlKXtyZXR1cm4gdGhpcy54PWUueCx0aGlzLnk9ZS55LHRoaXN9YWRkKGUpe3JldHVybiB0aGlzLngrPWUueCx0aGlzLnkrPWUueSx0aGlzfWFkZFNjYWxhcihlKXtyZXR1cm4gdGhpcy54Kz1lLHRoaXMueSs9ZSx0aGlzfWFkZFZlY3RvcnMoZSx0KXtyZXR1cm4gdGhpcy54PWUueCt0LngsdGhpcy55PWUueSt0LnksdGhpc31hZGRTY2FsZWRWZWN0b3IoZSx0KXtyZXR1cm4gdGhpcy54Kz1lLngqdCx0aGlzLnkrPWUueSp0LHRoaXN9c3ViKGUpe3JldHVybiB0aGlzLngtPWUueCx0aGlzLnktPWUueSx0aGlzfXN1YlNjYWxhcihlKXtyZXR1cm4gdGhpcy54LT1lLHRoaXMueS09ZSx0aGlzfXN1YlZlY3RvcnMoZSx0KXtyZXR1cm4gdGhpcy54PWUueC10LngsdGhpcy55PWUueS10LnksdGhpc31tdWx0aXBseShlKXtyZXR1cm4gdGhpcy54Kj1lLngsdGhpcy55Kj1lLnksdGhpc31tdWx0aXBseVNjYWxhcihlKXtyZXR1cm4gdGhpcy54Kj1lLHRoaXMueSo9ZSx0aGlzfWRpdmlkZShlKXtyZXR1cm4gdGhpcy54Lz1lLngsdGhpcy55Lz1lLnksdGhpc31kaXZpZGVTY2FsYXIoZSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS9lKX1hcHBseU1hdHJpeDMoZSl7Y29uc3QgdD10aGlzLngsbj10aGlzLnksaT1lLmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSp0K2lbM10qbitpWzZdLHRoaXMueT1pWzFdKnQraVs0XSpuK2lbN10sdGhpc31taW4oZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsZS54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LGUueSksdGhpc31tYXgoZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsZS54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LGUueSksdGhpc31jbGFtcChlLHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgoZS54LE1hdGgubWluKHQueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgoZS55LE1hdGgubWluKHQueSx0aGlzLnkpKSx0aGlzfWNsYW1wU2NhbGFyKGUsdCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heChlLE1hdGgubWluKHQsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KGUsTWF0aC5taW4odCx0aGlzLnkpKSx0aGlzfWNsYW1wTGVuZ3RoKGUsdCl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heChlLE1hdGgubWluKHQsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QoZSl7cmV0dXJuIHRoaXMueCplLngrdGhpcy55KmUueX1jcm9zcyhlKXtyZXR1cm4gdGhpcy54KmUueS10aGlzLnkqZS54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9YW5nbGVUbyhlKXtjb25zdCB0PU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqZS5sZW5ndGhTcSgpKTtpZih0PT09MClyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QoZSkvdDtyZXR1cm4gTWF0aC5hY29zKF90KG4sLTEsMSkpfWRpc3RhbmNlVG8oZSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGUpKX1kaXN0YW5jZVRvU3F1YXJlZChlKXtjb25zdCB0PXRoaXMueC1lLngsbj10aGlzLnktZS55O3JldHVybiB0KnQrbipufW1hbmhhdHRhbkRpc3RhbmNlVG8oZSl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1lLngpK01hdGguYWJzKHRoaXMueS1lLnkpfXNldExlbmd0aChlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihlKX1sZXJwKGUsdCl7cmV0dXJuIHRoaXMueCs9KGUueC10aGlzLngpKnQsdGhpcy55Kz0oZS55LXRoaXMueSkqdCx0aGlzfWxlcnBWZWN0b3JzKGUsdCxuKXtyZXR1cm4gdGhpcy54PWUueCsodC54LWUueCkqbix0aGlzLnk9ZS55Kyh0LnktZS55KSpuLHRoaXN9ZXF1YWxzKGUpe3JldHVybiBlLng9PT10aGlzLngmJmUueT09PXRoaXMueX1mcm9tQXJyYXkoZSx0PTApe3JldHVybiB0aGlzLng9ZVt0XSx0aGlzLnk9ZVt0KzFdLHRoaXN9dG9BcnJheShlPVtdLHQ9MCl7cmV0dXJuIGVbdF09dGhpcy54LGVbdCsxXT10aGlzLnksZX1mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCl7cmV0dXJuIHRoaXMueD1lLmdldFgodCksdGhpcy55PWUuZ2V0WSh0KSx0aGlzfXJvdGF0ZUFyb3VuZChlLHQpe2NvbnN0IG49TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KSxzPXRoaXMueC1lLngsYT10aGlzLnktZS55O3JldHVybiB0aGlzLng9cypuLWEqaStlLngsdGhpcy55PXMqaSthKm4rZS55LHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueX19Y2xhc3MgWmV7Y29uc3RydWN0b3IoZSx0LG4saSxzLGEsbyxsLGMpe1plLnByb3RvdHlwZS5pc01hdHJpeDM9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdLGUhPT12b2lkIDAmJnRoaXMuc2V0KGUsdCxuLGkscyxhLG8sbCxjKX1zZXQoZSx0LG4saSxzLGEsbyxsLGMpe2NvbnN0IGg9dGhpcy5lbGVtZW50cztyZXR1cm4gaFswXT1lLGhbMV09aSxoWzJdPW8saFszXT10LGhbNF09cyxoWzVdPWwsaFs2XT1uLGhbN109YSxoWzhdPWMsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSksdGhpc31jb3B5KGUpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxuPWUuZWxlbWVudHM7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHRbM109blszXSx0WzRdPW5bNF0sdFs1XT1uWzVdLHRbNl09bls2XSx0WzddPW5bN10sdFs4XT1uWzhdLHRoaXN9ZXh0cmFjdEJhc2lzKGUsdCxuKXtyZXR1cm4gZS5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDApLHQuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMiksdGhpc31zZXRGcm9tTWF0cml4NChlKXtjb25zdCB0PWUuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KHRbMF0sdFs0XSx0WzhdLHRbMV0sdFs1XSx0WzldLHRbMl0sdFs2XSx0WzEwXSksdGhpc31tdWx0aXBseShlKXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsZSl9cHJlbXVsdGlwbHkoZSl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyhlLHRoaXMpfW11bHRpcGx5TWF0cmljZXMoZSx0KXtjb25zdCBuPWUuZWxlbWVudHMsaT10LmVsZW1lbnRzLHM9dGhpcy5lbGVtZW50cyxhPW5bMF0sbz1uWzNdLGw9bls2XSxjPW5bMV0saD1uWzRdLHU9bls3XSxmPW5bMl0sZD1uWzVdLHA9bls4XSxfPWlbMF0sZz1pWzNdLG09aVs2XSx5PWlbMV0seD1pWzRdLHY9aVs3XSxTPWlbMl0sYj1pWzVdLEE9aVs4XTtyZXR1cm4gc1swXT1hKl8rbyp5K2wqUyxzWzNdPWEqZytvKngrbCpiLHNbNl09YSptK28qditsKkEsc1sxXT1jKl8raCp5K3UqUyxzWzRdPWMqZytoKngrdSpiLHNbN109YyptK2gqdit1KkEsc1syXT1mKl8rZCp5K3AqUyxzWzVdPWYqZytkKngrcCpiLHNbOF09ZiptK2QqditwKkEsdGhpc31tdWx0aXBseVNjYWxhcihlKXtjb25zdCB0PXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbMF0qPWUsdFszXSo9ZSx0WzZdKj1lLHRbMV0qPWUsdFs0XSo9ZSx0WzddKj1lLHRbMl0qPWUsdFs1XSo9ZSx0WzhdKj1lLHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCBlPXRoaXMuZWxlbWVudHMsdD1lWzBdLG49ZVsxXSxpPWVbMl0scz1lWzNdLGE9ZVs0XSxvPWVbNV0sbD1lWzZdLGM9ZVs3XSxoPWVbOF07cmV0dXJuIHQqYSpoLXQqbypjLW4qcypoK24qbypsK2kqcypjLWkqYSpsfWludmVydCgpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyx0PWVbMF0sbj1lWzFdLGk9ZVsyXSxzPWVbM10sYT1lWzRdLG89ZVs1XSxsPWVbNl0sYz1lWzddLGg9ZVs4XSx1PWgqYS1vKmMsZj1vKmwtaCpzLGQ9YypzLWEqbCxwPXQqdStuKmYraSpkO2lmKHA9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgXz0xL3A7cmV0dXJuIGVbMF09dSpfLGVbMV09KGkqYy1oKm4pKl8sZVsyXT0obypuLWkqYSkqXyxlWzNdPWYqXyxlWzRdPShoKnQtaSpsKSpfLGVbNV09KGkqcy1vKnQpKl8sZVs2XT1kKl8sZVs3XT0obipsLWMqdCkqXyxlWzhdPShhKnQtbipzKSpfLHRoaXN9dHJhbnNwb3NlKCl7bGV0IGU7Y29uc3QgdD10aGlzLmVsZW1lbnRzO3JldHVybiBlPXRbMV0sdFsxXT10WzNdLHRbM109ZSxlPXRbMl0sdFsyXT10WzZdLHRbNl09ZSxlPXRbNV0sdFs1XT10WzddLHRbN109ZSx0aGlzfWdldE5vcm1hbE1hdHJpeChlKXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NChlKS5pbnZlcnQoKS50cmFuc3Bvc2UoKX10cmFuc3Bvc2VJbnRvQXJyYXkoZSl7Y29uc3QgdD10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdPXRbMF0sZVsxXT10WzNdLGVbMl09dFs2XSxlWzNdPXRbMV0sZVs0XT10WzRdLGVbNV09dFs3XSxlWzZdPXRbMl0sZVs3XT10WzVdLGVbOF09dFs4XSx0aGlzfXNldFV2VHJhbnNmb3JtKGUsdCxuLGkscyxhLG8pe2NvbnN0IGw9TWF0aC5jb3MocyksYz1NYXRoLnNpbihzKTtyZXR1cm4gdGhpcy5zZXQobipsLG4qYywtbioobCphK2MqbykrYStlLC1pKmMsaSpsLC1pKigtYyphK2wqbykrbyt0LDAsMCwxKSx0aGlzfXNjYWxlKGUsdCl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkodGgubWFrZVNjYWxlKGUsdCkpLHRoaXN9cm90YXRlKGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KHRoLm1ha2VSb3RhdGlvbigtZSkpLHRoaXN9dHJhbnNsYXRlKGUsdCl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkodGgubWFrZVRyYW5zbGF0aW9uKGUsdCkpLHRoaXN9bWFrZVRyYW5zbGF0aW9uKGUsdCl7cmV0dXJuIGUuaXNWZWN0b3IyP3RoaXMuc2V0KDEsMCxlLngsMCwxLGUueSwwLDAsMSk6dGhpcy5zZXQoMSwwLGUsMCwxLHQsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uKGUpe2NvbnN0IHQ9TWF0aC5jb3MoZSksbj1NYXRoLnNpbihlKTtyZXR1cm4gdGhpcy5zZXQodCwtbiwwLG4sdCwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZShlLHQpe3JldHVybiB0aGlzLnNldChlLDAsMCwwLHQsMCwwLDAsMSksdGhpc31lcXVhbHMoZSl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLG49ZS5lbGVtZW50cztmb3IobGV0IGk9MDtpPDk7aSsrKWlmKHRbaV0hPT1uW2ldKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheShlLHQ9MCl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmVsZW1lbnRzW25dPWVbbit0XTtyZXR1cm4gdGhpc310b0FycmF5KGU9W10sdD0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbdF09blswXSxlW3QrMV09blsxXSxlW3QrMl09blsyXSxlW3QrM109blszXSxlW3QrNF09bls0XSxlW3QrNV09bls1XSxlW3QrNl09bls2XSxlW3QrN109bls3XSxlW3QrOF09bls4XSxlfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfX1jb25zdCB0aD1uZXcgWmU7ZnVuY3Rpb24gd2Qocil7Zm9yKGxldCBlPXIubGVuZ3RoLTE7ZT49MDstLWUpaWYocltlXT49NjU1MzUpcmV0dXJuITA7cmV0dXJuITF9Y29uc3QgZXg9e0ludDhBcnJheSxVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5fTtmdW5jdGlvbiBUcihyLGUpe3JldHVybiBuZXcgZXhbcl0oZSl9ZnVuY3Rpb24gT3Mocil7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIscil9ZnVuY3Rpb24gRWQoKXtjb25zdCByPU9zKCJjYW52YXMiKTtyZXR1cm4gci5zdHlsZS5kaXNwbGF5PSJibG9jayIscn1jb25zdCBBZD17fTtmdW5jdGlvbiBCcyhyKXtyIGluIEFkfHwoQWRbcl09ITAsY29uc29sZS53YXJuKHIpKX1jb25zdCBUZD1uZXcgWmUoKS5zZXQoLjgyMjQ2MjEsLjE3NzUzOCwwLC4wMzMxOTQxLC45NjY4MDU4LDAsLjAxNzA4MjcsLjA3MjM5NzQsLjkxMDUxOTkpLENkPW5ldyBaZSgpLnNldCgxLjIyNDk0MDEsLS4yMjQ5NDA0LDAsLS4wNDIwNTY5LDEuMDQyMDU3MSwwLC0uMDE5NjM3NiwtLjA3ODYzNjEsMS4wOTgyNzM1KSxaYT17W1ZuXTp7dHJhbnNmZXI6SXMscHJpbWFyaWVzOlVzLHRvUmVmZXJlbmNlOnI9PnIsZnJvbVJlZmVyZW5jZTpyPT5yfSxbUHRdOnt0cmFuc2ZlcjpjdCxwcmltYXJpZXM6VXMsdG9SZWZlcmVuY2U6cj0+ci5jb252ZXJ0U1JHQlRvTGluZWFyKCksZnJvbVJlZmVyZW5jZTpyPT5yLmNvbnZlcnRMaW5lYXJUb1NSR0IoKX0sW0xzXTp7dHJhbnNmZXI6SXMscHJpbWFyaWVzOkRzLHRvUmVmZXJlbmNlOnI9PnIuYXBwbHlNYXRyaXgzKENkKSxmcm9tUmVmZXJlbmNlOnI9PnIuYXBwbHlNYXRyaXgzKFRkKX0sW3FhXTp7dHJhbnNmZXI6Y3QscHJpbWFyaWVzOkRzLHRvUmVmZXJlbmNlOnI9PnIuY29udmVydFNSR0JUb0xpbmVhcigpLmFwcGx5TWF0cml4MyhDZCksZnJvbVJlZmVyZW5jZTpyPT5yLmFwcGx5TWF0cml4MyhUZCkuY29udmVydExpbmVhclRvU1JHQigpfX0sdHg9bmV3IFNldChbVm4sTHNdKSxvdD17ZW5hYmxlZDohMCxfd29ya2luZ0NvbG9yU3BhY2U6Vm4sZ2V0IGxlZ2FjeU1vZGUoKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Db2xvck1hbmFnZW1lbnQ6IC5sZWdhY3lNb2RlPWZhbHNlIHJlbmFtZWQgdG8gLmVuYWJsZWQ9dHJ1ZSBpbiByMTUwLiIpLCF0aGlzLmVuYWJsZWR9LHNldCBsZWdhY3lNb2RlKHIpe2NvbnNvbGUud2FybigiVEhSRUUuQ29sb3JNYW5hZ2VtZW50OiAubGVnYWN5TW9kZT1mYWxzZSByZW5hbWVkIHRvIC5lbmFibGVkPXRydWUgaW4gcjE1MC4iKSx0aGlzLmVuYWJsZWQ9IXJ9LGdldCB3b3JraW5nQ29sb3JTcGFjZSgpe3JldHVybiB0aGlzLl93b3JraW5nQ29sb3JTcGFjZX0sc2V0IHdvcmtpbmdDb2xvclNwYWNlKHIpe2lmKCF0eC5oYXMocikpdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB3b3JraW5nIGNvbG9yIHNwYWNlLCAiJHtyfSIuYCk7dGhpcy5fd29ya2luZ0NvbG9yU3BhY2U9cn0sY29udmVydDpmdW5jdGlvbihyLGUsdCl7aWYodGhpcy5lbmFibGVkPT09ITF8fGU9PT10fHwhZXx8IXQpcmV0dXJuIHI7Y29uc3Qgbj1aYVtlXS50b1JlZmVyZW5jZSxpPVphW3RdLmZyb21SZWZlcmVuY2U7cmV0dXJuIGkobihyKSl9LGZyb21Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbihyLGUpe3JldHVybiB0aGlzLmNvbnZlcnQocix0aGlzLl93b3JraW5nQ29sb3JTcGFjZSxlKX0sdG9Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbihyLGUpe3JldHVybiB0aGlzLmNvbnZlcnQocixlLHRoaXMuX3dvcmtpbmdDb2xvclNwYWNlKX0sZ2V0UHJpbWFyaWVzOmZ1bmN0aW9uKHIpe3JldHVybiBaYVtyXS5wcmltYXJpZXN9LGdldFRyYW5zZmVyOmZ1bmN0aW9uKHIpe3JldHVybiByPT09Z24/SXM6WmFbcl0udHJhbnNmZXJ9fTtmdW5jdGlvbiBDcihyKXtyZXR1cm4gcjwuMDQwNDU/ciouMDc3Mzk5MzgwODpNYXRoLnBvdyhyKi45NDc4NjcyOTg2Ky4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gbmgocil7cmV0dXJuIHI8LjAwMzEzMDg/cioxMi45MjoxLjA1NSpNYXRoLnBvdyhyLC40MTY2NiktLjA1NX1sZXQgUnI7Y2xhc3MgaWh7c3RhdGljIGdldERhdGFVUkwoZSl7aWYoL15kYXRhOi9pLnRlc3QoZS5zcmMpfHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQ9PSJ1bmRlZmluZWQiKXJldHVybiBlLnNyYztsZXQgdDtpZihlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpdD1lO2Vsc2V7UnI9PT12b2lkIDAmJihScj1PcygiY2FudmFzIikpLFJyLndpZHRoPWUud2lkdGgsUnIuaGVpZ2h0PWUuaGVpZ2h0O2NvbnN0IG49UnIuZ2V0Q29udGV4dCgiMmQiKTtlIGluc3RhbmNlb2YgSW1hZ2VEYXRhP24ucHV0SW1hZ2VEYXRhKGUsMCwwKTpuLmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0PVJyfXJldHVybiB0LndpZHRoPjIwNDh8fHQuaGVpZ2h0PjIwNDg/KGNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5nZXREYXRhVVJMOiBJbWFnZSBjb252ZXJ0ZWQgdG8ganBnIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIixlKSx0LnRvRGF0YVVSTCgiaW1hZ2UvanBlZyIsLjYpKTp0LnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9c3RhdGljIHNSR0JUb0xpbmVhcihlKXtpZih0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJmUgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHR5cGVvZiBJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJmUgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgdD1PcygiY2FudmFzIik7dC53aWR0aD1lLndpZHRoLHQuaGVpZ2h0PWUuaGVpZ2h0O2NvbnN0IG49dC5nZXRDb250ZXh0KCIyZCIpO24uZHJhd0ltYWdlKGUsMCwwLGUud2lkdGgsZS5oZWlnaHQpO2NvbnN0IGk9bi5nZXRJbWFnZURhdGEoMCwwLGUud2lkdGgsZS5oZWlnaHQpLHM9aS5kYXRhO2ZvcihsZXQgYT0wO2E8cy5sZW5ndGg7YSsrKXNbYV09Q3Ioc1thXS8yNTUpKjI1NTtyZXR1cm4gbi5wdXRJbWFnZURhdGEoaSwwLDApLHR9ZWxzZSBpZihlLmRhdGEpe2NvbnN0IHQ9ZS5kYXRhLnNsaWNlKDApO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXQgaW5zdGFuY2VvZiBVaW50OEFycmF5fHx0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/dFtuXT1NYXRoLmZsb29yKENyKHRbbl0vMjU1KSoyNTUpOnRbbl09Q3IodFtuXSk7cmV0dXJue2RhdGE6dCx3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodH19ZWxzZSByZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuIiksZX19bGV0IG54PTA7Y2xhc3MgV2l7Y29uc3RydWN0b3IoZT1udWxsKXt0aGlzLmlzU291cmNlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOm54Kyt9KSx0aGlzLnV1aWQ9X24oKSx0aGlzLmRhdGE9ZSx0aGlzLnZlcnNpb249MH1zZXQgbmVlZHNVcGRhdGUoZSl7ZT09PSEwJiZ0aGlzLnZlcnNpb24rK310b0pTT04oZSl7Y29uc3QgdD1lPT09dm9pZCAwfHx0eXBlb2YgZT09InN0cmluZyI7aWYoIXQmJmUuaW1hZ2VzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIGUuaW1hZ2VzW3RoaXMudXVpZF07Y29uc3Qgbj17dXVpZDp0aGlzLnV1aWQsdXJsOiIifSxpPXRoaXMuZGF0YTtpZihpIT09bnVsbCl7bGV0IHM7aWYoQXJyYXkuaXNBcnJheShpKSl7cz1bXTtmb3IobGV0IGE9MCxvPWkubGVuZ3RoO2E8bzthKyspaVthXS5pc0RhdGFUZXh0dXJlP3MucHVzaChyaChpW2FdLmltYWdlKSk6cy5wdXNoKHJoKGlbYV0pKX1lbHNlIHM9cmgoaSk7bi51cmw9c31yZXR1cm4gdHx8KGUuaW1hZ2VzW3RoaXMudXVpZF09biksbn19ZnVuY3Rpb24gcmgocil7cmV0dXJuIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IT0idW5kZWZpbmVkIiYmciBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCE9InVuZGVmaW5lZCImJnIgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmciBpbnN0YW5jZW9mIEltYWdlQml0bWFwP2loLmdldERhdGFVUkwocik6ci5kYXRhP3tkYXRhOkFycmF5LmZyb20oci5kYXRhKSx3aWR0aDpyLndpZHRoLGhlaWdodDpyLmhlaWdodCx0eXBlOnIuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTooY29uc29sZS53YXJuKCJUSFJFRS5UZXh0dXJlOiBVbmFibGUgdG8gc2VyaWFsaXplIFRleHR1cmUuIikse30pfWxldCBpeD0wO2NsYXNzIEV0IGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoZT1FdC5ERUZBVUxUX0lNQUdFLHQ9RXQuREVGQVVMVF9NQVBQSU5HLG49enQsaT16dCxzPXd0LGE9dmksbz1hbixsPVFuLGM9RXQuREVGQVVMVF9BTklTT1RST1BZLGg9Z24pe3N1cGVyKCksdGhpcy5pc1RleHR1cmU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6aXgrK30pLHRoaXMudXVpZD1fbigpLHRoaXMubmFtZT0iIix0aGlzLnNvdXJjZT1uZXcgV2koZSksdGhpcy5taXBtYXBzPVtdLHRoaXMubWFwcGluZz10LHRoaXMuY2hhbm5lbD0wLHRoaXMud3JhcFM9bix0aGlzLndyYXBUPWksdGhpcy5tYWdGaWx0ZXI9cyx0aGlzLm1pbkZpbHRlcj1hLHRoaXMuYW5pc290cm9weT1jLHRoaXMuZm9ybWF0PW8sdGhpcy5pbnRlcm5hbEZvcm1hdD1udWxsLHRoaXMudHlwZT1sLHRoaXMub2Zmc2V0PW5ldyBxKDAsMCksdGhpcy5yZXBlYXQ9bmV3IHEoMSwxKSx0aGlzLmNlbnRlcj1uZXcgcSgwLDApLHRoaXMucm90YXRpb249MCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITAsdGhpcy5tYXRyaXg9bmV3IFplLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdHlwZW9mIGg9PSJzdHJpbmciP3RoaXMuY29sb3JTcGFjZT1oOihCcygiVEhSRUUuVGV4dHVyZTogUHJvcGVydHkgLmVuY29kaW5nIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IC5jb2xvclNwYWNlLiIpLHRoaXMuY29sb3JTcGFjZT1oPT09Ymk/UHQ6Z24pLHRoaXMudXNlckRhdGE9e30sdGhpcy52ZXJzaW9uPTAsdGhpcy5vblVwZGF0ZT1udWxsLHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSExLHRoaXMubmVlZHNQTVJFTVVwZGF0ZT0hMX1nZXQgaW1hZ2UoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZGF0YX1zZXQgaW1hZ2UoZT1udWxsKXt0aGlzLnNvdXJjZS5kYXRhPWV9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0odGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkoZSl7cmV0dXJuIHRoaXMubmFtZT1lLm5hbWUsdGhpcy5zb3VyY2U9ZS5zb3VyY2UsdGhpcy5taXBtYXBzPWUubWlwbWFwcy5zbGljZSgwKSx0aGlzLm1hcHBpbmc9ZS5tYXBwaW5nLHRoaXMuY2hhbm5lbD1lLmNoYW5uZWwsdGhpcy53cmFwUz1lLndyYXBTLHRoaXMud3JhcFQ9ZS53cmFwVCx0aGlzLm1hZ0ZpbHRlcj1lLm1hZ0ZpbHRlcix0aGlzLm1pbkZpbHRlcj1lLm1pbkZpbHRlcix0aGlzLmFuaXNvdHJvcHk9ZS5hbmlzb3Ryb3B5LHRoaXMuZm9ybWF0PWUuZm9ybWF0LHRoaXMuaW50ZXJuYWxGb3JtYXQ9ZS5pbnRlcm5hbEZvcm1hdCx0aGlzLnR5cGU9ZS50eXBlLHRoaXMub2Zmc2V0LmNvcHkoZS5vZmZzZXQpLHRoaXMucmVwZWF0LmNvcHkoZS5yZXBlYXQpLHRoaXMuY2VudGVyLmNvcHkoZS5jZW50ZXIpLHRoaXMucm90YXRpb249ZS5yb3RhdGlvbix0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ZS5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4LmNvcHkoZS5tYXRyaXgpLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPWUuZ2VuZXJhdGVNaXBtYXBzLHRoaXMucHJlbXVsdGlwbHlBbHBoYT1lLnByZW11bHRpcGx5QWxwaGEsdGhpcy5mbGlwWT1lLmZsaXBZLHRoaXMudW5wYWNrQWxpZ25tZW50PWUudW5wYWNrQWxpZ25tZW50LHRoaXMuY29sb3JTcGFjZT1lLmNvbG9yU3BhY2UsdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUudXNlckRhdGEpKSx0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXN9dG9KU09OKGUpe2NvbnN0IHQ9ZT09PXZvaWQgMHx8dHlwZW9mIGU9PSJzdHJpbmciO2lmKCF0JiZlLnRleHR1cmVzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIGUudGV4dHVyZXNbdGhpcy51dWlkXTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiVGV4dHVyZSIsZ2VuZXJhdG9yOiJUZXh0dXJlLnRvSlNPTiJ9LHV1aWQ6dGhpcy51dWlkLG5hbWU6dGhpcy5uYW1lLGltYWdlOnRoaXMuc291cmNlLnRvSlNPTihlKS51dWlkLG1hcHBpbmc6dGhpcy5tYXBwaW5nLGNoYW5uZWw6dGhpcy5jaGFubmVsLHJlcGVhdDpbdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55XSxvZmZzZXQ6W3RoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueV0sY2VudGVyOlt0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnldLHJvdGF0aW9uOnRoaXMucm90YXRpb24sd3JhcDpbdGhpcy53cmFwUyx0aGlzLndyYXBUXSxmb3JtYXQ6dGhpcy5mb3JtYXQsaW50ZXJuYWxGb3JtYXQ6dGhpcy5pbnRlcm5hbEZvcm1hdCx0eXBlOnRoaXMudHlwZSxjb2xvclNwYWNlOnRoaXMuY29sb3JTcGFjZSxtaW5GaWx0ZXI6dGhpcy5taW5GaWx0ZXIsbWFnRmlsdGVyOnRoaXMubWFnRmlsdGVyLGFuaXNvdHJvcHk6dGhpcy5hbmlzb3Ryb3B5LGZsaXBZOnRoaXMuZmxpcFksZ2VuZXJhdGVNaXBtYXBzOnRoaXMuZ2VuZXJhdGVNaXBtYXBzLHByZW11bHRpcGx5QWxwaGE6dGhpcy5wcmVtdWx0aXBseUFscGhhLHVucGFja0FsaWdubWVudDp0aGlzLnVucGFja0FsaWdubWVudH07cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYobi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSx0fHwoZS50ZXh0dXJlc1t0aGlzLnV1aWRdPW4pLG59ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX10cmFuc2Zvcm1VdihlKXtpZih0aGlzLm1hcHBpbmchPT1GYSlyZXR1cm4gZTtpZihlLmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksZS54PDB8fGUueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIEVzOmUueD1lLngtTWF0aC5mbG9vcihlLngpO2JyZWFrO2Nhc2UgenQ6ZS54PWUueDwwPzA6MTticmVhaztjYXNlIEFzOk1hdGguYWJzKE1hdGguZmxvb3IoZS54KSUyKT09PTE/ZS54PU1hdGguY2VpbChlLngpLWUueDplLng9ZS54LU1hdGguZmxvb3IoZS54KTticmVha31pZihlLnk8MHx8ZS55PjEpc3dpdGNoKHRoaXMud3JhcFQpe2Nhc2UgRXM6ZS55PWUueS1NYXRoLmZsb29yKGUueSk7YnJlYWs7Y2FzZSB6dDplLnk9ZS55PDA/MDoxO2JyZWFrO2Nhc2UgQXM6TWF0aC5hYnMoTWF0aC5mbG9vcihlLnkpJTIpPT09MT9lLnk9TWF0aC5jZWlsKGUueSktZS55OmUueT1lLnktTWF0aC5mbG9vcihlLnkpO2JyZWFrfXJldHVybiB0aGlzLmZsaXBZJiYoZS55PTEtZS55KSxlfXNldCBuZWVkc1VwZGF0ZShlKXtlPT09ITAmJih0aGlzLnZlcnNpb24rKyx0aGlzLnNvdXJjZS5uZWVkc1VwZGF0ZT0hMCl9Z2V0IGVuY29kaW5nKCl7cmV0dXJuIEJzKCJUSFJFRS5UZXh0dXJlOiBQcm9wZXJ0eSAuZW5jb2RpbmcgaGFzIGJlZW4gcmVwbGFjZWQgYnkgLmNvbG9yU3BhY2UuIiksdGhpcy5jb2xvclNwYWNlPT09UHQ/Ymk6WmN9c2V0IGVuY29kaW5nKGUpe0JzKCJUSFJFRS5UZXh0dXJlOiBQcm9wZXJ0eSAuZW5jb2RpbmcgaGFzIGJlZW4gcmVwbGFjZWQgYnkgLmNvbG9yU3BhY2UuIiksdGhpcy5jb2xvclNwYWNlPWU9PT1iaT9QdDpnbn19RXQuREVGQVVMVF9JTUFHRT1udWxsLEV0LkRFRkFVTFRfTUFQUElORz1GYSxFdC5ERUZBVUxUX0FOSVNPVFJPUFk9MTtjbGFzcyBsdHtjb25zdHJ1Y3RvcihlPTAsdD0wLG49MCxpPTEpe2x0LnByb3RvdHlwZS5pc1ZlY3RvcjQ9ITAsdGhpcy54PWUsdGhpcy55PXQsdGhpcy56PW4sdGhpcy53PWl9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMuen1zZXQgd2lkdGgoZSl7dGhpcy56PWV9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnd9c2V0IGhlaWdodChlKXt0aGlzLnc9ZX1zZXQoZSx0LG4saSl7cmV0dXJuIHRoaXMueD1lLHRoaXMueT10LHRoaXMuej1uLHRoaXMudz1pLHRoaXN9c2V0U2NhbGFyKGUpe3JldHVybiB0aGlzLng9ZSx0aGlzLnk9ZSx0aGlzLno9ZSx0aGlzLnc9ZSx0aGlzfXNldFgoZSl7cmV0dXJuIHRoaXMueD1lLHRoaXN9c2V0WShlKXtyZXR1cm4gdGhpcy55PWUsdGhpc31zZXRaKGUpe3JldHVybiB0aGlzLno9ZSx0aGlzfXNldFcoZSl7cmV0dXJuIHRoaXMudz1lLHRoaXN9c2V0Q29tcG9uZW50KGUsdCl7c3dpdGNoKGUpe2Nhc2UgMDp0aGlzLng9dDticmVhaztjYXNlIDE6dGhpcy55PXQ7YnJlYWs7Y2FzZSAyOnRoaXMuej10O2JyZWFrO2Nhc2UgMzp0aGlzLnc9dDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2UpfXJldHVybiB0aGlzfWdldENvbXBvbmVudChlKXtzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7Y2FzZSAzOnJldHVybiB0aGlzLnc7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIitlKX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnosdGhpcy53KX1jb3B5KGUpe3JldHVybiB0aGlzLng9ZS54LHRoaXMueT1lLnksdGhpcy56PWUueix0aGlzLnc9ZS53IT09dm9pZCAwP2UudzoxLHRoaXN9YWRkKGUpe3JldHVybiB0aGlzLngrPWUueCx0aGlzLnkrPWUueSx0aGlzLnorPWUueix0aGlzLncrPWUudyx0aGlzfWFkZFNjYWxhcihlKXtyZXR1cm4gdGhpcy54Kz1lLHRoaXMueSs9ZSx0aGlzLnorPWUsdGhpcy53Kz1lLHRoaXN9YWRkVmVjdG9ycyhlLHQpe3JldHVybiB0aGlzLng9ZS54K3QueCx0aGlzLnk9ZS55K3QueSx0aGlzLno9ZS56K3Queix0aGlzLnc9ZS53K3Qudyx0aGlzfWFkZFNjYWxlZFZlY3RvcihlLHQpe3JldHVybiB0aGlzLngrPWUueCp0LHRoaXMueSs9ZS55KnQsdGhpcy56Kz1lLnoqdCx0aGlzLncrPWUudyp0LHRoaXN9c3ViKGUpe3JldHVybiB0aGlzLngtPWUueCx0aGlzLnktPWUueSx0aGlzLnotPWUueix0aGlzLnctPWUudyx0aGlzfXN1YlNjYWxhcihlKXtyZXR1cm4gdGhpcy54LT1lLHRoaXMueS09ZSx0aGlzLnotPWUsdGhpcy53LT1lLHRoaXN9c3ViVmVjdG9ycyhlLHQpe3JldHVybiB0aGlzLng9ZS54LXQueCx0aGlzLnk9ZS55LXQueSx0aGlzLno9ZS56LXQueix0aGlzLnc9ZS53LXQudyx0aGlzfW11bHRpcGx5KGUpe3JldHVybiB0aGlzLngqPWUueCx0aGlzLnkqPWUueSx0aGlzLnoqPWUueix0aGlzLncqPWUudyx0aGlzfW11bHRpcGx5U2NhbGFyKGUpe3JldHVybiB0aGlzLngqPWUsdGhpcy55Kj1lLHRoaXMueio9ZSx0aGlzLncqPWUsdGhpc31hcHBseU1hdHJpeDQoZSl7Y29uc3QgdD10aGlzLngsbj10aGlzLnksaT10aGlzLnoscz10aGlzLncsYT1lLmVsZW1lbnRzO3JldHVybiB0aGlzLng9YVswXSp0K2FbNF0qbithWzhdKmkrYVsxMl0qcyx0aGlzLnk9YVsxXSp0K2FbNV0qbithWzldKmkrYVsxM10qcyx0aGlzLno9YVsyXSp0K2FbNl0qbithWzEwXSppK2FbMTRdKnMsdGhpcy53PWFbM10qdCthWzddKm4rYVsxMV0qaSthWzE1XSpzLHRoaXN9ZGl2aWRlU2NhbGFyKGUpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvZSl9c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24oZSl7dGhpcy53PTIqTWF0aC5hY29zKGUudyk7Y29uc3QgdD1NYXRoLnNxcnQoMS1lLncqZS53KTtyZXR1cm4gdDwxZS00Pyh0aGlzLng9MSx0aGlzLnk9MCx0aGlzLno9MCk6KHRoaXMueD1lLngvdCx0aGlzLnk9ZS55L3QsdGhpcy56PWUuei90KSx0aGlzfXNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeChlKXtsZXQgdCxuLGkscztjb25zdCBsPWUuZWxlbWVudHMsYz1sWzBdLGg9bFs0XSx1PWxbOF0sZj1sWzFdLGQ9bFs1XSxwPWxbOV0sXz1sWzJdLGc9bFs2XSxtPWxbMTBdO2lmKE1hdGguYWJzKGgtZik8LjAxJiZNYXRoLmFicyh1LV8pPC4wMSYmTWF0aC5hYnMocC1nKTwuMDEpe2lmKE1hdGguYWJzKGgrZik8LjEmJk1hdGguYWJzKHUrXyk8LjEmJk1hdGguYWJzKHArZyk8LjEmJk1hdGguYWJzKGMrZCttLTMpPC4xKXJldHVybiB0aGlzLnNldCgxLDAsMCwwKSx0aGlzO3Q9TWF0aC5QSTtjb25zdCB4PShjKzEpLzIsdj0oZCsxKS8yLFM9KG0rMSkvMixiPShoK2YpLzQsQT0odStfKS80LEw9KHArZykvNDtyZXR1cm4geD52JiZ4PlM/eDwuMDE/KG49MCxpPS43MDcxMDY3ODEscz0uNzA3MTA2NzgxKToobj1NYXRoLnNxcnQoeCksaT1iL24scz1BL24pOnY+Uz92PC4wMT8obj0uNzA3MTA2NzgxLGk9MCxzPS43MDcxMDY3ODEpOihpPU1hdGguc3FydCh2KSxuPWIvaSxzPUwvaSk6UzwuMDE/KG49LjcwNzEwNjc4MSxpPS43MDcxMDY3ODEscz0wKToocz1NYXRoLnNxcnQoUyksbj1BL3MsaT1ML3MpLHRoaXMuc2V0KG4saSxzLHQpLHRoaXN9bGV0IHk9TWF0aC5zcXJ0KChnLXApKihnLXApKyh1LV8pKih1LV8pKyhmLWgpKihmLWgpKTtyZXR1cm4gTWF0aC5hYnMoeSk8LjAwMSYmKHk9MSksdGhpcy54PShnLXApL3ksdGhpcy55PSh1LV8pL3ksdGhpcy56PShmLWgpL3ksdGhpcy53PU1hdGguYWNvcygoYytkK20tMSkvMiksdGhpc31taW4oZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsZS54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LGUueSksdGhpcy56PU1hdGgubWluKHRoaXMueixlLnopLHRoaXMudz1NYXRoLm1pbih0aGlzLncsZS53KSx0aGlzfW1heChlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCxlLngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksZS55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LGUueiksdGhpcy53PU1hdGgubWF4KHRoaXMudyxlLncpLHRoaXN9Y2xhbXAoZSx0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KGUueCxNYXRoLm1pbih0LngsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KGUueSxNYXRoLm1pbih0LnksdGhpcy55KSksdGhpcy56PU1hdGgubWF4KGUueixNYXRoLm1pbih0LnosdGhpcy56KSksdGhpcy53PU1hdGgubWF4KGUudyxNYXRoLm1pbih0LncsdGhpcy53KSksdGhpc31jbGFtcFNjYWxhcihlLHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgoZSxNYXRoLm1pbih0LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heChlLE1hdGgubWluKHQsdGhpcy55KSksdGhpcy56PU1hdGgubWF4KGUsTWF0aC5taW4odCx0aGlzLnopKSx0aGlzLnc9TWF0aC5tYXgoZSxNYXRoLm1pbih0LHRoaXMudykpLHRoaXN9Y2xhbXBMZW5ndGgoZSx0KXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KGUsTWF0aC5taW4odCxuKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXMudz1NYXRoLmZsb29yKHRoaXMudyksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpcy56PU1hdGguY2VpbCh0aGlzLnopLHRoaXMudz1NYXRoLmNlaWwodGhpcy53KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXMudz1NYXRoLnJvdW5kKHRoaXMudyksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpcy56PU1hdGgudHJ1bmModGhpcy56KSx0aGlzLnc9TWF0aC50cnVuYyh0aGlzLncpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXMudz0tdGhpcy53LHRoaXN9ZG90KGUpe3JldHVybiB0aGlzLngqZS54K3RoaXMueSplLnkrdGhpcy56KmUueit0aGlzLncqZS53fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLnd9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueikrTWF0aC5hYnModGhpcy53KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGUpfWxlcnAoZSx0KXtyZXR1cm4gdGhpcy54Kz0oZS54LXRoaXMueCkqdCx0aGlzLnkrPShlLnktdGhpcy55KSp0LHRoaXMueis9KGUuei10aGlzLnopKnQsdGhpcy53Kz0oZS53LXRoaXMudykqdCx0aGlzfWxlcnBWZWN0b3JzKGUsdCxuKXtyZXR1cm4gdGhpcy54PWUueCsodC54LWUueCkqbix0aGlzLnk9ZS55Kyh0LnktZS55KSpuLHRoaXMuej1lLnorKHQuei1lLnopKm4sdGhpcy53PWUudysodC53LWUudykqbix0aGlzfWVxdWFscyhlKXtyZXR1cm4gZS54PT09dGhpcy54JiZlLnk9PT10aGlzLnkmJmUuej09PXRoaXMueiYmZS53PT09dGhpcy53fWZyb21BcnJheShlLHQ9MCl7cmV0dXJuIHRoaXMueD1lW3RdLHRoaXMueT1lW3QrMV0sdGhpcy56PWVbdCsyXSx0aGlzLnc9ZVt0KzNdLHRoaXN9dG9BcnJheShlPVtdLHQ9MCl7cmV0dXJuIGVbdF09dGhpcy54LGVbdCsxXT10aGlzLnksZVt0KzJdPXRoaXMueixlW3QrM109dGhpcy53LGV9ZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQpe3JldHVybiB0aGlzLng9ZS5nZXRYKHQpLHRoaXMueT1lLmdldFkodCksdGhpcy56PWUuZ2V0Wih0KSx0aGlzLnc9ZS5nZXRXKHQpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXMudz1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnoseWllbGQgdGhpcy53fX1jbGFzcyBSZCBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKGU9MSx0PTEsbj17fSl7c3VwZXIoKSx0aGlzLmlzUmVuZGVyVGFyZ2V0PSEwLHRoaXMud2lkdGg9ZSx0aGlzLmhlaWdodD10LHRoaXMuZGVwdGg9MSx0aGlzLnNjaXNzb3I9bmV3IGx0KDAsMCxlLHQpLHRoaXMuc2Npc3NvclRlc3Q9ITEsdGhpcy52aWV3cG9ydD1uZXcgbHQoMCwwLGUsdCk7Y29uc3QgaT17d2lkdGg6ZSxoZWlnaHQ6dCxkZXB0aDoxfTtuLmVuY29kaW5nIT09dm9pZCAwJiYoQnMoIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiBvcHRpb24uZW5jb2RpbmcgaGFzIGJlZW4gcmVwbGFjZWQgYnkgb3B0aW9uLmNvbG9yU3BhY2UuIiksbi5jb2xvclNwYWNlPW4uZW5jb2Rpbmc9PT1iaT9QdDpnbiksbj1PYmplY3QuYXNzaWduKHtnZW5lcmF0ZU1pcG1hcHM6ITEsaW50ZXJuYWxGb3JtYXQ6bnVsbCxtaW5GaWx0ZXI6d3QsZGVwdGhCdWZmZXI6ITAsc3RlbmNpbEJ1ZmZlcjohMSxkZXB0aFRleHR1cmU6bnVsbCxzYW1wbGVzOjB9LG4pLHRoaXMudGV4dHVyZT1uZXcgRXQoaSxuLm1hcHBpbmcsbi53cmFwUyxuLndyYXBULG4ubWFnRmlsdGVyLG4ubWluRmlsdGVyLG4uZm9ybWF0LG4udHlwZSxuLmFuaXNvdHJvcHksbi5jb2xvclNwYWNlKSx0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwLHRoaXMudGV4dHVyZS5mbGlwWT0hMSx0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPW4uZ2VuZXJhdGVNaXBtYXBzLHRoaXMudGV4dHVyZS5pbnRlcm5hbEZvcm1hdD1uLmludGVybmFsRm9ybWF0LHRoaXMuZGVwdGhCdWZmZXI9bi5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9bi5zdGVuY2lsQnVmZmVyLHRoaXMuZGVwdGhUZXh0dXJlPW4uZGVwdGhUZXh0dXJlLHRoaXMuc2FtcGxlcz1uLnNhbXBsZXN9c2V0U2l6ZShlLHQsbj0xKXsodGhpcy53aWR0aCE9PWV8fHRoaXMuaGVpZ2h0IT09dHx8dGhpcy5kZXB0aCE9PW4pJiYodGhpcy53aWR0aD1lLHRoaXMuaGVpZ2h0PXQsdGhpcy5kZXB0aD1uLHRoaXMudGV4dHVyZS5pbWFnZS53aWR0aD1lLHRoaXMudGV4dHVyZS5pbWFnZS5oZWlnaHQ9dCx0aGlzLnRleHR1cmUuaW1hZ2UuZGVwdGg9bix0aGlzLmRpc3Bvc2UoKSksdGhpcy52aWV3cG9ydC5zZXQoMCwwLGUsdCksdGhpcy5zY2lzc29yLnNldCgwLDAsZSx0KX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weShlKXt0aGlzLndpZHRoPWUud2lkdGgsdGhpcy5oZWlnaHQ9ZS5oZWlnaHQsdGhpcy5kZXB0aD1lLmRlcHRoLHRoaXMuc2Npc3Nvci5jb3B5KGUuc2Npc3NvciksdGhpcy5zY2lzc29yVGVzdD1lLnNjaXNzb3JUZXN0LHRoaXMudmlld3BvcnQuY29weShlLnZpZXdwb3J0KSx0aGlzLnRleHR1cmU9ZS50ZXh0dXJlLmNsb25lKCksdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMDtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZS50ZXh0dXJlLmltYWdlKTtyZXR1cm4gdGhpcy50ZXh0dXJlLnNvdXJjZT1uZXcgV2kodCksdGhpcy5kZXB0aEJ1ZmZlcj1lLmRlcHRoQnVmZmVyLHRoaXMuc3RlbmNpbEJ1ZmZlcj1lLnN0ZW5jaWxCdWZmZXIsZS5kZXB0aFRleHR1cmUhPT1udWxsJiYodGhpcy5kZXB0aFRleHR1cmU9ZS5kZXB0aFRleHR1cmUuY2xvbmUoKSksdGhpcy5zYW1wbGVzPWUuc2FtcGxlcyx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNsYXNzIExuIGV4dGVuZHMgUmR7Y29uc3RydWN0b3IoZT0xLHQ9MSxuPXt9KXtzdXBlcihlLHQsbiksdGhpcy5pc1dlYkdMUmVuZGVyVGFyZ2V0PSEwfX1jbGFzcyBKYSBleHRlbmRzIEV0e2NvbnN0cnVjdG9yKGU9bnVsbCx0PTEsbj0xLGk9MSl7c3VwZXIobnVsbCksdGhpcy5pc0RhdGFBcnJheVRleHR1cmU9ITAsdGhpcy5pbWFnZT17ZGF0YTplLHdpZHRoOnQsaGVpZ2h0Om4sZGVwdGg6aX0sdGhpcy5tYWdGaWx0ZXI9YnQsdGhpcy5taW5GaWx0ZXI9YnQsdGhpcy53cmFwUj16dCx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLmZsaXBZPSExLHRoaXMudW5wYWNrQWxpZ25tZW50PTF9fWNsYXNzIHJ4IGV4dGVuZHMgTG57Y29uc3RydWN0b3IoZT0xLHQ9MSxuPTEsaT17fSl7c3VwZXIoZSx0LGkpLHRoaXMuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0PSEwLHRoaXMuZGVwdGg9bix0aGlzLnRleHR1cmU9bmV3IEphKG51bGwsZSx0LG4pLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITB9fWNsYXNzIHNoIGV4dGVuZHMgRXR7Y29uc3RydWN0b3IoZT1udWxsLHQ9MSxuPTEsaT0xKXtzdXBlcihudWxsKSx0aGlzLmlzRGF0YTNEVGV4dHVyZT0hMCx0aGlzLmltYWdlPXtkYXRhOmUsd2lkdGg6dCxoZWlnaHQ6bixkZXB0aDppfSx0aGlzLm1hZ0ZpbHRlcj1idCx0aGlzLm1pbkZpbHRlcj1idCx0aGlzLndyYXBSPXp0LHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MX19Y2xhc3Mgc3ggZXh0ZW5kcyBMbntjb25zdHJ1Y3RvcihlPTEsdD0xLG49MSxpPXt9KXtzdXBlcihlLHQsaSksdGhpcy5pc1dlYkdMM0RSZW5kZXJUYXJnZXQ9ITAsdGhpcy5kZXB0aD1uLHRoaXMudGV4dHVyZT1uZXcgc2gobnVsbCxlLHQsbiksdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMH19Y2xhc3MgYXggZXh0ZW5kcyBMbntjb25zdHJ1Y3RvcihlPTEsdD0xLG49MSxpPXt9KXtzdXBlcihlLHQsaSksdGhpcy5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzPSEwO2NvbnN0IHM9dGhpcy50ZXh0dXJlO3RoaXMudGV4dHVyZT1bXTtmb3IobGV0IGE9MDthPG47YSsrKXRoaXMudGV4dHVyZVthXT1zLmNsb25lKCksdGhpcy50ZXh0dXJlW2FdLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMH1zZXRTaXplKGUsdCxuPTEpe2lmKHRoaXMud2lkdGghPT1lfHx0aGlzLmhlaWdodCE9PXR8fHRoaXMuZGVwdGghPT1uKXt0aGlzLndpZHRoPWUsdGhpcy5oZWlnaHQ9dCx0aGlzLmRlcHRoPW47Zm9yKGxldCBpPTAscz10aGlzLnRleHR1cmUubGVuZ3RoO2k8cztpKyspdGhpcy50ZXh0dXJlW2ldLmltYWdlLndpZHRoPWUsdGhpcy50ZXh0dXJlW2ldLmltYWdlLmhlaWdodD10LHRoaXMudGV4dHVyZVtpXS5pbWFnZS5kZXB0aD1uO3RoaXMuZGlzcG9zZSgpfXRoaXMudmlld3BvcnQuc2V0KDAsMCxlLHQpLHRoaXMuc2Npc3Nvci5zZXQoMCwwLGUsdCl9Y29weShlKXt0aGlzLmRpc3Bvc2UoKSx0aGlzLndpZHRoPWUud2lkdGgsdGhpcy5oZWlnaHQ9ZS5oZWlnaHQsdGhpcy5kZXB0aD1lLmRlcHRoLHRoaXMuc2Npc3Nvci5jb3B5KGUuc2Npc3NvciksdGhpcy5zY2lzc29yVGVzdD1lLnNjaXNzb3JUZXN0LHRoaXMudmlld3BvcnQuY29weShlLnZpZXdwb3J0KSx0aGlzLmRlcHRoQnVmZmVyPWUuZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPWUuc3RlbmNpbEJ1ZmZlcixlLmRlcHRoVGV4dHVyZSE9PW51bGwmJih0aGlzLmRlcHRoVGV4dHVyZT1lLmRlcHRoVGV4dHVyZS5jbG9uZSgpKSx0aGlzLnRleHR1cmUubGVuZ3RoPTA7Zm9yKGxldCB0PTAsbj1lLnRleHR1cmUubGVuZ3RoO3Q8bjt0KyspdGhpcy50ZXh0dXJlW3RdPWUudGV4dHVyZVt0XS5jbG9uZSgpLHRoaXMudGV4dHVyZVt0XS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITA7cmV0dXJuIHRoaXN9fWNsYXNzIGxue2NvbnN0cnVjdG9yKGU9MCx0PTAsbj0wLGk9MSl7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD1lLHRoaXMuX3k9dCx0aGlzLl96PW4sdGhpcy5fdz1pfXN0YXRpYyBzbGVycEZsYXQoZSx0LG4saSxzLGEsbyl7bGV0IGw9bltpKzBdLGM9bltpKzFdLGg9bltpKzJdLHU9bltpKzNdO2NvbnN0IGY9c1thKzBdLGQ9c1thKzFdLHA9c1thKzJdLF89c1thKzNdO2lmKG89PT0wKXtlW3QrMF09bCxlW3QrMV09YyxlW3QrMl09aCxlW3QrM109dTtyZXR1cm59aWYobz09PTEpe2VbdCswXT1mLGVbdCsxXT1kLGVbdCsyXT1wLGVbdCszXT1fO3JldHVybn1pZih1IT09X3x8bCE9PWZ8fGMhPT1kfHxoIT09cCl7bGV0IGc9MS1vO2NvbnN0IG09bCpmK2MqZCtoKnArdSpfLHk9bT49MD8xOi0xLHg9MS1tKm07aWYoeD5OdW1iZXIuRVBTSUxPTil7Y29uc3QgUz1NYXRoLnNxcnQoeCksYj1NYXRoLmF0YW4yKFMsbSp5KTtnPU1hdGguc2luKGcqYikvUyxvPU1hdGguc2luKG8qYikvU31jb25zdCB2PW8qeTtpZihsPWwqZytmKnYsYz1jKmcrZCp2LGg9aCpnK3Aqdix1PXUqZytfKnYsZz09PTEtbyl7Y29uc3QgUz0xL01hdGguc3FydChsKmwrYypjK2gqaCt1KnUpO2wqPVMsYyo9UyxoKj1TLHUqPVN9fWVbdF09bCxlW3QrMV09YyxlW3QrMl09aCxlW3QrM109dX1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQoZSx0LG4saSxzLGEpe2NvbnN0IG89bltpXSxsPW5baSsxXSxjPW5baSsyXSxoPW5baSszXSx1PXNbYV0sZj1zW2ErMV0sZD1zW2ErMl0scD1zW2ErM107cmV0dXJuIGVbdF09bypwK2gqdStsKmQtYypmLGVbdCsxXT1sKnAraCpmK2MqdS1vKmQsZVt0KzJdPWMqcCtoKmQrbypmLWwqdSxlW3QrM109aCpwLW8qdS1sKmYtYypkLGV9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeChlKXt0aGlzLl94PWUsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkoZSl7dGhpcy5feT1lLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KGUpe3RoaXMuX3o9ZSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyhlKXt0aGlzLl93PWUsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldChlLHQsbixpKXtyZXR1cm4gdGhpcy5feD1lLHRoaXMuX3k9dCx0aGlzLl96PW4sdGhpcy5fdz1pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkoZSl7cmV0dXJuIHRoaXMuX3g9ZS54LHRoaXMuX3k9ZS55LHRoaXMuX3o9ZS56LHRoaXMuX3c9ZS53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcihlLHQpe2NvbnN0IG49ZS5feCxpPWUuX3kscz1lLl96LGE9ZS5fb3JkZXIsbz1NYXRoLmNvcyxsPU1hdGguc2luLGM9byhuLzIpLGg9byhpLzIpLHU9byhzLzIpLGY9bChuLzIpLGQ9bChpLzIpLHA9bChzLzIpO3N3aXRjaChhKXtjYXNlIlhZWiI6dGhpcy5feD1mKmgqdStjKmQqcCx0aGlzLl95PWMqZCp1LWYqaCpwLHRoaXMuX3o9YypoKnArZipkKnUsdGhpcy5fdz1jKmgqdS1mKmQqcDticmVhaztjYXNlIllYWiI6dGhpcy5feD1mKmgqdStjKmQqcCx0aGlzLl95PWMqZCp1LWYqaCpwLHRoaXMuX3o9YypoKnAtZipkKnUsdGhpcy5fdz1jKmgqdStmKmQqcDticmVhaztjYXNlIlpYWSI6dGhpcy5feD1mKmgqdS1jKmQqcCx0aGlzLl95PWMqZCp1K2YqaCpwLHRoaXMuX3o9YypoKnArZipkKnUsdGhpcy5fdz1jKmgqdS1mKmQqcDticmVhaztjYXNlIlpZWCI6dGhpcy5feD1mKmgqdS1jKmQqcCx0aGlzLl95PWMqZCp1K2YqaCpwLHRoaXMuX3o9YypoKnAtZipkKnUsdGhpcy5fdz1jKmgqdStmKmQqcDticmVhaztjYXNlIllaWCI6dGhpcy5feD1mKmgqdStjKmQqcCx0aGlzLl95PWMqZCp1K2YqaCpwLHRoaXMuX3o9YypoKnAtZipkKnUsdGhpcy5fdz1jKmgqdS1mKmQqcDticmVhaztjYXNlIlhaWSI6dGhpcy5feD1mKmgqdS1jKmQqcCx0aGlzLl95PWMqZCp1LWYqaCpwLHRoaXMuX3o9YypoKnArZipkKnUsdGhpcy5fdz1jKmgqdStmKmQqcDticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrYSl9cmV0dXJuIHQhPT0hMSYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUF4aXNBbmdsZShlLHQpe2NvbnN0IG49dC8yLGk9TWF0aC5zaW4obik7cmV0dXJuIHRoaXMuX3g9ZS54KmksdGhpcy5feT1lLnkqaSx0aGlzLl96PWUueippLHRoaXMuX3c9TWF0aC5jb3MobiksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KGUpe2NvbnN0IHQ9ZS5lbGVtZW50cyxuPXRbMF0saT10WzRdLHM9dFs4XSxhPXRbMV0sbz10WzVdLGw9dFs5XSxjPXRbMl0saD10WzZdLHU9dFsxMF0sZj1uK28rdTtpZihmPjApe2NvbnN0IGQ9LjUvTWF0aC5zcXJ0KGYrMSk7dGhpcy5fdz0uMjUvZCx0aGlzLl94PShoLWwpKmQsdGhpcy5feT0ocy1jKSpkLHRoaXMuX3o9KGEtaSkqZH1lbHNlIGlmKG4+byYmbj51KXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErbi1vLXUpO3RoaXMuX3c9KGgtbCkvZCx0aGlzLl94PS4yNSpkLHRoaXMuX3k9KGkrYSkvZCx0aGlzLl96PShzK2MpL2R9ZWxzZSBpZihvPnUpe2NvbnN0IGQ9MipNYXRoLnNxcnQoMStvLW4tdSk7dGhpcy5fdz0ocy1jKS9kLHRoaXMuX3g9KGkrYSkvZCx0aGlzLl95PS4yNSpkLHRoaXMuX3o9KGwraCkvZH1lbHNle2NvbnN0IGQ9MipNYXRoLnNxcnQoMSt1LW4tbyk7dGhpcy5fdz0oYS1pKS9kLHRoaXMuX3g9KHMrYykvZCx0aGlzLl95PShsK2gpL2QsdGhpcy5fej0uMjUqZH1yZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVVuaXRWZWN0b3JzKGUsdCl7bGV0IG49ZS5kb3QodCkrMTtyZXR1cm4gbjxOdW1iZXIuRVBTSUxPTj8obj0wLE1hdGguYWJzKGUueCk+TWF0aC5hYnMoZS56KT8odGhpcy5feD0tZS55LHRoaXMuX3k9ZS54LHRoaXMuX3o9MCx0aGlzLl93PW4pOih0aGlzLl94PTAsdGhpcy5feT0tZS56LHRoaXMuX3o9ZS55LHRoaXMuX3c9bikpOih0aGlzLl94PWUueSp0LnotZS56KnQueSx0aGlzLl95PWUueip0LngtZS54KnQueix0aGlzLl96PWUueCp0LnktZS55KnQueCx0aGlzLl93PW4pLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyhlKXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoX3QodGhpcy5kb3QoZSksLTEsMSkpKX1yb3RhdGVUb3dhcmRzKGUsdCl7Y29uc3Qgbj10aGlzLmFuZ2xlVG8oZSk7aWYobj09PTApcmV0dXJuIHRoaXM7Y29uc3QgaT1NYXRoLm1pbigxLHQvbik7cmV0dXJuIHRoaXMuc2xlcnAoZSxpKSx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDAsMCwwLDEpfWludmVydCgpe3JldHVybiB0aGlzLmNvbmp1Z2F0ZSgpfWNvbmp1Z2F0ZSgpe3JldHVybiB0aGlzLl94Kj0tMSx0aGlzLl95Kj0tMSx0aGlzLl96Kj0tMSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31kb3QoZSl7cmV0dXJuIHRoaXMuX3gqZS5feCt0aGlzLl95KmUuX3krdGhpcy5feiplLl96K3RoaXMuX3cqZS5fd31sZW5ndGhTcSgpe3JldHVybiB0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3d9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfW5vcm1hbGl6ZSgpe2xldCBlPXRoaXMubGVuZ3RoKCk7cmV0dXJuIGU9PT0wPyh0aGlzLl94PTAsdGhpcy5feT0wLHRoaXMuX3o9MCx0aGlzLl93PTEpOihlPTEvZSx0aGlzLl94PXRoaXMuX3gqZSx0aGlzLl95PXRoaXMuX3kqZSx0aGlzLl96PXRoaXMuX3oqZSx0aGlzLl93PXRoaXMuX3cqZSksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9bXVsdGlwbHkoZSl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0aGlzLGUpfXByZW11bHRpcGx5KGUpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoZSx0aGlzKX1tdWx0aXBseVF1YXRlcm5pb25zKGUsdCl7Y29uc3Qgbj1lLl94LGk9ZS5feSxzPWUuX3osYT1lLl93LG89dC5feCxsPXQuX3ksYz10Ll96LGg9dC5fdztyZXR1cm4gdGhpcy5feD1uKmgrYSpvK2kqYy1zKmwsdGhpcy5feT1pKmgrYSpsK3Mqby1uKmMsdGhpcy5fej1zKmgrYSpjK24qbC1pKm8sdGhpcy5fdz1hKmgtbipvLWkqbC1zKmMsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2xlcnAoZSx0KXtpZih0PT09MClyZXR1cm4gdGhpcztpZih0PT09MSlyZXR1cm4gdGhpcy5jb3B5KGUpO2NvbnN0IG49dGhpcy5feCxpPXRoaXMuX3kscz10aGlzLl96LGE9dGhpcy5fdztsZXQgbz1hKmUuX3crbiplLl94K2kqZS5feStzKmUuX3o7aWYobzwwPyh0aGlzLl93PS1lLl93LHRoaXMuX3g9LWUuX3gsdGhpcy5feT0tZS5feSx0aGlzLl96PS1lLl96LG89LW8pOnRoaXMuY29weShlKSxvPj0xKXJldHVybiB0aGlzLl93PWEsdGhpcy5feD1uLHRoaXMuX3k9aSx0aGlzLl96PXMsdGhpcztjb25zdCBsPTEtbypvO2lmKGw8PU51bWJlci5FUFNJTE9OKXtjb25zdCBkPTEtdDtyZXR1cm4gdGhpcy5fdz1kKmErdCp0aGlzLl93LHRoaXMuX3g9ZCpuK3QqdGhpcy5feCx0aGlzLl95PWQqaSt0KnRoaXMuX3ksdGhpcy5fej1kKnMrdCp0aGlzLl96LHRoaXMubm9ybWFsaXplKCksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y29uc3QgYz1NYXRoLnNxcnQobCksaD1NYXRoLmF0YW4yKGMsbyksdT1NYXRoLnNpbigoMS10KSpoKS9jLGY9TWF0aC5zaW4odCpoKS9jO3JldHVybiB0aGlzLl93PWEqdSt0aGlzLl93KmYsdGhpcy5feD1uKnUrdGhpcy5feCpmLHRoaXMuX3k9aSp1K3RoaXMuX3kqZix0aGlzLl96PXMqdSt0aGlzLl96KmYsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2xlcnBRdWF0ZXJuaW9ucyhlLHQsbil7cmV0dXJuIHRoaXMuY29weShlKS5zbGVycCh0LG4pfXJhbmRvbSgpe2NvbnN0IGU9TWF0aC5yYW5kb20oKSx0PU1hdGguc3FydCgxLWUpLG49TWF0aC5zcXJ0KGUpLGk9MipNYXRoLlBJKk1hdGgucmFuZG9tKCkscz0yKk1hdGguUEkqTWF0aC5yYW5kb20oKTtyZXR1cm4gdGhpcy5zZXQodCpNYXRoLmNvcyhpKSxuKk1hdGguc2luKHMpLG4qTWF0aC5jb3MocyksdCpNYXRoLnNpbihpKSl9ZXF1YWxzKGUpe3JldHVybiBlLl94PT09dGhpcy5feCYmZS5feT09PXRoaXMuX3kmJmUuX3o9PT10aGlzLl96JiZlLl93PT09dGhpcy5fd31mcm9tQXJyYXkoZSx0PTApe3JldHVybiB0aGlzLl94PWVbdF0sdGhpcy5feT1lW3QrMV0sdGhpcy5fej1lW3QrMl0sdGhpcy5fdz1lW3QrM10sdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheShlPVtdLHQ9MCl7cmV0dXJuIGVbdF09dGhpcy5feCxlW3QrMV09dGhpcy5feSxlW3QrMl09dGhpcy5feixlW3QrM109dGhpcy5fdyxlfWZyb21CdWZmZXJBdHRyaWJ1dGUoZSx0KXtyZXR1cm4gdGhpcy5feD1lLmdldFgodCksdGhpcy5feT1lLmdldFkodCksdGhpcy5fej1lLmdldFoodCksdGhpcy5fdz1lLmdldFcodCksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy50b0FycmF5KCl9X29uQ2hhbmdlKGUpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPWUsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl93fX1jbGFzcyBQe2NvbnN0cnVjdG9yKGU9MCx0PTAsbj0wKXtQLnByb3RvdHlwZS5pc1ZlY3RvcjM9ITAsdGhpcy54PWUsdGhpcy55PXQsdGhpcy56PW59c2V0KGUsdCxuKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49dGhpcy56KSx0aGlzLng9ZSx0aGlzLnk9dCx0aGlzLno9bix0aGlzfXNldFNjYWxhcihlKXtyZXR1cm4gdGhpcy54PWUsdGhpcy55PWUsdGhpcy56PWUsdGhpc31zZXRYKGUpe3JldHVybiB0aGlzLng9ZSx0aGlzfXNldFkoZSl7cmV0dXJuIHRoaXMueT1lLHRoaXN9c2V0WihlKXtyZXR1cm4gdGhpcy56PWUsdGhpc31zZXRDb21wb25lbnQoZSx0KXtzd2l0Y2goZSl7Y2FzZSAwOnRoaXMueD10O2JyZWFrO2Nhc2UgMTp0aGlzLnk9dDticmVhaztjYXNlIDI6dGhpcy56PXQ7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIitlKX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQoZSl7c3dpdGNoKGUpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrZSl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KGUpe3JldHVybiB0aGlzLng9ZS54LHRoaXMueT1lLnksdGhpcy56PWUueix0aGlzfWFkZChlKXtyZXR1cm4gdGhpcy54Kz1lLngsdGhpcy55Kz1lLnksdGhpcy56Kz1lLnosdGhpc31hZGRTY2FsYXIoZSl7cmV0dXJuIHRoaXMueCs9ZSx0aGlzLnkrPWUsdGhpcy56Kz1lLHRoaXN9YWRkVmVjdG9ycyhlLHQpe3JldHVybiB0aGlzLng9ZS54K3QueCx0aGlzLnk9ZS55K3QueSx0aGlzLno9ZS56K3Queix0aGlzfWFkZFNjYWxlZFZlY3RvcihlLHQpe3JldHVybiB0aGlzLngrPWUueCp0LHRoaXMueSs9ZS55KnQsdGhpcy56Kz1lLnoqdCx0aGlzfXN1YihlKXtyZXR1cm4gdGhpcy54LT1lLngsdGhpcy55LT1lLnksdGhpcy56LT1lLnosdGhpc31zdWJTY2FsYXIoZSl7cmV0dXJuIHRoaXMueC09ZSx0aGlzLnktPWUsdGhpcy56LT1lLHRoaXN9c3ViVmVjdG9ycyhlLHQpe3JldHVybiB0aGlzLng9ZS54LXQueCx0aGlzLnk9ZS55LXQueSx0aGlzLno9ZS56LXQueix0aGlzfW11bHRpcGx5KGUpe3JldHVybiB0aGlzLngqPWUueCx0aGlzLnkqPWUueSx0aGlzLnoqPWUueix0aGlzfW11bHRpcGx5U2NhbGFyKGUpe3JldHVybiB0aGlzLngqPWUsdGhpcy55Kj1lLHRoaXMueio9ZSx0aGlzfW11bHRpcGx5VmVjdG9ycyhlLHQpe3JldHVybiB0aGlzLng9ZS54KnQueCx0aGlzLnk9ZS55KnQueSx0aGlzLno9ZS56KnQueix0aGlzfWFwcGx5RXVsZXIoZSl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKFBkLnNldEZyb21FdWxlcihlKSl9YXBwbHlBeGlzQW5nbGUoZSx0KXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oUGQuc2V0RnJvbUF4aXNBbmdsZShlLHQpKX1hcHBseU1hdHJpeDMoZSl7Y29uc3QgdD10aGlzLngsbj10aGlzLnksaT10aGlzLnoscz1lLmVsZW1lbnRzO3JldHVybiB0aGlzLng9c1swXSp0K3NbM10qbitzWzZdKmksdGhpcy55PXNbMV0qdCtzWzRdKm4rc1s3XSppLHRoaXMuej1zWzJdKnQrc1s1XSpuK3NbOF0qaSx0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KGUpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4MyhlKS5ub3JtYWxpemUoKX1hcHBseU1hdHJpeDQoZSl7Y29uc3QgdD10aGlzLngsbj10aGlzLnksaT10aGlzLnoscz1lLmVsZW1lbnRzLGE9MS8oc1szXSp0K3NbN10qbitzWzExXSppK3NbMTVdKTtyZXR1cm4gdGhpcy54PShzWzBdKnQrc1s0XSpuK3NbOF0qaStzWzEyXSkqYSx0aGlzLnk9KHNbMV0qdCtzWzVdKm4rc1s5XSppK3NbMTNdKSphLHRoaXMuej0oc1syXSp0K3NbNl0qbitzWzEwXSppK3NbMTRdKSphLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKGUpe2NvbnN0IHQ9dGhpcy54LG49dGhpcy55LGk9dGhpcy56LHM9ZS54LGE9ZS55LG89ZS56LGw9ZS53LGM9MiooYSppLW8qbiksaD0yKihvKnQtcyppKSx1PTIqKHMqbi1hKnQpO3JldHVybiB0aGlzLng9dCtsKmMrYSp1LW8qaCx0aGlzLnk9bitsKmgrbypjLXMqdSx0aGlzLno9aStsKnUrcypoLWEqYyx0aGlzfXByb2plY3QoZSl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGUubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQoZS5wcm9qZWN0aW9uTWF0cml4KX11bnByb2plY3QoZSl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGUucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NChlLm1hdHJpeFdvcmxkKX10cmFuc2Zvcm1EaXJlY3Rpb24oZSl7Y29uc3QgdD10aGlzLngsbj10aGlzLnksaT10aGlzLnoscz1lLmVsZW1lbnRzO3JldHVybiB0aGlzLng9c1swXSp0K3NbNF0qbitzWzhdKmksdGhpcy55PXNbMV0qdCtzWzVdKm4rc1s5XSppLHRoaXMuej1zWzJdKnQrc1s2XSpuK3NbMTBdKmksdGhpcy5ub3JtYWxpemUoKX1kaXZpZGUoZSl7cmV0dXJuIHRoaXMueC89ZS54LHRoaXMueS89ZS55LHRoaXMuei89ZS56LHRoaXN9ZGl2aWRlU2NhbGFyKGUpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvZSl9bWluKGUpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LGUueCksdGhpcy55PU1hdGgubWluKHRoaXMueSxlLnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosZS56KSx0aGlzfW1heChlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCxlLngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksZS55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LGUueiksdGhpc31jbGFtcChlLHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgoZS54LE1hdGgubWluKHQueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgoZS55LE1hdGgubWluKHQueSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgoZS56LE1hdGgubWluKHQueix0aGlzLnopKSx0aGlzfWNsYW1wU2NhbGFyKGUsdCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heChlLE1hdGgubWluKHQsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KGUsTWF0aC5taW4odCx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgoZSxNYXRoLm1pbih0LHRoaXMueikpLHRoaXN9Y2xhbXBMZW5ndGgoZSx0KXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KGUsTWF0aC5taW4odCxuKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QoZSl7cmV0dXJuIHRoaXMueCplLngrdGhpcy55KmUueSt0aGlzLnoqZS56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGUpfWxlcnAoZSx0KXtyZXR1cm4gdGhpcy54Kz0oZS54LXRoaXMueCkqdCx0aGlzLnkrPShlLnktdGhpcy55KSp0LHRoaXMueis9KGUuei10aGlzLnopKnQsdGhpc31sZXJwVmVjdG9ycyhlLHQsbil7cmV0dXJuIHRoaXMueD1lLngrKHQueC1lLngpKm4sdGhpcy55PWUueSsodC55LWUueSkqbix0aGlzLno9ZS56Kyh0LnotZS56KSpuLHRoaXN9Y3Jvc3MoZSl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsZSl9Y3Jvc3NWZWN0b3JzKGUsdCl7Y29uc3Qgbj1lLngsaT1lLnkscz1lLnosYT10Lngsbz10LnksbD10Lno7cmV0dXJuIHRoaXMueD1pKmwtcypvLHRoaXMueT1zKmEtbipsLHRoaXMuej1uKm8taSphLHRoaXN9cHJvamVjdE9uVmVjdG9yKGUpe2NvbnN0IHQ9ZS5sZW5ndGhTcSgpO2lmKHQ9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgbj1lLmRvdCh0aGlzKS90O3JldHVybiB0aGlzLmNvcHkoZSkubXVsdGlwbHlTY2FsYXIobil9cHJvamVjdE9uUGxhbmUoZSl7cmV0dXJuIGFoLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKGUpLHRoaXMuc3ViKGFoKX1yZWZsZWN0KGUpe3JldHVybiB0aGlzLnN1YihhaC5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QoZSkpKX1hbmdsZVRvKGUpe2NvbnN0IHQ9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSplLmxlbmd0aFNxKCkpO2lmKHQ9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdChlKS90O3JldHVybiBNYXRoLmFjb3MoX3QobiwtMSwxKSl9ZGlzdGFuY2VUbyhlKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoZSkpfWRpc3RhbmNlVG9TcXVhcmVkKGUpe2NvbnN0IHQ9dGhpcy54LWUueCxuPXRoaXMueS1lLnksaT10aGlzLnotZS56O3JldHVybiB0KnQrbipuK2kqaX1tYW5oYXR0YW5EaXN0YW5jZVRvKGUpe3JldHVybiBNYXRoLmFicyh0aGlzLngtZS54KStNYXRoLmFicyh0aGlzLnktZS55KStNYXRoLmFicyh0aGlzLnotZS56KX1zZXRGcm9tU3BoZXJpY2FsKGUpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHMoZS5yYWRpdXMsZS5waGksZS50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3JkcyhlLHQsbil7Y29uc3QgaT1NYXRoLnNpbih0KSplO3JldHVybiB0aGlzLng9aSpNYXRoLnNpbihuKSx0aGlzLnk9TWF0aC5jb3ModCkqZSx0aGlzLno9aSpNYXRoLmNvcyhuKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbChlKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoZS5yYWRpdXMsZS50aGV0YSxlLnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3JkcyhlLHQsbil7cmV0dXJuIHRoaXMueD1lKk1hdGguc2luKHQpLHRoaXMueT1uLHRoaXMuej1lKk1hdGguY29zKHQpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUpe2NvbnN0IHQ9ZS5lbGVtZW50cztyZXR1cm4gdGhpcy54PXRbMTJdLHRoaXMueT10WzEzXSx0aGlzLno9dFsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUoZSl7Y29uc3QgdD10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oZSwwKS5sZW5ndGgoKSxuPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihlLDEpLmxlbmd0aCgpLGk9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGUsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD10LHRoaXMueT1uLHRoaXMuej1pLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbihlLHQpe3JldHVybiB0aGlzLmZyb21BcnJheShlLmVsZW1lbnRzLHQqNCl9c2V0RnJvbU1hdHJpeDNDb2x1bW4oZSx0KXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkoZS5lbGVtZW50cyx0KjMpfXNldEZyb21FdWxlcihlKXtyZXR1cm4gdGhpcy54PWUuX3gsdGhpcy55PWUuX3ksdGhpcy56PWUuX3osdGhpc31zZXRGcm9tQ29sb3IoZSl7cmV0dXJuIHRoaXMueD1lLnIsdGhpcy55PWUuZyx0aGlzLno9ZS5iLHRoaXN9ZXF1YWxzKGUpe3JldHVybiBlLng9PT10aGlzLngmJmUueT09PXRoaXMueSYmZS56PT09dGhpcy56fWZyb21BcnJheShlLHQ9MCl7cmV0dXJuIHRoaXMueD1lW3RdLHRoaXMueT1lW3QrMV0sdGhpcy56PWVbdCsyXSx0aGlzfXRvQXJyYXkoZT1bXSx0PTApe3JldHVybiBlW3RdPXRoaXMueCxlW3QrMV09dGhpcy55LGVbdCsyXT10aGlzLnosZX1mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCl7cmV0dXJuIHRoaXMueD1lLmdldFgodCksdGhpcy55PWUuZ2V0WSh0KSx0aGlzLno9ZS5nZXRaKHQpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9cmFuZG9tRGlyZWN0aW9uKCl7Y29uc3QgZT0oTWF0aC5yYW5kb20oKS0uNSkqMix0PU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLG49TWF0aC5zcXJ0KDEteHMoZSwyKSk7cmV0dXJuIHRoaXMueD1uKk1hdGguY29zKHQpLHRoaXMueT1uKk1hdGguc2luKHQpLHRoaXMuej1lLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnp9fWNvbnN0IGFoPW5ldyBQLFBkPW5ldyBsbjtjbGFzcyBEdHtjb25zdHJ1Y3RvcihlPW5ldyBQKDEvMCwxLzAsMS8wKSx0PW5ldyBQKC0xLzAsLTEvMCwtMS8wKSl7dGhpcy5pc0JveDM9ITAsdGhpcy5taW49ZSx0aGlzLm1heD10fXNldChlLHQpe3JldHVybiB0aGlzLm1pbi5jb3B5KGUpLHRoaXMubWF4LmNvcHkodCksdGhpc31zZXRGcm9tQXJyYXkoZSl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IHQ9MCxuPWUubGVuZ3RoO3Q8bjt0Kz0zKXRoaXMuZXhwYW5kQnlQb2ludChJbi5mcm9tQXJyYXkoZSx0KSk7cmV0dXJuIHRoaXN9c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShlKXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgdD0wLG49ZS5jb3VudDt0PG47dCsrKXRoaXMuZXhwYW5kQnlQb2ludChJbi5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCkpO3JldHVybiB0aGlzfXNldEZyb21Qb2ludHMoZSl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspdGhpcy5leHBhbmRCeVBvaW50KGVbdF0pO3JldHVybiB0aGlzfXNldEZyb21DZW50ZXJBbmRTaXplKGUsdCl7Y29uc3Qgbj1Jbi5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKC41KTtyZXR1cm4gdGhpcy5taW4uY29weShlKS5zdWIobiksdGhpcy5tYXguY29weShlKS5hZGQobiksdGhpc31zZXRGcm9tT2JqZWN0KGUsdD0hMSl7cmV0dXJuIHRoaXMubWFrZUVtcHR5KCksdGhpcy5leHBhbmRCeU9iamVjdChlLHQpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KGUubWluKSx0aGlzLm1heC5jb3B5KGUubWF4KSx0aGlzfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLm1pbi54PXRoaXMubWluLnk9dGhpcy5taW4uej0xLzAsdGhpcy5tYXgueD10aGlzLm1heC55PXRoaXMubWF4Lno9LTEvMCx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl8fHRoaXMubWF4Lno8dGhpcy5taW4uen1nZXRDZW50ZXIoZSl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Uuc2V0KDAsMCwwKTplLmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX1nZXRTaXplKGUpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9lLnNldCgwLDAsMCk6ZS5zdWJWZWN0b3JzKHRoaXMubWF4LHRoaXMubWluKX1leHBhbmRCeVBvaW50KGUpe3JldHVybiB0aGlzLm1pbi5taW4oZSksdGhpcy5tYXgubWF4KGUpLHRoaXN9ZXhwYW5kQnlWZWN0b3IoZSl7cmV0dXJuIHRoaXMubWluLnN1YihlKSx0aGlzLm1heC5hZGQoZSksdGhpc31leHBhbmRCeVNjYWxhcihlKXtyZXR1cm4gdGhpcy5taW4uYWRkU2NhbGFyKC1lKSx0aGlzLm1heC5hZGRTY2FsYXIoZSksdGhpc31leHBhbmRCeU9iamVjdChlLHQ9ITEpe2UudXBkYXRlV29ybGRNYXRyaXgoITEsITEpO2NvbnN0IG49ZS5nZW9tZXRyeTtpZihuIT09dm9pZCAwKXtjb25zdCBzPW4uZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKHQ9PT0hMCYmcyE9PXZvaWQgMCYmZS5pc0luc3RhbmNlZE1lc2ghPT0hMClmb3IobGV0IGE9MCxvPXMuY291bnQ7YTxvO2ErKyllLmlzTWVzaD09PSEwP2UuZ2V0VmVydGV4UG9zaXRpb24oYSxJbik6SW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGEpLEluLmFwcGx5TWF0cml4NChlLm1hdHJpeFdvcmxkKSx0aGlzLmV4cGFuZEJ5UG9pbnQoSW4pO2Vsc2UgZS5ib3VuZGluZ0JveCE9PXZvaWQgMD8oZS5ib3VuZGluZ0JveD09PW51bGwmJmUuY29tcHV0ZUJvdW5kaW5nQm94KCksS2EuY29weShlLmJvdW5kaW5nQm94KSk6KG4uYm91bmRpbmdCb3g9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ0JveCgpLEthLmNvcHkobi5ib3VuZGluZ0JveCkpLEthLmFwcGx5TWF0cml4NChlLm1hdHJpeFdvcmxkKSx0aGlzLnVuaW9uKEthKX1jb25zdCBpPWUuY2hpbGRyZW47Zm9yKGxldCBzPTAsYT1pLmxlbmd0aDtzPGE7cysrKXRoaXMuZXhwYW5kQnlPYmplY3QoaVtzXSx0KTtyZXR1cm4gdGhpc31jb250YWluc1BvaW50KGUpe3JldHVybiEoZS54PHRoaXMubWluLnh8fGUueD50aGlzLm1heC54fHxlLnk8dGhpcy5taW4ueXx8ZS55PnRoaXMubWF4Lnl8fGUuejx0aGlzLm1pbi56fHxlLno+dGhpcy5tYXgueil9Y29udGFpbnNCb3goZSl7cmV0dXJuIHRoaXMubWluLng8PWUubWluLngmJmUubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PWUubWluLnkmJmUubWF4Lnk8PXRoaXMubWF4LnkmJnRoaXMubWluLno8PWUubWluLnomJmUubWF4Lno8PXRoaXMubWF4Lnp9Z2V0UGFyYW1ldGVyKGUsdCl7cmV0dXJuIHQuc2V0KChlLngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKGUueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSwoZS56LXRoaXMubWluLnopLyh0aGlzLm1heC56LXRoaXMubWluLnopKX1pbnRlcnNlY3RzQm94KGUpe3JldHVybiEoZS5tYXgueDx0aGlzLm1pbi54fHxlLm1pbi54PnRoaXMubWF4Lnh8fGUubWF4Lnk8dGhpcy5taW4ueXx8ZS5taW4ueT50aGlzLm1heC55fHxlLm1heC56PHRoaXMubWluLnp8fGUubWluLno+dGhpcy5tYXgueil9aW50ZXJzZWN0c1NwaGVyZShlKXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KGUuY2VudGVyLEluKSxJbi5kaXN0YW5jZVRvU3F1YXJlZChlLmNlbnRlcik8PWUucmFkaXVzKmUucmFkaXVzfWludGVyc2VjdHNQbGFuZShlKXtsZXQgdCxuO3JldHVybiBlLm5vcm1hbC54PjA/KHQ9ZS5ub3JtYWwueCp0aGlzLm1pbi54LG49ZS5ub3JtYWwueCp0aGlzLm1heC54KToodD1lLm5vcm1hbC54KnRoaXMubWF4Lngsbj1lLm5vcm1hbC54KnRoaXMubWluLngpLGUubm9ybWFsLnk+MD8odCs9ZS5ub3JtYWwueSp0aGlzLm1pbi55LG4rPWUubm9ybWFsLnkqdGhpcy5tYXgueSk6KHQrPWUubm9ybWFsLnkqdGhpcy5tYXgueSxuKz1lLm5vcm1hbC55KnRoaXMubWluLnkpLGUubm9ybWFsLno+MD8odCs9ZS5ub3JtYWwueip0aGlzLm1pbi56LG4rPWUubm9ybWFsLnoqdGhpcy5tYXgueik6KHQrPWUubm9ybWFsLnoqdGhpcy5tYXgueixuKz1lLm5vcm1hbC56KnRoaXMubWluLnopLHQ8PS1lLmNvbnN0YW50JiZuPj0tZS5jb25zdGFudH1pbnRlcnNlY3RzVHJpYW5nbGUoZSl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIoenMpLFFhLnN1YlZlY3RvcnModGhpcy5tYXgsenMpLFByLnN1YlZlY3RvcnMoZS5hLHpzKSxMci5zdWJWZWN0b3JzKGUuYix6cyksSXIuc3ViVmVjdG9ycyhlLmMsenMpLEVpLnN1YlZlY3RvcnMoTHIsUHIpLEFpLnN1YlZlY3RvcnMoSXIsTHIpLFhpLnN1YlZlY3RvcnMoUHIsSXIpO2xldCB0PVswLC1FaS56LEVpLnksMCwtQWkueixBaS55LDAsLVhpLnosWGkueSxFaS56LDAsLUVpLngsQWkueiwwLC1BaS54LFhpLnosMCwtWGkueCwtRWkueSxFaS54LDAsLUFpLnksQWkueCwwLC1YaS55LFhpLngsMF07cmV0dXJuIW9oKHQsUHIsTHIsSXIsUWEpfHwodD1bMSwwLDAsMCwxLDAsMCwwLDFdLCFvaCh0LFByLExyLElyLFFhKSk/ITE6KGphLmNyb3NzVmVjdG9ycyhFaSxBaSksdD1bamEueCxqYS55LGphLnpdLG9oKHQsUHIsTHIsSXIsUWEpKX1jbGFtcFBvaW50KGUsdCl7cmV0dXJuIHQuY29weShlKS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9ZGlzdGFuY2VUb1BvaW50KGUpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQoZSxJbikuZGlzdGFuY2VUbyhlKX1nZXRCb3VuZGluZ1NwaGVyZShlKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/ZS5tYWtlRW1wdHkoKToodGhpcy5nZXRDZW50ZXIoZS5jZW50ZXIpLGUucmFkaXVzPXRoaXMuZ2V0U2l6ZShJbikubGVuZ3RoKCkqLjUpLGV9aW50ZXJzZWN0KGUpe3JldHVybiB0aGlzLm1pbi5tYXgoZS5taW4pLHRoaXMubWF4Lm1pbihlLm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbihlKXtyZXR1cm4gdGhpcy5taW4ubWluKGUubWluKSx0aGlzLm1heC5tYXgoZS5tYXgpLHRoaXN9YXBwbHlNYXRyaXg0KGUpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90aGlzOih0aVswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChlKSx0aVsxXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChlKSx0aVsyXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChlKSx0aVszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChlKSx0aVs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChlKSx0aVs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChlKSx0aVs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChlKSx0aVs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChlKSx0aGlzLnNldEZyb21Qb2ludHModGkpLHRoaXMpfXRyYW5zbGF0ZShlKXtyZXR1cm4gdGhpcy5taW4uYWRkKGUpLHRoaXMubWF4LmFkZChlKSx0aGlzfWVxdWFscyhlKXtyZXR1cm4gZS5taW4uZXF1YWxzKHRoaXMubWluKSYmZS5tYXguZXF1YWxzKHRoaXMubWF4KX19Y29uc3QgdGk9W25ldyBQLG5ldyBQLG5ldyBQLG5ldyBQLG5ldyBQLG5ldyBQLG5ldyBQLG5ldyBQXSxJbj1uZXcgUCxLYT1uZXcgRHQsUHI9bmV3IFAsTHI9bmV3IFAsSXI9bmV3IFAsRWk9bmV3IFAsQWk9bmV3IFAsWGk9bmV3IFAsenM9bmV3IFAsUWE9bmV3IFAsamE9bmV3IFAscWk9bmV3IFA7ZnVuY3Rpb24gb2gocixlLHQsbixpKXtmb3IobGV0IHM9MCxhPXIubGVuZ3RoLTM7czw9YTtzKz0zKXtxaS5mcm9tQXJyYXkocixzKTtjb25zdCBvPWkueCpNYXRoLmFicyhxaS54KStpLnkqTWF0aC5hYnMocWkueSkraS56Kk1hdGguYWJzKHFpLnopLGw9ZS5kb3QocWkpLGM9dC5kb3QocWkpLGg9bi5kb3QocWkpO2lmKE1hdGgubWF4KC1NYXRoLm1heChsLGMsaCksTWF0aC5taW4obCxjLGgpKT5vKXJldHVybiExfXJldHVybiEwfWNvbnN0IG94PW5ldyBEdCxrcz1uZXcgUCxsaD1uZXcgUDtjbGFzcyBHdHtjb25zdHJ1Y3RvcihlPW5ldyBQLHQ9LTEpe3RoaXMuY2VudGVyPWUsdGhpcy5yYWRpdXM9dH1zZXQoZSx0KXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weShlKSx0aGlzLnJhZGl1cz10LHRoaXN9c2V0RnJvbVBvaW50cyhlLHQpe2NvbnN0IG49dGhpcy5jZW50ZXI7dCE9PXZvaWQgMD9uLmNvcHkodCk6b3guc2V0RnJvbVBvaW50cyhlKS5nZXRDZW50ZXIobik7bGV0IGk9MDtmb3IobGV0IHM9MCxhPWUubGVuZ3RoO3M8YTtzKyspaT1NYXRoLm1heChpLG4uZGlzdGFuY2VUb1NxdWFyZWQoZVtzXSkpO3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQoaSksdGhpc31jb3B5KGUpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KGUuY2VudGVyKSx0aGlzLnJhZGl1cz1lLnJhZGl1cyx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5yYWRpdXM8MH1tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5jZW50ZXIuc2V0KDAsMCwwKSx0aGlzLnJhZGl1cz0tMSx0aGlzfWNvbnRhaW5zUG9pbnQoZSl7cmV0dXJuIGUuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c31kaXN0YW5jZVRvUG9pbnQoZSl7cmV0dXJuIGUuZGlzdGFuY2VUbyh0aGlzLmNlbnRlciktdGhpcy5yYWRpdXN9aW50ZXJzZWN0c1NwaGVyZShlKXtjb25zdCB0PXRoaXMucmFkaXVzK2UucmFkaXVzO3JldHVybiBlLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PXQqdH1pbnRlcnNlY3RzQm94KGUpe3JldHVybiBlLmludGVyc2VjdHNTcGhlcmUodGhpcyl9aW50ZXJzZWN0c1BsYW5lKGUpe3JldHVybiBNYXRoLmFicyhlLmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c31jbGFtcFBvaW50KGUsdCl7Y29uc3Qgbj10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZChlKTtyZXR1cm4gdC5jb3B5KGUpLG4+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJih0LnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksdC5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSksdH1nZXRCb3VuZGluZ0JveChlKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/KGUubWFrZUVtcHR5KCksZSk6KGUuc2V0KHRoaXMuY2VudGVyLHRoaXMuY2VudGVyKSxlLmV4cGFuZEJ5U2NhbGFyKHRoaXMucmFkaXVzKSxlKX1hcHBseU1hdHJpeDQoZSl7cmV0dXJuIHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NChlKSx0aGlzLnJhZGl1cz10aGlzLnJhZGl1cyplLmdldE1heFNjYWxlT25BeGlzKCksdGhpc310cmFuc2xhdGUoZSl7cmV0dXJuIHRoaXMuY2VudGVyLmFkZChlKSx0aGlzfWV4cGFuZEJ5UG9pbnQoZSl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuY2VudGVyLmNvcHkoZSksdGhpcy5yYWRpdXM9MCx0aGlzO2tzLnN1YlZlY3RvcnMoZSx0aGlzLmNlbnRlcik7Y29uc3QgdD1rcy5sZW5ndGhTcSgpO2lmKHQ+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IG49TWF0aC5zcXJ0KHQpLGk9KG4tdGhpcy5yYWRpdXMpKi41O3RoaXMuY2VudGVyLmFkZFNjYWxlZFZlY3RvcihrcyxpL24pLHRoaXMucmFkaXVzKz1pfXJldHVybiB0aGlzfXVuaW9uKGUpe3JldHVybiBlLmlzRW1wdHkoKT90aGlzOnRoaXMuaXNFbXB0eSgpPyh0aGlzLmNvcHkoZSksdGhpcyk6KHRoaXMuY2VudGVyLmVxdWFscyhlLmNlbnRlcik9PT0hMD90aGlzLnJhZGl1cz1NYXRoLm1heCh0aGlzLnJhZGl1cyxlLnJhZGl1cyk6KGxoLnN1YlZlY3RvcnMoZS5jZW50ZXIsdGhpcy5jZW50ZXIpLnNldExlbmd0aChlLnJhZGl1cyksdGhpcy5leHBhbmRCeVBvaW50KGtzLmNvcHkoZS5jZW50ZXIpLmFkZChsaCkpLHRoaXMuZXhwYW5kQnlQb2ludChrcy5jb3B5KGUuY2VudGVyKS5zdWIobGgpKSksdGhpcyl9ZXF1YWxzKGUpe3JldHVybiBlLmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZlLnJhZGl1cz09PXRoaXMucmFkaXVzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y29uc3Qgbmk9bmV3IFAsY2g9bmV3IFAsZW89bmV3IFAsVGk9bmV3IFAsaGg9bmV3IFAsdG89bmV3IFAsdWg9bmV3IFA7Y2xhc3MgVXJ7Y29uc3RydWN0b3IoZT1uZXcgUCx0PW5ldyBQKDAsMCwtMSkpe3RoaXMub3JpZ2luPWUsdGhpcy5kaXJlY3Rpb249dH1zZXQoZSx0KXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weShlKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQpLHRoaXN9Y29weShlKXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weShlLm9yaWdpbiksdGhpcy5kaXJlY3Rpb24uY29weShlLmRpcmVjdGlvbiksdGhpc31hdChlLHQpe3JldHVybiB0LmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixlKX1sb29rQXQoZSl7cmV0dXJuIHRoaXMuZGlyZWN0aW9uLmNvcHkoZSkuc3ViKHRoaXMub3JpZ2luKS5ub3JtYWxpemUoKSx0aGlzfXJlY2FzdChlKXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KGUsbmkpKSx0aGlzfWNsb3Nlc3RQb2ludFRvUG9pbnQoZSx0KXt0LnN1YlZlY3RvcnMoZSx0aGlzLm9yaWdpbik7Y29uc3Qgbj10LmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIG48MD90LmNvcHkodGhpcy5vcmlnaW4pOnQuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLG4pfWRpc3RhbmNlVG9Qb2ludChlKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoZSkpfWRpc3RhbmNlU3FUb1BvaW50KGUpe2NvbnN0IHQ9bmkuc3ViVmVjdG9ycyhlLHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiB0PDA/dGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoZSk6KG5pLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbix0KSxuaS5kaXN0YW5jZVRvU3F1YXJlZChlKSl9ZGlzdGFuY2VTcVRvU2VnbWVudChlLHQsbixpKXtjaC5jb3B5KGUpLmFkZCh0KS5tdWx0aXBseVNjYWxhciguNSksZW8uY29weSh0KS5zdWIoZSkubm9ybWFsaXplKCksVGkuY29weSh0aGlzLm9yaWdpbikuc3ViKGNoKTtjb25zdCBzPWUuZGlzdGFuY2VUbyh0KSouNSxhPS10aGlzLmRpcmVjdGlvbi5kb3QoZW8pLG89VGkuZG90KHRoaXMuZGlyZWN0aW9uKSxsPS1UaS5kb3QoZW8pLGM9VGkubGVuZ3RoU3EoKSxoPU1hdGguYWJzKDEtYSphKTtsZXQgdSxmLGQscDtpZihoPjApaWYodT1hKmwtbyxmPWEqby1sLHA9cypoLHU+PTApaWYoZj49LXApaWYoZjw9cCl7Y29uc3QgXz0xL2g7dSo9XyxmKj1fLGQ9dSoodSthKmYrMipvKStmKihhKnUrZisyKmwpK2N9ZWxzZSBmPXMsdT1NYXRoLm1heCgwLC0oYSpmK28pKSxkPS11KnUrZiooZisyKmwpK2M7ZWxzZSBmPS1zLHU9TWF0aC5tYXgoMCwtKGEqZitvKSksZD0tdSp1K2YqKGYrMipsKStjO2Vsc2UgZjw9LXA/KHU9TWF0aC5tYXgoMCwtKC1hKnMrbykpLGY9dT4wPy1zOk1hdGgubWluKE1hdGgubWF4KC1zLC1sKSxzKSxkPS11KnUrZiooZisyKmwpK2MpOmY8PXA/KHU9MCxmPU1hdGgubWluKE1hdGgubWF4KC1zLC1sKSxzKSxkPWYqKGYrMipsKStjKToodT1NYXRoLm1heCgwLC0oYSpzK28pKSxmPXU+MD9zOk1hdGgubWluKE1hdGgubWF4KC1zLC1sKSxzKSxkPS11KnUrZiooZisyKmwpK2MpO2Vsc2UgZj1hPjA/LXM6cyx1PU1hdGgubWF4KDAsLShhKmYrbykpLGQ9LXUqdStmKihmKzIqbCkrYztyZXR1cm4gbiYmbi5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sdSksaSYmaS5jb3B5KGNoKS5hZGRTY2FsZWRWZWN0b3IoZW8sZiksZH1pbnRlcnNlY3RTcGhlcmUoZSx0KXtuaS5zdWJWZWN0b3JzKGUuY2VudGVyLHRoaXMub3JpZ2luKTtjb25zdCBuPW5pLmRvdCh0aGlzLmRpcmVjdGlvbiksaT1uaS5kb3QobmkpLW4qbixzPWUucmFkaXVzKmUucmFkaXVzO2lmKGk+cylyZXR1cm4gbnVsbDtjb25zdCBhPU1hdGguc3FydChzLWkpLG89bi1hLGw9bithO3JldHVybiBsPDA/bnVsbDpvPDA/dGhpcy5hdChsLHQpOnRoaXMuYXQobyx0KX1pbnRlcnNlY3RzU3BoZXJlKGUpe3JldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGUuY2VudGVyKTw9ZS5yYWRpdXMqZS5yYWRpdXN9ZGlzdGFuY2VUb1BsYW5lKGUpe2NvbnN0IHQ9ZS5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKTtpZih0PT09MClyZXR1cm4gZS5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPT09MD8wOm51bGw7Y29uc3Qgbj0tKHRoaXMub3JpZ2luLmRvdChlLm5vcm1hbCkrZS5jb25zdGFudCkvdDtyZXR1cm4gbj49MD9uOm51bGx9aW50ZXJzZWN0UGxhbmUoZSx0KXtjb25zdCBuPXRoaXMuZGlzdGFuY2VUb1BsYW5lKGUpO3JldHVybiBuPT09bnVsbD9udWxsOnRoaXMuYXQobix0KX1pbnRlcnNlY3RzUGxhbmUoZSl7Y29uc3QgdD1lLmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik7cmV0dXJuIHQ9PT0wfHxlLm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pKnQ8MH1pbnRlcnNlY3RCb3goZSx0KXtsZXQgbixpLHMsYSxvLGw7Y29uc3QgYz0xL3RoaXMuZGlyZWN0aW9uLngsaD0xL3RoaXMuZGlyZWN0aW9uLnksdT0xL3RoaXMuZGlyZWN0aW9uLnosZj10aGlzLm9yaWdpbjtyZXR1cm4gYz49MD8obj0oZS5taW4ueC1mLngpKmMsaT0oZS5tYXgueC1mLngpKmMpOihuPShlLm1heC54LWYueCkqYyxpPShlLm1pbi54LWYueCkqYyksaD49MD8ocz0oZS5taW4ueS1mLnkpKmgsYT0oZS5tYXgueS1mLnkpKmgpOihzPShlLm1heC55LWYueSkqaCxhPShlLm1pbi55LWYueSkqaCksbj5hfHxzPml8fCgocz5ufHxpc05hTihuKSkmJihuPXMpLChhPGl8fGlzTmFOKGkpKSYmKGk9YSksdT49MD8obz0oZS5taW4uei1mLnopKnUsbD0oZS5tYXguei1mLnopKnUpOihvPShlLm1heC56LWYueikqdSxsPShlLm1pbi56LWYueikqdSksbj5sfHxvPmkpfHwoKG8+bnx8biE9PW4pJiYobj1vKSwobDxpfHxpIT09aSkmJihpPWwpLGk8MCk/bnVsbDp0aGlzLmF0KG4+PTA/bjppLHQpfWludGVyc2VjdHNCb3goZSl7cmV0dXJuIHRoaXMuaW50ZXJzZWN0Qm94KGUsbmkpIT09bnVsbH1pbnRlcnNlY3RUcmlhbmdsZShlLHQsbixpLHMpe2hoLnN1YlZlY3RvcnModCxlKSx0by5zdWJWZWN0b3JzKG4sZSksdWguY3Jvc3NWZWN0b3JzKGhoLHRvKTtsZXQgYT10aGlzLmRpcmVjdGlvbi5kb3QodWgpLG87aWYoYT4wKXtpZihpKXJldHVybiBudWxsO289MX1lbHNlIGlmKGE8MClvPS0xLGE9LWE7ZWxzZSByZXR1cm4gbnVsbDtUaS5zdWJWZWN0b3JzKHRoaXMub3JpZ2luLGUpO2NvbnN0IGw9byp0aGlzLmRpcmVjdGlvbi5kb3QodG8uY3Jvc3NWZWN0b3JzKFRpLHRvKSk7aWYobDwwKXJldHVybiBudWxsO2NvbnN0IGM9byp0aGlzLmRpcmVjdGlvbi5kb3QoaGguY3Jvc3MoVGkpKTtpZihjPDB8fGwrYz5hKXJldHVybiBudWxsO2NvbnN0IGg9LW8qVGkuZG90KHVoKTtyZXR1cm4gaDwwP251bGw6dGhpcy5hdChoL2Escyl9YXBwbHlNYXRyaXg0KGUpe3JldHVybiB0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQoZSksdGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKGUpLHRoaXN9ZXF1YWxzKGUpe3JldHVybiBlLm9yaWdpbi5lcXVhbHModGhpcy5vcmlnaW4pJiZlLmRpcmVjdGlvbi5lcXVhbHModGhpcy5kaXJlY3Rpb24pfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y2xhc3MgSWV7Y29uc3RydWN0b3IoZSx0LG4saSxzLGEsbyxsLGMsaCx1LGYsZCxwLF8sZyl7SWUucHJvdG90eXBlLmlzTWF0cml4ND0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSxlIT09dm9pZCAwJiZ0aGlzLnNldChlLHQsbixpLHMsYSxvLGwsYyxoLHUsZixkLHAsXyxnKX1zZXQoZSx0LG4saSxzLGEsbyxsLGMsaCx1LGYsZCxwLF8sZyl7Y29uc3QgbT10aGlzLmVsZW1lbnRzO3JldHVybiBtWzBdPWUsbVs0XT10LG1bOF09bixtWzEyXT1pLG1bMV09cyxtWzVdPWEsbVs5XT1vLG1bMTNdPWwsbVsyXT1jLG1bNl09aCxtWzEwXT11LG1bMTRdPWYsbVszXT1kLG1bN109cCxtWzExXT1fLG1bMTVdPWcsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyBJZSgpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX1jb3B5KGUpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxuPWUuZWxlbWVudHM7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHRbM109blszXSx0WzRdPW5bNF0sdFs1XT1uWzVdLHRbNl09bls2XSx0WzddPW5bN10sdFs4XT1uWzhdLHRbOV09bls5XSx0WzEwXT1uWzEwXSx0WzExXT1uWzExXSx0WzEyXT1uWzEyXSx0WzEzXT1uWzEzXSx0WzE0XT1uWzE0XSx0WzE1XT1uWzE1XSx0aGlzfWNvcHlQb3NpdGlvbihlKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsbj1lLmVsZW1lbnRzO3JldHVybiB0WzEyXT1uWzEyXSx0WzEzXT1uWzEzXSx0WzE0XT1uWzE0XSx0aGlzfXNldEZyb21NYXRyaXgzKGUpe2NvbnN0IHQ9ZS5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQodFswXSx0WzNdLHRbNl0sMCx0WzFdLHRbNF0sdFs3XSwwLHRbMl0sdFs1XSx0WzhdLDAsMCwwLDAsMSksdGhpc31leHRyYWN0QmFzaXMoZSx0LG4pe3JldHVybiBlLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywwKSx0LnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywyKSx0aGlzfW1ha2VCYXNpcyhlLHQsbil7cmV0dXJuIHRoaXMuc2V0KGUueCx0Lngsbi54LDAsZS55LHQueSxuLnksMCxlLnosdC56LG4ueiwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdFJvdGF0aW9uKGUpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxuPWUuZWxlbWVudHMsaT0xL0RyLnNldEZyb21NYXRyaXhDb2x1bW4oZSwwKS5sZW5ndGgoKSxzPTEvRHIuc2V0RnJvbU1hdHJpeENvbHVtbihlLDEpLmxlbmd0aCgpLGE9MS9Eci5zZXRGcm9tTWF0cml4Q29sdW1uKGUsMikubGVuZ3RoKCk7cmV0dXJuIHRbMF09blswXSppLHRbMV09blsxXSppLHRbMl09blsyXSppLHRbM109MCx0WzRdPW5bNF0qcyx0WzVdPW5bNV0qcyx0WzZdPW5bNl0qcyx0WzddPTAsdFs4XT1uWzhdKmEsdFs5XT1uWzldKmEsdFsxMF09blsxMF0qYSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tRXVsZXIoZSl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLG49ZS54LGk9ZS55LHM9ZS56LGE9TWF0aC5jb3Mobiksbz1NYXRoLnNpbihuKSxsPU1hdGguY29zKGkpLGM9TWF0aC5zaW4oaSksaD1NYXRoLmNvcyhzKSx1PU1hdGguc2luKHMpO2lmKGUub3JkZXI9PT0iWFlaIil7Y29uc3QgZj1hKmgsZD1hKnUscD1vKmgsXz1vKnU7dFswXT1sKmgsdFs0XT0tbCp1LHRbOF09Yyx0WzFdPWQrcCpjLHRbNV09Zi1fKmMsdFs5XT0tbypsLHRbMl09Xy1mKmMsdFs2XT1wK2QqYyx0WzEwXT1hKmx9ZWxzZSBpZihlLm9yZGVyPT09IllYWiIpe2NvbnN0IGY9bCpoLGQ9bCp1LHA9YypoLF89Yyp1O3RbMF09ZitfKm8sdFs0XT1wKm8tZCx0WzhdPWEqYyx0WzFdPWEqdSx0WzVdPWEqaCx0WzldPS1vLHRbMl09ZCpvLXAsdFs2XT1fK2Yqbyx0WzEwXT1hKmx9ZWxzZSBpZihlLm9yZGVyPT09IlpYWSIpe2NvbnN0IGY9bCpoLGQ9bCp1LHA9YypoLF89Yyp1O3RbMF09Zi1fKm8sdFs0XT0tYSp1LHRbOF09cCtkKm8sdFsxXT1kK3Aqbyx0WzVdPWEqaCx0WzldPV8tZipvLHRbMl09LWEqYyx0WzZdPW8sdFsxMF09YSpsfWVsc2UgaWYoZS5vcmRlcj09PSJaWVgiKXtjb25zdCBmPWEqaCxkPWEqdSxwPW8qaCxfPW8qdTt0WzBdPWwqaCx0WzRdPXAqYy1kLHRbOF09ZipjK18sdFsxXT1sKnUsdFs1XT1fKmMrZix0WzldPWQqYy1wLHRbMl09LWMsdFs2XT1vKmwsdFsxMF09YSpsfWVsc2UgaWYoZS5vcmRlcj09PSJZWlgiKXtjb25zdCBmPWEqbCxkPWEqYyxwPW8qbCxfPW8qYzt0WzBdPWwqaCx0WzRdPV8tZip1LHRbOF09cCp1K2QsdFsxXT11LHRbNV09YSpoLHRbOV09LW8qaCx0WzJdPS1jKmgsdFs2XT1kKnUrcCx0WzEwXT1mLV8qdX1lbHNlIGlmKGUub3JkZXI9PT0iWFpZIil7Y29uc3QgZj1hKmwsZD1hKmMscD1vKmwsXz1vKmM7dFswXT1sKmgsdFs0XT0tdSx0WzhdPWMqaCx0WzFdPWYqdStfLHRbNV09YSpoLHRbOV09ZCp1LXAsdFsyXT1wKnUtZCx0WzZdPW8qaCx0WzEwXT1fKnUrZn1yZXR1cm4gdFszXT0wLHRbN109MCx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihlKXtyZXR1cm4gdGhpcy5jb21wb3NlKGx4LGUsY3gpfWxvb2tBdChlLHQsbil7Y29uc3QgaT10aGlzLmVsZW1lbnRzO3JldHVybiB4bi5zdWJWZWN0b3JzKGUsdCkseG4ubGVuZ3RoU3EoKT09PTAmJih4bi56PTEpLHhuLm5vcm1hbGl6ZSgpLENpLmNyb3NzVmVjdG9ycyhuLHhuKSxDaS5sZW5ndGhTcSgpPT09MCYmKE1hdGguYWJzKG4ueik9PT0xP3huLngrPTFlLTQ6eG4ueis9MWUtNCx4bi5ub3JtYWxpemUoKSxDaS5jcm9zc1ZlY3RvcnMobix4bikpLENpLm5vcm1hbGl6ZSgpLG5vLmNyb3NzVmVjdG9ycyh4bixDaSksaVswXT1DaS54LGlbNF09bm8ueCxpWzhdPXhuLngsaVsxXT1DaS55LGlbNV09bm8ueSxpWzldPXhuLnksaVsyXT1DaS56LGlbNl09bm8ueixpWzEwXT14bi56LHRoaXN9bXVsdGlwbHkoZSl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLGUpfXByZW11bHRpcGx5KGUpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoZSx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKGUsdCl7Y29uc3Qgbj1lLmVsZW1lbnRzLGk9dC5lbGVtZW50cyxzPXRoaXMuZWxlbWVudHMsYT1uWzBdLG89bls0XSxsPW5bOF0sYz1uWzEyXSxoPW5bMV0sdT1uWzVdLGY9bls5XSxkPW5bMTNdLHA9blsyXSxfPW5bNl0sZz1uWzEwXSxtPW5bMTRdLHk9blszXSx4PW5bN10sdj1uWzExXSxTPW5bMTVdLGI9aVswXSxBPWlbNF0sTD1pWzhdLE09aVsxMl0sdz1pWzFdLFI9aVs1XSxOPWlbOV0sQj1pWzEzXSxJPWlbMl0sVT1pWzZdLHo9aVsxMF0sRj1pWzE0XSxaPWlbM10sVj1pWzddLFE9aVsxMV0sbmU9aVsxNV07cmV0dXJuIHNbMF09YSpiK28qdytsKkkrYypaLHNbNF09YSpBK28qUitsKlUrYypWLHNbOF09YSpMK28qTitsKnorYypRLHNbMTJdPWEqTStvKkIrbCpGK2MqbmUsc1sxXT1oKmIrdSp3K2YqSStkKlosc1s1XT1oKkErdSpSK2YqVStkKlYsc1s5XT1oKkwrdSpOK2YqeitkKlEsc1sxM109aCpNK3UqQitmKkYrZCpuZSxzWzJdPXAqYitfKncrZypJK20qWixzWzZdPXAqQStfKlIrZypVK20qVixzWzEwXT1wKkwrXypOK2cqeittKlEsc1sxNF09cCpNK18qQitnKkYrbSpuZSxzWzNdPXkqYit4KncrdipJK1MqWixzWzddPXkqQSt4KlIrdipVK1MqVixzWzExXT15KkwreCpOK3YqeitTKlEsc1sxNV09eSpNK3gqQit2KkYrUypuZSx0aGlzfW11bHRpcGx5U2NhbGFyKGUpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztyZXR1cm4gdFswXSo9ZSx0WzRdKj1lLHRbOF0qPWUsdFsxMl0qPWUsdFsxXSo9ZSx0WzVdKj1lLHRbOV0qPWUsdFsxM10qPWUsdFsyXSo9ZSx0WzZdKj1lLHRbMTBdKj1lLHRbMTRdKj1lLHRbM10qPWUsdFs3XSo9ZSx0WzExXSo9ZSx0WzE1XSo9ZSx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHQ9ZVswXSxuPWVbNF0saT1lWzhdLHM9ZVsxMl0sYT1lWzFdLG89ZVs1XSxsPWVbOV0sYz1lWzEzXSxoPWVbMl0sdT1lWzZdLGY9ZVsxMF0sZD1lWzE0XSxwPWVbM10sXz1lWzddLGc9ZVsxMV0sbT1lWzE1XTtyZXR1cm4gcCooK3MqbCp1LWkqYyp1LXMqbypmK24qYypmK2kqbypkLW4qbCpkKStfKigrdCpsKmQtdCpjKmYrcyphKmYtaSphKmQraSpjKmgtcypsKmgpK2cqKCt0KmMqdS10Km8qZC1zKmEqdStuKmEqZCtzKm8qaC1uKmMqaCkrbSooLWkqbypoLXQqbCp1K3QqbypmK2kqYSp1LW4qYSpmK24qbCpoKX10cmFuc3Bvc2UoKXtjb25zdCBlPXRoaXMuZWxlbWVudHM7bGV0IHQ7cmV0dXJuIHQ9ZVsxXSxlWzFdPWVbNF0sZVs0XT10LHQ9ZVsyXSxlWzJdPWVbOF0sZVs4XT10LHQ9ZVs2XSxlWzZdPWVbOV0sZVs5XT10LHQ9ZVszXSxlWzNdPWVbMTJdLGVbMTJdPXQsdD1lWzddLGVbN109ZVsxM10sZVsxM109dCx0PWVbMTFdLGVbMTFdPWVbMTRdLGVbMTRdPXQsdGhpc31zZXRQb3NpdGlvbihlLHQsbil7Y29uc3QgaT10aGlzLmVsZW1lbnRzO3JldHVybiBlLmlzVmVjdG9yMz8oaVsxMl09ZS54LGlbMTNdPWUueSxpWzE0XT1lLnopOihpWzEyXT1lLGlbMTNdPXQsaVsxNF09biksdGhpc31pbnZlcnQoKXtjb25zdCBlPXRoaXMuZWxlbWVudHMsdD1lWzBdLG49ZVsxXSxpPWVbMl0scz1lWzNdLGE9ZVs0XSxvPWVbNV0sbD1lWzZdLGM9ZVs3XSxoPWVbOF0sdT1lWzldLGY9ZVsxMF0sZD1lWzExXSxwPWVbMTJdLF89ZVsxM10sZz1lWzE0XSxtPWVbMTVdLHk9dSpnKmMtXypmKmMrXypsKmQtbypnKmQtdSpsKm0rbypmKm0seD1wKmYqYy1oKmcqYy1wKmwqZCthKmcqZCtoKmwqbS1hKmYqbSx2PWgqXypjLXAqdSpjK3AqbypkLWEqXypkLWgqbyptK2EqdSptLFM9cCp1KmwtaCpfKmwtcCpvKmYrYSpfKmYraCpvKmctYSp1KmcsYj10Knkrbip4K2kqditzKlM7aWYoYj09PTApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IEE9MS9iO3JldHVybiBlWzBdPXkqQSxlWzFdPShfKmYqcy11Kmcqcy1fKmkqZCtuKmcqZCt1KmkqbS1uKmYqbSkqQSxlWzJdPShvKmcqcy1fKmwqcytfKmkqYy1uKmcqYy1vKmkqbStuKmwqbSkqQSxlWzNdPSh1Kmwqcy1vKmYqcy11KmkqYytuKmYqYytvKmkqZC1uKmwqZCkqQSxlWzRdPXgqQSxlWzVdPShoKmcqcy1wKmYqcytwKmkqZC10KmcqZC1oKmkqbSt0KmYqbSkqQSxlWzZdPShwKmwqcy1hKmcqcy1wKmkqYyt0KmcqYythKmkqbS10KmwqbSkqQSxlWzddPShhKmYqcy1oKmwqcytoKmkqYy10KmYqYy1hKmkqZCt0KmwqZCkqQSxlWzhdPXYqQSxlWzldPShwKnUqcy1oKl8qcy1wKm4qZCt0Kl8qZCtoKm4qbS10KnUqbSkqQSxlWzEwXT0oYSpfKnMtcCpvKnMrcCpuKmMtdCpfKmMtYSpuKm0rdCpvKm0pKkEsZVsxMV09KGgqbypzLWEqdSpzLWgqbipjK3QqdSpjK2EqbipkLXQqbypkKSpBLGVbMTJdPVMqQSxlWzEzXT0oaCpfKmktcCp1KmkrcCpuKmYtdCpfKmYtaCpuKmcrdCp1KmcpKkEsZVsxNF09KHAqbyppLWEqXyppLXAqbipsK3QqXypsK2EqbipnLXQqbypnKSpBLGVbMTVdPShhKnUqaS1oKm8qaStoKm4qbC10KnUqbC1hKm4qZit0Km8qZikqQSx0aGlzfXNjYWxlKGUpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxuPWUueCxpPWUueSxzPWUuejtyZXR1cm4gdFswXSo9bix0WzRdKj1pLHRbOF0qPXMsdFsxXSo9bix0WzVdKj1pLHRbOV0qPXMsdFsyXSo9bix0WzZdKj1pLHRbMTBdKj1zLHRbM10qPW4sdFs3XSo9aSx0WzExXSo9cyx0aGlzfWdldE1heFNjYWxlT25BeGlzKCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHQ9ZVswXSplWzBdK2VbMV0qZVsxXStlWzJdKmVbMl0sbj1lWzRdKmVbNF0rZVs1XSplWzVdK2VbNl0qZVs2XSxpPWVbOF0qZVs4XStlWzldKmVbOV0rZVsxMF0qZVsxMF07cmV0dXJuIE1hdGguc3FydChNYXRoLm1heCh0LG4saSkpfW1ha2VUcmFuc2xhdGlvbihlLHQsbil7cmV0dXJuIGUuaXNWZWN0b3IzP3RoaXMuc2V0KDEsMCwwLGUueCwwLDEsMCxlLnksMCwwLDEsZS56LDAsMCwwLDEpOnRoaXMuc2V0KDEsMCwwLGUsMCwxLDAsdCwwLDAsMSxuLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWChlKXtjb25zdCB0PU1hdGguY29zKGUpLG49TWF0aC5zaW4oZSk7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCx0LC1uLDAsMCxuLHQsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblkoZSl7Y29uc3QgdD1NYXRoLmNvcyhlKSxuPU1hdGguc2luKGUpO3JldHVybiB0aGlzLnNldCh0LDAsbiwwLDAsMSwwLDAsLW4sMCx0LDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25aKGUpe2NvbnN0IHQ9TWF0aC5jb3MoZSksbj1NYXRoLnNpbihlKTtyZXR1cm4gdGhpcy5zZXQodCwtbiwwLDAsbix0LDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uQXhpcyhlLHQpe2NvbnN0IG49TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KSxzPTEtbixhPWUueCxvPWUueSxsPWUueixjPXMqYSxoPXMqbztyZXR1cm4gdGhpcy5zZXQoYyphK24sYypvLWkqbCxjKmwraSpvLDAsYypvK2kqbCxoKm8rbixoKmwtaSphLDAsYypsLWkqbyxoKmwraSphLHMqbCpsK24sMCwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZShlLHQsbil7cmV0dXJuIHRoaXMuc2V0KGUsMCwwLDAsMCx0LDAsMCwwLDAsbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNoZWFyKGUsdCxuLGkscyxhKXtyZXR1cm4gdGhpcy5zZXQoMSxuLHMsMCxlLDEsYSwwLHQsaSwxLDAsMCwwLDAsMSksdGhpc31jb21wb3NlKGUsdCxuKXtjb25zdCBpPXRoaXMuZWxlbWVudHMscz10Ll94LGE9dC5feSxvPXQuX3osbD10Ll93LGM9cytzLGg9YSthLHU9bytvLGY9cypjLGQ9cypoLHA9cyp1LF89YSpoLGc9YSp1LG09byp1LHk9bCpjLHg9bCpoLHY9bCp1LFM9bi54LGI9bi55LEE9bi56O3JldHVybiBpWzBdPSgxLShfK20pKSpTLGlbMV09KGQrdikqUyxpWzJdPShwLXgpKlMsaVszXT0wLGlbNF09KGQtdikqYixpWzVdPSgxLShmK20pKSpiLGlbNl09KGcreSkqYixpWzddPTAsaVs4XT0ocCt4KSpBLGlbOV09KGcteSkqQSxpWzEwXT0oMS0oZitfKSkqQSxpWzExXT0wLGlbMTJdPWUueCxpWzEzXT1lLnksaVsxNF09ZS56LGlbMTVdPTEsdGhpc31kZWNvbXBvc2UoZSx0LG4pe2NvbnN0IGk9dGhpcy5lbGVtZW50cztsZXQgcz1Eci5zZXQoaVswXSxpWzFdLGlbMl0pLmxlbmd0aCgpO2NvbnN0IGE9RHIuc2V0KGlbNF0saVs1XSxpWzZdKS5sZW5ndGgoKSxvPURyLnNldChpWzhdLGlbOV0saVsxMF0pLmxlbmd0aCgpO3RoaXMuZGV0ZXJtaW5hbnQoKTwwJiYocz0tcyksZS54PWlbMTJdLGUueT1pWzEzXSxlLno9aVsxNF0sVW4uY29weSh0aGlzKTtjb25zdCBjPTEvcyxoPTEvYSx1PTEvbztyZXR1cm4gVW4uZWxlbWVudHNbMF0qPWMsVW4uZWxlbWVudHNbMV0qPWMsVW4uZWxlbWVudHNbMl0qPWMsVW4uZWxlbWVudHNbNF0qPWgsVW4uZWxlbWVudHNbNV0qPWgsVW4uZWxlbWVudHNbNl0qPWgsVW4uZWxlbWVudHNbOF0qPXUsVW4uZWxlbWVudHNbOV0qPXUsVW4uZWxlbWVudHNbMTBdKj11LHQuc2V0RnJvbVJvdGF0aW9uTWF0cml4KFVuKSxuLng9cyxuLnk9YSxuLno9byx0aGlzfW1ha2VQZXJzcGVjdGl2ZShlLHQsbixpLHMsYSxvPVBuKXtjb25zdCBsPXRoaXMuZWxlbWVudHMsYz0yKnMvKHQtZSksaD0yKnMvKG4taSksdT0odCtlKS8odC1lKSxmPShuK2kpLyhuLWkpO2xldCBkLHA7aWYobz09PVBuKWQ9LShhK3MpLyhhLXMpLHA9LTIqYSpzLyhhLXMpO2Vsc2UgaWYobz09PUVyKWQ9LWEvKGEtcykscD0tYSpzLyhhLXMpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK28pO3JldHVybiBsWzBdPWMsbFs0XT0wLGxbOF09dSxsWzEyXT0wLGxbMV09MCxsWzVdPWgsbFs5XT1mLGxbMTNdPTAsbFsyXT0wLGxbNl09MCxsWzEwXT1kLGxbMTRdPXAsbFszXT0wLGxbN109MCxsWzExXT0tMSxsWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyhlLHQsbixpLHMsYSxvPVBuKXtjb25zdCBsPXRoaXMuZWxlbWVudHMsYz0xLyh0LWUpLGg9MS8obi1pKSx1PTEvKGEtcyksZj0odCtlKSpjLGQ9KG4raSkqaDtsZXQgcCxfO2lmKG89PT1QbilwPShhK3MpKnUsXz0tMip1O2Vsc2UgaWYobz09PUVyKXA9cyp1LF89LTEqdTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlT3J0aG9ncmFwaGljKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrbyk7cmV0dXJuIGxbMF09MipjLGxbNF09MCxsWzhdPTAsbFsxMl09LWYsbFsxXT0wLGxbNV09MipoLGxbOV09MCxsWzEzXT0tZCxsWzJdPTAsbFs2XT0wLGxbMTBdPV8sbFsxNF09LXAsbFszXT0wLGxbN109MCxsWzExXT0wLGxbMTVdPTEsdGhpc31lcXVhbHMoZSl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLG49ZS5lbGVtZW50cztmb3IobGV0IGk9MDtpPDE2O2krKylpZih0W2ldIT09bltpXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkoZSx0PTApe2ZvcihsZXQgbj0wO248MTY7bisrKXRoaXMuZWxlbWVudHNbbl09ZVtuK3RdO3JldHVybiB0aGlzfXRvQXJyYXkoZT1bXSx0PTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gZVt0XT1uWzBdLGVbdCsxXT1uWzFdLGVbdCsyXT1uWzJdLGVbdCszXT1uWzNdLGVbdCs0XT1uWzRdLGVbdCs1XT1uWzVdLGVbdCs2XT1uWzZdLGVbdCs3XT1uWzddLGVbdCs4XT1uWzhdLGVbdCs5XT1uWzldLGVbdCsxMF09blsxMF0sZVt0KzExXT1uWzExXSxlW3QrMTJdPW5bMTJdLGVbdCsxM109blsxM10sZVt0KzE0XT1uWzE0XSxlW3QrMTVdPW5bMTVdLGV9fWNvbnN0IERyPW5ldyBQLFVuPW5ldyBJZSxseD1uZXcgUCgwLDAsMCksY3g9bmV3IFAoMSwxLDEpLENpPW5ldyBQLG5vPW5ldyBQLHhuPW5ldyBQLExkPW5ldyBJZSxJZD1uZXcgbG47Y2xhc3MgR3N7Y29uc3RydWN0b3IoZT0wLHQ9MCxuPTAsaT1Hcy5ERUZBVUxUX09SREVSKXt0aGlzLmlzRXVsZXI9ITAsdGhpcy5feD1lLHRoaXMuX3k9dCx0aGlzLl96PW4sdGhpcy5fb3JkZXI9aX1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KGUpe3RoaXMuX3g9ZSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeShlKXt0aGlzLl95PWUsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHooZSl7dGhpcy5fej1lLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgb3JkZXIoKXtyZXR1cm4gdGhpcy5fb3JkZXJ9c2V0IG9yZGVyKGUpe3RoaXMuX29yZGVyPWUsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldChlLHQsbixpPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5feD1lLHRoaXMuX3k9dCx0aGlzLl96PW4sdGhpcy5fb3JkZXI9aSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9Y29weShlKXtyZXR1cm4gdGhpcy5feD1lLl94LHRoaXMuX3k9ZS5feSx0aGlzLl96PWUuX3osdGhpcy5fb3JkZXI9ZS5fb3JkZXIsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KGUsdD10aGlzLl9vcmRlcixuPSEwKXtjb25zdCBpPWUuZWxlbWVudHMscz1pWzBdLGE9aVs0XSxvPWlbOF0sbD1pWzFdLGM9aVs1XSxoPWlbOV0sdT1pWzJdLGY9aVs2XSxkPWlbMTBdO3N3aXRjaCh0KXtjYXNlIlhZWiI6dGhpcy5feT1NYXRoLmFzaW4oX3QobywtMSwxKSksTWF0aC5hYnMobyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxkKSx0aGlzLl96PU1hdGguYXRhbjIoLWEscykpOih0aGlzLl94PU1hdGguYXRhbjIoZixjKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PU1hdGguYXNpbigtX3QoaCwtMSwxKSksTWF0aC5hYnMoaCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihvLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihsLGMpKToodGhpcy5feT1NYXRoLmF0YW4yKC11LHMpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKF90KGYsLTEsMSkpLE1hdGguYWJzKGYpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIoLXUsZCksdGhpcy5fej1NYXRoLmF0YW4yKC1hLGMpKToodGhpcy5feT0wLHRoaXMuX3o9TWF0aC5hdGFuMihsLHMpKTticmVhaztjYXNlIlpZWCI6dGhpcy5feT1NYXRoLmFzaW4oLV90KHUsLTEsMSkpLE1hdGguYWJzKHUpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZixkKSx0aGlzLl96PU1hdGguYXRhbjIobCxzKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLWEsYykpO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl96PU1hdGguYXNpbihfdChsLC0xLDEpKSxNYXRoLmFicyhsKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1oLGMpLHRoaXMuX3k9TWF0aC5hdGFuMigtdSxzKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIobyxkKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC1fdChhLC0xLDEpKSxNYXRoLmFicyhhKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGYsYyksdGhpcy5feT1NYXRoLmF0YW4yKG8scykpOih0aGlzLl94PU1hdGguYXRhbjIoLWgsZCksdGhpcy5feT0wKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK3QpfXJldHVybiB0aGlzLl9vcmRlcj10LG49PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVF1YXRlcm5pb24oZSx0LG4pe3JldHVybiBMZC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihlKSx0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeChMZCx0LG4pfXNldEZyb21WZWN0b3IzKGUsdD10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuc2V0KGUueCxlLnksZS56LHQpfXJlb3JkZXIoZSl7cmV0dXJuIElkLnNldEZyb21FdWxlcih0aGlzKSx0aGlzLnNldEZyb21RdWF0ZXJuaW9uKElkLGUpfWVxdWFscyhlKXtyZXR1cm4gZS5feD09PXRoaXMuX3gmJmUuX3k9PT10aGlzLl95JiZlLl96PT09dGhpcy5feiYmZS5fb3JkZXI9PT10aGlzLl9vcmRlcn1mcm9tQXJyYXkoZSl7cmV0dXJuIHRoaXMuX3g9ZVswXSx0aGlzLl95PWVbMV0sdGhpcy5fej1lWzJdLGVbM10hPT12b2lkIDAmJih0aGlzLl9vcmRlcj1lWzNdKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KGU9W10sdD0wKXtyZXR1cm4gZVt0XT10aGlzLl94LGVbdCsxXT10aGlzLl95LGVbdCsyXT10aGlzLl96LGVbdCszXT10aGlzLl9vcmRlcixlfV9vbkNoYW5nZShlKXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz1lLHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fb3JkZXJ9fUdzLkRFRkFVTFRfT1JERVI9IlhZWiI7Y2xhc3MgaW97Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQoZSl7dGhpcy5tYXNrPSgxPDxlfDApPj4+MH1lbmFibGUoZSl7dGhpcy5tYXNrfD0xPDxlfDB9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZShlKXt0aGlzLm1hc2tePTE8PGV8MH1kaXNhYmxlKGUpe3RoaXMubWFzayY9figxPDxlfDApfWRpc2FibGVBbGwoKXt0aGlzLm1hc2s9MH10ZXN0KGUpe3JldHVybih0aGlzLm1hc2smZS5tYXNrKSE9PTB9aXNFbmFibGVkKGUpe3JldHVybih0aGlzLm1hc2smKDE8PGV8MCkpIT09MH19bGV0IGh4PTA7Y29uc3QgVWQ9bmV3IFAsTnI9bmV3IGxuLGlpPW5ldyBJZSxybz1uZXcgUCxWcz1uZXcgUCx1eD1uZXcgUCxmeD1uZXcgbG4sRGQ9bmV3IFAoMSwwLDApLE5kPW5ldyBQKDAsMSwwKSxGZD1uZXcgUCgwLDAsMSksZHg9e3R5cGU6ImFkZGVkIn0scHg9e3R5cGU6InJlbW92ZWQifTtjbGFzcyBydCBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzT2JqZWN0M0Q9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6aHgrK30pLHRoaXMudXVpZD1fbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik9iamVjdDNEIix0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49W10sdGhpcy51cD1ydC5ERUZBVUxUX1VQLmNsb25lKCk7Y29uc3QgZT1uZXcgUCx0PW5ldyBHcyxuPW5ldyBsbixpPW5ldyBQKDEsMSwxKTtmdW5jdGlvbiBzKCl7bi5zZXRGcm9tRXVsZXIodCwhMSl9ZnVuY3Rpb24gYSgpe3Quc2V0RnJvbVF1YXRlcm5pb24obix2b2lkIDAsITEpfXQuX29uQ2hhbmdlKHMpLG4uX29uQ2hhbmdlKGEpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplfSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dH0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bn0sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOml9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IEllfSxub3JtYWxNYXRyaXg6e3ZhbHVlOm5ldyBaZX19KSx0aGlzLm1hdHJpeD1uZXcgSWUsdGhpcy5tYXRyaXhXb3JsZD1uZXcgSWUsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXJ0LkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPXJ0LkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0aGlzLmxheWVycz1uZXcgaW8sdGhpcy52aXNpYmxlPSEwLHRoaXMuY2FzdFNoYWRvdz0hMSx0aGlzLnJlY2VpdmVTaGFkb3c9ITEsdGhpcy5mcnVzdHVtQ3VsbGVkPSEwLHRoaXMucmVuZGVyT3JkZXI9MCx0aGlzLmFuaW1hdGlvbnM9W10sdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVNoYWRvdygpe31vbkFmdGVyU2hhZG93KCl7fW9uQmVmb3JlUmVuZGVyKCl7fW9uQWZ0ZXJSZW5kZXIoKXt9YXBwbHlNYXRyaXg0KGUpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeC5wcmVtdWx0aXBseShlKSx0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9YXBwbHlRdWF0ZXJuaW9uKGUpe3JldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoZSksdGhpc31zZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUoZSx0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShlLHQpfXNldFJvdGF0aW9uRnJvbUV1bGVyKGUpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoZSwhMCl9c2V0Um90YXRpb25Gcm9tTWF0cml4KGUpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoZSl9c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbihlKXt0aGlzLnF1YXRlcm5pb24uY29weShlKX1yb3RhdGVPbkF4aXMoZSx0KXtyZXR1cm4gTnIuc2V0RnJvbUF4aXNBbmdsZShlLHQpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShOciksdGhpc31yb3RhdGVPbldvcmxkQXhpcyhlLHQpe3JldHVybiBOci5zZXRGcm9tQXhpc0FuZ2xlKGUsdCksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KE5yKSx0aGlzfXJvdGF0ZVgoZSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKERkLGUpfXJvdGF0ZVkoZSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKE5kLGUpfXJvdGF0ZVooZSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKEZkLGUpfXRyYW5zbGF0ZU9uQXhpcyhlLHQpe3JldHVybiBVZC5jb3B5KGUpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKFVkLm11bHRpcGx5U2NhbGFyKHQpKSx0aGlzfXRyYW5zbGF0ZVgoZSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKERkLGUpfXRyYW5zbGF0ZVkoZSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKE5kLGUpfXRyYW5zbGF0ZVooZSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKEZkLGUpfWxvY2FsVG9Xb3JsZChlKXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksZS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9d29ybGRUb0xvY2FsKGUpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxlLmFwcGx5TWF0cml4NChpaS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQoZSx0LG4pe2UuaXNWZWN0b3IzP3JvLmNvcHkoZSk6cm8uc2V0KGUsdCxuKTtjb25zdCBpPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFZzLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/aWkubG9va0F0KFZzLHJvLHRoaXMudXApOmlpLmxvb2tBdChybyxWcyx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KGlpKSxpJiYoaWkuZXh0cmFjdFJvdGF0aW9uKGkubWF0cml4V29ybGQpLE5yLnNldEZyb21Sb3RhdGlvbk1hdHJpeChpaSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KE5yLmludmVydCgpKSl9YWRkKGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCB0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl0aGlzLmFkZChhcmd1bWVudHNbdF0pO3JldHVybiB0aGlzfXJldHVybiBlPT09dGhpcz8oY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIixlKSx0aGlzKTooZSYmZS5pc09iamVjdDNEPyhlLnBhcmVudCE9PW51bGwmJmUucGFyZW50LnJlbW92ZShlKSxlLnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaChlKSxlLmRpc3BhdGNoRXZlbnQoZHgpKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIixlKSx0aGlzKX1yZW1vdmUoZSl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1tuXSk7cmV0dXJuIHRoaXN9Y29uc3QgdD10aGlzLmNoaWxkcmVuLmluZGV4T2YoZSk7cmV0dXJuIHQhPT0tMSYmKGUucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbi5zcGxpY2UodCwxKSxlLmRpc3BhdGNoRXZlbnQocHgpKSx0aGlzfXJlbW92ZUZyb21QYXJlbnQoKXtjb25zdCBlPXRoaXMucGFyZW50O3JldHVybiBlIT09bnVsbCYmZS5yZW1vdmUodGhpcyksdGhpc31jbGVhcigpe3JldHVybiB0aGlzLnJlbW92ZSguLi50aGlzLmNoaWxkcmVuKX1hdHRhY2goZSl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGlpLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksZS5wYXJlbnQhPT1udWxsJiYoZS5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGlpLm11bHRpcGx5KGUucGFyZW50Lm1hdHJpeFdvcmxkKSksZS5hcHBseU1hdHJpeDQoaWkpLHRoaXMuYWRkKGUpLGUudXBkYXRlV29ybGRNYXRyaXgoITEsITApLHRoaXN9Z2V0T2JqZWN0QnlJZChlKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsZSl9Z2V0T2JqZWN0QnlOYW1lKGUpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoIm5hbWUiLGUpfWdldE9iamVjdEJ5UHJvcGVydHkoZSx0KXtpZih0aGlzW2VdPT09dClyZXR1cm4gdGhpcztmb3IobGV0IG49MCxpPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO248aTtuKyspe2NvbnN0IGE9dGhpcy5jaGlsZHJlbltuXS5nZXRPYmplY3RCeVByb3BlcnR5KGUsdCk7aWYoYSE9PXZvaWQgMClyZXR1cm4gYX19Z2V0T2JqZWN0c0J5UHJvcGVydHkoZSx0LG49W10pe3RoaXNbZV09PT10JiZuLnB1c2godGhpcyk7Y29uc3QgaT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcz0wLGE9aS5sZW5ndGg7czxhO3MrKylpW3NdLmdldE9iamVjdHNCeVByb3BlcnR5KGUsdCxuKTtyZXR1cm4gbn1nZXRXb3JsZFBvc2l0aW9uKGUpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxlLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKX1nZXRXb3JsZFF1YXRlcm5pb24oZSl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKFZzLGUsdXgpLGV9Z2V0V29ybGRTY2FsZShlKXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoVnMsZngsZSksZX1nZXRXb3JsZERpcmVjdGlvbihlKXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtjb25zdCB0PXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIGUuc2V0KHRbOF0sdFs5XSx0WzEwXSkubm9ybWFsaXplKCl9cmF5Y2FzdCgpe310cmF2ZXJzZShlKXtlKHRoaXMpO2NvbnN0IHQ9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxpPXQubGVuZ3RoO248aTtuKyspdFtuXS50cmF2ZXJzZShlKX10cmF2ZXJzZVZpc2libGUoZSl7aWYodGhpcy52aXNpYmxlPT09ITEpcmV0dXJuO2UodGhpcyk7Y29uc3QgdD10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKyl0W25dLnRyYXZlcnNlVmlzaWJsZShlKX10cmF2ZXJzZUFuY2VzdG9ycyhlKXtjb25zdCB0PXRoaXMucGFyZW50O3QhPT1udWxsJiYoZSh0KSx0LnRyYXZlcnNlQW5jZXN0b3JzKGUpKX11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH11cGRhdGVNYXRyaXhXb3JsZChlKXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8ZSkmJih0aGlzLnBhcmVudD09PW51bGw/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSxlPSEwKTtjb25zdCB0PXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKXtjb25zdCBzPXRbbl07KHMubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITB8fGU9PT0hMCkmJnMudXBkYXRlTWF0cml4V29ybGQoZSl9fXVwZGF0ZVdvcmxkTWF0cml4KGUsdCl7Y29uc3Qgbj10aGlzLnBhcmVudDtpZihlPT09ITAmJm4hPT1udWxsJiZuLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiZuLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5wYXJlbnQ9PT1udWxsP3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSx0PT09ITApe2NvbnN0IGk9dGhpcy5jaGlsZHJlbjtmb3IobGV0IHM9MCxhPWkubGVuZ3RoO3M8YTtzKyspe2NvbnN0IG89aVtzXTtvLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiZvLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19fXRvSlNPTihlKXtjb25zdCB0PWU9PT12b2lkIDB8fHR5cGVvZiBlPT0ic3RyaW5nIixuPXt9O3QmJihlPXtnZW9tZXRyaWVzOnt9LG1hdGVyaWFsczp7fSx0ZXh0dXJlczp7fSxpbWFnZXM6e30sc2hhcGVzOnt9LHNrZWxldG9uczp7fSxhbmltYXRpb25zOnt9LG5vZGVzOnt9fSxuLm1ldGFkYXRhPXt2ZXJzaW9uOjQuNix0eXBlOiJPYmplY3QiLGdlbmVyYXRvcjoiT2JqZWN0M0QudG9KU09OIn0pO2NvbnN0IGk9e307aS51dWlkPXRoaXMudXVpZCxpLnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYoaS5uYW1lPXRoaXMubmFtZSksdGhpcy5jYXN0U2hhZG93PT09ITAmJihpLmNhc3RTaGFkb3c9ITApLHRoaXMucmVjZWl2ZVNoYWRvdz09PSEwJiYoaS5yZWNlaXZlU2hhZG93PSEwKSx0aGlzLnZpc2libGU9PT0hMSYmKGkudmlzaWJsZT0hMSksdGhpcy5mcnVzdHVtQ3VsbGVkPT09ITEmJihpLmZydXN0dW1DdWxsZWQ9ITEpLHRoaXMucmVuZGVyT3JkZXIhPT0wJiYoaS5yZW5kZXJPcmRlcj10aGlzLnJlbmRlck9yZGVyKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKGkudXNlckRhdGE9dGhpcy51c2VyRGF0YSksaS5sYXllcnM9dGhpcy5sYXllcnMubWFzayxpLm1hdHJpeD10aGlzLm1hdHJpeC50b0FycmF5KCksaS51cD10aGlzLnVwLnRvQXJyYXkoKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9PT0hMSYmKGkubWF0cml4QXV0b1VwZGF0ZT0hMSksdGhpcy5pc0luc3RhbmNlZE1lc2gmJihpLnR5cGU9Ikluc3RhbmNlZE1lc2giLGkuY291bnQ9dGhpcy5jb3VudCxpLmluc3RhbmNlTWF0cml4PXRoaXMuaW5zdGFuY2VNYXRyaXgudG9KU09OKCksdGhpcy5pbnN0YW5jZUNvbG9yIT09bnVsbCYmKGkuaW5zdGFuY2VDb2xvcj10aGlzLmluc3RhbmNlQ29sb3IudG9KU09OKCkpKSx0aGlzLmlzQmF0Y2hlZE1lc2gmJihpLnR5cGU9IkJhdGNoZWRNZXNoIixpLnBlck9iamVjdEZydXN0dW1DdWxsZWQ9dGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkLGkuc29ydE9iamVjdHM9dGhpcy5zb3J0T2JqZWN0cyxpLmRyYXdSYW5nZXM9dGhpcy5fZHJhd1JhbmdlcyxpLnJlc2VydmVkUmFuZ2VzPXRoaXMuX3Jlc2VydmVkUmFuZ2VzLGkudmlzaWJpbGl0eT10aGlzLl92aXNpYmlsaXR5LGkuYWN0aXZlPXRoaXMuX2FjdGl2ZSxpLmJvdW5kcz10aGlzLl9ib3VuZHMubWFwKG89Pih7Ym94SW5pdGlhbGl6ZWQ6by5ib3hJbml0aWFsaXplZCxib3hNaW46by5ib3gubWluLnRvQXJyYXkoKSxib3hNYXg6by5ib3gubWF4LnRvQXJyYXkoKSxzcGhlcmVJbml0aWFsaXplZDpvLnNwaGVyZUluaXRpYWxpemVkLHNwaGVyZVJhZGl1czpvLnNwaGVyZS5yYWRpdXMsc3BoZXJlQ2VudGVyOm8uc3BoZXJlLmNlbnRlci50b0FycmF5KCl9KSksaS5tYXhHZW9tZXRyeUNvdW50PXRoaXMuX21heEdlb21ldHJ5Q291bnQsaS5tYXhWZXJ0ZXhDb3VudD10aGlzLl9tYXhWZXJ0ZXhDb3VudCxpLm1heEluZGV4Q291bnQ9dGhpcy5fbWF4SW5kZXhDb3VudCxpLmdlb21ldHJ5SW5pdGlhbGl6ZWQ9dGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCxpLmdlb21ldHJ5Q291bnQ9dGhpcy5fZ2VvbWV0cnlDb3VudCxpLm1hdHJpY2VzVGV4dHVyZT10aGlzLl9tYXRyaWNlc1RleHR1cmUudG9KU09OKGUpLHRoaXMuYm91bmRpbmdTcGhlcmUhPT1udWxsJiYoaS5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOmkuYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6aS5ib3VuZGluZ1NwaGVyZS5yYWRpdXN9KSx0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmKGkuYm91bmRpbmdCb3g9e21pbjppLmJvdW5kaW5nQm94Lm1pbi50b0FycmF5KCksbWF4OmkuYm91bmRpbmdCb3gubWF4LnRvQXJyYXkoKX0pKTtmdW5jdGlvbiBzKG8sbCl7cmV0dXJuIG9bbC51dWlkXT09PXZvaWQgMCYmKG9bbC51dWlkXT1sLnRvSlNPTihlKSksbC51dWlkfWlmKHRoaXMuaXNTY2VuZSl0aGlzLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQuaXNDb2xvcj9pLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTigpOnRoaXMuYmFja2dyb3VuZC5pc1RleHR1cmUmJihpLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTihlKS51dWlkKSksdGhpcy5lbnZpcm9ubWVudCYmdGhpcy5lbnZpcm9ubWVudC5pc1RleHR1cmUmJnRoaXMuZW52aXJvbm1lbnQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlIT09ITAmJihpLmVudmlyb25tZW50PXRoaXMuZW52aXJvbm1lbnQudG9KU09OKGUpLnV1aWQpO2Vsc2UgaWYodGhpcy5pc01lc2h8fHRoaXMuaXNMaW5lfHx0aGlzLmlzUG9pbnRzKXtpLmdlb21ldHJ5PXMoZS5nZW9tZXRyaWVzLHRoaXMuZ2VvbWV0cnkpO2NvbnN0IG89dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKG8hPT12b2lkIDAmJm8uc2hhcGVzIT09dm9pZCAwKXtjb25zdCBsPW8uc2hhcGVzO2lmKEFycmF5LmlzQXJyYXkobCkpZm9yKGxldCBjPTAsaD1sLmxlbmd0aDtjPGg7YysrKXtjb25zdCB1PWxbY107cyhlLnNoYXBlcyx1KX1lbHNlIHMoZS5zaGFwZXMsbCl9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKGkuYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxpLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx0aGlzLnNrZWxldG9uIT09dm9pZCAwJiYocyhlLnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxpLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHRoaXMubWF0ZXJpYWwhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3Qgbz1bXTtmb3IobGV0IGw9MCxjPXRoaXMubWF0ZXJpYWwubGVuZ3RoO2w8YztsKyspby5wdXNoKHMoZS5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtsXSkpO2kubWF0ZXJpYWw9b31lbHNlIGkubWF0ZXJpYWw9cyhlLm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtpLmNoaWxkcmVuPVtdO2ZvcihsZXQgbz0wO288dGhpcy5jaGlsZHJlbi5sZW5ndGg7bysrKWkuY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW29dLnRvSlNPTihlKS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7aS5hbmltYXRpb25zPVtdO2ZvcihsZXQgbz0wO288dGhpcy5hbmltYXRpb25zLmxlbmd0aDtvKyspe2NvbnN0IGw9dGhpcy5hbmltYXRpb25zW29dO2kuYW5pbWF0aW9ucy5wdXNoKHMoZS5hbmltYXRpb25zLGwpKX19aWYodCl7Y29uc3Qgbz1hKGUuZ2VvbWV0cmllcyksbD1hKGUubWF0ZXJpYWxzKSxjPWEoZS50ZXh0dXJlcyksaD1hKGUuaW1hZ2VzKSx1PWEoZS5zaGFwZXMpLGY9YShlLnNrZWxldG9ucyksZD1hKGUuYW5pbWF0aW9ucykscD1hKGUubm9kZXMpO28ubGVuZ3RoPjAmJihuLmdlb21ldHJpZXM9byksbC5sZW5ndGg+MCYmKG4ubWF0ZXJpYWxzPWwpLGMubGVuZ3RoPjAmJihuLnRleHR1cmVzPWMpLGgubGVuZ3RoPjAmJihuLmltYWdlcz1oKSx1Lmxlbmd0aD4wJiYobi5zaGFwZXM9dSksZi5sZW5ndGg+MCYmKG4uc2tlbGV0b25zPWYpLGQubGVuZ3RoPjAmJihuLmFuaW1hdGlvbnM9ZCkscC5sZW5ndGg+MCYmKG4ubm9kZXM9cCl9cmV0dXJuIG4ub2JqZWN0PWksbjtmdW5jdGlvbiBhKG8pe2NvbnN0IGw9W107Zm9yKGNvbnN0IGMgaW4gbyl7Y29uc3QgaD1vW2NdO2RlbGV0ZSBoLm1ldGFkYXRhLGwucHVzaChoKX1yZXR1cm4gbH19Y2xvbmUoZSl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzLGUpfWNvcHkoZSx0PSEwKXtpZih0aGlzLm5hbWU9ZS5uYW1lLHRoaXMudXAuY29weShlLnVwKSx0aGlzLnBvc2l0aW9uLmNvcHkoZS5wb3NpdGlvbiksdGhpcy5yb3RhdGlvbi5vcmRlcj1lLnJvdGF0aW9uLm9yZGVyLHRoaXMucXVhdGVybmlvbi5jb3B5KGUucXVhdGVybmlvbiksdGhpcy5zY2FsZS5jb3B5KGUuc2NhbGUpLHRoaXMubWF0cml4LmNvcHkoZS5tYXRyaXgpLHRoaXMubWF0cml4V29ybGQuY29weShlLm1hdHJpeFdvcmxkKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ZS5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPWUubWF0cml4V29ybGRBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT1lLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsdGhpcy5sYXllcnMubWFzaz1lLmxheWVycy5tYXNrLHRoaXMudmlzaWJsZT1lLnZpc2libGUsdGhpcy5jYXN0U2hhZG93PWUuY2FzdFNoYWRvdyx0aGlzLnJlY2VpdmVTaGFkb3c9ZS5yZWNlaXZlU2hhZG93LHRoaXMuZnJ1c3R1bUN1bGxlZD1lLmZydXN0dW1DdWxsZWQsdGhpcy5yZW5kZXJPcmRlcj1lLnJlbmRlck9yZGVyLHRoaXMuYW5pbWF0aW9ucz1lLmFuaW1hdGlvbnMuc2xpY2UoKSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZS51c2VyRGF0YSkpLHQ9PT0hMClmb3IobGV0IG49MDtuPGUuY2hpbGRyZW4ubGVuZ3RoO24rKyl7Y29uc3QgaT1lLmNoaWxkcmVuW25dO3RoaXMuYWRkKGkuY2xvbmUoKSl9cmV0dXJuIHRoaXN9fXJ0LkRFRkFVTFRfVVA9bmV3IFAoMCwxLDApLHJ0LkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFPSEwLHJ0LkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFPSEwO2NvbnN0IERuPW5ldyBQLHJpPW5ldyBQLGZoPW5ldyBQLHNpPW5ldyBQLEZyPW5ldyBQLE9yPW5ldyBQLE9kPW5ldyBQLGRoPW5ldyBQLHBoPW5ldyBQLG1oPW5ldyBQO2xldCBzbz0hMTtjbGFzcyBjbntjb25zdHJ1Y3RvcihlPW5ldyBQLHQ9bmV3IFAsbj1uZXcgUCl7dGhpcy5hPWUsdGhpcy5iPXQsdGhpcy5jPW59c3RhdGljIGdldE5vcm1hbChlLHQsbixpKXtpLnN1YlZlY3RvcnMobix0KSxEbi5zdWJWZWN0b3JzKGUsdCksaS5jcm9zcyhEbik7Y29uc3Qgcz1pLmxlbmd0aFNxKCk7cmV0dXJuIHM+MD9pLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHMpKTppLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZChlLHQsbixpLHMpe0RuLnN1YlZlY3RvcnMoaSx0KSxyaS5zdWJWZWN0b3JzKG4sdCksZmguc3ViVmVjdG9ycyhlLHQpO2NvbnN0IGE9RG4uZG90KERuKSxvPURuLmRvdChyaSksbD1Ebi5kb3QoZmgpLGM9cmkuZG90KHJpKSxoPXJpLmRvdChmaCksdT1hKmMtbypvO2lmKHU9PT0wKXJldHVybiBzLnNldCgtMiwtMSwtMSk7Y29uc3QgZj0xL3UsZD0oYypsLW8qaCkqZixwPShhKmgtbypsKSpmO3JldHVybiBzLnNldCgxLWQtcCxwLGQpfXN0YXRpYyBjb250YWluc1BvaW50KGUsdCxuLGkpe3JldHVybiB0aGlzLmdldEJhcnljb29yZChlLHQsbixpLHNpKSxzaS54Pj0wJiZzaS55Pj0wJiZzaS54K3NpLnk8PTF9c3RhdGljIGdldFVWKGUsdCxuLGkscyxhLG8sbCl7cmV0dXJuIHNvPT09ITEmJihjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlLmdldFVWKCkgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5UcmlhbmdsZS5nZXRJbnRlcnBvbGF0aW9uKCkuIiksc289ITApLHRoaXMuZ2V0SW50ZXJwb2xhdGlvbihlLHQsbixpLHMsYSxvLGwpfXN0YXRpYyBnZXRJbnRlcnBvbGF0aW9uKGUsdCxuLGkscyxhLG8sbCl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKGUsdCxuLGksc2kpLGwuc2V0U2NhbGFyKDApLGwuYWRkU2NhbGVkVmVjdG9yKHMsc2kueCksbC5hZGRTY2FsZWRWZWN0b3IoYSxzaS55KSxsLmFkZFNjYWxlZFZlY3RvcihvLHNpLnopLGx9c3RhdGljIGlzRnJvbnRGYWNpbmcoZSx0LG4saSl7cmV0dXJuIERuLnN1YlZlY3RvcnMobix0KSxyaS5zdWJWZWN0b3JzKGUsdCksRG4uY3Jvc3MocmkpLmRvdChpKTwwfXNldChlLHQsbil7cmV0dXJuIHRoaXMuYS5jb3B5KGUpLHRoaXMuYi5jb3B5KHQpLHRoaXMuYy5jb3B5KG4pLHRoaXN9c2V0RnJvbVBvaW50c0FuZEluZGljZXMoZSx0LG4saSl7cmV0dXJuIHRoaXMuYS5jb3B5KGVbdF0pLHRoaXMuYi5jb3B5KGVbbl0pLHRoaXMuYy5jb3B5KGVbaV0pLHRoaXN9c2V0RnJvbUF0dHJpYnV0ZUFuZEluZGljZXMoZSx0LG4saSl7cmV0dXJuIHRoaXMuYS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCksdGhpcy5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxuKSx0aGlzLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGkpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkoZSl7cmV0dXJuIHRoaXMuYS5jb3B5KGUuYSksdGhpcy5iLmNvcHkoZS5iKSx0aGlzLmMuY29weShlLmMpLHRoaXN9Z2V0QXJlYSgpe3JldHVybiBEbi5zdWJWZWN0b3JzKHRoaXMuYyx0aGlzLmIpLHJpLnN1YlZlY3RvcnModGhpcy5hLHRoaXMuYiksRG4uY3Jvc3MocmkpLmxlbmd0aCgpKi41fWdldE1pZHBvaW50KGUpe3JldHVybiBlLmFkZFZlY3RvcnModGhpcy5hLHRoaXMuYikuYWRkKHRoaXMuYykubXVsdGlwbHlTY2FsYXIoMS8zKX1nZXROb3JtYWwoZSl7cmV0dXJuIGNuLmdldE5vcm1hbCh0aGlzLmEsdGhpcy5iLHRoaXMuYyxlKX1nZXRQbGFuZShlKXtyZXR1cm4gZS5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfWdldEJhcnljb29yZChlLHQpe3JldHVybiBjbi5nZXRCYXJ5Y29vcmQoZSx0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1nZXRVVihlLHQsbixpLHMpe3JldHVybiBzbz09PSExJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZS5nZXRVVigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuVHJpYW5nbGUuZ2V0SW50ZXJwb2xhdGlvbigpLiIpLHNvPSEwKSxjbi5nZXRJbnRlcnBvbGF0aW9uKGUsdGhpcy5hLHRoaXMuYix0aGlzLmMsdCxuLGkscyl9Z2V0SW50ZXJwb2xhdGlvbihlLHQsbixpLHMpe3JldHVybiBjbi5nZXRJbnRlcnBvbGF0aW9uKGUsdGhpcy5hLHRoaXMuYix0aGlzLmMsdCxuLGkscyl9Y29udGFpbnNQb2ludChlKXtyZXR1cm4gY24uY29udGFpbnNQb2ludChlLHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1pc0Zyb250RmFjaW5nKGUpe3JldHVybiBjbi5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLGUpfWludGVyc2VjdHNCb3goZSl7cmV0dXJuIGUuaW50ZXJzZWN0c1RyaWFuZ2xlKHRoaXMpfWNsb3Nlc3RQb2ludFRvUG9pbnQoZSx0KXtjb25zdCBuPXRoaXMuYSxpPXRoaXMuYixzPXRoaXMuYztsZXQgYSxvO0ZyLnN1YlZlY3RvcnMoaSxuKSxPci5zdWJWZWN0b3JzKHMsbiksZGguc3ViVmVjdG9ycyhlLG4pO2NvbnN0IGw9RnIuZG90KGRoKSxjPU9yLmRvdChkaCk7aWYobDw9MCYmYzw9MClyZXR1cm4gdC5jb3B5KG4pO3BoLnN1YlZlY3RvcnMoZSxpKTtjb25zdCBoPUZyLmRvdChwaCksdT1Pci5kb3QocGgpO2lmKGg+PTAmJnU8PWgpcmV0dXJuIHQuY29weShpKTtjb25zdCBmPWwqdS1oKmM7aWYoZjw9MCYmbD49MCYmaDw9MClyZXR1cm4gYT1sLyhsLWgpLHQuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoRnIsYSk7bWguc3ViVmVjdG9ycyhlLHMpO2NvbnN0IGQ9RnIuZG90KG1oKSxwPU9yLmRvdChtaCk7aWYocD49MCYmZDw9cClyZXR1cm4gdC5jb3B5KHMpO2NvbnN0IF89ZCpjLWwqcDtpZihfPD0wJiZjPj0wJiZwPD0wKXJldHVybiBvPWMvKGMtcCksdC5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihPcixvKTtjb25zdCBnPWgqcC1kKnU7aWYoZzw9MCYmdS1oPj0wJiZkLXA+PTApcmV0dXJuIE9kLnN1YlZlY3RvcnMocyxpKSxvPSh1LWgpLyh1LWgrKGQtcCkpLHQuY29weShpKS5hZGRTY2FsZWRWZWN0b3IoT2Qsbyk7Y29uc3QgbT0xLyhnK18rZik7cmV0dXJuIGE9XyptLG89ZiptLHQuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoRnIsYSkuYWRkU2NhbGVkVmVjdG9yKE9yLG8pfWVxdWFscyhlKXtyZXR1cm4gZS5hLmVxdWFscyh0aGlzLmEpJiZlLmIuZXF1YWxzKHRoaXMuYikmJmUuYy5lcXVhbHModGhpcy5jKX19Y29uc3QgQmQ9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0sUmk9e2g6MCxzOjAsbDowfSxhbz17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIGdoKHIsZSx0KXtyZXR1cm4gdDwwJiYodCs9MSksdD4xJiYodC09MSksdDwxLzY/cisoZS1yKSo2KnQ6dDwxLzI/ZTp0PDIvMz9yKyhlLXIpKjYqKDIvMy10KTpyfWxldCB5ZT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7cmV0dXJuIHRoaXMuaXNDb2xvcj0hMCx0aGlzLnI9MSx0aGlzLmc9MSx0aGlzLmI9MSx0aGlzLnNldChlLHQsbil9c2V0KGUsdCxuKXtpZih0PT09dm9pZCAwJiZuPT09dm9pZCAwKXtjb25zdCBpPWU7aSYmaS5pc0NvbG9yP3RoaXMuY29weShpKTp0eXBlb2YgaT09Im51bWJlciI/dGhpcy5zZXRIZXgoaSk6dHlwZW9mIGk9PSJzdHJpbmciJiZ0aGlzLnNldFN0eWxlKGkpfWVsc2UgdGhpcy5zZXRSR0IoZSx0LG4pO3JldHVybiB0aGlzfXNldFNjYWxhcihlKXtyZXR1cm4gdGhpcy5yPWUsdGhpcy5nPWUsdGhpcy5iPWUsdGhpc31zZXRIZXgoZSx0PVB0KXtyZXR1cm4gZT1NYXRoLmZsb29yKGUpLHRoaXMucj0oZT4+MTYmMjU1KS8yNTUsdGhpcy5nPShlPj44JjI1NSkvMjU1LHRoaXMuYj0oZSYyNTUpLzI1NSxvdC50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsdCksdGhpc31zZXRSR0IoZSx0LG4saT1vdC53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMucj1lLHRoaXMuZz10LHRoaXMuYj1uLG90LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxpKSx0aGlzfXNldEhTTChlLHQsbixpPW90LndvcmtpbmdDb2xvclNwYWNlKXtpZihlPWpjKGUsMSksdD1fdCh0LDAsMSksbj1fdChuLDAsMSksdD09PTApdGhpcy5yPXRoaXMuZz10aGlzLmI9bjtlbHNle2NvbnN0IHM9bjw9LjU/biooMSt0KTpuK3Qtbip0LGE9MipuLXM7dGhpcy5yPWdoKGEscyxlKzEvMyksdGhpcy5nPWdoKGEscyxlKSx0aGlzLmI9Z2goYSxzLGUtMS8zKX1yZXR1cm4gb3QudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLGkpLHRoaXN9c2V0U3R5bGUoZSx0PVB0KXtmdW5jdGlvbiBuKHMpe3MhPT12b2lkIDAmJnBhcnNlRmxvYXQocyk8MSYmY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrZSsiIHdpbGwgYmUgaWdub3JlZC4iKX1sZXQgaTtpZihpPS9eKFx3KylcKChbXlwpXSopXCkvLmV4ZWMoZSkpe2xldCBzO2NvbnN0IGE9aVsxXSxvPWlbMl07c3dpdGNoKGEpe2Nhc2UicmdiIjpjYXNlInJnYmEiOmlmKHM9L15ccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhvKSlyZXR1cm4gbihzWzRdKSx0aGlzLnNldFJHQihNYXRoLm1pbigyNTUscGFyc2VJbnQoc1sxXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoc1syXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoc1szXSwxMCkpLzI1NSx0KTtpZihzPS9eXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMobykpcmV0dXJuIG4oc1s0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMTAwLHBhcnNlSW50KHNbMV0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHNbMl0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHNbM10sMTApKS8xMDAsdCk7YnJlYWs7Y2FzZSJoc2wiOmNhc2UiaHNsYSI6aWYocz0vXlxzKihcZCpcLj9cZCspXHMqLFxzKihcZCpcLj9cZCspXCVccyosXHMqKFxkKlwuP1xkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhvKSlyZXR1cm4gbihzWzRdKSx0aGlzLnNldEhTTChwYXJzZUZsb2F0KHNbMV0pLzM2MCxwYXJzZUZsb2F0KHNbMl0pLzEwMCxwYXJzZUZsb2F0KHNbM10pLzEwMCx0KTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgbW9kZWwgIitlKX19ZWxzZSBpZihpPS9eXCMoW0EtRmEtZlxkXSspJC8uZXhlYyhlKSl7Y29uc3Qgcz1pWzFdLGE9cy5sZW5ndGg7aWYoYT09PTMpcmV0dXJuIHRoaXMuc2V0UkdCKHBhcnNlSW50KHMuY2hhckF0KDApLDE2KS8xNSxwYXJzZUludChzLmNoYXJBdCgxKSwxNikvMTUscGFyc2VJbnQocy5jaGFyQXQoMiksMTYpLzE1LHQpO2lmKGE9PT02KXJldHVybiB0aGlzLnNldEhleChwYXJzZUludChzLDE2KSx0KTtjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBJbnZhbGlkIGhleCBjb2xvciAiK2UpfWVsc2UgaWYoZSYmZS5sZW5ndGg+MClyZXR1cm4gdGhpcy5zZXRDb2xvck5hbWUoZSx0KTtyZXR1cm4gdGhpc31zZXRDb2xvck5hbWUoZSx0PVB0KXtjb25zdCBuPUJkW2UudG9Mb3dlckNhc2UoKV07cmV0dXJuIG4hPT12b2lkIDA/dGhpcy5zZXRIZXgobix0KTpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICIrZSksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsdGhpcy5nLHRoaXMuYil9Y29weShlKXtyZXR1cm4gdGhpcy5yPWUucix0aGlzLmc9ZS5nLHRoaXMuYj1lLmIsdGhpc31jb3B5U1JHQlRvTGluZWFyKGUpe3JldHVybiB0aGlzLnI9Q3IoZS5yKSx0aGlzLmc9Q3IoZS5nKSx0aGlzLmI9Q3IoZS5iKSx0aGlzfWNvcHlMaW5lYXJUb1NSR0IoZSl7cmV0dXJuIHRoaXMucj1uaChlLnIpLHRoaXMuZz1uaChlLmcpLHRoaXMuYj1uaChlLmIpLHRoaXN9Y29udmVydFNSR0JUb0xpbmVhcigpe3JldHVybiB0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyksdGhpc31jb252ZXJ0TGluZWFyVG9TUkdCKCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvU1JHQih0aGlzKSx0aGlzfWdldEhleChlPVB0KXtyZXR1cm4gb3QuZnJvbVdvcmtpbmdDb2xvclNwYWNlKFZ0LmNvcHkodGhpcyksZSksTWF0aC5yb3VuZChfdChWdC5yKjI1NSwwLDI1NSkpKjY1NTM2K01hdGgucm91bmQoX3QoVnQuZyoyNTUsMCwyNTUpKSoyNTYrTWF0aC5yb3VuZChfdChWdC5iKjI1NSwwLDI1NSkpfWdldEhleFN0cmluZyhlPVB0KXtyZXR1cm4oIjAwMDAwMCIrdGhpcy5nZXRIZXgoZSkudG9TdHJpbmcoMTYpKS5zbGljZSgtNil9Z2V0SFNMKGUsdD1vdC53b3JraW5nQ29sb3JTcGFjZSl7b3QuZnJvbVdvcmtpbmdDb2xvclNwYWNlKFZ0LmNvcHkodGhpcyksdCk7Y29uc3Qgbj1WdC5yLGk9VnQuZyxzPVZ0LmIsYT1NYXRoLm1heChuLGkscyksbz1NYXRoLm1pbihuLGkscyk7bGV0IGwsYztjb25zdCBoPShvK2EpLzI7aWYobz09PWEpbD0wLGM9MDtlbHNle2NvbnN0IHU9YS1vO3N3aXRjaChjPWg8PS41P3UvKGErbyk6dS8oMi1hLW8pLGEpe2Nhc2UgbjpsPShpLXMpL3UrKGk8cz82OjApO2JyZWFrO2Nhc2UgaTpsPShzLW4pL3UrMjticmVhaztjYXNlIHM6bD0obi1pKS91KzQ7YnJlYWt9bC89Nn1yZXR1cm4gZS5oPWwsZS5zPWMsZS5sPWgsZX1nZXRSR0IoZSx0PW90LndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gb3QuZnJvbVdvcmtpbmdDb2xvclNwYWNlKFZ0LmNvcHkodGhpcyksdCksZS5yPVZ0LnIsZS5nPVZ0LmcsZS5iPVZ0LmIsZX1nZXRTdHlsZShlPVB0KXtvdC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoVnQuY29weSh0aGlzKSxlKTtjb25zdCB0PVZ0LnIsbj1WdC5nLGk9VnQuYjtyZXR1cm4gZSE9PVB0P2Bjb2xvcigke2V9ICR7dC50b0ZpeGVkKDMpfSAke24udG9GaXhlZCgzKX0gJHtpLnRvRml4ZWQoMyl9KWA6YHJnYigke01hdGgucm91bmQodCoyNTUpfSwke01hdGgucm91bmQobioyNTUpfSwke01hdGgucm91bmQoaSoyNTUpfSlgfW9mZnNldEhTTChlLHQsbil7cmV0dXJuIHRoaXMuZ2V0SFNMKFJpKSx0aGlzLnNldEhTTChSaS5oK2UsUmkucyt0LFJpLmwrbil9YWRkKGUpe3JldHVybiB0aGlzLnIrPWUucix0aGlzLmcrPWUuZyx0aGlzLmIrPWUuYix0aGlzfWFkZENvbG9ycyhlLHQpe3JldHVybiB0aGlzLnI9ZS5yK3Qucix0aGlzLmc9ZS5nK3QuZyx0aGlzLmI9ZS5iK3QuYix0aGlzfWFkZFNjYWxhcihlKXtyZXR1cm4gdGhpcy5yKz1lLHRoaXMuZys9ZSx0aGlzLmIrPWUsdGhpc31zdWIoZSl7cmV0dXJuIHRoaXMucj1NYXRoLm1heCgwLHRoaXMuci1lLnIpLHRoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy1lLmcpLHRoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi1lLmIpLHRoaXN9bXVsdGlwbHkoZSl7cmV0dXJuIHRoaXMucio9ZS5yLHRoaXMuZyo9ZS5nLHRoaXMuYio9ZS5iLHRoaXN9bXVsdGlwbHlTY2FsYXIoZSl7cmV0dXJuIHRoaXMucio9ZSx0aGlzLmcqPWUsdGhpcy5iKj1lLHRoaXN9bGVycChlLHQpe3JldHVybiB0aGlzLnIrPShlLnItdGhpcy5yKSp0LHRoaXMuZys9KGUuZy10aGlzLmcpKnQsdGhpcy5iKz0oZS5iLXRoaXMuYikqdCx0aGlzfWxlcnBDb2xvcnMoZSx0LG4pe3JldHVybiB0aGlzLnI9ZS5yKyh0LnItZS5yKSpuLHRoaXMuZz1lLmcrKHQuZy1lLmcpKm4sdGhpcy5iPWUuYisodC5iLWUuYikqbix0aGlzfWxlcnBIU0woZSx0KXt0aGlzLmdldEhTTChSaSksZS5nZXRIU0woYW8pO2NvbnN0IG49RnMoUmkuaCxhby5oLHQpLGk9RnMoUmkucyxhby5zLHQpLHM9RnMoUmkubCxhby5sLHQpO3JldHVybiB0aGlzLnNldEhTTChuLGkscyksdGhpc31zZXRGcm9tVmVjdG9yMyhlKXtyZXR1cm4gdGhpcy5yPWUueCx0aGlzLmc9ZS55LHRoaXMuYj1lLnosdGhpc31hcHBseU1hdHJpeDMoZSl7Y29uc3QgdD10aGlzLnIsbj10aGlzLmcsaT10aGlzLmIscz1lLmVsZW1lbnRzO3JldHVybiB0aGlzLnI9c1swXSp0K3NbM10qbitzWzZdKmksdGhpcy5nPXNbMV0qdCtzWzRdKm4rc1s3XSppLHRoaXMuYj1zWzJdKnQrc1s1XSpuK3NbOF0qaSx0aGlzfWVxdWFscyhlKXtyZXR1cm4gZS5yPT09dGhpcy5yJiZlLmc9PT10aGlzLmcmJmUuYj09PXRoaXMuYn1mcm9tQXJyYXkoZSx0PTApe3JldHVybiB0aGlzLnI9ZVt0XSx0aGlzLmc9ZVt0KzFdLHRoaXMuYj1lW3QrMl0sdGhpc310b0FycmF5KGU9W10sdD0wKXtyZXR1cm4gZVt0XT10aGlzLnIsZVt0KzFdPXRoaXMuZyxlW3QrMl09dGhpcy5iLGV9ZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQpe3JldHVybiB0aGlzLnI9ZS5nZXRYKHQpLHRoaXMuZz1lLmdldFkodCksdGhpcy5iPWUuZ2V0Wih0KSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLmdldEhleCgpfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMucix5aWVsZCB0aGlzLmcseWllbGQgdGhpcy5ifX07Y29uc3QgVnQ9bmV3IHllO3llLk5BTUVTPUJkO2xldCBteD0wO2NsYXNzIEh0IGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNNYXRlcmlhbD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpteCsrfSksdGhpcy51dWlkPV9uKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iTWF0ZXJpYWwiLHRoaXMuYmxlbmRpbmc9QmksdGhpcy5zaWRlPVluLHRoaXMudmVydGV4Q29sb3JzPSExLHRoaXMub3BhY2l0eT0xLHRoaXMudHJhbnNwYXJlbnQ9ITEsdGhpcy5hbHBoYUhhc2g9ITEsdGhpcy5ibGVuZFNyYz1EYSx0aGlzLmJsZW5kRHN0PU5hLHRoaXMuYmxlbmRFcXVhdGlvbj14aSx0aGlzLmJsZW5kU3JjQWxwaGE9bnVsbCx0aGlzLmJsZW5kRHN0QWxwaGE9bnVsbCx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1udWxsLHRoaXMuYmxlbmRDb2xvcj1uZXcgeWUoMCwwLDApLHRoaXMuYmxlbmRBbHBoYT0wLHRoaXMuZGVwdGhGdW5jPU1zLHRoaXMuZGVwdGhUZXN0PSEwLHRoaXMuZGVwdGhXcml0ZT0hMCx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9MjU1LHRoaXMuc3RlbmNpbEZ1bmM9SmMsdGhpcy5zdGVuY2lsUmVmPTAsdGhpcy5zdGVuY2lsRnVuY01hc2s9MjU1LHRoaXMuc3RlbmNpbEZhaWw9VmksdGhpcy5zdGVuY2lsWkZhaWw9VmksdGhpcy5zdGVuY2lsWlBhc3M9VmksdGhpcy5zdGVuY2lsV3JpdGU9ITEsdGhpcy5jbGlwcGluZ1BsYW5lcz1udWxsLHRoaXMuY2xpcEludGVyc2VjdGlvbj0hMSx0aGlzLmNsaXBTaGFkb3dzPSExLHRoaXMuc2hhZG93U2lkZT1udWxsLHRoaXMuY29sb3JXcml0ZT0hMCx0aGlzLnByZWNpc2lvbj1udWxsLHRoaXMucG9seWdvbk9mZnNldD0hMSx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9MCx0aGlzLnBvbHlnb25PZmZzZXRVbml0cz0wLHRoaXMuZGl0aGVyaW5nPSExLHRoaXMuYWxwaGFUb0NvdmVyYWdlPSExLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPSExLHRoaXMuZm9yY2VTaW5nbGVQYXNzPSExLHRoaXMudmlzaWJsZT0hMCx0aGlzLnRvbmVNYXBwZWQ9ITAsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLl9hbHBoYVRlc3Q9MH1nZXQgYWxwaGFUZXN0KCl7cmV0dXJuIHRoaXMuX2FscGhhVGVzdH1zZXQgYWxwaGFUZXN0KGUpe3RoaXMuX2FscGhhVGVzdD4wIT1lPjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX2FscGhhVGVzdD1lfW9uQnVpbGQoKXt9b25CZWZvcmVSZW5kZXIoKXt9b25CZWZvcmVDb21waWxlKCl7fWN1c3RvbVByb2dyYW1DYWNoZUtleSgpe3JldHVybiB0aGlzLm9uQmVmb3JlQ29tcGlsZS50b1N0cmluZygpfXNldFZhbHVlcyhlKXtpZihlIT09dm9pZCAwKWZvcihjb25zdCB0IGluIGUpe2NvbnN0IG49ZVt0XTtpZihuPT09dm9pZCAwKXtjb25zb2xlLndhcm4oYFRIUkVFLk1hdGVyaWFsOiBwYXJhbWV0ZXIgJyR7dH0nIGhhcyB2YWx1ZSBvZiB1bmRlZmluZWQuYCk7Y29udGludWV9Y29uc3QgaT10aGlzW3RdO2lmKGk9PT12b2lkIDApe2NvbnNvbGUud2FybihgVEhSRUUuTWF0ZXJpYWw6ICcke3R9JyBpcyBub3QgYSBwcm9wZXJ0eSBvZiBUSFJFRS4ke3RoaXMudHlwZX0uYCk7Y29udGludWV9aSYmaS5pc0NvbG9yP2kuc2V0KG4pOmkmJmkuaXNWZWN0b3IzJiZuJiZuLmlzVmVjdG9yMz9pLmNvcHkobik6dGhpc1t0XT1ufX10b0pTT04oZSl7Y29uc3QgdD1lPT09dm9pZCAwfHx0eXBlb2YgZT09InN0cmluZyI7dCYmKGU9e3RleHR1cmVzOnt9LGltYWdlczp7fX0pO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJNYXRlcmlhbCIsZ2VuZXJhdG9yOiJNYXRlcmlhbC50b0pTT04ifX07bi51dWlkPXRoaXMudXVpZCxuLnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYobi5uYW1lPXRoaXMubmFtZSksdGhpcy5jb2xvciYmdGhpcy5jb2xvci5pc0NvbG9yJiYobi5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpKSx0aGlzLnJvdWdobmVzcyE9PXZvaWQgMCYmKG4ucm91Z2huZXNzPXRoaXMucm91Z2huZXNzKSx0aGlzLm1ldGFsbmVzcyE9PXZvaWQgMCYmKG4ubWV0YWxuZXNzPXRoaXMubWV0YWxuZXNzKSx0aGlzLnNoZWVuIT09dm9pZCAwJiYobi5zaGVlbj10aGlzLnNoZWVuKSx0aGlzLnNoZWVuQ29sb3ImJnRoaXMuc2hlZW5Db2xvci5pc0NvbG9yJiYobi5zaGVlbkNvbG9yPXRoaXMuc2hlZW5Db2xvci5nZXRIZXgoKSksdGhpcy5zaGVlblJvdWdobmVzcyE9PXZvaWQgMCYmKG4uc2hlZW5Sb3VnaG5lc3M9dGhpcy5zaGVlblJvdWdobmVzcyksdGhpcy5lbWlzc2l2ZSYmdGhpcy5lbWlzc2l2ZS5pc0NvbG9yJiYobi5lbWlzc2l2ZT10aGlzLmVtaXNzaXZlLmdldEhleCgpKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5JiZ0aGlzLmVtaXNzaXZlSW50ZW5zaXR5IT09MSYmKG4uZW1pc3NpdmVJbnRlbnNpdHk9dGhpcy5lbWlzc2l2ZUludGVuc2l0eSksdGhpcy5zcGVjdWxhciYmdGhpcy5zcGVjdWxhci5pc0NvbG9yJiYobi5zcGVjdWxhcj10aGlzLnNwZWN1bGFyLmdldEhleCgpKSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5IT09dm9pZCAwJiYobi5zcGVjdWxhckludGVuc2l0eT10aGlzLnNwZWN1bGFySW50ZW5zaXR5KSx0aGlzLnNwZWN1bGFyQ29sb3ImJnRoaXMuc3BlY3VsYXJDb2xvci5pc0NvbG9yJiYobi5zcGVjdWxhckNvbG9yPXRoaXMuc3BlY3VsYXJDb2xvci5nZXRIZXgoKSksdGhpcy5zaGluaW5lc3MhPT12b2lkIDAmJihuLnNoaW5pbmVzcz10aGlzLnNoaW5pbmVzcyksdGhpcy5jbGVhcmNvYXQhPT12b2lkIDAmJihuLmNsZWFyY29hdD10aGlzLmNsZWFyY29hdCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MhPT12b2lkIDAmJihuLmNsZWFyY29hdFJvdWdobmVzcz10aGlzLmNsZWFyY29hdFJvdWdobmVzcyksdGhpcy5jbGVhcmNvYXRNYXAmJnRoaXMuY2xlYXJjb2F0TWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0TWFwPXRoaXMuY2xlYXJjb2F0TWFwLnRvSlNPTihlKS51dWlkKSx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCYmdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwJiZ0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE5vcm1hbE1hcD10aGlzLmNsZWFyY29hdE5vcm1hbE1hcC50b0pTT04oZSkudXVpZCxuLmNsZWFyY29hdE5vcm1hbFNjYWxlPXRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLmlyaWRlc2NlbmNlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZT10aGlzLmlyaWRlc2NlbmNlKSx0aGlzLmlyaWRlc2NlbmNlSU9SIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZUlPUj10aGlzLmlyaWRlc2NlbmNlSU9SKSx0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UhPT12b2lkIDAmJihuLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2U9dGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlKSx0aGlzLmlyaWRlc2NlbmNlTWFwJiZ0aGlzLmlyaWRlc2NlbmNlTWFwLmlzVGV4dHVyZSYmKG4uaXJpZGVzY2VuY2VNYXA9dGhpcy5pcmlkZXNjZW5jZU1hcC50b0pTT04oZSkudXVpZCksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCYmdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMuYW5pc290cm9weSE9PXZvaWQgMCYmKG4uYW5pc290cm9weT10aGlzLmFuaXNvdHJvcHkpLHRoaXMuYW5pc290cm9weVJvdGF0aW9uIT09dm9pZCAwJiYobi5hbmlzb3Ryb3B5Um90YXRpb249dGhpcy5hbmlzb3Ryb3B5Um90YXRpb24pLHRoaXMuYW5pc290cm9weU1hcCYmdGhpcy5hbmlzb3Ryb3B5TWFwLmlzVGV4dHVyZSYmKG4uYW5pc290cm9weU1hcD10aGlzLmFuaXNvdHJvcHlNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMubWFwJiZ0aGlzLm1hcC5pc1RleHR1cmUmJihuLm1hcD10aGlzLm1hcC50b0pTT04oZSkudXVpZCksdGhpcy5tYXRjYXAmJnRoaXMubWF0Y2FwLmlzVGV4dHVyZSYmKG4ubWF0Y2FwPXRoaXMubWF0Y2FwLnRvSlNPTihlKS51dWlkKSx0aGlzLmFscGhhTWFwJiZ0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSYmKG4uYWxwaGFNYXA9dGhpcy5hbHBoYU1hcC50b0pTT04oZSkudXVpZCksdGhpcy5saWdodE1hcCYmdGhpcy5saWdodE1hcC5pc1RleHR1cmUmJihuLmxpZ2h0TWFwPXRoaXMubGlnaHRNYXAudG9KU09OKGUpLnV1aWQsbi5saWdodE1hcEludGVuc2l0eT10aGlzLmxpZ2h0TWFwSW50ZW5zaXR5KSx0aGlzLmFvTWFwJiZ0aGlzLmFvTWFwLmlzVGV4dHVyZSYmKG4uYW9NYXA9dGhpcy5hb01hcC50b0pTT04oZSkudXVpZCxuLmFvTWFwSW50ZW5zaXR5PXRoaXMuYW9NYXBJbnRlbnNpdHkpLHRoaXMuYnVtcE1hcCYmdGhpcy5idW1wTWFwLmlzVGV4dHVyZSYmKG4uYnVtcE1hcD10aGlzLmJ1bXBNYXAudG9KU09OKGUpLnV1aWQsbi5idW1wU2NhbGU9dGhpcy5idW1wU2NhbGUpLHRoaXMubm9ybWFsTWFwJiZ0aGlzLm5vcm1hbE1hcC5pc1RleHR1cmUmJihuLm5vcm1hbE1hcD10aGlzLm5vcm1hbE1hcC50b0pTT04oZSkudXVpZCxuLm5vcm1hbE1hcFR5cGU9dGhpcy5ub3JtYWxNYXBUeXBlLG4ubm9ybWFsU2NhbGU9dGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCkpLHRoaXMuZGlzcGxhY2VtZW50TWFwJiZ0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUmJihuLmRpc3BsYWNlbWVudE1hcD10aGlzLmRpc3BsYWNlbWVudE1hcC50b0pTT04oZSkudXVpZCxuLmRpc3BsYWNlbWVudFNjYWxlPXRoaXMuZGlzcGxhY2VtZW50U2NhbGUsbi5kaXNwbGFjZW1lbnRCaWFzPXRoaXMuZGlzcGxhY2VtZW50QmlhcyksdGhpcy5yb3VnaG5lc3NNYXAmJnRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4ucm91Z2huZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwLnRvSlNPTihlKS51dWlkKSx0aGlzLm1ldGFsbmVzc01hcCYmdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlJiYobi5tZXRhbG5lc3NNYXA9dGhpcy5tZXRhbG5lc3NNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMuZW1pc3NpdmVNYXAmJnRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlJiYobi5lbWlzc2l2ZU1hcD10aGlzLmVtaXNzaXZlTWFwLnRvSlNPTihlKS51dWlkKSx0aGlzLnNwZWN1bGFyTWFwJiZ0aGlzLnNwZWN1bGFyTWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJNYXA9dGhpcy5zcGVjdWxhck1hcC50b0pTT04oZSkudXVpZCksdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcCYmdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFySW50ZW5zaXR5TWFwPXRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMuc3BlY3VsYXJDb2xvck1hcCYmdGhpcy5zcGVjdWxhckNvbG9yTWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJDb2xvck1hcD10aGlzLnNwZWN1bGFyQ29sb3JNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMuZW52TWFwJiZ0aGlzLmVudk1hcC5pc1RleHR1cmUmJihuLmVudk1hcD10aGlzLmVudk1hcC50b0pTT04oZSkudXVpZCx0aGlzLmNvbWJpbmUhPT12b2lkIDAmJihuLmNvbWJpbmU9dGhpcy5jb21iaW5lKSksdGhpcy5lbnZNYXBJbnRlbnNpdHkhPT12b2lkIDAmJihuLmVudk1hcEludGVuc2l0eT10aGlzLmVudk1hcEludGVuc2l0eSksdGhpcy5yZWZsZWN0aXZpdHkhPT12b2lkIDAmJihuLnJlZmxlY3Rpdml0eT10aGlzLnJlZmxlY3Rpdml0eSksdGhpcy5yZWZyYWN0aW9uUmF0aW8hPT12b2lkIDAmJihuLnJlZnJhY3Rpb25SYXRpbz10aGlzLnJlZnJhY3Rpb25SYXRpbyksdGhpcy5ncmFkaWVudE1hcCYmdGhpcy5ncmFkaWVudE1hcC5pc1RleHR1cmUmJihuLmdyYWRpZW50TWFwPXRoaXMuZ3JhZGllbnRNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMudHJhbnNtaXNzaW9uIT09dm9pZCAwJiYobi50cmFuc21pc3Npb249dGhpcy50cmFuc21pc3Npb24pLHRoaXMudHJhbnNtaXNzaW9uTWFwJiZ0aGlzLnRyYW5zbWlzc2lvbk1hcC5pc1RleHR1cmUmJihuLnRyYW5zbWlzc2lvbk1hcD10aGlzLnRyYW5zbWlzc2lvbk1hcC50b0pTT04oZSkudXVpZCksdGhpcy50aGlja25lc3MhPT12b2lkIDAmJihuLnRoaWNrbmVzcz10aGlzLnRoaWNrbmVzcyksdGhpcy50aGlja25lc3NNYXAmJnRoaXMudGhpY2tuZXNzTWFwLmlzVGV4dHVyZSYmKG4udGhpY2tuZXNzTWFwPXRoaXMudGhpY2tuZXNzTWFwLnRvSlNPTihlKS51dWlkKSx0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UhPT12b2lkIDAmJnRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSE9PTEvMCYmKG4uYXR0ZW51YXRpb25EaXN0YW5jZT10aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UpLHRoaXMuYXR0ZW51YXRpb25Db2xvciE9PXZvaWQgMCYmKG4uYXR0ZW51YXRpb25Db2xvcj10aGlzLmF0dGVudWF0aW9uQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2l6ZSE9PXZvaWQgMCYmKG4uc2l6ZT10aGlzLnNpemUpLHRoaXMuc2hhZG93U2lkZSE9PW51bGwmJihuLnNoYWRvd1NpZGU9dGhpcy5zaGFkb3dTaWRlKSx0aGlzLnNpemVBdHRlbnVhdGlvbiE9PXZvaWQgMCYmKG4uc2l6ZUF0dGVudWF0aW9uPXRoaXMuc2l6ZUF0dGVudWF0aW9uKSx0aGlzLmJsZW5kaW5nIT09QmkmJihuLmJsZW5kaW5nPXRoaXMuYmxlbmRpbmcpLHRoaXMuc2lkZSE9PVluJiYobi5zaWRlPXRoaXMuc2lkZSksdGhpcy52ZXJ0ZXhDb2xvcnM9PT0hMCYmKG4udmVydGV4Q29sb3JzPSEwKSx0aGlzLm9wYWNpdHk8MSYmKG4ub3BhY2l0eT10aGlzLm9wYWNpdHkpLHRoaXMudHJhbnNwYXJlbnQ9PT0hMCYmKG4udHJhbnNwYXJlbnQ9ITApLHRoaXMuYmxlbmRTcmMhPT1EYSYmKG4uYmxlbmRTcmM9dGhpcy5ibGVuZFNyYyksdGhpcy5ibGVuZERzdCE9PU5hJiYobi5ibGVuZERzdD10aGlzLmJsZW5kRHN0KSx0aGlzLmJsZW5kRXF1YXRpb24hPT14aSYmKG4uYmxlbmRFcXVhdGlvbj10aGlzLmJsZW5kRXF1YXRpb24pLHRoaXMuYmxlbmRTcmNBbHBoYSE9PW51bGwmJihuLmJsZW5kU3JjQWxwaGE9dGhpcy5ibGVuZFNyY0FscGhhKSx0aGlzLmJsZW5kRHN0QWxwaGEhPT1udWxsJiYobi5ibGVuZERzdEFscGhhPXRoaXMuYmxlbmREc3RBbHBoYSksdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEhPT1udWxsJiYobi5ibGVuZEVxdWF0aW9uQWxwaGE9dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEpLHRoaXMuYmxlbmRDb2xvciYmdGhpcy5ibGVuZENvbG9yLmlzQ29sb3ImJihuLmJsZW5kQ29sb3I9dGhpcy5ibGVuZENvbG9yLmdldEhleCgpKSx0aGlzLmJsZW5kQWxwaGEhPT0wJiYobi5ibGVuZEFscGhhPXRoaXMuYmxlbmRBbHBoYSksdGhpcy5kZXB0aEZ1bmMhPT1NcyYmKG4uZGVwdGhGdW5jPXRoaXMuZGVwdGhGdW5jKSx0aGlzLmRlcHRoVGVzdD09PSExJiYobi5kZXB0aFRlc3Q9dGhpcy5kZXB0aFRlc3QpLHRoaXMuZGVwdGhXcml0ZT09PSExJiYobi5kZXB0aFdyaXRlPXRoaXMuZGVwdGhXcml0ZSksdGhpcy5jb2xvcldyaXRlPT09ITEmJihuLmNvbG9yV3JpdGU9dGhpcy5jb2xvcldyaXRlKSx0aGlzLnN0ZW5jaWxXcml0ZU1hc2shPT0yNTUmJihuLnN0ZW5jaWxXcml0ZU1hc2s9dGhpcy5zdGVuY2lsV3JpdGVNYXNrKSx0aGlzLnN0ZW5jaWxGdW5jIT09SmMmJihuLnN0ZW5jaWxGdW5jPXRoaXMuc3RlbmNpbEZ1bmMpLHRoaXMuc3RlbmNpbFJlZiE9PTAmJihuLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmKSx0aGlzLnN0ZW5jaWxGdW5jTWFzayE9PTI1NSYmKG4uc3RlbmNpbEZ1bmNNYXNrPXRoaXMuc3RlbmNpbEZ1bmNNYXNrKSx0aGlzLnN0ZW5jaWxGYWlsIT09VmkmJihuLnN0ZW5jaWxGYWlsPXRoaXMuc3RlbmNpbEZhaWwpLHRoaXMuc3RlbmNpbFpGYWlsIT09VmkmJihuLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbCksdGhpcy5zdGVuY2lsWlBhc3MhPT1WaSYmKG4uc3RlbmNpbFpQYXNzPXRoaXMuc3RlbmNpbFpQYXNzKSx0aGlzLnN0ZW5jaWxXcml0ZT09PSEwJiYobi5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGUpLHRoaXMucm90YXRpb24hPT12b2lkIDAmJnRoaXMucm90YXRpb24hPT0wJiYobi5yb3RhdGlvbj10aGlzLnJvdGF0aW9uKSx0aGlzLnBvbHlnb25PZmZzZXQ9PT0hMCYmKG4ucG9seWdvbk9mZnNldD0hMCksdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yIT09MCYmKG4ucG9seWdvbk9mZnNldEZhY3Rvcj10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IpLHRoaXMucG9seWdvbk9mZnNldFVuaXRzIT09MCYmKG4ucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldFVuaXRzKSx0aGlzLmxpbmV3aWR0aCE9PXZvaWQgMCYmdGhpcy5saW5ld2lkdGghPT0xJiYobi5saW5ld2lkdGg9dGhpcy5saW5ld2lkdGgpLHRoaXMuZGFzaFNpemUhPT12b2lkIDAmJihuLmRhc2hTaXplPXRoaXMuZGFzaFNpemUpLHRoaXMuZ2FwU2l6ZSE9PXZvaWQgMCYmKG4uZ2FwU2l6ZT10aGlzLmdhcFNpemUpLHRoaXMuc2NhbGUhPT12b2lkIDAmJihuLnNjYWxlPXRoaXMuc2NhbGUpLHRoaXMuZGl0aGVyaW5nPT09ITAmJihuLmRpdGhlcmluZz0hMCksdGhpcy5hbHBoYVRlc3Q+MCYmKG4uYWxwaGFUZXN0PXRoaXMuYWxwaGFUZXN0KSx0aGlzLmFscGhhSGFzaD09PSEwJiYobi5hbHBoYUhhc2g9ITApLHRoaXMuYWxwaGFUb0NvdmVyYWdlPT09ITAmJihuLmFscGhhVG9Db3ZlcmFnZT0hMCksdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9PT0hMCYmKG4ucHJlbXVsdGlwbGllZEFscGhhPSEwKSx0aGlzLmZvcmNlU2luZ2xlUGFzcz09PSEwJiYobi5mb3JjZVNpbmdsZVBhc3M9ITApLHRoaXMud2lyZWZyYW1lPT09ITAmJihuLndpcmVmcmFtZT0hMCksdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg+MSYmKG4ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKSx0aGlzLndpcmVmcmFtZUxpbmVjYXAhPT0icm91bmQiJiYobi53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCksdGhpcy53aXJlZnJhbWVMaW5lam9pbiE9PSJyb3VuZCImJihuLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pLHRoaXMuZmxhdFNoYWRpbmc9PT0hMCYmKG4uZmxhdFNoYWRpbmc9ITApLHRoaXMudmlzaWJsZT09PSExJiYobi52aXNpYmxlPSExKSx0aGlzLnRvbmVNYXBwZWQ9PT0hMSYmKG4udG9uZU1hcHBlZD0hMSksdGhpcy5mb2c9PT0hMSYmKG4uZm9nPSExKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSk7ZnVuY3Rpb24gaShzKXtjb25zdCBhPVtdO2Zvcihjb25zdCBvIGluIHMpe2NvbnN0IGw9c1tvXTtkZWxldGUgbC5tZXRhZGF0YSxhLnB1c2gobCl9cmV0dXJuIGF9aWYodCl7Y29uc3Qgcz1pKGUudGV4dHVyZXMpLGE9aShlLmltYWdlcyk7cy5sZW5ndGg+MCYmKG4udGV4dHVyZXM9cyksYS5sZW5ndGg+MCYmKG4uaW1hZ2VzPWEpfXJldHVybiBufWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KGUpe3RoaXMubmFtZT1lLm5hbWUsdGhpcy5ibGVuZGluZz1lLmJsZW5kaW5nLHRoaXMuc2lkZT1lLnNpZGUsdGhpcy52ZXJ0ZXhDb2xvcnM9ZS52ZXJ0ZXhDb2xvcnMsdGhpcy5vcGFjaXR5PWUub3BhY2l0eSx0aGlzLnRyYW5zcGFyZW50PWUudHJhbnNwYXJlbnQsdGhpcy5ibGVuZFNyYz1lLmJsZW5kU3JjLHRoaXMuYmxlbmREc3Q9ZS5ibGVuZERzdCx0aGlzLmJsZW5kRXF1YXRpb249ZS5ibGVuZEVxdWF0aW9uLHRoaXMuYmxlbmRTcmNBbHBoYT1lLmJsZW5kU3JjQWxwaGEsdGhpcy5ibGVuZERzdEFscGhhPWUuYmxlbmREc3RBbHBoYSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1lLmJsZW5kRXF1YXRpb25BbHBoYSx0aGlzLmJsZW5kQ29sb3IuY29weShlLmJsZW5kQ29sb3IpLHRoaXMuYmxlbmRBbHBoYT1lLmJsZW5kQWxwaGEsdGhpcy5kZXB0aEZ1bmM9ZS5kZXB0aEZ1bmMsdGhpcy5kZXB0aFRlc3Q9ZS5kZXB0aFRlc3QsdGhpcy5kZXB0aFdyaXRlPWUuZGVwdGhXcml0ZSx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9ZS5zdGVuY2lsV3JpdGVNYXNrLHRoaXMuc3RlbmNpbEZ1bmM9ZS5zdGVuY2lsRnVuYyx0aGlzLnN0ZW5jaWxSZWY9ZS5zdGVuY2lsUmVmLHRoaXMuc3RlbmNpbEZ1bmNNYXNrPWUuc3RlbmNpbEZ1bmNNYXNrLHRoaXMuc3RlbmNpbEZhaWw9ZS5zdGVuY2lsRmFpbCx0aGlzLnN0ZW5jaWxaRmFpbD1lLnN0ZW5jaWxaRmFpbCx0aGlzLnN0ZW5jaWxaUGFzcz1lLnN0ZW5jaWxaUGFzcyx0aGlzLnN0ZW5jaWxXcml0ZT1lLnN0ZW5jaWxXcml0ZTtjb25zdCB0PWUuY2xpcHBpbmdQbGFuZXM7bGV0IG49bnVsbDtpZih0IT09bnVsbCl7Y29uc3QgaT10Lmxlbmd0aDtuPW5ldyBBcnJheShpKTtmb3IobGV0IHM9MDtzIT09aTsrK3MpbltzXT10W3NdLmNsb25lKCl9cmV0dXJuIHRoaXMuY2xpcHBpbmdQbGFuZXM9bix0aGlzLmNsaXBJbnRlcnNlY3Rpb249ZS5jbGlwSW50ZXJzZWN0aW9uLHRoaXMuY2xpcFNoYWRvd3M9ZS5jbGlwU2hhZG93cyx0aGlzLnNoYWRvd1NpZGU9ZS5zaGFkb3dTaWRlLHRoaXMuY29sb3JXcml0ZT1lLmNvbG9yV3JpdGUsdGhpcy5wcmVjaXNpb249ZS5wcmVjaXNpb24sdGhpcy5wb2x5Z29uT2Zmc2V0PWUucG9seWdvbk9mZnNldCx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9ZS5wb2x5Z29uT2Zmc2V0RmFjdG9yLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPWUucG9seWdvbk9mZnNldFVuaXRzLHRoaXMuZGl0aGVyaW5nPWUuZGl0aGVyaW5nLHRoaXMuYWxwaGFUZXN0PWUuYWxwaGFUZXN0LHRoaXMuYWxwaGFIYXNoPWUuYWxwaGFIYXNoLHRoaXMuYWxwaGFUb0NvdmVyYWdlPWUuYWxwaGFUb0NvdmVyYWdlLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPWUucHJlbXVsdGlwbGllZEFscGhhLHRoaXMuZm9yY2VTaW5nbGVQYXNzPWUuZm9yY2VTaW5nbGVQYXNzLHRoaXMudmlzaWJsZT1lLnZpc2libGUsdGhpcy50b25lTWFwcGVkPWUudG9uZU1hcHBlZCx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZS51c2VyRGF0YSkpLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX1zZXQgbmVlZHNVcGRhdGUoZSl7ZT09PSEwJiZ0aGlzLnZlcnNpb24rK319Y2xhc3MgUGkgZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5ZSgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuY29tYmluZT1Tcyx0aGlzLnJlZmxlY3Rpdml0eT0xLHRoaXMucmVmcmFjdGlvblJhdGlvPS45OCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuY29sb3IuY29weShlLmNvbG9yKSx0aGlzLm1hcD1lLm1hcCx0aGlzLmxpZ2h0TWFwPWUubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT1lLmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9ZS5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PWUuYW9NYXBJbnRlbnNpdHksdGhpcy5zcGVjdWxhck1hcD1lLnNwZWN1bGFyTWFwLHRoaXMuYWxwaGFNYXA9ZS5hbHBoYU1hcCx0aGlzLmVudk1hcD1lLmVudk1hcCx0aGlzLmNvbWJpbmU9ZS5jb21iaW5lLHRoaXMucmVmbGVjdGl2aXR5PWUucmVmbGVjdGl2aXR5LHRoaXMucmVmcmFjdGlvblJhdGlvPWUucmVmcmFjdGlvblJhdGlvLHRoaXMud2lyZWZyYW1lPWUud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPWUud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD1lLndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj1lLndpcmVmcmFtZUxpbmVqb2luLHRoaXMuZm9nPWUuZm9nLHRoaXN9fWNvbnN0IGFpPWd4KCk7ZnVuY3Rpb24gZ3goKXtjb25zdCByPW5ldyBBcnJheUJ1ZmZlcig0KSxlPW5ldyBGbG9hdDMyQXJyYXkociksdD1uZXcgVWludDMyQXJyYXkociksbj1uZXcgVWludDMyQXJyYXkoNTEyKSxpPW5ldyBVaW50MzJBcnJheSg1MTIpO2ZvcihsZXQgbD0wO2w8MjU2OysrbCl7Y29uc3QgYz1sLTEyNztjPC0yNz8obltsXT0wLG5bbHwyNTZdPTMyNzY4LGlbbF09MjQsaVtsfDI1Nl09MjQpOmM8LTE0PyhuW2xdPTEwMjQ+Pi1jLTE0LG5bbHwyNTZdPTEwMjQ+Pi1jLTE0fDMyNzY4LGlbbF09LWMtMSxpW2x8MjU2XT0tYy0xKTpjPD0xNT8obltsXT1jKzE1PDwxMCxuW2x8MjU2XT1jKzE1PDwxMHwzMjc2OCxpW2xdPTEzLGlbbHwyNTZdPTEzKTpjPDEyOD8obltsXT0zMTc0NCxuW2x8MjU2XT02NDUxMixpW2xdPTI0LGlbbHwyNTZdPTI0KToobltsXT0zMTc0NCxuW2x8MjU2XT02NDUxMixpW2xdPTEzLGlbbHwyNTZdPTEzKX1jb25zdCBzPW5ldyBVaW50MzJBcnJheSgyMDQ4KSxhPW5ldyBVaW50MzJBcnJheSg2NCksbz1uZXcgVWludDMyQXJyYXkoNjQpO2ZvcihsZXQgbD0xO2w8MTAyNDsrK2wpe2xldCBjPWw8PDEzLGg9MDtmb3IoOyEoYyY4Mzg4NjA4KTspYzw8PTEsaC09ODM4ODYwODtjJj0tODM4ODYwOSxoKz05NDc5MTI3MDQsc1tsXT1jfGh9Zm9yKGxldCBsPTEwMjQ7bDwyMDQ4OysrbClzW2xdPTkzOTUyNDA5NisobC0xMDI0PDwxMyk7Zm9yKGxldCBsPTE7bDwzMTsrK2wpYVtsXT1sPDwyMzthWzMxXT0xMTk5NTcwOTQ0LGFbMzJdPTIxNDc0ODM2NDg7Zm9yKGxldCBsPTMzO2w8NjM7KytsKWFbbF09MjE0NzQ4MzY0OCsobC0zMjw8MjMpO2FbNjNdPTMzNDcwNTQ1OTI7Zm9yKGxldCBsPTE7bDw2NDsrK2wpbCE9PTMyJiYob1tsXT0xMDI0KTtyZXR1cm57ZmxvYXRWaWV3OmUsdWludDMyVmlldzp0LGJhc2VUYWJsZTpuLHNoaWZ0VGFibGU6aSxtYW50aXNzYVRhYmxlOnMsZXhwb25lbnRUYWJsZTphLG9mZnNldFRhYmxlOm99fWZ1bmN0aW9uIGhuKHIpe01hdGguYWJzKHIpPjY1NTA0JiZjb25zb2xlLndhcm4oIlRIUkVFLkRhdGFVdGlscy50b0hhbGZGbG9hdCgpOiBWYWx1ZSBvdXQgb2YgcmFuZ2UuIikscj1fdChyLC02NTUwNCw2NTUwNCksYWkuZmxvYXRWaWV3WzBdPXI7Y29uc3QgZT1haS51aW50MzJWaWV3WzBdLHQ9ZT4+MjMmNTExO3JldHVybiBhaS5iYXNlVGFibGVbdF0rKChlJjgzODg2MDcpPj5haS5zaGlmdFRhYmxlW3RdKX1mdW5jdGlvbiBIcyhyKXtjb25zdCBlPXI+PjEwO3JldHVybiBhaS51aW50MzJWaWV3WzBdPWFpLm1hbnRpc3NhVGFibGVbYWkub2Zmc2V0VGFibGVbZV0rKHImMTAyMyldK2FpLmV4cG9uZW50VGFibGVbZV0sYWkuZmxvYXRWaWV3WzBdfWNvbnN0IF94PXt0b0hhbGZGbG9hdDpobixmcm9tSGFsZkZsb2F0OkhzfSxDdD1uZXcgUCxvbz1uZXcgcTtjbGFzcyBLZXtjb25zdHJ1Y3RvcihlLHQsbj0hMSl7aWYoQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LiIpO3RoaXMuaXNCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5uYW1lPSIiLHRoaXMuYXJyYXk9ZSx0aGlzLml0ZW1TaXplPXQsdGhpcy5jb3VudD1lIT09dm9pZCAwP2UubGVuZ3RoL3Q6MCx0aGlzLm5vcm1hbGl6ZWQ9bix0aGlzLnVzYWdlPU5zLHRoaXMuX3VwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX0sdGhpcy51cGRhdGVSYW5nZXM9W10sdGhpcy5ncHVUeXBlPVJuLHRoaXMudmVyc2lvbj0wfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKGUpe2U9PT0hMCYmdGhpcy52ZXJzaW9uKyt9Z2V0IHVwZGF0ZVJhbmdlKCl7cmV0dXJuIGNvbnNvbGUud2FybignVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAidXBkYXRlUmFuZ2UiIGlzIGRlcHJlY2F0ZWQgYW5kIHJlbW92ZWQgaW4gcjE2OS4gVXNlICJhZGRVcGRhdGVSYW5nZSgpIiBpbnN0ZWFkLicpLHRoaXMuX3VwZGF0ZVJhbmdlfXNldFVzYWdlKGUpe3JldHVybiB0aGlzLnVzYWdlPWUsdGhpc31hZGRVcGRhdGVSYW5nZShlLHQpe3RoaXMudXBkYXRlUmFuZ2VzLnB1c2goe3N0YXJ0OmUsY291bnQ6dH0pfWNsZWFyVXBkYXRlUmFuZ2VzKCl7dGhpcy51cGRhdGVSYW5nZXMubGVuZ3RoPTB9Y29weShlKXtyZXR1cm4gdGhpcy5uYW1lPWUubmFtZSx0aGlzLmFycmF5PW5ldyBlLmFycmF5LmNvbnN0cnVjdG9yKGUuYXJyYXkpLHRoaXMuaXRlbVNpemU9ZS5pdGVtU2l6ZSx0aGlzLmNvdW50PWUuY291bnQsdGhpcy5ub3JtYWxpemVkPWUubm9ybWFsaXplZCx0aGlzLnVzYWdlPWUudXNhZ2UsdGhpcy5ncHVUeXBlPWUuZ3B1VHlwZSx0aGlzfWNvcHlBdChlLHQsbil7ZSo9dGhpcy5pdGVtU2l6ZSxuKj10Lml0ZW1TaXplO2ZvcihsZXQgaT0wLHM9dGhpcy5pdGVtU2l6ZTtpPHM7aSsrKXRoaXMuYXJyYXlbZStpXT10LmFycmF5W24raV07cmV0dXJuIHRoaXN9Y29weUFycmF5KGUpe3JldHVybiB0aGlzLmFycmF5LnNldChlKSx0aGlzfWFwcGx5TWF0cml4MyhlKXtpZih0aGlzLml0ZW1TaXplPT09Milmb3IobGV0IHQ9MCxuPXRoaXMuY291bnQ7dDxuO3QrKylvby5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsdCksb28uYXBwbHlNYXRyaXgzKGUpLHRoaXMuc2V0WFkodCxvby54LG9vLnkpO2Vsc2UgaWYodGhpcy5pdGVtU2l6ZT09PTMpZm9yKGxldCB0PTAsbj10aGlzLmNvdW50O3Q8bjt0KyspQ3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLHQpLEN0LmFwcGx5TWF0cml4MyhlKSx0aGlzLnNldFhZWih0LEN0LngsQ3QueSxDdC56KTtyZXR1cm4gdGhpc31hcHBseU1hdHJpeDQoZSl7Zm9yKGxldCB0PTAsbj10aGlzLmNvdW50O3Q8bjt0KyspQ3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLHQpLEN0LmFwcGx5TWF0cml4NChlKSx0aGlzLnNldFhZWih0LEN0LngsQ3QueSxDdC56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeChlKXtmb3IobGV0IHQ9MCxuPXRoaXMuY291bnQ7dDxuO3QrKylDdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsdCksQ3QuYXBwbHlOb3JtYWxNYXRyaXgoZSksdGhpcy5zZXRYWVoodCxDdC54LEN0LnksQ3Queik7cmV0dXJuIHRoaXN9dHJhbnNmb3JtRGlyZWN0aW9uKGUpe2ZvcihsZXQgdD0wLG49dGhpcy5jb3VudDt0PG47dCsrKUN0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyx0KSxDdC50cmFuc2Zvcm1EaXJlY3Rpb24oZSksdGhpcy5zZXRYWVoodCxDdC54LEN0LnksQ3Queik7cmV0dXJuIHRoaXN9c2V0KGUsdD0wKXtyZXR1cm4gdGhpcy5hcnJheS5zZXQoZSx0KSx0aGlzfWdldENvbXBvbmVudChlLHQpe2xldCBuPXRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplK3RdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihuPW9uKG4sdGhpcy5hcnJheSkpLG59c2V0Q29tcG9uZW50KGUsdCxuKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYobj1xZShuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W2UqdGhpcy5pdGVtU2l6ZSt0XT1uLHRoaXN9Z2V0WChlKXtsZXQgdD10aGlzLmFycmF5W2UqdGhpcy5pdGVtU2l6ZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHQ9b24odCx0aGlzLmFycmF5KSksdH1zZXRYKGUsdCl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHQ9cWUodCx0aGlzLmFycmF5KSksdGhpcy5hcnJheVtlKnRoaXMuaXRlbVNpemVdPXQsdGhpc31nZXRZKGUpe2xldCB0PXRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzFdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9c2V0WShlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzFdPXQsdGhpc31nZXRaKGUpe2xldCB0PXRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzJdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9c2V0WihlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzJdPXQsdGhpc31nZXRXKGUpe2xldCB0PXRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzNdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9c2V0VyhlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzNdPXQsdGhpc31zZXRYWShlLHQsbil7cmV0dXJuIGUqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYodD1xZSh0LHRoaXMuYXJyYXkpLG49cWUobix0aGlzLmFycmF5KSksdGhpcy5hcnJheVtlKzBdPXQsdGhpcy5hcnJheVtlKzFdPW4sdGhpc31zZXRYWVooZSx0LG4saSl7cmV0dXJuIGUqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYodD1xZSh0LHRoaXMuYXJyYXkpLG49cWUobix0aGlzLmFycmF5KSxpPXFlKGksdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSswXT10LHRoaXMuYXJyYXlbZSsxXT1uLHRoaXMuYXJyYXlbZSsyXT1pLHRoaXN9c2V0WFlaVyhlLHQsbixpLHMpe3JldHVybiBlKj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKHQ9cWUodCx0aGlzLmFycmF5KSxuPXFlKG4sdGhpcy5hcnJheSksaT1xZShpLHRoaXMuYXJyYXkpLHM9cWUocyx0aGlzLmFycmF5KSksdGhpcy5hcnJheVtlKzBdPXQsdGhpcy5hcnJheVtlKzFdPW4sdGhpcy5hcnJheVtlKzJdPWksdGhpcy5hcnJheVtlKzNdPXMsdGhpc31vblVwbG9hZChlKXtyZXR1cm4gdGhpcy5vblVwbG9hZENhbGxiYWNrPWUsdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LHRoaXMuaXRlbVNpemUpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgZT17aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5mcm9tKHRoaXMuYXJyYXkpLG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfTtyZXR1cm4gdGhpcy5uYW1lIT09IiImJihlLm5hbWU9dGhpcy5uYW1lKSx0aGlzLnVzYWdlIT09TnMmJihlLnVzYWdlPXRoaXMudXNhZ2UpLGV9fWNsYXNzIHh4IGV4dGVuZHMgS2V7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKG5ldyBJbnQ4QXJyYXkoZSksdCxuKX19Y2xhc3MgeXggZXh0ZW5kcyBLZXtjb25zdHJ1Y3RvcihlLHQsbil7c3VwZXIobmV3IFVpbnQ4QXJyYXkoZSksdCxuKX19Y2xhc3MgdnggZXh0ZW5kcyBLZXtjb25zdHJ1Y3RvcihlLHQsbil7c3VwZXIobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGUpLHQsbil9fWNsYXNzIE14IGV4dGVuZHMgS2V7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKG5ldyBJbnQxNkFycmF5KGUpLHQsbil9fWNsYXNzIF9oIGV4dGVuZHMgS2V7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKG5ldyBVaW50MTZBcnJheShlKSx0LG4pfX1jbGFzcyBTeCBleHRlbmRzIEtle2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihuZXcgSW50MzJBcnJheShlKSx0LG4pfX1jbGFzcyB4aCBleHRlbmRzIEtle2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihuZXcgVWludDMyQXJyYXkoZSksdCxuKX19Y2xhc3MgYnggZXh0ZW5kcyBLZXtjb25zdHJ1Y3RvcihlLHQsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KGUpLHQsbiksdGhpcy5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGU9ITB9Z2V0WChlKXtsZXQgdD1Icyh0aGlzLmFycmF5W2UqdGhpcy5pdGVtU2l6ZV0pO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9c2V0WChlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplXT1obih0KSx0aGlzfWdldFkoZSl7bGV0IHQ9SHModGhpcy5hcnJheVtlKnRoaXMuaXRlbVNpemUrMV0pO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9c2V0WShlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzFdPWhuKHQpLHRoaXN9Z2V0WihlKXtsZXQgdD1Icyh0aGlzLmFycmF5W2UqdGhpcy5pdGVtU2l6ZSsyXSk7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHQ9b24odCx0aGlzLmFycmF5KSksdH1zZXRaKGUsdCl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHQ9cWUodCx0aGlzLmFycmF5KSksdGhpcy5hcnJheVtlKnRoaXMuaXRlbVNpemUrMl09aG4odCksdGhpc31nZXRXKGUpe2xldCB0PUhzKHRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzNdKTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYodD1vbih0LHRoaXMuYXJyYXkpKSx0fXNldFcoZSx0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYodD1xZSh0LHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W2UqdGhpcy5pdGVtU2l6ZSszXT1obih0KSx0aGlzfXNldFhZKGUsdCxuKXtyZXR1cm4gZSo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSksbj1xZShuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W2UrMF09aG4odCksdGhpcy5hcnJheVtlKzFdPWhuKG4pLHRoaXN9c2V0WFlaKGUsdCxuLGkpe3JldHVybiBlKj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKHQ9cWUodCx0aGlzLmFycmF5KSxuPXFlKG4sdGhpcy5hcnJheSksaT1xZShpLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W2UrMF09aG4odCksdGhpcy5hcnJheVtlKzFdPWhuKG4pLHRoaXMuYXJyYXlbZSsyXT1obihpKSx0aGlzfXNldFhZWlcoZSx0LG4saSxzKXtyZXR1cm4gZSo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSksbj1xZShuLHRoaXMuYXJyYXkpLGk9cWUoaSx0aGlzLmFycmF5KSxzPXFlKHMsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSswXT1obih0KSx0aGlzLmFycmF5W2UrMV09aG4obiksdGhpcy5hcnJheVtlKzJdPWhuKGkpLHRoaXMuYXJyYXlbZSszXT1obihzKSx0aGlzfX1jbGFzcyBTZSBleHRlbmRzIEtle2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihuZXcgRmxvYXQzMkFycmF5KGUpLHQsbil9fWNsYXNzIHd4IGV4dGVuZHMgS2V7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKG5ldyBGbG9hdDY0QXJyYXkoZSksdCxuKX19bGV0IEV4PTA7Y29uc3QgRW49bmV3IEllLHloPW5ldyBydCxCcj1uZXcgUCx5bj1uZXcgRHQsV3M9bmV3IER0LE50PW5ldyBQO2NsYXNzIGtlIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNCdWZmZXJHZW9tZXRyeT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpFeCsrfSksdGhpcy51dWlkPV9uKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iQnVmZmVyR2VvbWV0cnkiLHRoaXMuaW5kZXg9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT0hMSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsLHRoaXMuZHJhd1JhbmdlPXtzdGFydDowLGNvdW50OjEvMH0sdGhpcy51c2VyRGF0YT17fX1nZXRJbmRleCgpe3JldHVybiB0aGlzLmluZGV4fXNldEluZGV4KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP3RoaXMuaW5kZXg9bmV3KHdkKGUpP3hoOl9oKShlLDEpOnRoaXMuaW5kZXg9ZSx0aGlzfWdldEF0dHJpYnV0ZShlKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2VdfXNldEF0dHJpYnV0ZShlLHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbZV09dCx0aGlzfWRlbGV0ZUF0dHJpYnV0ZShlKXtyZXR1cm4gZGVsZXRlIHRoaXMuYXR0cmlidXRlc1tlXSx0aGlzfWhhc0F0dHJpYnV0ZShlKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2VdIT09dm9pZCAwfWFkZEdyb3VwKGUsdCxuPTApe3RoaXMuZ3JvdXBzLnB1c2goe3N0YXJ0OmUsY291bnQ6dCxtYXRlcmlhbEluZGV4Om59KX1jbGVhckdyb3Vwcygpe3RoaXMuZ3JvdXBzPVtdfXNldERyYXdSYW5nZShlLHQpe3RoaXMuZHJhd1JhbmdlLnN0YXJ0PWUsdGhpcy5kcmF3UmFuZ2UuY291bnQ9dH1hcHBseU1hdHJpeDQoZSl7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247dCE9PXZvaWQgMCYmKHQuYXBwbHlNYXRyaXg0KGUpLHQubmVlZHNVcGRhdGU9ITApO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtpZihuIT09dm9pZCAwKXtjb25zdCBzPW5ldyBaZSgpLmdldE5vcm1hbE1hdHJpeChlKTtuLmFwcGx5Tm9ybWFsTWF0cml4KHMpLG4ubmVlZHNVcGRhdGU9ITB9Y29uc3QgaT10aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDtyZXR1cm4gaSE9PXZvaWQgMCYmKGkudHJhbnNmb3JtRGlyZWN0aW9uKGUpLGkubmVlZHNVcGRhdGU9ITApLHRoaXMuYm91bmRpbmdCb3ghPT1udWxsJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpLHRoaXMuYm91bmRpbmdTcGhlcmUhPT1udWxsJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKGUpe3JldHVybiBFbi5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihlKSx0aGlzLmFwcGx5TWF0cml4NChFbiksdGhpc31yb3RhdGVYKGUpe3JldHVybiBFbi5tYWtlUm90YXRpb25YKGUpLHRoaXMuYXBwbHlNYXRyaXg0KEVuKSx0aGlzfXJvdGF0ZVkoZSl7cmV0dXJuIEVuLm1ha2VSb3RhdGlvblkoZSksdGhpcy5hcHBseU1hdHJpeDQoRW4pLHRoaXN9cm90YXRlWihlKXtyZXR1cm4gRW4ubWFrZVJvdGF0aW9uWihlKSx0aGlzLmFwcGx5TWF0cml4NChFbiksdGhpc310cmFuc2xhdGUoZSx0LG4pe3JldHVybiBFbi5tYWtlVHJhbnNsYXRpb24oZSx0LG4pLHRoaXMuYXBwbHlNYXRyaXg0KEVuKSx0aGlzfXNjYWxlKGUsdCxuKXtyZXR1cm4gRW4ubWFrZVNjYWxlKGUsdCxuKSx0aGlzLmFwcGx5TWF0cml4NChFbiksdGhpc31sb29rQXQoZSl7cmV0dXJuIHloLmxvb2tBdChlKSx5aC51cGRhdGVNYXRyaXgoKSx0aGlzLmFwcGx5TWF0cml4NCh5aC5tYXRyaXgpLHRoaXN9Y2VudGVyKCl7cmV0dXJuIHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoQnIpLm5lZ2F0ZSgpLHRoaXMudHJhbnNsYXRlKEJyLngsQnIueSxCci56KSx0aGlzfXNldEZyb21Qb2ludHMoZSl7Y29uc3QgdD1bXTtmb3IobGV0IG49MCxpPWUubGVuZ3RoO248aTtuKyspe2NvbnN0IHM9ZVtuXTt0LnB1c2gocy54LHMueSxzLnp8fDApfXJldHVybiB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZSh0LDMpKSx0aGlzfWNvbXB1dGVCb3VuZGluZ0JveCgpe3RoaXMuYm91bmRpbmdCb3g9PT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1uZXcgRHQpO2NvbnN0IGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLHQ9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYoZSYmZS5pc0dMQnVmZmVyQXR0cmlidXRlKXtjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgYm94LiBBbHRlcm5hdGl2ZWx5IHNldCAibWVzaC5mcnVzdHVtQ3VsbGVkIiB0byAiZmFsc2UiLicsdGhpcyksdGhpcy5ib3VuZGluZ0JveC5zZXQobmV3IFAoLTEvMCwtMS8wLC0xLzApLG5ldyBQKDEvMCwxLzAsMS8wKSk7cmV0dXJufWlmKGUhPT12b2lkIDApe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShlKSx0KWZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKyl7Y29uc3Qgcz10W25dO3luLnNldEZyb21CdWZmZXJBdHRyaWJ1dGUocyksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oTnQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1pbix5bi5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChOdCksTnQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1heCx5bi5tYXgpLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChOdCkpOih0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoeW4ubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoeW4ubWF4KSl9fWVsc2UgdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsoaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX1jb21wdXRlQm91bmRpbmdTcGhlcmUoKXt0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IEd0KTtjb25zdCBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbix0PXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKGUmJmUuaXNHTEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIHNwaGVyZS4gQWx0ZXJuYXRpdmVseSBzZXQgIm1lc2guZnJ1c3R1bUN1bGxlZCIgdG8gImZhbHNlIi4nLHRoaXMpLHRoaXMuYm91bmRpbmdTcGhlcmUuc2V0KG5ldyBQLDEvMCk7cmV0dXJufWlmKGUpe2NvbnN0IG49dGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7aWYoeW4uc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShlKSx0KWZvcihsZXQgcz0wLGE9dC5sZW5ndGg7czxhO3MrKyl7Y29uc3Qgbz10W3NdO1dzLnNldEZyb21CdWZmZXJBdHRyaWJ1dGUobyksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oTnQuYWRkVmVjdG9ycyh5bi5taW4sV3MubWluKSx5bi5leHBhbmRCeVBvaW50KE50KSxOdC5hZGRWZWN0b3JzKHluLm1heCxXcy5tYXgpLHluLmV4cGFuZEJ5UG9pbnQoTnQpKTooeW4uZXhwYW5kQnlQb2ludChXcy5taW4pLHluLmV4cGFuZEJ5UG9pbnQoV3MubWF4KSl9eW4uZ2V0Q2VudGVyKG4pO2xldCBpPTA7Zm9yKGxldCBzPTAsYT1lLmNvdW50O3M8YTtzKyspTnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHMpLGk9TWF0aC5tYXgoaSxuLmRpc3RhbmNlVG9TcXVhcmVkKE50KSk7aWYodClmb3IobGV0IHM9MCxhPXQubGVuZ3RoO3M8YTtzKyspe2NvbnN0IG89dFtzXSxsPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Zm9yKGxldCBjPTAsaD1vLmNvdW50O2M8aDtjKyspTnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLGMpLGwmJihCci5mcm9tQnVmZmVyQXR0cmlidXRlKGUsYyksTnQuYWRkKEJyKSksaT1NYXRoLm1heChpLG4uZGlzdGFuY2VUb1NxdWFyZWQoTnQpKX10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cz1NYXRoLnNxcnQoaSksaXNOYU4odGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX19Y29tcHV0ZVRhbmdlbnRzKCl7Y29uc3QgZT10aGlzLmluZGV4LHQ9dGhpcy5hdHRyaWJ1dGVzO2lmKGU9PT1udWxsfHx0LnBvc2l0aW9uPT09dm9pZCAwfHx0Lm5vcm1hbD09PXZvaWQgMHx8dC51dj09PXZvaWQgMCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBmYWlsZWQuIE1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyAoaW5kZXgsIHBvc2l0aW9uLCBub3JtYWwgb3IgdXYpIik7cmV0dXJufWNvbnN0IG49ZS5hcnJheSxpPXQucG9zaXRpb24uYXJyYXkscz10Lm5vcm1hbC5hcnJheSxhPXQudXYuYXJyYXksbz1pLmxlbmd0aC8zO3RoaXMuaGFzQXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMSYmdGhpcy5zZXRBdHRyaWJ1dGUoInRhbmdlbnQiLG5ldyBLZShuZXcgRmxvYXQzMkFycmF5KDQqbyksNCkpO2NvbnN0IGw9dGhpcy5nZXRBdHRyaWJ1dGUoInRhbmdlbnQiKS5hcnJheSxjPVtdLGg9W107Zm9yKGxldCB3PTA7dzxvO3crKyljW3ddPW5ldyBQLGhbd109bmV3IFA7Y29uc3QgdT1uZXcgUCxmPW5ldyBQLGQ9bmV3IFAscD1uZXcgcSxfPW5ldyBxLGc9bmV3IHEsbT1uZXcgUCx5PW5ldyBQO2Z1bmN0aW9uIHgodyxSLE4pe3UuZnJvbUFycmF5KGksdyozKSxmLmZyb21BcnJheShpLFIqMyksZC5mcm9tQXJyYXkoaSxOKjMpLHAuZnJvbUFycmF5KGEsdyoyKSxfLmZyb21BcnJheShhLFIqMiksZy5mcm9tQXJyYXkoYSxOKjIpLGYuc3ViKHUpLGQuc3ViKHUpLF8uc3ViKHApLGcuc3ViKHApO2NvbnN0IEI9MS8oXy54KmcueS1nLngqXy55KTtpc0Zpbml0ZShCKSYmKG0uY29weShmKS5tdWx0aXBseVNjYWxhcihnLnkpLmFkZFNjYWxlZFZlY3RvcihkLC1fLnkpLm11bHRpcGx5U2NhbGFyKEIpLHkuY29weShkKS5tdWx0aXBseVNjYWxhcihfLngpLmFkZFNjYWxlZFZlY3RvcihmLC1nLngpLm11bHRpcGx5U2NhbGFyKEIpLGNbd10uYWRkKG0pLGNbUl0uYWRkKG0pLGNbTl0uYWRkKG0pLGhbd10uYWRkKHkpLGhbUl0uYWRkKHkpLGhbTl0uYWRkKHkpKX1sZXQgdj10aGlzLmdyb3Vwczt2Lmxlbmd0aD09PTAmJih2PVt7c3RhcnQ6MCxjb3VudDpuLmxlbmd0aH1dKTtmb3IobGV0IHc9MCxSPXYubGVuZ3RoO3c8UjsrK3cpe2NvbnN0IE49dlt3XSxCPU4uc3RhcnQsST1OLmNvdW50O2ZvcihsZXQgVT1CLHo9QitJO1U8ejtVKz0zKXgobltVKzBdLG5bVSsxXSxuW1UrMl0pfWNvbnN0IFM9bmV3IFAsYj1uZXcgUCxBPW5ldyBQLEw9bmV3IFA7ZnVuY3Rpb24gTSh3KXtBLmZyb21BcnJheShzLHcqMyksTC5jb3B5KEEpO2NvbnN0IFI9Y1t3XTtTLmNvcHkoUiksUy5zdWIoQS5tdWx0aXBseVNjYWxhcihBLmRvdChSKSkpLm5vcm1hbGl6ZSgpLGIuY3Jvc3NWZWN0b3JzKEwsUik7Y29uc3QgQj1iLmRvdChoW3ddKTwwPy0xOjE7bFt3KjRdPVMueCxsW3cqNCsxXT1TLnksbFt3KjQrMl09Uy56LGxbdyo0KzNdPUJ9Zm9yKGxldCB3PTAsUj12Lmxlbmd0aDt3PFI7Kyt3KXtjb25zdCBOPXZbd10sQj1OLnN0YXJ0LEk9Ti5jb3VudDtmb3IobGV0IFU9Qix6PUIrSTtVPHo7VSs9MylNKG5bVSswXSksTShuW1UrMV0pLE0obltVKzJdKX19Y29tcHV0ZVZlcnRleE5vcm1hbHMoKXtjb25zdCBlPXRoaXMuaW5kZXgsdD10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZih0IT09dm9pZCAwKXtsZXQgbj10aGlzLmdldEF0dHJpYnV0ZSgibm9ybWFsIik7aWYobj09PXZvaWQgMCluPW5ldyBLZShuZXcgRmxvYXQzMkFycmF5KHQuY291bnQqMyksMyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbik7ZWxzZSBmb3IobGV0IGY9MCxkPW4uY291bnQ7ZjxkO2YrKyluLnNldFhZWihmLDAsMCwwKTtjb25zdCBpPW5ldyBQLHM9bmV3IFAsYT1uZXcgUCxvPW5ldyBQLGw9bmV3IFAsYz1uZXcgUCxoPW5ldyBQLHU9bmV3IFA7aWYoZSlmb3IobGV0IGY9MCxkPWUuY291bnQ7ZjxkO2YrPTMpe2NvbnN0IHA9ZS5nZXRYKGYrMCksXz1lLmdldFgoZisxKSxnPWUuZ2V0WChmKzIpO2kuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHApLHMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LF8pLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGcpLGguc3ViVmVjdG9ycyhhLHMpLHUuc3ViVmVjdG9ycyhpLHMpLGguY3Jvc3ModSksby5mcm9tQnVmZmVyQXR0cmlidXRlKG4scCksbC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sXyksYy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sZyksby5hZGQoaCksbC5hZGQoaCksYy5hZGQoaCksbi5zZXRYWVoocCxvLngsby55LG8ueiksbi5zZXRYWVooXyxsLngsbC55LGwueiksbi5zZXRYWVooZyxjLngsYy55LGMueil9ZWxzZSBmb3IobGV0IGY9MCxkPXQuY291bnQ7ZjxkO2YrPTMpaS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZiswKSxzLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxmKzEpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGYrMiksaC5zdWJWZWN0b3JzKGEscyksdS5zdWJWZWN0b3JzKGkscyksaC5jcm9zcyh1KSxuLnNldFhZWihmKzAsaC54LGgueSxoLnopLG4uc2V0WFlaKGYrMSxoLngsaC55LGgueiksbi5zZXRYWVooZisyLGgueCxoLnksaC56KTt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKSxuLm5lZWRzVXBkYXRlPSEwfX1ub3JtYWxpemVOb3JtYWxzKCl7Y29uc3QgZT10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2ZvcihsZXQgdD0wLG49ZS5jb3VudDt0PG47dCsrKU50LmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx0KSxOdC5ub3JtYWxpemUoKSxlLnNldFhZWih0LE50LngsTnQueSxOdC56KX10b05vbkluZGV4ZWQoKXtmdW5jdGlvbiBlKG8sbCl7Y29uc3QgYz1vLmFycmF5LGg9by5pdGVtU2l6ZSx1PW8ubm9ybWFsaXplZCxmPW5ldyBjLmNvbnN0cnVjdG9yKGwubGVuZ3RoKmgpO2xldCBkPTAscD0wO2ZvcihsZXQgXz0wLGc9bC5sZW5ndGg7XzxnO18rKyl7by5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2Q9bFtfXSpvLmRhdGEuc3RyaWRlK28ub2Zmc2V0OmQ9bFtfXSpoO2ZvcihsZXQgbT0wO208aDttKyspZltwKytdPWNbZCsrXX1yZXR1cm4gbmV3IEtlKGYsaCx1KX1pZih0aGlzLmluZGV4PT09bnVsbClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogQnVmZmVyR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO2NvbnN0IHQ9bmV3IGtlLG49dGhpcy5pbmRleC5hcnJheSxpPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgbyBpbiBpKXtjb25zdCBsPWlbb10sYz1lKGwsbik7dC5zZXRBdHRyaWJ1dGUobyxjKX1jb25zdCBzPXRoaXMubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBvIGluIHMpe2NvbnN0IGw9W10sYz1zW29dO2ZvcihsZXQgaD0wLHU9Yy5sZW5ndGg7aDx1O2grKyl7Y29uc3QgZj1jW2hdLGQ9ZShmLG4pO2wucHVzaChkKX10Lm1vcnBoQXR0cmlidXRlc1tvXT1sfXQubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBhPXRoaXMuZ3JvdXBzO2ZvcihsZXQgbz0wLGw9YS5sZW5ndGg7bzxsO28rKyl7Y29uc3QgYz1hW29dO3QuYWRkR3JvdXAoYy5zdGFydCxjLmNvdW50LGMubWF0ZXJpYWxJbmRleCl9cmV0dXJuIHR9dG9KU09OKCl7Y29uc3QgZT17bWV0YWRhdGE6e3ZlcnNpb246NC42LHR5cGU6IkJ1ZmZlckdlb21ldHJ5IixnZW5lcmF0b3I6IkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiJ9fTtpZihlLnV1aWQ9dGhpcy51dWlkLGUudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJihlLm5hbWU9dGhpcy5uYW1lKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKGUudXNlckRhdGE9dGhpcy51c2VyRGF0YSksdGhpcy5wYXJhbWV0ZXJzIT09dm9pZCAwKXtjb25zdCBsPXRoaXMucGFyYW1ldGVycztmb3IoY29uc3QgYyBpbiBsKWxbY10hPT12b2lkIDAmJihlW2NdPWxbY10pO3JldHVybiBlfWUuZGF0YT17YXR0cmlidXRlczp7fX07Y29uc3QgdD10aGlzLmluZGV4O3QhPT1udWxsJiYoZS5kYXRhLmluZGV4PXt0eXBlOnQuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LmFycmF5KX0pO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBsIGluIG4pe2NvbnN0IGM9bltsXTtlLmRhdGEuYXR0cmlidXRlc1tsXT1jLnRvSlNPTihlLmRhdGEpfWNvbnN0IGk9e307bGV0IHM9ITE7Zm9yKGNvbnN0IGwgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IGM9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbbF0saD1bXTtmb3IobGV0IHU9MCxmPWMubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9Y1t1XTtoLnB1c2goZC50b0pTT04oZS5kYXRhKSl9aC5sZW5ndGg+MCYmKGlbbF09aCxzPSEwKX1zJiYoZS5kYXRhLm1vcnBoQXR0cmlidXRlcz1pLGUuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBhPXRoaXMuZ3JvdXBzO2EubGVuZ3RoPjAmJihlLmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYSkpKTtjb25zdCBvPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIG8hPT1udWxsJiYoZS5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6by5jZW50ZXIudG9BcnJheSgpLHJhZGl1czpvLnJhZGl1c30pLGV9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkoZSl7dGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsO2NvbnN0IHQ9e307dGhpcy5uYW1lPWUubmFtZTtjb25zdCBuPWUuaW5kZXg7biE9PW51bGwmJnRoaXMuc2V0SW5kZXgobi5jbG9uZSh0KSk7Y29uc3QgaT1lLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGMgaW4gaSl7Y29uc3QgaD1pW2NdO3RoaXMuc2V0QXR0cmlidXRlKGMsaC5jbG9uZSh0KSl9Y29uc3Qgcz1lLm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgYyBpbiBzKXtjb25zdCBoPVtdLHU9c1tjXTtmb3IobGV0IGY9MCxkPXUubGVuZ3RoO2Y8ZDtmKyspaC5wdXNoKHVbZl0uY2xvbmUodCkpO3RoaXMubW9ycGhBdHRyaWJ1dGVzW2NdPWh9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT1lLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2NvbnN0IGE9ZS5ncm91cHM7Zm9yKGxldCBjPTAsaD1hLmxlbmd0aDtjPGg7YysrKXtjb25zdCB1PWFbY107dGhpcy5hZGRHcm91cCh1LnN0YXJ0LHUuY291bnQsdS5tYXRlcmlhbEluZGV4KX1jb25zdCBvPWUuYm91bmRpbmdCb3g7byE9PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PW8uY2xvbmUoKSk7Y29uc3QgbD1lLmJvdW5kaW5nU3BoZXJlO3JldHVybiBsIT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bC5jbG9uZSgpKSx0aGlzLmRyYXdSYW5nZS5zdGFydD1lLmRyYXdSYW5nZS5zdGFydCx0aGlzLmRyYXdSYW5nZS5jb3VudD1lLmRyYXdSYW5nZS5jb3VudCx0aGlzLnVzZXJEYXRhPWUudXNlckRhdGEsdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX1jb25zdCB6ZD1uZXcgSWUsJGk9bmV3IFVyLGxvPW5ldyBHdCxrZD1uZXcgUCx6cj1uZXcgUCxrcj1uZXcgUCxHcj1uZXcgUCx2aD1uZXcgUCxjbz1uZXcgUCxobz1uZXcgcSx1bz1uZXcgcSxmbz1uZXcgcSxHZD1uZXcgUCxWZD1uZXcgUCxIZD1uZXcgUCxwbz1uZXcgUCxtbz1uZXcgUDtjbGFzcyBMdCBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKGU9bmV3IGtlLHQ9bmV3IFBpKXtzdXBlcigpLHRoaXMuaXNNZXNoPSEwLHRoaXMudHlwZT0iTWVzaCIsdGhpcy5nZW9tZXRyeT1lLHRoaXMubWF0ZXJpYWw9dCx0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpfWNvcHkoZSx0KXtyZXR1cm4gc3VwZXIuY29weShlLHQpLGUubW9ycGhUYXJnZXRJbmZsdWVuY2VzIT09dm9pZCAwJiYodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9ZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMuc2xpY2UoKSksZS5tb3JwaFRhcmdldERpY3Rpb25hcnkhPT12b2lkIDAmJih0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT1PYmplY3QuYXNzaWduKHt9LGUubW9ycGhUYXJnZXREaWN0aW9uYXJ5KSksdGhpcy5tYXRlcmlhbD1BcnJheS5pc0FycmF5KGUubWF0ZXJpYWwpP2UubWF0ZXJpYWwuc2xpY2UoKTplLm1hdGVyaWFsLHRoaXMuZ2VvbWV0cnk9ZS5nZW9tZXRyeSx0aGlzfXVwZGF0ZU1vcnBoVGFyZ2V0cygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMsbj1PYmplY3Qua2V5cyh0KTtpZihuLmxlbmd0aD4wKXtjb25zdCBpPXRbblswXV07aWYoaSE9PXZvaWQgMCl7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e307Zm9yKGxldCBzPTAsYT1pLmxlbmd0aDtzPGE7cysrKXtjb25zdCBvPWlbc10ubmFtZXx8U3RyaW5nKHMpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCksdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbb109c319fX1nZXRWZXJ0ZXhQb3NpdGlvbihlLHQpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxpPW4uYXR0cmlidXRlcy5wb3NpdGlvbixzPW4ubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLGE9bi5tb3JwaFRhcmdldHNSZWxhdGl2ZTt0LmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxlKTtjb25zdCBvPXRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzO2lmKHMmJm8pe2NvLnNldCgwLDAsMCk7Zm9yKGxldCBsPTAsYz1zLmxlbmd0aDtsPGM7bCsrKXtjb25zdCBoPW9bbF0sdT1zW2xdO2ghPT0wJiYodmguZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LGUpLGE/Y28uYWRkU2NhbGVkVmVjdG9yKHZoLGgpOmNvLmFkZFNjYWxlZFZlY3Rvcih2aC5zdWIodCksaCkpfXQuYWRkKGNvKX1yZXR1cm4gdH1yYXljYXN0KGUsdCl7Y29uc3Qgbj10aGlzLmdlb21ldHJ5LGk9dGhpcy5tYXRlcmlhbCxzPXRoaXMubWF0cml4V29ybGQ7aSE9PXZvaWQgMCYmKG4uYm91bmRpbmdTcGhlcmU9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLGxvLmNvcHkobi5ib3VuZGluZ1NwaGVyZSksbG8uYXBwbHlNYXRyaXg0KHMpLCRpLmNvcHkoZS5yYXkpLnJlY2FzdChlLm5lYXIpLCEobG8uY29udGFpbnNQb2ludCgkaS5vcmlnaW4pPT09ITEmJigkaS5pbnRlcnNlY3RTcGhlcmUobG8sa2QpPT09bnVsbHx8JGkub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKGtkKT54cyhlLmZhci1lLm5lYXIsMikpKSYmKHpkLmNvcHkocykuaW52ZXJ0KCksJGkuY29weShlLnJheSkuYXBwbHlNYXRyaXg0KHpkKSwhKG4uYm91bmRpbmdCb3ghPT1udWxsJiYkaS5pbnRlcnNlY3RzQm94KG4uYm91bmRpbmdCb3gpPT09ITEpJiZ0aGlzLl9jb21wdXRlSW50ZXJzZWN0aW9ucyhlLHQsJGkpKSl9X2NvbXB1dGVJbnRlcnNlY3Rpb25zKGUsdCxuKXtsZXQgaTtjb25zdCBzPXRoaXMuZ2VvbWV0cnksYT10aGlzLm1hdGVyaWFsLG89cy5pbmRleCxsPXMuYXR0cmlidXRlcy5wb3NpdGlvbixjPXMuYXR0cmlidXRlcy51dixoPXMuYXR0cmlidXRlcy51djEsdT1zLmF0dHJpYnV0ZXMubm9ybWFsLGY9cy5ncm91cHMsZD1zLmRyYXdSYW5nZTtpZihvIT09bnVsbClpZihBcnJheS5pc0FycmF5KGEpKWZvcihsZXQgcD0wLF89Zi5sZW5ndGg7cDxfO3ArKyl7Y29uc3QgZz1mW3BdLG09YVtnLm1hdGVyaWFsSW5kZXhdLHk9TWF0aC5tYXgoZy5zdGFydCxkLnN0YXJ0KSx4PU1hdGgubWluKG8uY291bnQsTWF0aC5taW4oZy5zdGFydCtnLmNvdW50LGQuc3RhcnQrZC5jb3VudCkpO2ZvcihsZXQgdj15LFM9eDt2PFM7dis9Myl7Y29uc3QgYj1vLmdldFgodiksQT1vLmdldFgodisxKSxMPW8uZ2V0WCh2KzIpO2k9Z28odGhpcyxtLGUsbixjLGgsdSxiLEEsTCksaSYmKGkuZmFjZUluZGV4PU1hdGguZmxvb3Iodi8zKSxpLmZhY2UubWF0ZXJpYWxJbmRleD1nLm1hdGVyaWFsSW5kZXgsdC5wdXNoKGkpKX19ZWxzZXtjb25zdCBwPU1hdGgubWF4KDAsZC5zdGFydCksXz1NYXRoLm1pbihvLmNvdW50LGQuc3RhcnQrZC5jb3VudCk7Zm9yKGxldCBnPXAsbT1fO2c8bTtnKz0zKXtjb25zdCB5PW8uZ2V0WChnKSx4PW8uZ2V0WChnKzEpLHY9by5nZXRYKGcrMik7aT1nbyh0aGlzLGEsZSxuLGMsaCx1LHkseCx2KSxpJiYoaS5mYWNlSW5kZXg9TWF0aC5mbG9vcihnLzMpLHQucHVzaChpKSl9fWVsc2UgaWYobCE9PXZvaWQgMClpZihBcnJheS5pc0FycmF5KGEpKWZvcihsZXQgcD0wLF89Zi5sZW5ndGg7cDxfO3ArKyl7Y29uc3QgZz1mW3BdLG09YVtnLm1hdGVyaWFsSW5kZXhdLHk9TWF0aC5tYXgoZy5zdGFydCxkLnN0YXJ0KSx4PU1hdGgubWluKGwuY291bnQsTWF0aC5taW4oZy5zdGFydCtnLmNvdW50LGQuc3RhcnQrZC5jb3VudCkpO2ZvcihsZXQgdj15LFM9eDt2PFM7dis9Myl7Y29uc3QgYj12LEE9disxLEw9disyO2k9Z28odGhpcyxtLGUsbixjLGgsdSxiLEEsTCksaSYmKGkuZmFjZUluZGV4PU1hdGguZmxvb3Iodi8zKSxpLmZhY2UubWF0ZXJpYWxJbmRleD1nLm1hdGVyaWFsSW5kZXgsdC5wdXNoKGkpKX19ZWxzZXtjb25zdCBwPU1hdGgubWF4KDAsZC5zdGFydCksXz1NYXRoLm1pbihsLmNvdW50LGQuc3RhcnQrZC5jb3VudCk7Zm9yKGxldCBnPXAsbT1fO2c8bTtnKz0zKXtjb25zdCB5PWcseD1nKzEsdj1nKzI7aT1nbyh0aGlzLGEsZSxuLGMsaCx1LHkseCx2KSxpJiYoaS5mYWNlSW5kZXg9TWF0aC5mbG9vcihnLzMpLHQucHVzaChpKSl9fX19ZnVuY3Rpb24gQXgocixlLHQsbixpLHMsYSxvKXtsZXQgbDtpZihlLnNpZGU9PT1ZdD9sPW4uaW50ZXJzZWN0VHJpYW5nbGUoYSxzLGksITAsbyk6bD1uLmludGVyc2VjdFRyaWFuZ2xlKGkscyxhLGUuc2lkZT09PVluLG8pLGw9PT1udWxsKXJldHVybiBudWxsO21vLmNvcHkobyksbW8uYXBwbHlNYXRyaXg0KHIubWF0cml4V29ybGQpO2NvbnN0IGM9dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8obW8pO3JldHVybiBjPHQubmVhcnx8Yz50LmZhcj9udWxsOntkaXN0YW5jZTpjLHBvaW50Om1vLmNsb25lKCksb2JqZWN0OnJ9fWZ1bmN0aW9uIGdvKHIsZSx0LG4saSxzLGEsbyxsLGMpe3IuZ2V0VmVydGV4UG9zaXRpb24obyx6ciksci5nZXRWZXJ0ZXhQb3NpdGlvbihsLGtyKSxyLmdldFZlcnRleFBvc2l0aW9uKGMsR3IpO2NvbnN0IGg9QXgocixlLHQsbix6cixrcixHcixwbyk7aWYoaCl7aSYmKGhvLmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxvKSx1by5mcm9tQnVmZmVyQXR0cmlidXRlKGksbCksZm8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLGMpLGgudXY9Y24uZ2V0SW50ZXJwb2xhdGlvbihwbyx6cixrcixHcixobyx1byxmbyxuZXcgcSkpLHMmJihoby5mcm9tQnVmZmVyQXR0cmlidXRlKHMsbyksdW8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGwpLGZvLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxjKSxoLnV2MT1jbi5nZXRJbnRlcnBvbGF0aW9uKHBvLHpyLGtyLEdyLGhvLHVvLGZvLG5ldyBxKSxoLnV2Mj1oLnV2MSksYSYmKEdkLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxvKSxWZC5mcm9tQnVmZmVyQXR0cmlidXRlKGEsbCksSGQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGMpLGgubm9ybWFsPWNuLmdldEludGVycG9sYXRpb24ocG8senIsa3IsR3IsR2QsVmQsSGQsbmV3IFApLGgubm9ybWFsLmRvdChuLmRpcmVjdGlvbik+MCYmaC5ub3JtYWwubXVsdGlwbHlTY2FsYXIoLTEpKTtjb25zdCB1PXthOm8sYjpsLGMsbm9ybWFsOm5ldyBQLG1hdGVyaWFsSW5kZXg6MH07Y24uZ2V0Tm9ybWFsKHpyLGtyLEdyLHUubm9ybWFsKSxoLmZhY2U9dX1yZXR1cm4gaH1jbGFzcyBZaSBleHRlbmRzIGtle2NvbnN0cnVjdG9yKGU9MSx0PTEsbj0xLGk9MSxzPTEsYT0xKXtzdXBlcigpLHRoaXMudHlwZT0iQm94R2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17d2lkdGg6ZSxoZWlnaHQ6dCxkZXB0aDpuLHdpZHRoU2VnbWVudHM6aSxoZWlnaHRTZWdtZW50czpzLGRlcHRoU2VnbWVudHM6YX07Y29uc3Qgbz10aGlzO2k9TWF0aC5mbG9vcihpKSxzPU1hdGguZmxvb3IocyksYT1NYXRoLmZsb29yKGEpO2NvbnN0IGw9W10sYz1bXSxoPVtdLHU9W107bGV0IGY9MCxkPTA7cCgieiIsInkiLCJ4IiwtMSwtMSxuLHQsZSxhLHMsMCkscCgieiIsInkiLCJ4IiwxLC0xLG4sdCwtZSxhLHMsMSkscCgieCIsInoiLCJ5IiwxLDEsZSxuLHQsaSxhLDIpLHAoIngiLCJ6IiwieSIsMSwtMSxlLG4sLXQsaSxhLDMpLHAoIngiLCJ5IiwieiIsMSwtMSxlLHQsbixpLHMsNCkscCgieCIsInkiLCJ6IiwtMSwtMSxlLHQsLW4saSxzLDUpLHRoaXMuc2V0SW5kZXgobCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoYywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKGgsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKHUsMikpO2Z1bmN0aW9uIHAoXyxnLG0seSx4LHYsUyxiLEEsTCxNKXtjb25zdCB3PXYvQSxSPVMvTCxOPXYvMixCPVMvMixJPWIvMixVPUErMSx6PUwrMTtsZXQgRj0wLFo9MDtjb25zdCBWPW5ldyBQO2ZvcihsZXQgUT0wO1E8ejtRKyspe2NvbnN0IG5lPVEqUi1CO2ZvcihsZXQgZmU9MDtmZTxVO2ZlKyspe2NvbnN0ICQ9ZmUqdy1OO1ZbX109JCp5LFZbZ109bmUqeCxWW21dPUksYy5wdXNoKFYueCxWLnksVi56KSxWW19dPTAsVltnXT0wLFZbbV09Yj4wPzE6LTEsaC5wdXNoKFYueCxWLnksVi56KSx1LnB1c2goZmUvQSksdS5wdXNoKDEtUS9MKSxGKz0xfX1mb3IobGV0IFE9MDtRPEw7USsrKWZvcihsZXQgbmU9MDtuZTxBO25lKyspe2NvbnN0IGZlPWYrbmUrVSpRLCQ9ZituZStVKihRKzEpLGVlPWYrKG5lKzEpK1UqKFErMSksZGU9ZisobmUrMSkrVSpRO2wucHVzaChmZSwkLGRlKSxsLnB1c2goJCxlZSxkZSksWis9Nn1vLmFkZEdyb3VwKGQsWixNKSxkKz1aLGYrPUZ9fWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IFlpKGUud2lkdGgsZS5oZWlnaHQsZS5kZXB0aCxlLndpZHRoU2VnbWVudHMsZS5oZWlnaHRTZWdtZW50cyxlLmRlcHRoU2VnbWVudHMpfX1mdW5jdGlvbiBWcihyKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IGluIHIpe2VbdF09e307Zm9yKGNvbnN0IG4gaW4gclt0XSl7Y29uc3QgaT1yW3RdW25dO2kmJihpLmlzQ29sb3J8fGkuaXNNYXRyaXgzfHxpLmlzTWF0cml4NHx8aS5pc1ZlY3RvcjJ8fGkuaXNWZWN0b3IzfHxpLmlzVmVjdG9yNHx8aS5pc1RleHR1cmV8fGkuaXNRdWF0ZXJuaW9uKT9pLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT8oY29uc29sZS53YXJuKCJVbmlmb3Jtc1V0aWxzOiBUZXh0dXJlcyBvZiByZW5kZXIgdGFyZ2V0cyBjYW5ub3QgYmUgY2xvbmVkIHZpYSBjbG9uZVVuaWZvcm1zKCkgb3IgbWVyZ2VVbmlmb3JtcygpLiIpLGVbdF1bbl09bnVsbCk6ZVt0XVtuXT1pLmNsb25lKCk6QXJyYXkuaXNBcnJheShpKT9lW3RdW25dPWkuc2xpY2UoKTplW3RdW25dPWl9fXJldHVybiBlfWZ1bmN0aW9uIFp0KHIpe2NvbnN0IGU9e307Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kyspe2NvbnN0IG49VnIoclt0XSk7Zm9yKGNvbnN0IGkgaW4gbillW2ldPW5baV19cmV0dXJuIGV9ZnVuY3Rpb24gVHgocil7Y29uc3QgZT1bXTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyllLnB1c2goclt0XS5jbG9uZSgpKTtyZXR1cm4gZX1mdW5jdGlvbiBXZChyKXtyZXR1cm4gci5nZXRSZW5kZXJUYXJnZXQoKT09PW51bGw/ci5vdXRwdXRDb2xvclNwYWNlOm90LndvcmtpbmdDb2xvclNwYWNlfWNvbnN0IFhkPXtjbG9uZTpWcixtZXJnZTpadH07dmFyIEN4PWB2b2lkIG1haW4oKSB7CglnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7Cn1gLFJ4PWB2b2lkIG1haW4oKSB7CglnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTsKfWA7Y2xhc3MgSG4gZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNTaGFkZXJNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlNoYWRlck1hdGVyaWFsIix0aGlzLmRlZmluZXM9e30sdGhpcy51bmlmb3Jtcz17fSx0aGlzLnVuaWZvcm1zR3JvdXBzPVtdLHRoaXMudmVydGV4U2hhZGVyPUN4LHRoaXMuZnJhZ21lbnRTaGFkZXI9UngsdGhpcy5saW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuZm9nPSExLHRoaXMubGlnaHRzPSExLHRoaXMuY2xpcHBpbmc9ITEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9ITAsdGhpcy5leHRlbnNpb25zPXtkZXJpdmF0aXZlczohMSxmcmFnRGVwdGg6ITEsZHJhd0J1ZmZlcnM6ITEsc2hhZGVyVGV4dHVyZUxPRDohMX0sdGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzPXtjb2xvcjpbMSwxLDFdLHV2OlswLDBdLHV2MTpbMCwwXX0sdGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lPXZvaWQgMCx0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMSx0aGlzLmdsc2xWZXJzaW9uPW51bGwsZSE9PXZvaWQgMCYmdGhpcy5zZXRWYWx1ZXMoZSl9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLmZyYWdtZW50U2hhZGVyPWUuZnJhZ21lbnRTaGFkZXIsdGhpcy52ZXJ0ZXhTaGFkZXI9ZS52ZXJ0ZXhTaGFkZXIsdGhpcy51bmlmb3Jtcz1WcihlLnVuaWZvcm1zKSx0aGlzLnVuaWZvcm1zR3JvdXBzPVR4KGUudW5pZm9ybXNHcm91cHMpLHRoaXMuZGVmaW5lcz1PYmplY3QuYXNzaWduKHt9LGUuZGVmaW5lcyksdGhpcy53aXJlZnJhbWU9ZS53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9ZS53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy5mb2c9ZS5mb2csdGhpcy5saWdodHM9ZS5saWdodHMsdGhpcy5jbGlwcGluZz1lLmNsaXBwaW5nLHRoaXMuZXh0ZW5zaW9ucz1PYmplY3QuYXNzaWduKHt9LGUuZXh0ZW5zaW9ucyksdGhpcy5nbHNsVmVyc2lvbj1lLmdsc2xWZXJzaW9uLHRoaXN9dG9KU09OKGUpe2NvbnN0IHQ9c3VwZXIudG9KU09OKGUpO3QuZ2xzbFZlcnNpb249dGhpcy5nbHNsVmVyc2lvbix0LnVuaWZvcm1zPXt9O2Zvcihjb25zdCBpIGluIHRoaXMudW5pZm9ybXMpe2NvbnN0IGE9dGhpcy51bmlmb3Jtc1tpXS52YWx1ZTthJiZhLmlzVGV4dHVyZT90LnVuaWZvcm1zW2ldPXt0eXBlOiJ0Iix2YWx1ZTphLnRvSlNPTihlKS51dWlkfTphJiZhLmlzQ29sb3I/dC51bmlmb3Jtc1tpXT17dHlwZToiYyIsdmFsdWU6YS5nZXRIZXgoKX06YSYmYS5pc1ZlY3RvcjI/dC51bmlmb3Jtc1tpXT17dHlwZToidjIiLHZhbHVlOmEudG9BcnJheSgpfTphJiZhLmlzVmVjdG9yMz90LnVuaWZvcm1zW2ldPXt0eXBlOiJ2MyIsdmFsdWU6YS50b0FycmF5KCl9OmEmJmEuaXNWZWN0b3I0P3QudW5pZm9ybXNbaV09e3R5cGU6InY0Iix2YWx1ZTphLnRvQXJyYXkoKX06YSYmYS5pc01hdHJpeDM/dC51bmlmb3Jtc1tpXT17dHlwZToibTMiLHZhbHVlOmEudG9BcnJheSgpfTphJiZhLmlzTWF0cml4ND90LnVuaWZvcm1zW2ldPXt0eXBlOiJtNCIsdmFsdWU6YS50b0FycmF5KCl9OnQudW5pZm9ybXNbaV09e3ZhbHVlOmF9fU9iamVjdC5rZXlzKHRoaXMuZGVmaW5lcykubGVuZ3RoPjAmJih0LmRlZmluZXM9dGhpcy5kZWZpbmVzKSx0LnZlcnRleFNoYWRlcj10aGlzLnZlcnRleFNoYWRlcix0LmZyYWdtZW50U2hhZGVyPXRoaXMuZnJhZ21lbnRTaGFkZXIsdC5saWdodHM9dGhpcy5saWdodHMsdC5jbGlwcGluZz10aGlzLmNsaXBwaW5nO2NvbnN0IG49e307Zm9yKGNvbnN0IGkgaW4gdGhpcy5leHRlbnNpb25zKXRoaXMuZXh0ZW5zaW9uc1tpXT09PSEwJiYobltpXT0hMCk7cmV0dXJuIE9iamVjdC5rZXlzKG4pLmxlbmd0aD4wJiYodC5leHRlbnNpb25zPW4pLHR9fWNsYXNzIF9vIGV4dGVuZHMgcnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNDYW1lcmE9ITAsdGhpcy50eXBlPSJDYW1lcmEiLHRoaXMubWF0cml4V29ybGRJbnZlcnNlPW5ldyBJZSx0aGlzLnByb2plY3Rpb25NYXRyaXg9bmV3IEllLHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2U9bmV3IEllLHRoaXMuY29vcmRpbmF0ZVN5c3RlbT1Qbn1jb3B5KGUsdCl7cmV0dXJuIHN1cGVyLmNvcHkoZSx0KSx0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KGUubWF0cml4V29ybGRJbnZlcnNlKSx0aGlzLnByb2plY3Rpb25NYXRyaXguY29weShlLnByb2plY3Rpb25NYXRyaXgpLHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShlLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKSx0aGlzLmNvb3JkaW5hdGVTeXN0ZW09ZS5jb29yZGluYXRlU3lzdGVtLHRoaXN9Z2V0V29ybGREaXJlY3Rpb24oZSl7cmV0dXJuIHN1cGVyLmdldFdvcmxkRGlyZWN0aW9uKGUpLm5lZ2F0ZSgpfXVwZGF0ZU1hdHJpeFdvcmxkKGUpe3N1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKGUpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9dXBkYXRlV29ybGRNYXRyaXgoZSx0KXtzdXBlci51cGRhdGVXb3JsZE1hdHJpeChlLHQpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jbGFzcyBCdCBleHRlbmRzIF9ve2NvbnN0cnVjdG9yKGU9NTAsdD0xLG49LjEsaT0yZTMpe3N1cGVyKCksdGhpcy5pc1BlcnNwZWN0aXZlQ2FtZXJhPSEwLHRoaXMudHlwZT0iUGVyc3BlY3RpdmVDYW1lcmEiLHRoaXMuZm92PWUsdGhpcy56b29tPTEsdGhpcy5uZWFyPW4sdGhpcy5mYXI9aSx0aGlzLmZvY3VzPTEwLHRoaXMuYXNwZWN0PXQsdGhpcy52aWV3PW51bGwsdGhpcy5maWxtR2F1Z2U9MzUsdGhpcy5maWxtT2Zmc2V0PTAsdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y29weShlLHQpe3JldHVybiBzdXBlci5jb3B5KGUsdCksdGhpcy5mb3Y9ZS5mb3YsdGhpcy56b29tPWUuem9vbSx0aGlzLm5lYXI9ZS5uZWFyLHRoaXMuZmFyPWUuZmFyLHRoaXMuZm9jdXM9ZS5mb2N1cyx0aGlzLmFzcGVjdD1lLmFzcGVjdCx0aGlzLnZpZXc9ZS52aWV3PT09bnVsbD9udWxsOk9iamVjdC5hc3NpZ24oe30sZS52aWV3KSx0aGlzLmZpbG1HYXVnZT1lLmZpbG1HYXVnZSx0aGlzLmZpbG1PZmZzZXQ9ZS5maWxtT2Zmc2V0LHRoaXN9c2V0Rm9jYWxMZW5ndGgoZSl7Y29uc3QgdD0uNSp0aGlzLmdldEZpbG1IZWlnaHQoKS9lO3RoaXMuZm92PUFyKjIqTWF0aC5hdGFuKHQpLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWdldEZvY2FsTGVuZ3RoKCl7Y29uc3QgZT1NYXRoLnRhbihIaSouNSp0aGlzLmZvdik7cmV0dXJuIC41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL2V9Z2V0RWZmZWN0aXZlRk9WKCl7cmV0dXJuIEFyKjIqTWF0aC5hdGFuKE1hdGgudGFuKEhpKi41KnRoaXMuZm92KS90aGlzLnpvb20pfWdldEZpbG1XaWR0aCgpe3JldHVybiB0aGlzLmZpbG1HYXVnZSpNYXRoLm1pbih0aGlzLmFzcGVjdCwxKX1nZXRGaWxtSGVpZ2h0KCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlL01hdGgubWF4KHRoaXMuYXNwZWN0LDEpfXNldFZpZXdPZmZzZXQoZSx0LG4saSxzLGEpe3RoaXMuYXNwZWN0PWUvdCx0aGlzLnZpZXc9PT1udWxsJiYodGhpcy52aWV3PXtlbmFibGVkOiEwLGZ1bGxXaWR0aDoxLGZ1bGxIZWlnaHQ6MSxvZmZzZXRYOjAsb2Zmc2V0WTowLHdpZHRoOjEsaGVpZ2h0OjF9KSx0aGlzLnZpZXcuZW5hYmxlZD0hMCx0aGlzLnZpZXcuZnVsbFdpZHRoPWUsdGhpcy52aWV3LmZ1bGxIZWlnaHQ9dCx0aGlzLnZpZXcub2Zmc2V0WD1uLHRoaXMudmlldy5vZmZzZXRZPWksdGhpcy52aWV3LndpZHRoPXMsdGhpcy52aWV3LmhlaWdodD1hLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWNsZWFyVmlld09mZnNldCgpe3RoaXMudmlldyE9PW51bGwmJih0aGlzLnZpZXcuZW5hYmxlZD0hMSksdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9dXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpe2NvbnN0IGU9dGhpcy5uZWFyO2xldCB0PWUqTWF0aC50YW4oSGkqLjUqdGhpcy5mb3YpL3RoaXMuem9vbSxuPTIqdCxpPXRoaXMuYXNwZWN0Km4scz0tLjUqaTtjb25zdCBhPXRoaXMudmlldztpZih0aGlzLnZpZXchPT1udWxsJiZ0aGlzLnZpZXcuZW5hYmxlZCl7Y29uc3QgbD1hLmZ1bGxXaWR0aCxjPWEuZnVsbEhlaWdodDtzKz1hLm9mZnNldFgqaS9sLHQtPWEub2Zmc2V0WSpuL2MsaSo9YS53aWR0aC9sLG4qPWEuaGVpZ2h0L2N9Y29uc3Qgbz10aGlzLmZpbG1PZmZzZXQ7byE9PTAmJihzKz1lKm8vdGhpcy5nZXRGaWxtV2lkdGgoKSksdGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZShzLHMraSx0LHQtbixlLHRoaXMuZmFyLHRoaXMuY29vcmRpbmF0ZVN5c3RlbSksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMucHJvamVjdGlvbk1hdHJpeCkuaW52ZXJ0KCl9dG9KU09OKGUpe2NvbnN0IHQ9c3VwZXIudG9KU09OKGUpO3JldHVybiB0Lm9iamVjdC5mb3Y9dGhpcy5mb3YsdC5vYmplY3Quem9vbT10aGlzLnpvb20sdC5vYmplY3QubmVhcj10aGlzLm5lYXIsdC5vYmplY3QuZmFyPXRoaXMuZmFyLHQub2JqZWN0LmZvY3VzPXRoaXMuZm9jdXMsdC5vYmplY3QuYXNwZWN0PXRoaXMuYXNwZWN0LHRoaXMudmlldyE9PW51bGwmJih0Lm9iamVjdC52aWV3PU9iamVjdC5hc3NpZ24oe30sdGhpcy52aWV3KSksdC5vYmplY3QuZmlsbUdhdWdlPXRoaXMuZmlsbUdhdWdlLHQub2JqZWN0LmZpbG1PZmZzZXQ9dGhpcy5maWxtT2Zmc2V0LHR9fWNvbnN0IEhyPS05MCxXcj0xO2NsYXNzIHFkIGV4dGVuZHMgcnR7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKCksdGhpcy50eXBlPSJDdWJlQ2FtZXJhIix0aGlzLnJlbmRlclRhcmdldD1uLHRoaXMuY29vcmRpbmF0ZVN5c3RlbT1udWxsLHRoaXMuYWN0aXZlTWlwbWFwTGV2ZWw9MDtjb25zdCBpPW5ldyBCdChIcixXcixlLHQpO2kubGF5ZXJzPXRoaXMubGF5ZXJzLHRoaXMuYWRkKGkpO2NvbnN0IHM9bmV3IEJ0KEhyLFdyLGUsdCk7cy5sYXllcnM9dGhpcy5sYXllcnMsdGhpcy5hZGQocyk7Y29uc3QgYT1uZXcgQnQoSHIsV3IsZSx0KTthLmxheWVycz10aGlzLmxheWVycyx0aGlzLmFkZChhKTtjb25zdCBvPW5ldyBCdChIcixXcixlLHQpO28ubGF5ZXJzPXRoaXMubGF5ZXJzLHRoaXMuYWRkKG8pO2NvbnN0IGw9bmV3IEJ0KEhyLFdyLGUsdCk7bC5sYXllcnM9dGhpcy5sYXllcnMsdGhpcy5hZGQobCk7Y29uc3QgYz1uZXcgQnQoSHIsV3IsZSx0KTtjLmxheWVycz10aGlzLmxheWVycyx0aGlzLmFkZChjKX11cGRhdGVDb29yZGluYXRlU3lzdGVtKCl7Y29uc3QgZT10aGlzLmNvb3JkaW5hdGVTeXN0ZW0sdD10aGlzLmNoaWxkcmVuLmNvbmNhdCgpLFtuLGkscyxhLG8sbF09dDtmb3IoY29uc3QgYyBvZiB0KXRoaXMucmVtb3ZlKGMpO2lmKGU9PT1QbiluLnVwLnNldCgwLDEsMCksbi5sb29rQXQoMSwwLDApLGkudXAuc2V0KDAsMSwwKSxpLmxvb2tBdCgtMSwwLDApLHMudXAuc2V0KDAsMCwtMSkscy5sb29rQXQoMCwxLDApLGEudXAuc2V0KDAsMCwxKSxhLmxvb2tBdCgwLC0xLDApLG8udXAuc2V0KDAsMSwwKSxvLmxvb2tBdCgwLDAsMSksbC51cC5zZXQoMCwxLDApLGwubG9va0F0KDAsMCwtMSk7ZWxzZSBpZihlPT09RXIpbi51cC5zZXQoMCwtMSwwKSxuLmxvb2tBdCgtMSwwLDApLGkudXAuc2V0KDAsLTEsMCksaS5sb29rQXQoMSwwLDApLHMudXAuc2V0KDAsMCwxKSxzLmxvb2tBdCgwLDEsMCksYS51cC5zZXQoMCwwLC0xKSxhLmxvb2tBdCgwLC0xLDApLG8udXAuc2V0KDAsLTEsMCksby5sb29rQXQoMCwwLDEpLGwudXAuc2V0KDAsLTEsMCksbC5sb29rQXQoMCwwLC0xKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuQ3ViZUNhbWVyYS51cGRhdGVDb29yZGluYXRlU3lzdGVtKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrZSk7Zm9yKGNvbnN0IGMgb2YgdCl0aGlzLmFkZChjKSxjLnVwZGF0ZU1hdHJpeFdvcmxkKCl9dXBkYXRlKGUsdCl7dGhpcy5wYXJlbnQ9PT1udWxsJiZ0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Y29uc3R7cmVuZGVyVGFyZ2V0Om4sYWN0aXZlTWlwbWFwTGV2ZWw6aX09dGhpczt0aGlzLmNvb3JkaW5hdGVTeXN0ZW0hPT1lLmNvb3JkaW5hdGVTeXN0ZW0mJih0aGlzLmNvb3JkaW5hdGVTeXN0ZW09ZS5jb29yZGluYXRlU3lzdGVtLHRoaXMudXBkYXRlQ29vcmRpbmF0ZVN5c3RlbSgpKTtjb25zdFtzLGEsbyxsLGMsaF09dGhpcy5jaGlsZHJlbix1PWUuZ2V0UmVuZGVyVGFyZ2V0KCksZj1lLmdldEFjdGl2ZUN1YmVGYWNlKCksZD1lLmdldEFjdGl2ZU1pcG1hcExldmVsKCkscD1lLnhyLmVuYWJsZWQ7ZS54ci5lbmFibGVkPSExO2NvbnN0IF89bi50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztuLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPSExLGUuc2V0UmVuZGVyVGFyZ2V0KG4sMCxpKSxlLnJlbmRlcih0LHMpLGUuc2V0UmVuZGVyVGFyZ2V0KG4sMSxpKSxlLnJlbmRlcih0LGEpLGUuc2V0UmVuZGVyVGFyZ2V0KG4sMixpKSxlLnJlbmRlcih0LG8pLGUuc2V0UmVuZGVyVGFyZ2V0KG4sMyxpKSxlLnJlbmRlcih0LGwpLGUuc2V0UmVuZGVyVGFyZ2V0KG4sNCxpKSxlLnJlbmRlcih0LGMpLG4udGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9XyxlLnNldFJlbmRlclRhcmdldChuLDUsaSksZS5yZW5kZXIodCxoKSxlLnNldFJlbmRlclRhcmdldCh1LGYsZCksZS54ci5lbmFibGVkPXAsbi50ZXh0dXJlLm5lZWRzUE1SRU1VcGRhdGU9ITB9fWNsYXNzIFhzIGV4dGVuZHMgRXR7Y29uc3RydWN0b3IoZSx0LG4saSxzLGEsbyxsLGMsaCl7ZT1lIT09dm9pZCAwP2U6W10sdD10IT09dm9pZCAwP3Q6S24sc3VwZXIoZSx0LG4saSxzLGEsbyxsLGMsaCksdGhpcy5pc0N1YmVUZXh0dXJlPSEwLHRoaXMuZmxpcFk9ITF9Z2V0IGltYWdlcygpe3JldHVybiB0aGlzLmltYWdlfXNldCBpbWFnZXMoZSl7dGhpcy5pbWFnZT1lfX1jbGFzcyAkZCBleHRlbmRzIExue2NvbnN0cnVjdG9yKGU9MSx0PXt9KXtzdXBlcihlLGUsdCksdGhpcy5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldD0hMDtjb25zdCBuPXt3aWR0aDplLGhlaWdodDplLGRlcHRoOjF9LGk9W24sbixuLG4sbixuXTt0LmVuY29kaW5nIT09dm9pZCAwJiYoQnMoIlRIUkVFLldlYkdMQ3ViZVJlbmRlclRhcmdldDogb3B0aW9uLmVuY29kaW5nIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IG9wdGlvbi5jb2xvclNwYWNlLiIpLHQuY29sb3JTcGFjZT10LmVuY29kaW5nPT09Ymk/UHQ6Z24pLHRoaXMudGV4dHVyZT1uZXcgWHMoaSx0Lm1hcHBpbmcsdC53cmFwUyx0LndyYXBULHQubWFnRmlsdGVyLHQubWluRmlsdGVyLHQuZm9ybWF0LHQudHlwZSx0LmFuaXNvdHJvcHksdC5jb2xvclNwYWNlKSx0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwLHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9dC5nZW5lcmF0ZU1pcG1hcHMhPT12b2lkIDA/dC5nZW5lcmF0ZU1pcG1hcHM6ITEsdGhpcy50ZXh0dXJlLm1pbkZpbHRlcj10Lm1pbkZpbHRlciE9PXZvaWQgMD90Lm1pbkZpbHRlcjp3dH1mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZShlLHQpe3RoaXMudGV4dHVyZS50eXBlPXQudHlwZSx0aGlzLnRleHR1cmUuY29sb3JTcGFjZT10LmNvbG9yU3BhY2UsdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnRleHR1cmUubWluRmlsdGVyPXQubWluRmlsdGVyLHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXI7Y29uc3Qgbj17dW5pZm9ybXM6e3RFcXVpcmVjdDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpgCgoJCQkJdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKCgkJCQl2ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkgewoKCQkJCQlyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTsKCgkJCQl9CgoJCQkJdm9pZCBtYWluKCkgewoKCQkJCQl2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApOwoKCQkJCQkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJCQkJCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCgkJCQl9CgkJCWAsZnJhZ21lbnRTaGFkZXI6YAoKCQkJCXVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDsKCgkJCQl2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwoKCQkJCSNpbmNsdWRlIDxjb21tb24+CgoJCQkJdm9pZCBtYWluKCkgewoKCQkJCQl2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7CgoJCQkJCXZlYzIgc2FtcGxlVVYgPSBlcXVpcmVjdFV2KCBkaXJlY3Rpb24gKTsKCgkJCQkJZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7CgoJCQkJfQoJCQlgfSxpPW5ldyBZaSg1LDUsNSkscz1uZXcgSG4oe25hbWU6IkN1YmVtYXBGcm9tRXF1aXJlY3QiLHVuaWZvcm1zOlZyKG4udW5pZm9ybXMpLHZlcnRleFNoYWRlcjpuLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjpuLmZyYWdtZW50U2hhZGVyLHNpZGU6WXQsYmxlbmRpbmc6Wm59KTtzLnVuaWZvcm1zLnRFcXVpcmVjdC52YWx1ZT10O2NvbnN0IGE9bmV3IEx0KGkscyksbz10Lm1pbkZpbHRlcjtyZXR1cm4gdC5taW5GaWx0ZXI9PT12aSYmKHQubWluRmlsdGVyPXd0KSxuZXcgcWQoMSwxMCx0aGlzKS51cGRhdGUoZSxhKSx0Lm1pbkZpbHRlcj1vLGEuZ2VvbWV0cnkuZGlzcG9zZSgpLGEubWF0ZXJpYWwuZGlzcG9zZSgpLHRoaXN9Y2xlYXIoZSx0LG4saSl7Y29uc3Qgcz1lLmdldFJlbmRlclRhcmdldCgpO2ZvcihsZXQgYT0wO2E8NjthKyspZS5zZXRSZW5kZXJUYXJnZXQodGhpcyxhKSxlLmNsZWFyKHQsbixpKTtlLnNldFJlbmRlclRhcmdldChzKX19Y29uc3QgTWg9bmV3IFAsUHg9bmV3IFAsTHg9bmV3IFplO2NsYXNzIExpe2NvbnN0cnVjdG9yKGU9bmV3IFAoMSwwLDApLHQ9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPWUsdGhpcy5jb25zdGFudD10fXNldChlLHQpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KGUpLHRoaXMuY29uc3RhbnQ9dCx0aGlzfXNldENvbXBvbmVudHMoZSx0LG4saSl7cmV0dXJuIHRoaXMubm9ybWFsLnNldChlLHQsbiksdGhpcy5jb25zdGFudD1pLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoZSx0KXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weShlKSx0aGlzLmNvbnN0YW50PS10LmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHMoZSx0LG4pe2NvbnN0IGk9TWguc3ViVmVjdG9ycyhuLHQpLmNyb3NzKFB4LnN1YlZlY3RvcnMoZSx0KSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoaSxlKSx0aGlzfWNvcHkoZSl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkoZS5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9ZS5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IGU9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIoZSksdGhpcy5jb25zdGFudCo9ZSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludChlKXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KGUpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZShlKXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoZS5jZW50ZXIpLWUucmFkaXVzfXByb2plY3RQb2ludChlLHQpe3JldHVybiB0LmNvcHkoZSkuYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLC10aGlzLmRpc3RhbmNlVG9Qb2ludChlKSl9aW50ZXJzZWN0TGluZShlLHQpe2NvbnN0IG49ZS5kZWx0YShNaCksaT10aGlzLm5vcm1hbC5kb3Qobik7aWYoaT09PTApcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KGUuc3RhcnQpPT09MD90LmNvcHkoZS5zdGFydCk6bnVsbDtjb25zdCBzPS0oZS5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL2k7cmV0dXJuIHM8MHx8cz4xP251bGw6dC5jb3B5KGUuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihuLHMpfWludGVyc2VjdHNMaW5lKGUpe2NvbnN0IHQ9dGhpcy5kaXN0YW5jZVRvUG9pbnQoZS5zdGFydCksbj10aGlzLmRpc3RhbmNlVG9Qb2ludChlLmVuZCk7cmV0dXJuIHQ8MCYmbj4wfHxuPDAmJnQ+MH1pbnRlcnNlY3RzQm94KGUpe3JldHVybiBlLmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKGUpe3JldHVybiBlLmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KGUpe3JldHVybiBlLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQoZSx0KXtjb25zdCBuPXR8fEx4LmdldE5vcm1hbE1hdHJpeChlKSxpPXRoaXMuY29wbGFuYXJQb2ludChNaCkuYXBwbHlNYXRyaXg0KGUpLHM9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKG4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1pLmRvdChzKSx0aGlzfXRyYW5zbGF0ZShlKXtyZXR1cm4gdGhpcy5jb25zdGFudC09ZS5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKGUpe3JldHVybiBlLm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZlLmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNvbnN0IFppPW5ldyBHdCx4bz1uZXcgUDtjbGFzcyBxc3tjb25zdHJ1Y3RvcihlPW5ldyBMaSx0PW5ldyBMaSxuPW5ldyBMaSxpPW5ldyBMaSxzPW5ldyBMaSxhPW5ldyBMaSl7dGhpcy5wbGFuZXM9W2UsdCxuLGkscyxhXX1zZXQoZSx0LG4saSxzLGEpe2NvbnN0IG89dGhpcy5wbGFuZXM7cmV0dXJuIG9bMF0uY29weShlKSxvWzFdLmNvcHkodCksb1syXS5jb3B5KG4pLG9bM10uY29weShpKSxvWzRdLmNvcHkocyksb1s1XS5jb3B5KGEpLHRoaXN9Y29weShlKXtjb25zdCB0PXRoaXMucGxhbmVzO2ZvcihsZXQgbj0wO248NjtuKyspdFtuXS5jb3B5KGUucGxhbmVzW25dKTtyZXR1cm4gdGhpc31zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChlLHQ9UG4pe2NvbnN0IG49dGhpcy5wbGFuZXMsaT1lLmVsZW1lbnRzLHM9aVswXSxhPWlbMV0sbz1pWzJdLGw9aVszXSxjPWlbNF0saD1pWzVdLHU9aVs2XSxmPWlbN10sZD1pWzhdLHA9aVs5XSxfPWlbMTBdLGc9aVsxMV0sbT1pWzEyXSx5PWlbMTNdLHg9aVsxNF0sdj1pWzE1XTtpZihuWzBdLnNldENvbXBvbmVudHMobC1zLGYtYyxnLWQsdi1tKS5ub3JtYWxpemUoKSxuWzFdLnNldENvbXBvbmVudHMobCtzLGYrYyxnK2QsdittKS5ub3JtYWxpemUoKSxuWzJdLnNldENvbXBvbmVudHMobCthLGYraCxnK3Asdit5KS5ub3JtYWxpemUoKSxuWzNdLnNldENvbXBvbmVudHMobC1hLGYtaCxnLXAsdi15KS5ub3JtYWxpemUoKSxuWzRdLnNldENvbXBvbmVudHMobC1vLGYtdSxnLV8sdi14KS5ub3JtYWxpemUoKSx0PT09UG4pbls1XS5zZXRDb21wb25lbnRzKGwrbyxmK3UsZytfLHYreCkubm9ybWFsaXplKCk7ZWxzZSBpZih0PT09RXIpbls1XS5zZXRDb21wb25lbnRzKG8sdSxfLHgpLm5vcm1hbGl6ZSgpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5GcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrdCk7cmV0dXJuIHRoaXN9aW50ZXJzZWN0c09iamVjdChlKXtpZihlLmJvdW5kaW5nU3BoZXJlIT09dm9pZCAwKWUuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLFppLmNvcHkoZS5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KGUubWF0cml4V29ybGQpO2Vsc2V7Y29uc3QgdD1lLmdlb21ldHJ5O3QuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZ0LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLFppLmNvcHkodC5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KGUubWF0cml4V29ybGQpfXJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoWmkpfWludGVyc2VjdHNTcHJpdGUoZSl7cmV0dXJuIFppLmNlbnRlci5zZXQoMCwwLDApLFppLnJhZGl1cz0uNzA3MTA2NzgxMTg2NTQ3NixaaS5hcHBseU1hdHJpeDQoZS5tYXRyaXhXb3JsZCksdGhpcy5pbnRlcnNlY3RzU3BoZXJlKFppKX1pbnRlcnNlY3RzU3BoZXJlKGUpe2NvbnN0IHQ9dGhpcy5wbGFuZXMsbj1lLmNlbnRlcixpPS1lLnJhZGl1cztmb3IobGV0IHM9MDtzPDY7cysrKWlmKHRbc10uZGlzdGFuY2VUb1BvaW50KG4pPGkpcmV0dXJuITE7cmV0dXJuITB9aW50ZXJzZWN0c0JveChlKXtjb25zdCB0PXRoaXMucGxhbmVzO2ZvcihsZXQgbj0wO248NjtuKyspe2NvbnN0IGk9dFtuXTtpZih4by54PWkubm9ybWFsLng+MD9lLm1heC54OmUubWluLngseG8ueT1pLm5vcm1hbC55PjA/ZS5tYXgueTplLm1pbi55LHhvLno9aS5ub3JtYWwuej4wP2UubWF4Lno6ZS5taW4ueixpLmRpc3RhbmNlVG9Qb2ludCh4byk8MClyZXR1cm4hMX1yZXR1cm4hMH1jb250YWluc1BvaW50KGUpe2NvbnN0IHQ9dGhpcy5wbGFuZXM7Zm9yKGxldCBuPTA7bjw2O24rKylpZih0W25dLmRpc3RhbmNlVG9Qb2ludChlKTwwKXJldHVybiExO3JldHVybiEwfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19ZnVuY3Rpb24gWWQoKXtsZXQgcj1udWxsLGU9ITEsdD1udWxsLG49bnVsbDtmdW5jdGlvbiBpKHMsYSl7dChzLGEpLG49ci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSl9cmV0dXJue3N0YXJ0OmZ1bmN0aW9uKCl7ZSE9PSEwJiZ0IT09bnVsbCYmKG49ci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSksZT0hMCl9LHN0b3A6ZnVuY3Rpb24oKXtyLmNhbmNlbEFuaW1hdGlvbkZyYW1lKG4pLGU9ITF9LHNldEFuaW1hdGlvbkxvb3A6ZnVuY3Rpb24ocyl7dD1zfSxzZXRDb250ZXh0OmZ1bmN0aW9uKHMpe3I9c319fWZ1bmN0aW9uIEl4KHIsZSl7Y29uc3QgdD1lLmlzV2ViR0wyLG49bmV3IFdlYWtNYXA7ZnVuY3Rpb24gaShjLGgpe2NvbnN0IHU9Yy5hcnJheSxmPWMudXNhZ2UsZD11LmJ5dGVMZW5ndGgscD1yLmNyZWF0ZUJ1ZmZlcigpO3IuYmluZEJ1ZmZlcihoLHApLHIuYnVmZmVyRGF0YShoLHUsZiksYy5vblVwbG9hZENhbGxiYWNrKCk7bGV0IF87aWYodSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSlfPXIuRkxPQVQ7ZWxzZSBpZih1IGluc3RhbmNlb2YgVWludDE2QXJyYXkpaWYoYy5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGUpaWYodClfPXIuSEFMRl9GTE9BVDtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVc2FnZSBvZiBGbG9hdDE2QnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIFdlYkdMMi4iKTtlbHNlIF89ci5VTlNJR05FRF9TSE9SVDtlbHNlIGlmKHUgaW5zdGFuY2VvZiBJbnQxNkFycmF5KV89ci5TSE9SVDtlbHNlIGlmKHUgaW5zdGFuY2VvZiBVaW50MzJBcnJheSlfPXIuVU5TSUdORURfSU5UO2Vsc2UgaWYodSBpbnN0YW5jZW9mIEludDMyQXJyYXkpXz1yLklOVDtlbHNlIGlmKHUgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpXz1yLkJZVEU7ZWxzZSBpZih1IGluc3RhbmNlb2YgVWludDhBcnJheSlfPXIuVU5TSUdORURfQllURTtlbHNlIGlmKHUgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSlfPXIuVU5TSUdORURfQllURTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVbnN1cHBvcnRlZCBidWZmZXIgZGF0YSBmb3JtYXQ6ICIrdSk7cmV0dXJue2J1ZmZlcjpwLHR5cGU6XyxieXRlc1BlckVsZW1lbnQ6dS5CWVRFU19QRVJfRUxFTUVOVCx2ZXJzaW9uOmMudmVyc2lvbixzaXplOmR9fWZ1bmN0aW9uIHMoYyxoLHUpe2NvbnN0IGY9aC5hcnJheSxkPWguX3VwZGF0ZVJhbmdlLHA9aC51cGRhdGVSYW5nZXM7aWYoci5iaW5kQnVmZmVyKHUsYyksZC5jb3VudD09PS0xJiZwLmxlbmd0aD09PTAmJnIuYnVmZmVyU3ViRGF0YSh1LDAsZikscC5sZW5ndGghPT0wKXtmb3IobGV0IF89MCxnPXAubGVuZ3RoO188ZztfKyspe2NvbnN0IG09cFtfXTt0P3IuYnVmZmVyU3ViRGF0YSh1LG0uc3RhcnQqZi5CWVRFU19QRVJfRUxFTUVOVCxmLG0uc3RhcnQsbS5jb3VudCk6ci5idWZmZXJTdWJEYXRhKHUsbS5zdGFydCpmLkJZVEVTX1BFUl9FTEVNRU5ULGYuc3ViYXJyYXkobS5zdGFydCxtLnN0YXJ0K20uY291bnQpKX1oLmNsZWFyVXBkYXRlUmFuZ2VzKCl9ZC5jb3VudCE9PS0xJiYodD9yLmJ1ZmZlclN1YkRhdGEodSxkLm9mZnNldCpmLkJZVEVTX1BFUl9FTEVNRU5ULGYsZC5vZmZzZXQsZC5jb3VudCk6ci5idWZmZXJTdWJEYXRhKHUsZC5vZmZzZXQqZi5CWVRFU19QRVJfRUxFTUVOVCxmLnN1YmFycmF5KGQub2Zmc2V0LGQub2Zmc2V0K2QuY291bnQpKSxkLmNvdW50PS0xKSxoLm9uVXBsb2FkQ2FsbGJhY2soKX1mdW5jdGlvbiBhKGMpe3JldHVybiBjLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihjPWMuZGF0YSksbi5nZXQoYyl9ZnVuY3Rpb24gbyhjKXtjLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihjPWMuZGF0YSk7Y29uc3QgaD1uLmdldChjKTtoJiYoci5kZWxldGVCdWZmZXIoaC5idWZmZXIpLG4uZGVsZXRlKGMpKX1mdW5jdGlvbiBsKGMsaCl7aWYoYy5pc0dMQnVmZmVyQXR0cmlidXRlKXtjb25zdCBmPW4uZ2V0KGMpOyghZnx8Zi52ZXJzaW9uPGMudmVyc2lvbikmJm4uc2V0KGMse2J1ZmZlcjpjLmJ1ZmZlcix0eXBlOmMudHlwZSxieXRlc1BlckVsZW1lbnQ6Yy5lbGVtZW50U2l6ZSx2ZXJzaW9uOmMudmVyc2lvbn0pO3JldHVybn1jLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihjPWMuZGF0YSk7Y29uc3QgdT1uLmdldChjKTtpZih1PT09dm9pZCAwKW4uc2V0KGMsaShjLGgpKTtlbHNlIGlmKHUudmVyc2lvbjxjLnZlcnNpb24pe2lmKHUuc2l6ZSE9PWMuYXJyYXkuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLldlYkdMQXR0cmlidXRlczogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBhdHRyaWJ1dGUncyBhcnJheSBidWZmZXIgZG9lcyBub3QgbWF0Y2ggdGhlIG9yaWdpbmFsIHNpemUuIFJlc2l6aW5nIGJ1ZmZlciBhdHRyaWJ1dGVzIGlzIG5vdCBzdXBwb3J0ZWQuIik7cyh1LmJ1ZmZlcixjLGgpLHUudmVyc2lvbj1jLnZlcnNpb259fXJldHVybntnZXQ6YSxyZW1vdmU6byx1cGRhdGU6bH19Y2xhc3MgJHMgZXh0ZW5kcyBrZXtjb25zdHJ1Y3RvcihlPTEsdD0xLG49MSxpPTEpe3N1cGVyKCksdGhpcy50eXBlPSJQbGFuZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOmUsaGVpZ2h0OnQsd2lkdGhTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOml9O2NvbnN0IHM9ZS8yLGE9dC8yLG89TWF0aC5mbG9vcihuKSxsPU1hdGguZmxvb3IoaSksYz1vKzEsaD1sKzEsdT1lL28sZj10L2wsZD1bXSxwPVtdLF89W10sZz1bXTtmb3IobGV0IG09MDttPGg7bSsrKXtjb25zdCB5PW0qZi1hO2ZvcihsZXQgeD0wO3g8Yzt4Kyspe2NvbnN0IHY9eCp1LXM7cC5wdXNoKHYsLXksMCksXy5wdXNoKDAsMCwxKSxnLnB1c2goeC9vKSxnLnB1c2goMS1tL2wpfX1mb3IobGV0IG09MDttPGw7bSsrKWZvcihsZXQgeT0wO3k8bzt5Kyspe2NvbnN0IHg9eStjKm0sdj15K2MqKG0rMSksUz15KzErYyoobSsxKSxiPXkrMStjKm07ZC5wdXNoKHgsdixiKSxkLnB1c2godixTLGIpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKF8sMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGcsMikpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3ICRzKGUud2lkdGgsZS5oZWlnaHQsZS53aWR0aFNlZ21lbnRzLGUuaGVpZ2h0U2VnbWVudHMpfX12YXIgVXg9YCNpZmRlZiBVU0VfQUxQSEFIQVNICglpZiAoIGRpZmZ1c2VDb2xvci5hIDwgZ2V0QWxwaGFIYXNoVGhyZXNob2xkKCB2UG9zaXRpb24gKSApIGRpc2NhcmQ7CiNlbmRpZmAsRHg9YCNpZmRlZiBVU0VfQUxQSEFIQVNICgljb25zdCBmbG9hdCBBTFBIQV9IQVNIX1NDQUxFID0gMC4wNTsKCWZsb2F0IGhhc2gyRCggdmVjMiB2YWx1ZSApIHsKCQlyZXR1cm4gZnJhY3QoIDEuMGU0ICogc2luKCAxNy4wICogdmFsdWUueCArIDAuMSAqIHZhbHVlLnkgKSAqICggMC4xICsgYWJzKCBzaW4oIDEzLjAgKiB2YWx1ZS55ICsgdmFsdWUueCApICkgKSApOwoJfQoJZmxvYXQgaGFzaDNEKCB2ZWMzIHZhbHVlICkgewoJCXJldHVybiBoYXNoMkQoIHZlYzIoIGhhc2gyRCggdmFsdWUueHkgKSwgdmFsdWUueiApICk7Cgl9CglmbG9hdCBnZXRBbHBoYUhhc2hUaHJlc2hvbGQoIHZlYzMgcG9zaXRpb24gKSB7CgkJZmxvYXQgbWF4RGVyaXYgPSBtYXgoCgkJCWxlbmd0aCggZEZkeCggcG9zaXRpb24ueHl6ICkgKSwKCQkJbGVuZ3RoKCBkRmR5KCBwb3NpdGlvbi54eXogKSApCgkJKTsKCQlmbG9hdCBwaXhTY2FsZSA9IDEuMCAvICggQUxQSEFfSEFTSF9TQ0FMRSAqIG1heERlcml2ICk7CgkJdmVjMiBwaXhTY2FsZXMgPSB2ZWMyKAoJCQlleHAyKCBmbG9vciggbG9nMiggcGl4U2NhbGUgKSApICksCgkJCWV4cDIoIGNlaWwoIGxvZzIoIHBpeFNjYWxlICkgKSApCgkJKTsKCQl2ZWMyIGFscGhhID0gdmVjMigKCQkJaGFzaDNEKCBmbG9vciggcGl4U2NhbGVzLnggKiBwb3NpdGlvbi54eXogKSApLAoJCQloYXNoM0QoIGZsb29yKCBwaXhTY2FsZXMueSAqIHBvc2l0aW9uLnh5eiApICkKCQkpOwoJCWZsb2F0IGxlcnBGYWN0b3IgPSBmcmFjdCggbG9nMiggcGl4U2NhbGUgKSApOwoJCWZsb2F0IHggPSAoIDEuMCAtIGxlcnBGYWN0b3IgKSAqIGFscGhhLnggKyBsZXJwRmFjdG9yICogYWxwaGEueTsKCQlmbG9hdCBhID0gbWluKCBsZXJwRmFjdG9yLCAxLjAgLSBsZXJwRmFjdG9yICk7CgkJdmVjMyBjYXNlcyA9IHZlYzMoCgkJCXggKiB4IC8gKCAyLjAgKiBhICogKCAxLjAgLSBhICkgKSwKCQkJKCB4IC0gMC41ICogYSApIC8gKCAxLjAgLSBhICksCgkJCTEuMCAtICggKCAxLjAgLSB4ICkgKiAoIDEuMCAtIHggKSAvICggMi4wICogYSAqICggMS4wIC0gYSApICkgKQoJCSk7CgkJZmxvYXQgdGhyZXNob2xkID0gKCB4IDwgKCAxLjAgLSBhICkgKQoJCQk/ICggKCB4IDwgYSApID8gY2FzZXMueCA6IGNhc2VzLnkgKQoJCQk6IGNhc2VzLno7CgkJcmV0dXJuIGNsYW1wKCB0aHJlc2hvbGQgLCAxLjBlLTYsIDEuMCApOwoJfQojZW5kaWZgLE54PWAjaWZkZWYgVVNFX0FMUEhBTUFQCglkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2QWxwaGFNYXBVdiApLmc7CiNlbmRpZmAsRng9YCNpZmRlZiBVU0VfQUxQSEFNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwOwojZW5kaWZgLE94PWAjaWZkZWYgVVNFX0FMUEhBVEVTVAoJaWYgKCBkaWZmdXNlQ29sb3IuYSA8IGFscGhhVGVzdCApIGRpc2NhcmQ7CiNlbmRpZmAsQng9YCNpZmRlZiBVU0VfQUxQSEFURVNUCgl1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDsKI2VuZGlmYCx6eD1gI2lmZGVmIFVTRV9BT01BUAoJZmxvYXQgYW1iaWVudE9jY2x1c2lvbiA9ICggdGV4dHVyZTJEKCBhb01hcCwgdkFvTWFwVXYgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBhbWJpZW50T2NjbHVzaW9uOwoJI2lmIGRlZmluZWQoIFVTRV9DTEVBUkNPQVQgKSAKCQljbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0ICo9IGFtYmllbnRPY2NsdXNpb247CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKSAKCQlzaGVlblNwZWN1bGFySW5kaXJlY3QgKj0gYW1iaWVudE9jY2x1c2lvbjsKCSNlbmRpZgoJI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBTVEFOREFSRCApCgkJZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyICkgKTsKCQlyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICo9IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnJvdWdobmVzcyApOwoJI2VuZGlmCiNlbmRpZmAsa3g9YCNpZmRlZiBVU0VfQU9NQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGFvTWFwOwoJdW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTsKI2VuZGlmYCxHeD1gI2lmZGVmIFVTRV9CQVRDSElORwoJYXR0cmlidXRlIGZsb2F0IGJhdGNoSWQ7Cgl1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBiYXRjaGluZ1RleHR1cmU7CgltYXQ0IGdldEJhdGNoaW5nTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nVGV4dHVyZSwgMCApLng7CgkJaW50IGogPSBpbnQoIGkgKSAqIDQ7CgkJaW50IHggPSBqICUgc2l6ZTsKCQlpbnQgeSA9IGogLyBzaXplOwoJCXZlYzQgdjEgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKTsKCQl2ZWM0IHYyID0gdGV4ZWxGZXRjaCggYmF0Y2hpbmdUZXh0dXJlLCBpdmVjMiggeCArIDEsIHkgKSwgMCApOwoJCXZlYzQgdjMgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4ICsgMiwgeSApLCAwICk7CgkJdmVjNCB2NCA9IHRleGVsRmV0Y2goIGJhdGNoaW5nVGV4dHVyZSwgaXZlYzIoIHggKyAzLCB5ICksIDAgKTsKCQlyZXR1cm4gbWF0NCggdjEsIHYyLCB2MywgdjQgKTsKCX0KI2VuZGlmYCxWeD1gI2lmZGVmIFVTRV9CQVRDSElORwoJbWF0NCBiYXRjaGluZ01hdHJpeCA9IGdldEJhdGNoaW5nTWF0cml4KCBiYXRjaElkICk7CiNlbmRpZmAsSHg9YHZlYzMgdHJhbnNmb3JtZWQgPSB2ZWMzKCBwb3NpdGlvbiApOwojaWZkZWYgVVNFX0FMUEhBSEFTSAoJdlBvc2l0aW9uID0gdmVjMyggcG9zaXRpb24gKTsKI2VuZGlmYCxXeD1gdmVjMyBvYmplY3ROb3JtYWwgPSB2ZWMzKCBub3JtYWwgKTsKI2lmZGVmIFVTRV9UQU5HRU5UCgl2ZWMzIG9iamVjdFRhbmdlbnQgPSB2ZWMzKCB0YW5nZW50Lnh5eiApOwojZW5kaWZgLFh4PWBmbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkgewoJcmV0dXJuIDAuMjU7Cn0KZmxvYXQgRF9CbGlublBob25nKCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkgewoJcmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7Cn0KdmVjMyBCUkRGX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzICkgewoJdmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTsKCWZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTsKCWZsb2F0IGRvdFZIID0gc2F0dXJhdGUoIGRvdCggdmlld0RpciwgaGFsZkRpciApICk7Cgl2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIDEuMCwgZG90VkggKTsKCWZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICk7CglmbG9hdCBEID0gRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7CglyZXR1cm4gRiAqICggRyAqIEQgKTsKfSAvLyB2YWxpZGF0ZWRgLHF4PWAjaWZkZWYgVVNFX0lSSURFU0NFTkNFCgljb25zdCBtYXQzIFhZWl9UT19SRUM3MDkgPSBtYXQzKAoJCSAzLjI0MDQ1NDIsIC0wLjk2OTI2NjAsICAwLjA1NTY0MzQsCgkJLTEuNTM3MTM4NSwgIDEuODc2MDEwOCwgLTAuMjA0MDI1OSwKCQktMC40OTg1MzE0LCAgMC4wNDE1NTYwLCAgMS4wNTcyMjUyCgkpOwoJdmVjMyBGcmVzbmVsMFRvSW9yKCB2ZWMzIGZyZXNuZWwwICkgewoJCXZlYzMgc3FydEYwID0gc3FydCggZnJlc25lbDAgKTsKCQlyZXR1cm4gKCB2ZWMzKCAxLjAgKSArIHNxcnRGMCApIC8gKCB2ZWMzKCAxLjAgKSAtIHNxcnRGMCApOwoJfQoJdmVjMyBJb3JUb0ZyZXNuZWwwKCB2ZWMzIHRyYW5zbWl0dGVkSW9yLCBmbG9hdCBpbmNpZGVudElvciApIHsKCQlyZXR1cm4gcG93MiggKCB0cmFuc21pdHRlZElvciAtIHZlYzMoIGluY2lkZW50SW9yICkgKSAvICggdHJhbnNtaXR0ZWRJb3IgKyB2ZWMzKCBpbmNpZGVudElvciApICkgKTsKCX0KCWZsb2F0IElvclRvRnJlc25lbDAoIGZsb2F0IHRyYW5zbWl0dGVkSW9yLCBmbG9hdCBpbmNpZGVudElvciApIHsKCQlyZXR1cm4gcG93MiggKCB0cmFuc21pdHRlZElvciAtIGluY2lkZW50SW9yICkgLyAoIHRyYW5zbWl0dGVkSW9yICsgaW5jaWRlbnRJb3IgKSk7Cgl9Cgl2ZWMzIGV2YWxTZW5zaXRpdml0eSggZmxvYXQgT1BELCB2ZWMzIHNoaWZ0ICkgewoJCWZsb2F0IHBoYXNlID0gMi4wICogUEkgKiBPUEQgKiAxLjBlLTk7CgkJdmVjMyB2YWwgPSB2ZWMzKCA1LjQ4NTZlLTEzLCA0LjQyMDFlLTEzLCA1LjI0ODFlLTEzICk7CgkJdmVjMyBwb3MgPSB2ZWMzKCAxLjY4MTBlKzA2LCAxLjc5NTNlKzA2LCAyLjIwODRlKzA2ICk7CgkJdmVjMyB2YXIgPSB2ZWMzKCA0LjMyNzhlKzA5LCA5LjMwNDZlKzA5LCA2LjYxMjFlKzA5ICk7CgkJdmVjMyB4eXogPSB2YWwgKiBzcXJ0KCAyLjAgKiBQSSAqIHZhciApICogY29zKCBwb3MgKiBwaGFzZSArIHNoaWZ0ICkgKiBleHAoIC0gcG93MiggcGhhc2UgKSAqIHZhciApOwoJCXh5ei54ICs9IDkuNzQ3MGUtMTQgKiBzcXJ0KCAyLjAgKiBQSSAqIDQuNTI4MmUrMDkgKSAqIGNvcyggMi4yMzk5ZSswNiAqIHBoYXNlICsgc2hpZnRbIDAgXSApICogZXhwKCAtIDQuNTI4MmUrMDkgKiBwb3cyKCBwaGFzZSApICk7CgkJeHl6IC89IDEuMDY4NWUtNzsKCQl2ZWMzIHJnYiA9IFhZWl9UT19SRUM3MDkgKiB4eXo7CgkJcmV0dXJuIHJnYjsKCX0KCXZlYzMgZXZhbElyaWRlc2NlbmNlKCBmbG9hdCBvdXRzaWRlSU9SLCBmbG9hdCBldGEyLCBmbG9hdCBjb3NUaGV0YTEsIGZsb2F0IHRoaW5GaWxtVGhpY2tuZXNzLCB2ZWMzIGJhc2VGMCApIHsKCQl2ZWMzIEk7CgkJZmxvYXQgaXJpZGVzY2VuY2VJT1IgPSBtaXgoIG91dHNpZGVJT1IsIGV0YTIsIHNtb290aHN0ZXAoIDAuMCwgMC4wMywgdGhpbkZpbG1UaGlja25lc3MgKSApOwoJCWZsb2F0IHNpblRoZXRhMlNxID0gcG93Miggb3V0c2lkZUlPUiAvIGlyaWRlc2NlbmNlSU9SICkgKiAoIDEuMCAtIHBvdzIoIGNvc1RoZXRhMSApICk7CgkJZmxvYXQgY29zVGhldGEyU3EgPSAxLjAgLSBzaW5UaGV0YTJTcTsKCQlpZiAoIGNvc1RoZXRhMlNxIDwgMC4wICkgewoJCQlyZXR1cm4gdmVjMyggMS4wICk7CgkJfQoJCWZsb2F0IGNvc1RoZXRhMiA9IHNxcnQoIGNvc1RoZXRhMlNxICk7CgkJZmxvYXQgUjAgPSBJb3JUb0ZyZXNuZWwwKCBpcmlkZXNjZW5jZUlPUiwgb3V0c2lkZUlPUiApOwoJCWZsb2F0IFIxMiA9IEZfU2NobGljayggUjAsIDEuMCwgY29zVGhldGExICk7CgkJZmxvYXQgVDEyMSA9IDEuMCAtIFIxMjsKCQlmbG9hdCBwaGkxMiA9IDAuMDsKCQlpZiAoIGlyaWRlc2NlbmNlSU9SIDwgb3V0c2lkZUlPUiApIHBoaTEyID0gUEk7CgkJZmxvYXQgcGhpMjEgPSBQSSAtIHBoaTEyOwoJCXZlYzMgYmFzZUlPUiA9IEZyZXNuZWwwVG9Jb3IoIGNsYW1wKCBiYXNlRjAsIDAuMCwgMC45OTk5ICkgKTsJCXZlYzMgUjEgPSBJb3JUb0ZyZXNuZWwwKCBiYXNlSU9SLCBpcmlkZXNjZW5jZUlPUiApOwoJCXZlYzMgUjIzID0gRl9TY2hsaWNrKCBSMSwgMS4wLCBjb3NUaGV0YTIgKTsKCQl2ZWMzIHBoaTIzID0gdmVjMyggMC4wICk7CgkJaWYgKCBiYXNlSU9SWyAwIF0gPCBpcmlkZXNjZW5jZUlPUiApIHBoaTIzWyAwIF0gPSBQSTsKCQlpZiAoIGJhc2VJT1JbIDEgXSA8IGlyaWRlc2NlbmNlSU9SICkgcGhpMjNbIDEgXSA9IFBJOwoJCWlmICggYmFzZUlPUlsgMiBdIDwgaXJpZGVzY2VuY2VJT1IgKSBwaGkyM1sgMiBdID0gUEk7CgkJZmxvYXQgT1BEID0gMi4wICogaXJpZGVzY2VuY2VJT1IgKiB0aGluRmlsbVRoaWNrbmVzcyAqIGNvc1RoZXRhMjsKCQl2ZWMzIHBoaSA9IHZlYzMoIHBoaTIxICkgKyBwaGkyMzsKCQl2ZWMzIFIxMjMgPSBjbGFtcCggUjEyICogUjIzLCAxZS01LCAwLjk5OTkgKTsKCQl2ZWMzIHIxMjMgPSBzcXJ0KCBSMTIzICk7CgkJdmVjMyBScyA9IHBvdzIoIFQxMjEgKSAqIFIyMyAvICggdmVjMyggMS4wICkgLSBSMTIzICk7CgkJdmVjMyBDMCA9IFIxMiArIFJzOwoJCUkgPSBDMDsKCQl2ZWMzIENtID0gUnMgLSBUMTIxOwoJCWZvciAoIGludCBtID0gMTsgbSA8PSAyOyArKyBtICkgewoJCQlDbSAqPSByMTIzOwoJCQl2ZWMzIFNtID0gMi4wICogZXZhbFNlbnNpdGl2aXR5KCBmbG9hdCggbSApICogT1BELCBmbG9hdCggbSApICogcGhpICk7CgkJCUkgKz0gQ20gKiBTbTsKCQl9CgkJcmV0dXJuIG1heCggSSwgdmVjMyggMC4wICkgKTsKCX0KI2VuZGlmYCwkeD1gI2lmZGVmIFVTRV9CVU1QTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwOwoJdW5pZm9ybSBmbG9hdCBidW1wU2NhbGU7Cgl2ZWMyIGRIZHh5X2Z3ZCgpIHsKCQl2ZWMyIGRTVGR4ID0gZEZkeCggdkJ1bXBNYXBVdiApOwoJCXZlYzIgZFNUZHkgPSBkRmR5KCB2QnVtcE1hcFV2ICk7CgkJZmxvYXQgSGxsID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2QnVtcE1hcFV2ICkueDsKCQlmbG9hdCBkQnggPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZCdW1wTWFwVXYgKyBkU1RkeCApLnggLSBIbGw7CgkJZmxvYXQgZEJ5ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2QnVtcE1hcFV2ICsgZFNUZHkgKS54IC0gSGxsOwoJCXJldHVybiB2ZWMyKCBkQngsIGRCeSApOwoJfQoJdmVjMyBwZXJ0dXJiTm9ybWFsQXJiKCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSwgZmxvYXQgZmFjZURpcmVjdGlvbiApIHsKCQl2ZWMzIHZTaWdtYVggPSBub3JtYWxpemUoIGRGZHgoIHN1cmZfcG9zLnh5eiApICk7CgkJdmVjMyB2U2lnbWFZID0gbm9ybWFsaXplKCBkRmR5KCBzdXJmX3Bvcy54eXogKSApOwoJCXZlYzMgdk4gPSBzdXJmX25vcm07CgkJdmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApOwoJCXZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTsKCQlmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApICogZmFjZURpcmVjdGlvbjsKCQl2ZWMzIHZHcmFkID0gc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTsKCQlyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7Cgl9CiNlbmRpZmAsWXg9YCNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMAoJdmVjNCBwbGFuZTsKCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCWZvciAoIGludCBpID0gMDsgaSA8IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHsKCQlwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07CgkJaWYgKCBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApIGRpc2NhcmQ7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVMKCQlib29sIGNsaXBwZWQgPSB0cnVlOwoJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQlmb3IgKCBpbnQgaSA9IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSA8IE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7CgkJCXBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTsKCQkJY2xpcHBlZCA9ICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSAmJiBjbGlwcGVkOwoJCX0KCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJCWlmICggY2xpcHBlZCApIGRpc2NhcmQ7CgkjZW5kaWYKI2VuZGlmYCxaeD1gI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwCgl2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjsKCXVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdOwojZW5kaWZgLEp4PWAjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAKCXZhcnlpbmcgdmVjMyB2Q2xpcFBvc2l0aW9uOwojZW5kaWZgLEt4PWAjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAKCXZDbGlwUG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwojZW5kaWZgLFF4PWAjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCWRpZmZ1c2VDb2xvciAqPSB2Q29sb3I7CiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApCglkaWZmdXNlQ29sb3IucmdiICo9IHZDb2xvcjsKI2VuZGlmYCxqeD1gI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCgl2YXJ5aW5nIHZlYzQgdkNvbG9yOwojZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKQoJdmFyeWluZyB2ZWMzIHZDb2xvcjsKI2VuZGlmYCxleT1gI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCgl2YXJ5aW5nIHZlYzQgdkNvbG9yOwojZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApCgl2YXJ5aW5nIHZlYzMgdkNvbG9yOwojZW5kaWZgLHR5PWAjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCXZDb2xvciA9IHZlYzQoIDEuMCApOwojZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApCgl2Q29sb3IgPSB2ZWMzKCAxLjAgKTsKI2VuZGlmCiNpZmRlZiBVU0VfQ09MT1IKCXZDb2xvciAqPSBjb2xvcjsKI2VuZGlmCiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUgoJdkNvbG9yLnh5eiAqPSBpbnN0YW5jZUNvbG9yLnh5ejsKI2VuZGlmYCxueT1gI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MwojZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE3OTU4NgojZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ4OTY2CiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4Mzc5MDcKI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0MzA5MTg5NTM1CiNkZWZpbmUgRVBTSUxPTiAxZS02CiNpZm5kZWYgc2F0dXJhdGUKI2RlZmluZSBzYXR1cmF0ZSggYSApIGNsYW1wKCBhLCAwLjAsIDEuMCApCiNlbmRpZgojZGVmaW5lIHdoaXRlQ29tcGxlbWVudCggYSApICggMS4wIC0gc2F0dXJhdGUoIGEgKSApCmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH0KdmVjMyBwb3cyKCBjb25zdCBpbiB2ZWMzIHggKSB7IHJldHVybiB4Kng7IH0KZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9CmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyID0geCp4OyByZXR1cm4geDIqeDI7IH0KZmxvYXQgbWF4MyggY29uc3QgaW4gdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9CmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgdiApIHsgcmV0dXJuIGRvdCggdiwgdmVjMyggMC4zMzMzMzMzICkgKTsgfQpoaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkgewoJY29uc3QgaGlnaHAgZmxvYXQgYSA9IDEyLjk4OTgsIGIgPSA3OC4yMzMsIGMgPSA0Mzc1OC41NDUzOwoJaGlnaHAgZmxvYXQgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLGIgKSApLCBzbiA9IG1vZCggZHQsIFBJICk7CglyZXR1cm4gZnJhY3QoIHNpbiggc24gKSAqIGMgKTsKfQojaWZkZWYgSElHSF9QUkVDSVNJT04KCWZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHsgcmV0dXJuIGxlbmd0aCggdiApOyB9CiNlbHNlCglmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7CgkJZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4MyggYWJzKCB2ICkgKTsKCQlyZXR1cm4gbGVuZ3RoKCB2IC8gbWF4Q29tcG9uZW50ICkgKiBtYXhDb21wb25lbnQ7Cgl9CiNlbmRpZgpzdHJ1Y3QgSW5jaWRlbnRMaWdodCB7Cgl2ZWMzIGNvbG9yOwoJdmVjMyBkaXJlY3Rpb247Cglib29sIHZpc2libGU7Cn07CnN0cnVjdCBSZWZsZWN0ZWRMaWdodCB7Cgl2ZWMzIGRpcmVjdERpZmZ1c2U7Cgl2ZWMzIGRpcmVjdFNwZWN1bGFyOwoJdmVjMyBpbmRpcmVjdERpZmZ1c2U7Cgl2ZWMzIGluZGlyZWN0U3BlY3VsYXI7Cn07CiNpZmRlZiBVU0VfQUxQSEFIQVNICgl2YXJ5aW5nIHZlYzMgdlBvc2l0aW9uOwojZW5kaWYKdmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHsKCXJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApOwp9CnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkgewoJcmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7Cn0KbWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7CgltYXQzIHRtcDsKCXRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApOwoJdG1wWyAxIF0gPSB2ZWMzKCBtWyAwIF0ueSwgbVsgMSBdLnksIG1bIDIgXS55ICk7Cgl0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTsKCXJldHVybiB0bXA7Cn0KZmxvYXQgbHVtaW5hbmNlKCBjb25zdCBpbiB2ZWMzIHJnYiApIHsKCWNvbnN0IHZlYzMgd2VpZ2h0cyA9IHZlYzMoIDAuMjEyNjcyOSwgMC43MTUxNTIyLCAwLjA3MjE3NTAgKTsKCXJldHVybiBkb3QoIHdlaWdodHMsIHJnYiApOwp9CmJvb2wgaXNQZXJzcGVjdGl2ZU1hdHJpeCggbWF0NCBtICkgewoJcmV0dXJuIG1bIDIgXVsgMyBdID09IC0gMS4wOwp9CnZlYzIgZXF1aXJlY3RVdiggaW4gdmVjMyBkaXIgKSB7CglmbG9hdCB1ID0gYXRhbiggZGlyLnosIGRpci54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTsKCWZsb2F0IHYgPSBhc2luKCBjbGFtcCggZGlyLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTsKCXJldHVybiB2ZWMyKCB1LCB2ICk7Cn0KdmVjMyBCUkRGX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkgewoJcmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBkaWZmdXNlQ29sb3I7Cn0KdmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgZjAsIGNvbnN0IGluIGZsb2F0IGY5MCwgY29uc3QgaW4gZmxvYXQgZG90VkggKSB7CglmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtIDUuNTU0NzMgKiBkb3RWSCAtIDYuOTgzMTYgKSAqIGRvdFZIICk7CglyZXR1cm4gZjAgKiAoIDEuMCAtIGZyZXNuZWwgKSArICggZjkwICogZnJlc25lbCApOwp9CmZsb2F0IEZfU2NobGljayggY29uc3QgaW4gZmxvYXQgZjAsIGNvbnN0IGluIGZsb2F0IGY5MCwgY29uc3QgaW4gZmxvYXQgZG90VkggKSB7CglmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtIDUuNTU0NzMgKiBkb3RWSCAtIDYuOTgzMTYgKSAqIGRvdFZIICk7CglyZXR1cm4gZjAgKiAoIDEuMCAtIGZyZXNuZWwgKSArICggZjkwICogZnJlc25lbCApOwp9IC8vIHZhbGlkYXRlZGAsaXk9YCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWCgkjZGVmaW5lIGN1YmVVVl9taW5NaXBMZXZlbCA0LjAKCSNkZWZpbmUgY3ViZVVWX21pblRpbGVTaXplIDE2LjAKCWZsb2F0IGdldEZhY2UoIHZlYzMgZGlyZWN0aW9uICkgewoJCXZlYzMgYWJzRGlyZWN0aW9uID0gYWJzKCBkaXJlY3Rpb24gKTsKCQlmbG9hdCBmYWNlID0gLSAxLjA7CgkJaWYgKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi56ICkgewoJCQlpZiAoIGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnkgKQoJCQkJZmFjZSA9IGRpcmVjdGlvbi54ID4gMC4wID8gMC4wIDogMy4wOwoJCQllbHNlCgkJCQlmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxLjAgOiA0LjA7CgkJfSBlbHNlIHsKCQkJaWYgKCBhYnNEaXJlY3Rpb24ueiA+IGFic0RpcmVjdGlvbi55ICkKCQkJCWZhY2UgPSBkaXJlY3Rpb24ueiA+IDAuMCA/IDIuMCA6IDUuMDsKCQkJZWxzZQoJCQkJZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wOwoJCX0KCQlyZXR1cm4gZmFjZTsKCX0KCXZlYzIgZ2V0VVYoIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBmYWNlICkgewoJCXZlYzIgdXY7CgkJaWYgKCBmYWNlID09IDAuMCApIHsKCQkJdXYgPSB2ZWMyKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnggKTsKCQl9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHsKCQkJdXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCAtIGRpcmVjdGlvbi56ICkgLyBhYnMoIGRpcmVjdGlvbi55ICk7CgkJfSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7CgkJCXV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTsKCQl9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHsKCQkJdXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApOwoJCX0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkgewoJCQl1diA9IHZlYzIoIC0gZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56ICkgLyBhYnMoIGRpcmVjdGlvbi55ICk7CgkJfSBlbHNlIHsKCQkJdXYgPSB2ZWMyKCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTsKCQl9CgkJcmV0dXJuIDAuNSAqICggdXYgKyAxLjAgKTsKCX0KCXZlYzMgYmlsaW5lYXJDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBtaXBJbnQgKSB7CgkJZmxvYXQgZmFjZSA9IGdldEZhY2UoIGRpcmVjdGlvbiApOwoJCWZsb2F0IGZpbHRlckludCA9IG1heCggY3ViZVVWX21pbk1pcExldmVsIC0gbWlwSW50LCAwLjAgKTsKCQltaXBJbnQgPSBtYXgoIG1pcEludCwgY3ViZVVWX21pbk1pcExldmVsICk7CgkJZmxvYXQgZmFjZVNpemUgPSBleHAyKCBtaXBJbnQgKTsKCQloaWdocCB2ZWMyIHV2ID0gZ2V0VVYoIGRpcmVjdGlvbiwgZmFjZSApICogKCBmYWNlU2l6ZSAtIDIuMCApICsgMS4wOwoJCWlmICggZmFjZSA+IDIuMCApIHsKCQkJdXYueSArPSBmYWNlU2l6ZTsKCQkJZmFjZSAtPSAzLjA7CgkJfQoJCXV2LnggKz0gZmFjZSAqIGZhY2VTaXplOwoJCXV2LnggKz0gZmlsdGVySW50ICogMy4wICogY3ViZVVWX21pblRpbGVTaXplOwoJCXV2LnkgKz0gNC4wICogKCBleHAyKCBDVUJFVVZfTUFYX01JUCApIC0gZmFjZVNpemUgKTsKCQl1di54ICo9IENVQkVVVl9URVhFTF9XSURUSDsKCQl1di55ICo9IENVQkVVVl9URVhFTF9IRUlHSFQ7CgkJI2lmZGVmIHRleHR1cmUyREdyYWRFWFQKCQkJcmV0dXJuIHRleHR1cmUyREdyYWRFWFQoIGVudk1hcCwgdXYsIHZlYzIoIDAuMCApLCB2ZWMyKCAwLjAgKSApLnJnYjsKCQkjZWxzZQoJCQlyZXR1cm4gdGV4dHVyZTJEKCBlbnZNYXAsIHV2ICkucmdiOwoJCSNlbmRpZgoJfQoJI2RlZmluZSBjdWJlVVZfcjAgMS4wCgkjZGVmaW5lIGN1YmVVVl92MCAwLjMzOQoJI2RlZmluZSBjdWJlVVZfbTAgLSAyLjAKCSNkZWZpbmUgY3ViZVVWX3IxIDAuOAoJI2RlZmluZSBjdWJlVVZfdjEgMC4yNzYKCSNkZWZpbmUgY3ViZVVWX20xIC0gMS4wCgkjZGVmaW5lIGN1YmVVVl9yNCAwLjQKCSNkZWZpbmUgY3ViZVVWX3Y0IDAuMDQ2CgkjZGVmaW5lIGN1YmVVVl9tNCAyLjAKCSNkZWZpbmUgY3ViZVVWX3I1IDAuMzA1CgkjZGVmaW5lIGN1YmVVVl92NSAwLjAxNgoJI2RlZmluZSBjdWJlVVZfbTUgMy4wCgkjZGVmaW5lIGN1YmVVVl9yNiAwLjIxCgkjZGVmaW5lIGN1YmVVVl92NiAwLjAwMzgKCSNkZWZpbmUgY3ViZVVWX202IDQuMAoJZmxvYXQgcm91Z2huZXNzVG9NaXAoIGZsb2F0IHJvdWdobmVzcyApIHsKCQlmbG9hdCBtaXAgPSAwLjA7CgkJaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3IxICkgewoJCQltaXAgPSAoIGN1YmVVVl9yMCAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTEgLSBjdWJlVVZfbTAgKSAvICggY3ViZVVWX3IwIC0gY3ViZVVWX3IxICkgKyBjdWJlVVZfbTA7CgkJfSBlbHNlIGlmICggcm91Z2huZXNzID49IGN1YmVVVl9yNCApIHsKCQkJbWlwID0gKCBjdWJlVVZfcjEgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX200IC0gY3ViZVVWX20xICkgLyAoIGN1YmVVVl9yMSAtIGN1YmVVVl9yNCApICsgY3ViZVVWX20xOwoJCX0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSBjdWJlVVZfcjUgKSB7CgkJCW1pcCA9ICggY3ViZVVWX3I0IC0gcm91Z2huZXNzICkgKiAoIGN1YmVVVl9tNSAtIGN1YmVVVl9tNCApIC8gKCBjdWJlVVZfcjQgLSBjdWJlVVZfcjUgKSArIGN1YmVVVl9tNDsKCQl9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3I2ICkgewoJCQltaXAgPSAoIGN1YmVVVl9yNSAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTYgLSBjdWJlVVZfbTUgKSAvICggY3ViZVVWX3I1IC0gY3ViZVVWX3I2ICkgKyBjdWJlVVZfbTU7CgkJfSBlbHNlIHsKCQkJbWlwID0gLSAyLjAgKiBsb2cyKCAxLjE2ICogcm91Z2huZXNzICk7CQl9CgkJcmV0dXJuIG1pcDsKCX0KCXZlYzQgdGV4dHVyZUN1YmVVViggc2FtcGxlcjJEIGVudk1hcCwgdmVjMyBzYW1wbGVEaXIsIGZsb2F0IHJvdWdobmVzcyApIHsKCQlmbG9hdCBtaXAgPSBjbGFtcCggcm91Z2huZXNzVG9NaXAoIHJvdWdobmVzcyApLCBjdWJlVVZfbTAsIENVQkVVVl9NQVhfTUlQICk7CgkJZmxvYXQgbWlwRiA9IGZyYWN0KCBtaXAgKTsKCQlmbG9hdCBtaXBJbnQgPSBmbG9vciggbWlwICk7CgkJdmVjMyBjb2xvcjAgPSBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludCApOwoJCWlmICggbWlwRiA9PSAwLjAgKSB7CgkJCXJldHVybiB2ZWM0KCBjb2xvcjAsIDEuMCApOwoJCX0gZWxzZSB7CgkJCXZlYzMgY29sb3IxID0gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyLCBtaXBJbnQgKyAxLjAgKTsKCQkJcmV0dXJuIHZlYzQoIG1peCggY29sb3IwLCBjb2xvcjEsIG1pcEYgKSwgMS4wICk7CgkJfQoJfQojZW5kaWZgLHJ5PWB2ZWMzIHRyYW5zZm9ybWVkTm9ybWFsID0gb2JqZWN0Tm9ybWFsOwojaWZkZWYgVVNFX1RBTkdFTlQKCXZlYzMgdHJhbnNmb3JtZWRUYW5nZW50ID0gb2JqZWN0VGFuZ2VudDsKI2VuZGlmCiNpZmRlZiBVU0VfQkFUQ0hJTkcKCW1hdDMgYm0gPSBtYXQzKCBiYXRjaGluZ01hdHJpeCApOwoJdHJhbnNmb3JtZWROb3JtYWwgLz0gdmVjMyggZG90KCBibVsgMCBdLCBibVsgMCBdICksIGRvdCggYm1bIDEgXSwgYm1bIDEgXSApLCBkb3QoIGJtWyAyIF0sIGJtWyAyIF0gKSApOwoJdHJhbnNmb3JtZWROb3JtYWwgPSBibSAqIHRyYW5zZm9ybWVkTm9ybWFsOwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJdHJhbnNmb3JtZWRUYW5nZW50ID0gYm0gKiB0cmFuc2Zvcm1lZFRhbmdlbnQ7CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfSU5TVEFOQ0lORwoJbWF0MyBpbSA9IG1hdDMoIGluc3RhbmNlTWF0cml4ICk7Cgl0cmFuc2Zvcm1lZE5vcm1hbCAvPSB2ZWMzKCBkb3QoIGltWyAwIF0sIGltWyAwIF0gKSwgZG90KCBpbVsgMSBdLCBpbVsgMSBdICksIGRvdCggaW1bIDIgXSwgaW1bIDIgXSApICk7Cgl0cmFuc2Zvcm1lZE5vcm1hbCA9IGltICogdHJhbnNmb3JtZWROb3JtYWw7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl0cmFuc2Zvcm1lZFRhbmdlbnQgPSBpbSAqIHRyYW5zZm9ybWVkVGFuZ2VudDsKCSNlbmRpZgojZW5kaWYKdHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWxNYXRyaXggKiB0cmFuc2Zvcm1lZE5vcm1hbDsKI2lmZGVmIEZMSVBfU0lERUQKCXRyYW5zZm9ybWVkTm9ybWFsID0gLSB0cmFuc2Zvcm1lZE5vcm1hbDsKI2VuZGlmCiNpZmRlZiBVU0VfVEFOR0VOVAoJdHJhbnNmb3JtZWRUYW5nZW50ID0gKCBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZFRhbmdlbnQsIDAuMCApICkueHl6OwoJI2lmZGVmIEZMSVBfU0lERUQKCQl0cmFuc2Zvcm1lZFRhbmdlbnQgPSAtIHRyYW5zZm9ybWVkVGFuZ2VudDsKCSNlbmRpZgojZW5kaWZgLHN5PWAjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwOwoJdW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTsKCXVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50QmlhczsKI2VuZGlmYCxheT1gI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCXRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB2RGlzcGxhY2VtZW50TWFwVXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7CiNlbmRpZmAsb3k9YCNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXZlYzQgZW1pc3NpdmVDb2xvciA9IHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZFbWlzc2l2ZU1hcFV2ICk7Cgl0b3RhbEVtaXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7CiNlbmRpZmAsbHk9YCNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGVtaXNzaXZlTWFwOwojZW5kaWZgLGN5PSJnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTsiLGh5PWAKY29uc3QgbWF0MyBMSU5FQVJfU1JHQl9UT19MSU5FQVJfRElTUExBWV9QMyA9IG1hdDMoCgl2ZWMzKCAwLjgyMjQ2MjEsIDAuMTc3NTM4LCAwLjAgKSwKCXZlYzMoIDAuMDMzMTk0MSwgMC45NjY4MDU4LCAwLjAgKSwKCXZlYzMoIDAuMDE3MDgyNywgMC4wNzIzOTc0LCAwLjkxMDUxOTkgKQopOwpjb25zdCBtYXQzIExJTkVBUl9ESVNQTEFZX1AzX1RPX0xJTkVBUl9TUkdCID0gbWF0MygKCXZlYzMoIDEuMjI0OTQwMSwgLSAwLjIyNDk0MDQsIDAuMCApLAoJdmVjMyggLSAwLjA0MjA1NjksIDEuMDQyMDU3MSwgMC4wICksCgl2ZWMzKCAtIDAuMDE5NjM3NiwgLSAwLjA3ODYzNjEsIDEuMDk4MjczNSApCik7CnZlYzQgTGluZWFyU1JHQlRvTGluZWFyRGlzcGxheVAzKCBpbiB2ZWM0IHZhbHVlICkgewoJcmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIExJTkVBUl9TUkdCX1RPX0xJTkVBUl9ESVNQTEFZX1AzLCB2YWx1ZS5hICk7Cn0KdmVjNCBMaW5lYXJEaXNwbGF5UDNUb0xpbmVhclNSR0IoIGluIHZlYzQgdmFsdWUgKSB7CglyZXR1cm4gdmVjNCggdmFsdWUucmdiICogTElORUFSX0RJU1BMQVlfUDNfVE9fTElORUFSX1NSR0IsIHZhbHVlLmEgKTsKfQp2ZWM0IExpbmVhclRyYW5zZmVyT0VURiggaW4gdmVjNCB2YWx1ZSApIHsKCXJldHVybiB2YWx1ZTsKfQp2ZWM0IHNSR0JUcmFuc2Zlck9FVEYoIGluIHZlYzQgdmFsdWUgKSB7CglyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7Cn0KdmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHsKCXJldHVybiB2YWx1ZTsKfQp2ZWM0IExpbmVhclRvc1JHQiggaW4gdmVjNCB2YWx1ZSApIHsKCXJldHVybiBzUkdCVHJhbnNmZXJPRVRGKCB2YWx1ZSApOwp9YCx1eT1gI2lmZGVmIFVTRV9FTlZNQVAKCSNpZmRlZiBFTlZfV09STERQT1MKCQl2ZWMzIGNhbWVyYVRvRnJhZzsKCQlpZiAoIGlzT3J0aG9ncmFwaGljICkgewoJCQljYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZlYzMoIC0gdmlld01hdHJpeFsgMCBdWyAyIF0sIC0gdmlld01hdHJpeFsgMSBdWyAyIF0sIC0gdmlld01hdHJpeFsgMiBdWyAyIF0gKSApOwoJCX0gZWxzZSB7CgkJCWNhbWVyYVRvRnJhZyA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gLSBjYW1lcmFQb3NpdGlvbiApOwoJCX0KCQl2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7CgkJI2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT04KCQkJdmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggY2FtZXJhVG9GcmFnLCB3b3JsZE5vcm1hbCApOwoJCSNlbHNlCgkJCXZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIGNhbWVyYVRvRnJhZywgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApOwoJCSNlbmRpZgoJI2Vsc2UKCQl2ZWMzIHJlZmxlY3RWZWMgPSB2UmVmbGVjdDsKCSNlbmRpZgoJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkUKCQl2ZWM0IGVudkNvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7CgkjZWxzZQoJCXZlYzQgZW52Q29sb3IgPSB2ZWM0KCAwLjAgKTsKCSNlbmRpZgoJI2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWQoJCW91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTsKCSNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKQoJCW91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApOwoJI2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX0FERCApCgkJb3V0Z29pbmdMaWdodCArPSBlbnZDb2xvci54eXogKiBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5OwoJI2VuZGlmCiNlbmRpZmAsZnk9YCNpZmRlZiBVU0VfRU5WTUFQCgl1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTsKCXVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDsKCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFCgkJdW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7CgkjZWxzZQoJCXVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDsKCSNlbmRpZgoJCiNlbmRpZmAsZHk9YCNpZmRlZiBVU0VfRU5WTUFQCgl1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTsKCSNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIExBTUJFUlQgKQoJCSNkZWZpbmUgRU5WX1dPUkxEUE9TCgkjZW5kaWYKCSNpZmRlZiBFTlZfV09STERQT1MKCQl2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CgkJdW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87CgkjZWxzZQoJCXZhcnlpbmcgdmVjMyB2UmVmbGVjdDsKCSNlbmRpZgojZW5kaWZgLHB5PWAjaWZkZWYgVVNFX0VOVk1BUAoJI2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgfHwgZGVmaW5lZCggTEFNQkVSVCApCgkJI2RlZmluZSBFTlZfV09STERQT1MKCSNlbmRpZgoJI2lmZGVmIEVOVl9XT1JMRFBPUwoJCQoJCXZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjsKCSNlbHNlCgkJdmFyeWluZyB2ZWMzIHZSZWZsZWN0OwoJCXVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvOwoJI2VuZGlmCiNlbmRpZmAsbXk9YCNpZmRlZiBVU0VfRU5WTUFQCgkjaWZkZWYgRU5WX1dPUkxEUE9TCgkJdldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejsKCSNlbHNlCgkJdmVjMyBjYW1lcmFUb1ZlcnRleDsKCQlpZiAoIGlzT3J0aG9ncmFwaGljICkgewoJCQljYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggdmVjMyggLSB2aWV3TWF0cml4WyAwIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAxIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAyIF1bIDIgXSApICk7CgkJfSBlbHNlIHsKCQkJY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHdvcmxkUG9zaXRpb24ueHl6IC0gY2FtZXJhUG9zaXRpb24gKTsKCQl9CgkJdmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7CgkJI2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT04KCQkJdlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTsKCQkjZWxzZQoJCQl2UmVmbGVjdCA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7CgkJI2VuZGlmCgkjZW5kaWYKI2VuZGlmYCxneT1gI2lmZGVmIFVTRV9GT0cKCXZGb2dEZXB0aCA9IC0gbXZQb3NpdGlvbi56OwojZW5kaWZgLF95PWAjaWZkZWYgVVNFX0ZPRwoJdmFyeWluZyBmbG9hdCB2Rm9nRGVwdGg7CiNlbmRpZmAseHk9YCNpZmRlZiBVU0VfRk9HCgkjaWZkZWYgRk9HX0VYUDIKCQlmbG9hdCBmb2dGYWN0b3IgPSAxLjAgLSBleHAoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiB2Rm9nRGVwdGggKiB2Rm9nRGVwdGggKTsKCSNlbHNlCgkJZmxvYXQgZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCB2Rm9nRGVwdGggKTsKCSNlbmRpZgoJZ2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApOwojZW5kaWZgLHl5PWAjaWZkZWYgVVNFX0ZPRwoJdW5pZm9ybSB2ZWMzIGZvZ0NvbG9yOwoJdmFyeWluZyBmbG9hdCB2Rm9nRGVwdGg7CgkjaWZkZWYgRk9HX0VYUDIKCQl1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7CgkjZWxzZQoJCXVuaWZvcm0gZmxvYXQgZm9nTmVhcjsKCQl1bmlmb3JtIGZsb2F0IGZvZ0ZhcjsKCSNlbmRpZgojZW5kaWZgLHZ5PWAjaWZkZWYgVVNFX0dSQURJRU5UTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDsKI2VuZGlmCnZlYzMgZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHsKCWZsb2F0IGRvdE5MID0gZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7Cgl2ZWMyIGNvb3JkID0gdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApOwoJI2lmZGVmIFVTRV9HUkFESUVOVE1BUAoJCXJldHVybiB2ZWMzKCB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnIgKTsKCSNlbHNlCgkJdmVjMiBmdyA9IGZ3aWR0aCggY29vcmQgKSAqIDAuNTsKCQlyZXR1cm4gbWl4KCB2ZWMzKCAwLjcgKSwgdmVjMyggMS4wICksIHNtb290aHN0ZXAoIDAuNyAtIGZ3LngsIDAuNyArIGZ3LngsIGNvb3JkLnggKSApOwoJI2VuZGlmCn1gLE15PWAjaWZkZWYgVVNFX0xJR0hUTUFQCgl2ZWM0IGxpZ2h0TWFwVGV4ZWwgPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2TGlnaHRNYXBVdiApOwoJdmVjMyBsaWdodE1hcElycmFkaWFuY2UgPSBsaWdodE1hcFRleGVsLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5OwoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGxpZ2h0TWFwSXJyYWRpYW5jZTsKI2VuZGlmYCxTeT1gI2lmZGVmIFVTRV9MSUdIVE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgbGlnaHRNYXA7Cgl1bmlmb3JtIGZsb2F0IGxpZ2h0TWFwSW50ZW5zaXR5OwojZW5kaWZgLGJ5PWBMYW1iZXJ0TWF0ZXJpYWwgbWF0ZXJpYWw7Cm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7Cm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoO2Asd3k9YHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwpzdHJ1Y3QgTGFtYmVydE1hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwoJZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDsKfTsKdm9pZCBSRV9EaXJlY3RfTGFtYmVydCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gTGFtYmVydE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7Cgl2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yOwoJcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQp2b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9MYW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIExhbWJlcnRNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0KI2RlZmluZSBSRV9EaXJlY3QJCQkJUkVfRGlyZWN0X0xhbWJlcnQKI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2UJCVJFX0luZGlyZWN0RGlmZnVzZV9MYW1iZXJ0YCxFeT1gdW5pZm9ybSBib29sIHJlY2VpdmVTaGFkb3c7CnVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjsKI2lmIGRlZmluZWQoIFVTRV9MSUdIVF9QUk9CRVMgKQoJdW5pZm9ybSB2ZWMzIGxpZ2h0UHJvYmVbIDkgXTsKI2VuZGlmCnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7CglmbG9hdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56OwoJdmVjMyByZXN1bHQgPSBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDEgXSAqIDIuMCAqIDAuNTExNjY0ICogeTsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6OwoJcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7CglyZXR1cm4gcmVzdWx0Owp9CnZlYzMgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgbGlnaHRQcm9iZVsgOSBdLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCXZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTsKCXZlYzMgaXJyYWRpYW5jZSA9IHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgbGlnaHRQcm9iZSApOwoJcmV0dXJuIGlycmFkaWFuY2U7Cn0KdmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkgewoJdmVjMyBpcnJhZGlhbmNlID0gYW1iaWVudExpZ2h0Q29sb3I7CglyZXR1cm4gaXJyYWRpYW5jZTsKfQpmbG9hdCBnZXREaXN0YW5jZUF0dGVudWF0aW9uKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHsKCSNpZiBkZWZpbmVkICggTEVHQUNZX0xJR0hUUyApCgkJaWYgKCBjdXRvZmZEaXN0YW5jZSA+IDAuMCAmJiBkZWNheUV4cG9uZW50ID4gMC4wICkgewoJCQlyZXR1cm4gcG93KCBzYXR1cmF0ZSggLSBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCApOwoJCX0KCQlyZXR1cm4gMS4wOwoJI2Vsc2UKCQlmbG9hdCBkaXN0YW5jZUZhbGxvZmYgPSAxLjAgLyBtYXgoIHBvdyggbGlnaHREaXN0YW5jZSwgZGVjYXlFeHBvbmVudCApLCAwLjAxICk7CgkJaWYgKCBjdXRvZmZEaXN0YW5jZSA+IDAuMCApIHsKCQkJZGlzdGFuY2VGYWxsb2ZmICo9IHBvdzIoIHNhdHVyYXRlKCAxLjAgLSBwb3c0KCBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKSApICk7CgkJfQoJCXJldHVybiBkaXN0YW5jZUZhbGxvZmY7CgkjZW5kaWYKfQpmbG9hdCBnZXRTcG90QXR0ZW51YXRpb24oIGNvbnN0IGluIGZsb2F0IGNvbmVDb3NpbmUsIGNvbnN0IGluIGZsb2F0IHBlbnVtYnJhQ29zaW5lLCBjb25zdCBpbiBmbG9hdCBhbmdsZUNvc2luZSApIHsKCXJldHVybiBzbW9vdGhzdGVwKCBjb25lQ29zaW5lLCBwZW51bWJyYUNvc2luZSwgYW5nbGVDb3NpbmUgKTsKfQojaWYgTlVNX0RJUl9MSUdIVFMgPiAwCglzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7CgkJdmVjMyBkaXJlY3Rpb247CgkJdmVjMyBjb2xvcjsKCX07Cgl1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07Cgl2b2lkIGdldERpcmVjdGlvbmFsTGlnaHRJbmZvKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQsIG91dCBJbmNpZGVudExpZ2h0IGxpZ2h0ICkgewoJCWxpZ2h0LmNvbG9yID0gZGlyZWN0aW9uYWxMaWdodC5jb2xvcjsKCQlsaWdodC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbjsKCQlsaWdodC52aXNpYmxlID0gdHJ1ZTsKCX0KI2VuZGlmCiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMAoJc3RydWN0IFBvaW50TGlnaHQgewoJCXZlYzMgcG9zaXRpb247CgkJdmVjMyBjb2xvcjsKCQlmbG9hdCBkaXN0YW5jZTsKCQlmbG9hdCBkZWNheTsKCX07Cgl1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTsKCXZvaWQgZ2V0UG9pbnRMaWdodEluZm8oIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBvdXQgSW5jaWRlbnRMaWdodCBsaWdodCApIHsKCQl2ZWMzIGxWZWN0b3IgPSBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnlQb3NpdGlvbjsKCQlsaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTsKCQlmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7CgkJbGlnaHQuY29sb3IgPSBwb2ludExpZ2h0LmNvbG9yOwoJCWxpZ2h0LmNvbG9yICo9IGdldERpc3RhbmNlQXR0ZW51YXRpb24oIGxpZ2h0RGlzdGFuY2UsIHBvaW50TGlnaHQuZGlzdGFuY2UsIHBvaW50TGlnaHQuZGVjYXkgKTsKCQlsaWdodC52aXNpYmxlID0gKCBsaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApOwoJfQojZW5kaWYKI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDAKCXN0cnVjdCBTcG90TGlnaHQgewoJCXZlYzMgcG9zaXRpb247CgkJdmVjMyBkaXJlY3Rpb247CgkJdmVjMyBjb2xvcjsKCQlmbG9hdCBkaXN0YW5jZTsKCQlmbG9hdCBkZWNheTsKCQlmbG9hdCBjb25lQ29zOwoJCWZsb2F0IHBlbnVtYnJhQ29zOwoJfTsKCXVuaWZvcm0gU3BvdExpZ2h0IHNwb3RMaWdodHNbIE5VTV9TUE9UX0xJR0hUUyBdOwoJdm9pZCBnZXRTcG90TGlnaHRJbmZvKCBjb25zdCBpbiBTcG90TGlnaHQgc3BvdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIG91dCBJbmNpZGVudExpZ2h0IGxpZ2h0ICkgewoJCXZlYzMgbFZlY3RvciA9IHNwb3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5UG9zaXRpb247CgkJbGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7CgkJZmxvYXQgYW5nbGVDb3MgPSBkb3QoIGxpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApOwoJCWZsb2F0IHNwb3RBdHRlbnVhdGlvbiA9IGdldFNwb3RBdHRlbnVhdGlvbiggc3BvdExpZ2h0LmNvbmVDb3MsIHNwb3RMaWdodC5wZW51bWJyYUNvcywgYW5nbGVDb3MgKTsKCQlpZiAoIHNwb3RBdHRlbnVhdGlvbiA+IDAuMCApIHsKCQkJZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApOwoJCQlsaWdodC5jb2xvciA9IHNwb3RMaWdodC5jb2xvciAqIHNwb3RBdHRlbnVhdGlvbjsKCQkJbGlnaHQuY29sb3IgKj0gZ2V0RGlzdGFuY2VBdHRlbnVhdGlvbiggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTsKCQkJbGlnaHQudmlzaWJsZSA9ICggbGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTsKCQl9IGVsc2UgewoJCQlsaWdodC5jb2xvciA9IHZlYzMoIDAuMCApOwoJCQlsaWdodC52aXNpYmxlID0gZmFsc2U7CgkJfQoJfQojZW5kaWYKI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMAoJc3RydWN0IFJlY3RBcmVhTGlnaHQgewoJCXZlYzMgY29sb3I7CgkJdmVjMyBwb3NpdGlvbjsKCQl2ZWMzIGhhbGZXaWR0aDsKCQl2ZWMzIGhhbGZIZWlnaHQ7Cgl9OwoJdW5pZm9ybSBzYW1wbGVyMkQgbHRjXzE7CXVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yOwoJdW5pZm9ybSBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHRzWyBOVU1fUkVDVF9BUkVBX0xJR0hUUyBdOwojZW5kaWYKI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDAKCXN0cnVjdCBIZW1pc3BoZXJlTGlnaHQgewoJCXZlYzMgZGlyZWN0aW9uOwoJCXZlYzMgc2t5Q29sb3I7CgkJdmVjMyBncm91bmRDb2xvcjsKCX07Cgl1bmlmb3JtIEhlbWlzcGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTsKCXZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7CgkJZmxvYXQgZG90TkwgPSBkb3QoIG5vcm1hbCwgaGVtaUxpZ2h0LmRpcmVjdGlvbiApOwoJCWZsb2F0IGhlbWlEaWZmdXNlV2VpZ2h0ID0gMC41ICogZG90TkwgKyAwLjU7CgkJdmVjMyBpcnJhZGlhbmNlID0gbWl4KCBoZW1pTGlnaHQuZ3JvdW5kQ29sb3IsIGhlbWlMaWdodC5za3lDb2xvciwgaGVtaURpZmZ1c2VXZWlnaHQgKTsKCQlyZXR1cm4gaXJyYWRpYW5jZTsKCX0KI2VuZGlmYCxBeT1gI2lmZGVmIFVTRV9FTlZNQVAKCXZlYzMgZ2V0SUJMSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7CgkJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVYKCQkJdmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApOwoJCQl2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCB3b3JsZE5vcm1hbCwgMS4wICk7CgkJCXJldHVybiBQSSAqIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTsKCQkjZWxzZQoJCQlyZXR1cm4gdmVjMyggMC4wICk7CgkJI2VuZGlmCgl9Cgl2ZWMzIGdldElCTFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7CgkJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVYKCQkJdmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggLSB2aWV3RGlyLCBub3JtYWwgKTsKCQkJcmVmbGVjdFZlYyA9IG5vcm1hbGl6ZSggbWl4KCByZWZsZWN0VmVjLCBub3JtYWwsIHJvdWdobmVzcyAqIHJvdWdobmVzcykgKTsKCQkJcmVmbGVjdFZlYyA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTsKCQkJdmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgcmVmbGVjdFZlYywgcm91Z2huZXNzICk7CgkJCXJldHVybiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7CgkJI2Vsc2UKCQkJcmV0dXJuIHZlYzMoIDAuMCApOwoJCSNlbmRpZgoJfQoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJdmVjMyBnZXRJQkxBbmlzb3Ryb3B5UmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBiaXRhbmdlbnQsIGNvbnN0IGluIGZsb2F0IGFuaXNvdHJvcHkgKSB7CgkJCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWCgkJCQl2ZWMzIGJlbnROb3JtYWwgPSBjcm9zcyggYml0YW5nZW50LCB2aWV3RGlyICk7CgkJCQliZW50Tm9ybWFsID0gbm9ybWFsaXplKCBjcm9zcyggYmVudE5vcm1hbCwgYml0YW5nZW50ICkgKTsKCQkJCWJlbnROb3JtYWwgPSBub3JtYWxpemUoIG1peCggYmVudE5vcm1hbCwgbm9ybWFsLCBwb3cyKCBwb3cyKCAxLjAgLSBhbmlzb3Ryb3B5ICogKCAxLjAgLSByb3VnaG5lc3MgKSApICkgKSApOwoJCQkJcmV0dXJuIGdldElCTFJhZGlhbmNlKCB2aWV3RGlyLCBiZW50Tm9ybWFsLCByb3VnaG5lc3MgKTsKCQkJI2Vsc2UKCQkJCXJldHVybiB2ZWMzKCAwLjAgKTsKCQkJI2VuZGlmCgkJfQoJI2VuZGlmCiNlbmRpZmAsVHk9YFRvb25NYXRlcmlhbCBtYXRlcmlhbDsKbWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjtgLEN5PWB2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKc3RydWN0IFRvb25NYXRlcmlhbCB7Cgl2ZWMzIGRpZmZ1c2VDb2xvcjsKfTsKdm9pZCBSRV9EaXJlY3RfVG9vbiggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXZlYzMgaXJyYWRpYW5jZSA9IGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICogZGlyZWN0TGlnaHQuY29sb3I7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwp9CnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1Rvb24oIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQojZGVmaW5lIFJFX0RpcmVjdAkJCQlSRV9EaXJlY3RfVG9vbgojZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZQkJUkVfSW5kaXJlY3REaWZmdXNlX1Rvb25gLFJ5PWBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7Cm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7Cm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjsKbWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgPSBzaGluaW5lc3M7Cm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoO2AsUHk9YHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwpzdHJ1Y3QgQmxpbm5QaG9uZ01hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwoJdmVjMyBzcGVjdWxhckNvbG9yOwoJZmxvYXQgc3BlY3VsYXJTaGluaW5lc3M7CglmbG9hdCBzcGVjdWxhclN0cmVuZ3RoOwp9Owp2b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeU5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwoJcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDsKfQp2b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0KI2RlZmluZSBSRV9EaXJlY3QJCQkJUkVfRGlyZWN0X0JsaW5uUGhvbmcKI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2UJCVJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nYCxMeT1gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDsKbWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7CnZlYzMgZHh5ID0gbWF4KCBhYnMoIGRGZHgoIG5vblBlcnR1cmJlZE5vcm1hbCApICksIGFicyggZEZkeSggbm9uUGVydHVyYmVkTm9ybWFsICkgKSApOwpmbG9hdCBnZW9tZXRyeVJvdWdobmVzcyA9IG1heCggbWF4KCBkeHkueCwgZHh5LnkgKSwgZHh5LnogKTsKbWF0ZXJpYWwucm91Z2huZXNzID0gbWF4KCByb3VnaG5lc3NGYWN0b3IsIDAuMDUyNSApO21hdGVyaWFsLnJvdWdobmVzcyArPSBnZW9tZXRyeVJvdWdobmVzczsKbWF0ZXJpYWwucm91Z2huZXNzID0gbWluKCBtYXRlcmlhbC5yb3VnaG5lc3MsIDEuMCApOwojaWZkZWYgSU9SCgltYXRlcmlhbC5pb3IgPSBpb3I7CgkjaWZkZWYgVVNFX1NQRUNVTEFSCgkJZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgPSBzcGVjdWxhckludGVuc2l0eTsKCQl2ZWMzIHNwZWN1bGFyQ29sb3JGYWN0b3IgPSBzcGVjdWxhckNvbG9yOwoJCSNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCQkJc3BlY3VsYXJDb2xvckZhY3RvciAqPSB0ZXh0dXJlMkQoIHNwZWN1bGFyQ29sb3JNYXAsIHZTcGVjdWxhckNvbG9yTWFwVXYgKS5yZ2I7CgkJI2VuZGlmCgkJI2lmZGVmIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAKCQkJc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgKj0gdGV4dHVyZTJEKCBzcGVjdWxhckludGVuc2l0eU1hcCwgdlNwZWN1bGFySW50ZW5zaXR5TWFwVXYgKS5hOwoJCSNlbmRpZgoJCW1hdGVyaWFsLnNwZWN1bGFyRjkwID0gbWl4KCBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgMS4wLCBtZXRhbG5lc3NGYWN0b3IgKTsKCSNlbHNlCgkJZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgPSAxLjA7CgkJdmVjMyBzcGVjdWxhckNvbG9yRmFjdG9yID0gdmVjMyggMS4wICk7CgkJbWF0ZXJpYWwuc3BlY3VsYXJGOTAgPSAxLjA7CgkjZW5kaWYKCW1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIG1pbiggcG93MiggKCBtYXRlcmlhbC5pb3IgLSAxLjAgKSAvICggbWF0ZXJpYWwuaW9yICsgMS4wICkgKSAqIHNwZWN1bGFyQ29sb3JGYWN0b3IsIHZlYzMoIDEuMCApICkgKiBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7CiNlbHNlCgltYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCAwLjA0ICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApOwoJbWF0ZXJpYWwuc3BlY3VsYXJGOTAgPSAxLjA7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJbWF0ZXJpYWwuY2xlYXJjb2F0ID0gY2xlYXJjb2F0OwoJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gY2xlYXJjb2F0Um91Z2huZXNzOwoJbWF0ZXJpYWwuY2xlYXJjb2F0RjAgPSB2ZWMzKCAwLjA0ICk7CgltYXRlcmlhbC5jbGVhcmNvYXRGOTAgPSAxLjA7CgkjaWZkZWYgVVNFX0NMRUFSQ09BVE1BUAoJCW1hdGVyaWFsLmNsZWFyY29hdCAqPSB0ZXh0dXJlMkQoIGNsZWFyY29hdE1hcCwgdkNsZWFyY29hdE1hcFV2ICkueDsKCSNlbmRpZgoJI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQCgkJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICo9IHRleHR1cmUyRCggY2xlYXJjb2F0Um91Z2huZXNzTWFwLCB2Q2xlYXJjb2F0Um91Z2huZXNzTWFwVXYgKS55OwoJI2VuZGlmCgltYXRlcmlhbC5jbGVhcmNvYXQgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuY2xlYXJjb2F0ICk7CW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1heCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAwLjA1MjUgKTsKCW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyArPSBnZW9tZXRyeVJvdWdobmVzczsKCW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAxLjAgKTsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCW1hdGVyaWFsLmlyaWRlc2NlbmNlID0gaXJpZGVzY2VuY2U7CgltYXRlcmlhbC5pcmlkZXNjZW5jZUlPUiA9IGlyaWRlc2NlbmNlSU9SOwoJI2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUAoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlICo9IHRleHR1cmUyRCggaXJpZGVzY2VuY2VNYXAsIHZJcmlkZXNjZW5jZU1hcFV2ICkucjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAKCQltYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9IChpcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW0gLSBpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW0pICogdGV4dHVyZTJEKCBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcCwgdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYgKS5nICsgaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtOwoJI2Vsc2UKCQltYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTgoJbWF0ZXJpYWwuc2hlZW5Db2xvciA9IHNoZWVuQ29sb3I7CgkjaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQCgkJbWF0ZXJpYWwuc2hlZW5Db2xvciAqPSB0ZXh0dXJlMkQoIHNoZWVuQ29sb3JNYXAsIHZTaGVlbkNvbG9yTWFwVXYgKS5yZ2I7CgkjZW5kaWYKCW1hdGVyaWFsLnNoZWVuUm91Z2huZXNzID0gY2xhbXAoIHNoZWVuUm91Z2huZXNzLCAwLjA3LCAxLjAgKTsKCSNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgkJbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgKj0gdGV4dHVyZTJEKCBzaGVlblJvdWdobmVzc01hcCwgdlNoZWVuUm91Z2huZXNzTWFwVXYgKS5hOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFkKCSNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUAoJCW1hdDIgYW5pc290cm9weU1hdCA9IG1hdDIoIGFuaXNvdHJvcHlWZWN0b3IueCwgYW5pc290cm9weVZlY3Rvci55LCAtIGFuaXNvdHJvcHlWZWN0b3IueSwgYW5pc290cm9weVZlY3Rvci54ICk7CgkJdmVjMyBhbmlzb3Ryb3B5UG9sYXIgPSB0ZXh0dXJlMkQoIGFuaXNvdHJvcHlNYXAsIHZBbmlzb3Ryb3B5TWFwVXYgKS5yZ2I7CgkJdmVjMiBhbmlzb3Ryb3B5ViA9IGFuaXNvdHJvcHlNYXQgKiBub3JtYWxpemUoIDIuMCAqIGFuaXNvdHJvcHlQb2xhci5yZyAtIHZlYzIoIDEuMCApICkgKiBhbmlzb3Ryb3B5UG9sYXIuYjsKCSNlbHNlCgkJdmVjMiBhbmlzb3Ryb3B5ViA9IGFuaXNvdHJvcHlWZWN0b3I7CgkjZW5kaWYKCW1hdGVyaWFsLmFuaXNvdHJvcHkgPSBsZW5ndGgoIGFuaXNvdHJvcHlWICk7CglpZiggbWF0ZXJpYWwuYW5pc290cm9weSA9PSAwLjAgKSB7CgkJYW5pc290cm9weVYgPSB2ZWMyKCAxLjAsIDAuMCApOwoJfSBlbHNlIHsKCQlhbmlzb3Ryb3B5ViAvPSBtYXRlcmlhbC5hbmlzb3Ryb3B5OwoJCW1hdGVyaWFsLmFuaXNvdHJvcHkgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuYW5pc290cm9weSApOwoJfQoJbWF0ZXJpYWwuYWxwaGFUID0gbWl4KCBwb3cyKCBtYXRlcmlhbC5yb3VnaG5lc3MgKSwgMS4wLCBwb3cyKCBtYXRlcmlhbC5hbmlzb3Ryb3B5ICkgKTsKCW1hdGVyaWFsLmFuaXNvdHJvcHlUID0gdGJuWyAwIF0gKiBhbmlzb3Ryb3B5Vi54ICsgdGJuWyAxIF0gKiBhbmlzb3Ryb3B5Vi55OwoJbWF0ZXJpYWwuYW5pc290cm9weUIgPSB0Ym5bIDEgXSAqIGFuaXNvdHJvcHlWLnggLSB0Ym5bIDAgXSAqIGFuaXNvdHJvcHlWLnk7CiNlbmRpZmAsSXk9YHN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwoJZmxvYXQgcm91Z2huZXNzOwoJdmVjMyBzcGVjdWxhckNvbG9yOwoJZmxvYXQgc3BlY3VsYXJGOTA7CgkjaWZkZWYgVVNFX0NMRUFSQ09BVAoJCWZsb2F0IGNsZWFyY29hdDsKCQlmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7CgkJdmVjMyBjbGVhcmNvYXRGMDsKCQlmbG9hdCBjbGVhcmNvYXRGOTA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCQlmbG9hdCBpcmlkZXNjZW5jZTsKCQlmbG9hdCBpcmlkZXNjZW5jZUlPUjsKCQlmbG9hdCBpcmlkZXNjZW5jZVRoaWNrbmVzczsKCQl2ZWMzIGlyaWRlc2NlbmNlRnJlc25lbDsKCQl2ZWMzIGlyaWRlc2NlbmNlRjA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU4KCQl2ZWMzIHNoZWVuQ29sb3I7CgkJZmxvYXQgc2hlZW5Sb3VnaG5lc3M7CgkjZW5kaWYKCSNpZmRlZiBJT1IKCQlmbG9hdCBpb3I7CgkjZW5kaWYKCSNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgkJZmxvYXQgdHJhbnNtaXNzaW9uOwoJCWZsb2F0IHRyYW5zbWlzc2lvbkFscGhhOwoJCWZsb2F0IHRoaWNrbmVzczsKCQlmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlOwoJCXZlYzMgYXR0ZW51YXRpb25Db2xvcjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJZmxvYXQgYW5pc290cm9weTsKCQlmbG9hdCBhbHBoYVQ7CgkJdmVjMyBhbmlzb3Ryb3B5VDsKCQl2ZWMzIGFuaXNvdHJvcHlCOwoJI2VuZGlmCn07CnZlYzMgY2xlYXJjb2F0U3BlY3VsYXJEaXJlY3QgPSB2ZWMzKCAwLjAgKTsKdmVjMyBjbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0ID0gdmVjMyggMC4wICk7CnZlYzMgc2hlZW5TcGVjdWxhckRpcmVjdCA9IHZlYzMoIDAuMCApOwp2ZWMzIHNoZWVuU3BlY3VsYXJJbmRpcmVjdCA9IHZlYzMoMC4wICk7CnZlYzMgU2NobGlja190b19GMCggY29uc3QgaW4gdmVjMyBmLCBjb25zdCBpbiBmbG9hdCBmOTAsIGNvbnN0IGluIGZsb2F0IGRvdFZIICkgewogICAgZmxvYXQgeCA9IGNsYW1wKCAxLjAgLSBkb3RWSCwgMC4wLCAxLjAgKTsKICAgIGZsb2F0IHgyID0geCAqIHg7CiAgICBmbG9hdCB4NSA9IGNsYW1wKCB4ICogeDIgKiB4MiwgMC4wLCAwLjk5OTkgKTsKICAgIHJldHVybiAoIGYgLSB2ZWMzKCBmOTAgKSAqIHg1ICkgLyAoIDEuMCAtIHg1ICk7Cn0KZmxvYXQgVl9HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkgewoJZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApOwoJZmxvYXQgZ3YgPSBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApOwoJZmxvYXQgZ2wgPSBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApOwoJcmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApOwp9CmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7CglmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7CglmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7CglyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTsKfQojaWZkZWYgVVNFX0FOSVNPVFJPUFkKCWZsb2F0IFZfR0dYX1NtaXRoQ29ycmVsYXRlZF9Bbmlzb3Ryb3BpYyggY29uc3QgaW4gZmxvYXQgYWxwaGFULCBjb25zdCBpbiBmbG9hdCBhbHBoYUIsIGNvbnN0IGluIGZsb2F0IGRvdFRWLCBjb25zdCBpbiBmbG9hdCBkb3RCViwgY29uc3QgaW4gZmxvYXQgZG90VEwsIGNvbnN0IGluIGZsb2F0IGRvdEJMLCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7CgkJZmxvYXQgZ3YgPSBkb3ROTCAqIGxlbmd0aCggdmVjMyggYWxwaGFUICogZG90VFYsIGFscGhhQiAqIGRvdEJWLCBkb3ROViApICk7CgkJZmxvYXQgZ2wgPSBkb3ROViAqIGxlbmd0aCggdmVjMyggYWxwaGFUICogZG90VEwsIGFscGhhQiAqIGRvdEJMLCBkb3ROTCApICk7CgkJZmxvYXQgdiA9IDAuNSAvICggZ3YgKyBnbCApOwoJCXJldHVybiBzYXR1cmF0ZSh2KTsKCX0KCWZsb2F0IERfR0dYX0FuaXNvdHJvcGljKCBjb25zdCBpbiBmbG9hdCBhbHBoYVQsIGNvbnN0IGluIGZsb2F0IGFscGhhQiwgY29uc3QgaW4gZmxvYXQgZG90TkgsIGNvbnN0IGluIGZsb2F0IGRvdFRILCBjb25zdCBpbiBmbG9hdCBkb3RCSCApIHsKCQlmbG9hdCBhMiA9IGFscGhhVCAqIGFscGhhQjsKCQloaWdocCB2ZWMzIHYgPSB2ZWMzKCBhbHBoYUIgKiBkb3RUSCwgYWxwaGFUICogZG90QkgsIGEyICogZG90TkggKTsKCQloaWdocCBmbG9hdCB2MiA9IGRvdCggdiwgdiApOwoJCWZsb2F0IHcyID0gYTIgLyB2MjsKCQlyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyICogcG93MiAoIHcyICk7Cgl9CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJdmVjMyBCUkRGX0dHWF9DbGVhcmNvYXQoIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwpIHsKCQl2ZWMzIGYwID0gbWF0ZXJpYWwuY2xlYXJjb2F0RjA7CgkJZmxvYXQgZjkwID0gbWF0ZXJpYWwuY2xlYXJjb2F0RjkwOwoJCWZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzczsKCQlmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApOwoJCXZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggbGlnaHREaXIgKyB2aWV3RGlyICk7CgkJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGxpZ2h0RGlyICkgKTsKCQlmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CgkJZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApOwoJCWZsb2F0IGRvdFZIID0gc2F0dXJhdGUoIGRvdCggdmlld0RpciwgaGFsZkRpciApICk7CgkJdmVjMyBGID0gRl9TY2hsaWNrKCBmMCwgZjkwLCBkb3RWSCApOwoJCWZsb2F0IFYgPSBWX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTsKCQlmbG9hdCBEID0gRF9HR1goIGFscGhhLCBkb3ROSCApOwoJCXJldHVybiBGICogKCBWICogRCApOwoJfQojZW5kaWYKdmVjMyBCUkRGX0dHWCggY29uc3QgaW4gdmVjMyBsaWdodERpciwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCApIHsKCXZlYzMgZjAgPSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yOwoJZmxvYXQgZjkwID0gbWF0ZXJpYWwuc3BlY3VsYXJGOTA7CglmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5yb3VnaG5lc3M7CglmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApOwoJdmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBsaWdodERpciApICk7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CglmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaGFsZkRpciApICk7CglmbG9hdCBkb3RWSCA9IHNhdHVyYXRlKCBkb3QoIHZpZXdEaXIsIGhhbGZEaXIgKSApOwoJdmVjMyBGID0gRl9TY2hsaWNrKCBmMCwgZjkwLCBkb3RWSCApOwoJI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJCUYgPSBtaXgoIEYsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UgKTsKCSNlbmRpZgoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJZmxvYXQgZG90VEwgPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlULCBsaWdodERpciApOwoJCWZsb2F0IGRvdFRWID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5VCwgdmlld0RpciApOwoJCWZsb2F0IGRvdFRIID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5VCwgaGFsZkRpciApOwoJCWZsb2F0IGRvdEJMID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5QiwgbGlnaHREaXIgKTsKCQlmbG9hdCBkb3RCViA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weUIsIHZpZXdEaXIgKTsKCQlmbG9hdCBkb3RCSCA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weUIsIGhhbGZEaXIgKTsKCQlmbG9hdCBWID0gVl9HR1hfU21pdGhDb3JyZWxhdGVkX0FuaXNvdHJvcGljKCBtYXRlcmlhbC5hbHBoYVQsIGFscGhhLCBkb3RUViwgZG90QlYsIGRvdFRMLCBkb3RCTCwgZG90TlYsIGRvdE5MICk7CgkJZmxvYXQgRCA9IERfR0dYX0FuaXNvdHJvcGljKCBtYXRlcmlhbC5hbHBoYVQsIGFscGhhLCBkb3ROSCwgZG90VEgsIGRvdEJIICk7CgkjZWxzZQoJCWZsb2F0IFYgPSBWX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTsKCQlmbG9hdCBEID0gRF9HR1goIGFscGhhLCBkb3ROSCApOwoJI2VuZGlmCglyZXR1cm4gRiAqICggViAqIEQgKTsKfQp2ZWMyIExUQ19VdiggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHsKCWNvbnN0IGZsb2F0IExVVF9TSVpFID0gNjQuMDsKCWNvbnN0IGZsb2F0IExVVF9TQ0FMRSA9ICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFOwoJY29uc3QgZmxvYXQgTFVUX0JJQVMgPSAwLjUgLyBMVVRfU0laRTsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggTiwgViApICk7Cgl2ZWMyIHV2ID0gdmVjMiggcm91Z2huZXNzLCBzcXJ0KCAxLjAgLSBkb3ROViApICk7Cgl1diA9IHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7CglyZXR1cm4gdXY7Cn0KZmxvYXQgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIGYgKSB7CglmbG9hdCBsID0gbGVuZ3RoKCBmICk7CglyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7Cn0KdmVjMyBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgdjEsIGNvbnN0IGluIHZlYzMgdjIgKSB7CglmbG9hdCB4ID0gZG90KCB2MSwgdjIgKTsKCWZsb2F0IHkgPSBhYnMoIHggKTsKCWZsb2F0IGEgPSAwLjg1NDM5ODUgKyAoIDAuNDk2NTE1NSArIDAuMDE0NTIwNiAqIHkgKSAqIHk7CglmbG9hdCBiID0gMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5OwoJZmxvYXQgdiA9IGEgLyBiOwoJZmxvYXQgdGhldGFfc2ludGhldGEgPSAoIHggPiAwLjAgKSA/IHYgOiAwLjUgKiBpbnZlcnNlc3FydCggbWF4KCAxLjAgLSB4ICogeCwgMWUtNyApICkgLSB2OwoJcmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhOwp9CnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkgewoJdmVjMyB2MSA9IHJlY3RDb29yZHNbIDEgXSAtIHJlY3RDb29yZHNbIDAgXTsKCXZlYzMgdjIgPSByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07Cgl2ZWMzIGxpZ2h0Tm9ybWFsID0gY3Jvc3MoIHYxLCB2MiApOwoJaWYoIGRvdCggbGlnaHROb3JtYWwsIFAgLSByZWN0Q29vcmRzWyAwIF0gKSA8IDAuMCApIHJldHVybiB2ZWMzKCAwLjAgKTsKCXZlYzMgVDEsIFQyOwoJVDEgPSBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTsKCVQyID0gLSBjcm9zcyggTiwgVDEgKTsKCW1hdDMgbWF0ID0gbUludiAqIHRyYW5zcG9zZU1hdDMoIG1hdDMoIFQxLCBUMiwgTiApICk7Cgl2ZWMzIGNvb3Jkc1sgNCBdOwoJY29vcmRzWyAwIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDAgXSAtIFAgKTsKCWNvb3Jkc1sgMSBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7Cgljb29yZHNbIDIgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApOwoJY29vcmRzWyAzIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDMgXSAtIFAgKTsKCWNvb3Jkc1sgMCBdID0gbm9ybWFsaXplKCBjb29yZHNbIDAgXSApOwoJY29vcmRzWyAxIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7Cgljb29yZHNbIDIgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAyIF0gKTsKCWNvb3Jkc1sgMyBdID0gbm9ybWFsaXplKCBjb29yZHNbIDMgXSApOwoJdmVjMyB2ZWN0b3JGb3JtRmFjdG9yID0gdmVjMyggMC4wICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAwIF0sIGNvb3Jkc1sgMSBdICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAzIF0sIGNvb3Jkc1sgMCBdICk7CglmbG9hdCByZXN1bHQgPSBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTsKCXJldHVybiB2ZWMzKCByZXN1bHQgKTsKfQojaWYgZGVmaW5lZCggVVNFX1NIRUVOICkKZmxvYXQgRF9DaGFybGllKCBmbG9hdCByb3VnaG5lc3MsIGZsb2F0IGRvdE5IICkgewoJZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTsKCWZsb2F0IGludkFscGhhID0gMS4wIC8gYWxwaGE7CglmbG9hdCBjb3MyaCA9IGRvdE5IICogZG90Tkg7CglmbG9hdCBzaW4yaCA9IG1heCggMS4wIC0gY29zMmgsIDAuMDA3ODEyNSApOwoJcmV0dXJuICggMi4wICsgaW52QWxwaGEgKSAqIHBvdyggc2luMmgsIGludkFscGhhICogMC41ICkgLyAoIDIuMCAqIFBJICk7Cn0KZmxvYXQgVl9OZXViZWx0KCBmbG9hdCBkb3ROViwgZmxvYXQgZG90TkwgKSB7CglyZXR1cm4gc2F0dXJhdGUoIDEuMCAvICggNC4wICogKCBkb3ROTCArIGRvdE5WIC0gZG90TkwgKiBkb3ROViApICkgKTsKfQp2ZWMzIEJSREZfU2hlZW4oIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIHZlYzMgc2hlZW5Db2xvciwgY29uc3QgaW4gZmxvYXQgc2hlZW5Sb3VnaG5lc3MgKSB7Cgl2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApOwoJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGxpZ2h0RGlyICkgKTsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTsKCWZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTsKCWZsb2F0IEQgPSBEX0NoYXJsaWUoIHNoZWVuUm91Z2huZXNzLCBkb3ROSCApOwoJZmxvYXQgViA9IFZfTmV1YmVsdCggZG90TlYsIGRvdE5MICk7CglyZXR1cm4gc2hlZW5Db2xvciAqICggRCAqIFYgKTsKfQojZW5kaWYKZmxvYXQgSUJMU2hlZW5CUkRGKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CglmbG9hdCByMiA9IHJvdWdobmVzcyAqIHJvdWdobmVzczsKCWZsb2F0IGEgPSByb3VnaG5lc3MgPCAwLjI1ID8gLTMzOS4yICogcjIgKyAxNjEuNCAqIHJvdWdobmVzcyAtIDI1LjkgOiAtOC40OCAqIHIyICsgMTQuMyAqIHJvdWdobmVzcyAtIDkuOTU7CglmbG9hdCBiID0gcm91Z2huZXNzIDwgMC4yNSA/IDQ0LjAgKiByMiAtIDIzLjcgKiByb3VnaG5lc3MgKyAzLjI2IDogMS45NyAqIHIyIC0gMy4yNyAqIHJvdWdobmVzcyArIDAuNzI7CglmbG9hdCBERyA9IGV4cCggYSAqIGRvdE5WICsgYiApICsgKCByb3VnaG5lc3MgPCAwLjI1ID8gMC4wIDogMC4xICogKCByb3VnaG5lc3MgLSAwLjI1ICkgKTsKCXJldHVybiBzYXR1cmF0ZSggREcgKiBSRUNJUFJPQ0FMX1BJICk7Cn0KdmVjMiBERkdBcHByb3goIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTsKCWNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApOwoJY29uc3QgdmVjNCBjMSA9IHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7Cgl2ZWM0IHIgPSByb3VnaG5lc3MgKiBjMCArIGMxOwoJZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7Cgl2ZWMyIGZhYiA9IHZlYzIoIC0gMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7CglyZXR1cm4gZmFiOwp9CnZlYzMgRW52aXJvbm1lbnRCUkRGKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7Cgl2ZWMyIGZhYiA9IERGR0FwcHJveCggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTsKCXJldHVybiBzcGVjdWxhckNvbG9yICogZmFiLnggKyBzcGVjdWxhckY5MCAqIGZhYi55Owp9CiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKdm9pZCBjb21wdXRlTXVsdGlzY2F0dGVyaW5nSXJpZGVzY2VuY2UoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc3BlY3VsYXJGOTAsIGNvbnN0IGluIGZsb2F0IGlyaWRlc2NlbmNlLCBjb25zdCBpbiB2ZWMzIGlyaWRlc2NlbmNlRjAsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgaW5vdXQgdmVjMyBzaW5nbGVTY2F0dGVyLCBpbm91dCB2ZWMzIG11bHRpU2NhdHRlciApIHsKI2Vsc2UKdm9pZCBjb21wdXRlTXVsdGlzY2F0dGVyaW5nKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7CiNlbmRpZgoJdmVjMiBmYWIgPSBERkdBcHByb3goIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7CgkjaWZkZWYgVVNFX0lSSURFU0NFTkNFCgkJdmVjMyBGciA9IG1peCggc3BlY3VsYXJDb2xvciwgaXJpZGVzY2VuY2VGMCwgaXJpZGVzY2VuY2UgKTsKCSNlbHNlCgkJdmVjMyBGciA9IHNwZWN1bGFyQ29sb3I7CgkjZW5kaWYKCXZlYzMgRnNzRXNzID0gRnIgKiBmYWIueCArIHNwZWN1bGFyRjkwICogZmFiLnk7CglmbG9hdCBFc3MgPSBmYWIueCArIGZhYi55OwoJZmxvYXQgRW1zID0gMS4wIC0gRXNzOwoJdmVjMyBGYXZnID0gRnIgKyAoIDEuMCAtIEZyICkgKiAwLjA0NzYxOTsJdmVjMyBGbXMgPSBGc3NFc3MgKiBGYXZnIC8gKCAxLjAgLSBFbXMgKiBGYXZnICk7CglzaW5nbGVTY2F0dGVyICs9IEZzc0VzczsKCW11bHRpU2NhdHRlciArPSBGbXMgKiBFbXM7Cn0KI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMAoJdm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwoIGNvbnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CgkJdmVjMyBub3JtYWwgPSBnZW9tZXRyeU5vcm1hbDsKCQl2ZWMzIHZpZXdEaXIgPSBnZW9tZXRyeVZpZXdEaXI7CgkJdmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5UG9zaXRpb247CgkJdmVjMyBsaWdodFBvcyA9IHJlY3RBcmVhTGlnaHQucG9zaXRpb247CgkJdmVjMyBoYWxmV2lkdGggPSByZWN0QXJlYUxpZ2h0LmhhbGZXaWR0aDsKCQl2ZWMzIGhhbGZIZWlnaHQgPSByZWN0QXJlYUxpZ2h0LmhhbGZIZWlnaHQ7CgkJdmVjMyBsaWdodENvbG9yID0gcmVjdEFyZWFMaWdodC5jb2xvcjsKCQlmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5yb3VnaG5lc3M7CgkJdmVjMyByZWN0Q29vcmRzWyA0IF07CgkJcmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0OwkJcmVjdENvb3Jkc1sgMSBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0OwoJCXJlY3RDb29yZHNbIDIgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoICsgaGFsZkhlaWdodDsKCQlyZWN0Q29vcmRzWyAzIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7CgkJdmVjMiB1diA9IExUQ19Vdiggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTsKCQl2ZWM0IHQxID0gdGV4dHVyZTJEKCBsdGNfMSwgdXYgKTsKCQl2ZWM0IHQyID0gdGV4dHVyZTJEKCBsdGNfMiwgdXYgKTsKCQltYXQzIG1JbnYgPSBtYXQzKAoJCQl2ZWMzKCB0MS54LCAwLCB0MS55ICksCgkJCXZlYzMoICAgIDAsIDEsICAgIDAgKSwKCQkJdmVjMyggdDEueiwgMCwgdDEudyApCgkJKTsKCQl2ZWMzIGZyZXNuZWwgPSAoIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKiB0Mi54ICsgKCB2ZWMzKCAxLjAgKSAtIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKSAqIHQyLnkgKTsKCQlyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBsaWdodENvbG9yICogZnJlc25lbCAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbUludiwgcmVjdENvb3JkcyApOwoJCXJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbWF0MyggMS4wICksIHJlY3RDb29yZHMgKTsKCX0KI2VuZGlmCnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7Cgl2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yOwoJI2lmZGVmIFVTRV9DTEVBUkNPQVQKCQlmbG9hdCBkb3ROTGNjID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7CgkJdmVjMyBjY0lycmFkaWFuY2UgPSBkb3ROTGNjICogZGlyZWN0TGlnaHQuY29sb3I7CgkJY2xlYXJjb2F0U3BlY3VsYXJEaXJlY3QgKz0gY2NJcnJhZGlhbmNlICogQlJERl9HR1hfQ2xlYXJjb2F0KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsICk7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU4KCQlzaGVlblNwZWN1bGFyRGlyZWN0ICs9IGlycmFkaWFuY2UgKiBCUkRGX1NoZWVuKCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnNoZWVuQ29sb3IsIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICk7CgkjZW5kaWYKCXJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBCUkRGX0dHWCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbCApOwoJcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQp2b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQp2b2lkIFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgcmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBjbGVhcmNvYXRSYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQpIHsKCSNpZmRlZiBVU0VfQ0xFQVJDT0FUCgkJY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCArPSBjbGVhcmNvYXRSYWRpYW5jZSAqIEVudmlyb25tZW50QlJERiggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuY2xlYXJjb2F0RjAsIG1hdGVyaWFsLmNsZWFyY29hdEY5MCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU4KCQlzaGVlblNwZWN1bGFySW5kaXJlY3QgKz0gaXJyYWRpYW5jZSAqIG1hdGVyaWFsLnNoZWVuQ29sb3IgKiBJQkxTaGVlbkJSREYoIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICk7CgkjZW5kaWYKCXZlYzMgc2luZ2xlU2NhdHRlcmluZyA9IHZlYzMoIDAuMCApOwoJdmVjMyBtdWx0aVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlID0gaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7CgkjaWZkZWYgVVNFX0lSSURFU0NFTkNFCgkJY29tcHV0ZU11bHRpc2NhdHRlcmluZ0lyaWRlc2NlbmNlKCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwucm91Z2huZXNzLCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcgKTsKCSNlbHNlCgkJY29tcHV0ZU11bHRpc2NhdHRlcmluZyggZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsIG1hdGVyaWFsLnJvdWdobmVzcywgc2luZ2xlU2NhdHRlcmluZywgbXVsdGlTY2F0dGVyaW5nICk7CgkjZW5kaWYKCXZlYzMgdG90YWxTY2F0dGVyaW5nID0gc2luZ2xlU2NhdHRlcmluZyArIG11bHRpU2NhdHRlcmluZzsKCXZlYzMgZGlmZnVzZSA9IG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqICggMS4wIC0gbWF4KCBtYXgoIHRvdGFsU2NhdHRlcmluZy5yLCB0b3RhbFNjYXR0ZXJpbmcuZyApLCB0b3RhbFNjYXR0ZXJpbmcuYiApICk7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IHJhZGlhbmNlICogc2luZ2xlU2NhdHRlcmluZzsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlOwoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGRpZmZ1c2UgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7Cn0KI2RlZmluZSBSRV9EaXJlY3QJCQkJUkVfRGlyZWN0X1BoeXNpY2FsCiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhCQlSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwKI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2UJCVJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbAojZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXIJCVJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwKZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkgewoJcmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTsKfWAsVXk9YAp2ZWMzIGdlb21ldHJ5UG9zaXRpb24gPSAtIHZWaWV3UG9zaXRpb247CnZlYzMgZ2VvbWV0cnlOb3JtYWwgPSBub3JtYWw7CnZlYzMgZ2VvbWV0cnlWaWV3RGlyID0gKCBpc09ydGhvZ3JhcGhpYyApID8gdmVjMyggMCwgMCwgMSApIDogbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7CnZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwgPSB2ZWMzKCAwLjAgKTsKI2lmZGVmIFVTRV9DTEVBUkNPQVQKCWdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsID0gY2xlYXJjb2F0Tm9ybWFsOwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJZmxvYXQgZG90TlZpID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIgKSApOwoJaWYgKCBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9PSAwLjAgKSB7CgkJbWF0ZXJpYWwuaXJpZGVzY2VuY2UgPSAwLjA7Cgl9IGVsc2UgewoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlID0gc2F0dXJhdGUoIG1hdGVyaWFsLmlyaWRlc2NlbmNlICk7Cgl9CglpZiAoIG1hdGVyaWFsLmlyaWRlc2NlbmNlID4gMC4wICkgewoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCA9IGV2YWxJcmlkZXNjZW5jZSggMS4wLCBtYXRlcmlhbC5pcmlkZXNjZW5jZUlPUiwgZG90TlZpLCBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcywgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciApOwoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlRjAgPSBTY2hsaWNrX3RvX0YwKCBtYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwsIDEuMCwgZG90TlZpICk7Cgl9CiNlbmRpZgpJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0OwojaWYgKCBOVU1fUE9JTlRfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApCglQb2ludExpZ2h0IHBvaW50TGlnaHQ7CgkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMAoJUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93OwoJI2VuZGlmCgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkgewoJCXBvaW50TGlnaHQgPSBwb2ludExpZ2h0c1sgaSBdOwoJCWdldFBvaW50TGlnaHRJbmZvKCBwb2ludExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBkaXJlY3RMaWdodCApOwoJCSNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgKQoJCXBvaW50TGlnaHRTaGFkb3cgPSBwb2ludExpZ2h0U2hhZG93c1sgaSBdOwoJCWRpcmVjdExpZ2h0LmNvbG9yICo9ICggZGlyZWN0TGlnaHQudmlzaWJsZSAmJiByZWNlaXZlU2hhZG93ICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7CgkJI2VuZGlmCgkJUkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApOwoJfQoJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKI2VuZGlmCiNpZiAoIE5VTV9TUE9UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKQoJU3BvdExpZ2h0IHNwb3RMaWdodDsKCXZlYzQgc3BvdENvbG9yOwoJdmVjMyBzcG90TGlnaHRDb29yZDsKCWJvb2wgaW5TcG90TGlnaHRNYXA7CgkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwCglTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93OwoJI2VuZGlmCgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7CgkJc3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdOwoJCWdldFNwb3RMaWdodEluZm8oIHNwb3RMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZGlyZWN0TGlnaHQgKTsKCQkjaWYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XU19XSVRIX01BUFMgKQoJCSNkZWZpbmUgU1BPVF9MSUdIVF9NQVBfSU5ERVggVU5ST0xMRURfTE9PUF9JTkRFWAoJCSNlbGlmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKQoJCSNkZWZpbmUgU1BPVF9MSUdIVF9NQVBfSU5ERVggTlVNX1NQT1RfTElHSFRfTUFQUwoJCSNlbHNlCgkJI2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCAoIFVOUk9MTEVEX0xPT1BfSU5ERVggLSBOVU1fU1BPVF9MSUdIVF9TSEFET1dTICsgTlVNX1NQT1RfTElHSFRfU0hBRE9XU19XSVRIX01BUFMgKQoJCSNlbmRpZgoJCSNpZiAoIFNQT1RfTElHSFRfTUFQX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfTUFQUyApCgkJCXNwb3RMaWdodENvb3JkID0gdlNwb3RMaWdodENvb3JkWyBpIF0ueHl6IC8gdlNwb3RMaWdodENvb3JkWyBpIF0udzsKCQkJaW5TcG90TGlnaHRNYXAgPSBhbGwoIGxlc3NUaGFuKCBhYnMoIHNwb3RMaWdodENvb3JkICogMi4gLSAxLiApLCB2ZWMzKCAxLjAgKSApICk7CgkJCXNwb3RDb2xvciA9IHRleHR1cmUyRCggc3BvdExpZ2h0TWFwWyBTUE9UX0xJR0hUX01BUF9JTkRFWCBdLCBzcG90TGlnaHRDb29yZC54eSApOwoJCQlkaXJlY3RMaWdodC5jb2xvciA9IGluU3BvdExpZ2h0TWFwID8gZGlyZWN0TGlnaHQuY29sb3IgKiBzcG90Q29sb3IucmdiIDogZGlyZWN0TGlnaHQuY29sb3I7CgkJI2VuZGlmCgkJI3VuZGVmIFNQT1RfTElHSFRfTUFQX0lOREVYCgkJI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTICkKCQlzcG90TGlnaHRTaGFkb3cgPSBzcG90TGlnaHRTaGFkb3dzWyBpIF07CgkJZGlyZWN0TGlnaHQuY29sb3IgKj0gKCBkaXJlY3RMaWdodC52aXNpYmxlICYmIHJlY2VpdmVTaGFkb3cgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZTcG90TGlnaHRDb29yZFsgaSBdICkgOiAxLjA7CgkJI2VuZGlmCgkJUkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApOwoJfQoJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKI2VuZGlmCiNpZiAoIE5VTV9ESVJfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApCglEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7CgkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAKCURpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvdzsKCSNlbmRpZgoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7CgkJZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07CgkJZ2V0RGlyZWN0aW9uYWxMaWdodEluZm8oIGRpcmVjdGlvbmFsTGlnaHQsIGRpcmVjdExpZ2h0ICk7CgkJI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fRElSX0xJR0hUX1NIQURPV1MgKQoJCWRpcmVjdGlvbmFsTGlnaHRTaGFkb3cgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdOwoJCWRpcmVjdExpZ2h0LmNvbG9yICo9ICggZGlyZWN0TGlnaHQudmlzaWJsZSAmJiByZWNlaXZlU2hhZG93ICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wOwoJCSNlbmRpZgoJCVJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5UG9zaXRpb24sIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTsKCX0KCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCiNlbmRpZgojaWYgKCBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3RfUmVjdEFyZWEgKQoJUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0OwoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JFQ1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7CgkJcmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGlnaHRzWyBpIF07CgkJUkVfRGlyZWN0X1JlY3RBcmVhKCByZWN0QXJlYUxpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApCgl2ZWMzIGlibElycmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7CgkjaWYgZGVmaW5lZCggVVNFX0xJR0hUX1BST0JFUyApCgkJaXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnlOb3JtYWwgKTsKCSNlbmRpZgoJI2lmICggTlVNX0hFTUlfTElHSFRTID4gMCApCgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHsKCQkJaXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5Tm9ybWFsICk7CgkJfQoJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyICkKCXZlYzMgcmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgY2xlYXJjb2F0UmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKI2VuZGlmYCxEeT1gI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApCgkjaWZkZWYgVVNFX0xJR0hUTUFQCgkJdmVjNCBsaWdodE1hcFRleGVsID0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdkxpZ2h0TWFwVXYgKTsKCQl2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IGxpZ2h0TWFwVGV4ZWwucmdiICogbGlnaHRNYXBJbnRlbnNpdHk7CgkJaXJyYWRpYW5jZSArPSBsaWdodE1hcElycmFkaWFuY2U7CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKSAmJiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWICkKCQlpYmxJcnJhZGlhbmNlICs9IGdldElCTElycmFkaWFuY2UoIGdlb21ldHJ5Tm9ybWFsICk7CgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApCgkjaWZkZWYgVVNFX0FOSVNPVFJPUFkKCQlyYWRpYW5jZSArPSBnZXRJQkxBbmlzb3Ryb3B5UmFkaWFuY2UoIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuYW5pc290cm9weUIsIG1hdGVyaWFsLmFuaXNvdHJvcHkgKTsKCSNlbHNlCgkJcmFkaWFuY2UgKz0gZ2V0SUJMUmFkaWFuY2UoIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnJvdWdobmVzcyApOwoJI2VuZGlmCgkjaWZkZWYgVVNFX0NMRUFSQ09BVAoJCWNsZWFyY29hdFJhZGlhbmNlICs9IGdldElCTFJhZGlhbmNlKCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTsKCSNlbmRpZgojZW5kaWZgLE55PWAjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlICkKCVJFX0luZGlyZWN0RGlmZnVzZSggaXJyYWRpYW5jZSwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApOwojZW5kaWYKI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKQoJUkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGlibElycmFkaWFuY2UsIGNsZWFyY29hdFJhZGlhbmNlLCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7CiNlbmRpZmAsRnk9YCNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSAmJiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUICkKCWdsX0ZyYWdEZXB0aEVYVCA9IHZJc1BlcnNwZWN0aXZlID09IDAuMCA/IGdsX0ZyYWdDb29yZC56IDogbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTsKI2VuZGlmYCxPeT1gI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApICYmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKQoJdW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDOwoJdmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoOwoJdmFyeWluZyBmbG9hdCB2SXNQZXJzcGVjdGl2ZTsKI2VuZGlmYCxCeT1gI2lmZGVmIFVTRV9MT0dERVBUSEJVRgoJI2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFQKCQl2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7CgkJdmFyeWluZyBmbG9hdCB2SXNQZXJzcGVjdGl2ZTsKCSNlbHNlCgkJdW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDOwoJI2VuZGlmCiNlbmRpZmAsenk9YCNpZmRlZiBVU0VfTE9HREVQVEhCVUYKCSNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUCgkJdkZyYWdEZXB0aCA9IDEuMCArIGdsX1Bvc2l0aW9uLnc7CgkJdklzUGVyc3BlY3RpdmUgPSBmbG9hdCggaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApICk7CgkjZWxzZQoJCWlmICggaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApICkgewoJCQlnbF9Qb3NpdGlvbi56ID0gbG9nMiggbWF4KCBFUFNJTE9OLCBnbF9Qb3NpdGlvbi53ICsgMS4wICkgKSAqIGxvZ0RlcHRoQnVmRkMgLSAxLjA7CgkJCWdsX1Bvc2l0aW9uLnogKj0gZ2xfUG9zaXRpb24udzsKCQl9CgkjZW5kaWYKI2VuZGlmYCxreT1gI2lmZGVmIFVTRV9NQVAKCXZlYzQgc2FtcGxlZERpZmZ1c2VDb2xvciA9IHRleHR1cmUyRCggbWFwLCB2TWFwVXYgKTsKCSNpZmRlZiBERUNPREVfVklERU9fVEVYVFVSRQoJCXNhbXBsZWREaWZmdXNlQ29sb3IgPSB2ZWM0KCBtaXgoIHBvdyggc2FtcGxlZERpZmZ1c2VDb2xvci5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgc2FtcGxlZERpZmZ1c2VDb2xvci5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHNhbXBsZWREaWZmdXNlQ29sb3IucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHNhbXBsZWREaWZmdXNlQ29sb3IudyApOwoJCgkjZW5kaWYKCWRpZmZ1c2VDb2xvciAqPSBzYW1wbGVkRGlmZnVzZUNvbG9yOwojZW5kaWZgLEd5PWAjaWZkZWYgVVNFX01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgbWFwOwojZW5kaWZgLFZ5PWAjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApCgkjaWYgZGVmaW5lZCggVVNFX1BPSU5UU19VViApCgkJdmVjMiB1diA9IHZVdjsKCSNlbHNlCgkJdmVjMiB1diA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCBnbF9Qb2ludENvb3JkLngsIDEuMCAtIGdsX1BvaW50Q29vcmQueSwgMSApICkueHk7CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCglkaWZmdXNlQ29sb3IgKj0gdGV4dHVyZTJEKCBtYXAsIHV2ICk7CiNlbmRpZgojaWZkZWYgVVNFX0FMUEhBTUFQCglkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB1diApLmc7CiNlbmRpZmAsSHk9YCNpZiBkZWZpbmVkKCBVU0VfUE9JTlRTX1VWICkKCXZhcnlpbmcgdmVjMiB2VXY7CiNlbHNlCgkjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApCgkJdW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgbWFwOwojZW5kaWYKI2lmZGVmIFVTRV9BTFBIQU1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgYWxwaGFNYXA7CiNlbmRpZmAsV3k9YGZsb2F0IG1ldGFsbmVzc0ZhY3RvciA9IG1ldGFsbmVzczsKI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXZlYzQgdGV4ZWxNZXRhbG5lc3MgPSB0ZXh0dXJlMkQoIG1ldGFsbmVzc01hcCwgdk1ldGFsbmVzc01hcFV2ICk7CgltZXRhbG5lc3NGYWN0b3IgKj0gdGV4ZWxNZXRhbG5lc3MuYjsKI2VuZGlmYCxYeT1gI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIG1ldGFsbmVzc01hcDsKI2VuZGlmYCxxeT1gI2lmIGRlZmluZWQoIFVTRV9NT1JQSENPTE9SUyApICYmIGRlZmluZWQoIE1PUlBIVEFSR0VUU19URVhUVVJFICkKCXZDb2xvciAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBNT1JQSFRBUkdFVFNfQ09VTlQ7IGkgKysgKSB7CgkJI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCgkJCWlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgdkNvbG9yICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07CgkJI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkKCQkJaWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhPSAwLjAgKSB2Q29sb3IgKz0gZ2V0TW9ycGgoIGdsX1ZlcnRleElELCBpLCAyICkucmdiICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07CgkJI2VuZGlmCgl9CiNlbmRpZmAsJHk9YCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTCglvYmplY3ROb3JtYWwgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJI2lmZGVmIE1PUlBIVEFSR0VUU19URVhUVVJFCgkJZm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkgewoJCQlpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9IDAuMCApIG9iamVjdE5vcm1hbCArPSBnZXRNb3JwaCggZ2xfVmVydGV4SUQsIGksIDEgKS54eXogKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTsKCQl9CgkjZWxzZQoJCW9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDAgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTsKCQlvYmplY3ROb3JtYWwgKz0gbW9ycGhOb3JtYWwxICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07CgkJb2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdOwoJCW9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDMgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTsKCSNlbmRpZgojZW5kaWZgLFl5PWAjaWZkZWYgVVNFX01PUlBIVEFSR0VUUwoJdW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7CgkjaWZkZWYgTU9SUEhUQVJHRVRTX1RFWFRVUkUKCQl1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgTU9SUEhUQVJHRVRTX0NPVU5UIF07CgkJdW5pZm9ybSBzYW1wbGVyMkRBcnJheSBtb3JwaFRhcmdldHNUZXh0dXJlOwoJCXVuaWZvcm0gaXZlYzIgbW9ycGhUYXJnZXRzVGV4dHVyZVNpemU7CgkJdmVjNCBnZXRNb3JwaCggY29uc3QgaW4gaW50IHZlcnRleEluZGV4LCBjb25zdCBpbiBpbnQgbW9ycGhUYXJnZXRJbmRleCwgY29uc3QgaW4gaW50IG9mZnNldCApIHsKCQkJaW50IHRleGVsSW5kZXggPSB2ZXJ0ZXhJbmRleCAqIE1PUlBIVEFSR0VUU19URVhUVVJFX1NUUklERSArIG9mZnNldDsKCQkJaW50IHkgPSB0ZXhlbEluZGV4IC8gbW9ycGhUYXJnZXRzVGV4dHVyZVNpemUueDsKCQkJaW50IHggPSB0ZXhlbEluZGV4IC0geSAqIG1vcnBoVGFyZ2V0c1RleHR1cmVTaXplLng7CgkJCWl2ZWMzIG1vcnBoVVYgPSBpdmVjMyggeCwgeSwgbW9ycGhUYXJnZXRJbmRleCApOwoJCQlyZXR1cm4gdGV4ZWxGZXRjaCggbW9ycGhUYXJnZXRzVGV4dHVyZSwgbW9ycGhVViwgMCApOwoJCX0KCSNlbHNlCgkJI2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTCgkJCXVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA4IF07CgkJI2Vsc2UKCQkJdW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTsKCQkjZW5kaWYKCSNlbmRpZgojZW5kaWZgLFp5PWAjaWZkZWYgVVNFX01PUlBIVEFSR0VUUwoJdHJhbnNmb3JtZWQgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJI2lmZGVmIE1PUlBIVEFSR0VUU19URVhUVVJFCgkJZm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkgewoJCQlpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9IDAuMCApIHRyYW5zZm9ybWVkICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMCApLnh5eiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdOwoJCX0KCSNlbHNlCgkJdHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQwICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07CgkJdHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQxICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07CgkJdHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQyICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07CgkJdHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQzICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07CgkJI2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTCgkJCXRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdOwoJCQl0cmFuc2Zvcm1lZCArPSBtb3JwaFRhcmdldDUgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDUgXTsKCQkJdHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQ2ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA2IF07CgkJCXRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNyBdOwoJCSNlbmRpZgoJI2VuZGlmCiNlbmRpZmAsSnk9YGZsb2F0IGZhY2VEaXJlY3Rpb24gPSBnbF9Gcm9udEZhY2luZyA/IDEuMCA6IC0gMS4wOwojaWZkZWYgRkxBVF9TSEFERUQKCXZlYzMgZmR4ID0gZEZkeCggdlZpZXdQb3NpdGlvbiApOwoJdmVjMyBmZHkgPSBkRmR5KCB2Vmlld1Bvc2l0aW9uICk7Cgl2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTsKI2Vsc2UKCXZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCB2Tm9ybWFsICk7CgkjaWZkZWYgRE9VQkxFX1NJREVECgkJbm9ybWFsICo9IGZhY2VEaXJlY3Rpb247CgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApIHx8IGRlZmluZWQoIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKQoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJbWF0MyB0Ym4gPSBtYXQzKCBub3JtYWxpemUoIHZUYW5nZW50ICksIG5vcm1hbGl6ZSggdkJpdGFuZ2VudCApLCBub3JtYWwgKTsKCSNlbHNlCgkJbWF0MyB0Ym4gPSBnZXRUYW5nZW50RnJhbWUoIC0gdlZpZXdQb3NpdGlvbiwgbm9ybWFsLAoJCSNpZiBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkKCQkJdk5vcm1hbE1hcFV2CgkJI2VsaWYgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKQoJCQl2Q2xlYXJjb2F0Tm9ybWFsTWFwVXYKCQkjZWxzZQoJCQl2VXYKCQkjZW5kaWYKCQkpOwoJI2VuZGlmCgkjaWYgZGVmaW5lZCggRE9VQkxFX1NJREVEICkgJiYgISBkZWZpbmVkKCBGTEFUX1NIQURFRCApCgkJdGJuWzBdICo9IGZhY2VEaXJlY3Rpb247CgkJdGJuWzFdICo9IGZhY2VEaXJlY3Rpb247CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJbWF0MyB0Ym4yID0gbWF0Myggbm9ybWFsaXplKCB2VGFuZ2VudCApLCBub3JtYWxpemUoIHZCaXRhbmdlbnQgKSwgbm9ybWFsICk7CgkjZWxzZQoJCW1hdDMgdGJuMiA9IGdldFRhbmdlbnRGcmFtZSggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsIHZDbGVhcmNvYXROb3JtYWxNYXBVdiApOwoJI2VuZGlmCgkjaWYgZGVmaW5lZCggRE9VQkxFX1NJREVEICkgJiYgISBkZWZpbmVkKCBGTEFUX1NIQURFRCApCgkJdGJuMlswXSAqPSBmYWNlRGlyZWN0aW9uOwoJCXRibjJbMV0gKj0gZmFjZURpcmVjdGlvbjsKCSNlbmRpZgojZW5kaWYKdmVjMyBub25QZXJ0dXJiZWROb3JtYWwgPSBub3JtYWw7YCxLeT1gI2lmZGVmIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0UKCW5vcm1hbCA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2Tm9ybWFsTWFwVXYgKS54eXogKiAyLjAgLSAxLjA7CgkjaWZkZWYgRkxJUF9TSURFRAoJCW5vcm1hbCA9IC0gbm9ybWFsOwoJI2VuZGlmCgkjaWZkZWYgRE9VQkxFX1NJREVECgkJbm9ybWFsID0gbm9ybWFsICogZmFjZURpcmVjdGlvbjsKCSNlbmRpZgoJbm9ybWFsID0gbm9ybWFsaXplKCBub3JtYWxNYXRyaXggKiBub3JtYWwgKTsKI2VsaWYgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKQoJdmVjMyBtYXBOID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZOb3JtYWxNYXBVdiApLnh5eiAqIDIuMCAtIDEuMDsKCW1hcE4ueHkgKj0gbm9ybWFsU2NhbGU7Cglub3JtYWwgPSBub3JtYWxpemUoIHRibiAqIG1hcE4gKTsKI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKQoJbm9ybWFsID0gcGVydHVyYk5vcm1hbEFyYiggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsIGRIZHh5X2Z3ZCgpLCBmYWNlRGlyZWN0aW9uICk7CiNlbmRpZmAsUXk9YCNpZm5kZWYgRkxBVF9TSEFERUQKCXZhcnlpbmcgdmVjMyB2Tm9ybWFsOwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJdmFyeWluZyB2ZWMzIHZUYW5nZW50OwoJCXZhcnlpbmcgdmVjMyB2Qml0YW5nZW50OwoJI2VuZGlmCiNlbmRpZmAsank9YCNpZm5kZWYgRkxBVF9TSEFERUQKCXZhcnlpbmcgdmVjMyB2Tm9ybWFsOwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJdmFyeWluZyB2ZWMzIHZUYW5nZW50OwoJCXZhcnlpbmcgdmVjMyB2Qml0YW5nZW50OwoJI2VuZGlmCiNlbmRpZmAsZXY9YCNpZm5kZWYgRkxBVF9TSEFERUQKCXZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7CgkJdkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTsKCSNlbmRpZgojZW5kaWZgLHR2PWAjaWZkZWYgVVNFX05PUk1BTE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwOwoJdW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlOwojZW5kaWYKI2lmZGVmIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0UKCXVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7CiNlbmRpZgojaWYgISBkZWZpbmVkICggVVNFX1RBTkdFTlQgKSAmJiAoIGRlZmluZWQgKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApIHx8IGRlZmluZWQgKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZICkgKQoJbWF0MyBnZXRUYW5nZW50RnJhbWUoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgdXYgKSB7CgkJdmVjMyBxMCA9IGRGZHgoIGV5ZV9wb3MueHl6ICk7CgkJdmVjMyBxMSA9IGRGZHkoIGV5ZV9wb3MueHl6ICk7CgkJdmVjMiBzdDAgPSBkRmR4KCB1di5zdCApOwoJCXZlYzIgc3QxID0gZEZkeSggdXYuc3QgKTsKCQl2ZWMzIE4gPSBzdXJmX25vcm07CgkJdmVjMyBxMXBlcnAgPSBjcm9zcyggcTEsIE4gKTsKCQl2ZWMzIHEwcGVycCA9IGNyb3NzKCBOLCBxMCApOwoJCXZlYzMgVCA9IHExcGVycCAqIHN0MC54ICsgcTBwZXJwICogc3QxLng7CgkJdmVjMyBCID0gcTFwZXJwICogc3QwLnkgKyBxMHBlcnAgKiBzdDEueTsKCQlmbG9hdCBkZXQgPSBtYXgoIGRvdCggVCwgVCApLCBkb3QoIEIsIEIgKSApOwoJCWZsb2F0IHNjYWxlID0gKCBkZXQgPT0gMC4wICkgPyAwLjAgOiBpbnZlcnNlc3FydCggZGV0ICk7CgkJcmV0dXJuIG1hdDMoIFQgKiBzY2FsZSwgQiAqIHNjYWxlLCBOICk7Cgl9CiNlbmRpZmAsbnY9YCNpZmRlZiBVU0VfQ0xFQVJDT0FUCgl2ZWMzIGNsZWFyY29hdE5vcm1hbCA9IG5vblBlcnR1cmJlZE5vcm1hbDsKI2VuZGlmYCxpdj1gI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgl2ZWMzIGNsZWFyY29hdE1hcE4gPSB0ZXh0dXJlMkQoIGNsZWFyY29hdE5vcm1hbE1hcCwgdkNsZWFyY29hdE5vcm1hbE1hcFV2ICkueHl6ICogMi4wIC0gMS4wOwoJY2xlYXJjb2F0TWFwTi54eSAqPSBjbGVhcmNvYXROb3JtYWxTY2FsZTsKCWNsZWFyY29hdE5vcm1hbCA9IG5vcm1hbGl6ZSggdGJuMiAqIGNsZWFyY29hdE1hcE4gKTsKI2VuZGlmYCxydj1gI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdE1hcDsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0Tm9ybWFsTWFwOwoJdW5pZm9ybSB2ZWMyIGNsZWFyY29hdE5vcm1hbFNjYWxlOwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXRSb3VnaG5lc3NNYXA7CiNlbmRpZmAsc3Y9YCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGlyaWRlc2NlbmNlTWFwOwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwOwojZW5kaWZgLGF2PWAjaWZkZWYgT1BBUVVFCmRpZmZ1c2VDb2xvci5hID0gMS4wOwojZW5kaWYKI2lmZGVmIFVTRV9UUkFOU01JU1NJT04KZGlmZnVzZUNvbG9yLmEgKj0gbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGE7CiNlbmRpZgpnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO2Asb3Y9YHZlYzMgcGFja05vcm1hbFRvUkdCKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCXJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41Owp9CnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkgewoJcmV0dXJuIDIuMCAqIHJnYi54eXogLSAxLjA7Cn0KY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjsKY29uc3QgdmVjMyBQYWNrRmFjdG9ycyA9IHZlYzMoIDI1Ni4gKiAyNTYuICogMjU2LiwgMjU2LiAqIDI1Ni4sIDI1Ni4gKTsKY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzID0gVW5wYWNrRG93bnNjYWxlIC8gdmVjNCggUGFja0ZhY3RvcnMsIDEuICk7CmNvbnN0IGZsb2F0IFNoaWZ0UmlnaHQ4ID0gMS4gLyAyNTYuOwp2ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHsKCXZlYzQgciA9IHZlYzQoIGZyYWN0KCB2ICogUGFja0ZhY3RvcnMgKSwgdiApOwoJci55encgLT0gci54eXogKiBTaGlmdFJpZ2h0ODsJcmV0dXJuIHIgKiBQYWNrVXBzY2FsZTsKfQpmbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkgewoJcmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApOwp9CnZlYzIgcGFja0RlcHRoVG9SRyggaW4gaGlnaHAgZmxvYXQgdiApIHsKCXJldHVybiBwYWNrRGVwdGhUb1JHQkEoIHYgKS55eDsKfQpmbG9hdCB1bnBhY2tSR1RvRGVwdGgoIGNvbnN0IGluIGhpZ2hwIHZlYzIgdiApIHsKCXJldHVybiB1bnBhY2tSR0JBVG9EZXB0aCggdmVjNCggdi54eSwgMC4wLCAwLjAgKSApOwp9CnZlYzQgcGFjazJIYWxmVG9SR0JBKCB2ZWMyIHYgKSB7Cgl2ZWM0IHIgPSB2ZWM0KCB2LngsIGZyYWN0KCB2LnggKiAyNTUuMCApLCB2LnksIGZyYWN0KCB2LnkgKiAyNTUuMCApICk7CglyZXR1cm4gdmVjNCggci54IC0gci55IC8gMjU1LjAsIHIueSwgci56IC0gci53IC8gMjU1LjAsIHIudyApOwp9CnZlYzIgdW5wYWNrUkdCQVRvMkhhbGYoIHZlYzQgdiApIHsKCXJldHVybiB2ZWMyKCB2LnggKyAoIHYueSAvIDI1NS4wICksIHYueiArICggdi53IC8gMjU1LjAgKSApOwp9CmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHsKCXJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7Cn0KZmxvYXQgb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBkZXB0aCwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkgewoJcmV0dXJuIGRlcHRoICogKCBuZWFyIC0gZmFyICkgLSBuZWFyOwp9CmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkgewoJcmV0dXJuICggKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7Cn0KZmxvYXQgcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGRlcHRoLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7CglyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogZGVwdGggLSBmYXIgKTsKfWAsbHY9YCNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBCglnbF9GcmFnQ29sb3IucmdiICo9IGdsX0ZyYWdDb2xvci5hOwojZW5kaWZgLGN2PWB2ZWM0IG12UG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7CiNpZmRlZiBVU0VfQkFUQ0hJTkcKCW12UG9zaXRpb24gPSBiYXRjaGluZ01hdHJpeCAqIG12UG9zaXRpb247CiNlbmRpZgojaWZkZWYgVVNFX0lOU1RBTkNJTkcKCW12UG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeCAqIG12UG9zaXRpb247CiNlbmRpZgptdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogbXZQb3NpdGlvbjsKZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtgLGh2PWAjaWZkZWYgRElUSEVSSU5HCglnbF9GcmFnQ29sb3IucmdiID0gZGl0aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7CiNlbmRpZmAsdXY9YCNpZmRlZiBESVRIRVJJTkcKCXZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkgewoJCWZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTsKCQl2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApOwoJCWRpdGhlcl9zaGlmdF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7CgkJcmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjsKCX0KI2VuZGlmYCxmdj1gZmxvYXQgcm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzOwojaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdmVjNCB0ZXhlbFJvdWdobmVzcyA9IHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2Um91Z2huZXNzTWFwVXYgKTsKCXJvdWdobmVzc0ZhY3RvciAqPSB0ZXhlbFJvdWdobmVzcy5nOwojZW5kaWZgLGR2PWAjaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwOwojZW5kaWZgLHB2PWAjaWYgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMAoJdmFyeWluZyB2ZWM0IHZTcG90TGlnaHRDb29yZFsgTlVNX1NQT1RfTElHSFRfQ09PUkRTIF07CiNlbmRpZgojaWYgTlVNX1NQT1RfTElHSFRfTUFQUyA+IDAKCXVuaWZvcm0gc2FtcGxlcjJEIHNwb3RMaWdodE1hcFsgTlVNX1NQT1RfTElHSFRfTUFQUyBdOwojZW5kaWYKI2lmZGVmIFVTRV9TSEFET1dNQVAKCSNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJCXZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkJc3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQl9OwoJCXVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCSNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNwb3RTaGFkb3dNYXBbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTsKCQlzdHJ1Y3QgU3BvdExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJfTsKCQl1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCSNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCQl1bmlmb3JtIHNhbXBsZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTsKCQl2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07CgkJc3RydWN0IFBvaW50TGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhRmFyOwoJCX07CgkJdW5pZm9ybSBQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3dzWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCglmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkgewoJCXJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApOwoJfQoJdmVjMiB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYgKSB7CgkJcmV0dXJuIHVucGFja1JHQkFUbzJIYWxmKCB0ZXh0dXJlMkQoIHNoYWRvdywgdXYgKSApOwoJfQoJZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7CgkJZmxvYXQgb2NjbHVzaW9uID0gMS4wOwoJCXZlYzIgZGlzdHJpYnV0aW9uID0gdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7CgkJZmxvYXQgaGFyZF9zaGFkb3cgPSBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTsKCQlpZiAoaGFyZF9zaGFkb3cgIT0gMS4wICkgewoJCQlmbG9hdCBkaXN0YW5jZSA9IGNvbXBhcmUgLSBkaXN0cmlidXRpb24ueCA7CgkJCWZsb2F0IHZhcmlhbmNlID0gbWF4KCAwLjAwMDAwLCBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICk7CgkJCWZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7CQkJc29mdG5lc3NfcHJvYmFiaWxpdHkgPSBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7CQkJb2NjbHVzaW9uID0gY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7CgkJfQoJCXJldHVybiBvY2NsdXNpb247Cgl9CglmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkgewoJCWZsb2F0IHNoYWRvdyA9IDEuMDsKCQlzaGFkb3dDb29yZC54eXogLz0gc2hhZG93Q29vcmQudzsKCQlzaGFkb3dDb29yZC56ICs9IHNoYWRvd0JpYXM7CgkJYm9vbCBpbkZydXN0dW0gPSBzaGFkb3dDb29yZC54ID49IDAuMCAmJiBzaGFkb3dDb29yZC54IDw9IDEuMCAmJiBzaGFkb3dDb29yZC55ID49IDAuMCAmJiBzaGFkb3dDb29yZC55IDw9IDEuMDsKCQlib29sIGZydXN0dW1UZXN0ID0gaW5GcnVzdHVtICYmIHNoYWRvd0Nvb3JkLnogPD0gMS4wOwoJCWlmICggZnJ1c3R1bVRlc3QgKSB7CgkJI2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApCgkJCXZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplOwoJCQlmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzOwoJCQlmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzOwoJCQlmbG9hdCBkeDEgPSArIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzOwoJCQlmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzOwoJCQlmbG9hdCBkeDIgPSBkeDAgLyAyLjA7CgkJCWZsb2F0IGR5MiA9IGR5MCAvIDIuMDsKCQkJZmxvYXQgZHgzID0gZHgxIC8gMi4wOwoJCQlmbG9hdCBkeTMgPSBkeTEgLyAyLjA7CgkJCXNoYWRvdyA9ICgKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApCgkJCSkgKiAoIDEuMCAvIDE3LjAgKTsKCQkjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApCgkJCXZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplOwoJCQlmbG9hdCBkeCA9IHRleGVsU2l6ZS54OwoJCQlmbG9hdCBkeSA9IHRleGVsU2l6ZS55OwoJCQl2ZWMyIHV2ID0gc2hhZG93Q29vcmQueHk7CgkJCXZlYzIgZiA9IGZyYWN0KCB1diAqIHNoYWRvd01hcFNpemUgKyAwLjUgKTsKCQkJdXYgLT0gZiAqIHRleGVsU2l6ZTsKCQkJc2hhZG93ID0gKAoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCBkeSApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHRleGVsU2l6ZSwgc2hhZG93Q29vcmQueiApICsKCQkJCW1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIC1keCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSBmLnggKSArCgkJCQltaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIGYueCApICsKCQkJCW1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSBmLnkgKSArCgkJCQltaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIGYueSApICsKCQkJCW1peCggbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCQkgIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkJICBmLnggKSwKCQkJCQkgbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJCSAgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJCSAgZi54ICksCgkJCQkJIGYueSApCgkJCSkgKiAoIDEuMCAvIDkuMCApOwoJCSNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApCgkJCXNoYWRvdyA9IFZTTVNoYWRvdyggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApOwoJCSNlbHNlCgkJCXNoYWRvdyA9IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTsKCQkjZW5kaWYKCQl9CgkJcmV0dXJuIHNoYWRvdzsKCX0KCXZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHsKCQl2ZWMzIGFic1YgPSBhYnMoIHYgKTsKCQlmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTsKCQlhYnNWICo9IHNjYWxlVG9DdWJlOwoJCXYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTsKCQl2ZWMyIHBsYW5hciA9IHYueHk7CgkJZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTsKCQlmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7CgkJaWYgKCBhYnNWLnogPj0gYWxtb3N0T25lICkgewoJCQlpZiAoIHYueiA+IDAuMCApCgkJCQlwbGFuYXIueCA9IDQuMCAtIHYueDsKCQl9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkgewoJCQlmbG9hdCBzaWduWCA9IHNpZ24oIHYueCApOwoJCQlwbGFuYXIueCA9IHYueiAqIHNpZ25YICsgMi4wICogc2lnblg7CgkJfSBlbHNlIGlmICggYWJzVi55ID49IGFsbW9zdE9uZSApIHsKCQkJZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTsKCQkJcGxhbmFyLnggPSB2LnggKyAyLjAgKiBzaWduWSArIDIuMDsKCQkJcGxhbmFyLnkgPSB2LnogKiBzaWduWSAtIDIuMDsKCQl9CgkJcmV0dXJuIHZlYzIoIDAuMTI1LCAwLjI1ICkgKiBwbGFuYXIgKyB2ZWMyKCAwLjM3NSwgMC43NSApOwoJfQoJZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7CgkJdmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTsKCQl2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejsKCQlmbG9hdCBkcCA9ICggbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApOwkJZHAgKz0gc2hhZG93QmlhczsKCQl2ZWMzIGJkM0QgPSBub3JtYWxpemUoIGxpZ2h0VG9Qb3NpdGlvbiApOwoJCSNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApCgkJCXZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTsKCQkJcmV0dXJuICgKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl5LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHgsIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwICkKCQkJKSAqICggMS4wIC8gOS4wICk7CgkJI2Vsc2UKCQkJcmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7CgkJI2VuZGlmCgl9CiNlbmRpZmAsbXY9YCNpZiBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwCgl1bmlmb3JtIG1hdDQgc3BvdExpZ2h0TWF0cml4WyBOVU1fU1BPVF9MSUdIVF9DT09SRFMgXTsKCXZhcnlpbmcgdmVjNCB2U3BvdExpZ2h0Q29vcmRbIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyBdOwojZW5kaWYKI2lmZGVmIFVTRV9TSEFET1dNQVAKCSNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTsKCQl2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJfTsKCQl1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCgkjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAKCQlzdHJ1Y3QgU3BvdExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJfTsKCQl1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCSNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCQl1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07CgkJdmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJCWZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7CgkJCWZsb2F0IHNoYWRvd0NhbWVyYUZhcjsKCQl9OwoJCXVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTsKCSNlbmRpZgojZW5kaWZgLGd2PWAjaWYgKCBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgKCBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwIHx8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMCApICkgfHwgKCBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwICkKCXZlYzMgc2hhZG93V29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApOwoJdmVjNCBzaGFkb3dXb3JsZFBvc2l0aW9uOwojZW5kaWYKI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKQoJI2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAKCQkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0CgkJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCQlzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7CgkJCXZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gPSBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjsKCQl9CgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCSNlbmRpZgoJI2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMAoJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQkJc2hhZG93V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24gKyB2ZWM0KCBzaGFkb3dXb3JsZE5vcm1hbCAqIHBvaW50TGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhcywgMCApOwoJCQl2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247CgkJfQoJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkjZW5kaWYKI2VuZGlmCiNpZiBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwCgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9DT09SRFM7IGkgKysgKSB7CgkJc2hhZG93V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb247CgkJI2lmICggZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTICkKCQkJc2hhZG93V29ybGRQb3NpdGlvbi54eXogKz0gc2hhZG93V29ybGROb3JtYWwgKiBzcG90TGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhczsKCQkjZW5kaWYKCQl2U3BvdExpZ2h0Q29vcmRbIGkgXSA9IHNwb3RMaWdodE1hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjsKCX0KCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCiNlbmRpZmAsX3Y9YGZsb2F0IGdldFNoYWRvd01hc2soKSB7CglmbG9hdCBzaGFkb3cgPSAxLjA7CgkjaWZkZWYgVVNFX1NIQURPV01BUAoJI2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAKCURpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodDsKCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQlkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAKCVNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHQ7CgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCXNwb3RMaWdodCA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90TGlnaHRDb29yZFsgaSBdICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCglQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHQ7CgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQlwb2ludExpZ2h0ID0gcG9pbnRMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93QmlhcywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDsKCX0KCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkjZW5kaWYKCSNlbmRpZgoJcmV0dXJuIHNoYWRvdzsKfWAseHY9YCNpZmRlZiBVU0VfU0tJTk5JTkcKCW1hdDQgYm9uZU1hdFggPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApOwoJbWF0NCBib25lTWF0WSA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC55ICk7CgltYXQ0IGJvbmVNYXRaID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnogKTsKCW1hdDQgYm9uZU1hdFcgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgudyApOwojZW5kaWZgLHl2PWAjaWZkZWYgVVNFX1NLSU5OSU5HCgl1bmlmb3JtIG1hdDQgYmluZE1hdHJpeDsKCXVuaWZvcm0gbWF0NCBiaW5kTWF0cml4SW52ZXJzZTsKCXVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIGJvbmVUZXh0dXJlOwoJbWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJvbmVUZXh0dXJlLCAwICkueDsKCQlpbnQgaiA9IGludCggaSApICogNDsKCQlpbnQgeCA9IGogJSBzaXplOwoJCWludCB5ID0gaiAvIHNpemU7CgkJdmVjNCB2MSA9IHRleGVsRmV0Y2goIGJvbmVUZXh0dXJlLCBpdmVjMiggeCwgeSApLCAwICk7CgkJdmVjNCB2MiA9IHRleGVsRmV0Y2goIGJvbmVUZXh0dXJlLCBpdmVjMiggeCArIDEsIHkgKSwgMCApOwoJCXZlYzQgdjMgPSB0ZXhlbEZldGNoKCBib25lVGV4dHVyZSwgaXZlYzIoIHggKyAyLCB5ICksIDAgKTsKCQl2ZWM0IHY0ID0gdGV4ZWxGZXRjaCggYm9uZVRleHR1cmUsIGl2ZWMyKCB4ICsgMywgeSApLCAwICk7CgkJcmV0dXJuIG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7Cgl9CiNlbmRpZmAsdnY9YCNpZmRlZiBVU0VfU0tJTk5JTkcKCXZlYzQgc2tpblZlcnRleCA9IGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7Cgl2ZWM0IHNraW5uZWQgPSB2ZWM0KCAwLjAgKTsKCXNraW5uZWQgKz0gYm9uZU1hdFggKiBza2luVmVydGV4ICogc2tpbldlaWdodC54OwoJc2tpbm5lZCArPSBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7Cglza2lubmVkICs9IGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejsKCXNraW5uZWQgKz0gYm9uZU1hdFcgKiBza2luVmVydGV4ICogc2tpbldlaWdodC53OwoJdHJhbnNmb3JtZWQgPSAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCApLnh5ejsKI2VuZGlmYCxNdj1gI2lmZGVmIFVTRV9TS0lOTklORwoJbWF0NCBza2luTWF0cml4ID0gbWF0NCggMC4wICk7Cglza2luTWF0cml4ICs9IHNraW5XZWlnaHQueCAqIGJvbmVNYXRYOwoJc2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnkgKiBib25lTWF0WTsKCXNraW5NYXRyaXggKz0gc2tpbldlaWdodC56ICogYm9uZU1hdFo7Cglza2luTWF0cml4ICs9IHNraW5XZWlnaHQudyAqIGJvbmVNYXRXOwoJc2tpbk1hdHJpeCA9IGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7CglvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejsKCSNpZmRlZiBVU0VfVEFOR0VOVAoJCW9iamVjdFRhbmdlbnQgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7CgkjZW5kaWYKI2VuZGlmYCxTdj1gZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDsKI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdmVjNCB0ZXhlbFNwZWN1bGFyID0gdGV4dHVyZTJEKCBzcGVjdWxhck1hcCwgdlNwZWN1bGFyTWFwVXYgKTsKCXNwZWN1bGFyU3RyZW5ndGggPSB0ZXhlbFNwZWN1bGFyLnI7CiNlbHNlCglzcGVjdWxhclN0cmVuZ3RoID0gMS4wOwojZW5kaWZgLGJ2PWAjaWZkZWYgVVNFX1NQRUNVTEFSTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDsKI2VuZGlmYCx3dj1gI2lmIGRlZmluZWQoIFRPTkVfTUFQUElORyApCglnbF9GcmFnQ29sb3IucmdiID0gdG9uZU1hcHBpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTsKI2VuZGlmYCxFdj1gI2lmbmRlZiBzYXR1cmF0ZQojZGVmaW5lIHNhdHVyYXRlKCBhICkgY2xhbXAoIGEsIDAuMCwgMS4wICkKI2VuZGlmCnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdFeHBvc3VyZTsKdmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHsKCXJldHVybiBzYXR1cmF0ZSggdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yICk7Cn0KdmVjMyBSZWluaGFyZFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgewoJY29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTsKCXJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApOwp9CnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7Cgljb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlOwoJY29sb3IgPSBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7CglyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApOwp9CnZlYzMgUlJUQW5kT0RURml0KCB2ZWMzIHYgKSB7Cgl2ZWMzIGEgPSB2ICogKCB2ICsgMC4wMjQ1Nzg2ICkgLSAwLjAwMDA5MDUzNzsKCXZlYzMgYiA9IHYgKiAoIDAuOTgzNzI5ICogdiArIDAuNDMyOTUxMCApICsgMC4yMzgwODE7CglyZXR1cm4gYSAvIGI7Cn0KdmVjMyBBQ0VTRmlsbWljVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7Cgljb25zdCBtYXQzIEFDRVNJbnB1dE1hdCA9IG1hdDMoCgkJdmVjMyggMC41OTcxOSwgMC4wNzYwMCwgMC4wMjg0MCApLAkJdmVjMyggMC4zNTQ1OCwgMC45MDgzNCwgMC4xMzM4MyApLAoJCXZlYzMoIDAuMDQ4MjMsIDAuMDE1NjYsIDAuODM3NzcgKQoJKTsKCWNvbnN0IG1hdDMgQUNFU091dHB1dE1hdCA9IG1hdDMoCgkJdmVjMyggIDEuNjA0NzUsIC0wLjEwMjA4LCAtMC4wMDMyNyApLAkJdmVjMyggLTAuNTMxMDgsICAxLjEwODEzLCAtMC4wNzI3NiApLAoJCXZlYzMoIC0wLjA3MzY3LCAtMC4wMDYwNSwgIDEuMDc2MDIgKQoJKTsKCWNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmUgLyAwLjY7Cgljb2xvciA9IEFDRVNJbnB1dE1hdCAqIGNvbG9yOwoJY29sb3IgPSBSUlRBbmRPRFRGaXQoIGNvbG9yICk7Cgljb2xvciA9IEFDRVNPdXRwdXRNYXQgKiBjb2xvcjsKCXJldHVybiBzYXR1cmF0ZSggY29sb3IgKTsKfQp2ZWMzIEN1c3RvbVRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gY29sb3I7IH1gLEF2PWAjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJbWF0ZXJpYWwudHJhbnNtaXNzaW9uID0gdHJhbnNtaXNzaW9uOwoJbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEgPSAxLjA7CgltYXRlcmlhbC50aGlja25lc3MgPSB0aGlja25lc3M7CgltYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlID0gYXR0ZW51YXRpb25EaXN0YW5jZTsKCW1hdGVyaWFsLmF0dGVudWF0aW9uQ29sb3IgPSBhdHRlbnVhdGlvbkNvbG9yOwoJI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCQltYXRlcmlhbC50cmFuc21pc3Npb24gKj0gdGV4dHVyZTJEKCB0cmFuc21pc3Npb25NYXAsIHZUcmFuc21pc3Npb25NYXBVdiApLnI7CgkjZW5kaWYKCSNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgkJbWF0ZXJpYWwudGhpY2tuZXNzICo9IHRleHR1cmUyRCggdGhpY2tuZXNzTWFwLCB2VGhpY2tuZXNzTWFwVXYgKS5nOwoJI2VuZGlmCgl2ZWMzIHBvcyA9IHZXb3JsZFBvc2l0aW9uOwoJdmVjMyB2ID0gbm9ybWFsaXplKCBjYW1lcmFQb3NpdGlvbiAtIHBvcyApOwoJdmVjMyBuID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7Cgl2ZWM0IHRyYW5zbWl0dGVkID0gZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbigKCQluLCB2LCBtYXRlcmlhbC5yb3VnaG5lc3MsIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsCgkJcG9zLCBtb2RlbE1hdHJpeCwgdmlld01hdHJpeCwgcHJvamVjdGlvbk1hdHJpeCwgbWF0ZXJpYWwuaW9yLCBtYXRlcmlhbC50aGlja25lc3MsCgkJbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciwgbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZSApOwoJbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEgPSBtaXgoIG1hdGVyaWFsLnRyYW5zbWlzc2lvbkFscGhhLCB0cmFuc21pdHRlZC5hLCBtYXRlcmlhbC50cmFuc21pc3Npb24gKTsKCXRvdGFsRGlmZnVzZSA9IG1peCggdG90YWxEaWZmdXNlLCB0cmFuc21pdHRlZC5yZ2IsIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiApOwojZW5kaWZgLFR2PWAjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJdW5pZm9ybSBmbG9hdCB0cmFuc21pc3Npb247Cgl1bmlmb3JtIGZsb2F0IHRoaWNrbmVzczsKCXVuaWZvcm0gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZTsKCXVuaWZvcm0gdmVjMyBhdHRlbnVhdGlvbkNvbG9yOwoJI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25NYXA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgkJdW5pZm9ybSBzYW1wbGVyMkQgdGhpY2tuZXNzTWFwOwoJI2VuZGlmCgl1bmlmb3JtIHZlYzIgdHJhbnNtaXNzaW9uU2FtcGxlclNpemU7Cgl1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25TYW1wbGVyTWFwOwoJdW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OwoJdW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7Cgl2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CglmbG9hdCB3MCggZmxvYXQgYSApIHsKCQlyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqICggYSAqICggLSBhICsgMy4wICkgLSAzLjAgKSArIDEuMCApOwoJfQoJZmxvYXQgdzEoIGZsb2F0IGEgKSB7CgkJcmV0dXJuICggMS4wIC8gNi4wICkgKiAoIGEgKiAgYSAqICggMy4wICogYSAtIDYuMCApICsgNC4wICk7Cgl9CglmbG9hdCB3MiggZmxvYXQgYSApewoJCXJldHVybiAoIDEuMCAvIDYuMCApICogKCBhICogKCBhICogKCAtIDMuMCAqIGEgKyAzLjAgKSArIDMuMCApICsgMS4wICk7Cgl9CglmbG9hdCB3MyggZmxvYXQgYSApIHsKCQlyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqIGEgKiBhICk7Cgl9CglmbG9hdCBnMCggZmxvYXQgYSApIHsKCQlyZXR1cm4gdzAoIGEgKSArIHcxKCBhICk7Cgl9CglmbG9hdCBnMSggZmxvYXQgYSApIHsKCQlyZXR1cm4gdzIoIGEgKSArIHczKCBhICk7Cgl9CglmbG9hdCBoMCggZmxvYXQgYSApIHsKCQlyZXR1cm4gLSAxLjAgKyB3MSggYSApIC8gKCB3MCggYSApICsgdzEoIGEgKSApOwoJfQoJZmxvYXQgaDEoIGZsb2F0IGEgKSB7CgkJcmV0dXJuIDEuMCArIHczKCBhICkgLyAoIHcyKCBhICkgKyB3MyggYSApICk7Cgl9Cgl2ZWM0IGJpY3ViaWMoIHNhbXBsZXIyRCB0ZXgsIHZlYzIgdXYsIHZlYzQgdGV4ZWxTaXplLCBmbG9hdCBsb2QgKSB7CgkJdXYgPSB1diAqIHRleGVsU2l6ZS56dyArIDAuNTsKCQl2ZWMyIGl1diA9IGZsb29yKCB1diApOwoJCXZlYzIgZnV2ID0gZnJhY3QoIHV2ICk7CgkJZmxvYXQgZzB4ID0gZzAoIGZ1di54ICk7CgkJZmxvYXQgZzF4ID0gZzEoIGZ1di54ICk7CgkJZmxvYXQgaDB4ID0gaDAoIGZ1di54ICk7CgkJZmxvYXQgaDF4ID0gaDEoIGZ1di54ICk7CgkJZmxvYXQgaDB5ID0gaDAoIGZ1di55ICk7CgkJZmxvYXQgaDF5ID0gaDEoIGZ1di55ICk7CgkJdmVjMiBwMCA9ICggdmVjMiggaXV2LnggKyBoMHgsIGl1di55ICsgaDB5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTsKCQl2ZWMyIHAxID0gKCB2ZWMyKCBpdXYueCArIGgxeCwgaXV2LnkgKyBoMHkgKSAtIDAuNSApICogdGV4ZWxTaXplLnh5OwoJCXZlYzIgcDIgPSAoIHZlYzIoIGl1di54ICsgaDB4LCBpdXYueSArIGgxeSApIC0gMC41ICkgKiB0ZXhlbFNpemUueHk7CgkJdmVjMiBwMyA9ICggdmVjMiggaXV2LnggKyBoMXgsIGl1di55ICsgaDF5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTsKCQlyZXR1cm4gZzAoIGZ1di55ICkgKiAoIGcweCAqIHRleHR1cmVMb2QoIHRleCwgcDAsIGxvZCApICsgZzF4ICogdGV4dHVyZUxvZCggdGV4LCBwMSwgbG9kICkgKSArCgkJCWcxKCBmdXYueSApICogKCBnMHggKiB0ZXh0dXJlTG9kKCB0ZXgsIHAyLCBsb2QgKSArIGcxeCAqIHRleHR1cmVMb2QoIHRleCwgcDMsIGxvZCApICk7Cgl9Cgl2ZWM0IHRleHR1cmVCaWN1YmljKCBzYW1wbGVyMkQgc2FtcGxlciwgdmVjMiB1diwgZmxvYXQgbG9kICkgewoJCXZlYzIgZkxvZFNpemUgPSB2ZWMyKCB0ZXh0dXJlU2l6ZSggc2FtcGxlciwgaW50KCBsb2QgKSApICk7CgkJdmVjMiBjTG9kU2l6ZSA9IHZlYzIoIHRleHR1cmVTaXplKCBzYW1wbGVyLCBpbnQoIGxvZCArIDEuMCApICkgKTsKCQl2ZWMyIGZMb2RTaXplSW52ID0gMS4wIC8gZkxvZFNpemU7CgkJdmVjMiBjTG9kU2l6ZUludiA9IDEuMCAvIGNMb2RTaXplOwoJCXZlYzQgZlNhbXBsZSA9IGJpY3ViaWMoIHNhbXBsZXIsIHV2LCB2ZWM0KCBmTG9kU2l6ZUludiwgZkxvZFNpemUgKSwgZmxvb3IoIGxvZCApICk7CgkJdmVjNCBjU2FtcGxlID0gYmljdWJpYyggc2FtcGxlciwgdXYsIHZlYzQoIGNMb2RTaXplSW52LCBjTG9kU2l6ZSApLCBjZWlsKCBsb2QgKSApOwoJCXJldHVybiBtaXgoIGZTYW1wbGUsIGNTYW1wbGUsIGZyYWN0KCBsb2QgKSApOwoJfQoJdmVjMyBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIGNvbnN0IGluIHZlYzMgbiwgY29uc3QgaW4gdmVjMyB2LCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsIGNvbnN0IGluIGZsb2F0IGlvciwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCApIHsKCQl2ZWMzIHJlZnJhY3Rpb25WZWN0b3IgPSByZWZyYWN0KCAtIHYsIG5vcm1hbGl6ZSggbiApLCAxLjAgLyBpb3IgKTsKCQl2ZWMzIG1vZGVsU2NhbGU7CgkJbW9kZWxTY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLnh5eiApICk7CgkJbW9kZWxTY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLnh5eiApICk7CgkJbW9kZWxTY2FsZS56ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMiBdLnh5eiApICk7CgkJcmV0dXJuIG5vcm1hbGl6ZSggcmVmcmFjdGlvblZlY3RvciApICogdGhpY2tuZXNzICogbW9kZWxTY2FsZTsKCX0KCWZsb2F0IGFwcGx5SW9yVG9Sb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgaW9yICkgewoJCXJldHVybiByb3VnaG5lc3MgKiBjbGFtcCggaW9yICogMi4wIC0gMi4wLCAwLjAsIDEuMCApOwoJfQoJdmVjNCBnZXRUcmFuc21pc3Npb25TYW1wbGUoIGNvbnN0IGluIHZlYzIgZnJhZ0Nvb3JkLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGlvciApIHsKCQlmbG9hdCBsb2QgPSBsb2cyKCB0cmFuc21pc3Npb25TYW1wbGVyU2l6ZS54ICkgKiBhcHBseUlvclRvUm91Z2huZXNzKCByb3VnaG5lc3MsIGlvciApOwoJCXJldHVybiB0ZXh0dXJlQmljdWJpYyggdHJhbnNtaXNzaW9uU2FtcGxlck1hcCwgZnJhZ0Nvb3JkLnh5LCBsb2QgKTsKCX0KCXZlYzMgdm9sdW1lQXR0ZW51YXRpb24oIGNvbnN0IGluIGZsb2F0IHRyYW5zbWlzc2lvbkRpc3RhbmNlLCBjb25zdCBpbiB2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGNvbnN0IGluIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UgKSB7CgkJaWYgKCBpc2luZiggYXR0ZW51YXRpb25EaXN0YW5jZSApICkgewoJCQlyZXR1cm4gdmVjMyggMS4wICk7CgkJfSBlbHNlIHsKCQkJdmVjMyBhdHRlbnVhdGlvbkNvZWZmaWNpZW50ID0gLWxvZyggYXR0ZW51YXRpb25Db2xvciApIC8gYXR0ZW51YXRpb25EaXN0YW5jZTsKCQkJdmVjMyB0cmFuc21pdHRhbmNlID0gZXhwKCAtIGF0dGVudWF0aW9uQ29lZmZpY2llbnQgKiB0cmFuc21pc3Npb25EaXN0YW5jZSApOwkJCXJldHVybiB0cmFuc21pdHRhbmNlOwoJCX0KCX0KCXZlYzQgZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbiggY29uc3QgaW4gdmVjMyBuLCBjb25zdCBpbiB2ZWMzIHYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IsCgkJY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gdmVjMyBwb3NpdGlvbiwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCwKCQljb25zdCBpbiBtYXQ0IHZpZXdNYXRyaXgsIGNvbnN0IGluIG1hdDQgcHJvak1hdHJpeCwgY29uc3QgaW4gZmxvYXQgaW9yLCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsCgkJY29uc3QgaW4gdmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBjb25zdCBpbiBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlICkgewoJCXZlYzMgdHJhbnNtaXNzaW9uUmF5ID0gZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBuLCB2LCB0aGlja25lc3MsIGlvciwgbW9kZWxNYXRyaXggKTsKCQl2ZWMzIHJlZnJhY3RlZFJheUV4aXQgPSBwb3NpdGlvbiArIHRyYW5zbWlzc2lvblJheTsKCQl2ZWM0IG5kY1BvcyA9IHByb2pNYXRyaXggKiB2aWV3TWF0cml4ICogdmVjNCggcmVmcmFjdGVkUmF5RXhpdCwgMS4wICk7CgkJdmVjMiByZWZyYWN0aW9uQ29vcmRzID0gbmRjUG9zLnh5IC8gbmRjUG9zLnc7CgkJcmVmcmFjdGlvbkNvb3JkcyArPSAxLjA7CgkJcmVmcmFjdGlvbkNvb3JkcyAvPSAyLjA7CgkJdmVjNCB0cmFuc21pdHRlZExpZ2h0ID0gZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKCByZWZyYWN0aW9uQ29vcmRzLCByb3VnaG5lc3MsIGlvciApOwoJCXZlYzMgdHJhbnNtaXR0YW5jZSA9IGRpZmZ1c2VDb2xvciAqIHZvbHVtZUF0dGVudWF0aW9uKCBsZW5ndGgoIHRyYW5zbWlzc2lvblJheSApLCBhdHRlbnVhdGlvbkNvbG9yLCBhdHRlbnVhdGlvbkRpc3RhbmNlICk7CgkJdmVjMyBhdHRlbnVhdGVkQ29sb3IgPSB0cmFuc21pdHRhbmNlICogdHJhbnNtaXR0ZWRMaWdodC5yZ2I7CgkJdmVjMyBGID0gRW52aXJvbm1lbnRCUkRGKCBuLCB2LCBzcGVjdWxhckNvbG9yLCBzcGVjdWxhckY5MCwgcm91Z2huZXNzICk7CgkJZmxvYXQgdHJhbnNtaXR0YW5jZUZhY3RvciA9ICggdHJhbnNtaXR0YW5jZS5yICsgdHJhbnNtaXR0YW5jZS5nICsgdHJhbnNtaXR0YW5jZS5iICkgLyAzLjA7CgkJcmV0dXJuIHZlYzQoICggMS4wIC0gRiApICogYXR0ZW51YXRlZENvbG9yLCAxLjAgLSAoIDEuMCAtIHRyYW5zbWl0dGVkTGlnaHQuYSApICogdHJhbnNtaXR0YW5jZUZhY3RvciApOwoJfQojZW5kaWZgLEN2PWAjaWYgZGVmaW5lZCggVVNFX1VWICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKQoJdmFyeWluZyB2ZWMyIHZVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCgl2YXJ5aW5nIHZlYzIgdk1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9BTFBIQU1BUAoJdmFyeWluZyB2ZWMyIHZBbHBoYU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9MSUdIVE1BUAoJdmFyeWluZyB2ZWMyIHZMaWdodE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9BT01BUAoJdmFyeWluZyB2ZWMyIHZBb01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9CVU1QTUFQCgl2YXJ5aW5nIHZlYzIgdkJ1bXBNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTk9STUFMTUFQCgl2YXJ5aW5nIHZlYzIgdk5vcm1hbE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdmFyeWluZyB2ZWMyIHZFbWlzc2l2ZU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXZhcnlpbmcgdmVjMiB2TWV0YWxuZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdmFyeWluZyB2ZWMyIHZSb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUAoJdmFyeWluZyB2ZWMyIHZBbmlzb3Ryb3B5TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVE1BUAoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXROb3JtYWxNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUAoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRSb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVAKCXZhcnlpbmcgdmVjMiB2SXJpZGVzY2VuY2VNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQCgl2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQCgl2YXJ5aW5nIHZlYzIgdlNoZWVuQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgl2YXJ5aW5nIHZlYzIgdlNoZWVuUm91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSTUFQCgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0NPTE9STUFQCgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQCgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFySW50ZW5zaXR5TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJdW5pZm9ybSBtYXQzIHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VHJhbnNtaXNzaW9uTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBtYXQzIHRoaWNrbmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VGhpY2tuZXNzTWFwVXY7CiNlbmRpZmAsUnY9YCNpZiBkZWZpbmVkKCBVU0VfVVYgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApCgl2YXJ5aW5nIHZlYzIgdlV2OwojZW5kaWYKI2lmZGVmIFVTRV9NQVAKCXVuaWZvcm0gbWF0MyBtYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdk1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9BTFBIQU1BUAoJdW5pZm9ybSBtYXQzIGFscGhhTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZBbHBoYU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9MSUdIVE1BUAoJdW5pZm9ybSBtYXQzIGxpZ2h0TWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZMaWdodE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9BT01BUAoJdW5pZm9ybSBtYXQzIGFvTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZBb01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9CVU1QTUFQCgl1bmlmb3JtIG1hdDMgYnVtcE1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2QnVtcE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9OT1JNQUxNQVAKCXVuaWZvcm0gbWF0MyBub3JtYWxNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdk5vcm1hbE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCXVuaWZvcm0gbWF0MyBkaXNwbGFjZW1lbnRNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkRpc3BsYWNlbWVudE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdW5pZm9ybSBtYXQzIGVtaXNzaXZlTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZFbWlzc2l2ZU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXVuaWZvcm0gbWF0MyBtZXRhbG5lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdk1ldGFsbmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVAKCXVuaWZvcm0gbWF0MyByb3VnaG5lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlJvdWdobmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9BTklTT1RST1BZTUFQCgl1bmlmb3JtIG1hdDMgYW5pc290cm9weU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2QW5pc290cm9weU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVAKCXVuaWZvcm0gbWF0MyBjbGVhcmNvYXRNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgl1bmlmb3JtIG1hdDMgY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXROb3JtYWxNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUAoJdW5pZm9ybSBtYXQzIGNsZWFyY29hdFJvdWdobmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0Um91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQCgl1bmlmb3JtIG1hdDMgc2hlZW5Db2xvck1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2U2hlZW5Db2xvck1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVAKCXVuaWZvcm0gbWF0MyBzaGVlblJvdWdobmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2U2hlZW5Sb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVAKCXVuaWZvcm0gbWF0MyBpcmlkZXNjZW5jZU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2SXJpZGVzY2VuY2VNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQCgl1bmlmb3JtIG1hdDMgaXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSTUFQCgl1bmlmb3JtIG1hdDMgc3BlY3VsYXJNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0NPTE9STUFQCgl1bmlmb3JtIG1hdDMgc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2U3BlY3VsYXJDb2xvck1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAKCXVuaWZvcm0gbWF0MyBzcGVjdWxhckludGVuc2l0eU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2U3BlY3VsYXJJbnRlbnNpdHlNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQCgl1bmlmb3JtIG1hdDMgdHJhbnNtaXNzaW9uTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZUcmFuc21pc3Npb25NYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgl1bmlmb3JtIG1hdDMgdGhpY2tuZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZUaGlja25lc3NNYXBVdjsKI2VuZGlmYCxQdj1gI2lmIGRlZmluZWQoIFVTRV9VViApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZICkKCXZVdiA9IHZlYzMoIHV2LCAxICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX01BUAoJdk1hcFV2ID0gKCBtYXBUcmFuc2Zvcm0gKiB2ZWMzKCBNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9BTFBIQU1BUAoJdkFscGhhTWFwVXYgPSAoIGFscGhhTWFwVHJhbnNmb3JtICogdmVjMyggQUxQSEFNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9MSUdIVE1BUAoJdkxpZ2h0TWFwVXYgPSAoIGxpZ2h0TWFwVHJhbnNmb3JtICogdmVjMyggTElHSFRNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9BT01BUAoJdkFvTWFwVXYgPSAoIGFvTWFwVHJhbnNmb3JtICogdmVjMyggQU9NQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9CVU1QTUFQCgl2QnVtcE1hcFV2ID0gKCBidW1wTWFwVHJhbnNmb3JtICogdmVjMyggQlVNUE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX05PUk1BTE1BUAoJdk5vcm1hbE1hcFV2ID0gKCBub3JtYWxNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBOT1JNQUxNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCXZEaXNwbGFjZW1lbnRNYXBVdiA9ICggZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtICogdmVjMyggRElTUExBQ0VNRU5UTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXZFbWlzc2l2ZU1hcFV2ID0gKCBlbWlzc2l2ZU1hcFRyYW5zZm9ybSAqIHZlYzMoIEVNSVNTSVZFTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl2TWV0YWxuZXNzTWFwVXYgPSAoIG1ldGFsbmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIE1FVEFMTkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdlJvdWdobmVzc01hcFV2ID0gKCByb3VnaG5lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBST1VHSE5FU1NNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9BTklTT1RST1BZTUFQCgl2QW5pc290cm9weU1hcFV2ID0gKCBhbmlzb3Ryb3B5TWFwVHJhbnNmb3JtICogdmVjMyggQU5JU09UUk9QWU1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVE1BUAoJdkNsZWFyY29hdE1hcFV2ID0gKCBjbGVhcmNvYXRNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBDTEVBUkNPQVRNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgl2Q2xlYXJjb2F0Tm9ybWFsTWFwVXYgPSAoIGNsZWFyY29hdE5vcm1hbE1hcFRyYW5zZm9ybSAqIHZlYzMoIENMRUFSQ09BVF9OT1JNQUxNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQCgl2Q2xlYXJjb2F0Um91Z2huZXNzTWFwVXYgPSAoIGNsZWFyY29hdFJvdWdobmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIENMRUFSQ09BVF9ST1VHSE5FU1NNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUAoJdklyaWRlc2NlbmNlTWFwVXYgPSAoIGlyaWRlc2NlbmNlTWFwVHJhbnNmb3JtICogdmVjMyggSVJJREVTQ0VOQ0VNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAKCXZJcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2ID0gKCBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIElSSURFU0NFTkNFX1RISUNLTkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQCgl2U2hlZW5Db2xvck1hcFV2ID0gKCBzaGVlbkNvbG9yTWFwVHJhbnNmb3JtICogdmVjMyggU0hFRU5fQ09MT1JNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVAKCXZTaGVlblJvdWdobmVzc01hcFV2ID0gKCBzaGVlblJvdWdobmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIFNIRUVOX1JPVUdITkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSTUFQCgl2U3BlY3VsYXJNYXBVdiA9ICggc3BlY3VsYXJNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTUEVDVUxBUk1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0NPTE9STUFQCgl2U3BlY3VsYXJDb2xvck1hcFV2ID0gKCBzcGVjdWxhckNvbG9yTWFwVHJhbnNmb3JtICogdmVjMyggU1BFQ1VMQVJfQ09MT1JNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAKCXZTcGVjdWxhckludGVuc2l0eU1hcFV2ID0gKCBzcGVjdWxhckludGVuc2l0eU1hcFRyYW5zZm9ybSAqIHZlYzMoIFNQRUNVTEFSX0lOVEVOU0lUWU1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJdlRyYW5zbWlzc2lvbk1hcFV2ID0gKCB0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm0gKiB2ZWMzKCBUUkFOU01JU1NJT05NQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9USElDS05FU1NNQVAKCXZUaGlja25lc3NNYXBVdiA9ICggdGhpY2tuZXNzTWFwVHJhbnNmb3JtICogdmVjMyggVEhJQ0tORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmYCxMdj1gI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkKCBESVNUQU5DRSApIHx8IGRlZmluZWQgKCBVU0VfU0hBRE9XTUFQICkgfHwgZGVmaW5lZCAoIFVTRV9UUkFOU01JU1NJT04gKSB8fCBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwCgl2ZWM0IHdvcmxkUG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7CgkjaWZkZWYgVVNFX0JBVENISU5HCgkJd29ybGRQb3NpdGlvbiA9IGJhdGNoaW5nTWF0cml4ICogd29ybGRQb3NpdGlvbjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9JTlNUQU5DSU5HCgkJd29ybGRQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogd29ybGRQb3NpdGlvbjsKCSNlbmRpZgoJd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogd29ybGRQb3NpdGlvbjsKI2VuZGlmYDtjb25zdCAkZT17YWxwaGFoYXNoX2ZyYWdtZW50OlV4LGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50OkR4LGFscGhhbWFwX2ZyYWdtZW50Ok54LGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ6RngsYWxwaGF0ZXN0X2ZyYWdtZW50Ok94LGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50OkJ4LGFvbWFwX2ZyYWdtZW50Onp4LGFvbWFwX3BhcnNfZnJhZ21lbnQ6a3gsYmF0Y2hpbmdfcGFyc192ZXJ0ZXg6R3gsYmF0Y2hpbmdfdmVydGV4OlZ4LGJlZ2luX3ZlcnRleDpIeCxiZWdpbm5vcm1hbF92ZXJ0ZXg6V3gsYnNkZnM6WHgsaXJpZGVzY2VuY2VfZnJhZ21lbnQ6cXgsYnVtcG1hcF9wYXJzX2ZyYWdtZW50OiR4LGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudDpZeCxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudDpaeCxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg6SngsY2xpcHBpbmdfcGxhbmVzX3ZlcnRleDpLeCxjb2xvcl9mcmFnbWVudDpReCxjb2xvcl9wYXJzX2ZyYWdtZW50Omp4LGNvbG9yX3BhcnNfdmVydGV4OmV5LGNvbG9yX3ZlcnRleDp0eSxjb21tb246bnksY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50Oml5LGRlZmF1bHRub3JtYWxfdmVydGV4OnJ5LGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDpzeSxkaXNwbGFjZW1lbnRtYXBfdmVydGV4OmF5LGVtaXNzaXZlbWFwX2ZyYWdtZW50Om95LGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6bHksY29sb3JzcGFjZV9mcmFnbWVudDpjeSxjb2xvcnNwYWNlX3BhcnNfZnJhZ21lbnQ6aHksZW52bWFwX2ZyYWdtZW50OnV5LGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudDpmeSxlbnZtYXBfcGFyc19mcmFnbWVudDpkeSxlbnZtYXBfcGFyc192ZXJ0ZXg6cHksZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6QXksZW52bWFwX3ZlcnRleDpteSxmb2dfdmVydGV4Omd5LGZvZ19wYXJzX3ZlcnRleDpfeSxmb2dfZnJhZ21lbnQ6eHksZm9nX3BhcnNfZnJhZ21lbnQ6eXksZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDp2eSxsaWdodG1hcF9mcmFnbWVudDpNeSxsaWdodG1hcF9wYXJzX2ZyYWdtZW50OlN5LGxpZ2h0c19sYW1iZXJ0X2ZyYWdtZW50OmJ5LGxpZ2h0c19sYW1iZXJ0X3BhcnNfZnJhZ21lbnQ6d3ksbGlnaHRzX3BhcnNfYmVnaW46RXksbGlnaHRzX3Rvb25fZnJhZ21lbnQ6VHksbGlnaHRzX3Rvb25fcGFyc19mcmFnbWVudDpDeSxsaWdodHNfcGhvbmdfZnJhZ21lbnQ6UnksbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6UHksbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50Okx5LGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50Okl5LGxpZ2h0c19mcmFnbWVudF9iZWdpbjpVeSxsaWdodHNfZnJhZ21lbnRfbWFwczpEeSxsaWdodHNfZnJhZ21lbnRfZW5kOk55LGxvZ2RlcHRoYnVmX2ZyYWdtZW50OkZ5LGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ6T3ksbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6QnksbG9nZGVwdGhidWZfdmVydGV4Onp5LG1hcF9mcmFnbWVudDpreSxtYXBfcGFyc19mcmFnbWVudDpHeSxtYXBfcGFydGljbGVfZnJhZ21lbnQ6VnksbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ6SHksbWV0YWxuZXNzbWFwX2ZyYWdtZW50Old5LG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50Olh5LG1vcnBoY29sb3JfdmVydGV4OnF5LG1vcnBobm9ybWFsX3ZlcnRleDokeSxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleDpZeSxtb3JwaHRhcmdldF92ZXJ0ZXg6Wnksbm9ybWFsX2ZyYWdtZW50X2JlZ2luOkp5LG5vcm1hbF9mcmFnbWVudF9tYXBzOkt5LG5vcm1hbF9wYXJzX2ZyYWdtZW50OlF5LG5vcm1hbF9wYXJzX3ZlcnRleDpqeSxub3JtYWxfdmVydGV4OmV2LG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OnR2LGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW46bnYsY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzOml2LGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50OnJ2LGlyaWRlc2NlbmNlX3BhcnNfZnJhZ21lbnQ6c3Ysb3BhcXVlX2ZyYWdtZW50OmF2LHBhY2tpbmc6b3YscHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDpsdixwcm9qZWN0X3ZlcnRleDpjdixkaXRoZXJpbmdfZnJhZ21lbnQ6aHYsZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ6dXYscm91Z2huZXNzbWFwX2ZyYWdtZW50OmZ2LHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OmR2LHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OnB2LHNoYWRvd21hcF9wYXJzX3ZlcnRleDptdixzaGFkb3dtYXBfdmVydGV4Omd2LHNoYWRvd21hc2tfcGFyc19mcmFnbWVudDpfdixza2luYmFzZV92ZXJ0ZXg6eHYsc2tpbm5pbmdfcGFyc192ZXJ0ZXg6eXYsc2tpbm5pbmdfdmVydGV4OnZ2LHNraW5ub3JtYWxfdmVydGV4Ok12LHNwZWN1bGFybWFwX2ZyYWdtZW50OlN2LHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ6YnYsdG9uZW1hcHBpbmdfZnJhZ21lbnQ6d3YsdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDpFdix0cmFuc21pc3Npb25fZnJhZ21lbnQ6QXYsdHJhbnNtaXNzaW9uX3BhcnNfZnJhZ21lbnQ6VHYsdXZfcGFyc19mcmFnbWVudDpDdix1dl9wYXJzX3ZlcnRleDpSdix1dl92ZXJ0ZXg6UHYsd29ybGRwb3NfdmVydGV4Okx2LGJhY2tncm91bmRfdmVydDpgdmFyeWluZyB2ZWMyIHZVdjsKdW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtOwp2b2lkIG1haW4oKSB7Cgl2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5OwoJZ2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbi54eSwgMS4wLCAxLjAgKTsKfWAsYmFja2dyb3VuZF9mcmFnOmB1bmlmb3JtIHNhbXBsZXIyRCB0MkQ7CnVuaWZvcm0gZmxvYXQgYmFja2dyb3VuZEludGVuc2l0eTsKdmFyeWluZyB2ZWMyIHZVdjsKdm9pZCBtYWluKCkgewoJdmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCggdDJELCB2VXYgKTsKCSNpZmRlZiBERUNPREVfVklERU9fVEVYVFVSRQoJCXRleENvbG9yID0gdmVjNCggbWl4KCBwb3coIHRleENvbG9yLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQgKSApLCB0ZXhDb2xvci5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHRleENvbG9yLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB0ZXhDb2xvci53ICk7CgkjZW5kaWYKCXRleENvbG9yLnJnYiAqPSBiYWNrZ3JvdW5kSW50ZW5zaXR5OwoJZ2xfRnJhZ0NvbG9yID0gdGV4Q29sb3I7CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KfWAsYmFja2dyb3VuZEN1YmVfdmVydDpgdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTsKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CglnbF9Qb3NpdGlvbi56ID0gZ2xfUG9zaXRpb24udzsKfWAsYmFja2dyb3VuZEN1YmVfZnJhZzpgI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkUKCXVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwOwojZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWICkKCXVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDsKI2VuZGlmCnVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDsKdW5pZm9ybSBmbG9hdCBiYWNrZ3JvdW5kQmx1cnJpbmVzczsKdW5pZm9ybSBmbG9hdCBiYWNrZ3JvdW5kSW50ZW5zaXR5Owp2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwojaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRQoJCXZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogdldvcmxkRGlyZWN0aW9uLngsIHZXb3JsZERpcmVjdGlvbi55eiApICk7CgkjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWICkKCQl2ZWM0IHRleENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCB2V29ybGREaXJlY3Rpb24sIGJhY2tncm91bmRCbHVycmluZXNzICk7CgkjZWxzZQoJCXZlYzQgdGV4Q29sb3IgPSB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsKCSNlbmRpZgoJdGV4Q29sb3IucmdiICo9IGJhY2tncm91bmRJbnRlbnNpdHk7CglnbF9GcmFnQ29sb3IgPSB0ZXhDb2xvcjsKCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50Pgp9YCxjdWJlX3ZlcnQ6YHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CiNpbmNsdWRlIDxjb21tb24+CnZvaWQgbWFpbigpIHsKCXZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJZ2xfUG9zaXRpb24ueiA9IGdsX1Bvc2l0aW9uLnc7Cn1gLGN1YmVfZnJhZzpgdW5pZm9ybSBzYW1wbGVyQ3ViZSB0Q3ViZTsKdW5pZm9ybSBmbG9hdCB0RmxpcDsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5Owp2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwp2b2lkIG1haW4oKSB7Cgl2ZWM0IHRleENvbG9yID0gdGV4dHVyZUN1YmUoIHRDdWJlLCB2ZWMzKCB0RmxpcCAqIHZXb3JsZERpcmVjdGlvbi54LCB2V29ybGREaXJlY3Rpb24ueXogKSApOwoJZ2xfRnJhZ0NvbG9yID0gdGV4Q29sb3I7CglnbF9GcmFnQ29sb3IuYSAqPSBvcGFjaXR5OwoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+Cn1gLGRlcHRoX3ZlcnQ6YCNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2YXJ5aW5nIHZlYzIgdkhpZ2hQcmVjaXNpb25aVzsKdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCQkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2VuZGlmCgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZIaWdoUHJlY2lzaW9uWlcgPSBnbF9Qb3NpdGlvbi56dzsKfWAsZGVwdGhfZnJhZzpgI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMAoJdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojZW5kaWYKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4KdmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApOwoJI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMAoJCWRpZmZ1c2VDb2xvci5hID0gb3BhY2l0eTsKCSNlbmRpZgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJZmxvYXQgZnJhZ0Nvb3JkWiA9IDAuNSAqIHZIaWdoUHJlY2lzaW9uWldbMF0gLyB2SGlnaFByZWNpc2lvblpXWzFdICsgMC41OwoJI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMAoJCWdsX0ZyYWdDb2xvciA9IHZlYzQoIHZlYzMoIDEuMCAtIGZyYWdDb29yZFogKSwgb3BhY2l0eSApOwoJI2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAxCgkJZ2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBmcmFnQ29vcmRaICk7CgkjZW5kaWYKfWAsZGlzdGFuY2VSR0JBX3ZlcnQ6YCNkZWZpbmUgRElTVEFOQ0UKdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgkJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNlbmRpZgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6Owp9YCxkaXN0YW5jZVJHQkFfZnJhZzpgI2RlZmluZSBESVNUQU5DRQp1bmlmb3JtIHZlYzMgcmVmZXJlbmNlUG9zaXRpb247CnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlOwp1bmlmb3JtIGZsb2F0IGZhckRpc3RhbmNlOwp2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluICgpIHsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApOwoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJZmxvYXQgZGlzdCA9IGxlbmd0aCggdldvcmxkUG9zaXRpb24gLSByZWZlcmVuY2VQb3NpdGlvbiApOwoJZGlzdCA9ICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApOwoJZGlzdCA9IHNhdHVyYXRlKCBkaXN0ICk7CglnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGRpc3QgKTsKfWAsZXF1aXJlY3RfdmVydDpgdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTsKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+Cn1gLGVxdWlyZWN0X2ZyYWc6YHVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDsKdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdmVjMyBkaXJlY3Rpb24gPSBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApOwoJdmVjMiBzYW1wbGVVViA9IGVxdWlyZWN0VXYoIGRpcmVjdGlvbiApOwoJZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KfWAsbGluZWRhc2hlZF92ZXJ0OmB1bmlmb3JtIGZsb2F0IHNjYWxlOwphdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlOwp2YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJdkxpbmVEaXN0YW5jZSA9IHNjYWxlICogbGluZURpc3RhbmNlOwoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxsaW5lZGFzaGVkX2ZyYWc6YHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7CnVuaWZvcm0gZmxvYXQgdG90YWxTaXplOwp2YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CglpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgPiBkYXNoU2l6ZSApIHsKCQlkaXNjYXJkOwoJfQoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CglvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjsKCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KfWAsbWVzaGJhc2ljX3ZlcnQ6YCNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpZiBkZWZpbmVkICggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQgKCBVU0VfU0tJTk5JTkcgKQoJCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjZW5kaWYKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxtZXNoYmFzaWNfZnJhZzpgdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2lmbmRlZiBGTEFUX1NIQURFRAoJdmFyeWluZyB2ZWMzIHZOb3JtYWw7CiNlbmRpZgojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJI2lmZGVmIFVTRV9MSUdIVE1BUAoJCXZlYzQgbGlnaHRNYXBUZXhlbCA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZMaWdodE1hcFV2ICk7CgkJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGxpZ2h0TWFwVGV4ZWwucmdiICogbGlnaHRNYXBJbnRlbnNpdHkgKiBSRUNJUFJPQ0FMX1BJOwoJI2Vsc2UKCQlyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7CgkjZW5kaWYKCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBkaWZmdXNlQ29sb3IucmdiOwoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlOwoJI2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KCSNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+Cn1gLG1lc2hsYW1iZXJ0X3ZlcnQ6YCNkZWZpbmUgTEFNQkVSVAp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsbWVzaGxhbWJlcnRfZnJhZzpgI2RlZmluZSBMQU1CRVJUCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxic2Rmcz4KI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD4KCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7CgkjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD4KfWAsbWVzaG1hdGNhcF92ZXJ0OmAjZGVmaW5lIE1BVENBUAp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4PgoJdlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7Cn1gLG1lc2htYXRjYXBfZnJhZzpgI2RlZmluZSBNQVRDQVAKdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKdW5pZm9ybSBzYW1wbGVyMkQgbWF0Y2FwOwp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPgoJdmVjMyB2aWV3RGlyID0gbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7Cgl2ZWMzIHggPSBub3JtYWxpemUoIHZlYzMoIHZpZXdEaXIueiwgMC4wLCAtIHZpZXdEaXIueCApICk7Cgl2ZWMzIHkgPSBjcm9zcyggdmlld0RpciwgeCApOwoJdmVjMiB1diA9IHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41OwoJI2lmZGVmIFVTRV9NQVRDQVAKCQl2ZWM0IG1hdGNhcENvbG9yID0gdGV4dHVyZTJEKCBtYXRjYXAsIHV2ICk7CgkjZWxzZQoJCXZlYzQgbWF0Y2FwQ29sb3IgPSB2ZWM0KCB2ZWMzKCBtaXgoIDAuMiwgMC44LCB1di55ICkgKSwgMS4wICk7CgkjZW5kaWYKCXZlYzMgb3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2IgKiBtYXRjYXBDb2xvci5yZ2I7CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCxtZXNobm9ybWFsX3ZlcnQ6YCNkZWZpbmUgTk9STUFMCiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKQoJdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNlbmRpZgojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgojaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkKCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwojZW5kaWYKfWAsbWVzaG5vcm1hbF9mcmFnOmAjZGVmaW5lIE5PUk1BTAp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKQoJdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNlbmRpZgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCWdsX0ZyYWdDb2xvciA9IHZlYzQoIHBhY2tOb3JtYWxUb1JHQiggbm9ybWFsICksIG9wYWNpdHkgKTsKCSNpZmRlZiBPUEFRVUUKCQlnbF9GcmFnQ29sb3IuYSA9IDEuMDsKCSNlbmRpZgp9YCxtZXNocGhvbmdfdmVydDpgI2RlZmluZSBQSE9ORwp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsbWVzaHBob25nX2ZyYWc6YCNkZWZpbmUgUEhPTkcKdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTsKdW5pZm9ybSB2ZWMzIHNwZWN1bGFyOwp1bmlmb3JtIGZsb2F0IHNoaW5pbmVzczsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfcGhvbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+CgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KCSNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+Cn1gLG1lc2hwaHlzaWNhbF92ZXJ0OmAjZGVmaW5lIFNUQU5EQVJECnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwojZW5kaWYKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+CiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgl2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6OwojZW5kaWYKfWAsbWVzaHBoeXNpY2FsX2ZyYWc6YCNkZWZpbmUgU1RBTkRBUkQKI2lmZGVmIFBIWVNJQ0FMCgkjZGVmaW5lIElPUgoJI2RlZmluZSBVU0VfU1BFQ1VMQVIKI2VuZGlmCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzOwp1bmlmb3JtIGZsb2F0IG1ldGFsbmVzczsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaWZkZWYgSU9SCgl1bmlmb3JtIGZsb2F0IGlvcjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVIKCXVuaWZvcm0gZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHk7Cgl1bmlmb3JtIHZlYzMgc3BlY3VsYXJDb2xvcjsKCSNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhckNvbG9yTWFwOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFySW50ZW5zaXR5TWFwOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJdW5pZm9ybSBmbG9hdCBjbGVhcmNvYXQ7Cgl1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzczsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCXVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2U7Cgl1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlSU9SOwoJdW5pZm9ybSBmbG9hdCBpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW07Cgl1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU4KCXVuaWZvcm0gdmVjMyBzaGVlbkNvbG9yOwoJdW5pZm9ybSBmbG9hdCBzaGVlblJvdWdobmVzczsKCSNpZmRlZiBVU0VfU0hFRU5fQ09MT1JNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBzaGVlbkNvbG9yTWFwOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNoZWVuUm91Z2huZXNzTWFwOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFkKCXVuaWZvcm0gdmVjMiBhbmlzb3Ryb3B5VmVjdG9yOwoJI2lmZGVmIFVTRV9BTklTT1RST1BZTUFQCgkJdW5pZm9ybSBzYW1wbGVyMkQgYW5pc290cm9weU1hcDsKCSNlbmRpZgojZW5kaWYKdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxpcmlkZXNjZW5jZV9mcmFnbWVudD4KI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGVhcmNvYXRfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGlyaWRlc2NlbmNlX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJdmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWV0YWxuZXNzbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+CgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+Cgl2ZWMzIHRvdGFsRGlmZnVzZSA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7Cgl2ZWMzIHRvdGFsU3BlY3VsYXIgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXI7CgkjaW5jbHVkZSA8dHJhbnNtaXNzaW9uX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gdG90YWxEaWZmdXNlICsgdG90YWxTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTsKCSNpZmRlZiBVU0VfU0hFRU4KCQlmbG9hdCBzaGVlbkVuZXJneUNvbXAgPSAxLjAgLSAwLjE1NyAqIG1heDMoIG1hdGVyaWFsLnNoZWVuQ29sb3IgKTsKCQlvdXRnb2luZ0xpZ2h0ID0gb3V0Z29pbmdMaWdodCAqIHNoZWVuRW5lcmd5Q29tcCArIHNoZWVuU3BlY3VsYXJEaXJlY3QgKyBzaGVlblNwZWN1bGFySW5kaXJlY3Q7CgkjZW5kaWYKCSNpZmRlZiBVU0VfQ0xFQVJDT0FUCgkJZmxvYXQgZG90TlZjYyA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIgKSApOwoJCXZlYzMgRmNjID0gRl9TY2hsaWNrKCBtYXRlcmlhbC5jbGVhcmNvYXRGMCwgbWF0ZXJpYWwuY2xlYXJjb2F0RjkwLCBkb3ROVmNjICk7CgkJb3V0Z29pbmdMaWdodCA9IG91dGdvaW5nTGlnaHQgKiAoIDEuMCAtIG1hdGVyaWFsLmNsZWFyY29hdCAqIEZjYyApICsgKCBjbGVhcmNvYXRTcGVjdWxhckRpcmVjdCArIGNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgKSAqIG1hdGVyaWFsLmNsZWFyY29hdDsKCSNlbmRpZgoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD4KfWAsbWVzaHRvb25fdmVydDpgI2RlZmluZSBUT09OCnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJI2luY2x1ZGUgPGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJdlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsbWVzaHRvb25fZnJhZzpgI2RlZmluZSBUT09OCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJdmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX3Rvb25fZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+CgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD4KfWAscG9pbnRzX3ZlcnQ6YHVuaWZvcm0gZmxvYXQgc2l6ZTsKdW5pZm9ybSBmbG9hdCBzY2FsZTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4KI2lmZGVmIFVTRV9QT0lOVFNfVVYKCXZhcnlpbmcgdmVjMiB2VXY7Cgl1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07CiNlbmRpZgp2b2lkIG1haW4oKSB7CgkjaWZkZWYgVVNFX1BPSU5UU19VVgoJCXZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7CgkjZW5kaWYKCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCWdsX1BvaW50U2l6ZSA9IHNpemU7CgkjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTgoJCWJvb2wgaXNQZXJzcGVjdGl2ZSA9IGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKTsKCQlpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKj0gKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7CgkjZW5kaWYKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAscG9pbnRzX2ZyYWc6YHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJb3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+Cn1gLHNoYWRvd192ZXJ0OmAjaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+Cn1gLHNoYWRvd19mcmFnOmB1bmlmb3JtIHZlYzMgY29sb3I7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCWdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApOwoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Pgp9YCxzcHJpdGVfdmVydDpgdW5pZm9ybSBmbG9hdCByb3RhdGlvbjsKdW5pZm9ybSB2ZWMyIGNlbnRlcjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+Cgl2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsKCXZlYzIgc2NhbGU7CglzY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLngsIG1vZGVsTWF0cml4WyAwIF0ueSwgbW9kZWxNYXRyaXhbIDAgXS56ICkgKTsKCXNjYWxlLnkgPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueCwgbW9kZWxNYXRyaXhbIDEgXS55LCBtb2RlbE1hdHJpeFsgMSBdLnogKSApOwoJI2lmbmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OCgkJYm9vbCBpc1BlcnNwZWN0aXZlID0gaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApOwoJCWlmICggaXNQZXJzcGVjdGl2ZSApIHNjYWxlICo9IC0gbXZQb3NpdGlvbi56OwoJI2VuZGlmCgl2ZWMyIGFsaWduZWRQb3NpdGlvbiA9ICggcG9zaXRpb24ueHkgLSAoIGNlbnRlciAtIHZlYzIoIDAuNSApICkgKSAqIHNjYWxlOwoJdmVjMiByb3RhdGVkUG9zaXRpb247Cglyb3RhdGVkUG9zaXRpb24ueCA9IGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54IC0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7Cglyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7CgltdlBvc2l0aW9uLnh5ICs9IHJvdGF0ZWRQb3NpdGlvbjsKCWdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsc3ByaXRlX2ZyYWc6YHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCW91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiOwoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KfWB9LF9lPXtjb21tb246e2RpZmZ1c2U6e3ZhbHVlOm5ldyB5ZSgxNjc3NzIxNSl9LG9wYWNpdHk6e3ZhbHVlOjF9LG1hcDp7dmFsdWU6bnVsbH0sbWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGFscGhhTWFwOnt2YWx1ZTpudWxsfSxhbHBoYU1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfSxhbHBoYVRlc3Q6e3ZhbHVlOjB9fSxzcGVjdWxhcm1hcDp7c3BlY3VsYXJNYXA6e3ZhbHVlOm51bGx9LHNwZWN1bGFyTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9fSxlbnZtYXA6e2Vudk1hcDp7dmFsdWU6bnVsbH0sZmxpcEVudk1hcDp7dmFsdWU6LTF9LHJlZmxlY3Rpdml0eTp7dmFsdWU6MX0saW9yOnt2YWx1ZToxLjV9LHJlZnJhY3Rpb25SYXRpbzp7dmFsdWU6Ljk4fX0sYW9tYXA6e2FvTWFwOnt2YWx1ZTpudWxsfSxhb01hcEludGVuc2l0eTp7dmFsdWU6MX0sYW9NYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBaZX19LGxpZ2h0bWFwOntsaWdodE1hcDp7dmFsdWU6bnVsbH0sbGlnaHRNYXBJbnRlbnNpdHk6e3ZhbHVlOjF9LGxpZ2h0TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9fSxidW1wbWFwOntidW1wTWFwOnt2YWx1ZTpudWxsfSxidW1wTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGJ1bXBTY2FsZTp7dmFsdWU6MX19LG5vcm1hbG1hcDp7bm9ybWFsTWFwOnt2YWx1ZTpudWxsfSxub3JtYWxNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBaZX0sbm9ybWFsU2NhbGU6e3ZhbHVlOm5ldyBxKDEsMSl9fSxkaXNwbGFjZW1lbnRtYXA6e2Rpc3BsYWNlbWVudE1hcDp7dmFsdWU6bnVsbH0sZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGRpc3BsYWNlbWVudFNjYWxlOnt2YWx1ZToxfSxkaXNwbGFjZW1lbnRCaWFzOnt2YWx1ZTowfX0sZW1pc3NpdmVtYXA6e2VtaXNzaXZlTWFwOnt2YWx1ZTpudWxsfSxlbWlzc2l2ZU1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfX0sbWV0YWxuZXNzbWFwOnttZXRhbG5lc3NNYXA6e3ZhbHVlOm51bGx9LG1ldGFsbmVzc01hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfX0scm91Z2huZXNzbWFwOntyb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9LHJvdWdobmVzc01hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfX0sZ3JhZGllbnRtYXA6e2dyYWRpZW50TWFwOnt2YWx1ZTpudWxsfX0sZm9nOntmb2dEZW5zaXR5Ont2YWx1ZToyNWUtNX0sZm9nTmVhcjp7dmFsdWU6MX0sZm9nRmFyOnt2YWx1ZToyZTN9LGZvZ0NvbG9yOnt2YWx1ZTpuZXcgeWUoMTY3NzcyMTUpfX0sbGlnaHRzOnthbWJpZW50TGlnaHRDb2xvcjp7dmFsdWU6W119LGxpZ2h0UHJvYmU6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LGNvbG9yOnt9fX0sZGlyZWN0aW9uYWxMaWdodFNoYWRvd3M6e3ZhbHVlOltdLHByb3BlcnRpZXM6e3NoYWRvd0JpYXM6e30sc2hhZG93Tm9ybWFsQmlhczp7fSxzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LGRpcmVjdGlvbmFsU2hhZG93TWFwOnt2YWx1ZTpbXX0sZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxzcG90TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSxkaXJlY3Rpb246e30sZGlzdGFuY2U6e30sY29uZUNvczp7fSxwZW51bWJyYUNvczp7fSxkZWNheTp7fX19LHNwb3RMaWdodFNoYWRvd3M6e3ZhbHVlOltdLHByb3BlcnRpZXM6e3NoYWRvd0JpYXM6e30sc2hhZG93Tm9ybWFsQmlhczp7fSxzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LHNwb3RMaWdodE1hcDp7dmFsdWU6W119LHNwb3RTaGFkb3dNYXA6e3ZhbHVlOltdfSxzcG90TGlnaHRNYXRyaXg6e3ZhbHVlOltdfSxwb2ludExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sZGVjYXk6e30sZGlzdGFuY2U6e319fSxwb2ludExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9LHNoYWRvd0NhbWVyYU5lYXI6e30sc2hhZG93Q2FtZXJhRmFyOnt9fX0scG9pbnRTaGFkb3dNYXA6e3ZhbHVlOltdfSxwb2ludFNoYWRvd01hdHJpeDp7dmFsdWU6W119LGhlbWlzcGhlcmVMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2RpcmVjdGlvbjp7fSxza3lDb2xvcjp7fSxncm91bmRDb2xvcjp7fX19LHJlY3RBcmVhTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSx3aWR0aDp7fSxoZWlnaHQ6e319fSxsdGNfMTp7dmFsdWU6bnVsbH0sbHRjXzI6e3ZhbHVlOm51bGx9fSxwb2ludHM6e2RpZmZ1c2U6e3ZhbHVlOm5ldyB5ZSgxNjc3NzIxNSl9LG9wYWNpdHk6e3ZhbHVlOjF9LHNpemU6e3ZhbHVlOjF9LHNjYWxlOnt2YWx1ZToxfSxtYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwOnt2YWx1ZTpudWxsfSxhbHBoYU1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfSxhbHBoYVRlc3Q6e3ZhbHVlOjB9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9fSxzcHJpdGU6e2RpZmZ1c2U6e3ZhbHVlOm5ldyB5ZSgxNjc3NzIxNSl9LG9wYWNpdHk6e3ZhbHVlOjF9LGNlbnRlcjp7dmFsdWU6bmV3IHEoLjUsLjUpfSxyb3RhdGlvbjp7dmFsdWU6MH0sbWFwOnt2YWx1ZTpudWxsfSxtYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBaZX0sYWxwaGFNYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGFscGhhVGVzdDp7dmFsdWU6MH19fSxObj17YmFzaWM6e3VuaWZvcm1zOlp0KFtfZS5jb21tb24sX2Uuc3BlY3VsYXJtYXAsX2UuZW52bWFwLF9lLmFvbWFwLF9lLmxpZ2h0bWFwLF9lLmZvZ10pLHZlcnRleFNoYWRlcjokZS5tZXNoYmFzaWNfdmVydCxmcmFnbWVudFNoYWRlcjokZS5tZXNoYmFzaWNfZnJhZ30sbGFtYmVydDp7dW5pZm9ybXM6WnQoW19lLmNvbW1vbixfZS5zcGVjdWxhcm1hcCxfZS5lbnZtYXAsX2UuYW9tYXAsX2UubGlnaHRtYXAsX2UuZW1pc3NpdmVtYXAsX2UuYnVtcG1hcCxfZS5ub3JtYWxtYXAsX2UuZGlzcGxhY2VtZW50bWFwLF9lLmZvZyxfZS5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgeWUoMCl9fV0pLHZlcnRleFNoYWRlcjokZS5tZXNobGFtYmVydF92ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLm1lc2hsYW1iZXJ0X2ZyYWd9LHBob25nOnt1bmlmb3JtczpadChbX2UuY29tbW9uLF9lLnNwZWN1bGFybWFwLF9lLmVudm1hcCxfZS5hb21hcCxfZS5saWdodG1hcCxfZS5lbWlzc2l2ZW1hcCxfZS5idW1wbWFwLF9lLm5vcm1hbG1hcCxfZS5kaXNwbGFjZW1lbnRtYXAsX2UuZm9nLF9lLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyB5ZSgwKX0sc3BlY3VsYXI6e3ZhbHVlOm5ldyB5ZSgxMTE4NDgxKX0sc2hpbmluZXNzOnt2YWx1ZTozMH19XSksdmVydGV4U2hhZGVyOiRlLm1lc2hwaG9uZ192ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLm1lc2hwaG9uZ19mcmFnfSxzdGFuZGFyZDp7dW5pZm9ybXM6WnQoW19lLmNvbW1vbixfZS5lbnZtYXAsX2UuYW9tYXAsX2UubGlnaHRtYXAsX2UuZW1pc3NpdmVtYXAsX2UuYnVtcG1hcCxfZS5ub3JtYWxtYXAsX2UuZGlzcGxhY2VtZW50bWFwLF9lLnJvdWdobmVzc21hcCxfZS5tZXRhbG5lc3NtYXAsX2UuZm9nLF9lLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyB5ZSgwKX0scm91Z2huZXNzOnt2YWx1ZToxfSxtZXRhbG5lc3M6e3ZhbHVlOjB9LGVudk1hcEludGVuc2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOiRlLm1lc2hwaHlzaWNhbF92ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLm1lc2hwaHlzaWNhbF9mcmFnfSx0b29uOnt1bmlmb3JtczpadChbX2UuY29tbW9uLF9lLmFvbWFwLF9lLmxpZ2h0bWFwLF9lLmVtaXNzaXZlbWFwLF9lLmJ1bXBtYXAsX2Uubm9ybWFsbWFwLF9lLmRpc3BsYWNlbWVudG1hcCxfZS5ncmFkaWVudG1hcCxfZS5mb2csX2UubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IHllKDApfX1dKSx2ZXJ0ZXhTaGFkZXI6JGUubWVzaHRvb25fdmVydCxmcmFnbWVudFNoYWRlcjokZS5tZXNodG9vbl9mcmFnfSxtYXRjYXA6e3VuaWZvcm1zOlp0KFtfZS5jb21tb24sX2UuYnVtcG1hcCxfZS5ub3JtYWxtYXAsX2UuZGlzcGxhY2VtZW50bWFwLF9lLmZvZyx7bWF0Y2FwOnt2YWx1ZTpudWxsfX1dKSx2ZXJ0ZXhTaGFkZXI6JGUubWVzaG1hdGNhcF92ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLm1lc2htYXRjYXBfZnJhZ30scG9pbnRzOnt1bmlmb3JtczpadChbX2UucG9pbnRzLF9lLmZvZ10pLHZlcnRleFNoYWRlcjokZS5wb2ludHNfdmVydCxmcmFnbWVudFNoYWRlcjokZS5wb2ludHNfZnJhZ30sZGFzaGVkOnt1bmlmb3JtczpadChbX2UuY29tbW9uLF9lLmZvZyx7c2NhbGU6e3ZhbHVlOjF9LGRhc2hTaXplOnt2YWx1ZToxfSx0b3RhbFNpemU6e3ZhbHVlOjJ9fV0pLHZlcnRleFNoYWRlcjokZS5saW5lZGFzaGVkX3ZlcnQsZnJhZ21lbnRTaGFkZXI6JGUubGluZWRhc2hlZF9mcmFnfSxkZXB0aDp7dW5pZm9ybXM6WnQoW19lLmNvbW1vbixfZS5kaXNwbGFjZW1lbnRtYXBdKSx2ZXJ0ZXhTaGFkZXI6JGUuZGVwdGhfdmVydCxmcmFnbWVudFNoYWRlcjokZS5kZXB0aF9mcmFnfSxub3JtYWw6e3VuaWZvcm1zOlp0KFtfZS5jb21tb24sX2UuYnVtcG1hcCxfZS5ub3JtYWxtYXAsX2UuZGlzcGxhY2VtZW50bWFwLHtvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6JGUubWVzaG5vcm1hbF92ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLm1lc2hub3JtYWxfZnJhZ30sc3ByaXRlOnt1bmlmb3JtczpadChbX2Uuc3ByaXRlLF9lLmZvZ10pLHZlcnRleFNoYWRlcjokZS5zcHJpdGVfdmVydCxmcmFnbWVudFNoYWRlcjokZS5zcHJpdGVfZnJhZ30sYmFja2dyb3VuZDp7dW5pZm9ybXM6e3V2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LHQyRDp7dmFsdWU6bnVsbH0sYmFja2dyb3VuZEludGVuc2l0eTp7dmFsdWU6MX19LHZlcnRleFNoYWRlcjokZS5iYWNrZ3JvdW5kX3ZlcnQsZnJhZ21lbnRTaGFkZXI6JGUuYmFja2dyb3VuZF9mcmFnfSxiYWNrZ3JvdW5kQ3ViZTp7dW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0sZmxpcEVudk1hcDp7dmFsdWU6LTF9LGJhY2tncm91bmRCbHVycmluZXNzOnt2YWx1ZTowfSxiYWNrZ3JvdW5kSW50ZW5zaXR5Ont2YWx1ZToxfX0sdmVydGV4U2hhZGVyOiRlLmJhY2tncm91bmRDdWJlX3ZlcnQsZnJhZ21lbnRTaGFkZXI6JGUuYmFja2dyb3VuZEN1YmVfZnJhZ30sY3ViZTp7dW5pZm9ybXM6e3RDdWJlOnt2YWx1ZTpudWxsfSx0RmxpcDp7dmFsdWU6LTF9LG9wYWNpdHk6e3ZhbHVlOjF9fSx2ZXJ0ZXhTaGFkZXI6JGUuY3ViZV92ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLmN1YmVfZnJhZ30sZXF1aXJlY3Q6e3VuaWZvcm1zOnt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6JGUuZXF1aXJlY3RfdmVydCxmcmFnbWVudFNoYWRlcjokZS5lcXVpcmVjdF9mcmFnfSxkaXN0YW5jZVJHQkE6e3VuaWZvcm1zOlp0KFtfZS5jb21tb24sX2UuZGlzcGxhY2VtZW50bWFwLHtyZWZlcmVuY2VQb3NpdGlvbjp7dmFsdWU6bmV3IFB9LG5lYXJEaXN0YW5jZTp7dmFsdWU6MX0sZmFyRGlzdGFuY2U6e3ZhbHVlOjFlM319XSksdmVydGV4U2hhZGVyOiRlLmRpc3RhbmNlUkdCQV92ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLmRpc3RhbmNlUkdCQV9mcmFnfSxzaGFkb3c6e3VuaWZvcm1zOlp0KFtfZS5saWdodHMsX2UuZm9nLHtjb2xvcjp7dmFsdWU6bmV3IHllKDApfSxvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6JGUuc2hhZG93X3ZlcnQsZnJhZ21lbnRTaGFkZXI6JGUuc2hhZG93X2ZyYWd9fTtObi5waHlzaWNhbD17dW5pZm9ybXM6WnQoW05uLnN0YW5kYXJkLnVuaWZvcm1zLHtjbGVhcmNvYXQ6e3ZhbHVlOjB9LGNsZWFyY29hdE1hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGNsZWFyY29hdE5vcm1hbE1hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGNsZWFyY29hdE5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgcSgxLDEpfSxjbGVhcmNvYXRSb3VnaG5lc3M6e3ZhbHVlOjB9LGNsZWFyY29hdFJvdWdobmVzc01hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGlyaWRlc2NlbmNlOnt2YWx1ZTowfSxpcmlkZXNjZW5jZU1hcDp7dmFsdWU6bnVsbH0saXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBaZX0saXJpZGVzY2VuY2VJT1I6e3ZhbHVlOjEuM30saXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtOnt2YWx1ZToxMDB9LGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTp7dmFsdWU6NDAwfSxpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDp7dmFsdWU6bnVsbH0saXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBaZX0sc2hlZW46e3ZhbHVlOjB9LHNoZWVuQ29sb3I6e3ZhbHVlOm5ldyB5ZSgwKX0sc2hlZW5Db2xvck1hcDp7dmFsdWU6bnVsbH0sc2hlZW5Db2xvck1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfSxzaGVlblJvdWdobmVzczp7dmFsdWU6MX0sc2hlZW5Sb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9LHNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LHRyYW5zbWlzc2lvbjp7dmFsdWU6MH0sdHJhbnNtaXNzaW9uTWFwOnt2YWx1ZTpudWxsfSx0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBaZX0sdHJhbnNtaXNzaW9uU2FtcGxlclNpemU6e3ZhbHVlOm5ldyBxfSx0cmFuc21pc3Npb25TYW1wbGVyTWFwOnt2YWx1ZTpudWxsfSx0aGlja25lc3M6e3ZhbHVlOjB9LHRoaWNrbmVzc01hcDp7dmFsdWU6bnVsbH0sdGhpY2tuZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGF0dGVudWF0aW9uRGlzdGFuY2U6e3ZhbHVlOjB9LGF0dGVudWF0aW9uQ29sb3I6e3ZhbHVlOm5ldyB5ZSgwKX0sc3BlY3VsYXJDb2xvcjp7dmFsdWU6bmV3IHllKDEsMSwxKX0sc3BlY3VsYXJDb2xvck1hcDp7dmFsdWU6bnVsbH0sc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfSxzcGVjdWxhckludGVuc2l0eTp7dmFsdWU6MX0sc3BlY3VsYXJJbnRlbnNpdHlNYXA6e3ZhbHVlOm51bGx9LHNwZWN1bGFySW50ZW5zaXR5TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGFuaXNvdHJvcHlWZWN0b3I6e3ZhbHVlOm5ldyBxfSxhbmlzb3Ryb3B5TWFwOnt2YWx1ZTpudWxsfSxhbmlzb3Ryb3B5TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9fV0pLHZlcnRleFNoYWRlcjokZS5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjokZS5tZXNocGh5c2ljYWxfZnJhZ307Y29uc3QgeW89e3I6MCxiOjAsZzowfTtmdW5jdGlvbiBJdihyLGUsdCxuLGkscyxhKXtjb25zdCBvPW5ldyB5ZSgwKTtsZXQgbD1zPT09ITA/MDoxLGMsaCx1PW51bGwsZj0wLGQ9bnVsbDtmdW5jdGlvbiBwKGcsbSl7bGV0IHk9ITEseD1tLmlzU2NlbmU9PT0hMD9tLmJhY2tncm91bmQ6bnVsbDt4JiZ4LmlzVGV4dHVyZSYmKHg9KG0uYmFja2dyb3VuZEJsdXJyaW5lc3M+MD90OmUpLmdldCh4KSkseD09PW51bGw/XyhvLGwpOngmJnguaXNDb2xvciYmKF8oeCwxKSx5PSEwKTtjb25zdCB2PXIueHIuZ2V0RW52aXJvbm1lbnRCbGVuZE1vZGUoKTt2PT09ImFkZGl0aXZlIj9uLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoMCwwLDAsMSxhKTp2PT09ImFscGhhLWJsZW5kIiYmbi5idWZmZXJzLmNvbG9yLnNldENsZWFyKDAsMCwwLDAsYSksKHIuYXV0b0NsZWFyfHx5KSYmci5jbGVhcihyLmF1dG9DbGVhckNvbG9yLHIuYXV0b0NsZWFyRGVwdGgsci5hdXRvQ2xlYXJTdGVuY2lsKSx4JiYoeC5pc0N1YmVUZXh0dXJlfHx4Lm1hcHBpbmc9PT1icik/KGg9PT12b2lkIDAmJihoPW5ldyBMdChuZXcgWWkoMSwxLDEpLG5ldyBIbih7bmFtZToiQmFja2dyb3VuZEN1YmVNYXRlcmlhbCIsdW5pZm9ybXM6VnIoTm4uYmFja2dyb3VuZEN1YmUudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpObi5iYWNrZ3JvdW5kQ3ViZS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6Tm4uYmFja2dyb3VuZEN1YmUuZnJhZ21lbnRTaGFkZXIsc2lkZTpZdCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSxmb2c6ITF9KSksaC5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoIm5vcm1hbCIpLGguZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCJ1diIpLGgub25CZWZvcmVSZW5kZXI9ZnVuY3Rpb24oUyxiLEEpe3RoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKEEubWF0cml4V29ybGQpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaC5tYXRlcmlhbCwiZW52TWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMuZW52TWFwLnZhbHVlfX0pLGkudXBkYXRlKGgpKSxoLm1hdGVyaWFsLnVuaWZvcm1zLmVudk1hcC52YWx1ZT14LGgubWF0ZXJpYWwudW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZT14LmlzQ3ViZVRleHR1cmUmJnguaXNSZW5kZXJUYXJnZXRUZXh0dXJlPT09ITE/LTE6MSxoLm1hdGVyaWFsLnVuaWZvcm1zLmJhY2tncm91bmRCbHVycmluZXNzLnZhbHVlPW0uYmFja2dyb3VuZEJsdXJyaW5lc3MsaC5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kSW50ZW5zaXR5LnZhbHVlPW0uYmFja2dyb3VuZEludGVuc2l0eSxoLm1hdGVyaWFsLnRvbmVNYXBwZWQ9b3QuZ2V0VHJhbnNmZXIoeC5jb2xvclNwYWNlKSE9PWN0LCh1IT09eHx8ZiE9PXgudmVyc2lvbnx8ZCE9PXIudG9uZU1hcHBpbmcpJiYoaC5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCx1PXgsZj14LnZlcnNpb24sZD1yLnRvbmVNYXBwaW5nKSxoLmxheWVycy5lbmFibGVBbGwoKSxnLnVuc2hpZnQoaCxoLmdlb21ldHJ5LGgubWF0ZXJpYWwsMCwwLG51bGwpKTp4JiZ4LmlzVGV4dHVyZSYmKGM9PT12b2lkIDAmJihjPW5ldyBMdChuZXcgJHMoMiwyKSxuZXcgSG4oe25hbWU6IkJhY2tncm91bmRNYXRlcmlhbCIsdW5pZm9ybXM6VnIoTm4uYmFja2dyb3VuZC51bmlmb3JtcyksdmVydGV4U2hhZGVyOk5uLmJhY2tncm91bmQudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOk5uLmJhY2tncm91bmQuZnJhZ21lbnRTaGFkZXIsc2lkZTpZbixkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSxmb2c6ITF9KSksYy5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoIm5vcm1hbCIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLm1hdGVyaWFsLCJtYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy50MkQudmFsdWV9fSksaS51cGRhdGUoYykpLGMubWF0ZXJpYWwudW5pZm9ybXMudDJELnZhbHVlPXgsYy5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kSW50ZW5zaXR5LnZhbHVlPW0uYmFja2dyb3VuZEludGVuc2l0eSxjLm1hdGVyaWFsLnRvbmVNYXBwZWQ9b3QuZ2V0VHJhbnNmZXIoeC5jb2xvclNwYWNlKSE9PWN0LHgubWF0cml4QXV0b1VwZGF0ZT09PSEwJiZ4LnVwZGF0ZU1hdHJpeCgpLGMubWF0ZXJpYWwudW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weSh4Lm1hdHJpeCksKHUhPT14fHxmIT09eC52ZXJzaW9ufHxkIT09ci50b25lTWFwcGluZykmJihjLm1hdGVyaWFsLm5lZWRzVXBkYXRlPSEwLHU9eCxmPXgudmVyc2lvbixkPXIudG9uZU1hcHBpbmcpLGMubGF5ZXJzLmVuYWJsZUFsbCgpLGcudW5zaGlmdChjLGMuZ2VvbWV0cnksYy5tYXRlcmlhbCwwLDAsbnVsbCkpfWZ1bmN0aW9uIF8oZyxtKXtnLmdldFJHQih5byxXZChyKSksbi5idWZmZXJzLmNvbG9yLnNldENsZWFyKHlvLnIseW8uZyx5by5iLG0sYSl9cmV0dXJue2dldENsZWFyQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4gb30sc2V0Q2xlYXJDb2xvcjpmdW5jdGlvbihnLG09MSl7by5zZXQoZyksbD1tLF8obyxsKX0sZ2V0Q2xlYXJBbHBoYTpmdW5jdGlvbigpe3JldHVybiBsfSxzZXRDbGVhckFscGhhOmZ1bmN0aW9uKGcpe2w9ZyxfKG8sbCl9LHJlbmRlcjpwfX1mdW5jdGlvbiBVdihyLGUsdCxuKXtjb25zdCBpPXIuZ2V0UGFyYW1ldGVyKHIuTUFYX1ZFUlRFWF9BVFRSSUJTKSxzPW4uaXNXZWJHTDI/bnVsbDplLmdldCgiT0VTX3ZlcnRleF9hcnJheV9vYmplY3QiKSxhPW4uaXNXZWJHTDJ8fHMhPT1udWxsLG89e30sbD1nKG51bGwpO2xldCBjPWwsaD0hMTtmdW5jdGlvbiB1KEksVSx6LEYsWil7bGV0IFY9ITE7aWYoYSl7Y29uc3QgUT1fKEYseixVKTtjIT09USYmKGM9USxkKGMub2JqZWN0KSksVj1tKEksRix6LFopLFYmJnkoSSxGLHosWil9ZWxzZXtjb25zdCBRPVUud2lyZWZyYW1lPT09ITA7KGMuZ2VvbWV0cnkhPT1GLmlkfHxjLnByb2dyYW0hPT16LmlkfHxjLndpcmVmcmFtZSE9PVEpJiYoYy5nZW9tZXRyeT1GLmlkLGMucHJvZ3JhbT16LmlkLGMud2lyZWZyYW1lPVEsVj0hMCl9WiE9PW51bGwmJnQudXBkYXRlKFosci5FTEVNRU5UX0FSUkFZX0JVRkZFUiksKFZ8fGgpJiYoaD0hMSxMKEksVSx6LEYpLFohPT1udWxsJiZyLmJpbmRCdWZmZXIoci5FTEVNRU5UX0FSUkFZX0JVRkZFUix0LmdldChaKS5idWZmZXIpKX1mdW5jdGlvbiBmKCl7cmV0dXJuIG4uaXNXZWJHTDI/ci5jcmVhdGVWZXJ0ZXhBcnJheSgpOnMuY3JlYXRlVmVydGV4QXJyYXlPRVMoKX1mdW5jdGlvbiBkKEkpe3JldHVybiBuLmlzV2ViR0wyP3IuYmluZFZlcnRleEFycmF5KEkpOnMuYmluZFZlcnRleEFycmF5T0VTKEkpfWZ1bmN0aW9uIHAoSSl7cmV0dXJuIG4uaXNXZWJHTDI/ci5kZWxldGVWZXJ0ZXhBcnJheShJKTpzLmRlbGV0ZVZlcnRleEFycmF5T0VTKEkpfWZ1bmN0aW9uIF8oSSxVLHope2NvbnN0IEY9ei53aXJlZnJhbWU9PT0hMDtsZXQgWj1vW0kuaWRdO1o9PT12b2lkIDAmJihaPXt9LG9bSS5pZF09Wik7bGV0IFY9WltVLmlkXTtWPT09dm9pZCAwJiYoVj17fSxaW1UuaWRdPVYpO2xldCBRPVZbRl07cmV0dXJuIFE9PT12b2lkIDAmJihRPWcoZigpKSxWW0ZdPVEpLFF9ZnVuY3Rpb24gZyhJKXtjb25zdCBVPVtdLHo9W10sRj1bXTtmb3IobGV0IFo9MDtaPGk7WisrKVVbWl09MCx6W1pdPTAsRltaXT0wO3JldHVybntnZW9tZXRyeTpudWxsLHByb2dyYW06bnVsbCx3aXJlZnJhbWU6ITEsbmV3QXR0cmlidXRlczpVLGVuYWJsZWRBdHRyaWJ1dGVzOnosYXR0cmlidXRlRGl2aXNvcnM6RixvYmplY3Q6SSxhdHRyaWJ1dGVzOnt9LGluZGV4Om51bGx9fWZ1bmN0aW9uIG0oSSxVLHosRil7Y29uc3QgWj1jLmF0dHJpYnV0ZXMsVj1VLmF0dHJpYnV0ZXM7bGV0IFE9MDtjb25zdCBuZT16LmdldEF0dHJpYnV0ZXMoKTtmb3IoY29uc3QgZmUgaW4gbmUpaWYobmVbZmVdLmxvY2F0aW9uPj0wKXtjb25zdCBlZT1aW2ZlXTtsZXQgZGU9VltmZV07aWYoZGU9PT12b2lkIDAmJihmZT09PSJpbnN0YW5jZU1hdHJpeCImJkkuaW5zdGFuY2VNYXRyaXgmJihkZT1JLmluc3RhbmNlTWF0cml4KSxmZT09PSJpbnN0YW5jZUNvbG9yIiYmSS5pbnN0YW5jZUNvbG9yJiYoZGU9SS5pbnN0YW5jZUNvbG9yKSksZWU9PT12b2lkIDB8fGVlLmF0dHJpYnV0ZSE9PWRlfHxkZSYmZWUuZGF0YSE9PWRlLmRhdGEpcmV0dXJuITA7USsrfXJldHVybiBjLmF0dHJpYnV0ZXNOdW0hPT1RfHxjLmluZGV4IT09Rn1mdW5jdGlvbiB5KEksVSx6LEYpe2NvbnN0IFo9e30sVj1VLmF0dHJpYnV0ZXM7bGV0IFE9MDtjb25zdCBuZT16LmdldEF0dHJpYnV0ZXMoKTtmb3IoY29uc3QgZmUgaW4gbmUpaWYobmVbZmVdLmxvY2F0aW9uPj0wKXtsZXQgZWU9VltmZV07ZWU9PT12b2lkIDAmJihmZT09PSJpbnN0YW5jZU1hdHJpeCImJkkuaW5zdGFuY2VNYXRyaXgmJihlZT1JLmluc3RhbmNlTWF0cml4KSxmZT09PSJpbnN0YW5jZUNvbG9yIiYmSS5pbnN0YW5jZUNvbG9yJiYoZWU9SS5pbnN0YW5jZUNvbG9yKSk7Y29uc3QgZGU9e307ZGUuYXR0cmlidXRlPWVlLGVlJiZlZS5kYXRhJiYoZGUuZGF0YT1lZS5kYXRhKSxaW2ZlXT1kZSxRKyt9Yy5hdHRyaWJ1dGVzPVosYy5hdHRyaWJ1dGVzTnVtPVEsYy5pbmRleD1GfWZ1bmN0aW9uIHgoKXtjb25zdCBJPWMubmV3QXR0cmlidXRlcztmb3IobGV0IFU9MCx6PUkubGVuZ3RoO1U8ejtVKyspSVtVXT0wfWZ1bmN0aW9uIHYoSSl7UyhJLDApfWZ1bmN0aW9uIFMoSSxVKXtjb25zdCB6PWMubmV3QXR0cmlidXRlcyxGPWMuZW5hYmxlZEF0dHJpYnV0ZXMsWj1jLmF0dHJpYnV0ZURpdmlzb3JzO3pbSV09MSxGW0ldPT09MCYmKHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoSSksRltJXT0xKSxaW0ldIT09VSYmKChuLmlzV2ViR0wyP3I6ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSlbbi5pc1dlYkdMMj8idmVydGV4QXR0cmliRGl2aXNvciI6InZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRSJdKEksVSksWltJXT1VKX1mdW5jdGlvbiBiKCl7Y29uc3QgST1jLm5ld0F0dHJpYnV0ZXMsVT1jLmVuYWJsZWRBdHRyaWJ1dGVzO2ZvcihsZXQgej0wLEY9VS5sZW5ndGg7ejxGO3orKylVW3pdIT09SVt6XSYmKHIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHopLFVbel09MCl9ZnVuY3Rpb24gQShJLFUseixGLFosVixRKXtRPT09ITA/ci52ZXJ0ZXhBdHRyaWJJUG9pbnRlcihJLFUseixaLFYpOnIudmVydGV4QXR0cmliUG9pbnRlcihJLFUseixGLFosVil9ZnVuY3Rpb24gTChJLFUseixGKXtpZihuLmlzV2ViR0wyPT09ITEmJihJLmlzSW5zdGFuY2VkTWVzaHx8Ri5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5KSYmZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKT09PW51bGwpcmV0dXJuO3goKTtjb25zdCBaPUYuYXR0cmlidXRlcyxWPXouZ2V0QXR0cmlidXRlcygpLFE9VS5kZWZhdWx0QXR0cmlidXRlVmFsdWVzO2Zvcihjb25zdCBuZSBpbiBWKXtjb25zdCBmZT1WW25lXTtpZihmZS5sb2NhdGlvbj49MCl7bGV0ICQ9WltuZV07aWYoJD09PXZvaWQgMCYmKG5lPT09Imluc3RhbmNlTWF0cml4IiYmSS5pbnN0YW5jZU1hdHJpeCYmKCQ9SS5pbnN0YW5jZU1hdHJpeCksbmU9PT0iaW5zdGFuY2VDb2xvciImJkkuaW5zdGFuY2VDb2xvciYmKCQ9SS5pbnN0YW5jZUNvbG9yKSksJCE9PXZvaWQgMCl7Y29uc3QgZWU9JC5ub3JtYWxpemVkLGRlPSQuaXRlbVNpemUsVGU9dC5nZXQoJCk7aWYoVGU9PT12b2lkIDApY29udGludWU7Y29uc3QgYmU9VGUuYnVmZmVyLE9lPVRlLnR5cGUsQmU9VGUuYnl0ZXNQZXJFbGVtZW50LHdlPW4uaXNXZWJHTDI9PT0hMCYmKE9lPT09ci5JTlR8fE9lPT09ci5VTlNJR05FRF9JTlR8fCQuZ3B1VHlwZT09PWdjKTtpZigkLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IFBlPSQuZGF0YSxEPVBlLnN0cmlkZSxsZT0kLm9mZnNldDtpZihQZS5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyKXtmb3IobGV0IEs9MDtLPGZlLmxvY2F0aW9uU2l6ZTtLKyspUyhmZS5sb2NhdGlvbitLLFBlLm1lc2hQZXJBdHRyaWJ1dGUpO0kuaXNJbnN0YW5jZWRNZXNoIT09ITAmJkYuX21heEluc3RhbmNlQ291bnQ9PT12b2lkIDAmJihGLl9tYXhJbnN0YW5jZUNvdW50PVBlLm1lc2hQZXJBdHRyaWJ1dGUqUGUuY291bnQpfWVsc2UgZm9yKGxldCBLPTA7SzxmZS5sb2NhdGlvblNpemU7SysrKXYoZmUubG9jYXRpb24rSyk7ci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLGJlKTtmb3IobGV0IEs9MDtLPGZlLmxvY2F0aW9uU2l6ZTtLKyspQShmZS5sb2NhdGlvbitLLGRlL2ZlLmxvY2F0aW9uU2l6ZSxPZSxlZSxEKkJlLChsZStkZS9mZS5sb2NhdGlvblNpemUqSykqQmUsd2UpfWVsc2V7aWYoJC5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSl7Zm9yKGxldCBQZT0wO1BlPGZlLmxvY2F0aW9uU2l6ZTtQZSsrKVMoZmUubG9jYXRpb24rUGUsJC5tZXNoUGVyQXR0cmlidXRlKTtJLmlzSW5zdGFuY2VkTWVzaCE9PSEwJiZGLl9tYXhJbnN0YW5jZUNvdW50PT09dm9pZCAwJiYoRi5fbWF4SW5zdGFuY2VDb3VudD0kLm1lc2hQZXJBdHRyaWJ1dGUqJC5jb3VudCl9ZWxzZSBmb3IobGV0IFBlPTA7UGU8ZmUubG9jYXRpb25TaXplO1BlKyspdihmZS5sb2NhdGlvbitQZSk7ci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLGJlKTtmb3IobGV0IFBlPTA7UGU8ZmUubG9jYXRpb25TaXplO1BlKyspQShmZS5sb2NhdGlvbitQZSxkZS9mZS5sb2NhdGlvblNpemUsT2UsZWUsZGUqQmUsZGUvZmUubG9jYXRpb25TaXplKlBlKkJlLHdlKX19ZWxzZSBpZihRIT09dm9pZCAwKXtjb25zdCBlZT1RW25lXTtpZihlZSE9PXZvaWQgMClzd2l0Y2goZWUubGVuZ3RoKXtjYXNlIDI6ci52ZXJ0ZXhBdHRyaWIyZnYoZmUubG9jYXRpb24sZWUpO2JyZWFrO2Nhc2UgMzpyLnZlcnRleEF0dHJpYjNmdihmZS5sb2NhdGlvbixlZSk7YnJlYWs7Y2FzZSA0OnIudmVydGV4QXR0cmliNGZ2KGZlLmxvY2F0aW9uLGVlKTticmVhaztkZWZhdWx0OnIudmVydGV4QXR0cmliMWZ2KGZlLmxvY2F0aW9uLGVlKX19fX1iKCl9ZnVuY3Rpb24gTSgpe04oKTtmb3IoY29uc3QgSSBpbiBvKXtjb25zdCBVPW9bSV07Zm9yKGNvbnN0IHogaW4gVSl7Y29uc3QgRj1VW3pdO2Zvcihjb25zdCBaIGluIEYpcChGW1pdLm9iamVjdCksZGVsZXRlIEZbWl07ZGVsZXRlIFVbel19ZGVsZXRlIG9bSV19fWZ1bmN0aW9uIHcoSSl7aWYob1tJLmlkXT09PXZvaWQgMClyZXR1cm47Y29uc3QgVT1vW0kuaWRdO2Zvcihjb25zdCB6IGluIFUpe2NvbnN0IEY9VVt6XTtmb3IoY29uc3QgWiBpbiBGKXAoRltaXS5vYmplY3QpLGRlbGV0ZSBGW1pdO2RlbGV0ZSBVW3pdfWRlbGV0ZSBvW0kuaWRdfWZ1bmN0aW9uIFIoSSl7Zm9yKGNvbnN0IFUgaW4gbyl7Y29uc3Qgej1vW1VdO2lmKHpbSS5pZF09PT12b2lkIDApY29udGludWU7Y29uc3QgRj16W0kuaWRdO2Zvcihjb25zdCBaIGluIEYpcChGW1pdLm9iamVjdCksZGVsZXRlIEZbWl07ZGVsZXRlIHpbSS5pZF19fWZ1bmN0aW9uIE4oKXtCKCksaD0hMCxjIT09bCYmKGM9bCxkKGMub2JqZWN0KSl9ZnVuY3Rpb24gQigpe2wuZ2VvbWV0cnk9bnVsbCxsLnByb2dyYW09bnVsbCxsLndpcmVmcmFtZT0hMX1yZXR1cm57c2V0dXA6dSxyZXNldDpOLHJlc2V0RGVmYXVsdFN0YXRlOkIsZGlzcG9zZTpNLHJlbGVhc2VTdGF0ZXNPZkdlb21ldHJ5OncscmVsZWFzZVN0YXRlc09mUHJvZ3JhbTpSLGluaXRBdHRyaWJ1dGVzOngsZW5hYmxlQXR0cmlidXRlOnYsZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXM6Yn19ZnVuY3Rpb24gRHYocixlLHQsbil7Y29uc3QgaT1uLmlzV2ViR0wyO2xldCBzO2Z1bmN0aW9uIGEoaCl7cz1ofWZ1bmN0aW9uIG8oaCx1KXtyLmRyYXdBcnJheXMocyxoLHUpLHQudXBkYXRlKHUscywxKX1mdW5jdGlvbiBsKGgsdSxmKXtpZihmPT09MClyZXR1cm47bGV0IGQscDtpZihpKWQ9cixwPSJkcmF3QXJyYXlzSW5zdGFuY2VkIjtlbHNlIGlmKGQ9ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSxwPSJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLGQ9PT1udWxsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4iKTtyZXR1cm59ZFtwXShzLGgsdSxmKSx0LnVwZGF0ZSh1LHMsZil9ZnVuY3Rpb24gYyhoLHUsZil7aWYoZj09PTApcmV0dXJuO2NvbnN0IGQ9ZS5nZXQoIldFQkdMX211bHRpX2RyYXciKTtpZihkPT09bnVsbClmb3IobGV0IHA9MDtwPGY7cCsrKXRoaXMucmVuZGVyKGhbcF0sdVtwXSk7ZWxzZXtkLm11bHRpRHJhd0FycmF5c1dFQkdMKHMsaCwwLHUsMCxmKTtsZXQgcD0wO2ZvcihsZXQgXz0wO188ZjtfKyspcCs9dVtfXTt0LnVwZGF0ZShwLHMsMSl9fXRoaXMuc2V0TW9kZT1hLHRoaXMucmVuZGVyPW8sdGhpcy5yZW5kZXJJbnN0YW5jZXM9bCx0aGlzLnJlbmRlck11bHRpRHJhdz1jfWZ1bmN0aW9uIE52KHIsZSx0KXtsZXQgbjtmdW5jdGlvbiBpKCl7aWYobiE9PXZvaWQgMClyZXR1cm4gbjtpZihlLmhhcygiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik9PT0hMCl7Y29uc3QgQT1lLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7bj1yLmdldFBhcmFtZXRlcihBLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCl9ZWxzZSBuPTA7cmV0dXJuIG59ZnVuY3Rpb24gcyhBKXtpZihBPT09ImhpZ2hwIil7aWYoci5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoci5WRVJURVhfU0hBREVSLHIuSElHSF9GTE9BVCkucHJlY2lzaW9uPjAmJnIuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KHIuRlJBR01FTlRfU0hBREVSLHIuSElHSF9GTE9BVCkucHJlY2lzaW9uPjApcmV0dXJuImhpZ2hwIjtBPSJtZWRpdW1wIn1yZXR1cm4gQT09PSJtZWRpdW1wIiYmci5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoci5WRVJURVhfU0hBREVSLHIuTUVESVVNX0ZMT0FUKS5wcmVjaXNpb24+MCYmci5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoci5GUkFHTUVOVF9TSEFERVIsci5NRURJVU1fRkxPQVQpLnByZWNpc2lvbj4wPyJtZWRpdW1wIjoibG93cCJ9Y29uc3QgYT10eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCE9InVuZGVmaW5lZCImJnIuY29uc3RydWN0b3IubmFtZT09PSJXZWJHTDJSZW5kZXJpbmdDb250ZXh0IjtsZXQgbz10LnByZWNpc2lvbiE9PXZvaWQgMD90LnByZWNpc2lvbjoiaGlnaHAiO2NvbnN0IGw9cyhvKTtsIT09byYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjoiLG8sIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIixsLCJpbnN0ZWFkLiIpLG89bCk7Y29uc3QgYz1hfHxlLmhhcygiV0VCR0xfZHJhd19idWZmZXJzIiksaD10LmxvZ2FyaXRobWljRGVwdGhCdWZmZXI9PT0hMCx1PXIuZ2V0UGFyYW1ldGVyKHIuTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMpLGY9ci5nZXRQYXJhbWV0ZXIoci5NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMpLGQ9ci5nZXRQYXJhbWV0ZXIoci5NQVhfVEVYVFVSRV9TSVpFKSxwPXIuZ2V0UGFyYW1ldGVyKHIuTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSksXz1yLmdldFBhcmFtZXRlcihyLk1BWF9WRVJURVhfQVRUUklCUyksZz1yLmdldFBhcmFtZXRlcihyLk1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTKSxtPXIuZ2V0UGFyYW1ldGVyKHIuTUFYX1ZBUllJTkdfVkVDVE9SUykseT1yLmdldFBhcmFtZXRlcihyLk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMpLHg9Zj4wLHY9YXx8ZS5oYXMoIk9FU190ZXh0dXJlX2Zsb2F0IiksUz14JiZ2LGI9YT9yLmdldFBhcmFtZXRlcihyLk1BWF9TQU1QTEVTKTowO3JldHVybntpc1dlYkdMMjphLGRyYXdCdWZmZXJzOmMsZ2V0TWF4QW5pc290cm9weTppLGdldE1heFByZWNpc2lvbjpzLHByZWNpc2lvbjpvLGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6aCxtYXhUZXh0dXJlczp1LG1heFZlcnRleFRleHR1cmVzOmYsbWF4VGV4dHVyZVNpemU6ZCxtYXhDdWJlbWFwU2l6ZTpwLG1heEF0dHJpYnV0ZXM6XyxtYXhWZXJ0ZXhVbmlmb3JtczpnLG1heFZhcnlpbmdzOm0sbWF4RnJhZ21lbnRVbmlmb3Jtczp5LHZlcnRleFRleHR1cmVzOngsZmxvYXRGcmFnbWVudFRleHR1cmVzOnYsZmxvYXRWZXJ0ZXhUZXh0dXJlczpTLG1heFNhbXBsZXM6Yn19ZnVuY3Rpb24gRnYocil7Y29uc3QgZT10aGlzO2xldCB0PW51bGwsbj0wLGk9ITEscz0hMTtjb25zdCBhPW5ldyBMaSxvPW5ldyBaZSxsPXt2YWx1ZTpudWxsLG5lZWRzVXBkYXRlOiExfTt0aGlzLnVuaWZvcm09bCx0aGlzLm51bVBsYW5lcz0wLHRoaXMubnVtSW50ZXJzZWN0aW9uPTAsdGhpcy5pbml0PWZ1bmN0aW9uKHUsZil7Y29uc3QgZD11Lmxlbmd0aCE9PTB8fGZ8fG4hPT0wfHxpO3JldHVybiBpPWYsbj11Lmxlbmd0aCxkfSx0aGlzLmJlZ2luU2hhZG93cz1mdW5jdGlvbigpe3M9ITAsaChudWxsKX0sdGhpcy5lbmRTaGFkb3dzPWZ1bmN0aW9uKCl7cz0hMX0sdGhpcy5zZXRHbG9iYWxTdGF0ZT1mdW5jdGlvbih1LGYpe3Q9aCh1LGYsMCl9LHRoaXMuc2V0U3RhdGU9ZnVuY3Rpb24odSxmLGQpe2NvbnN0IHA9dS5jbGlwcGluZ1BsYW5lcyxfPXUuY2xpcEludGVyc2VjdGlvbixnPXUuY2xpcFNoYWRvd3MsbT1yLmdldCh1KTtpZighaXx8cD09PW51bGx8fHAubGVuZ3RoPT09MHx8cyYmIWcpcz9oKG51bGwpOmMoKTtlbHNle2NvbnN0IHk9cz8wOm4seD15KjQ7bGV0IHY9bS5jbGlwcGluZ1N0YXRlfHxudWxsO2wudmFsdWU9dix2PWgocCxmLHgsZCk7Zm9yKGxldCBTPTA7UyE9PXg7KytTKXZbU109dFtTXTttLmNsaXBwaW5nU3RhdGU9dix0aGlzLm51bUludGVyc2VjdGlvbj1fP3RoaXMubnVtUGxhbmVzOjAsdGhpcy5udW1QbGFuZXMrPXl9fTtmdW5jdGlvbiBjKCl7bC52YWx1ZSE9PXQmJihsLnZhbHVlPXQsbC5uZWVkc1VwZGF0ZT1uPjApLGUubnVtUGxhbmVzPW4sZS5udW1JbnRlcnNlY3Rpb249MH1mdW5jdGlvbiBoKHUsZixkLHApe2NvbnN0IF89dSE9PW51bGw/dS5sZW5ndGg6MDtsZXQgZz1udWxsO2lmKF8hPT0wKXtpZihnPWwudmFsdWUscCE9PSEwfHxnPT09bnVsbCl7Y29uc3QgbT1kK18qNCx5PWYubWF0cml4V29ybGRJbnZlcnNlO28uZ2V0Tm9ybWFsTWF0cml4KHkpLChnPT09bnVsbHx8Zy5sZW5ndGg8bSkmJihnPW5ldyBGbG9hdDMyQXJyYXkobSkpO2ZvcihsZXQgeD0wLHY9ZDt4IT09XzsrK3gsdis9NClhLmNvcHkodVt4XSkuYXBwbHlNYXRyaXg0KHksbyksYS5ub3JtYWwudG9BcnJheShnLHYpLGdbdiszXT1hLmNvbnN0YW50fWwudmFsdWU9ZyxsLm5lZWRzVXBkYXRlPSEwfXJldHVybiBlLm51bVBsYW5lcz1fLGUubnVtSW50ZXJzZWN0aW9uPTAsZ319ZnVuY3Rpb24gT3Yocil7bGV0IGU9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gdChhLG8pe3JldHVybiBvPT09YnM/YS5tYXBwaW5nPUtuOm89PT13cyYmKGEubWFwcGluZz15aSksYX1mdW5jdGlvbiBuKGEpe2lmKGEmJmEuaXNUZXh0dXJlKXtjb25zdCBvPWEubWFwcGluZztpZihvPT09YnN8fG89PT13cylpZihlLmhhcyhhKSl7Y29uc3QgbD1lLmdldChhKS50ZXh0dXJlO3JldHVybiB0KGwsYS5tYXBwaW5nKX1lbHNle2NvbnN0IGw9YS5pbWFnZTtpZihsJiZsLmhlaWdodD4wKXtjb25zdCBjPW5ldyAkZChsLmhlaWdodC8yKTtyZXR1cm4gYy5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZShyLGEpLGUuc2V0KGEsYyksYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixpKSx0KGMudGV4dHVyZSxhLm1hcHBpbmcpfWVsc2UgcmV0dXJuIG51bGx9fXJldHVybiBhfWZ1bmN0aW9uIGkoYSl7Y29uc3Qgbz1hLnRhcmdldDtvLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGkpO2NvbnN0IGw9ZS5nZXQobyk7bCE9PXZvaWQgMCYmKGUuZGVsZXRlKG8pLGwuZGlzcG9zZSgpKX1mdW5jdGlvbiBzKCl7ZT1uZXcgV2Vha01hcH1yZXR1cm57Z2V0Om4sZGlzcG9zZTpzfX1jbGFzcyB2byBleHRlbmRzIF9ve2NvbnN0cnVjdG9yKGU9LTEsdD0xLG49MSxpPS0xLHM9LjEsYT0yZTMpe3N1cGVyKCksdGhpcy5pc09ydGhvZ3JhcGhpY0NhbWVyYT0hMCx0aGlzLnR5cGU9Ik9ydGhvZ3JhcGhpY0NhbWVyYSIsdGhpcy56b29tPTEsdGhpcy52aWV3PW51bGwsdGhpcy5sZWZ0PWUsdGhpcy5yaWdodD10LHRoaXMudG9wPW4sdGhpcy5ib3R0b209aSx0aGlzLm5lYXI9cyx0aGlzLmZhcj1hLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWNvcHkoZSx0KXtyZXR1cm4gc3VwZXIuY29weShlLHQpLHRoaXMubGVmdD1lLmxlZnQsdGhpcy5yaWdodD1lLnJpZ2h0LHRoaXMudG9wPWUudG9wLHRoaXMuYm90dG9tPWUuYm90dG9tLHRoaXMubmVhcj1lLm5lYXIsdGhpcy5mYXI9ZS5mYXIsdGhpcy56b29tPWUuem9vbSx0aGlzLnZpZXc9ZS52aWV3PT09bnVsbD9udWxsOk9iamVjdC5hc3NpZ24oe30sZS52aWV3KSx0aGlzfXNldFZpZXdPZmZzZXQoZSx0LG4saSxzLGEpe3RoaXMudmlldz09PW51bGwmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pLHRoaXMudmlldy5lbmFibGVkPSEwLHRoaXMudmlldy5mdWxsV2lkdGg9ZSx0aGlzLnZpZXcuZnVsbEhlaWdodD10LHRoaXMudmlldy5vZmZzZXRYPW4sdGhpcy52aWV3Lm9mZnNldFk9aSx0aGlzLnZpZXcud2lkdGg9cyx0aGlzLnZpZXcuaGVpZ2h0PWEsdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y2xlYXJWaWV3T2Zmc2V0KCl7dGhpcy52aWV3IT09bnVsbCYmKHRoaXMudmlldy5lbmFibGVkPSExKSx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX11cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl7Y29uc3QgZT0odGhpcy5yaWdodC10aGlzLmxlZnQpLygyKnRoaXMuem9vbSksdD0odGhpcy50b3AtdGhpcy5ib3R0b20pLygyKnRoaXMuem9vbSksbj0odGhpcy5yaWdodCt0aGlzLmxlZnQpLzIsaT0odGhpcy50b3ArdGhpcy5ib3R0b20pLzI7bGV0IHM9bi1lLGE9bitlLG89aSt0LGw9aS10O2lmKHRoaXMudmlldyE9PW51bGwmJnRoaXMudmlldy5lbmFibGVkKXtjb25zdCBjPSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvdGhpcy52aWV3LmZ1bGxXaWR0aC90aGlzLnpvb20saD0odGhpcy50b3AtdGhpcy5ib3R0b20pL3RoaXMudmlldy5mdWxsSGVpZ2h0L3RoaXMuem9vbTtzKz1jKnRoaXMudmlldy5vZmZzZXRYLGE9cytjKnRoaXMudmlldy53aWR0aCxvLT1oKnRoaXMudmlldy5vZmZzZXRZLGw9by1oKnRoaXMudmlldy5oZWlnaHR9dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VPcnRob2dyYXBoaWMocyxhLG8sbCx0aGlzLm5lYXIsdGhpcy5mYXIsdGhpcy5jb29yZGluYXRlU3lzdGVtKSx0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5wcm9qZWN0aW9uTWF0cml4KS5pbnZlcnQoKX10b0pTT04oZSl7Y29uc3QgdD1zdXBlci50b0pTT04oZSk7cmV0dXJuIHQub2JqZWN0Lnpvb209dGhpcy56b29tLHQub2JqZWN0LmxlZnQ9dGhpcy5sZWZ0LHQub2JqZWN0LnJpZ2h0PXRoaXMucmlnaHQsdC5vYmplY3QudG9wPXRoaXMudG9wLHQub2JqZWN0LmJvdHRvbT10aGlzLmJvdHRvbSx0Lm9iamVjdC5uZWFyPXRoaXMubmVhcix0Lm9iamVjdC5mYXI9dGhpcy5mYXIsdGhpcy52aWV3IT09bnVsbCYmKHQub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKSx0fX1jb25zdCBYcj00LFpkPVsuMTI1LC4yMTUsLjM1LC40NDYsLjUyNiwuNTgyXSxKaT0yMCxTaD1uZXcgdm8sSmQ9bmV3IHllO2xldCBiaD1udWxsLHdoPTAsRWg9MDtjb25zdCBLaT0oMStNYXRoLnNxcnQoNSkpLzIscXI9MS9LaSxLZD1bbmV3IFAoMSwxLDEpLG5ldyBQKC0xLDEsMSksbmV3IFAoMSwxLC0xKSxuZXcgUCgtMSwxLC0xKSxuZXcgUCgwLEtpLHFyKSxuZXcgUCgwLEtpLC1xciksbmV3IFAocXIsMCxLaSksbmV3IFAoLXFyLDAsS2kpLG5ldyBQKEtpLHFyLDApLG5ldyBQKC1LaSxxciwwKV07Y2xhc3MgQWh7Y29uc3RydWN0b3IoZSl7dGhpcy5fcmVuZGVyZXI9ZSx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldD1udWxsLHRoaXMuX2xvZE1heD0wLHRoaXMuX2N1YmVTaXplPTAsdGhpcy5fbG9kUGxhbmVzPVtdLHRoaXMuX3NpemVMb2RzPVtdLHRoaXMuX3NpZ21hcz1bXSx0aGlzLl9ibHVyTWF0ZXJpYWw9bnVsbCx0aGlzLl9jdWJlbWFwTWF0ZXJpYWw9bnVsbCx0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPW51bGwsdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2JsdXJNYXRlcmlhbCl9ZnJvbVNjZW5lKGUsdD0wLG49LjEsaT0xMDApe2JoPXRoaXMuX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpLHdoPXRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCksRWg9dGhpcy5fcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKSx0aGlzLl9zZXRTaXplKDI1Nik7Y29uc3Qgcz10aGlzLl9hbGxvY2F0ZVRhcmdldHMoKTtyZXR1cm4gcy5kZXB0aEJ1ZmZlcj0hMCx0aGlzLl9zY2VuZVRvQ3ViZVVWKGUsbixpLHMpLHQ+MCYmdGhpcy5fYmx1cihzLDAsMCx0KSx0aGlzLl9hcHBseVBNUkVNKHMpLHRoaXMuX2NsZWFudXAocyksc31mcm9tRXF1aXJlY3Rhbmd1bGFyKGUsdD1udWxsKXtyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUoZSx0KX1mcm9tQ3ViZW1hcChlLHQ9bnVsbCl7cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKGUsdCl9Y29tcGlsZUN1YmVtYXBTaGFkZXIoKXt0aGlzLl9jdWJlbWFwTWF0ZXJpYWw9PT1udWxsJiYodGhpcy5fY3ViZW1hcE1hdGVyaWFsPWVwKCksdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2N1YmVtYXBNYXRlcmlhbCkpfWNvbXBpbGVFcXVpcmVjdGFuZ3VsYXJTaGFkZXIoKXt0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPT09bnVsbCYmKHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWw9amQoKSx0aGlzLl9jb21waWxlTWF0ZXJpYWwodGhpcy5fZXF1aXJlY3RNYXRlcmlhbCkpfWRpc3Bvc2UoKXt0aGlzLl9kaXNwb3NlKCksdGhpcy5fY3ViZW1hcE1hdGVyaWFsIT09bnVsbCYmdGhpcy5fY3ViZW1hcE1hdGVyaWFsLmRpc3Bvc2UoKSx0aGlzLl9lcXVpcmVjdE1hdGVyaWFsIT09bnVsbCYmdGhpcy5fZXF1aXJlY3RNYXRlcmlhbC5kaXNwb3NlKCl9X3NldFNpemUoZSl7dGhpcy5fbG9kTWF4PU1hdGguZmxvb3IoTWF0aC5sb2cyKGUpKSx0aGlzLl9jdWJlU2l6ZT1NYXRoLnBvdygyLHRoaXMuX2xvZE1heCl9X2Rpc3Bvc2UoKXt0aGlzLl9ibHVyTWF0ZXJpYWwhPT1udWxsJiZ0aGlzLl9ibHVyTWF0ZXJpYWwuZGlzcG9zZSgpLHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0IT09bnVsbCYmdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQuZGlzcG9zZSgpO2ZvcihsZXQgZT0wO2U8dGhpcy5fbG9kUGxhbmVzLmxlbmd0aDtlKyspdGhpcy5fbG9kUGxhbmVzW2VdLmRpc3Bvc2UoKX1fY2xlYW51cChlKXt0aGlzLl9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoYmgsd2gsRWgpLGUuc2Npc3NvclRlc3Q9ITEsTW8oZSwwLDAsZS53aWR0aCxlLmhlaWdodCl9X2Zyb21UZXh0dXJlKGUsdCl7ZS5tYXBwaW5nPT09S258fGUubWFwcGluZz09PXlpP3RoaXMuX3NldFNpemUoZS5pbWFnZS5sZW5ndGg9PT0wPzE2OmUuaW1hZ2VbMF0ud2lkdGh8fGUuaW1hZ2VbMF0uaW1hZ2Uud2lkdGgpOnRoaXMuX3NldFNpemUoZS5pbWFnZS53aWR0aC80KSxiaD10aGlzLl9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKSx3aD10aGlzLl9yZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpLEVoPXRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZU1pcG1hcExldmVsKCk7Y29uc3Qgbj10fHx0aGlzLl9hbGxvY2F0ZVRhcmdldHMoKTtyZXR1cm4gdGhpcy5fdGV4dHVyZVRvQ3ViZVVWKGUsbiksdGhpcy5fYXBwbHlQTVJFTShuKSx0aGlzLl9jbGVhbnVwKG4pLG59X2FsbG9jYXRlVGFyZ2V0cygpe2NvbnN0IGU9MypNYXRoLm1heCh0aGlzLl9jdWJlU2l6ZSwxMTIpLHQ9NCp0aGlzLl9jdWJlU2l6ZSxuPXttYWdGaWx0ZXI6d3QsbWluRmlsdGVyOnd0LGdlbmVyYXRlTWlwbWFwczohMSx0eXBlOndyLGZvcm1hdDphbixjb2xvclNwYWNlOlZuLGRlcHRoQnVmZmVyOiExfSxpPVFkKGUsdCxuKTtpZih0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldD09PW51bGx8fHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LndpZHRoIT09ZXx8dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQuaGVpZ2h0IT09dCl7dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQhPT1udWxsJiZ0aGlzLl9kaXNwb3NlKCksdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ9UWQoZSx0LG4pO2NvbnN0e19sb2RNYXg6c309dGhpczsoe3NpemVMb2RzOnRoaXMuX3NpemVMb2RzLGxvZFBsYW5lczp0aGlzLl9sb2RQbGFuZXMsc2lnbWFzOnRoaXMuX3NpZ21hc309QnYocykpLHRoaXMuX2JsdXJNYXRlcmlhbD16dihzLGUsdCl9cmV0dXJuIGl9X2NvbXBpbGVNYXRlcmlhbChlKXtjb25zdCB0PW5ldyBMdCh0aGlzLl9sb2RQbGFuZXNbMF0sZSk7dGhpcy5fcmVuZGVyZXIuY29tcGlsZSh0LFNoKX1fc2NlbmVUb0N1YmVVVihlLHQsbixpKXtjb25zdCBvPW5ldyBCdCg5MCwxLHQsbiksbD1bMSwtMSwxLDEsMSwxXSxjPVsxLDEsMSwtMSwtMSwtMV0saD10aGlzLl9yZW5kZXJlcix1PWguYXV0b0NsZWFyLGY9aC50b25lTWFwcGluZztoLmdldENsZWFyQ29sb3IoSmQpLGgudG9uZU1hcHBpbmc9Sm4saC5hdXRvQ2xlYXI9ITE7Y29uc3QgZD1uZXcgUGkoe25hbWU6IlBNUkVNLkJhY2tncm91bmQiLHNpZGU6WXQsZGVwdGhXcml0ZTohMSxkZXB0aFRlc3Q6ITF9KSxwPW5ldyBMdChuZXcgWWksZCk7bGV0IF89ITE7Y29uc3QgZz1lLmJhY2tncm91bmQ7Zz9nLmlzQ29sb3ImJihkLmNvbG9yLmNvcHkoZyksZS5iYWNrZ3JvdW5kPW51bGwsXz0hMCk6KGQuY29sb3IuY29weShKZCksXz0hMCk7Zm9yKGxldCBtPTA7bTw2O20rKyl7Y29uc3QgeT1tJTM7eT09PTA/KG8udXAuc2V0KDAsbFttXSwwKSxvLmxvb2tBdChjW21dLDAsMCkpOnk9PT0xPyhvLnVwLnNldCgwLDAsbFttXSksby5sb29rQXQoMCxjW21dLDApKTooby51cC5zZXQoMCxsW21dLDApLG8ubG9va0F0KDAsMCxjW21dKSk7Y29uc3QgeD10aGlzLl9jdWJlU2l6ZTtNbyhpLHkqeCxtPjI/eDowLHgseCksaC5zZXRSZW5kZXJUYXJnZXQoaSksXyYmaC5yZW5kZXIocCxvKSxoLnJlbmRlcihlLG8pfXAuZ2VvbWV0cnkuZGlzcG9zZSgpLHAubWF0ZXJpYWwuZGlzcG9zZSgpLGgudG9uZU1hcHBpbmc9ZixoLmF1dG9DbGVhcj11LGUuYmFja2dyb3VuZD1nfV90ZXh0dXJlVG9DdWJlVVYoZSx0KXtjb25zdCBuPXRoaXMuX3JlbmRlcmVyLGk9ZS5tYXBwaW5nPT09S258fGUubWFwcGluZz09PXlpO2k/KHRoaXMuX2N1YmVtYXBNYXRlcmlhbD09PW51bGwmJih0aGlzLl9jdWJlbWFwTWF0ZXJpYWw9ZXAoKSksdGhpcy5fY3ViZW1hcE1hdGVyaWFsLnVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWU9ZS5pc1JlbmRlclRhcmdldFRleHR1cmU9PT0hMT8tMToxKTp0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPT09bnVsbCYmKHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWw9amQoKSk7Y29uc3Qgcz1pP3RoaXMuX2N1YmVtYXBNYXRlcmlhbDp0aGlzLl9lcXVpcmVjdE1hdGVyaWFsLGE9bmV3IEx0KHRoaXMuX2xvZFBsYW5lc1swXSxzKSxvPXMudW5pZm9ybXM7by5lbnZNYXAudmFsdWU9ZTtjb25zdCBsPXRoaXMuX2N1YmVTaXplO01vKHQsMCwwLDMqbCwyKmwpLG4uc2V0UmVuZGVyVGFyZ2V0KHQpLG4ucmVuZGVyKGEsU2gpfV9hcHBseVBNUkVNKGUpe2NvbnN0IHQ9dGhpcy5fcmVuZGVyZXIsbj10LmF1dG9DbGVhcjt0LmF1dG9DbGVhcj0hMTtmb3IobGV0IGk9MTtpPHRoaXMuX2xvZFBsYW5lcy5sZW5ndGg7aSsrKXtjb25zdCBzPU1hdGguc3FydCh0aGlzLl9zaWdtYXNbaV0qdGhpcy5fc2lnbWFzW2ldLXRoaXMuX3NpZ21hc1tpLTFdKnRoaXMuX3NpZ21hc1tpLTFdKSxhPUtkWyhpLTEpJUtkLmxlbmd0aF07dGhpcy5fYmx1cihlLGktMSxpLHMsYSl9dC5hdXRvQ2xlYXI9bn1fYmx1cihlLHQsbixpLHMpe2NvbnN0IGE9dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ7dGhpcy5faGFsZkJsdXIoZSxhLHQsbixpLCJsYXRpdHVkaW5hbCIscyksdGhpcy5faGFsZkJsdXIoYSxlLG4sbixpLCJsb25naXR1ZGluYWwiLHMpfV9oYWxmQmx1cihlLHQsbixpLHMsYSxvKXtjb25zdCBsPXRoaXMuX3JlbmRlcmVyLGM9dGhpcy5fYmx1ck1hdGVyaWFsO2EhPT0ibGF0aXR1ZGluYWwiJiZhIT09ImxvbmdpdHVkaW5hbCImJmNvbnNvbGUuZXJyb3IoImJsdXIgZGlyZWN0aW9uIG11c3QgYmUgZWl0aGVyIGxhdGl0dWRpbmFsIG9yIGxvbmdpdHVkaW5hbCEiKTtjb25zdCBoPTMsdT1uZXcgTHQodGhpcy5fbG9kUGxhbmVzW2ldLGMpLGY9Yy51bmlmb3JtcyxkPXRoaXMuX3NpemVMb2RzW25dLTEscD1pc0Zpbml0ZShzKT9NYXRoLlBJLygyKmQpOjIqTWF0aC5QSS8oMipKaS0xKSxfPXMvcCxnPWlzRmluaXRlKHMpPzErTWF0aC5mbG9vcihoKl8pOkppO2c+SmkmJmNvbnNvbGUud2Fybihgc2lnbWFSYWRpYW5zLCAke3N9LCBpcyB0b28gbGFyZ2UgYW5kIHdpbGwgY2xpcCwgYXMgaXQgcmVxdWVzdGVkICR7Z30gc2FtcGxlcyB3aGVuIHRoZSBtYXhpbXVtIGlzIHNldCB0byAke0ppfWApO2NvbnN0IG09W107bGV0IHk9MDtmb3IobGV0IEE9MDtBPEppOysrQSl7Y29uc3QgTD1BL18sTT1NYXRoLmV4cCgtTCpMLzIpO20ucHVzaChNKSxBPT09MD95Kz1NOkE8ZyYmKHkrPTIqTSl9Zm9yKGxldCBBPTA7QTxtLmxlbmd0aDtBKyspbVtBXT1tW0FdL3k7Zi5lbnZNYXAudmFsdWU9ZS50ZXh0dXJlLGYuc2FtcGxlcy52YWx1ZT1nLGYud2VpZ2h0cy52YWx1ZT1tLGYubGF0aXR1ZGluYWwudmFsdWU9YT09PSJsYXRpdHVkaW5hbCIsbyYmKGYucG9sZUF4aXMudmFsdWU9byk7Y29uc3R7X2xvZE1heDp4fT10aGlzO2YuZFRoZXRhLnZhbHVlPXAsZi5taXBJbnQudmFsdWU9eC1uO2NvbnN0IHY9dGhpcy5fc2l6ZUxvZHNbaV0sUz0zKnYqKGk+eC1Ycj9pLXgrWHI6MCksYj00Kih0aGlzLl9jdWJlU2l6ZS12KTtNbyh0LFMsYiwzKnYsMip2KSxsLnNldFJlbmRlclRhcmdldCh0KSxsLnJlbmRlcih1LFNoKX19ZnVuY3Rpb24gQnYocil7Y29uc3QgZT1bXSx0PVtdLG49W107bGV0IGk9cjtjb25zdCBzPXItWHIrMStaZC5sZW5ndGg7Zm9yKGxldCBhPTA7YTxzO2ErKyl7Y29uc3Qgbz1NYXRoLnBvdygyLGkpO3QucHVzaChvKTtsZXQgbD0xL287YT5yLVhyP2w9WmRbYS1yK1hyLTFdOmE9PT0wJiYobD0wKSxuLnB1c2gobCk7Y29uc3QgYz0xLyhvLTIpLGg9LWMsdT0xK2MsZj1baCxoLHUsaCx1LHUsaCxoLHUsdSxoLHVdLGQ9NixwPTYsXz0zLGc9MixtPTEseT1uZXcgRmxvYXQzMkFycmF5KF8qcCpkKSx4PW5ldyBGbG9hdDMyQXJyYXkoZypwKmQpLHY9bmV3IEZsb2F0MzJBcnJheShtKnAqZCk7Zm9yKGxldCBiPTA7YjxkO2IrKyl7Y29uc3QgQT1iJTMqMi8zLTEsTD1iPjI/MDotMSxNPVtBLEwsMCxBKzIvMyxMLDAsQSsyLzMsTCsxLDAsQSxMLDAsQSsyLzMsTCsxLDAsQSxMKzEsMF07eS5zZXQoTSxfKnAqYikseC5zZXQoZixnKnAqYik7Y29uc3Qgdz1bYixiLGIsYixiLGJdO3Yuc2V0KHcsbSpwKmIpfWNvbnN0IFM9bmV3IGtlO1Muc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEtlKHksXykpLFMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEtlKHgsZykpLFMuc2V0QXR0cmlidXRlKCJmYWNlSW5kZXgiLG5ldyBLZSh2LG0pKSxlLnB1c2goUyksaT5YciYmaS0tfXJldHVybntsb2RQbGFuZXM6ZSxzaXplTG9kczp0LHNpZ21hczpufX1mdW5jdGlvbiBRZChyLGUsdCl7Y29uc3Qgbj1uZXcgTG4ocixlLHQpO3JldHVybiBuLnRleHR1cmUubWFwcGluZz1icixuLnRleHR1cmUubmFtZT0iUE1SRU0uY3ViZVV2IixuLnNjaXNzb3JUZXN0PSEwLG59ZnVuY3Rpb24gTW8ocixlLHQsbixpKXtyLnZpZXdwb3J0LnNldChlLHQsbixpKSxyLnNjaXNzb3Iuc2V0KGUsdCxuLGkpfWZ1bmN0aW9uIHp2KHIsZSx0KXtjb25zdCBuPW5ldyBGbG9hdDMyQXJyYXkoSmkpLGk9bmV3IFAoMCwxLDApO3JldHVybiBuZXcgSG4oe25hbWU6IlNwaGVyaWNhbEdhdXNzaWFuQmx1ciIsZGVmaW5lczp7bjpKaSxDVUJFVVZfVEVYRUxfV0lEVEg6MS9lLENVQkVVVl9URVhFTF9IRUlHSFQ6MS90LENVQkVVVl9NQVhfTUlQOmAke3J9LjBgfSx1bmlmb3Jtczp7ZW52TWFwOnt2YWx1ZTpudWxsfSxzYW1wbGVzOnt2YWx1ZToxfSx3ZWlnaHRzOnt2YWx1ZTpufSxsYXRpdHVkaW5hbDp7dmFsdWU6ITF9LGRUaGV0YTp7dmFsdWU6MH0sbWlwSW50Ont2YWx1ZTowfSxwb2xlQXhpczp7dmFsdWU6aX19LHZlcnRleFNoYWRlcjpUaCgpLGZyYWdtZW50U2hhZGVyOmAKCgkJCXByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoJCQlwcmVjaXNpb24gbWVkaXVtcCBpbnQ7CgoJCQl2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjsKCgkJCXVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDsKCQkJdW5pZm9ybSBpbnQgc2FtcGxlczsKCQkJdW5pZm9ybSBmbG9hdCB3ZWlnaHRzWyBuIF07CgkJCXVuaWZvcm0gYm9vbCBsYXRpdHVkaW5hbDsKCQkJdW5pZm9ybSBmbG9hdCBkVGhldGE7CgkJCXVuaWZvcm0gZmxvYXQgbWlwSW50OwoJCQl1bmlmb3JtIHZlYzMgcG9sZUF4aXM7CgoJCQkjZGVmaW5lIEVOVk1BUF9UWVBFX0NVQkVfVVYKCQkJI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD4KCgkJCXZlYzMgZ2V0U2FtcGxlKCBmbG9hdCB0aGV0YSwgdmVjMyBheGlzICkgewoKCQkJCWZsb2F0IGNvc1RoZXRhID0gY29zKCB0aGV0YSApOwoJCQkJLy8gUm9kcmlndWVzJyBheGlzLWFuZ2xlIHJvdGF0aW9uCgkJCQl2ZWMzIHNhbXBsZURpcmVjdGlvbiA9IHZPdXRwdXREaXJlY3Rpb24gKiBjb3NUaGV0YQoJCQkJCSsgY3Jvc3MoIGF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKSAqIHNpbiggdGhldGEgKQoJCQkJCSsgYXhpcyAqIGRvdCggYXhpcywgdk91dHB1dERpcmVjdGlvbiApICogKCAxLjAgLSBjb3NUaGV0YSApOwoKCQkJCXJldHVybiBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXJlY3Rpb24sIG1pcEludCApOwoKCQkJfQoKCQkJdm9pZCBtYWluKCkgewoKCQkJCXZlYzMgYXhpcyA9IGxhdGl0dWRpbmFsID8gcG9sZUF4aXMgOiBjcm9zcyggcG9sZUF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKTsKCgkJCQlpZiAoIGFsbCggZXF1YWwoIGF4aXMsIHZlYzMoIDAuMCApICkgKSApIHsKCgkJCQkJYXhpcyA9IHZlYzMoIHZPdXRwdXREaXJlY3Rpb24ueiwgMC4wLCAtIHZPdXRwdXREaXJlY3Rpb24ueCApOwoKCQkJCX0KCgkJCQlheGlzID0gbm9ybWFsaXplKCBheGlzICk7CgoJCQkJZ2xfRnJhZ0NvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7CgkJCQlnbF9GcmFnQ29sb3IucmdiICs9IHdlaWdodHNbIDAgXSAqIGdldFNhbXBsZSggMC4wLCBheGlzICk7CgoJCQkJZm9yICggaW50IGkgPSAxOyBpIDwgbjsgaSsrICkgewoKCQkJCQlpZiAoIGkgPj0gc2FtcGxlcyApIHsKCgkJCQkJCWJyZWFrOwoKCQkJCQl9CgoJCQkJCWZsb2F0IHRoZXRhID0gZFRoZXRhICogZmxvYXQoIGkgKTsKCQkJCQlnbF9GcmFnQ29sb3IucmdiICs9IHdlaWdodHNbIGkgXSAqIGdldFNhbXBsZSggLTEuMCAqIHRoZXRhLCBheGlzICk7CgkJCQkJZ2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyBpIF0gKiBnZXRTYW1wbGUoIHRoZXRhLCBheGlzICk7CgoJCQkJfQoKCQkJfQoJCWAsYmxlbmRpbmc6Wm4sZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITF9KX1mdW5jdGlvbiBqZCgpe3JldHVybiBuZXcgSG4oe25hbWU6IkVxdWlyZWN0YW5ndWxhclRvQ3ViZVVWIix1bmlmb3Jtczp7ZW52TWFwOnt2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOlRoKCksZnJhZ21lbnRTaGFkZXI6YAoKCQkJcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7CgkJCXByZWNpc2lvbiBtZWRpdW1wIGludDsKCgkJCXZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uOwoKCQkJdW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwOwoKCQkJI2luY2x1ZGUgPGNvbW1vbj4KCgkJCXZvaWQgbWFpbigpIHsKCgkJCQl2ZWMzIG91dHB1dERpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdk91dHB1dERpcmVjdGlvbiApOwoJCQkJdmVjMiB1diA9IGVxdWlyZWN0VXYoIG91dHB1dERpcmVjdGlvbiApOwoKCQkJCWdsX0ZyYWdDb2xvciA9IHZlYzQoIHRleHR1cmUyRCAoIGVudk1hcCwgdXYgKS5yZ2IsIDEuMCApOwoKCQkJfQoJCWAsYmxlbmRpbmc6Wm4sZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITF9KX1mdW5jdGlvbiBlcCgpe3JldHVybiBuZXcgSG4oe25hbWU6IkN1YmVtYXBUb0N1YmVVViIsdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0sZmxpcEVudk1hcDp7dmFsdWU6LTF9fSx2ZXJ0ZXhTaGFkZXI6VGgoKSxmcmFnbWVudFNoYWRlcjpgCgoJCQlwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCQkJcHJlY2lzaW9uIG1lZGl1bXAgaW50OwoKCQkJdW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwOwoKCQkJdmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247CgoJCQl1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDsKCgkJCXZvaWQgbWFpbigpIHsKCgkJCQlnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogdk91dHB1dERpcmVjdGlvbi54LCB2T3V0cHV0RGlyZWN0aW9uLnl6ICkgKTsKCgkJCX0KCQlgLGJsZW5kaW5nOlpuLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExfSl9ZnVuY3Rpb24gVGgoKXtyZXR1cm5gCgoJCXByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoJCXByZWNpc2lvbiBtZWRpdW1wIGludDsKCgkJYXR0cmlidXRlIGZsb2F0IGZhY2VJbmRleDsKCgkJdmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247CgoJCS8vIFJIIGNvb3JkaW5hdGUgc3lzdGVtOyBQTVJFTSBmYWNlLWluZGV4aW5nIGNvbnZlbnRpb24KCQl2ZWMzIGdldERpcmVjdGlvbiggdmVjMiB1diwgZmxvYXQgZmFjZSApIHsKCgkJCXV2ID0gMi4wICogdXYgLSAxLjA7CgoJCQl2ZWMzIGRpcmVjdGlvbiA9IHZlYzMoIHV2LCAxLjAgKTsKCgkJCWlmICggZmFjZSA9PSAwLjAgKSB7CgoJCQkJZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsgLy8gKCAxLCB2LCB1ICkgcG9zIHgKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkgewoKCQkJCWRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7CgkJCQlkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtdSwgMSwgLXYgKSBwb3MgeQoKCQkJfSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7CgoJCQkJZGlyZWN0aW9uLnggKj0gLTEuMDsgLy8gKCAtdSwgdiwgMSApIHBvcyB6CgoJCQl9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHsKCgkJCQlkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4OwoJCQkJZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLTEsIHYsIC11ICkgbmVnIHgKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkgewoKCQkJCWRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7CgkJCQlkaXJlY3Rpb24ueHkgKj0gLTEuMDsgLy8gKCAtdSwgLTEsIHYgKSBuZWcgeQoKCQkJfSBlbHNlIGlmICggZmFjZSA9PSA1LjAgKSB7CgoJCQkJZGlyZWN0aW9uLnogKj0gLTEuMDsgLy8gKCB1LCB2LCAtMSApIG5lZyB6CgoJCQl9CgoJCQlyZXR1cm4gZGlyZWN0aW9uOwoKCQl9CgoJCXZvaWQgbWFpbigpIHsKCgkJCXZPdXRwdXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oIHV2LCBmYWNlSW5kZXggKTsKCQkJZ2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7CgoJCX0KCWB9ZnVuY3Rpb24ga3Yocil7bGV0IGU9bmV3IFdlYWtNYXAsdD1udWxsO2Z1bmN0aW9uIG4obyl7aWYobyYmby5pc1RleHR1cmUpe2NvbnN0IGw9by5tYXBwaW5nLGM9bD09PWJzfHxsPT09d3MsaD1sPT09S258fGw9PT15aTtpZihjfHxoKWlmKG8uaXNSZW5kZXJUYXJnZXRUZXh0dXJlJiZvLm5lZWRzUE1SRU1VcGRhdGU9PT0hMCl7by5uZWVkc1BNUkVNVXBkYXRlPSExO2xldCB1PWUuZ2V0KG8pO3JldHVybiB0PT09bnVsbCYmKHQ9bmV3IEFoKHIpKSx1PWM/dC5mcm9tRXF1aXJlY3Rhbmd1bGFyKG8sdSk6dC5mcm9tQ3ViZW1hcChvLHUpLGUuc2V0KG8sdSksdS50ZXh0dXJlfWVsc2V7aWYoZS5oYXMobykpcmV0dXJuIGUuZ2V0KG8pLnRleHR1cmU7e2NvbnN0IHU9by5pbWFnZTtpZihjJiZ1JiZ1LmhlaWdodD4wfHxoJiZ1JiZpKHUpKXt0PT09bnVsbCYmKHQ9bmV3IEFoKHIpKTtjb25zdCBmPWM/dC5mcm9tRXF1aXJlY3Rhbmd1bGFyKG8pOnQuZnJvbUN1YmVtYXAobyk7cmV0dXJuIGUuc2V0KG8sZiksby5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixzKSxmLnRleHR1cmV9ZWxzZSByZXR1cm4gbnVsbH19fXJldHVybiBvfWZ1bmN0aW9uIGkobyl7bGV0IGw9MDtjb25zdCBjPTY7Zm9yKGxldCBoPTA7aDxjO2grKylvW2hdIT09dm9pZCAwJiZsKys7cmV0dXJuIGw9PT1jfWZ1bmN0aW9uIHMobyl7Y29uc3QgbD1vLnRhcmdldDtsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHMpO2NvbnN0IGM9ZS5nZXQobCk7YyE9PXZvaWQgMCYmKGUuZGVsZXRlKGwpLGMuZGlzcG9zZSgpKX1mdW5jdGlvbiBhKCl7ZT1uZXcgV2Vha01hcCx0IT09bnVsbCYmKHQuZGlzcG9zZSgpLHQ9bnVsbCl9cmV0dXJue2dldDpuLGRpc3Bvc2U6YX19ZnVuY3Rpb24gR3Yocil7Y29uc3QgZT17fTtmdW5jdGlvbiB0KG4pe2lmKGVbbl0hPT12b2lkIDApcmV0dXJuIGVbbl07bGV0IGk7c3dpdGNoKG4pe2Nhc2UiV0VCR0xfZGVwdGhfdGV4dHVyZSI6aT1yLmdldEV4dGVuc2lvbigiV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHxyLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUiKXx8ci5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlIik7YnJlYWs7Y2FzZSJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiOmk9ci5nZXRFeHRlbnNpb24oIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpfHxyLmdldEV4dGVuc2lvbigiTU9aX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpfHxyLmdldEV4dGVuc2lvbigiV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO2JyZWFrO2Nhc2UiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiOmk9ci5nZXRFeHRlbnNpb24oIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fHIuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8ci5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpO2JyZWFrO2Nhc2UiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIjppPXIuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8ci5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKTticmVhaztkZWZhdWx0Omk9ci5nZXRFeHRlbnNpb24obil9cmV0dXJuIGVbbl09aSxpfXJldHVybntoYXM6ZnVuY3Rpb24obil7cmV0dXJuIHQobikhPT1udWxsfSxpbml0OmZ1bmN0aW9uKG4pe24uaXNXZWJHTDI/dCgiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpOih0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIiksdCgiT0VTX3RleHR1cmVfZmxvYXQiKSx0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksdCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIiKSx0KCJPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMiKSx0KCJPRVNfZWxlbWVudF9pbmRleF91aW50IiksdCgiT0VTX3ZlcnRleF9hcnJheV9vYmplY3QiKSx0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpLHQoIk9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciIpLHQoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpLHQoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpfSxnZXQ6ZnVuY3Rpb24obil7Y29uc3QgaT10KG4pO3JldHVybiBpPT09bnVsbCYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK24rIiBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4iKSxpfX19ZnVuY3Rpb24gVnYocixlLHQsbil7Y29uc3QgaT17fSxzPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIGEodSl7Y29uc3QgZj11LnRhcmdldDtmLmluZGV4IT09bnVsbCYmZS5yZW1vdmUoZi5pbmRleCk7Zm9yKGNvbnN0IHAgaW4gZi5hdHRyaWJ1dGVzKWUucmVtb3ZlKGYuYXR0cmlidXRlc1twXSk7Zm9yKGNvbnN0IHAgaW4gZi5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IF89Zi5tb3JwaEF0dHJpYnV0ZXNbcF07Zm9yKGxldCBnPTAsbT1fLmxlbmd0aDtnPG07ZysrKWUucmVtb3ZlKF9bZ10pfWYucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSksZGVsZXRlIGlbZi5pZF07Y29uc3QgZD1zLmdldChmKTtkJiYoZS5yZW1vdmUoZCkscy5kZWxldGUoZikpLG4ucmVsZWFzZVN0YXRlc09mR2VvbWV0cnkoZiksZi5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PT09ITAmJmRlbGV0ZSBmLl9tYXhJbnN0YW5jZUNvdW50LHQubWVtb3J5Lmdlb21ldHJpZXMtLX1mdW5jdGlvbiBvKHUsZil7cmV0dXJuIGlbZi5pZF09PT0hMHx8KGYuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSksaVtmLmlkXT0hMCx0Lm1lbW9yeS5nZW9tZXRyaWVzKyspLGZ9ZnVuY3Rpb24gbCh1KXtjb25zdCBmPXUuYXR0cmlidXRlcztmb3IoY29uc3QgcCBpbiBmKWUudXBkYXRlKGZbcF0sci5BUlJBWV9CVUZGRVIpO2NvbnN0IGQ9dS5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IHAgaW4gZCl7Y29uc3QgXz1kW3BdO2ZvcihsZXQgZz0wLG09Xy5sZW5ndGg7ZzxtO2crKyllLnVwZGF0ZShfW2ddLHIuQVJSQVlfQlVGRkVSKX19ZnVuY3Rpb24gYyh1KXtjb25zdCBmPVtdLGQ9dS5pbmRleCxwPXUuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgXz0wO2lmKGQhPT1udWxsKXtjb25zdCB5PWQuYXJyYXk7Xz1kLnZlcnNpb247Zm9yKGxldCB4PTAsdj15Lmxlbmd0aDt4PHY7eCs9Myl7Y29uc3QgUz15W3grMF0sYj15W3grMV0sQT15W3grMl07Zi5wdXNoKFMsYixiLEEsQSxTKX19ZWxzZSBpZihwIT09dm9pZCAwKXtjb25zdCB5PXAuYXJyYXk7Xz1wLnZlcnNpb247Zm9yKGxldCB4PTAsdj15Lmxlbmd0aC8zLTE7eDx2O3grPTMpe2NvbnN0IFM9eCswLGI9eCsxLEE9eCsyO2YucHVzaChTLGIsYixBLEEsUyl9fWVsc2UgcmV0dXJuO2NvbnN0IGc9bmV3KHdkKGYpP3hoOl9oKShmLDEpO2cudmVyc2lvbj1fO2NvbnN0IG09cy5nZXQodSk7bSYmZS5yZW1vdmUobSkscy5zZXQodSxnKX1mdW5jdGlvbiBoKHUpe2NvbnN0IGY9cy5nZXQodSk7aWYoZil7Y29uc3QgZD11LmluZGV4O2QhPT1udWxsJiZmLnZlcnNpb248ZC52ZXJzaW9uJiZjKHUpfWVsc2UgYyh1KTtyZXR1cm4gcy5nZXQodSl9cmV0dXJue2dldDpvLHVwZGF0ZTpsLGdldFdpcmVmcmFtZUF0dHJpYnV0ZTpofX1mdW5jdGlvbiBIdihyLGUsdCxuKXtjb25zdCBpPW4uaXNXZWJHTDI7bGV0IHM7ZnVuY3Rpb24gYShkKXtzPWR9bGV0IG8sbDtmdW5jdGlvbiBjKGQpe289ZC50eXBlLGw9ZC5ieXRlc1BlckVsZW1lbnR9ZnVuY3Rpb24gaChkLHApe3IuZHJhd0VsZW1lbnRzKHMscCxvLGQqbCksdC51cGRhdGUocCxzLDEpfWZ1bmN0aW9uIHUoZCxwLF8pe2lmKF89PT0wKXJldHVybjtsZXQgZyxtO2lmKGkpZz1yLG09ImRyYXdFbGVtZW50c0luc3RhbmNlZCI7ZWxzZSBpZihnPWUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiksbT0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLGc9PT1udWxsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7cmV0dXJufWdbbV0ocyxwLG8sZCpsLF8pLHQudXBkYXRlKHAscyxfKX1mdW5jdGlvbiBmKGQscCxfKXtpZihfPT09MClyZXR1cm47Y29uc3QgZz1lLmdldCgiV0VCR0xfbXVsdGlfZHJhdyIpO2lmKGc9PT1udWxsKWZvcihsZXQgbT0wO208XzttKyspdGhpcy5yZW5kZXIoZFttXS9sLHBbbV0pO2Vsc2V7Zy5tdWx0aURyYXdFbGVtZW50c1dFQkdMKHMscCwwLG8sZCwwLF8pO2xldCBtPTA7Zm9yKGxldCB5PTA7eTxfO3krKyltKz1wW3ldO3QudXBkYXRlKG0scywxKX19dGhpcy5zZXRNb2RlPWEsdGhpcy5zZXRJbmRleD1jLHRoaXMucmVuZGVyPWgsdGhpcy5yZW5kZXJJbnN0YW5jZXM9dSx0aGlzLnJlbmRlck11bHRpRHJhdz1mfWZ1bmN0aW9uIFd2KHIpe2NvbnN0IGU9e2dlb21ldHJpZXM6MCx0ZXh0dXJlczowfSx0PXtmcmFtZTowLGNhbGxzOjAsdHJpYW5nbGVzOjAscG9pbnRzOjAsbGluZXM6MH07ZnVuY3Rpb24gbihzLGEsbyl7c3dpdGNoKHQuY2FsbHMrKyxhKXtjYXNlIHIuVFJJQU5HTEVTOnQudHJpYW5nbGVzKz1vKihzLzMpO2JyZWFrO2Nhc2Ugci5MSU5FUzp0LmxpbmVzKz1vKihzLzIpO2JyZWFrO2Nhc2Ugci5MSU5FX1NUUklQOnQubGluZXMrPW8qKHMtMSk7YnJlYWs7Y2FzZSByLkxJTkVfTE9PUDp0LmxpbmVzKz1vKnM7YnJlYWs7Y2FzZSByLlBPSU5UUzp0LnBvaW50cys9bypzO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLGEpO2JyZWFrfX1mdW5jdGlvbiBpKCl7dC5jYWxscz0wLHQudHJpYW5nbGVzPTAsdC5wb2ludHM9MCx0LmxpbmVzPTB9cmV0dXJue21lbW9yeTplLHJlbmRlcjp0LHByb2dyYW1zOm51bGwsYXV0b1Jlc2V0OiEwLHJlc2V0OmksdXBkYXRlOm59fWZ1bmN0aW9uIFh2KHIsZSl7cmV0dXJuIHJbMF0tZVswXX1mdW5jdGlvbiBxdihyLGUpe3JldHVybiBNYXRoLmFicyhlWzFdKS1NYXRoLmFicyhyWzFdKX1mdW5jdGlvbiAkdihyLGUsdCl7Y29uc3Qgbj17fSxpPW5ldyBGbG9hdDMyQXJyYXkoOCkscz1uZXcgV2Vha01hcCxhPW5ldyBsdCxvPVtdO2ZvcihsZXQgYz0wO2M8ODtjKyspb1tjXT1bYywwXTtmdW5jdGlvbiBsKGMsaCx1KXtjb25zdCBmPWMubW9ycGhUYXJnZXRJbmZsdWVuY2VzO2lmKGUuaXNXZWJHTDI9PT0hMCl7Y29uc3QgZD1oLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbnx8aC5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsfHxoLm1vcnBoQXR0cmlidXRlcy5jb2xvcixwPWQhPT12b2lkIDA/ZC5sZW5ndGg6MDtsZXQgXz1zLmdldChoKTtpZihfPT09dm9pZCAwfHxfLmNvdW50IT09cCl7bGV0IEk9ZnVuY3Rpb24oKXtOLmRpc3Bvc2UoKSxzLmRlbGV0ZShoKSxoLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLEkpfTtfIT09dm9pZCAwJiZfLnRleHR1cmUuZGlzcG9zZSgpO2NvbnN0IHk9aC5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDAseD1oLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwhPT12b2lkIDAsdj1oLm1vcnBoQXR0cmlidXRlcy5jb2xvciE9PXZvaWQgMCxTPWgubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9ufHxbXSxiPWgubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbHx8W10sQT1oLm1vcnBoQXR0cmlidXRlcy5jb2xvcnx8W107bGV0IEw9MDt5PT09ITAmJihMPTEpLHg9PT0hMCYmKEw9Miksdj09PSEwJiYoTD0zKTtsZXQgTT1oLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQqTCx3PTE7TT5lLm1heFRleHR1cmVTaXplJiYodz1NYXRoLmNlaWwoTS9lLm1heFRleHR1cmVTaXplKSxNPWUubWF4VGV4dHVyZVNpemUpO2NvbnN0IFI9bmV3IEZsb2F0MzJBcnJheShNKncqNCpwKSxOPW5ldyBKYShSLE0sdyxwKTtOLnR5cGU9Um4sTi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBCPUwqNDtmb3IobGV0IFU9MDtVPHA7VSsrKXtjb25zdCB6PVNbVV0sRj1iW1VdLFo9QVtVXSxWPU0qdyo0KlU7Zm9yKGxldCBRPTA7UTx6LmNvdW50O1ErKyl7Y29uc3QgbmU9USpCO3k9PT0hMCYmKGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh6LFEpLFJbVituZSswXT1hLngsUltWK25lKzFdPWEueSxSW1YrbmUrMl09YS56LFJbVituZSszXT0wKSx4PT09ITAmJihhLmZyb21CdWZmZXJBdHRyaWJ1dGUoRixRKSxSW1YrbmUrNF09YS54LFJbVituZSs1XT1hLnksUltWK25lKzZdPWEueixSW1YrbmUrN109MCksdj09PSEwJiYoYS5mcm9tQnVmZmVyQXR0cmlidXRlKFosUSksUltWK25lKzhdPWEueCxSW1YrbmUrOV09YS55LFJbVituZSsxMF09YS56LFJbVituZSsxMV09Wi5pdGVtU2l6ZT09PTQ/YS53OjEpfX1fPXtjb3VudDpwLHRleHR1cmU6TixzaXplOm5ldyBxKE0sdyl9LHMuc2V0KGgsXyksaC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixJKX1sZXQgZz0wO2ZvcihsZXQgeT0wO3k8Zi5sZW5ndGg7eSsrKWcrPWZbeV07Y29uc3QgbT1oLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPzE6MS1nO3UuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShyLCJtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2UiLG0pLHUuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShyLCJtb3JwaFRhcmdldEluZmx1ZW5jZXMiLGYpLHUuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShyLCJtb3JwaFRhcmdldHNUZXh0dXJlIixfLnRleHR1cmUsdCksdS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKHIsIm1vcnBoVGFyZ2V0c1RleHR1cmVTaXplIixfLnNpemUpfWVsc2V7Y29uc3QgZD1mPT09dm9pZCAwPzA6Zi5sZW5ndGg7bGV0IHA9bltoLmlkXTtpZihwPT09dm9pZCAwfHxwLmxlbmd0aCE9PWQpe3A9W107Zm9yKGxldCB4PTA7eDxkO3grKylwW3hdPVt4LDBdO25baC5pZF09cH1mb3IobGV0IHg9MDt4PGQ7eCsrKXtjb25zdCB2PXBbeF07dlswXT14LHZbMV09Zlt4XX1wLnNvcnQocXYpO2ZvcihsZXQgeD0wO3g8ODt4KyspeDxkJiZwW3hdWzFdPyhvW3hdWzBdPXBbeF1bMF0sb1t4XVsxXT1wW3hdWzFdKToob1t4XVswXT1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUixvW3hdWzFdPTApO28uc29ydChYdik7Y29uc3QgXz1oLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixnPWgubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtsZXQgbT0wO2ZvcihsZXQgeD0wO3g8ODt4Kyspe2NvbnN0IHY9b1t4XSxTPXZbMF0sYj12WzFdO1MhPT1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUiYmYj8oXyYmaC5nZXRBdHRyaWJ1dGUoIm1vcnBoVGFyZ2V0Iit4KSE9PV9bU10mJmguc2V0QXR0cmlidXRlKCJtb3JwaFRhcmdldCIreCxfW1NdKSxnJiZoLmdldEF0dHJpYnV0ZSgibW9ycGhOb3JtYWwiK3gpIT09Z1tTXSYmaC5zZXRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIit4LGdbU10pLGlbeF09YixtKz1iKTooXyYmaC5oYXNBdHRyaWJ1dGUoIm1vcnBoVGFyZ2V0Iit4KT09PSEwJiZoLmRlbGV0ZUF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK3gpLGcmJmguaGFzQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIreCk9PT0hMCYmaC5kZWxldGVBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIit4KSxpW3hdPTApfWNvbnN0IHk9aC5tb3JwaFRhcmdldHNSZWxhdGl2ZT8xOjEtbTt1LmdldFVuaWZvcm1zKCkuc2V0VmFsdWUociwibW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlIix5KSx1LmdldFVuaWZvcm1zKCkuc2V0VmFsdWUociwibW9ycGhUYXJnZXRJbmZsdWVuY2VzIixpKX19cmV0dXJue3VwZGF0ZTpsfX1mdW5jdGlvbiBZdihyLGUsdCxuKXtsZXQgaT1uZXcgV2Vha01hcDtmdW5jdGlvbiBzKGwpe2NvbnN0IGM9bi5yZW5kZXIuZnJhbWUsaD1sLmdlb21ldHJ5LHU9ZS5nZXQobCxoKTtpZihpLmdldCh1KSE9PWMmJihlLnVwZGF0ZSh1KSxpLnNldCh1LGMpKSxsLmlzSW5zdGFuY2VkTWVzaCYmKGwuaGFzRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbyk9PT0hMSYmbC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixvKSxpLmdldChsKSE9PWMmJih0LnVwZGF0ZShsLmluc3RhbmNlTWF0cml4LHIuQVJSQVlfQlVGRkVSKSxsLmluc3RhbmNlQ29sb3IhPT1udWxsJiZ0LnVwZGF0ZShsLmluc3RhbmNlQ29sb3Isci5BUlJBWV9CVUZGRVIpLGkuc2V0KGwsYykpKSxsLmlzU2tpbm5lZE1lc2gpe2NvbnN0IGY9bC5za2VsZXRvbjtpLmdldChmKSE9PWMmJihmLnVwZGF0ZSgpLGkuc2V0KGYsYykpfXJldHVybiB1fWZ1bmN0aW9uIGEoKXtpPW5ldyBXZWFrTWFwfWZ1bmN0aW9uIG8obCl7Y29uc3QgYz1sLnRhcmdldDtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLG8pLHQucmVtb3ZlKGMuaW5zdGFuY2VNYXRyaXgpLGMuaW5zdGFuY2VDb2xvciE9PW51bGwmJnQucmVtb3ZlKGMuaW5zdGFuY2VDb2xvcil9cmV0dXJue3VwZGF0ZTpzLGRpc3Bvc2U6YX19Y2xhc3MgQ2ggZXh0ZW5kcyBFdHtjb25zdHJ1Y3RvcihlLHQsbixpLHMsYSxvLGwsYyxoKXtpZihoPWghPT12b2lkIDA/aDpTaSxoIT09U2kmJmghPT16aSl0aHJvdyBuZXcgRXJyb3IoIkRlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0Iik7bj09PXZvaWQgMCYmaD09PVNpJiYobj1qbiksbj09PXZvaWQgMCYmaD09PXppJiYobj1NaSksc3VwZXIobnVsbCxpLHMsYSxvLGwsaCxuLGMpLHRoaXMuaXNEZXB0aFRleHR1cmU9ITAsdGhpcy5pbWFnZT17d2lkdGg6ZSxoZWlnaHQ6dH0sdGhpcy5tYWdGaWx0ZXI9byE9PXZvaWQgMD9vOmJ0LHRoaXMubWluRmlsdGVyPWwhPT12b2lkIDA/bDpidCx0aGlzLmZsaXBZPSExLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuY29tcGFyZUZ1bmN0aW9uPW51bGx9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLmNvbXBhcmVGdW5jdGlvbj1lLmNvbXBhcmVGdW5jdGlvbix0aGlzfXRvSlNPTihlKXtjb25zdCB0PXN1cGVyLnRvSlNPTihlKTtyZXR1cm4gdGhpcy5jb21wYXJlRnVuY3Rpb24hPT1udWxsJiYodC5jb21wYXJlRnVuY3Rpb249dGhpcy5jb21wYXJlRnVuY3Rpb24pLHR9fWNvbnN0IHRwPW5ldyBFdCxucD1uZXcgQ2goMSwxKTtucC5jb21wYXJlRnVuY3Rpb249S2M7Y29uc3QgaXA9bmV3IEphLHJwPW5ldyBzaCxzcD1uZXcgWHMsYXA9W10sb3A9W10sbHA9bmV3IEZsb2F0MzJBcnJheSgxNiksY3A9bmV3IEZsb2F0MzJBcnJheSg5KSxocD1uZXcgRmxvYXQzMkFycmF5KDQpO2Z1bmN0aW9uICRyKHIsZSx0KXtjb25zdCBuPXJbMF07aWYobjw9MHx8bj4wKXJldHVybiByO2NvbnN0IGk9ZSp0O2xldCBzPWFwW2ldO2lmKHM9PT12b2lkIDAmJihzPW5ldyBGbG9hdDMyQXJyYXkoaSksYXBbaV09cyksZSE9PTApe24udG9BcnJheShzLDApO2ZvcihsZXQgYT0xLG89MDthIT09ZTsrK2Epbys9dCxyW2FdLnRvQXJyYXkocyxvKX1yZXR1cm4gc31mdW5jdGlvbiBJdChyLGUpe2lmKHIubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCB0PTAsbj1yLmxlbmd0aDt0PG47dCsrKWlmKHJbdF0hPT1lW3RdKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIFV0KHIsZSl7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXJbdF09ZVt0XX1mdW5jdGlvbiBTbyhyLGUpe2xldCB0PW9wW2VdO3Q9PT12b2lkIDAmJih0PW5ldyBJbnQzMkFycmF5KGUpLG9wW2VdPXQpO2ZvcihsZXQgbj0wO24hPT1lOysrbil0W25dPXIuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO3JldHVybiB0fWZ1bmN0aW9uIFp2KHIsZSl7Y29uc3QgdD10aGlzLmNhY2hlO3RbMF0hPT1lJiYoci51bmlmb3JtMWYodGhpcy5hZGRyLGUpLHRbMF09ZSl9ZnVuY3Rpb24gSnYocixlKXtjb25zdCB0PXRoaXMuY2FjaGU7aWYoZS54IT09dm9pZCAwKSh0WzBdIT09ZS54fHx0WzFdIT09ZS55KSYmKHIudW5pZm9ybTJmKHRoaXMuYWRkcixlLngsZS55KSx0WzBdPWUueCx0WzFdPWUueSk7ZWxzZXtpZihJdCh0LGUpKXJldHVybjtyLnVuaWZvcm0yZnYodGhpcy5hZGRyLGUpLFV0KHQsZSl9fWZ1bmN0aW9uIEt2KHIsZSl7Y29uc3QgdD10aGlzLmNhY2hlO2lmKGUueCE9PXZvaWQgMCkodFswXSE9PWUueHx8dFsxXSE9PWUueXx8dFsyXSE9PWUueikmJihyLnVuaWZvcm0zZih0aGlzLmFkZHIsZS54LGUueSxlLnopLHRbMF09ZS54LHRbMV09ZS55LHRbMl09ZS56KTtlbHNlIGlmKGUuciE9PXZvaWQgMCkodFswXSE9PWUucnx8dFsxXSE9PWUuZ3x8dFsyXSE9PWUuYikmJihyLnVuaWZvcm0zZih0aGlzLmFkZHIsZS5yLGUuZyxlLmIpLHRbMF09ZS5yLHRbMV09ZS5nLHRbMl09ZS5iKTtlbHNle2lmKEl0KHQsZSkpcmV0dXJuO3IudW5pZm9ybTNmdih0aGlzLmFkZHIsZSksVXQodCxlKX19ZnVuY3Rpb24gUXYocixlKXtjb25zdCB0PXRoaXMuY2FjaGU7aWYoZS54IT09dm9pZCAwKSh0WzBdIT09ZS54fHx0WzFdIT09ZS55fHx0WzJdIT09ZS56fHx0WzNdIT09ZS53KSYmKHIudW5pZm9ybTRmKHRoaXMuYWRkcixlLngsZS55LGUueixlLncpLHRbMF09ZS54LHRbMV09ZS55LHRbMl09ZS56LHRbM109ZS53KTtlbHNle2lmKEl0KHQsZSkpcmV0dXJuO3IudW5pZm9ybTRmdih0aGlzLmFkZHIsZSksVXQodCxlKX19ZnVuY3Rpb24ganYocixlKXtjb25zdCB0PXRoaXMuY2FjaGUsbj1lLmVsZW1lbnRzO2lmKG49PT12b2lkIDApe2lmKEl0KHQsZSkpcmV0dXJuO3IudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsZSksVXQodCxlKX1lbHNle2lmKEl0KHQsbikpcmV0dXJuO2hwLnNldChuKSxyLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLGhwKSxVdCh0LG4pfX1mdW5jdGlvbiBlTShyLGUpe2NvbnN0IHQ9dGhpcy5jYWNoZSxuPWUuZWxlbWVudHM7aWYobj09PXZvaWQgMCl7aWYoSXQodCxlKSlyZXR1cm47ci51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxlKSxVdCh0LGUpfWVsc2V7aWYoSXQodCxuKSlyZXR1cm47Y3Auc2V0KG4pLHIudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsY3ApLFV0KHQsbil9fWZ1bmN0aW9uIHRNKHIsZSl7Y29uc3QgdD10aGlzLmNhY2hlLG49ZS5lbGVtZW50cztpZihuPT09dm9pZCAwKXtpZihJdCh0LGUpKXJldHVybjtyLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLGUpLFV0KHQsZSl9ZWxzZXtpZihJdCh0LG4pKXJldHVybjtscC5zZXQobiksci51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxscCksVXQodCxuKX19ZnVuY3Rpb24gbk0ocixlKXtjb25zdCB0PXRoaXMuY2FjaGU7dFswXSE9PWUmJihyLnVuaWZvcm0xaSh0aGlzLmFkZHIsZSksdFswXT1lKX1mdW5jdGlvbiBpTShyLGUpe2NvbnN0IHQ9dGhpcy5jYWNoZTtpZihlLnghPT12b2lkIDApKHRbMF0hPT1lLnh8fHRbMV0hPT1lLnkpJiYoci51bmlmb3JtMmkodGhpcy5hZGRyLGUueCxlLnkpLHRbMF09ZS54LHRbMV09ZS55KTtlbHNle2lmKEl0KHQsZSkpcmV0dXJuO3IudW5pZm9ybTJpdih0aGlzLmFkZHIsZSksVXQodCxlKX19ZnVuY3Rpb24gck0ocixlKXtjb25zdCB0PXRoaXMuY2FjaGU7aWYoZS54IT09dm9pZCAwKSh0WzBdIT09ZS54fHx0WzFdIT09ZS55fHx0WzJdIT09ZS56KSYmKHIudW5pZm9ybTNpKHRoaXMuYWRkcixlLngsZS55LGUueiksdFswXT1lLngsdFsxXT1lLnksdFsyXT1lLnopO2Vsc2V7aWYoSXQodCxlKSlyZXR1cm47ci51bmlmb3JtM2l2KHRoaXMuYWRkcixlKSxVdCh0LGUpfX1mdW5jdGlvbiBzTShyLGUpe2NvbnN0IHQ9dGhpcy5jYWNoZTtpZihlLnghPT12b2lkIDApKHRbMF0hPT1lLnh8fHRbMV0hPT1lLnl8fHRbMl0hPT1lLnp8fHRbM10hPT1lLncpJiYoci51bmlmb3JtNGkodGhpcy5hZGRyLGUueCxlLnksZS56LGUudyksdFswXT1lLngsdFsxXT1lLnksdFsyXT1lLnosdFszXT1lLncpO2Vsc2V7aWYoSXQodCxlKSlyZXR1cm47ci51bmlmb3JtNGl2KHRoaXMuYWRkcixlKSxVdCh0LGUpfX1mdW5jdGlvbiBhTShyLGUpe2NvbnN0IHQ9dGhpcy5jYWNoZTt0WzBdIT09ZSYmKHIudW5pZm9ybTF1aSh0aGlzLmFkZHIsZSksdFswXT1lKX1mdW5jdGlvbiBvTShyLGUpe2NvbnN0IHQ9dGhpcy5jYWNoZTtpZihlLnghPT12b2lkIDApKHRbMF0hPT1lLnh8fHRbMV0hPT1lLnkpJiYoci51bmlmb3JtMnVpKHRoaXMuYWRkcixlLngsZS55KSx0WzBdPWUueCx0WzFdPWUueSk7ZWxzZXtpZihJdCh0LGUpKXJldHVybjtyLnVuaWZvcm0ydWl2KHRoaXMuYWRkcixlKSxVdCh0LGUpfX1mdW5jdGlvbiBsTShyLGUpe2NvbnN0IHQ9dGhpcy5jYWNoZTtpZihlLnghPT12b2lkIDApKHRbMF0hPT1lLnh8fHRbMV0hPT1lLnl8fHRbMl0hPT1lLnopJiYoci51bmlmb3JtM3VpKHRoaXMuYWRkcixlLngsZS55LGUueiksdFswXT1lLngsdFsxXT1lLnksdFsyXT1lLnopO2Vsc2V7aWYoSXQodCxlKSlyZXR1cm47ci51bmlmb3JtM3Vpdih0aGlzLmFkZHIsZSksVXQodCxlKX19ZnVuY3Rpb24gY00ocixlKXtjb25zdCB0PXRoaXMuY2FjaGU7aWYoZS54IT09dm9pZCAwKSh0WzBdIT09ZS54fHx0WzFdIT09ZS55fHx0WzJdIT09ZS56fHx0WzNdIT09ZS53KSYmKHIudW5pZm9ybTR1aSh0aGlzLmFkZHIsZS54LGUueSxlLnosZS53KSx0WzBdPWUueCx0WzFdPWUueSx0WzJdPWUueix0WzNdPWUudyk7ZWxzZXtpZihJdCh0LGUpKXJldHVybjtyLnVuaWZvcm00dWl2KHRoaXMuYWRkcixlKSxVdCh0LGUpfX1mdW5jdGlvbiBoTShyLGUsdCl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9dC5hbGxvY2F0ZVRleHR1cmVVbml0KCk7blswXSE9PWkmJihyLnVuaWZvcm0xaSh0aGlzLmFkZHIsaSksblswXT1pKTtjb25zdCBzPXRoaXMudHlwZT09PXIuU0FNUExFUl8yRF9TSEFET1c/bnA6dHA7dC5zZXRUZXh0dXJlMkQoZXx8cyxpKX1mdW5jdGlvbiB1TShyLGUsdCl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9dC5hbGxvY2F0ZVRleHR1cmVVbml0KCk7blswXSE9PWkmJihyLnVuaWZvcm0xaSh0aGlzLmFkZHIsaSksblswXT1pKSx0LnNldFRleHR1cmUzRChlfHxycCxpKX1mdW5jdGlvbiBmTShyLGUsdCl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9dC5hbGxvY2F0ZVRleHR1cmVVbml0KCk7blswXSE9PWkmJihyLnVuaWZvcm0xaSh0aGlzLmFkZHIsaSksblswXT1pKSx0LnNldFRleHR1cmVDdWJlKGV8fHNwLGkpfWZ1bmN0aW9uIGRNKHIsZSx0KXtjb25zdCBuPXRoaXMuY2FjaGUsaT10LmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtuWzBdIT09aSYmKHIudW5pZm9ybTFpKHRoaXMuYWRkcixpKSxuWzBdPWkpLHQuc2V0VGV4dHVyZTJEQXJyYXkoZXx8aXAsaSl9ZnVuY3Rpb24gcE0ocil7c3dpdGNoKHIpe2Nhc2UgNTEyNjpyZXR1cm4gWnY7Y2FzZSAzNTY2NDpyZXR1cm4gSnY7Y2FzZSAzNTY2NTpyZXR1cm4gS3Y7Y2FzZSAzNTY2NjpyZXR1cm4gUXY7Y2FzZSAzNTY3NDpyZXR1cm4ganY7Y2FzZSAzNTY3NTpyZXR1cm4gZU07Y2FzZSAzNTY3NjpyZXR1cm4gdE07Y2FzZSA1MTI0OmNhc2UgMzU2NzA6cmV0dXJuIG5NO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gaU07Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiByTTtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIHNNO2Nhc2UgNTEyNTpyZXR1cm4gYU07Y2FzZSAzNjI5NDpyZXR1cm4gb007Y2FzZSAzNjI5NTpyZXR1cm4gbE07Y2FzZSAzNjI5NjpyZXR1cm4gY007Y2FzZSAzNTY3ODpjYXNlIDM2MTk4OmNhc2UgMzYyOTg6Y2FzZSAzNjMwNjpjYXNlIDM1NjgyOnJldHVybiBoTTtjYXNlIDM1Njc5OmNhc2UgMzYyOTk6Y2FzZSAzNjMwNzpyZXR1cm4gdU07Y2FzZSAzNTY4MDpjYXNlIDM2MzAwOmNhc2UgMzYzMDg6Y2FzZSAzNjI5MzpyZXR1cm4gZk07Y2FzZSAzNjI4OTpjYXNlIDM2MzAzOmNhc2UgMzYzMTE6Y2FzZSAzNjI5MjpyZXR1cm4gZE19fWZ1bmN0aW9uIG1NKHIsZSl7ci51bmlmb3JtMWZ2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBnTShyLGUpe2NvbnN0IHQ9JHIoZSx0aGlzLnNpemUsMik7ci51bmlmb3JtMmZ2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiBfTShyLGUpe2NvbnN0IHQ9JHIoZSx0aGlzLnNpemUsMyk7ci51bmlmb3JtM2Z2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiB4TShyLGUpe2NvbnN0IHQ9JHIoZSx0aGlzLnNpemUsNCk7ci51bmlmb3JtNGZ2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiB5TShyLGUpe2NvbnN0IHQ9JHIoZSx0aGlzLnNpemUsNCk7ci51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSx0KX1mdW5jdGlvbiB2TShyLGUpe2NvbnN0IHQ9JHIoZSx0aGlzLnNpemUsOSk7ci51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSx0KX1mdW5jdGlvbiBNTShyLGUpe2NvbnN0IHQ9JHIoZSx0aGlzLnNpemUsMTYpO3IudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsdCl9ZnVuY3Rpb24gU00ocixlKXtyLnVuaWZvcm0xaXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIGJNKHIsZSl7ci51bmlmb3JtMml2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiB3TShyLGUpe3IudW5pZm9ybTNpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gRU0ocixlKXtyLnVuaWZvcm00aXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIEFNKHIsZSl7ci51bmlmb3JtMXVpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gVE0ocixlKXtyLnVuaWZvcm0ydWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBDTShyLGUpe3IudW5pZm9ybTN1aXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIFJNKHIsZSl7ci51bmlmb3JtNHVpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gUE0ocixlLHQpe2NvbnN0IG49dGhpcy5jYWNoZSxpPWUubGVuZ3RoLHM9U28odCxpKTtJdChuLHMpfHwoci51bmlmb3JtMWl2KHRoaXMuYWRkcixzKSxVdChuLHMpKTtmb3IobGV0IGE9MDthIT09aTsrK2EpdC5zZXRUZXh0dXJlMkQoZVthXXx8dHAsc1thXSl9ZnVuY3Rpb24gTE0ocixlLHQpe2NvbnN0IG49dGhpcy5jYWNoZSxpPWUubGVuZ3RoLHM9U28odCxpKTtJdChuLHMpfHwoci51bmlmb3JtMWl2KHRoaXMuYWRkcixzKSxVdChuLHMpKTtmb3IobGV0IGE9MDthIT09aTsrK2EpdC5zZXRUZXh0dXJlM0QoZVthXXx8cnAsc1thXSl9ZnVuY3Rpb24gSU0ocixlLHQpe2NvbnN0IG49dGhpcy5jYWNoZSxpPWUubGVuZ3RoLHM9U28odCxpKTtJdChuLHMpfHwoci51bmlmb3JtMWl2KHRoaXMuYWRkcixzKSxVdChuLHMpKTtmb3IobGV0IGE9MDthIT09aTsrK2EpdC5zZXRUZXh0dXJlQ3ViZShlW2FdfHxzcCxzW2FdKX1mdW5jdGlvbiBVTShyLGUsdCl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9ZS5sZW5ndGgscz1Tbyh0LGkpO0l0KG4scyl8fChyLnVuaWZvcm0xaXYodGhpcy5hZGRyLHMpLFV0KG4scykpO2ZvcihsZXQgYT0wO2EhPT1pOysrYSl0LnNldFRleHR1cmUyREFycmF5KGVbYV18fGlwLHNbYV0pfWZ1bmN0aW9uIERNKHIpe3N3aXRjaChyKXtjYXNlIDUxMjY6cmV0dXJuIG1NO2Nhc2UgMzU2NjQ6cmV0dXJuIGdNO2Nhc2UgMzU2NjU6cmV0dXJuIF9NO2Nhc2UgMzU2NjY6cmV0dXJuIHhNO2Nhc2UgMzU2NzQ6cmV0dXJuIHlNO2Nhc2UgMzU2NzU6cmV0dXJuIHZNO2Nhc2UgMzU2NzY6cmV0dXJuIE1NO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBTTTtjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuIGJNO2Nhc2UgMzU2Njg6Y2FzZSAzNTY3MjpyZXR1cm4gd007Y2FzZSAzNTY2OTpjYXNlIDM1NjczOnJldHVybiBFTTtjYXNlIDUxMjU6cmV0dXJuIEFNO2Nhc2UgMzYyOTQ6cmV0dXJuIFRNO2Nhc2UgMzYyOTU6cmV0dXJuIENNO2Nhc2UgMzYyOTY6cmV0dXJuIFJNO2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpjYXNlIDM2Mjk4OmNhc2UgMzYzMDY6Y2FzZSAzNTY4MjpyZXR1cm4gUE07Y2FzZSAzNTY3OTpjYXNlIDM2Mjk5OmNhc2UgMzYzMDc6cmV0dXJuIExNO2Nhc2UgMzU2ODA6Y2FzZSAzNjMwMDpjYXNlIDM2MzA4OmNhc2UgMzYyOTM6cmV0dXJuIElNO2Nhc2UgMzYyODk6Y2FzZSAzNjMwMzpjYXNlIDM2MzExOmNhc2UgMzYyOTI6cmV0dXJuIFVNfX1jbGFzcyBOTXtjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5pZD1lLHRoaXMuYWRkcj1uLHRoaXMuY2FjaGU9W10sdGhpcy50eXBlPXQudHlwZSx0aGlzLnNldFZhbHVlPXBNKHQudHlwZSl9fWNsYXNzIEZNe2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLmlkPWUsdGhpcy5hZGRyPW4sdGhpcy5jYWNoZT1bXSx0aGlzLnR5cGU9dC50eXBlLHRoaXMuc2l6ZT10LnNpemUsdGhpcy5zZXRWYWx1ZT1ETSh0LnR5cGUpfX1jbGFzcyBPTXtjb25zdHJ1Y3RvcihlKXt0aGlzLmlkPWUsdGhpcy5zZXE9W10sdGhpcy5tYXA9e319c2V0VmFsdWUoZSx0LG4pe2NvbnN0IGk9dGhpcy5zZXE7Zm9yKGxldCBzPTAsYT1pLmxlbmd0aDtzIT09YTsrK3Mpe2NvbnN0IG89aVtzXTtvLnNldFZhbHVlKGUsdFtvLmlkXSxuKX19fWNvbnN0IFJoPS8oXHcrKShcXSk/KFxbfFwuKT8vZztmdW5jdGlvbiB1cChyLGUpe3Iuc2VxLnB1c2goZSksci5tYXBbZS5pZF09ZX1mdW5jdGlvbiBCTShyLGUsdCl7Y29uc3Qgbj1yLm5hbWUsaT1uLmxlbmd0aDtmb3IoUmgubGFzdEluZGV4PTA7Oyl7Y29uc3Qgcz1SaC5leGVjKG4pLGE9UmgubGFzdEluZGV4O2xldCBvPXNbMV07Y29uc3QgbD1zWzJdPT09Il0iLGM9c1szXTtpZihsJiYobz1vfDApLGM9PT12b2lkIDB8fGM9PT0iWyImJmErMj09PWkpe3VwKHQsYz09PXZvaWQgMD9uZXcgTk0obyxyLGUpOm5ldyBGTShvLHIsZSkpO2JyZWFrfWVsc2V7bGV0IHU9dC5tYXBbb107dT09PXZvaWQgMCYmKHU9bmV3IE9NKG8pLHVwKHQsdSkpLHQ9dX19fWNsYXNzIGJve2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5zZXE9W10sdGhpcy5tYXA9e307Y29uc3Qgbj1lLmdldFByb2dyYW1QYXJhbWV0ZXIodCxlLkFDVElWRV9VTklGT1JNUyk7Zm9yKGxldCBpPTA7aTxuOysraSl7Y29uc3Qgcz1lLmdldEFjdGl2ZVVuaWZvcm0odCxpKSxhPWUuZ2V0VW5pZm9ybUxvY2F0aW9uKHQscy5uYW1lKTtCTShzLGEsdGhpcyl9fXNldFZhbHVlKGUsdCxuLGkpe2NvbnN0IHM9dGhpcy5tYXBbdF07cyE9PXZvaWQgMCYmcy5zZXRWYWx1ZShlLG4saSl9c2V0T3B0aW9uYWwoZSx0LG4pe2NvbnN0IGk9dFtuXTtpIT09dm9pZCAwJiZ0aGlzLnNldFZhbHVlKGUsbixpKX1zdGF0aWMgdXBsb2FkKGUsdCxuLGkpe2ZvcihsZXQgcz0wLGE9dC5sZW5ndGg7cyE9PWE7KytzKXtjb25zdCBvPXRbc10sbD1uW28uaWRdO2wubmVlZHNVcGRhdGUhPT0hMSYmby5zZXRWYWx1ZShlLGwudmFsdWUsaSl9fXN0YXRpYyBzZXFXaXRoVmFsdWUoZSx0KXtjb25zdCBuPVtdO2ZvcihsZXQgaT0wLHM9ZS5sZW5ndGg7aSE9PXM7KytpKXtjb25zdCBhPWVbaV07YS5pZCBpbiB0JiZuLnB1c2goYSl9cmV0dXJuIG59fWZ1bmN0aW9uIGZwKHIsZSx0KXtjb25zdCBuPXIuY3JlYXRlU2hhZGVyKGUpO3JldHVybiByLnNoYWRlclNvdXJjZShuLHQpLHIuY29tcGlsZVNoYWRlcihuKSxufWNvbnN0IHpNPTM3Mjk3O2xldCBrTT0wO2Z1bmN0aW9uIEdNKHIsZSl7Y29uc3QgdD1yLnNwbGl0KGAKYCksbj1bXSxpPU1hdGgubWF4KGUtNiwwKSxzPU1hdGgubWluKGUrNix0Lmxlbmd0aCk7Zm9yKGxldCBhPWk7YTxzO2ErKyl7Y29uc3Qgbz1hKzE7bi5wdXNoKGAke289PT1lPyI+IjoiICJ9ICR7b306ICR7dFthXX1gKX1yZXR1cm4gbi5qb2luKGAKYCl9ZnVuY3Rpb24gVk0ocil7Y29uc3QgZT1vdC5nZXRQcmltYXJpZXMob3Qud29ya2luZ0NvbG9yU3BhY2UpLHQ9b3QuZ2V0UHJpbWFyaWVzKHIpO2xldCBuO3N3aXRjaChlPT09dD9uPSIiOmU9PT1EcyYmdD09PVVzP249IkxpbmVhckRpc3BsYXlQM1RvTGluZWFyU1JHQiI6ZT09PVVzJiZ0PT09RHMmJihuPSJMaW5lYXJTUkdCVG9MaW5lYXJEaXNwbGF5UDMiKSxyKXtjYXNlIFZuOmNhc2UgTHM6cmV0dXJuW24sIkxpbmVhclRyYW5zZmVyT0VURiJdO2Nhc2UgUHQ6Y2FzZSBxYTpyZXR1cm5bbiwic1JHQlRyYW5zZmVyT0VURiJdO2RlZmF1bHQ6cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtOiBVbnN1cHBvcnRlZCBjb2xvciBzcGFjZToiLHIpLFtuLCJMaW5lYXJUcmFuc2Zlck9FVEYiXX19ZnVuY3Rpb24gZHAocixlLHQpe2NvbnN0IG49ci5nZXRTaGFkZXJQYXJhbWV0ZXIoZSxyLkNPTVBJTEVfU1RBVFVTKSxpPXIuZ2V0U2hhZGVySW5mb0xvZyhlKS50cmltKCk7aWYobiYmaT09PSIiKXJldHVybiIiO2NvbnN0IHM9L0VSUk9SOiAwOihcZCspLy5leGVjKGkpO2lmKHMpe2NvbnN0IGE9cGFyc2VJbnQoc1sxXSk7cmV0dXJuIHQudG9VcHBlckNhc2UoKStgCgpgK2krYAoKYCtHTShyLmdldFNoYWRlclNvdXJjZShlKSxhKX1lbHNlIHJldHVybiBpfWZ1bmN0aW9uIEhNKHIsZSl7Y29uc3QgdD1WTShlKTtyZXR1cm5gdmVjNCAke3J9KCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gJHt0WzBdfSggJHt0WzFdfSggdmFsdWUgKSApOyB9YH1mdW5jdGlvbiBXTShyLGUpe2xldCB0O3N3aXRjaChlKXtjYXNlIEpmOnQ9IkxpbmVhciI7YnJlYWs7Y2FzZSBLZjp0PSJSZWluaGFyZCI7YnJlYWs7Y2FzZSBRZjp0PSJPcHRpbWl6ZWRDaW5lb24iO2JyZWFrO2Nhc2UgamY6dD0iQUNFU0ZpbG1pYyI7YnJlYWs7Y2FzZSBlZDp0PSJDdXN0b20iO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IFVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiIsZSksdD0iTGluZWFyIn1yZXR1cm4idmVjMyAiK3IrIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrdCsiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifWZ1bmN0aW9uIFhNKHIpe3JldHVybltyLmV4dGVuc2lvbkRlcml2YXRpdmVzfHxyLmVudk1hcEN1YmVVVkhlaWdodHx8ci5idW1wTWFwfHxyLm5vcm1hbE1hcFRhbmdlbnRTcGFjZXx8ci5jbGVhcmNvYXROb3JtYWxNYXB8fHIuZmxhdFNoYWRpbmd8fHIuc2hhZGVySUQ9PT0icGh5c2ljYWwiPyIjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZSI6IiIsKHIuZXh0ZW5zaW9uRnJhZ0RlcHRofHxyLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIpJiZyLnJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoPyIjZXh0ZW5zaW9uIEdMX0VYVF9mcmFnX2RlcHRoIDogZW5hYmxlIjoiIixyLmV4dGVuc2lvbkRyYXdCdWZmZXJzJiZyLnJlbmRlcmVyRXh0ZW5zaW9uRHJhd0J1ZmZlcnM/IiNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmUiOiIiLChyLmV4dGVuc2lvblNoYWRlclRleHR1cmVMT0R8fHIuZW52TWFwfHxyLnRyYW5zbWlzc2lvbikmJnIucmVuZGVyZXJFeHRlbnNpb25TaGFkZXJUZXh0dXJlTG9kPyIjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiBlbmFibGUiOiIiXS5maWx0ZXIoWXMpLmpvaW4oYApgKX1mdW5jdGlvbiBxTShyKXtjb25zdCBlPVtdO2Zvcihjb25zdCB0IGluIHIpe2NvbnN0IG49clt0XTtuIT09ITEmJmUucHVzaCgiI2RlZmluZSAiK3QrIiAiK24pfXJldHVybiBlLmpvaW4oYApgKX1mdW5jdGlvbiAkTShyLGUpe2NvbnN0IHQ9e30sbj1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxyLkFDVElWRV9BVFRSSUJVVEVTKTtmb3IobGV0IGk9MDtpPG47aSsrKXtjb25zdCBzPXIuZ2V0QWN0aXZlQXR0cmliKGUsaSksYT1zLm5hbWU7bGV0IG89MTtzLnR5cGU9PT1yLkZMT0FUX01BVDImJihvPTIpLHMudHlwZT09PXIuRkxPQVRfTUFUMyYmKG89Mykscy50eXBlPT09ci5GTE9BVF9NQVQ0JiYobz00KSx0W2FdPXt0eXBlOnMudHlwZSxsb2NhdGlvbjpyLmdldEF0dHJpYkxvY2F0aW9uKGUsYSksbG9jYXRpb25TaXplOm99fXJldHVybiB0fWZ1bmN0aW9uIFlzKHIpe3JldHVybiByIT09IiJ9ZnVuY3Rpb24gcHAocixlKXtjb25zdCB0PWUubnVtU3BvdExpZ2h0U2hhZG93cytlLm51bVNwb3RMaWdodE1hcHMtZS5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM7cmV0dXJuIHIucmVwbGFjZSgvTlVNX0RJUl9MSUdIVFMvZyxlLm51bURpckxpZ2h0cykucmVwbGFjZSgvTlVNX1NQT1RfTElHSFRTL2csZS5udW1TcG90TGlnaHRzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9NQVBTL2csZS5udW1TcG90TGlnaHRNYXBzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9DT09SRFMvZyx0KS5yZXBsYWNlKC9OVU1fUkVDVF9BUkVBX0xJR0hUUy9nLGUubnVtUmVjdEFyZWFMaWdodHMpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVFMvZyxlLm51bVBvaW50TGlnaHRzKS5yZXBsYWNlKC9OVU1fSEVNSV9MSUdIVFMvZyxlLm51bUhlbWlMaWdodHMpLnJlcGxhY2UoL05VTV9ESVJfTElHSFRfU0hBRE9XUy9nLGUubnVtRGlyTGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUy9nLGUubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTL2csZS5udW1TcG90TGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRfU0hBRE9XUy9nLGUubnVtUG9pbnRMaWdodFNoYWRvd3MpfWZ1bmN0aW9uIG1wKHIsZSl7cmV0dXJuIHIucmVwbGFjZSgvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLGUubnVtQ2xpcHBpbmdQbGFuZXMpLnJlcGxhY2UoL1VOSU9OX0NMSVBQSU5HX1BMQU5FUy9nLGUubnVtQ2xpcHBpbmdQbGFuZXMtZS5udW1DbGlwSW50ZXJzZWN0aW9uKX1jb25zdCBZTT0vXlsgXHRdKiNpbmNsdWRlICs8KFtcd1xkLi9dKyk+L2dtO2Z1bmN0aW9uIFBoKHIpe3JldHVybiByLnJlcGxhY2UoWU0sSk0pfWNvbnN0IFpNPW5ldyBNYXAoW1siZW5jb2RpbmdzX2ZyYWdtZW50IiwiY29sb3JzcGFjZV9mcmFnbWVudCJdLFsiZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQiLCJjb2xvcnNwYWNlX3BhcnNfZnJhZ21lbnQiXSxbIm91dHB1dF9mcmFnbWVudCIsIm9wYXF1ZV9mcmFnbWVudCJdXSk7ZnVuY3Rpb24gSk0ocixlKXtsZXQgdD0kZVtlXTtpZih0PT09dm9pZCAwKXtjb25zdCBuPVpNLmdldChlKTtpZihuIT09dm9pZCAwKXQ9JGVbbl0sY29uc29sZS53YXJuKCdUSFJFRS5XZWJHTFJlbmRlcmVyOiBTaGFkZXIgY2h1bmsgIiVzIiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgIiVzIiBpbnN0ZWFkLicsZSxuKTtlbHNlIHRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIDwiK2UrIj4iKX1yZXR1cm4gUGgodCl9Y29uc3QgS009LyNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRccytmb3JccypcKFxzKmludFxzK2lccyo9XHMqKFxkKylccyo7XHMqaVxzKjxccyooXGQrKVxzKjtccyppXHMqXCtcK1xzKlwpXHMqeyhbXHNcU10rPyl9XHMrI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQvZztmdW5jdGlvbiBncChyKXtyZXR1cm4gci5yZXBsYWNlKEtNLFFNKX1mdW5jdGlvbiBRTShyLGUsdCxuKXtsZXQgaT0iIjtmb3IobGV0IHM9cGFyc2VJbnQoZSk7czxwYXJzZUludCh0KTtzKyspaSs9bi5yZXBsYWNlKC9cW1xzKmlccypcXS9nLCJbICIrcysiIF0iKS5yZXBsYWNlKC9VTlJPTExFRF9MT09QX0lOREVYL2cscyk7cmV0dXJuIGl9ZnVuY3Rpb24gX3Aocil7bGV0IGU9InByZWNpc2lvbiAiK3IucHJlY2lzaW9uK2AgZmxvYXQ7CnByZWNpc2lvbiBgK3IucHJlY2lzaW9uKyIgaW50OyI7cmV0dXJuIHIucHJlY2lzaW9uPT09ImhpZ2hwIj9lKz1gCiNkZWZpbmUgSElHSF9QUkVDSVNJT05gOnIucHJlY2lzaW9uPT09Im1lZGl1bXAiP2UrPWAKI2RlZmluZSBNRURJVU1fUFJFQ0lTSU9OYDpyLnByZWNpc2lvbj09PSJsb3dwIiYmKGUrPWAKI2RlZmluZSBMT1dfUFJFQ0lTSU9OYCksZX1mdW5jdGlvbiBqTShyKXtsZXQgZT0iU0hBRE9XTUFQX1RZUEVfQkFTSUMiO3JldHVybiByLnNoYWRvd01hcFR5cGU9PT1Dbj9lPSJTSEFET1dNQVBfVFlQRV9QQ0YiOnIuc2hhZG93TWFwVHlwZT09PVNyP2U9IlNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIjpyLnNoYWRvd01hcFR5cGU9PT1rbiYmKGU9IlNIQURPV01BUF9UWVBFX1ZTTSIpLGV9ZnVuY3Rpb24gZVMocil7bGV0IGU9IkVOVk1BUF9UWVBFX0NVQkUiO2lmKHIuZW52TWFwKXN3aXRjaChyLmVudk1hcE1vZGUpe2Nhc2UgS246Y2FzZSB5aTplPSJFTlZNQVBfVFlQRV9DVUJFIjticmVhaztjYXNlIGJyOmU9IkVOVk1BUF9UWVBFX0NVQkVfVVYiO2JyZWFrfXJldHVybiBlfWZ1bmN0aW9uIHRTKHIpe2xldCBlPSJFTlZNQVBfTU9ERV9SRUZMRUNUSU9OIjtpZihyLmVudk1hcClzd2l0Y2goci5lbnZNYXBNb2RlKXtjYXNlIHlpOmU9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04iO2JyZWFrfXJldHVybiBlfWZ1bmN0aW9uIG5TKHIpe2xldCBlPSJFTlZNQVBfQkxFTkRJTkdfTk9ORSI7aWYoci5lbnZNYXApc3dpdGNoKHIuY29tYmluZSl7Y2FzZSBTczplPSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgWWY6ZT0iRU5WTUFQX0JMRU5ESU5HX01JWCI7YnJlYWs7Y2FzZSBaZjplPSJFTlZNQVBfQkxFTkRJTkdfQUREIjticmVha31yZXR1cm4gZX1mdW5jdGlvbiBpUyhyKXtjb25zdCBlPXIuZW52TWFwQ3ViZVVWSGVpZ2h0O2lmKGU9PT1udWxsKXJldHVybiBudWxsO2NvbnN0IHQ9TWF0aC5sb2cyKGUpLTIsbj0xL2U7cmV0dXJue3RleGVsV2lkdGg6MS8oMypNYXRoLm1heChNYXRoLnBvdygyLHQpLDcqMTYpKSx0ZXhlbEhlaWdodDpuLG1heE1pcDp0fX1mdW5jdGlvbiByUyhyLGUsdCxuKXtjb25zdCBpPXIuZ2V0Q29udGV4dCgpLHM9dC5kZWZpbmVzO2xldCBhPXQudmVydGV4U2hhZGVyLG89dC5mcmFnbWVudFNoYWRlcjtjb25zdCBsPWpNKHQpLGM9ZVModCksaD10Uyh0KSx1PW5TKHQpLGY9aVModCksZD10LmlzV2ViR0wyPyIiOlhNKHQpLHA9cU0ocyksXz1pLmNyZWF0ZVByb2dyYW0oKTtsZXQgZyxtLHk9dC5nbHNsVmVyc2lvbj8iI3ZlcnNpb24gIit0Lmdsc2xWZXJzaW9uK2AKYDoiIjt0LmlzUmF3U2hhZGVyTWF0ZXJpYWw/KGc9WyIjZGVmaW5lIFNIQURFUl9UWVBFICIrdC5zaGFkZXJUeXBlLCIjZGVmaW5lIFNIQURFUl9OQU1FICIrdC5zaGFkZXJOYW1lLHBdLmZpbHRlcihZcykuam9pbihgCmApLGcubGVuZ3RoPjAmJihnKz1gCmApLG09W2QsIiNkZWZpbmUgU0hBREVSX1RZUEUgIit0LnNoYWRlclR5cGUsIiNkZWZpbmUgU0hBREVSX05BTUUgIit0LnNoYWRlck5hbWUscF0uZmlsdGVyKFlzKS5qb2luKGAKYCksbS5sZW5ndGg+MCYmKG0rPWAKYCkpOihnPVtfcCh0KSwiI2RlZmluZSBTSEFERVJfVFlQRSAiK3Quc2hhZGVyVHlwZSwiI2RlZmluZSBTSEFERVJfTkFNRSAiK3Quc2hhZGVyTmFtZSxwLHQuYmF0Y2hpbmc/IiNkZWZpbmUgVVNFX0JBVENISU5HIjoiIix0Lmluc3RhbmNpbmc/IiNkZWZpbmUgVVNFX0lOU1RBTkNJTkciOiIiLHQuaW5zdGFuY2luZ0NvbG9yPyIjZGVmaW5lIFVTRV9JTlNUQU5DSU5HX0NPTE9SIjoiIix0LnVzZUZvZyYmdC5mb2c/IiNkZWZpbmUgVVNFX0ZPRyI6IiIsdC51c2VGb2cmJnQuZm9nRXhwMj8iI2RlZmluZSBGT0dfRVhQMiI6IiIsdC5tYXA/IiNkZWZpbmUgVVNFX01BUCI6IiIsdC5lbnZNYXA/IiNkZWZpbmUgVVNFX0VOVk1BUCI6IiIsdC5lbnZNYXA/IiNkZWZpbmUgIitoOiIiLHQubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIix0LmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsdC5idW1wTWFwPyIjZGVmaW5lIFVTRV9CVU1QTUFQIjoiIix0Lm5vcm1hbE1hcD8iI2RlZmluZSBVU0VfTk9STUFMTUFQIjoiIix0Lm5vcm1hbE1hcE9iamVjdFNwYWNlPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0UiOiIiLHQubm9ybWFsTWFwVGFuZ2VudFNwYWNlPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFIjoiIix0LmRpc3BsYWNlbWVudE1hcD8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIix0LmVtaXNzaXZlTWFwPyIjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCI6IiIsdC5hbmlzb3Ryb3B5PyIjZGVmaW5lIFVTRV9BTklTT1RST1BZIjoiIix0LmFuaXNvdHJvcHlNYXA/IiNkZWZpbmUgVVNFX0FOSVNPVFJPUFlNQVAiOiIiLHQuY2xlYXJjb2F0TWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAiOiIiLHQuY2xlYXJjb2F0Um91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQIjoiIix0LmNsZWFyY29hdE5vcm1hbE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsdC5pcmlkZXNjZW5jZU1hcD8iI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0VNQVAiOiIiLHQuaXJpZGVzY2VuY2VUaGlja25lc3NNYXA/IiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUCI6IiIsdC5zcGVjdWxhck1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAiOiIiLHQuc3BlY3VsYXJDb2xvck1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAiOiIiLHQuc3BlY3VsYXJJbnRlbnNpdHlNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUCI6IiIsdC5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdC5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdC5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHQuYWxwaGFIYXNoPyIjZGVmaW5lIFVTRV9BTFBIQUhBU0giOiIiLHQudHJhbnNtaXNzaW9uPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT04iOiIiLHQudHJhbnNtaXNzaW9uTWFwPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT05NQVAiOiIiLHQudGhpY2tuZXNzTWFwPyIjZGVmaW5lIFVTRV9USElDS05FU1NNQVAiOiIiLHQuc2hlZW5Db2xvck1hcD8iI2RlZmluZSBVU0VfU0hFRU5fQ09MT1JNQVAiOiIiLHQuc2hlZW5Sb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1NIRUVOX1JPVUdITkVTU01BUCI6IiIsdC5tYXBVdj8iI2RlZmluZSBNQVBfVVYgIit0Lm1hcFV2OiIiLHQuYWxwaGFNYXBVdj8iI2RlZmluZSBBTFBIQU1BUF9VViAiK3QuYWxwaGFNYXBVdjoiIix0LmxpZ2h0TWFwVXY/IiNkZWZpbmUgTElHSFRNQVBfVVYgIit0LmxpZ2h0TWFwVXY6IiIsdC5hb01hcFV2PyIjZGVmaW5lIEFPTUFQX1VWICIrdC5hb01hcFV2OiIiLHQuZW1pc3NpdmVNYXBVdj8iI2RlZmluZSBFTUlTU0lWRU1BUF9VViAiK3QuZW1pc3NpdmVNYXBVdjoiIix0LmJ1bXBNYXBVdj8iI2RlZmluZSBCVU1QTUFQX1VWICIrdC5idW1wTWFwVXY6IiIsdC5ub3JtYWxNYXBVdj8iI2RlZmluZSBOT1JNQUxNQVBfVVYgIit0Lm5vcm1hbE1hcFV2OiIiLHQuZGlzcGxhY2VtZW50TWFwVXY/IiNkZWZpbmUgRElTUExBQ0VNRU5UTUFQX1VWICIrdC5kaXNwbGFjZW1lbnRNYXBVdjoiIix0Lm1ldGFsbmVzc01hcFV2PyIjZGVmaW5lIE1FVEFMTkVTU01BUF9VViAiK3QubWV0YWxuZXNzTWFwVXY6IiIsdC5yb3VnaG5lc3NNYXBVdj8iI2RlZmluZSBST1VHSE5FU1NNQVBfVVYgIit0LnJvdWdobmVzc01hcFV2OiIiLHQuYW5pc290cm9weU1hcFV2PyIjZGVmaW5lIEFOSVNPVFJPUFlNQVBfVVYgIit0LmFuaXNvdHJvcHlNYXBVdjoiIix0LmNsZWFyY29hdE1hcFV2PyIjZGVmaW5lIENMRUFSQ09BVE1BUF9VViAiK3QuY2xlYXJjb2F0TWFwVXY6IiIsdC5jbGVhcmNvYXROb3JtYWxNYXBVdj8iI2RlZmluZSBDTEVBUkNPQVRfTk9STUFMTUFQX1VWICIrdC5jbGVhcmNvYXROb3JtYWxNYXBVdjoiIix0LmNsZWFyY29hdFJvdWdobmVzc01hcFV2PyIjZGVmaW5lIENMRUFSQ09BVF9ST1VHSE5FU1NNQVBfVVYgIit0LmNsZWFyY29hdFJvdWdobmVzc01hcFV2OiIiLHQuaXJpZGVzY2VuY2VNYXBVdj8iI2RlZmluZSBJUklERVNDRU5DRU1BUF9VViAiK3QuaXJpZGVzY2VuY2VNYXBVdjoiIix0LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXY/IiNkZWZpbmUgSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQX1VWICIrdC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2OiIiLHQuc2hlZW5Db2xvck1hcFV2PyIjZGVmaW5lIFNIRUVOX0NPTE9STUFQX1VWICIrdC5zaGVlbkNvbG9yTWFwVXY6IiIsdC5zaGVlblJvdWdobmVzc01hcFV2PyIjZGVmaW5lIFNIRUVOX1JPVUdITkVTU01BUF9VViAiK3Quc2hlZW5Sb3VnaG5lc3NNYXBVdjoiIix0LnNwZWN1bGFyTWFwVXY/IiNkZWZpbmUgU1BFQ1VMQVJNQVBfVVYgIit0LnNwZWN1bGFyTWFwVXY6IiIsdC5zcGVjdWxhckNvbG9yTWFwVXY/IiNkZWZpbmUgU1BFQ1VMQVJfQ09MT1JNQVBfVVYgIit0LnNwZWN1bGFyQ29sb3JNYXBVdjoiIix0LnNwZWN1bGFySW50ZW5zaXR5TWFwVXY/IiNkZWZpbmUgU1BFQ1VMQVJfSU5URU5TSVRZTUFQX1VWICIrdC5zcGVjdWxhckludGVuc2l0eU1hcFV2OiIiLHQudHJhbnNtaXNzaW9uTWFwVXY/IiNkZWZpbmUgVFJBTlNNSVNTSU9OTUFQX1VWICIrdC50cmFuc21pc3Npb25NYXBVdjoiIix0LnRoaWNrbmVzc01hcFV2PyIjZGVmaW5lIFRISUNLTkVTU01BUF9VViAiK3QudGhpY2tuZXNzTWFwVXY6IiIsdC52ZXJ0ZXhUYW5nZW50cyYmdC5mbGF0U2hhZGluZz09PSExPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoiIix0LnZlcnRleENvbG9ycz8iI2RlZmluZSBVU0VfQ09MT1IiOiIiLHQudmVydGV4QWxwaGFzPyIjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQSI6IiIsdC52ZXJ0ZXhVdjFzPyIjZGVmaW5lIFVTRV9VVjEiOiIiLHQudmVydGV4VXYycz8iI2RlZmluZSBVU0VfVVYyIjoiIix0LnZlcnRleFV2M3M/IiNkZWZpbmUgVVNFX1VWMyI6IiIsdC5wb2ludHNVdnM/IiNkZWZpbmUgVVNFX1BPSU5UU19VViI6IiIsdC5mbGF0U2hhZGluZz8iI2RlZmluZSBGTEFUX1NIQURFRCI6IiIsdC5za2lubmluZz8iI2RlZmluZSBVU0VfU0tJTk5JTkciOiIiLHQubW9ycGhUYXJnZXRzPyIjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMiOiIiLHQubW9ycGhOb3JtYWxzJiZ0LmZsYXRTaGFkaW5nPT09ITE/IiNkZWZpbmUgVVNFX01PUlBITk9STUFMUyI6IiIsdC5tb3JwaENvbG9ycyYmdC5pc1dlYkdMMj8iI2RlZmluZSBVU0VfTU9SUEhDT0xPUlMiOiIiLHQubW9ycGhUYXJnZXRzQ291bnQ+MCYmdC5pc1dlYkdMMj8iI2RlZmluZSBNT1JQSFRBUkdFVFNfVEVYVFVSRSI6IiIsdC5tb3JwaFRhcmdldHNDb3VudD4wJiZ0LmlzV2ViR0wyPyIjZGVmaW5lIE1PUlBIVEFSR0VUU19URVhUVVJFX1NUUklERSAiK3QubW9ycGhUZXh0dXJlU3RyaWRlOiIiLHQubW9ycGhUYXJnZXRzQ291bnQ+MCYmdC5pc1dlYkdMMj8iI2RlZmluZSBNT1JQSFRBUkdFVFNfQ09VTlQgIit0Lm1vcnBoVGFyZ2V0c0NvdW50OiIiLHQuZG91YmxlU2lkZWQ/IiNkZWZpbmUgRE9VQkxFX1NJREVEIjoiIix0LmZsaXBTaWRlZD8iI2RlZmluZSBGTElQX1NJREVEIjoiIix0LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgVVNFX1NIQURPV01BUCI6IiIsdC5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lICIrbDoiIix0LnNpemVBdHRlbnVhdGlvbj8iI2RlZmluZSBVU0VfU0laRUFUVEVOVUFUSU9OIjoiIix0Lm51bUxpZ2h0UHJvYmVzPjA/IiNkZWZpbmUgVVNFX0xJR0hUX1BST0JFUyI6IiIsdC51c2VMZWdhY3lMaWdodHM/IiNkZWZpbmUgTEVHQUNZX0xJR0hUUyI6IiIsdC5sb2dhcml0aG1pY0RlcHRoQnVmZmVyPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRiI6IiIsdC5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZ0LnJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7IiwidW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OyIsInVuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsiLCJ1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7IiwiI2lmZGVmIFVTRV9JTlNUQU5DSU5HIiwiCWF0dHJpYnV0ZSBtYXQ0IGluc3RhbmNlTWF0cml4OyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUiIsIglhdHRyaWJ1dGUgdmVjMyBpbnN0YW5jZUNvbG9yOyIsIiNlbmRpZiIsImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsiLCJhdHRyaWJ1dGUgdmVjMiB1djsiLCIjaWZkZWYgVVNFX1VWMSIsIglhdHRyaWJ1dGUgdmVjMiB1djE7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9VVjIiLCIJYXR0cmlidXRlIHZlYzIgdXYyOyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfVVYzIiwiCWF0dHJpYnV0ZSB2ZWMyIHV2MzsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1RBTkdFTlQiLCIJYXR0cmlidXRlIHZlYzQgdGFuZ2VudDsiLCIjZW5kaWYiLCIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkiLCIJYXR0cmlidXRlIHZlYzQgY29sb3I7IiwiI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkiLCIJYXR0cmlidXRlIHZlYzMgY29sb3I7IiwiI2VuZGlmIiwiI2lmICggZGVmaW5lZCggVVNFX01PUlBIVEFSR0VUUyApICYmICEgZGVmaW5lZCggTU9SUEhUQVJHRVRTX1RFWFRVUkUgKSApIiwiCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsiLCIJYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQxOyIsIglhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDI7IiwiCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsiLCIJI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFMiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMjsiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMzsiLCIJI2Vsc2UiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NDsiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NjsiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NzsiLCIJI2VuZGlmIiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9TS0lOTklORyIsIglhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiCWF0dHJpYnV0ZSB2ZWM0IHNraW5XZWlnaHQ7IiwiI2VuZGlmIixgCmBdLmZpbHRlcihZcykuam9pbihgCmApLG09W2QsX3AodCksIiNkZWZpbmUgU0hBREVSX1RZUEUgIit0LnNoYWRlclR5cGUsIiNkZWZpbmUgU0hBREVSX05BTUUgIit0LnNoYWRlck5hbWUscCx0LnVzZUZvZyYmdC5mb2c/IiNkZWZpbmUgVVNFX0ZPRyI6IiIsdC51c2VGb2cmJnQuZm9nRXhwMj8iI2RlZmluZSBGT0dfRVhQMiI6IiIsdC5tYXA/IiNkZWZpbmUgVVNFX01BUCI6IiIsdC5tYXRjYXA/IiNkZWZpbmUgVVNFX01BVENBUCI6IiIsdC5lbnZNYXA/IiNkZWZpbmUgVVNFX0VOVk1BUCI6IiIsdC5lbnZNYXA/IiNkZWZpbmUgIitjOiIiLHQuZW52TWFwPyIjZGVmaW5lICIraDoiIix0LmVudk1hcD8iI2RlZmluZSAiK3U6IiIsZj8iI2RlZmluZSBDVUJFVVZfVEVYRUxfV0lEVEggIitmLnRleGVsV2lkdGg6IiIsZj8iI2RlZmluZSBDVUJFVVZfVEVYRUxfSEVJR0hUICIrZi50ZXhlbEhlaWdodDoiIixmPyIjZGVmaW5lIENVQkVVVl9NQVhfTUlQICIrZi5tYXhNaXArIi4wIjoiIix0LmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsdC5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLHQuYnVtcE1hcD8iI2RlZmluZSBVU0VfQlVNUE1BUCI6IiIsdC5ub3JtYWxNYXA/IiNkZWZpbmUgVVNFX05PUk1BTE1BUCI6IiIsdC5ub3JtYWxNYXBPYmplY3RTcGFjZT8iI2RlZmluZSBVU0VfTk9STUFMTUFQX09CSkVDVFNQQUNFIjoiIix0Lm5vcm1hbE1hcFRhbmdlbnRTcGFjZT8iI2RlZmluZSBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSI6IiIsdC5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLHQuYW5pc290cm9weT8iI2RlZmluZSBVU0VfQU5JU09UUk9QWSI6IiIsdC5hbmlzb3Ryb3B5TWFwPyIjZGVmaW5lIFVTRV9BTklTT1RST1BZTUFQIjoiIix0LmNsZWFyY29hdD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUIjoiIix0LmNsZWFyY29hdE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUTUFQIjoiIix0LmNsZWFyY29hdFJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUCI6IiIsdC5jbGVhcmNvYXROb3JtYWxNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAiOiIiLHQuaXJpZGVzY2VuY2U/IiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFIjoiIix0LmlyaWRlc2NlbmNlTWFwPyIjZGVmaW5lIFVTRV9JUklERVNDRU5DRU1BUCI6IiIsdC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD8iI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQIjoiIix0LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdC5zcGVjdWxhckNvbG9yTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUl9DT0xPUk1BUCI6IiIsdC5zcGVjdWxhckludGVuc2l0eU1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQIjoiIix0LnJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQIjoiIix0Lm1ldGFsbmVzc01hcD8iI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQIjoiIix0LmFscGhhTWFwPyIjZGVmaW5lIFVTRV9BTFBIQU1BUCI6IiIsdC5hbHBoYVRlc3Q/IiNkZWZpbmUgVVNFX0FMUEhBVEVTVCI6IiIsdC5hbHBoYUhhc2g/IiNkZWZpbmUgVVNFX0FMUEhBSEFTSCI6IiIsdC5zaGVlbj8iI2RlZmluZSBVU0VfU0hFRU4iOiIiLHQuc2hlZW5Db2xvck1hcD8iI2RlZmluZSBVU0VfU0hFRU5fQ09MT1JNQVAiOiIiLHQuc2hlZW5Sb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1NIRUVOX1JPVUdITkVTU01BUCI6IiIsdC50cmFuc21pc3Npb24/IiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTiI6IiIsdC50cmFuc21pc3Npb25NYXA/IiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTk1BUCI6IiIsdC50aGlja25lc3NNYXA/IiNkZWZpbmUgVVNFX1RISUNLTkVTU01BUCI6IiIsdC52ZXJ0ZXhUYW5nZW50cyYmdC5mbGF0U2hhZGluZz09PSExPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoiIix0LnZlcnRleENvbG9yc3x8dC5pbnN0YW5jaW5nQ29sb3I/IiNkZWZpbmUgVVNFX0NPTE9SIjoiIix0LnZlcnRleEFscGhhcz8iI2RlZmluZSBVU0VfQ09MT1JfQUxQSEEiOiIiLHQudmVydGV4VXYxcz8iI2RlZmluZSBVU0VfVVYxIjoiIix0LnZlcnRleFV2MnM/IiNkZWZpbmUgVVNFX1VWMiI6IiIsdC52ZXJ0ZXhVdjNzPyIjZGVmaW5lIFVTRV9VVjMiOiIiLHQucG9pbnRzVXZzPyIjZGVmaW5lIFVTRV9QT0lOVFNfVVYiOiIiLHQuZ3JhZGllbnRNYXA/IiNkZWZpbmUgVVNFX0dSQURJRU5UTUFQIjoiIix0LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix0LmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsdC5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsdC5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLHQuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK2w6IiIsdC5wcmVtdWx0aXBsaWVkQWxwaGE/IiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSI6IiIsdC5udW1MaWdodFByb2Jlcz4wPyIjZGVmaW5lIFVTRV9MSUdIVF9QUk9CRVMiOiIiLHQudXNlTGVnYWN5TGlnaHRzPyIjZGVmaW5lIExFR0FDWV9MSUdIVFMiOiIiLHQuZGVjb2RlVmlkZW9UZXh0dXJlPyIjZGVmaW5lIERFQ09ERV9WSURFT19URVhUVVJFIjoiIix0LmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIix0LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJnQucmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGg/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCI6IiIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsiLCJ1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7Iix0LnRvbmVNYXBwaW5nIT09Sm4/IiNkZWZpbmUgVE9ORV9NQVBQSU5HIjoiIix0LnRvbmVNYXBwaW5nIT09Sm4/JGUudG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDoiIix0LnRvbmVNYXBwaW5nIT09Sm4/V00oInRvbmVNYXBwaW5nIix0LnRvbmVNYXBwaW5nKToiIix0LmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLHQub3BhcXVlPyIjZGVmaW5lIE9QQVFVRSI6IiIsJGUuY29sb3JzcGFjZV9wYXJzX2ZyYWdtZW50LEhNKCJsaW5lYXJUb091dHB1dFRleGVsIix0Lm91dHB1dENvbG9yU3BhY2UpLHQudXNlRGVwdGhQYWNraW5nPyIjZGVmaW5lIERFUFRIX1BBQ0tJTkcgIit0LmRlcHRoUGFja2luZzoiIixgCmBdLmZpbHRlcihZcykuam9pbihgCmApKSxhPVBoKGEpLGE9cHAoYSx0KSxhPW1wKGEsdCksbz1QaChvKSxvPXBwKG8sdCksbz1tcChvLHQpLGE9Z3AoYSksbz1ncChvKSx0LmlzV2ViR0wyJiZ0LmlzUmF3U2hhZGVyTWF0ZXJpYWwhPT0hMCYmKHk9YCN2ZXJzaW9uIDMwMCBlcwpgLGc9WyJwcmVjaXNpb24gbWVkaXVtcCBzYW1wbGVyMkRBcnJheTsiLCIjZGVmaW5lIGF0dHJpYnV0ZSBpbiIsIiNkZWZpbmUgdmFyeWluZyBvdXQiLCIjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlIl0uam9pbihgCmApK2AKYCtnLG09WyJwcmVjaXNpb24gbWVkaXVtcCBzYW1wbGVyMkRBcnJheTsiLCIjZGVmaW5lIHZhcnlpbmcgaW4iLHQuZ2xzbFZlcnNpb249PT1RYz8iIjoibGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IGhpZ2hwIHZlYzQgcGNfZnJhZ0NvbG9yOyIsdC5nbHNsVmVyc2lvbj09PVFjPyIiOiIjZGVmaW5lIGdsX0ZyYWdDb2xvciBwY19mcmFnQ29sb3IiLCIjZGVmaW5lIGdsX0ZyYWdEZXB0aEVYVCBnbF9GcmFnRGVwdGgiLCIjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlIiwiI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlIiwiI2RlZmluZSB0ZXh0dXJlMkRQcm9qIHRleHR1cmVQcm9qIiwiI2RlZmluZSB0ZXh0dXJlMkRMb2RFWFQgdGV4dHVyZUxvZCIsIiNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZCIsIiNkZWZpbmUgdGV4dHVyZUN1YmVMb2RFWFQgdGV4dHVyZUxvZCIsIiNkZWZpbmUgdGV4dHVyZTJER3JhZEVYVCB0ZXh0dXJlR3JhZCIsIiNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkIiwiI2RlZmluZSB0ZXh0dXJlQ3ViZUdyYWRFWFQgdGV4dHVyZUdyYWQiXS5qb2luKGAKYCkrYApgK20pO2NvbnN0IHg9eStnK2Esdj15K20rbyxTPWZwKGksaS5WRVJURVhfU0hBREVSLHgpLGI9ZnAoaSxpLkZSQUdNRU5UX1NIQURFUix2KTtpLmF0dGFjaFNoYWRlcihfLFMpLGkuYXR0YWNoU2hhZGVyKF8sYiksdC5pbmRleDBBdHRyaWJ1dGVOYW1lIT09dm9pZCAwP2kuYmluZEF0dHJpYkxvY2F0aW9uKF8sMCx0LmluZGV4MEF0dHJpYnV0ZU5hbWUpOnQubW9ycGhUYXJnZXRzPT09ITAmJmkuYmluZEF0dHJpYkxvY2F0aW9uKF8sMCwicG9zaXRpb24iKSxpLmxpbmtQcm9ncmFtKF8pO2Z1bmN0aW9uIEEoUil7aWYoci5kZWJ1Zy5jaGVja1NoYWRlckVycm9ycyl7Y29uc3QgTj1pLmdldFByb2dyYW1JbmZvTG9nKF8pLnRyaW0oKSxCPWkuZ2V0U2hhZGVySW5mb0xvZyhTKS50cmltKCksST1pLmdldFNoYWRlckluZm9Mb2coYikudHJpbSgpO2xldCBVPSEwLHo9ITA7aWYoaS5nZXRQcm9ncmFtUGFyYW1ldGVyKF8saS5MSU5LX1NUQVRVUyk9PT0hMSlpZihVPSExLHR5cGVvZiByLmRlYnVnLm9uU2hhZGVyRXJyb3I9PSJmdW5jdGlvbiIpci5kZWJ1Zy5vblNoYWRlckVycm9yKGksXyxTLGIpO2Vsc2V7Y29uc3QgRj1kcChpLFMsInZlcnRleCIpLFo9ZHAoaSxiLCJmcmFnbWVudCIpO2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUHJvZ3JhbTogU2hhZGVyIEVycm9yICIraS5nZXRFcnJvcigpKyIgLSBWQUxJREFURV9TVEFUVVMgIitpLmdldFByb2dyYW1QYXJhbWV0ZXIoXyxpLlZBTElEQVRFX1NUQVRVUykrYAoKUHJvZ3JhbSBJbmZvIExvZzogYCtOK2AKYCtGK2AKYCtaKX1lbHNlIE4hPT0iIj9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogUHJvZ3JhbSBJbmZvIExvZzoiLE4pOihCPT09IiJ8fEk9PT0iIikmJih6PSExKTt6JiYoUi5kaWFnbm9zdGljcz17cnVubmFibGU6VSxwcm9ncmFtTG9nOk4sdmVydGV4U2hhZGVyOntsb2c6QixwcmVmaXg6Z30sZnJhZ21lbnRTaGFkZXI6e2xvZzpJLHByZWZpeDptfX0pfWkuZGVsZXRlU2hhZGVyKFMpLGkuZGVsZXRlU2hhZGVyKGIpLEw9bmV3IGJvKGksXyksTT0kTShpLF8pfWxldCBMO3RoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXtyZXR1cm4gTD09PXZvaWQgMCYmQSh0aGlzKSxMfTtsZXQgTTt0aGlzLmdldEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gTT09PXZvaWQgMCYmQSh0aGlzKSxNfTtsZXQgdz10LnJlbmRlcmVyRXh0ZW5zaW9uUGFyYWxsZWxTaGFkZXJDb21waWxlPT09ITE7cmV0dXJuIHRoaXMuaXNSZWFkeT1mdW5jdGlvbigpe3JldHVybiB3PT09ITEmJih3PWkuZ2V0UHJvZ3JhbVBhcmFtZXRlcihfLHpNKSksd30sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7bi5yZWxlYXNlU3RhdGVzT2ZQcm9ncmFtKHRoaXMpLGkuZGVsZXRlUHJvZ3JhbShfKSx0aGlzLnByb2dyYW09dm9pZCAwfSx0aGlzLnR5cGU9dC5zaGFkZXJUeXBlLHRoaXMubmFtZT10LnNoYWRlck5hbWUsdGhpcy5pZD1rTSsrLHRoaXMuY2FjaGVLZXk9ZSx0aGlzLnVzZWRUaW1lcz0xLHRoaXMucHJvZ3JhbT1fLHRoaXMudmVydGV4U2hhZGVyPVMsdGhpcy5mcmFnbWVudFNoYWRlcj1iLHRoaXN9bGV0IHNTPTA7Y2xhc3MgYVN7Y29uc3RydWN0b3IoKXt0aGlzLnNoYWRlckNhY2hlPW5ldyBNYXAsdGhpcy5tYXRlcmlhbENhY2hlPW5ldyBNYXB9dXBkYXRlKGUpe2NvbnN0IHQ9ZS52ZXJ0ZXhTaGFkZXIsbj1lLmZyYWdtZW50U2hhZGVyLGk9dGhpcy5fZ2V0U2hhZGVyU3RhZ2UodCkscz10aGlzLl9nZXRTaGFkZXJTdGFnZShuKSxhPXRoaXMuX2dldFNoYWRlckNhY2hlRm9yTWF0ZXJpYWwoZSk7cmV0dXJuIGEuaGFzKGkpPT09ITEmJihhLmFkZChpKSxpLnVzZWRUaW1lcysrKSxhLmhhcyhzKT09PSExJiYoYS5hZGQocykscy51c2VkVGltZXMrKyksdGhpc31yZW1vdmUoZSl7Y29uc3QgdD10aGlzLm1hdGVyaWFsQ2FjaGUuZ2V0KGUpO2Zvcihjb25zdCBuIG9mIHQpbi51c2VkVGltZXMtLSxuLnVzZWRUaW1lcz09PTAmJnRoaXMuc2hhZGVyQ2FjaGUuZGVsZXRlKG4uY29kZSk7cmV0dXJuIHRoaXMubWF0ZXJpYWxDYWNoZS5kZWxldGUoZSksdGhpc31nZXRWZXJ0ZXhTaGFkZXJJRChlKXtyZXR1cm4gdGhpcy5fZ2V0U2hhZGVyU3RhZ2UoZS52ZXJ0ZXhTaGFkZXIpLmlkfWdldEZyYWdtZW50U2hhZGVySUQoZSl7cmV0dXJuIHRoaXMuX2dldFNoYWRlclN0YWdlKGUuZnJhZ21lbnRTaGFkZXIpLmlkfWRpc3Bvc2UoKXt0aGlzLnNoYWRlckNhY2hlLmNsZWFyKCksdGhpcy5tYXRlcmlhbENhY2hlLmNsZWFyKCl9X2dldFNoYWRlckNhY2hlRm9yTWF0ZXJpYWwoZSl7Y29uc3QgdD10aGlzLm1hdGVyaWFsQ2FjaGU7bGV0IG49dC5nZXQoZSk7cmV0dXJuIG49PT12b2lkIDAmJihuPW5ldyBTZXQsdC5zZXQoZSxuKSksbn1fZ2V0U2hhZGVyU3RhZ2UoZSl7Y29uc3QgdD10aGlzLnNoYWRlckNhY2hlO2xldCBuPXQuZ2V0KGUpO3JldHVybiBuPT09dm9pZCAwJiYobj1uZXcgb1MoZSksdC5zZXQoZSxuKSksbn19Y2xhc3Mgb1N7Y29uc3RydWN0b3IoZSl7dGhpcy5pZD1zUysrLHRoaXMuY29kZT1lLHRoaXMudXNlZFRpbWVzPTB9fWZ1bmN0aW9uIGxTKHIsZSx0LG4saSxzLGEpe2NvbnN0IG89bmV3IGlvLGw9bmV3IGFTLGM9W10saD1pLmlzV2ViR0wyLHU9aS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyLGY9aS52ZXJ0ZXhUZXh0dXJlcztsZXQgZD1pLnByZWNpc2lvbjtjb25zdCBwPXtNZXNoRGVwdGhNYXRlcmlhbDoiZGVwdGgiLE1lc2hEaXN0YW5jZU1hdGVyaWFsOiJkaXN0YW5jZVJHQkEiLE1lc2hOb3JtYWxNYXRlcmlhbDoibm9ybWFsIixNZXNoQmFzaWNNYXRlcmlhbDoiYmFzaWMiLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ImxhbWJlcnQiLE1lc2hQaG9uZ01hdGVyaWFsOiJwaG9uZyIsTWVzaFRvb25NYXRlcmlhbDoidG9vbiIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIixMaW5lQmFzaWNNYXRlcmlhbDoiYmFzaWMiLExpbmVEYXNoZWRNYXRlcmlhbDoiZGFzaGVkIixQb2ludHNNYXRlcmlhbDoicG9pbnRzIixTaGFkb3dNYXRlcmlhbDoic2hhZG93IixTcHJpdGVNYXRlcmlhbDoic3ByaXRlIn07ZnVuY3Rpb24gXyhNKXtyZXR1cm4gTT09PTA/InV2IjpgdXYke019YH1mdW5jdGlvbiBnKE0sdyxSLE4sQil7Y29uc3QgST1OLmZvZyxVPUIuZ2VvbWV0cnksej1NLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/Ti5lbnZpcm9ubWVudDpudWxsLEY9KE0uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD90OmUpLmdldChNLmVudk1hcHx8eiksWj1GJiZGLm1hcHBpbmc9PT1icj9GLmltYWdlLmhlaWdodDpudWxsLFY9cFtNLnR5cGVdO00ucHJlY2lzaW9uIT09bnVsbCYmKGQ9aS5nZXRNYXhQcmVjaXNpb24oTS5wcmVjaXNpb24pLGQhPT1NLnByZWNpc2lvbiYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW0uZ2V0UGFyYW1ldGVyczoiLE0ucHJlY2lzaW9uLCJub3Qgc3VwcG9ydGVkLCB1c2luZyIsZCwiaW5zdGVhZC4iKSk7Y29uc3QgUT1VLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbnx8VS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsfHxVLm1vcnBoQXR0cmlidXRlcy5jb2xvcixuZT1RIT09dm9pZCAwP1EubGVuZ3RoOjA7bGV0IGZlPTA7VS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDAmJihmZT0xKSxVLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwhPT12b2lkIDAmJihmZT0yKSxVLm1vcnBoQXR0cmlidXRlcy5jb2xvciE9PXZvaWQgMCYmKGZlPTMpO2xldCAkLGVlLGRlLFRlO2lmKFYpe2NvbnN0IG5uPU5uW1ZdOyQ9bm4udmVydGV4U2hhZGVyLGVlPW5uLmZyYWdtZW50U2hhZGVyfWVsc2UgJD1NLnZlcnRleFNoYWRlcixlZT1NLmZyYWdtZW50U2hhZGVyLGwudXBkYXRlKE0pLGRlPWwuZ2V0VmVydGV4U2hhZGVySUQoTSksVGU9bC5nZXRGcmFnbWVudFNoYWRlcklEKE0pO2NvbnN0IGJlPXIuZ2V0UmVuZGVyVGFyZ2V0KCksT2U9Qi5pc0luc3RhbmNlZE1lc2g9PT0hMCxCZT1CLmlzQmF0Y2hlZE1lc2g9PT0hMCx3ZT0hIU0ubWFwLFBlPSEhTS5tYXRjYXAsRD0hIUYsbGU9ISFNLmFvTWFwLEs9ISFNLmxpZ2h0TWFwLHVlPSEhTS5idW1wTWFwLHJlPSEhTS5ub3JtYWxNYXAsQ2U9ISFNLmRpc3BsYWNlbWVudE1hcCxXPSEhTS5lbWlzc2l2ZU1hcCxKPSEhTS5tZXRhbG5lc3NNYXAsaWU9ISFNLnJvdWdobmVzc01hcCxtZT1NLmFuaXNvdHJvcHk+MCxwZT1NLmNsZWFyY29hdD4wLEM9TS5pcmlkZXNjZW5jZT4wLEU9TS5zaGVlbj4wLGs9TS50cmFuc21pc3Npb24+MCxzZT1tZSYmISFNLmFuaXNvdHJvcHlNYXAsdGU9cGUmJiEhTS5jbGVhcmNvYXRNYXAsYWU9cGUmJiEhTS5jbGVhcmNvYXROb3JtYWxNYXAsQWU9cGUmJiEhTS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAsb2U9QyYmISFNLmlyaWRlc2NlbmNlTWFwLHhlPUMmJiEhTS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCxEZT1FJiYhIU0uc2hlZW5Db2xvck1hcCx0dD1FJiYhIU0uc2hlZW5Sb3VnaG5lc3NNYXAsY2U9ISFNLnNwZWN1bGFyTWFwLGF0PSEhTS5zcGVjdWxhckNvbG9yTWFwLFZlPSEhTS5zcGVjdWxhckludGVuc2l0eU1hcCxOZT1rJiYhIU0udHJhbnNtaXNzaW9uTWFwLExlPWsmJiEhTS50aGlja25lc3NNYXAsRWU9ISFNLmdyYWRpZW50TWFwLGplPSEhTS5hbHBoYU1hcCxPPU0uYWxwaGFUZXN0PjAsdmU9ISFNLmFscGhhSGFzaCxoZT0hIU0uZXh0ZW5zaW9ucyxqPSEhVS5hdHRyaWJ1dGVzLnV2MSxnZT0hIVUuYXR0cmlidXRlcy51djIsemU9ISFVLmF0dHJpYnV0ZXMudXYzO2xldCBpdD1KbjtyZXR1cm4gTS50b25lTWFwcGVkJiYoYmU9PT1udWxsfHxiZS5pc1hSUmVuZGVyVGFyZ2V0PT09ITApJiYoaXQ9ci50b25lTWFwcGluZykse2lzV2ViR0wyOmgsc2hhZGVySUQ6VixzaGFkZXJUeXBlOk0udHlwZSxzaGFkZXJOYW1lOk0ubmFtZSx2ZXJ0ZXhTaGFkZXI6JCxmcmFnbWVudFNoYWRlcjplZSxkZWZpbmVzOk0uZGVmaW5lcyxjdXN0b21WZXJ0ZXhTaGFkZXJJRDpkZSxjdXN0b21GcmFnbWVudFNoYWRlcklEOlRlLGlzUmF3U2hhZGVyTWF0ZXJpYWw6TS5pc1Jhd1NoYWRlck1hdGVyaWFsPT09ITAsZ2xzbFZlcnNpb246TS5nbHNsVmVyc2lvbixwcmVjaXNpb246ZCxiYXRjaGluZzpCZSxpbnN0YW5jaW5nOk9lLGluc3RhbmNpbmdDb2xvcjpPZSYmQi5pbnN0YW5jZUNvbG9yIT09bnVsbCxzdXBwb3J0c1ZlcnRleFRleHR1cmVzOmYsb3V0cHV0Q29sb3JTcGFjZTpiZT09PW51bGw/ci5vdXRwdXRDb2xvclNwYWNlOmJlLmlzWFJSZW5kZXJUYXJnZXQ9PT0hMD9iZS50ZXh0dXJlLmNvbG9yU3BhY2U6Vm4sbWFwOndlLG1hdGNhcDpQZSxlbnZNYXA6RCxlbnZNYXBNb2RlOkQmJkYubWFwcGluZyxlbnZNYXBDdWJlVVZIZWlnaHQ6Wixhb01hcDpsZSxsaWdodE1hcDpLLGJ1bXBNYXA6dWUsbm9ybWFsTWFwOnJlLGRpc3BsYWNlbWVudE1hcDpmJiZDZSxlbWlzc2l2ZU1hcDpXLG5vcm1hbE1hcE9iamVjdFNwYWNlOnJlJiZNLm5vcm1hbE1hcFR5cGU9PT1tZCxub3JtYWxNYXBUYW5nZW50U3BhY2U6cmUmJk0ubm9ybWFsTWFwVHlwZT09PXdpLG1ldGFsbmVzc01hcDpKLHJvdWdobmVzc01hcDppZSxhbmlzb3Ryb3B5Om1lLGFuaXNvdHJvcHlNYXA6c2UsY2xlYXJjb2F0OnBlLGNsZWFyY29hdE1hcDp0ZSxjbGVhcmNvYXROb3JtYWxNYXA6YWUsY2xlYXJjb2F0Um91Z2huZXNzTWFwOkFlLGlyaWRlc2NlbmNlOkMsaXJpZGVzY2VuY2VNYXA6b2UsaXJpZGVzY2VuY2VUaGlja25lc3NNYXA6eGUsc2hlZW46RSxzaGVlbkNvbG9yTWFwOkRlLHNoZWVuUm91Z2huZXNzTWFwOnR0LHNwZWN1bGFyTWFwOmNlLHNwZWN1bGFyQ29sb3JNYXA6YXQsc3BlY3VsYXJJbnRlbnNpdHlNYXA6VmUsdHJhbnNtaXNzaW9uOmssdHJhbnNtaXNzaW9uTWFwOk5lLHRoaWNrbmVzc01hcDpMZSxncmFkaWVudE1hcDpFZSxvcGFxdWU6TS50cmFuc3BhcmVudD09PSExJiZNLmJsZW5kaW5nPT09QmksYWxwaGFNYXA6amUsYWxwaGFUZXN0Ok8sYWxwaGFIYXNoOnZlLGNvbWJpbmU6TS5jb21iaW5lLG1hcFV2OndlJiZfKE0ubWFwLmNoYW5uZWwpLGFvTWFwVXY6bGUmJl8oTS5hb01hcC5jaGFubmVsKSxsaWdodE1hcFV2OksmJl8oTS5saWdodE1hcC5jaGFubmVsKSxidW1wTWFwVXY6dWUmJl8oTS5idW1wTWFwLmNoYW5uZWwpLG5vcm1hbE1hcFV2OnJlJiZfKE0ubm9ybWFsTWFwLmNoYW5uZWwpLGRpc3BsYWNlbWVudE1hcFV2OkNlJiZfKE0uZGlzcGxhY2VtZW50TWFwLmNoYW5uZWwpLGVtaXNzaXZlTWFwVXY6VyYmXyhNLmVtaXNzaXZlTWFwLmNoYW5uZWwpLG1ldGFsbmVzc01hcFV2OkomJl8oTS5tZXRhbG5lc3NNYXAuY2hhbm5lbCkscm91Z2huZXNzTWFwVXY6aWUmJl8oTS5yb3VnaG5lc3NNYXAuY2hhbm5lbCksYW5pc290cm9weU1hcFV2OnNlJiZfKE0uYW5pc290cm9weU1hcC5jaGFubmVsKSxjbGVhcmNvYXRNYXBVdjp0ZSYmXyhNLmNsZWFyY29hdE1hcC5jaGFubmVsKSxjbGVhcmNvYXROb3JtYWxNYXBVdjphZSYmXyhNLmNsZWFyY29hdE5vcm1hbE1hcC5jaGFubmVsKSxjbGVhcmNvYXRSb3VnaG5lc3NNYXBVdjpBZSYmXyhNLmNsZWFyY29hdFJvdWdobmVzc01hcC5jaGFubmVsKSxpcmlkZXNjZW5jZU1hcFV2Om9lJiZfKE0uaXJpZGVzY2VuY2VNYXAuY2hhbm5lbCksaXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdjp4ZSYmXyhNLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLmNoYW5uZWwpLHNoZWVuQ29sb3JNYXBVdjpEZSYmXyhNLnNoZWVuQ29sb3JNYXAuY2hhbm5lbCksc2hlZW5Sb3VnaG5lc3NNYXBVdjp0dCYmXyhNLnNoZWVuUm91Z2huZXNzTWFwLmNoYW5uZWwpLHNwZWN1bGFyTWFwVXY6Y2UmJl8oTS5zcGVjdWxhck1hcC5jaGFubmVsKSxzcGVjdWxhckNvbG9yTWFwVXY6YXQmJl8oTS5zcGVjdWxhckNvbG9yTWFwLmNoYW5uZWwpLHNwZWN1bGFySW50ZW5zaXR5TWFwVXY6VmUmJl8oTS5zcGVjdWxhckludGVuc2l0eU1hcC5jaGFubmVsKSx0cmFuc21pc3Npb25NYXBVdjpOZSYmXyhNLnRyYW5zbWlzc2lvbk1hcC5jaGFubmVsKSx0aGlja25lc3NNYXBVdjpMZSYmXyhNLnRoaWNrbmVzc01hcC5jaGFubmVsKSxhbHBoYU1hcFV2OmplJiZfKE0uYWxwaGFNYXAuY2hhbm5lbCksdmVydGV4VGFuZ2VudHM6ISFVLmF0dHJpYnV0ZXMudGFuZ2VudCYmKHJlfHxtZSksdmVydGV4Q29sb3JzOk0udmVydGV4Q29sb3JzLHZlcnRleEFscGhhczpNLnZlcnRleENvbG9ycz09PSEwJiYhIVUuYXR0cmlidXRlcy5jb2xvciYmVS5hdHRyaWJ1dGVzLmNvbG9yLml0ZW1TaXplPT09NCx2ZXJ0ZXhVdjFzOmosdmVydGV4VXYyczpnZSx2ZXJ0ZXhVdjNzOnplLHBvaW50c1V2czpCLmlzUG9pbnRzPT09ITAmJiEhVS5hdHRyaWJ1dGVzLnV2JiYod2V8fGplKSxmb2c6ISFJLHVzZUZvZzpNLmZvZz09PSEwLGZvZ0V4cDI6SSYmSS5pc0ZvZ0V4cDIsZmxhdFNoYWRpbmc6TS5mbGF0U2hhZGluZz09PSEwLHNpemVBdHRlbnVhdGlvbjpNLnNpemVBdHRlbnVhdGlvbj09PSEwLGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6dSxza2lubmluZzpCLmlzU2tpbm5lZE1lc2g9PT0hMCxtb3JwaFRhcmdldHM6VS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDAsbW9ycGhOb3JtYWxzOlUubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCE9PXZvaWQgMCxtb3JwaENvbG9yczpVLm1vcnBoQXR0cmlidXRlcy5jb2xvciE9PXZvaWQgMCxtb3JwaFRhcmdldHNDb3VudDpuZSxtb3JwaFRleHR1cmVTdHJpZGU6ZmUsbnVtRGlyTGlnaHRzOncuZGlyZWN0aW9uYWwubGVuZ3RoLG51bVBvaW50TGlnaHRzOncucG9pbnQubGVuZ3RoLG51bVNwb3RMaWdodHM6dy5zcG90Lmxlbmd0aCxudW1TcG90TGlnaHRNYXBzOncuc3BvdExpZ2h0TWFwLmxlbmd0aCxudW1SZWN0QXJlYUxpZ2h0czp3LnJlY3RBcmVhLmxlbmd0aCxudW1IZW1pTGlnaHRzOncuaGVtaS5sZW5ndGgsbnVtRGlyTGlnaHRTaGFkb3dzOncuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoLG51bVBvaW50TGlnaHRTaGFkb3dzOncucG9pbnRTaGFkb3dNYXAubGVuZ3RoLG51bVNwb3RMaWdodFNoYWRvd3M6dy5zcG90U2hhZG93TWFwLmxlbmd0aCxudW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM6dy5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHMsbnVtTGlnaHRQcm9iZXM6dy5udW1MaWdodFByb2JlcyxudW1DbGlwcGluZ1BsYW5lczphLm51bVBsYW5lcyxudW1DbGlwSW50ZXJzZWN0aW9uOmEubnVtSW50ZXJzZWN0aW9uLGRpdGhlcmluZzpNLmRpdGhlcmluZyxzaGFkb3dNYXBFbmFibGVkOnIuc2hhZG93TWFwLmVuYWJsZWQmJlIubGVuZ3RoPjAsc2hhZG93TWFwVHlwZTpyLnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOml0LHVzZUxlZ2FjeUxpZ2h0czpyLl91c2VMZWdhY3lMaWdodHMsZGVjb2RlVmlkZW9UZXh0dXJlOndlJiZNLm1hcC5pc1ZpZGVvVGV4dHVyZT09PSEwJiZvdC5nZXRUcmFuc2ZlcihNLm1hcC5jb2xvclNwYWNlKT09PWN0LHByZW11bHRpcGxpZWRBbHBoYTpNLnByZW11bHRpcGxpZWRBbHBoYSxkb3VibGVTaWRlZDpNLnNpZGU9PT1HbixmbGlwU2lkZWQ6TS5zaWRlPT09WXQsdXNlRGVwdGhQYWNraW5nOk0uZGVwdGhQYWNraW5nPj0wLGRlcHRoUGFja2luZzpNLmRlcHRoUGFja2luZ3x8MCxpbmRleDBBdHRyaWJ1dGVOYW1lOk0uaW5kZXgwQXR0cmlidXRlTmFtZSxleHRlbnNpb25EZXJpdmF0aXZlczpoZSYmTS5leHRlbnNpb25zLmRlcml2YXRpdmVzPT09ITAsZXh0ZW5zaW9uRnJhZ0RlcHRoOmhlJiZNLmV4dGVuc2lvbnMuZnJhZ0RlcHRoPT09ITAsZXh0ZW5zaW9uRHJhd0J1ZmZlcnM6aGUmJk0uZXh0ZW5zaW9ucy5kcmF3QnVmZmVycz09PSEwLGV4dGVuc2lvblNoYWRlclRleHR1cmVMT0Q6aGUmJk0uZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EPT09ITAscmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGg6aHx8bi5oYXMoIkVYVF9mcmFnX2RlcHRoIikscmVuZGVyZXJFeHRlbnNpb25EcmF3QnVmZmVyczpofHxuLmhhcygiV0VCR0xfZHJhd19idWZmZXJzIikscmVuZGVyZXJFeHRlbnNpb25TaGFkZXJUZXh0dXJlTG9kOmh8fG4uaGFzKCJFWFRfc2hhZGVyX3RleHR1cmVfbG9kIikscmVuZGVyZXJFeHRlbnNpb25QYXJhbGxlbFNoYWRlckNvbXBpbGU6bi5oYXMoIktIUl9wYXJhbGxlbF9zaGFkZXJfY29tcGlsZSIpLGN1c3RvbVByb2dyYW1DYWNoZUtleTpNLmN1c3RvbVByb2dyYW1DYWNoZUtleSgpfX1mdW5jdGlvbiBtKE0pe2NvbnN0IHc9W107aWYoTS5zaGFkZXJJRD93LnB1c2goTS5zaGFkZXJJRCk6KHcucHVzaChNLmN1c3RvbVZlcnRleFNoYWRlcklEKSx3LnB1c2goTS5jdXN0b21GcmFnbWVudFNoYWRlcklEKSksTS5kZWZpbmVzIT09dm9pZCAwKWZvcihjb25zdCBSIGluIE0uZGVmaW5lcyl3LnB1c2goUiksdy5wdXNoKE0uZGVmaW5lc1tSXSk7cmV0dXJuIE0uaXNSYXdTaGFkZXJNYXRlcmlhbD09PSExJiYoeSh3LE0pLHgodyxNKSx3LnB1c2goci5vdXRwdXRDb2xvclNwYWNlKSksdy5wdXNoKE0uY3VzdG9tUHJvZ3JhbUNhY2hlS2V5KSx3LmpvaW4oKX1mdW5jdGlvbiB5KE0sdyl7TS5wdXNoKHcucHJlY2lzaW9uKSxNLnB1c2gody5vdXRwdXRDb2xvclNwYWNlKSxNLnB1c2gody5lbnZNYXBNb2RlKSxNLnB1c2gody5lbnZNYXBDdWJlVVZIZWlnaHQpLE0ucHVzaCh3Lm1hcFV2KSxNLnB1c2gody5hbHBoYU1hcFV2KSxNLnB1c2gody5saWdodE1hcFV2KSxNLnB1c2gody5hb01hcFV2KSxNLnB1c2gody5idW1wTWFwVXYpLE0ucHVzaCh3Lm5vcm1hbE1hcFV2KSxNLnB1c2gody5kaXNwbGFjZW1lbnRNYXBVdiksTS5wdXNoKHcuZW1pc3NpdmVNYXBVdiksTS5wdXNoKHcubWV0YWxuZXNzTWFwVXYpLE0ucHVzaCh3LnJvdWdobmVzc01hcFV2KSxNLnB1c2gody5hbmlzb3Ryb3B5TWFwVXYpLE0ucHVzaCh3LmNsZWFyY29hdE1hcFV2KSxNLnB1c2gody5jbGVhcmNvYXROb3JtYWxNYXBVdiksTS5wdXNoKHcuY2xlYXJjb2F0Um91Z2huZXNzTWFwVXYpLE0ucHVzaCh3LmlyaWRlc2NlbmNlTWFwVXYpLE0ucHVzaCh3LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYpLE0ucHVzaCh3LnNoZWVuQ29sb3JNYXBVdiksTS5wdXNoKHcuc2hlZW5Sb3VnaG5lc3NNYXBVdiksTS5wdXNoKHcuc3BlY3VsYXJNYXBVdiksTS5wdXNoKHcuc3BlY3VsYXJDb2xvck1hcFV2KSxNLnB1c2gody5zcGVjdWxhckludGVuc2l0eU1hcFV2KSxNLnB1c2gody50cmFuc21pc3Npb25NYXBVdiksTS5wdXNoKHcudGhpY2tuZXNzTWFwVXYpLE0ucHVzaCh3LmNvbWJpbmUpLE0ucHVzaCh3LmZvZ0V4cDIpLE0ucHVzaCh3LnNpemVBdHRlbnVhdGlvbiksTS5wdXNoKHcubW9ycGhUYXJnZXRzQ291bnQpLE0ucHVzaCh3Lm1vcnBoQXR0cmlidXRlQ291bnQpLE0ucHVzaCh3Lm51bURpckxpZ2h0cyksTS5wdXNoKHcubnVtUG9pbnRMaWdodHMpLE0ucHVzaCh3Lm51bVNwb3RMaWdodHMpLE0ucHVzaCh3Lm51bVNwb3RMaWdodE1hcHMpLE0ucHVzaCh3Lm51bUhlbWlMaWdodHMpLE0ucHVzaCh3Lm51bVJlY3RBcmVhTGlnaHRzKSxNLnB1c2gody5udW1EaXJMaWdodFNoYWRvd3MpLE0ucHVzaCh3Lm51bVBvaW50TGlnaHRTaGFkb3dzKSxNLnB1c2gody5udW1TcG90TGlnaHRTaGFkb3dzKSxNLnB1c2gody5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHMpLE0ucHVzaCh3Lm51bUxpZ2h0UHJvYmVzKSxNLnB1c2gody5zaGFkb3dNYXBUeXBlKSxNLnB1c2gody50b25lTWFwcGluZyksTS5wdXNoKHcubnVtQ2xpcHBpbmdQbGFuZXMpLE0ucHVzaCh3Lm51bUNsaXBJbnRlcnNlY3Rpb24pLE0ucHVzaCh3LmRlcHRoUGFja2luZyl9ZnVuY3Rpb24geChNLHcpe28uZGlzYWJsZUFsbCgpLHcuaXNXZWJHTDImJm8uZW5hYmxlKDApLHcuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyYmby5lbmFibGUoMSksdy5pbnN0YW5jaW5nJiZvLmVuYWJsZSgyKSx3Lmluc3RhbmNpbmdDb2xvciYmby5lbmFibGUoMyksdy5tYXRjYXAmJm8uZW5hYmxlKDQpLHcuZW52TWFwJiZvLmVuYWJsZSg1KSx3Lm5vcm1hbE1hcE9iamVjdFNwYWNlJiZvLmVuYWJsZSg2KSx3Lm5vcm1hbE1hcFRhbmdlbnRTcGFjZSYmby5lbmFibGUoNyksdy5jbGVhcmNvYXQmJm8uZW5hYmxlKDgpLHcuaXJpZGVzY2VuY2UmJm8uZW5hYmxlKDkpLHcuYWxwaGFUZXN0JiZvLmVuYWJsZSgxMCksdy52ZXJ0ZXhDb2xvcnMmJm8uZW5hYmxlKDExKSx3LnZlcnRleEFscGhhcyYmby5lbmFibGUoMTIpLHcudmVydGV4VXYxcyYmby5lbmFibGUoMTMpLHcudmVydGV4VXYycyYmby5lbmFibGUoMTQpLHcudmVydGV4VXYzcyYmby5lbmFibGUoMTUpLHcudmVydGV4VGFuZ2VudHMmJm8uZW5hYmxlKDE2KSx3LmFuaXNvdHJvcHkmJm8uZW5hYmxlKDE3KSx3LmFscGhhSGFzaCYmby5lbmFibGUoMTgpLHcuYmF0Y2hpbmcmJm8uZW5hYmxlKDE5KSxNLnB1c2goby5tYXNrKSxvLmRpc2FibGVBbGwoKSx3LmZvZyYmby5lbmFibGUoMCksdy51c2VGb2cmJm8uZW5hYmxlKDEpLHcuZmxhdFNoYWRpbmcmJm8uZW5hYmxlKDIpLHcubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmby5lbmFibGUoMyksdy5za2lubmluZyYmby5lbmFibGUoNCksdy5tb3JwaFRhcmdldHMmJm8uZW5hYmxlKDUpLHcubW9ycGhOb3JtYWxzJiZvLmVuYWJsZSg2KSx3Lm1vcnBoQ29sb3JzJiZvLmVuYWJsZSg3KSx3LnByZW11bHRpcGxpZWRBbHBoYSYmby5lbmFibGUoOCksdy5zaGFkb3dNYXBFbmFibGVkJiZvLmVuYWJsZSg5KSx3LnVzZUxlZ2FjeUxpZ2h0cyYmby5lbmFibGUoMTApLHcuZG91YmxlU2lkZWQmJm8uZW5hYmxlKDExKSx3LmZsaXBTaWRlZCYmby5lbmFibGUoMTIpLHcudXNlRGVwdGhQYWNraW5nJiZvLmVuYWJsZSgxMyksdy5kaXRoZXJpbmcmJm8uZW5hYmxlKDE0KSx3LnRyYW5zbWlzc2lvbiYmby5lbmFibGUoMTUpLHcuc2hlZW4mJm8uZW5hYmxlKDE2KSx3Lm9wYXF1ZSYmby5lbmFibGUoMTcpLHcucG9pbnRzVXZzJiZvLmVuYWJsZSgxOCksdy5kZWNvZGVWaWRlb1RleHR1cmUmJm8uZW5hYmxlKDE5KSxNLnB1c2goby5tYXNrKX1mdW5jdGlvbiB2KE0pe2NvbnN0IHc9cFtNLnR5cGVdO2xldCBSO2lmKHcpe2NvbnN0IE49Tm5bd107Uj1YZC5jbG9uZShOLnVuaWZvcm1zKX1lbHNlIFI9TS51bmlmb3JtcztyZXR1cm4gUn1mdW5jdGlvbiBTKE0sdyl7bGV0IFI7Zm9yKGxldCBOPTAsQj1jLmxlbmd0aDtOPEI7TisrKXtjb25zdCBJPWNbTl07aWYoSS5jYWNoZUtleT09PXcpe1I9SSwrK1IudXNlZFRpbWVzO2JyZWFrfX1yZXR1cm4gUj09PXZvaWQgMCYmKFI9bmV3IHJTKHIsdyxNLHMpLGMucHVzaChSKSksUn1mdW5jdGlvbiBiKE0pe2lmKC0tTS51c2VkVGltZXM9PT0wKXtjb25zdCB3PWMuaW5kZXhPZihNKTtjW3ddPWNbYy5sZW5ndGgtMV0sYy5wb3AoKSxNLmRlc3Ryb3koKX19ZnVuY3Rpb24gQShNKXtsLnJlbW92ZShNKX1mdW5jdGlvbiBMKCl7bC5kaXNwb3NlKCl9cmV0dXJue2dldFBhcmFtZXRlcnM6ZyxnZXRQcm9ncmFtQ2FjaGVLZXk6bSxnZXRVbmlmb3Jtczp2LGFjcXVpcmVQcm9ncmFtOlMscmVsZWFzZVByb2dyYW06YixyZWxlYXNlU2hhZGVyQ2FjaGU6QSxwcm9ncmFtczpjLGRpc3Bvc2U6TH19ZnVuY3Rpb24gY1MoKXtsZXQgcj1uZXcgV2Vha01hcDtmdW5jdGlvbiBlKHMpe2xldCBhPXIuZ2V0KHMpO3JldHVybiBhPT09dm9pZCAwJiYoYT17fSxyLnNldChzLGEpKSxhfWZ1bmN0aW9uIHQocyl7ci5kZWxldGUocyl9ZnVuY3Rpb24gbihzLGEsbyl7ci5nZXQocylbYV09b31mdW5jdGlvbiBpKCl7cj1uZXcgV2Vha01hcH1yZXR1cm57Z2V0OmUscmVtb3ZlOnQsdXBkYXRlOm4sZGlzcG9zZTppfX1mdW5jdGlvbiBoUyhyLGUpe3JldHVybiByLmdyb3VwT3JkZXIhPT1lLmdyb3VwT3JkZXI/ci5ncm91cE9yZGVyLWUuZ3JvdXBPcmRlcjpyLnJlbmRlck9yZGVyIT09ZS5yZW5kZXJPcmRlcj9yLnJlbmRlck9yZGVyLWUucmVuZGVyT3JkZXI6ci5tYXRlcmlhbC5pZCE9PWUubWF0ZXJpYWwuaWQ/ci5tYXRlcmlhbC5pZC1lLm1hdGVyaWFsLmlkOnIueiE9PWUuej9yLnotZS56OnIuaWQtZS5pZH1mdW5jdGlvbiB4cChyLGUpe3JldHVybiByLmdyb3VwT3JkZXIhPT1lLmdyb3VwT3JkZXI/ci5ncm91cE9yZGVyLWUuZ3JvdXBPcmRlcjpyLnJlbmRlck9yZGVyIT09ZS5yZW5kZXJPcmRlcj9yLnJlbmRlck9yZGVyLWUucmVuZGVyT3JkZXI6ci56IT09ZS56P2Uuei1yLno6ci5pZC1lLmlkfWZ1bmN0aW9uIHlwKCl7Y29uc3Qgcj1bXTtsZXQgZT0wO2NvbnN0IHQ9W10sbj1bXSxpPVtdO2Z1bmN0aW9uIHMoKXtlPTAsdC5sZW5ndGg9MCxuLmxlbmd0aD0wLGkubGVuZ3RoPTB9ZnVuY3Rpb24gYSh1LGYsZCxwLF8sZyl7bGV0IG09cltlXTtyZXR1cm4gbT09PXZvaWQgMD8obT17aWQ6dS5pZCxvYmplY3Q6dSxnZW9tZXRyeTpmLG1hdGVyaWFsOmQsZ3JvdXBPcmRlcjpwLHJlbmRlck9yZGVyOnUucmVuZGVyT3JkZXIsejpfLGdyb3VwOmd9LHJbZV09bSk6KG0uaWQ9dS5pZCxtLm9iamVjdD11LG0uZ2VvbWV0cnk9ZixtLm1hdGVyaWFsPWQsbS5ncm91cE9yZGVyPXAsbS5yZW5kZXJPcmRlcj11LnJlbmRlck9yZGVyLG0uej1fLG0uZ3JvdXA9ZyksZSsrLG19ZnVuY3Rpb24gbyh1LGYsZCxwLF8sZyl7Y29uc3QgbT1hKHUsZixkLHAsXyxnKTtkLnRyYW5zbWlzc2lvbj4wP24ucHVzaChtKTpkLnRyYW5zcGFyZW50PT09ITA/aS5wdXNoKG0pOnQucHVzaChtKX1mdW5jdGlvbiBsKHUsZixkLHAsXyxnKXtjb25zdCBtPWEodSxmLGQscCxfLGcpO2QudHJhbnNtaXNzaW9uPjA/bi51bnNoaWZ0KG0pOmQudHJhbnNwYXJlbnQ9PT0hMD9pLnVuc2hpZnQobSk6dC51bnNoaWZ0KG0pfWZ1bmN0aW9uIGModSxmKXt0Lmxlbmd0aD4xJiZ0LnNvcnQodXx8aFMpLG4ubGVuZ3RoPjEmJm4uc29ydChmfHx4cCksaS5sZW5ndGg+MSYmaS5zb3J0KGZ8fHhwKX1mdW5jdGlvbiBoKCl7Zm9yKGxldCB1PWUsZj1yLmxlbmd0aDt1PGY7dSsrKXtjb25zdCBkPXJbdV07aWYoZC5pZD09PW51bGwpYnJlYWs7ZC5pZD1udWxsLGQub2JqZWN0PW51bGwsZC5nZW9tZXRyeT1udWxsLGQubWF0ZXJpYWw9bnVsbCxkLmdyb3VwPW51bGx9fXJldHVybntvcGFxdWU6dCx0cmFuc21pc3NpdmU6bix0cmFuc3BhcmVudDppLGluaXQ6cyxwdXNoOm8sdW5zaGlmdDpsLGZpbmlzaDpoLHNvcnQ6Y319ZnVuY3Rpb24gdVMoKXtsZXQgcj1uZXcgV2Vha01hcDtmdW5jdGlvbiBlKG4saSl7Y29uc3Qgcz1yLmdldChuKTtsZXQgYTtyZXR1cm4gcz09PXZvaWQgMD8oYT1uZXcgeXAsci5zZXQobixbYV0pKTppPj1zLmxlbmd0aD8oYT1uZXcgeXAscy5wdXNoKGEpKTphPXNbaV0sYX1mdW5jdGlvbiB0KCl7cj1uZXcgV2Vha01hcH1yZXR1cm57Z2V0OmUsZGlzcG9zZTp0fX1mdW5jdGlvbiBmUygpe2NvbnN0IHI9e307cmV0dXJue2dldDpmdW5jdGlvbihlKXtpZihyW2UuaWRdIT09dm9pZCAwKXJldHVybiByW2UuaWRdO2xldCB0O3N3aXRjaChlLnR5cGUpe2Nhc2UiRGlyZWN0aW9uYWxMaWdodCI6dD17ZGlyZWN0aW9uOm5ldyBQLGNvbG9yOm5ldyB5ZX07YnJlYWs7Y2FzZSJTcG90TGlnaHQiOnQ9e3Bvc2l0aW9uOm5ldyBQLGRpcmVjdGlvbjpuZXcgUCxjb2xvcjpuZXcgeWUsZGlzdGFuY2U6MCxjb25lQ29zOjAscGVudW1icmFDb3M6MCxkZWNheTowfTticmVhaztjYXNlIlBvaW50TGlnaHQiOnQ9e3Bvc2l0aW9uOm5ldyBQLGNvbG9yOm5ldyB5ZSxkaXN0YW5jZTowLGRlY2F5OjB9O2JyZWFrO2Nhc2UiSGVtaXNwaGVyZUxpZ2h0Ijp0PXtkaXJlY3Rpb246bmV3IFAsc2t5Q29sb3I6bmV3IHllLGdyb3VuZENvbG9yOm5ldyB5ZX07YnJlYWs7Y2FzZSJSZWN0QXJlYUxpZ2h0Ijp0PXtjb2xvcjpuZXcgeWUscG9zaXRpb246bmV3IFAsaGFsZldpZHRoOm5ldyBQLGhhbGZIZWlnaHQ6bmV3IFB9O2JyZWFrfXJldHVybiByW2UuaWRdPXQsdH19fWZ1bmN0aW9uIGRTKCl7Y29uc3Qgcj17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe2lmKHJbZS5pZF0hPT12b2lkIDApcmV0dXJuIHJbZS5pZF07bGV0IHQ7c3dpdGNoKGUudHlwZSl7Y2FzZSJEaXJlY3Rpb25hbExpZ2h0Ijp0PXtzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IHF9O2JyZWFrO2Nhc2UiU3BvdExpZ2h0Ijp0PXtzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IHF9O2JyZWFrO2Nhc2UiUG9pbnRMaWdodCI6dD17c2hhZG93QmlhczowLHNoYWRvd05vcm1hbEJpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBxLHNoYWRvd0NhbWVyYU5lYXI6MSxzaGFkb3dDYW1lcmFGYXI6MWUzfTticmVha31yZXR1cm4gcltlLmlkXT10LHR9fX1sZXQgcFM9MDtmdW5jdGlvbiBtUyhyLGUpe3JldHVybihlLmNhc3RTaGFkb3c/MjowKS0oci5jYXN0U2hhZG93PzI6MCkrKGUubWFwPzE6MCktKHIubWFwPzE6MCl9ZnVuY3Rpb24gZ1MocixlKXtjb25zdCB0PW5ldyBmUyxuPWRTKCksaT17dmVyc2lvbjowLGhhc2g6e2RpcmVjdGlvbmFsTGVuZ3RoOi0xLHBvaW50TGVuZ3RoOi0xLHNwb3RMZW5ndGg6LTEscmVjdEFyZWFMZW5ndGg6LTEsaGVtaUxlbmd0aDotMSxudW1EaXJlY3Rpb25hbFNoYWRvd3M6LTEsbnVtUG9pbnRTaGFkb3dzOi0xLG51bVNwb3RTaGFkb3dzOi0xLG51bVNwb3RNYXBzOi0xLG51bUxpZ2h0UHJvYmVzOi0xfSxhbWJpZW50OlswLDAsMF0scHJvYmU6W10sZGlyZWN0aW9uYWw6W10sZGlyZWN0aW9uYWxTaGFkb3c6W10sZGlyZWN0aW9uYWxTaGFkb3dNYXA6W10sZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6W10sc3BvdDpbXSxzcG90TGlnaHRNYXA6W10sc3BvdFNoYWRvdzpbXSxzcG90U2hhZG93TWFwOltdLHNwb3RMaWdodE1hdHJpeDpbXSxyZWN0QXJlYTpbXSxyZWN0QXJlYUxUQzE6bnVsbCxyZWN0QXJlYUxUQzI6bnVsbCxwb2ludDpbXSxwb2ludFNoYWRvdzpbXSxwb2ludFNoYWRvd01hcDpbXSxwb2ludFNoYWRvd01hdHJpeDpbXSxoZW1pOltdLG51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwczowLG51bUxpZ2h0UHJvYmVzOjB9O2ZvcihsZXQgaD0wO2g8OTtoKyspaS5wcm9iZS5wdXNoKG5ldyBQKTtjb25zdCBzPW5ldyBQLGE9bmV3IEllLG89bmV3IEllO2Z1bmN0aW9uIGwoaCx1KXtsZXQgZj0wLGQ9MCxwPTA7Zm9yKGxldCBOPTA7Tjw5O04rKylpLnByb2JlW05dLnNldCgwLDAsMCk7bGV0IF89MCxnPTAsbT0wLHk9MCx4PTAsdj0wLFM9MCxiPTAsQT0wLEw9MCxNPTA7aC5zb3J0KG1TKTtjb25zdCB3PXU9PT0hMD9NYXRoLlBJOjE7Zm9yKGxldCBOPTAsQj1oLmxlbmd0aDtOPEI7TisrKXtjb25zdCBJPWhbTl0sVT1JLmNvbG9yLHo9SS5pbnRlbnNpdHksRj1JLmRpc3RhbmNlLFo9SS5zaGFkb3cmJkkuc2hhZG93Lm1hcD9JLnNoYWRvdy5tYXAudGV4dHVyZTpudWxsO2lmKEkuaXNBbWJpZW50TGlnaHQpZis9VS5yKnoqdyxkKz1VLmcqeip3LHArPVUuYip6Knc7ZWxzZSBpZihJLmlzTGlnaHRQcm9iZSl7Zm9yKGxldCBWPTA7Vjw5O1YrKylpLnByb2JlW1ZdLmFkZFNjYWxlZFZlY3RvcihJLnNoLmNvZWZmaWNpZW50c1tWXSx6KTtNKyt9ZWxzZSBpZihJLmlzRGlyZWN0aW9uYWxMaWdodCl7Y29uc3QgVj10LmdldChJKTtpZihWLmNvbG9yLmNvcHkoSS5jb2xvcikubXVsdGlwbHlTY2FsYXIoSS5pbnRlbnNpdHkqdyksSS5jYXN0U2hhZG93KXtjb25zdCBRPUkuc2hhZG93LG5lPW4uZ2V0KEkpO25lLnNoYWRvd0JpYXM9US5iaWFzLG5lLnNoYWRvd05vcm1hbEJpYXM9US5ub3JtYWxCaWFzLG5lLnNoYWRvd1JhZGl1cz1RLnJhZGl1cyxuZS5zaGFkb3dNYXBTaXplPVEubWFwU2l6ZSxpLmRpcmVjdGlvbmFsU2hhZG93W19dPW5lLGkuZGlyZWN0aW9uYWxTaGFkb3dNYXBbX109WixpLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4W19dPUkuc2hhZG93Lm1hdHJpeCx2Kyt9aS5kaXJlY3Rpb25hbFtfXT1WLF8rK31lbHNlIGlmKEkuaXNTcG90TGlnaHQpe2NvbnN0IFY9dC5nZXQoSSk7Vi5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oSS5tYXRyaXhXb3JsZCksVi5jb2xvci5jb3B5KFUpLm11bHRpcGx5U2NhbGFyKHoqdyksVi5kaXN0YW5jZT1GLFYuY29uZUNvcz1NYXRoLmNvcyhJLmFuZ2xlKSxWLnBlbnVtYnJhQ29zPU1hdGguY29zKEkuYW5nbGUqKDEtSS5wZW51bWJyYSkpLFYuZGVjYXk9SS5kZWNheSxpLnNwb3RbbV09Vjtjb25zdCBRPUkuc2hhZG93O2lmKEkubWFwJiYoaS5zcG90TGlnaHRNYXBbQV09SS5tYXAsQSsrLFEudXBkYXRlTWF0cmljZXMoSSksSS5jYXN0U2hhZG93JiZMKyspLGkuc3BvdExpZ2h0TWF0cml4W21dPVEubWF0cml4LEkuY2FzdFNoYWRvdyl7Y29uc3QgbmU9bi5nZXQoSSk7bmUuc2hhZG93Qmlhcz1RLmJpYXMsbmUuc2hhZG93Tm9ybWFsQmlhcz1RLm5vcm1hbEJpYXMsbmUuc2hhZG93UmFkaXVzPVEucmFkaXVzLG5lLnNoYWRvd01hcFNpemU9US5tYXBTaXplLGkuc3BvdFNoYWRvd1ttXT1uZSxpLnNwb3RTaGFkb3dNYXBbbV09WixiKyt9bSsrfWVsc2UgaWYoSS5pc1JlY3RBcmVhTGlnaHQpe2NvbnN0IFY9dC5nZXQoSSk7Vi5jb2xvci5jb3B5KFUpLm11bHRpcGx5U2NhbGFyKHopLFYuaGFsZldpZHRoLnNldChJLndpZHRoKi41LDAsMCksVi5oYWxmSGVpZ2h0LnNldCgwLEkuaGVpZ2h0Ki41LDApLGkucmVjdEFyZWFbeV09Vix5Kyt9ZWxzZSBpZihJLmlzUG9pbnRMaWdodCl7Y29uc3QgVj10LmdldChJKTtpZihWLmNvbG9yLmNvcHkoSS5jb2xvcikubXVsdGlwbHlTY2FsYXIoSS5pbnRlbnNpdHkqdyksVi5kaXN0YW5jZT1JLmRpc3RhbmNlLFYuZGVjYXk9SS5kZWNheSxJLmNhc3RTaGFkb3cpe2NvbnN0IFE9SS5zaGFkb3csbmU9bi5nZXQoSSk7bmUuc2hhZG93Qmlhcz1RLmJpYXMsbmUuc2hhZG93Tm9ybWFsQmlhcz1RLm5vcm1hbEJpYXMsbmUuc2hhZG93UmFkaXVzPVEucmFkaXVzLG5lLnNoYWRvd01hcFNpemU9US5tYXBTaXplLG5lLnNoYWRvd0NhbWVyYU5lYXI9US5jYW1lcmEubmVhcixuZS5zaGFkb3dDYW1lcmFGYXI9US5jYW1lcmEuZmFyLGkucG9pbnRTaGFkb3dbZ109bmUsaS5wb2ludFNoYWRvd01hcFtnXT1aLGkucG9pbnRTaGFkb3dNYXRyaXhbZ109SS5zaGFkb3cubWF0cml4LFMrK31pLnBvaW50W2ddPVYsZysrfWVsc2UgaWYoSS5pc0hlbWlzcGhlcmVMaWdodCl7Y29uc3QgVj10LmdldChJKTtWLnNreUNvbG9yLmNvcHkoSS5jb2xvcikubXVsdGlwbHlTY2FsYXIoeip3KSxWLmdyb3VuZENvbG9yLmNvcHkoSS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoeip3KSxpLmhlbWlbeF09Vix4Kyt9fXk+MCYmKGUuaXNXZWJHTDJ8fHIuaGFzKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKT09PSEwPyhpLnJlY3RBcmVhTFRDMT1fZS5MVENfRkxPQVRfMSxpLnJlY3RBcmVhTFRDMj1fZS5MVENfRkxPQVRfMik6ci5oYXMoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIik9PT0hMD8oaS5yZWN0QXJlYUxUQzE9X2UuTFRDX0hBTEZfMSxpLnJlY3RBcmVhTFRDMj1fZS5MVENfSEFMRl8yKTpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVbmFibGUgdG8gdXNlIFJlY3RBcmVhTGlnaHQuIE1pc3NpbmcgV2ViR0wgZXh0ZW5zaW9ucy4iKSksaS5hbWJpZW50WzBdPWYsaS5hbWJpZW50WzFdPWQsaS5hbWJpZW50WzJdPXA7Y29uc3QgUj1pLmhhc2g7KFIuZGlyZWN0aW9uYWxMZW5ndGghPT1ffHxSLnBvaW50TGVuZ3RoIT09Z3x8Ui5zcG90TGVuZ3RoIT09bXx8Ui5yZWN0QXJlYUxlbmd0aCE9PXl8fFIuaGVtaUxlbmd0aCE9PXh8fFIubnVtRGlyZWN0aW9uYWxTaGFkb3dzIT09dnx8Ui5udW1Qb2ludFNoYWRvd3MhPT1TfHxSLm51bVNwb3RTaGFkb3dzIT09Ynx8Ui5udW1TcG90TWFwcyE9PUF8fFIubnVtTGlnaHRQcm9iZXMhPT1NKSYmKGkuZGlyZWN0aW9uYWwubGVuZ3RoPV8saS5zcG90Lmxlbmd0aD1tLGkucmVjdEFyZWEubGVuZ3RoPXksaS5wb2ludC5sZW5ndGg9ZyxpLmhlbWkubGVuZ3RoPXgsaS5kaXJlY3Rpb25hbFNoYWRvdy5sZW5ndGg9dixpLmRpcmVjdGlvbmFsU2hhZG93TWFwLmxlbmd0aD12LGkucG9pbnRTaGFkb3cubGVuZ3RoPVMsaS5wb2ludFNoYWRvd01hcC5sZW5ndGg9UyxpLnNwb3RTaGFkb3cubGVuZ3RoPWIsaS5zcG90U2hhZG93TWFwLmxlbmd0aD1iLGkuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgubGVuZ3RoPXYsaS5wb2ludFNoYWRvd01hdHJpeC5sZW5ndGg9UyxpLnNwb3RMaWdodE1hdHJpeC5sZW5ndGg9YitBLUwsaS5zcG90TGlnaHRNYXAubGVuZ3RoPUEsaS5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM9TCxpLm51bUxpZ2h0UHJvYmVzPU0sUi5kaXJlY3Rpb25hbExlbmd0aD1fLFIucG9pbnRMZW5ndGg9ZyxSLnNwb3RMZW5ndGg9bSxSLnJlY3RBcmVhTGVuZ3RoPXksUi5oZW1pTGVuZ3RoPXgsUi5udW1EaXJlY3Rpb25hbFNoYWRvd3M9dixSLm51bVBvaW50U2hhZG93cz1TLFIubnVtU3BvdFNoYWRvd3M9YixSLm51bVNwb3RNYXBzPUEsUi5udW1MaWdodFByb2Jlcz1NLGkudmVyc2lvbj1wUysrKX1mdW5jdGlvbiBjKGgsdSl7bGV0IGY9MCxkPTAscD0wLF89MCxnPTA7Y29uc3QgbT11Lm1hdHJpeFdvcmxkSW52ZXJzZTtmb3IobGV0IHk9MCx4PWgubGVuZ3RoO3k8eDt5Kyspe2NvbnN0IHY9aFt5XTtpZih2LmlzRGlyZWN0aW9uYWxMaWdodCl7Y29uc3QgUz1pLmRpcmVjdGlvbmFsW2ZdO1MuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbih2Lm1hdHJpeFdvcmxkKSxzLnNldEZyb21NYXRyaXhQb3NpdGlvbih2LnRhcmdldC5tYXRyaXhXb3JsZCksUy5kaXJlY3Rpb24uc3ViKHMpLFMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihtKSxmKyt9ZWxzZSBpZih2LmlzU3BvdExpZ2h0KXtjb25zdCBTPWkuc3BvdFtwXTtTLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbih2Lm1hdHJpeFdvcmxkKSxTLnBvc2l0aW9uLmFwcGx5TWF0cml4NChtKSxTLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24odi5tYXRyaXhXb3JsZCkscy5zZXRGcm9tTWF0cml4UG9zaXRpb24odi50YXJnZXQubWF0cml4V29ybGQpLFMuZGlyZWN0aW9uLnN1YihzKSxTLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24obSkscCsrfWVsc2UgaWYodi5pc1JlY3RBcmVhTGlnaHQpe2NvbnN0IFM9aS5yZWN0QXJlYVtfXTtTLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbih2Lm1hdHJpeFdvcmxkKSxTLnBvc2l0aW9uLmFwcGx5TWF0cml4NChtKSxvLmlkZW50aXR5KCksYS5jb3B5KHYubWF0cml4V29ybGQpLGEucHJlbXVsdGlwbHkobSksby5leHRyYWN0Um90YXRpb24oYSksUy5oYWxmV2lkdGguc2V0KHYud2lkdGgqLjUsMCwwKSxTLmhhbGZIZWlnaHQuc2V0KDAsdi5oZWlnaHQqLjUsMCksUy5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KG8pLFMuaGFsZkhlaWdodC5hcHBseU1hdHJpeDQobyksXysrfWVsc2UgaWYodi5pc1BvaW50TGlnaHQpe2NvbnN0IFM9aS5wb2ludFtkXTtTLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbih2Lm1hdHJpeFdvcmxkKSxTLnBvc2l0aW9uLmFwcGx5TWF0cml4NChtKSxkKyt9ZWxzZSBpZih2LmlzSGVtaXNwaGVyZUxpZ2h0KXtjb25zdCBTPWkuaGVtaVtnXTtTLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24odi5tYXRyaXhXb3JsZCksUy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKG0pLGcrK319fXJldHVybntzZXR1cDpsLHNldHVwVmlldzpjLHN0YXRlOml9fWZ1bmN0aW9uIHZwKHIsZSl7Y29uc3QgdD1uZXcgZ1MocixlKSxuPVtdLGk9W107ZnVuY3Rpb24gcygpe24ubGVuZ3RoPTAsaS5sZW5ndGg9MH1mdW5jdGlvbiBhKHUpe24ucHVzaCh1KX1mdW5jdGlvbiBvKHUpe2kucHVzaCh1KX1mdW5jdGlvbiBsKHUpe3Quc2V0dXAobix1KX1mdW5jdGlvbiBjKHUpe3Quc2V0dXBWaWV3KG4sdSl9cmV0dXJue2luaXQ6cyxzdGF0ZTp7bGlnaHRzQXJyYXk6bixzaGFkb3dzQXJyYXk6aSxsaWdodHM6dH0sc2V0dXBMaWdodHM6bCxzZXR1cExpZ2h0c1ZpZXc6YyxwdXNoTGlnaHQ6YSxwdXNoU2hhZG93Om99fWZ1bmN0aW9uIF9TKHIsZSl7bGV0IHQ9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gbihzLGE9MCl7Y29uc3Qgbz10LmdldChzKTtsZXQgbDtyZXR1cm4gbz09PXZvaWQgMD8obD1uZXcgdnAocixlKSx0LnNldChzLFtsXSkpOmE+PW8ubGVuZ3RoPyhsPW5ldyB2cChyLGUpLG8ucHVzaChsKSk6bD1vW2FdLGx9ZnVuY3Rpb24gaSgpe3Q9bmV3IFdlYWtNYXB9cmV0dXJue2dldDpuLGRpc3Bvc2U6aX19Y2xhc3MgTGggZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNNZXNoRGVwdGhNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hEZXB0aE1hdGVyaWFsIix0aGlzLmRlcHRoUGFja2luZz1kZCx0aGlzLm1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuc2V0VmFsdWVzKGUpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5kZXB0aFBhY2tpbmc9ZS5kZXB0aFBhY2tpbmcsdGhpcy5tYXA9ZS5tYXAsdGhpcy5hbHBoYU1hcD1lLmFscGhhTWFwLHRoaXMuZGlzcGxhY2VtZW50TWFwPWUuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9ZS5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9ZS5kaXNwbGFjZW1lbnRCaWFzLHRoaXMud2lyZWZyYW1lPWUud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPWUud2lyZWZyYW1lTGluZXdpZHRoLHRoaXN9fWNsYXNzIEloIGV4dGVuZHMgSHR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJNZXNoRGlzdGFuY2VNYXRlcmlhbCIsdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5zZXRWYWx1ZXMoZSl9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLm1hcD1lLm1hcCx0aGlzLmFscGhhTWFwPWUuYWxwaGFNYXAsdGhpcy5kaXNwbGFjZW1lbnRNYXA9ZS5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1lLmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz1lLmRpc3BsYWNlbWVudEJpYXMsdGhpc319Y29uc3QgeFM9YHZvaWQgbWFpbigpIHsKCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApOwp9YCx5Uz1gdW5pZm9ybSBzYW1wbGVyMkQgc2hhZG93X3Bhc3M7CnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uOwp1bmlmb3JtIGZsb2F0IHJhZGl1czsKI2luY2x1ZGUgPHBhY2tpbmc+CnZvaWQgbWFpbigpIHsKCWNvbnN0IGZsb2F0IHNhbXBsZXMgPSBmbG9hdCggVlNNX1NBTVBMRVMgKTsKCWZsb2F0IG1lYW4gPSAwLjA7CglmbG9hdCBzcXVhcmVkX21lYW4gPSAwLjA7CglmbG9hdCB1dlN0cmlkZSA9IHNhbXBsZXMgPD0gMS4wID8gMC4wIDogMi4wIC8gKCBzYW1wbGVzIC0gMS4wICk7CglmbG9hdCB1dlN0YXJ0ID0gc2FtcGxlcyA8PSAxLjAgPyAwLjAgOiAtIDEuMDsKCWZvciAoIGZsb2F0IGkgPSAwLjA7IGkgPCBzYW1wbGVzOyBpICsrICkgewoJCWZsb2F0IHV2T2Zmc2V0ID0gdXZTdGFydCArIGkgKiB1dlN0cmlkZTsKCQkjaWZkZWYgSE9SSVpPTlRBTF9QQVNTCgkJCXZlYzIgZGlzdHJpYnV0aW9uID0gdW5wYWNrUkdCQVRvMkhhbGYoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggdXZPZmZzZXQsIDAuMCApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTsKCQkJbWVhbiArPSBkaXN0cmlidXRpb24ueDsKCQkJc3F1YXJlZF9tZWFuICs9IGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54OwoJCSNlbHNlCgkJCWZsb2F0IGRlcHRoID0gdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggMC4wLCB1dk9mZnNldCApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTsKCQkJbWVhbiArPSBkZXB0aDsKCQkJc3F1YXJlZF9tZWFuICs9IGRlcHRoICogZGVwdGg7CgkJI2VuZGlmCgl9CgltZWFuID0gbWVhbiAvIHNhbXBsZXM7CglzcXVhcmVkX21lYW4gPSBzcXVhcmVkX21lYW4gLyBzYW1wbGVzOwoJZmxvYXQgc3RkX2RldiA9IHNxcnQoIHNxdWFyZWRfbWVhbiAtIG1lYW4gKiBtZWFuICk7CglnbF9GcmFnQ29sb3IgPSBwYWNrMkhhbGZUb1JHQkEoIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKSApOwp9YDtmdW5jdGlvbiB2UyhyLGUsdCl7bGV0IG49bmV3IHFzO2NvbnN0IGk9bmV3IHEscz1uZXcgcSxhPW5ldyBsdCxvPW5ldyBMaCh7ZGVwdGhQYWNraW5nOnBkfSksbD1uZXcgSWgsYz17fSxoPXQubWF4VGV4dHVyZVNpemUsdT17W1luXTpZdCxbWXRdOlluLFtHbl06R259LGY9bmV3IEhuKHtkZWZpbmVzOntWU01fU0FNUExFUzo4fSx1bmlmb3Jtczp7c2hhZG93X3Bhc3M6e3ZhbHVlOm51bGx9LHJlc29sdXRpb246e3ZhbHVlOm5ldyBxfSxyYWRpdXM6e3ZhbHVlOjR9fSx2ZXJ0ZXhTaGFkZXI6eFMsZnJhZ21lbnRTaGFkZXI6eVN9KSxkPWYuY2xvbmUoKTtkLmRlZmluZXMuSE9SSVpPTlRBTF9QQVNTPTE7Y29uc3QgcD1uZXcga2U7cC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgS2UobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO2NvbnN0IF89bmV3IEx0KHAsZiksZz10aGlzO3RoaXMuZW5hYmxlZD0hMSx0aGlzLmF1dG9VcGRhdGU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMSx0aGlzLnR5cGU9Q247bGV0IG09dGhpcy50eXBlO3RoaXMucmVuZGVyPWZ1bmN0aW9uKFMsYixBKXtpZihnLmVuYWJsZWQ9PT0hMXx8Zy5hdXRvVXBkYXRlPT09ITEmJmcubmVlZHNVcGRhdGU9PT0hMXx8Uy5sZW5ndGg9PT0wKXJldHVybjtjb25zdCBMPXIuZ2V0UmVuZGVyVGFyZ2V0KCksTT1yLmdldEFjdGl2ZUN1YmVGYWNlKCksdz1yLmdldEFjdGl2ZU1pcG1hcExldmVsKCksUj1yLnN0YXRlO1Iuc2V0QmxlbmRpbmcoWm4pLFIuYnVmZmVycy5jb2xvci5zZXRDbGVhcigxLDEsMSwxKSxSLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCksUi5zZXRTY2lzc29yVGVzdCghMSk7Y29uc3QgTj1tIT09a24mJnRoaXMudHlwZT09PWtuLEI9bT09PWtuJiZ0aGlzLnR5cGUhPT1rbjtmb3IobGV0IEk9MCxVPVMubGVuZ3RoO0k8VTtJKyspe2NvbnN0IHo9U1tJXSxGPXouc2hhZG93O2lmKEY9PT12b2lkIDApe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6Iix6LCJoYXMgbm8gc2hhZG93LiIpO2NvbnRpbnVlfWlmKEYuYXV0b1VwZGF0ZT09PSExJiZGLm5lZWRzVXBkYXRlPT09ITEpY29udGludWU7aS5jb3B5KEYubWFwU2l6ZSk7Y29uc3QgWj1GLmdldEZyYW1lRXh0ZW50cygpO2lmKGkubXVsdGlwbHkoWikscy5jb3B5KEYubWFwU2l6ZSksKGkueD5ofHxpLnk+aCkmJihpLng+aCYmKHMueD1NYXRoLmZsb29yKGgvWi54KSxpLng9cy54KloueCxGLm1hcFNpemUueD1zLngpLGkueT5oJiYocy55PU1hdGguZmxvb3IoaC9aLnkpLGkueT1zLnkqWi55LEYubWFwU2l6ZS55PXMueSkpLEYubWFwPT09bnVsbHx8Tj09PSEwfHxCPT09ITApe2NvbnN0IFE9dGhpcy50eXBlIT09a24/e21pbkZpbHRlcjpidCxtYWdGaWx0ZXI6YnR9Ont9O0YubWFwIT09bnVsbCYmRi5tYXAuZGlzcG9zZSgpLEYubWFwPW5ldyBMbihpLngsaS55LFEpLEYubWFwLnRleHR1cmUubmFtZT16Lm5hbWUrIi5zaGFkb3dNYXAiLEYuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1yLnNldFJlbmRlclRhcmdldChGLm1hcCksci5jbGVhcigpO2NvbnN0IFY9Ri5nZXRWaWV3cG9ydENvdW50KCk7Zm9yKGxldCBRPTA7UTxWO1ErKyl7Y29uc3QgbmU9Ri5nZXRWaWV3cG9ydChRKTthLnNldChzLngqbmUueCxzLnkqbmUueSxzLngqbmUueixzLnkqbmUudyksUi52aWV3cG9ydChhKSxGLnVwZGF0ZU1hdHJpY2VzKHosUSksbj1GLmdldEZydXN0dW0oKSx2KGIsQSxGLmNhbWVyYSx6LHRoaXMudHlwZSl9Ri5pc1BvaW50TGlnaHRTaGFkb3chPT0hMCYmdGhpcy50eXBlPT09a24mJnkoRixBKSxGLm5lZWRzVXBkYXRlPSExfW09dGhpcy50eXBlLGcubmVlZHNVcGRhdGU9ITEsci5zZXRSZW5kZXJUYXJnZXQoTCxNLHcpfTtmdW5jdGlvbiB5KFMsYil7Y29uc3QgQT1lLnVwZGF0ZShfKTtmLmRlZmluZXMuVlNNX1NBTVBMRVMhPT1TLmJsdXJTYW1wbGVzJiYoZi5kZWZpbmVzLlZTTV9TQU1QTEVTPVMuYmx1clNhbXBsZXMsZC5kZWZpbmVzLlZTTV9TQU1QTEVTPVMuYmx1clNhbXBsZXMsZi5uZWVkc1VwZGF0ZT0hMCxkLm5lZWRzVXBkYXRlPSEwKSxTLm1hcFBhc3M9PT1udWxsJiYoUy5tYXBQYXNzPW5ldyBMbihpLngsaS55KSksZi51bmlmb3Jtcy5zaGFkb3dfcGFzcy52YWx1ZT1TLm1hcC50ZXh0dXJlLGYudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT1TLm1hcFNpemUsZi51bmlmb3Jtcy5yYWRpdXMudmFsdWU9Uy5yYWRpdXMsci5zZXRSZW5kZXJUYXJnZXQoUy5tYXBQYXNzKSxyLmNsZWFyKCksci5yZW5kZXJCdWZmZXJEaXJlY3QoYixudWxsLEEsZixfLG51bGwpLGQudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9Uy5tYXBQYXNzLnRleHR1cmUsZC51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPVMubWFwU2l6ZSxkLnVuaWZvcm1zLnJhZGl1cy52YWx1ZT1TLnJhZGl1cyxyLnNldFJlbmRlclRhcmdldChTLm1hcCksci5jbGVhcigpLHIucmVuZGVyQnVmZmVyRGlyZWN0KGIsbnVsbCxBLGQsXyxudWxsKX1mdW5jdGlvbiB4KFMsYixBLEwpe2xldCBNPW51bGw7Y29uc3Qgdz1BLmlzUG9pbnRMaWdodD09PSEwP1MuY3VzdG9tRGlzdGFuY2VNYXRlcmlhbDpTLmN1c3RvbURlcHRoTWF0ZXJpYWw7aWYodyE9PXZvaWQgMClNPXc7ZWxzZSBpZihNPUEuaXNQb2ludExpZ2h0PT09ITA/bDpvLHIubG9jYWxDbGlwcGluZ0VuYWJsZWQmJmIuY2xpcFNoYWRvd3M9PT0hMCYmQXJyYXkuaXNBcnJheShiLmNsaXBwaW5nUGxhbmVzKSYmYi5jbGlwcGluZ1BsYW5lcy5sZW5ndGghPT0wfHxiLmRpc3BsYWNlbWVudE1hcCYmYi5kaXNwbGFjZW1lbnRTY2FsZSE9PTB8fGIuYWxwaGFNYXAmJmIuYWxwaGFUZXN0PjB8fGIubWFwJiZiLmFscGhhVGVzdD4wKXtjb25zdCBSPU0udXVpZCxOPWIudXVpZDtsZXQgQj1jW1JdO0I9PT12b2lkIDAmJihCPXt9LGNbUl09Qik7bGV0IEk9QltOXTtJPT09dm9pZCAwJiYoST1NLmNsb25lKCksQltOXT1JKSxNPUl9aWYoTS52aXNpYmxlPWIudmlzaWJsZSxNLndpcmVmcmFtZT1iLndpcmVmcmFtZSxMPT09a24/TS5zaWRlPWIuc2hhZG93U2lkZSE9PW51bGw/Yi5zaGFkb3dTaWRlOmIuc2lkZTpNLnNpZGU9Yi5zaGFkb3dTaWRlIT09bnVsbD9iLnNoYWRvd1NpZGU6dVtiLnNpZGVdLE0uYWxwaGFNYXA9Yi5hbHBoYU1hcCxNLmFscGhhVGVzdD1iLmFscGhhVGVzdCxNLm1hcD1iLm1hcCxNLmNsaXBTaGFkb3dzPWIuY2xpcFNoYWRvd3MsTS5jbGlwcGluZ1BsYW5lcz1iLmNsaXBwaW5nUGxhbmVzLE0uY2xpcEludGVyc2VjdGlvbj1iLmNsaXBJbnRlcnNlY3Rpb24sTS5kaXNwbGFjZW1lbnRNYXA9Yi5kaXNwbGFjZW1lbnRNYXAsTS5kaXNwbGFjZW1lbnRTY2FsZT1iLmRpc3BsYWNlbWVudFNjYWxlLE0uZGlzcGxhY2VtZW50Qmlhcz1iLmRpc3BsYWNlbWVudEJpYXMsTS53aXJlZnJhbWVMaW5ld2lkdGg9Yi53aXJlZnJhbWVMaW5ld2lkdGgsTS5saW5ld2lkdGg9Yi5saW5ld2lkdGgsQS5pc1BvaW50TGlnaHQ9PT0hMCYmTS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPT09ITApe2NvbnN0IFI9ci5wcm9wZXJ0aWVzLmdldChNKTtSLmxpZ2h0PUF9cmV0dXJuIE19ZnVuY3Rpb24gdihTLGIsQSxMLE0pe2lmKFMudmlzaWJsZT09PSExKXJldHVybjtpZihTLmxheWVycy50ZXN0KGIubGF5ZXJzKSYmKFMuaXNNZXNofHxTLmlzTGluZXx8Uy5pc1BvaW50cykmJihTLmNhc3RTaGFkb3d8fFMucmVjZWl2ZVNoYWRvdyYmTT09PWtuKSYmKCFTLmZydXN0dW1DdWxsZWR8fG4uaW50ZXJzZWN0c09iamVjdChTKSkpe1MubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoQS5tYXRyaXhXb3JsZEludmVyc2UsUy5tYXRyaXhXb3JsZCk7Y29uc3QgTj1lLnVwZGF0ZShTKSxCPVMubWF0ZXJpYWw7aWYoQXJyYXkuaXNBcnJheShCKSl7Y29uc3QgST1OLmdyb3Vwcztmb3IobGV0IFU9MCx6PUkubGVuZ3RoO1U8ejtVKyspe2NvbnN0IEY9SVtVXSxaPUJbRi5tYXRlcmlhbEluZGV4XTtpZihaJiZaLnZpc2libGUpe2NvbnN0IFY9eChTLFosTCxNKTtTLm9uQmVmb3JlU2hhZG93KHIsUyxiLEEsTixWLEYpLHIucmVuZGVyQnVmZmVyRGlyZWN0KEEsbnVsbCxOLFYsUyxGKSxTLm9uQWZ0ZXJTaGFkb3cocixTLGIsQSxOLFYsRil9fX1lbHNlIGlmKEIudmlzaWJsZSl7Y29uc3QgST14KFMsQixMLE0pO1Mub25CZWZvcmVTaGFkb3cocixTLGIsQSxOLEksbnVsbCksci5yZW5kZXJCdWZmZXJEaXJlY3QoQSxudWxsLE4sSSxTLG51bGwpLFMub25BZnRlclNoYWRvdyhyLFMsYixBLE4sSSxudWxsKX19Y29uc3QgUj1TLmNoaWxkcmVuO2ZvcihsZXQgTj0wLEI9Ui5sZW5ndGg7TjxCO04rKyl2KFJbTl0sYixBLEwsTSl9fWZ1bmN0aW9uIE1TKHIsZSx0KXtjb25zdCBuPXQuaXNXZWJHTDI7ZnVuY3Rpb24gaSgpe2xldCBPPSExO2NvbnN0IHZlPW5ldyBsdDtsZXQgaGU9bnVsbDtjb25zdCBqPW5ldyBsdCgwLDAsMCwwKTtyZXR1cm57c2V0TWFzazpmdW5jdGlvbihnZSl7aGUhPT1nZSYmIU8mJihyLmNvbG9yTWFzayhnZSxnZSxnZSxnZSksaGU9Z2UpfSxzZXRMb2NrZWQ6ZnVuY3Rpb24oZ2Upe089Z2V9LHNldENsZWFyOmZ1bmN0aW9uKGdlLHplLGl0LEZ0LG5uKXtubj09PSEwJiYoZ2UqPUZ0LHplKj1GdCxpdCo9RnQpLHZlLnNldChnZSx6ZSxpdCxGdCksai5lcXVhbHModmUpPT09ITEmJihyLmNsZWFyQ29sb3IoZ2UsemUsaXQsRnQpLGouY29weSh2ZSkpfSxyZXNldDpmdW5jdGlvbigpe089ITEsaGU9bnVsbCxqLnNldCgtMSwwLDAsMCl9fX1mdW5jdGlvbiBzKCl7bGV0IE89ITEsdmU9bnVsbCxoZT1udWxsLGo9bnVsbDtyZXR1cm57c2V0VGVzdDpmdW5jdGlvbihnZSl7Z2U/QmUoci5ERVBUSF9URVNUKTp3ZShyLkRFUFRIX1RFU1QpfSxzZXRNYXNrOmZ1bmN0aW9uKGdlKXt2ZSE9PWdlJiYhTyYmKHIuZGVwdGhNYXNrKGdlKSx2ZT1nZSl9LHNldEZ1bmM6ZnVuY3Rpb24oZ2Upe2lmKGhlIT09Z2Upe3N3aXRjaChnZSl7Y2FzZSBHZjpyLmRlcHRoRnVuYyhyLk5FVkVSKTticmVhaztjYXNlIFZmOnIuZGVwdGhGdW5jKHIuQUxXQVlTKTticmVhaztjYXNlIEhmOnIuZGVwdGhGdW5jKHIuTEVTUyk7YnJlYWs7Y2FzZSBNczpyLmRlcHRoRnVuYyhyLkxFUVVBTCk7YnJlYWs7Y2FzZSBXZjpyLmRlcHRoRnVuYyhyLkVRVUFMKTticmVhaztjYXNlIFhmOnIuZGVwdGhGdW5jKHIuR0VRVUFMKTticmVhaztjYXNlIHFmOnIuZGVwdGhGdW5jKHIuR1JFQVRFUik7YnJlYWs7Y2FzZSAkZjpyLmRlcHRoRnVuYyhyLk5PVEVRVUFMKTticmVhaztkZWZhdWx0OnIuZGVwdGhGdW5jKHIuTEVRVUFMKX1oZT1nZX19LHNldExvY2tlZDpmdW5jdGlvbihnZSl7Tz1nZX0sc2V0Q2xlYXI6ZnVuY3Rpb24oZ2Upe2ohPT1nZSYmKHIuY2xlYXJEZXB0aChnZSksaj1nZSl9LHJlc2V0OmZ1bmN0aW9uKCl7Tz0hMSx2ZT1udWxsLGhlPW51bGwsaj1udWxsfX19ZnVuY3Rpb24gYSgpe2xldCBPPSExLHZlPW51bGwsaGU9bnVsbCxqPW51bGwsZ2U9bnVsbCx6ZT1udWxsLGl0PW51bGwsRnQ9bnVsbCxubj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKHV0KXtPfHwodXQ/QmUoci5TVEVOQ0lMX1RFU1QpOndlKHIuU1RFTkNJTF9URVNUKSl9LHNldE1hc2s6ZnVuY3Rpb24odXQpe3ZlIT09dXQmJiFPJiYoci5zdGVuY2lsTWFzayh1dCksdmU9dXQpfSxzZXRGdW5jOmZ1bmN0aW9uKHV0LHJuLCRuKXsoaGUhPT11dHx8aiE9PXJufHxnZSE9PSRuKSYmKHIuc3RlbmNpbEZ1bmModXQscm4sJG4pLGhlPXV0LGo9cm4sZ2U9JG4pfSxzZXRPcDpmdW5jdGlvbih1dCxybiwkbil7KHplIT09dXR8fGl0IT09cm58fEZ0IT09JG4pJiYoci5zdGVuY2lsT3AodXQscm4sJG4pLHplPXV0LGl0PXJuLEZ0PSRuKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKHV0KXtPPXV0fSxzZXRDbGVhcjpmdW5jdGlvbih1dCl7bm4hPT11dCYmKHIuY2xlYXJTdGVuY2lsKHV0KSxubj11dCl9LHJlc2V0OmZ1bmN0aW9uKCl7Tz0hMSx2ZT1udWxsLGhlPW51bGwsaj1udWxsLGdlPW51bGwsemU9bnVsbCxpdD1udWxsLEZ0PW51bGwsbm49bnVsbH19fWNvbnN0IG89bmV3IGksbD1uZXcgcyxjPW5ldyBhLGg9bmV3IFdlYWtNYXAsdT1uZXcgV2Vha01hcDtsZXQgZj17fSxkPXt9LHA9bmV3IFdlYWtNYXAsXz1bXSxnPW51bGwsbT0hMSx5PW51bGwseD1udWxsLHY9bnVsbCxTPW51bGwsYj1udWxsLEE9bnVsbCxMPW51bGwsTT1uZXcgeWUoMCwwLDApLHc9MCxSPSExLE49bnVsbCxCPW51bGwsST1udWxsLFU9bnVsbCx6PW51bGw7Y29uc3QgRj1yLmdldFBhcmFtZXRlcihyLk1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTKTtsZXQgWj0hMSxWPTA7Y29uc3QgUT1yLmdldFBhcmFtZXRlcihyLlZFUlNJT04pO1EuaW5kZXhPZigiV2ViR0wiKSE9PS0xPyhWPXBhcnNlRmxvYXQoL15XZWJHTCAoXGQpLy5leGVjKFEpWzFdKSxaPVY+PTEpOlEuaW5kZXhPZigiT3BlbkdMIEVTIikhPT0tMSYmKFY9cGFyc2VGbG9hdCgvXk9wZW5HTCBFUyAoXGQpLy5leGVjKFEpWzFdKSxaPVY+PTIpO2xldCBuZT1udWxsLGZlPXt9O2NvbnN0ICQ9ci5nZXRQYXJhbWV0ZXIoci5TQ0lTU09SX0JPWCksZWU9ci5nZXRQYXJhbWV0ZXIoci5WSUVXUE9SVCksZGU9bmV3IGx0KCkuZnJvbUFycmF5KCQpLFRlPW5ldyBsdCgpLmZyb21BcnJheShlZSk7ZnVuY3Rpb24gYmUoTyx2ZSxoZSxqKXtjb25zdCBnZT1uZXcgVWludDhBcnJheSg0KSx6ZT1yLmNyZWF0ZVRleHR1cmUoKTtyLmJpbmRUZXh0dXJlKE8semUpLHIudGV4UGFyYW1ldGVyaShPLHIuVEVYVFVSRV9NSU5fRklMVEVSLHIuTkVBUkVTVCksci50ZXhQYXJhbWV0ZXJpKE8sci5URVhUVVJFX01BR19GSUxURVIsci5ORUFSRVNUKTtmb3IobGV0IGl0PTA7aXQ8aGU7aXQrKyluJiYoTz09PXIuVEVYVFVSRV8zRHx8Tz09PXIuVEVYVFVSRV8yRF9BUlJBWSk/ci50ZXhJbWFnZTNEKHZlLDAsci5SR0JBLDEsMSxqLDAsci5SR0JBLHIuVU5TSUdORURfQllURSxnZSk6ci50ZXhJbWFnZTJEKHZlK2l0LDAsci5SR0JBLDEsMSwwLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsZ2UpO3JldHVybiB6ZX1jb25zdCBPZT17fTtPZVtyLlRFWFRVUkVfMkRdPWJlKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfMkQsMSksT2Vbci5URVhUVVJFX0NVQkVfTUFQXT1iZShyLlRFWFRVUkVfQ1VCRV9NQVAsci5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gsNiksbiYmKE9lW3IuVEVYVFVSRV8yRF9BUlJBWV09YmUoci5URVhUVVJFXzJEX0FSUkFZLHIuVEVYVFVSRV8yRF9BUlJBWSwxLDEpLE9lW3IuVEVYVFVSRV8zRF09YmUoci5URVhUVVJFXzNELHIuVEVYVFVSRV8zRCwxLDEpKSxvLnNldENsZWFyKDAsMCwwLDEpLGwuc2V0Q2xlYXIoMSksYy5zZXRDbGVhcigwKSxCZShyLkRFUFRIX1RFU1QpLGwuc2V0RnVuYyhNcyksVyghMSksSihNciksQmUoci5DVUxMX0ZBQ0UpLHJlKFpuKTtmdW5jdGlvbiBCZShPKXtmW09dIT09ITAmJihyLmVuYWJsZShPKSxmW09dPSEwKX1mdW5jdGlvbiB3ZShPKXtmW09dIT09ITEmJihyLmRpc2FibGUoTyksZltPXT0hMSl9ZnVuY3Rpb24gUGUoTyx2ZSl7cmV0dXJuIGRbT10hPT12ZT8oci5iaW5kRnJhbWVidWZmZXIoTyx2ZSksZFtPXT12ZSxuJiYoTz09PXIuRFJBV19GUkFNRUJVRkZFUiYmKGRbci5GUkFNRUJVRkZFUl09dmUpLE89PT1yLkZSQU1FQlVGRkVSJiYoZFtyLkRSQVdfRlJBTUVCVUZGRVJdPXZlKSksITApOiExfWZ1bmN0aW9uIEQoTyx2ZSl7bGV0IGhlPV8saj0hMTtpZihPKWlmKGhlPXAuZ2V0KHZlKSxoZT09PXZvaWQgMCYmKGhlPVtdLHAuc2V0KHZlLGhlKSksTy5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzKXtjb25zdCBnZT1PLnRleHR1cmU7aWYoaGUubGVuZ3RoIT09Z2UubGVuZ3RofHxoZVswXSE9PXIuQ09MT1JfQVRUQUNITUVOVDApe2ZvcihsZXQgemU9MCxpdD1nZS5sZW5ndGg7emU8aXQ7emUrKyloZVt6ZV09ci5DT0xPUl9BVFRBQ0hNRU5UMCt6ZTtoZS5sZW5ndGg9Z2UubGVuZ3RoLGo9ITB9fWVsc2UgaGVbMF0hPT1yLkNPTE9SX0FUVEFDSE1FTlQwJiYoaGVbMF09ci5DT0xPUl9BVFRBQ0hNRU5UMCxqPSEwKTtlbHNlIGhlWzBdIT09ci5CQUNLJiYoaGVbMF09ci5CQUNLLGo9ITApO2omJih0LmlzV2ViR0wyP3IuZHJhd0J1ZmZlcnMoaGUpOmUuZ2V0KCJXRUJHTF9kcmF3X2J1ZmZlcnMiKS5kcmF3QnVmZmVyc1dFQkdMKGhlKSl9ZnVuY3Rpb24gbGUoTyl7cmV0dXJuIGchPT1PPyhyLnVzZVByb2dyYW0oTyksZz1PLCEwKTohMX1jb25zdCBLPXtbeGldOnIuRlVOQ19BREQsW0FmXTpyLkZVTkNfU1VCVFJBQ1QsW1RmXTpyLkZVTkNfUkVWRVJTRV9TVUJUUkFDVH07aWYobilLW2ZjXT1yLk1JTixLW2RjXT1yLk1BWDtlbHNle2NvbnN0IE89ZS5nZXQoIkVYVF9ibGVuZF9taW5tYXgiKTtPIT09bnVsbCYmKEtbZmNdPU8uTUlOX0VYVCxLW2RjXT1PLk1BWF9FWFQpfWNvbnN0IHVlPXtbQ2ZdOnIuWkVSTyxbUmZdOnIuT05FLFtQZl06ci5TUkNfQ09MT1IsW0RhXTpyLlNSQ19BTFBIQSxbRmZdOnIuU1JDX0FMUEhBX1NBVFVSQVRFLFtEZl06ci5EU1RfQ09MT1IsW0lmXTpyLkRTVF9BTFBIQSxbTGZdOnIuT05FX01JTlVTX1NSQ19DT0xPUixbTmFdOnIuT05FX01JTlVTX1NSQ19BTFBIQSxbTmZdOnIuT05FX01JTlVTX0RTVF9DT0xPUixbVWZdOnIuT05FX01JTlVTX0RTVF9BTFBIQSxbT2ZdOnIuQ09OU1RBTlRfQ09MT1IsW0JmXTpyLk9ORV9NSU5VU19DT05TVEFOVF9DT0xPUixbemZdOnIuQ09OU1RBTlRfQUxQSEEsW2tmXTpyLk9ORV9NSU5VU19DT05TVEFOVF9BTFBIQX07ZnVuY3Rpb24gcmUoTyx2ZSxoZSxqLGdlLHplLGl0LEZ0LG5uLHV0KXtpZihPPT09Wm4pe209PT0hMCYmKHdlKHIuQkxFTkQpLG09ITEpO3JldHVybn1pZihtPT09ITEmJihCZShyLkJMRU5EKSxtPSEwKSxPIT09RWYpe2lmKE8hPT15fHx1dCE9PVIpe2lmKCh4IT09eGl8fGIhPT14aSkmJihyLmJsZW5kRXF1YXRpb24oci5GVU5DX0FERCkseD14aSxiPXhpKSx1dClzd2l0Y2goTyl7Y2FzZSBCaTpyLmJsZW5kRnVuY1NlcGFyYXRlKHIuT05FLHIuT05FX01JTlVTX1NSQ19BTFBIQSxyLk9ORSxyLk9ORV9NSU5VU19TUkNfQUxQSEEpO2JyZWFrO2Nhc2UgY2M6ci5ibGVuZEZ1bmMoci5PTkUsci5PTkUpO2JyZWFrO2Nhc2UgaGM6ci5ibGVuZEZ1bmNTZXBhcmF0ZShyLlpFUk8sci5PTkVfTUlOVVNfU1JDX0NPTE9SLHIuWkVSTyxyLk9ORSk7YnJlYWs7Y2FzZSB1YzpyLmJsZW5kRnVuY1NlcGFyYXRlKHIuWkVSTyxyLlNSQ19DT0xPUixyLlpFUk8sci5TUkNfQUxQSEEpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZTogSW52YWxpZCBibGVuZGluZzogIixPKTticmVha31lbHNlIHN3aXRjaChPKXtjYXNlIEJpOnIuYmxlbmRGdW5jU2VwYXJhdGUoci5TUkNfQUxQSEEsci5PTkVfTUlOVVNfU1JDX0FMUEhBLHIuT05FLHIuT05FX01JTlVTX1NSQ19BTFBIQSk7YnJlYWs7Y2FzZSBjYzpyLmJsZW5kRnVuYyhyLlNSQ19BTFBIQSxyLk9ORSk7YnJlYWs7Y2FzZSBoYzpyLmJsZW5kRnVuY1NlcGFyYXRlKHIuWkVSTyxyLk9ORV9NSU5VU19TUkNfQ09MT1Isci5aRVJPLHIuT05FKTticmVhaztjYXNlIHVjOnIuYmxlbmRGdW5jKHIuWkVSTyxyLlNSQ19DT0xPUik7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLE8pO2JyZWFrfXY9bnVsbCxTPW51bGwsQT1udWxsLEw9bnVsbCxNLnNldCgwLDAsMCksdz0wLHk9TyxSPXV0fXJldHVybn1nZT1nZXx8dmUsemU9emV8fGhlLGl0PWl0fHxqLCh2ZSE9PXh8fGdlIT09YikmJihyLmJsZW5kRXF1YXRpb25TZXBhcmF0ZShLW3ZlXSxLW2dlXSkseD12ZSxiPWdlKSwoaGUhPT12fHxqIT09U3x8emUhPT1BfHxpdCE9PUwpJiYoci5ibGVuZEZ1bmNTZXBhcmF0ZSh1ZVtoZV0sdWVbal0sdWVbemVdLHVlW2l0XSksdj1oZSxTPWosQT16ZSxMPWl0KSwoRnQuZXF1YWxzKE0pPT09ITF8fG5uIT09dykmJihyLmJsZW5kQ29sb3IoRnQucixGdC5nLEZ0LmIsbm4pLE0uY29weShGdCksdz1ubikseT1PLFI9ITF9ZnVuY3Rpb24gQ2UoTyx2ZSl7Ty5zaWRlPT09R24/d2Uoci5DVUxMX0ZBQ0UpOkJlKHIuQ1VMTF9GQUNFKTtsZXQgaGU9Ty5zaWRlPT09WXQ7dmUmJihoZT0haGUpLFcoaGUpLE8uYmxlbmRpbmc9PT1CaSYmTy50cmFuc3BhcmVudD09PSExP3JlKFpuKTpyZShPLmJsZW5kaW5nLE8uYmxlbmRFcXVhdGlvbixPLmJsZW5kU3JjLE8uYmxlbmREc3QsTy5ibGVuZEVxdWF0aW9uQWxwaGEsTy5ibGVuZFNyY0FscGhhLE8uYmxlbmREc3RBbHBoYSxPLmJsZW5kQ29sb3IsTy5ibGVuZEFscGhhLE8ucHJlbXVsdGlwbGllZEFscGhhKSxsLnNldEZ1bmMoTy5kZXB0aEZ1bmMpLGwuc2V0VGVzdChPLmRlcHRoVGVzdCksbC5zZXRNYXNrKE8uZGVwdGhXcml0ZSksby5zZXRNYXNrKE8uY29sb3JXcml0ZSk7Y29uc3Qgaj1PLnN0ZW5jaWxXcml0ZTtjLnNldFRlc3QoaiksaiYmKGMuc2V0TWFzayhPLnN0ZW5jaWxXcml0ZU1hc2spLGMuc2V0RnVuYyhPLnN0ZW5jaWxGdW5jLE8uc3RlbmNpbFJlZixPLnN0ZW5jaWxGdW5jTWFzayksYy5zZXRPcChPLnN0ZW5jaWxGYWlsLE8uc3RlbmNpbFpGYWlsLE8uc3RlbmNpbFpQYXNzKSksbWUoTy5wb2x5Z29uT2Zmc2V0LE8ucG9seWdvbk9mZnNldEZhY3RvcixPLnBvbHlnb25PZmZzZXRVbml0cyksTy5hbHBoYVRvQ292ZXJhZ2U9PT0hMD9CZShyLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSk6d2Uoci5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpfWZ1bmN0aW9uIFcoTyl7TiE9PU8mJihPP3IuZnJvbnRGYWNlKHIuQ1cpOnIuZnJvbnRGYWNlKHIuQ0NXKSxOPU8pfWZ1bmN0aW9uIEooTyl7TyE9PXNuPyhCZShyLkNVTExfRkFDRSksTyE9PUImJihPPT09TXI/ci5jdWxsRmFjZShyLkJBQ0spOk89PT1VYT9yLmN1bGxGYWNlKHIuRlJPTlQpOnIuY3VsbEZhY2Uoci5GUk9OVF9BTkRfQkFDSykpKTp3ZShyLkNVTExfRkFDRSksQj1PfWZ1bmN0aW9uIGllKE8pe08hPT1JJiYoWiYmci5saW5lV2lkdGgoTyksST1PKX1mdW5jdGlvbiBtZShPLHZlLGhlKXtPPyhCZShyLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLChVIT09dmV8fHohPT1oZSkmJihyLnBvbHlnb25PZmZzZXQodmUsaGUpLFU9dmUsej1oZSkpOndlKHIuUE9MWUdPTl9PRkZTRVRfRklMTCl9ZnVuY3Rpb24gcGUoTyl7Tz9CZShyLlNDSVNTT1JfVEVTVCk6d2Uoci5TQ0lTU09SX1RFU1QpfWZ1bmN0aW9uIEMoTyl7Tz09PXZvaWQgMCYmKE89ci5URVhUVVJFMCtGLTEpLG5lIT09TyYmKHIuYWN0aXZlVGV4dHVyZShPKSxuZT1PKX1mdW5jdGlvbiBFKE8sdmUsaGUpe2hlPT09dm9pZCAwJiYobmU9PT1udWxsP2hlPXIuVEVYVFVSRTArRi0xOmhlPW5lKTtsZXQgaj1mZVtoZV07aj09PXZvaWQgMCYmKGo9e3R5cGU6dm9pZCAwLHRleHR1cmU6dm9pZCAwfSxmZVtoZV09aiksKGoudHlwZSE9PU98fGoudGV4dHVyZSE9PXZlKSYmKG5lIT09aGUmJihyLmFjdGl2ZVRleHR1cmUoaGUpLG5lPWhlKSxyLmJpbmRUZXh0dXJlKE8sdmV8fE9lW09dKSxqLnR5cGU9TyxqLnRleHR1cmU9dmUpfWZ1bmN0aW9uIGsoKXtjb25zdCBPPWZlW25lXTtPIT09dm9pZCAwJiZPLnR5cGUhPT12b2lkIDAmJihyLmJpbmRUZXh0dXJlKE8udHlwZSxudWxsKSxPLnR5cGU9dm9pZCAwLE8udGV4dHVyZT12b2lkIDApfWZ1bmN0aW9uIHNlKCl7dHJ5e3IuY29tcHJlc3NlZFRleEltYWdlMkQuYXBwbHkocixhcmd1bWVudHMpfWNhdGNoKE8pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixPKX19ZnVuY3Rpb24gdGUoKXt0cnl7ci5jb21wcmVzc2VkVGV4SW1hZ2UzRC5hcHBseShyLGFyZ3VtZW50cyl9Y2F0Y2goTyl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLE8pfX1mdW5jdGlvbiBhZSgpe3RyeXtyLnRleFN1YkltYWdlMkQuYXBwbHkocixhcmd1bWVudHMpfWNhdGNoKE8pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixPKX19ZnVuY3Rpb24gQWUoKXt0cnl7ci50ZXhTdWJJbWFnZTNELmFwcGx5KHIsYXJndW1lbnRzKX1jYXRjaChPKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsTyl9fWZ1bmN0aW9uIG9lKCl7dHJ5e3IuY29tcHJlc3NlZFRleFN1YkltYWdlMkQuYXBwbHkocixhcmd1bWVudHMpfWNhdGNoKE8pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixPKX19ZnVuY3Rpb24geGUoKXt0cnl7ci5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRC5hcHBseShyLGFyZ3VtZW50cyl9Y2F0Y2goTyl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLE8pfX1mdW5jdGlvbiBEZSgpe3RyeXtyLnRleFN0b3JhZ2UyRC5hcHBseShyLGFyZ3VtZW50cyl9Y2F0Y2goTyl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLE8pfX1mdW5jdGlvbiB0dCgpe3RyeXtyLnRleFN0b3JhZ2UzRC5hcHBseShyLGFyZ3VtZW50cyl9Y2F0Y2goTyl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLE8pfX1mdW5jdGlvbiBjZSgpe3RyeXtyLnRleEltYWdlMkQuYXBwbHkocixhcmd1bWVudHMpfWNhdGNoKE8pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixPKX19ZnVuY3Rpb24gYXQoKXt0cnl7ci50ZXhJbWFnZTNELmFwcGx5KHIsYXJndW1lbnRzKX1jYXRjaChPKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsTyl9fWZ1bmN0aW9uIFZlKE8pe2RlLmVxdWFscyhPKT09PSExJiYoci5zY2lzc29yKE8ueCxPLnksTy56LE8udyksZGUuY29weShPKSl9ZnVuY3Rpb24gTmUoTyl7VGUuZXF1YWxzKE8pPT09ITEmJihyLnZpZXdwb3J0KE8ueCxPLnksTy56LE8udyksVGUuY29weShPKSl9ZnVuY3Rpb24gTGUoTyx2ZSl7bGV0IGhlPXUuZ2V0KHZlKTtoZT09PXZvaWQgMCYmKGhlPW5ldyBXZWFrTWFwLHUuc2V0KHZlLGhlKSk7bGV0IGo9aGUuZ2V0KE8pO2o9PT12b2lkIDAmJihqPXIuZ2V0VW5pZm9ybUJsb2NrSW5kZXgodmUsTy5uYW1lKSxoZS5zZXQoTyxqKSl9ZnVuY3Rpb24gRWUoTyx2ZSl7Y29uc3Qgaj11LmdldCh2ZSkuZ2V0KE8pO2guZ2V0KHZlKSE9PWomJihyLnVuaWZvcm1CbG9ja0JpbmRpbmcodmUsaixPLl9fYmluZGluZ1BvaW50SW5kZXgpLGguc2V0KHZlLGopKX1mdW5jdGlvbiBqZSgpe3IuZGlzYWJsZShyLkJMRU5EKSxyLmRpc2FibGUoci5DVUxMX0ZBQ0UpLHIuZGlzYWJsZShyLkRFUFRIX1RFU1QpLHIuZGlzYWJsZShyLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLHIuZGlzYWJsZShyLlNDSVNTT1JfVEVTVCksci5kaXNhYmxlKHIuU1RFTkNJTF9URVNUKSxyLmRpc2FibGUoci5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLHIuYmxlbmRFcXVhdGlvbihyLkZVTkNfQUREKSxyLmJsZW5kRnVuYyhyLk9ORSxyLlpFUk8pLHIuYmxlbmRGdW5jU2VwYXJhdGUoci5PTkUsci5aRVJPLHIuT05FLHIuWkVSTyksci5ibGVuZENvbG9yKDAsMCwwLDApLHIuY29sb3JNYXNrKCEwLCEwLCEwLCEwKSxyLmNsZWFyQ29sb3IoMCwwLDAsMCksci5kZXB0aE1hc2soITApLHIuZGVwdGhGdW5jKHIuTEVTUyksci5jbGVhckRlcHRoKDEpLHIuc3RlbmNpbE1hc2soNDI5NDk2NzI5NSksci5zdGVuY2lsRnVuYyhyLkFMV0FZUywwLDQyOTQ5NjcyOTUpLHIuc3RlbmNpbE9wKHIuS0VFUCxyLktFRVAsci5LRUVQKSxyLmNsZWFyU3RlbmNpbCgwKSxyLmN1bGxGYWNlKHIuQkFDSyksci5mcm9udEZhY2Uoci5DQ1cpLHIucG9seWdvbk9mZnNldCgwLDApLHIuYWN0aXZlVGV4dHVyZShyLlRFWFRVUkUwKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLG51bGwpLG49PT0hMCYmKHIuYmluZEZyYW1lYnVmZmVyKHIuRFJBV19GUkFNRUJVRkZFUixudWxsKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLlJFQURfRlJBTUVCVUZGRVIsbnVsbCkpLHIudXNlUHJvZ3JhbShudWxsKSxyLmxpbmVXaWR0aCgxKSxyLnNjaXNzb3IoMCwwLHIuY2FudmFzLndpZHRoLHIuY2FudmFzLmhlaWdodCksci52aWV3cG9ydCgwLDAsci5jYW52YXMud2lkdGgsci5jYW52YXMuaGVpZ2h0KSxmPXt9LG5lPW51bGwsZmU9e30sZD17fSxwPW5ldyBXZWFrTWFwLF89W10sZz1udWxsLG09ITEseT1udWxsLHg9bnVsbCx2PW51bGwsUz1udWxsLGI9bnVsbCxBPW51bGwsTD1udWxsLE09bmV3IHllKDAsMCwwKSx3PTAsUj0hMSxOPW51bGwsQj1udWxsLEk9bnVsbCxVPW51bGwsej1udWxsLGRlLnNldCgwLDAsci5jYW52YXMud2lkdGgsci5jYW52YXMuaGVpZ2h0KSxUZS5zZXQoMCwwLHIuY2FudmFzLndpZHRoLHIuY2FudmFzLmhlaWdodCksby5yZXNldCgpLGwucmVzZXQoKSxjLnJlc2V0KCl9cmV0dXJue2J1ZmZlcnM6e2NvbG9yOm8sZGVwdGg6bCxzdGVuY2lsOmN9LGVuYWJsZTpCZSxkaXNhYmxlOndlLGJpbmRGcmFtZWJ1ZmZlcjpQZSxkcmF3QnVmZmVyczpELHVzZVByb2dyYW06bGUsc2V0QmxlbmRpbmc6cmUsc2V0TWF0ZXJpYWw6Q2Usc2V0RmxpcFNpZGVkOlcsc2V0Q3VsbEZhY2U6SixzZXRMaW5lV2lkdGg6aWUsc2V0UG9seWdvbk9mZnNldDptZSxzZXRTY2lzc29yVGVzdDpwZSxhY3RpdmVUZXh0dXJlOkMsYmluZFRleHR1cmU6RSx1bmJpbmRUZXh0dXJlOmssY29tcHJlc3NlZFRleEltYWdlMkQ6c2UsY29tcHJlc3NlZFRleEltYWdlM0Q6dGUsdGV4SW1hZ2UyRDpjZSx0ZXhJbWFnZTNEOmF0LHVwZGF0ZVVCT01hcHBpbmc6TGUsdW5pZm9ybUJsb2NrQmluZGluZzpFZSx0ZXhTdG9yYWdlMkQ6RGUsdGV4U3RvcmFnZTNEOnR0LHRleFN1YkltYWdlMkQ6YWUsdGV4U3ViSW1hZ2UzRDpBZSxjb21wcmVzc2VkVGV4U3ViSW1hZ2UyRDpvZSxjb21wcmVzc2VkVGV4U3ViSW1hZ2UzRDp4ZSxzY2lzc29yOlZlLHZpZXdwb3J0Ok5lLHJlc2V0OmplfX1mdW5jdGlvbiBTUyhyLGUsdCxuLGkscyxhKXtjb25zdCBvPWkuaXNXZWJHTDIsbD1pLm1heFRleHR1cmVzLGM9aS5tYXhDdWJlbWFwU2l6ZSxoPWkubWF4VGV4dHVyZVNpemUsdT1pLm1heFNhbXBsZXMsZj1lLmhhcygiV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIik/ZS5nZXQoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpOm51bGwsZD10eXBlb2YgbmF2aWdhdG9yPT0idW5kZWZpbmVkIj8hMTovT2N1bHVzQnJvd3Nlci9nLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkscD1uZXcgV2Vha01hcDtsZXQgXztjb25zdCBnPW5ldyBXZWFrTWFwO2xldCBtPSExO3RyeXttPXR5cGVvZiBPZmZzY3JlZW5DYW52YXMhPSJ1bmRlZmluZWQiJiZuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSkuZ2V0Q29udGV4dCgiMmQiKSE9PW51bGx9Y2F0Y2goQyl7fWZ1bmN0aW9uIHkoQyxFKXtyZXR1cm4gbT9uZXcgT2Zmc2NyZWVuQ2FudmFzKEMsRSk6T3MoImNhbnZhcyIpfWZ1bmN0aW9uIHgoQyxFLGssc2Upe2xldCB0ZT0xO2lmKChDLndpZHRoPnNlfHxDLmhlaWdodD5zZSkmJih0ZT1zZS9NYXRoLm1heChDLndpZHRoLEMuaGVpZ2h0KSksdGU8MXx8RT09PSEwKWlmKHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IT0idW5kZWZpbmVkIiYmQyBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCE9InVuZGVmaW5lZCImJkMgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmQyBpbnN0YW5jZW9mIEltYWdlQml0bWFwKXtjb25zdCBhZT1FP1lhOk1hdGguZmxvb3IsQWU9YWUodGUqQy53aWR0aCksb2U9YWUodGUqQy5oZWlnaHQpO189PT12b2lkIDAmJihfPXkoQWUsb2UpKTtjb25zdCB4ZT1rP3koQWUsb2UpOl87cmV0dXJuIHhlLndpZHRoPUFlLHhlLmhlaWdodD1vZSx4ZS5nZXRDb250ZXh0KCIyZCIpLmRyYXdJbWFnZShDLDAsMCxBZSxvZSksY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoIitDLndpZHRoKyJ4IitDLmhlaWdodCsiKSB0byAoIitBZSsieCIrb2UrIikuIikseGV9ZWxzZSByZXR1cm4iZGF0YSJpbiBDJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEltYWdlIGluIERhdGFUZXh0dXJlIGlzIHRvbyBiaWcgKCIrQy53aWR0aCsieCIrQy5oZWlnaHQrIikuIiksQztyZXR1cm4gQ31mdW5jdGlvbiB2KEMpe3JldHVybiBlaChDLndpZHRoKSYmZWgoQy5oZWlnaHQpfWZ1bmN0aW9uIFMoQyl7cmV0dXJuIG8/ITE6Qy53cmFwUyE9PXp0fHxDLndyYXBUIT09enR8fEMubWluRmlsdGVyIT09YnQmJkMubWluRmlsdGVyIT09d3R9ZnVuY3Rpb24gYihDLEUpe3JldHVybiBDLmdlbmVyYXRlTWlwbWFwcyYmRSYmQy5taW5GaWx0ZXIhPT1idCYmQy5taW5GaWx0ZXIhPT13dH1mdW5jdGlvbiBBKEMpe3IuZ2VuZXJhdGVNaXBtYXAoQyl9ZnVuY3Rpb24gTChDLEUsayxzZSx0ZT0hMSl7aWYobz09PSExKXJldHVybiBFO2lmKEMhPT1udWxsKXtpZihyW0NdIT09dm9pZCAwKXJldHVybiByW0NdO2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byB1c2Ugbm9uLWV4aXN0aW5nIFdlYkdMIGludGVybmFsIGZvcm1hdCAnIitDKyInIil9bGV0IGFlPUU7aWYoRT09PXIuUkVEJiYoaz09PXIuRkxPQVQmJihhZT1yLlIzMkYpLGs9PT1yLkhBTEZfRkxPQVQmJihhZT1yLlIxNkYpLGs9PT1yLlVOU0lHTkVEX0JZVEUmJihhZT1yLlI4KSksRT09PXIuUkVEX0lOVEVHRVImJihrPT09ci5VTlNJR05FRF9CWVRFJiYoYWU9ci5SOFVJKSxrPT09ci5VTlNJR05FRF9TSE9SVCYmKGFlPXIuUjE2VUkpLGs9PT1yLlVOU0lHTkVEX0lOVCYmKGFlPXIuUjMyVUkpLGs9PT1yLkJZVEUmJihhZT1yLlI4SSksaz09PXIuU0hPUlQmJihhZT1yLlIxNkkpLGs9PT1yLklOVCYmKGFlPXIuUjMySSkpLEU9PT1yLlJHJiYoaz09PXIuRkxPQVQmJihhZT1yLlJHMzJGKSxrPT09ci5IQUxGX0ZMT0FUJiYoYWU9ci5SRzE2Riksaz09PXIuVU5TSUdORURfQllURSYmKGFlPXIuUkc4KSksRT09PXIuUkdCQSl7Y29uc3QgQWU9dGU/SXM6b3QuZ2V0VHJhbnNmZXIoc2UpO2s9PT1yLkZMT0FUJiYoYWU9ci5SR0JBMzJGKSxrPT09ci5IQUxGX0ZMT0FUJiYoYWU9ci5SR0JBMTZGKSxrPT09ci5VTlNJR05FRF9CWVRFJiYoYWU9QWU9PT1jdD9yLlNSR0I4X0FMUEhBODpyLlJHQkE4KSxrPT09ci5VTlNJR05FRF9TSE9SVF80XzRfNF80JiYoYWU9ci5SR0JBNCksaz09PXIuVU5TSUdORURfU0hPUlRfNV81XzVfMSYmKGFlPXIuUkdCNV9BMSl9cmV0dXJuKGFlPT09ci5SMTZGfHxhZT09PXIuUjMyRnx8YWU9PT1yLlJHMTZGfHxhZT09PXIuUkczMkZ8fGFlPT09ci5SR0JBMTZGfHxhZT09PXIuUkdCQTMyRikmJmUuZ2V0KCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0IiksYWV9ZnVuY3Rpb24gTShDLEUsayl7cmV0dXJuIGIoQyxrKT09PSEwfHxDLmlzRnJhbWVidWZmZXJUZXh0dXJlJiZDLm1pbkZpbHRlciE9PWJ0JiZDLm1pbkZpbHRlciE9PXd0P01hdGgubG9nMihNYXRoLm1heChFLndpZHRoLEUuaGVpZ2h0KSkrMTpDLm1pcG1hcHMhPT12b2lkIDAmJkMubWlwbWFwcy5sZW5ndGg+MD9DLm1pcG1hcHMubGVuZ3RoOkMuaXNDb21wcmVzc2VkVGV4dHVyZSYmQXJyYXkuaXNBcnJheShDLmltYWdlKT9FLm1pcG1hcHMubGVuZ3RoOjF9ZnVuY3Rpb24gdyhDKXtyZXR1cm4gQz09PWJ0fHxDPT09T2F8fEM9PT1Ucz9yLk5FQVJFU1Q6ci5MSU5FQVJ9ZnVuY3Rpb24gUihDKXtjb25zdCBFPUMudGFyZ2V0O0UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsUiksQihFKSxFLmlzVmlkZW9UZXh0dXJlJiZwLmRlbGV0ZShFKX1mdW5jdGlvbiBOKEMpe2NvbnN0IEU9Qy50YXJnZXQ7RS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixOKSxVKEUpfWZ1bmN0aW9uIEIoQyl7Y29uc3QgRT1uLmdldChDKTtpZihFLl9fd2ViZ2xJbml0PT09dm9pZCAwKXJldHVybjtjb25zdCBrPUMuc291cmNlLHNlPWcuZ2V0KGspO2lmKHNlKXtjb25zdCB0ZT1zZVtFLl9fY2FjaGVLZXldO3RlLnVzZWRUaW1lcy0tLHRlLnVzZWRUaW1lcz09PTAmJkkoQyksT2JqZWN0LmtleXMoc2UpLmxlbmd0aD09PTAmJmcuZGVsZXRlKGspfW4ucmVtb3ZlKEMpfWZ1bmN0aW9uIEkoQyl7Y29uc3QgRT1uLmdldChDKTtyLmRlbGV0ZVRleHR1cmUoRS5fX3dlYmdsVGV4dHVyZSk7Y29uc3Qgaz1DLnNvdXJjZSxzZT1nLmdldChrKTtkZWxldGUgc2VbRS5fX2NhY2hlS2V5XSxhLm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIFUoQyl7Y29uc3QgRT1DLnRleHR1cmUsaz1uLmdldChDKSxzZT1uLmdldChFKTtpZihzZS5fX3dlYmdsVGV4dHVyZSE9PXZvaWQgMCYmKHIuZGVsZXRlVGV4dHVyZShzZS5fX3dlYmdsVGV4dHVyZSksYS5tZW1vcnkudGV4dHVyZXMtLSksQy5kZXB0aFRleHR1cmUmJkMuZGVwdGhUZXh0dXJlLmRpc3Bvc2UoKSxDLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KWZvcihsZXQgdGU9MDt0ZTw2O3RlKyspe2lmKEFycmF5LmlzQXJyYXkoay5fX3dlYmdsRnJhbWVidWZmZXJbdGVdKSlmb3IobGV0IGFlPTA7YWU8ay5fX3dlYmdsRnJhbWVidWZmZXJbdGVdLmxlbmd0aDthZSsrKXIuZGVsZXRlRnJhbWVidWZmZXIoay5fX3dlYmdsRnJhbWVidWZmZXJbdGVdW2FlXSk7ZWxzZSByLmRlbGV0ZUZyYW1lYnVmZmVyKGsuX193ZWJnbEZyYW1lYnVmZmVyW3RlXSk7ay5fX3dlYmdsRGVwdGhidWZmZXImJnIuZGVsZXRlUmVuZGVyYnVmZmVyKGsuX193ZWJnbERlcHRoYnVmZmVyW3RlXSl9ZWxzZXtpZihBcnJheS5pc0FycmF5KGsuX193ZWJnbEZyYW1lYnVmZmVyKSlmb3IobGV0IHRlPTA7dGU8ay5fX3dlYmdsRnJhbWVidWZmZXIubGVuZ3RoO3RlKyspci5kZWxldGVGcmFtZWJ1ZmZlcihrLl9fd2ViZ2xGcmFtZWJ1ZmZlclt0ZV0pO2Vsc2Ugci5kZWxldGVGcmFtZWJ1ZmZlcihrLl9fd2ViZ2xGcmFtZWJ1ZmZlcik7aWYoay5fX3dlYmdsRGVwdGhidWZmZXImJnIuZGVsZXRlUmVuZGVyYnVmZmVyKGsuX193ZWJnbERlcHRoYnVmZmVyKSxrLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciYmci5kZWxldGVGcmFtZWJ1ZmZlcihrLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksay5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpZm9yKGxldCB0ZT0wO3RlPGsuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyLmxlbmd0aDt0ZSsrKWsuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW3RlXSYmci5kZWxldGVSZW5kZXJidWZmZXIoay5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbdGVdKTtrLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlciYmci5kZWxldGVSZW5kZXJidWZmZXIoay5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIpfWlmKEMuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cylmb3IobGV0IHRlPTAsYWU9RS5sZW5ndGg7dGU8YWU7dGUrKyl7Y29uc3QgQWU9bi5nZXQoRVt0ZV0pO0FlLl9fd2ViZ2xUZXh0dXJlJiYoci5kZWxldGVUZXh0dXJlKEFlLl9fd2ViZ2xUZXh0dXJlKSxhLm1lbW9yeS50ZXh0dXJlcy0tKSxuLnJlbW92ZShFW3RlXSl9bi5yZW1vdmUoRSksbi5yZW1vdmUoQyl9bGV0IHo9MDtmdW5jdGlvbiBGKCl7ej0wfWZ1bmN0aW9uIFooKXtjb25zdCBDPXo7cmV0dXJuIEM+PWwmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK0MrIiB0ZXh0dXJlIHVuaXRzIHdoaWxlIHRoaXMgR1BVIHN1cHBvcnRzIG9ubHkgIitsKSx6Kz0xLEN9ZnVuY3Rpb24gVihDKXtjb25zdCBFPVtdO3JldHVybiBFLnB1c2goQy53cmFwUyksRS5wdXNoKEMud3JhcFQpLEUucHVzaChDLndyYXBSfHwwKSxFLnB1c2goQy5tYWdGaWx0ZXIpLEUucHVzaChDLm1pbkZpbHRlciksRS5wdXNoKEMuYW5pc290cm9weSksRS5wdXNoKEMuaW50ZXJuYWxGb3JtYXQpLEUucHVzaChDLmZvcm1hdCksRS5wdXNoKEMudHlwZSksRS5wdXNoKEMuZ2VuZXJhdGVNaXBtYXBzKSxFLnB1c2goQy5wcmVtdWx0aXBseUFscGhhKSxFLnB1c2goQy5mbGlwWSksRS5wdXNoKEMudW5wYWNrQWxpZ25tZW50KSxFLnB1c2goQy5jb2xvclNwYWNlKSxFLmpvaW4oKX1mdW5jdGlvbiBRKEMsRSl7Y29uc3Qgaz1uLmdldChDKTtpZihDLmlzVmlkZW9UZXh0dXJlJiZtZShDKSxDLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT09PSExJiZDLnZlcnNpb24+MCYmay5fX3ZlcnNpb24hPT1DLnZlcnNpb24pe2NvbnN0IHNlPUMuaW1hZ2U7aWYoc2U9PT1udWxsKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgbm8gaW1hZ2UgZGF0YSBmb3VuZC4iKTtlbHNlIGlmKHNlLmNvbXBsZXRlPT09ITEpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlIik7ZWxzZXtCZShrLEMsRSk7cmV0dXJufX10LmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8yRCxrLl9fd2ViZ2xUZXh0dXJlLHIuVEVYVFVSRTArRSl9ZnVuY3Rpb24gbmUoQyxFKXtjb25zdCBrPW4uZ2V0KEMpO2lmKEMudmVyc2lvbj4wJiZrLl9fdmVyc2lvbiE9PUMudmVyc2lvbil7QmUoayxDLEUpO3JldHVybn10LmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8yRF9BUlJBWSxrLl9fd2ViZ2xUZXh0dXJlLHIuVEVYVFVSRTArRSl9ZnVuY3Rpb24gZmUoQyxFKXtjb25zdCBrPW4uZ2V0KEMpO2lmKEMudmVyc2lvbj4wJiZrLl9fdmVyc2lvbiE9PUMudmVyc2lvbil7QmUoayxDLEUpO3JldHVybn10LmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8zRCxrLl9fd2ViZ2xUZXh0dXJlLHIuVEVYVFVSRTArRSl9ZnVuY3Rpb24gJChDLEUpe2NvbnN0IGs9bi5nZXQoQyk7aWYoQy52ZXJzaW9uPjAmJmsuX192ZXJzaW9uIT09Qy52ZXJzaW9uKXt3ZShrLEMsRSk7cmV0dXJufXQuYmluZFRleHR1cmUoci5URVhUVVJFX0NVQkVfTUFQLGsuX193ZWJnbFRleHR1cmUsci5URVhUVVJFMCtFKX1jb25zdCBlZT17W0VzXTpyLlJFUEVBVCxbenRdOnIuQ0xBTVBfVE9fRURHRSxbQXNdOnIuTUlSUk9SRURfUkVQRUFUfSxkZT17W2J0XTpyLk5FQVJFU1QsW09hXTpyLk5FQVJFU1RfTUlQTUFQX05FQVJFU1QsW1RzXTpyLk5FQVJFU1RfTUlQTUFQX0xJTkVBUixbd3RdOnIuTElORUFSLFttY106ci5MSU5FQVJfTUlQTUFQX05FQVJFU1QsW3ZpXTpyLkxJTkVBUl9NSVBNQVBfTElORUFSfSxUZT17W2dkXTpyLk5FVkVSLFtTZF06ci5BTFdBWVMsW19kXTpyLkxFU1MsW0tjXTpyLkxFUVVBTCxbeGRdOnIuRVFVQUwsW01kXTpyLkdFUVVBTCxbeWRdOnIuR1JFQVRFUixbdmRdOnIuTk9URVFVQUx9O2Z1bmN0aW9uIGJlKEMsRSxrKXtpZihrPyhyLnRleFBhcmFtZXRlcmkoQyxyLlRFWFRVUkVfV1JBUF9TLGVlW0Uud3JhcFNdKSxyLnRleFBhcmFtZXRlcmkoQyxyLlRFWFRVUkVfV1JBUF9ULGVlW0Uud3JhcFRdKSwoQz09PXIuVEVYVFVSRV8zRHx8Qz09PXIuVEVYVFVSRV8yRF9BUlJBWSkmJnIudGV4UGFyYW1ldGVyaShDLHIuVEVYVFVSRV9XUkFQX1IsZWVbRS53cmFwUl0pLHIudGV4UGFyYW1ldGVyaShDLHIuVEVYVFVSRV9NQUdfRklMVEVSLGRlW0UubWFnRmlsdGVyXSksci50ZXhQYXJhbWV0ZXJpKEMsci5URVhUVVJFX01JTl9GSUxURVIsZGVbRS5taW5GaWx0ZXJdKSk6KHIudGV4UGFyYW1ldGVyaShDLHIuVEVYVFVSRV9XUkFQX1Msci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoQyxyLlRFWFRVUkVfV1JBUF9ULHIuQ0xBTVBfVE9fRURHRSksKEM9PT1yLlRFWFRVUkVfM0R8fEM9PT1yLlRFWFRVUkVfMkRfQVJSQVkpJiZyLnRleFBhcmFtZXRlcmkoQyxyLlRFWFRVUkVfV1JBUF9SLHIuQ0xBTVBfVE9fRURHRSksKEUud3JhcFMhPT16dHx8RS53cmFwVCE9PXp0KSYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLHIudGV4UGFyYW1ldGVyaShDLHIuVEVYVFVSRV9NQUdfRklMVEVSLHcoRS5tYWdGaWx0ZXIpKSxyLnRleFBhcmFtZXRlcmkoQyxyLlRFWFRVUkVfTUlOX0ZJTFRFUix3KEUubWluRmlsdGVyKSksRS5taW5GaWx0ZXIhPT1idCYmRS5taW5GaWx0ZXIhPT13dCYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUubWluRmlsdGVyIHNob3VsZCBiZSBzZXQgdG8gVEhSRUUuTmVhcmVzdEZpbHRlciBvciBUSFJFRS5MaW5lYXJGaWx0ZXIuIikpLEUuY29tcGFyZUZ1bmN0aW9uJiYoci50ZXhQYXJhbWV0ZXJpKEMsci5URVhUVVJFX0NPTVBBUkVfTU9ERSxyLkNPTVBBUkVfUkVGX1RPX1RFWFRVUkUpLHIudGV4UGFyYW1ldGVyaShDLHIuVEVYVFVSRV9DT01QQVJFX0ZVTkMsVGVbRS5jb21wYXJlRnVuY3Rpb25dKSksZS5oYXMoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpPT09ITApe2NvbnN0IHNlPWUuZ2V0KCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTtpZihFLm1hZ0ZpbHRlcj09PWJ0fHxFLm1pbkZpbHRlciE9PVRzJiZFLm1pbkZpbHRlciE9PXZpfHxFLnR5cGU9PT1SbiYmZS5oYXMoIk9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciIpPT09ITF8fG89PT0hMSYmRS50eXBlPT09d3ImJmUuaGFzKCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpPT09ITEpcmV0dXJuOyhFLmFuaXNvdHJvcHk+MXx8bi5nZXQoRSkuX19jdXJyZW50QW5pc290cm9weSkmJihyLnRleFBhcmFtZXRlcmYoQyxzZS5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCxNYXRoLm1pbihFLmFuaXNvdHJvcHksaS5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxuLmdldChFKS5fX2N1cnJlbnRBbmlzb3Ryb3B5PUUuYW5pc290cm9weSl9fWZ1bmN0aW9uIE9lKEMsRSl7bGV0IGs9ITE7Qy5fX3dlYmdsSW5pdD09PXZvaWQgMCYmKEMuX193ZWJnbEluaXQ9ITAsRS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixSKSk7Y29uc3Qgc2U9RS5zb3VyY2U7bGV0IHRlPWcuZ2V0KHNlKTt0ZT09PXZvaWQgMCYmKHRlPXt9LGcuc2V0KHNlLHRlKSk7Y29uc3QgYWU9VihFKTtpZihhZSE9PUMuX19jYWNoZUtleSl7dGVbYWVdPT09dm9pZCAwJiYodGVbYWVdPXt0ZXh0dXJlOnIuY3JlYXRlVGV4dHVyZSgpLHVzZWRUaW1lczowfSxhLm1lbW9yeS50ZXh0dXJlcysrLGs9ITApLHRlW2FlXS51c2VkVGltZXMrKztjb25zdCBBZT10ZVtDLl9fY2FjaGVLZXldO0FlIT09dm9pZCAwJiYodGVbQy5fX2NhY2hlS2V5XS51c2VkVGltZXMtLSxBZS51c2VkVGltZXM9PT0wJiZJKEUpKSxDLl9fY2FjaGVLZXk9YWUsQy5fX3dlYmdsVGV4dHVyZT10ZVthZV0udGV4dHVyZX1yZXR1cm4ga31mdW5jdGlvbiBCZShDLEUsayl7bGV0IHNlPXIuVEVYVFVSRV8yRDsoRS5pc0RhdGFBcnJheVRleHR1cmV8fEUuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlKSYmKHNlPXIuVEVYVFVSRV8yRF9BUlJBWSksRS5pc0RhdGEzRFRleHR1cmUmJihzZT1yLlRFWFRVUkVfM0QpO2NvbnN0IHRlPU9lKEMsRSksYWU9RS5zb3VyY2U7dC5iaW5kVGV4dHVyZShzZSxDLl9fd2ViZ2xUZXh0dXJlLHIuVEVYVFVSRTArayk7Y29uc3QgQWU9bi5nZXQoYWUpO2lmKGFlLnZlcnNpb24hPT1BZS5fX3ZlcnNpb258fHRlPT09ITApe3QuYWN0aXZlVGV4dHVyZShyLlRFWFRVUkUwK2spO2NvbnN0IG9lPW90LmdldFByaW1hcmllcyhvdC53b3JraW5nQ29sb3JTcGFjZSkseGU9RS5jb2xvclNwYWNlPT09Z24/bnVsbDpvdC5nZXRQcmltYXJpZXMoRS5jb2xvclNwYWNlKSxEZT1FLmNvbG9yU3BhY2U9PT1nbnx8b2U9PT14ZT9yLk5PTkU6ci5CUk9XU0VSX0RFRkFVTFRfV0VCR0w7ci5waXhlbFN0b3JlaShyLlVOUEFDS19GTElQX1lfV0VCR0wsRS5mbGlwWSksci5waXhlbFN0b3JlaShyLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCxFLnByZW11bHRpcGx5QWxwaGEpLHIucGl4ZWxTdG9yZWkoci5VTlBBQ0tfQUxJR05NRU5ULEUudW5wYWNrQWxpZ25tZW50KSxyLnBpeGVsU3RvcmVpKHIuVU5QQUNLX0NPTE9SU1BBQ0VfQ09OVkVSU0lPTl9XRUJHTCxEZSk7Y29uc3QgdHQ9UyhFKSYmdihFLmltYWdlKT09PSExO2xldCBjZT14KEUuaW1hZ2UsdHQsITEsaCk7Y2U9cGUoRSxjZSk7Y29uc3QgYXQ9dihjZSl8fG8sVmU9cy5jb252ZXJ0KEUuZm9ybWF0LEUuY29sb3JTcGFjZSk7bGV0IE5lPXMuY29udmVydChFLnR5cGUpLExlPUwoRS5pbnRlcm5hbEZvcm1hdCxWZSxOZSxFLmNvbG9yU3BhY2UsRS5pc1ZpZGVvVGV4dHVyZSk7YmUoc2UsRSxhdCk7bGV0IEVlO2NvbnN0IGplPUUubWlwbWFwcyxPPW8mJkUuaXNWaWRlb1RleHR1cmUhPT0hMCYmTGUhPT1BYyx2ZT1BZS5fX3ZlcnNpb249PT12b2lkIDB8fHRlPT09ITAsaGU9TShFLGNlLGF0KTtpZihFLmlzRGVwdGhUZXh0dXJlKUxlPXIuREVQVEhfQ09NUE9ORU5ULG8/RS50eXBlPT09Um4/TGU9ci5ERVBUSF9DT01QT05FTlQzMkY6RS50eXBlPT09am4/TGU9ci5ERVBUSF9DT01QT05FTlQyNDpFLnR5cGU9PT1NaT9MZT1yLkRFUFRIMjRfU1RFTkNJTDg6TGU9ci5ERVBUSF9DT01QT05FTlQxNjpFLnR5cGU9PT1SbiYmY29uc29sZS5lcnJvcigiV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgZGVwdGggdGV4dHVyZSByZXF1aXJlcyBXZWJHTDIuIiksRS5mb3JtYXQ9PT1TaSYmTGU9PT1yLkRFUFRIX0NPTVBPTkVOVCYmRS50eXBlIT09QmEmJkUudHlwZSE9PWpuJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRTaG9ydFR5cGUgb3IgVW5zaWduZWRJbnRUeXBlIGZvciBEZXB0aEZvcm1hdCBEZXB0aFRleHR1cmUuIiksRS50eXBlPWpuLE5lPXMuY29udmVydChFLnR5cGUpKSxFLmZvcm1hdD09PXppJiZMZT09PXIuREVQVEhfQ09NUE9ORU5UJiYoTGU9ci5ERVBUSF9TVEVOQ0lMLEUudHlwZSE9PU1pJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRJbnQyNDhUeXBlIGZvciBEZXB0aFN0ZW5jaWxGb3JtYXQgRGVwdGhUZXh0dXJlLiIpLEUudHlwZT1NaSxOZT1zLmNvbnZlcnQoRS50eXBlKSkpLHZlJiYoTz90LnRleFN0b3JhZ2UyRChyLlRFWFRVUkVfMkQsMSxMZSxjZS53aWR0aCxjZS5oZWlnaHQpOnQudGV4SW1hZ2UyRChyLlRFWFRVUkVfMkQsMCxMZSxjZS53aWR0aCxjZS5oZWlnaHQsMCxWZSxOZSxudWxsKSk7ZWxzZSBpZihFLmlzRGF0YVRleHR1cmUpaWYoamUubGVuZ3RoPjAmJmF0KXtPJiZ2ZSYmdC50ZXhTdG9yYWdlMkQoci5URVhUVVJFXzJELGhlLExlLGplWzBdLndpZHRoLGplWzBdLmhlaWdodCk7Zm9yKGxldCBqPTAsZ2U9amUubGVuZ3RoO2o8Z2U7aisrKUVlPWplW2pdLE8/dC50ZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV8yRCxqLDAsMCxFZS53aWR0aCxFZS5oZWlnaHQsVmUsTmUsRWUuZGF0YSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV8yRCxqLExlLEVlLndpZHRoLEVlLmhlaWdodCwwLFZlLE5lLEVlLmRhdGEpO0UuZ2VuZXJhdGVNaXBtYXBzPSExfWVsc2UgTz8odmUmJnQudGV4U3RvcmFnZTJEKHIuVEVYVFVSRV8yRCxoZSxMZSxjZS53aWR0aCxjZS5oZWlnaHQpLHQudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsMCwwLDAsY2Uud2lkdGgsY2UuaGVpZ2h0LFZlLE5lLGNlLmRhdGEpKTp0LnRleEltYWdlMkQoci5URVhUVVJFXzJELDAsTGUsY2Uud2lkdGgsY2UuaGVpZ2h0LDAsVmUsTmUsY2UuZGF0YSk7ZWxzZSBpZihFLmlzQ29tcHJlc3NlZFRleHR1cmUpaWYoRS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUpe08mJnZlJiZ0LnRleFN0b3JhZ2UzRChyLlRFWFRVUkVfMkRfQVJSQVksaGUsTGUsamVbMF0ud2lkdGgsamVbMF0uaGVpZ2h0LGNlLmRlcHRoKTtmb3IobGV0IGo9MCxnZT1qZS5sZW5ndGg7ajxnZTtqKyspRWU9amVbal0sRS5mb3JtYXQhPT1hbj9WZSE9PW51bGw/Tz90LmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKHIuVEVYVFVSRV8yRF9BUlJBWSxqLDAsMCwwLEVlLndpZHRoLEVlLmhlaWdodCxjZS5kZXB0aCxWZSxFZS5kYXRhLDAsMCk6dC5jb21wcmVzc2VkVGV4SW1hZ2UzRChyLlRFWFRVUkVfMkRfQVJSQVksaixMZSxFZS53aWR0aCxFZS5oZWlnaHQsY2UuZGVwdGgsMCxFZS5kYXRhLDAsMCk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpIik6Tz90LnRleFN1YkltYWdlM0Qoci5URVhUVVJFXzJEX0FSUkFZLGosMCwwLDAsRWUud2lkdGgsRWUuaGVpZ2h0LGNlLmRlcHRoLFZlLE5lLEVlLmRhdGEpOnQudGV4SW1hZ2UzRChyLlRFWFRVUkVfMkRfQVJSQVksaixMZSxFZS53aWR0aCxFZS5oZWlnaHQsY2UuZGVwdGgsMCxWZSxOZSxFZS5kYXRhKX1lbHNle08mJnZlJiZ0LnRleFN0b3JhZ2UyRChyLlRFWFRVUkVfMkQsaGUsTGUsamVbMF0ud2lkdGgsamVbMF0uaGVpZ2h0KTtmb3IobGV0IGo9MCxnZT1qZS5sZW5ndGg7ajxnZTtqKyspRWU9amVbal0sRS5mb3JtYXQhPT1hbj9WZSE9PW51bGw/Tz90LmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV8yRCxqLDAsMCxFZS53aWR0aCxFZS5oZWlnaHQsVmUsRWUuZGF0YSk6dC5jb21wcmVzc2VkVGV4SW1hZ2UyRChyLlRFWFRVUkVfMkQsaixMZSxFZS53aWR0aCxFZS5oZWlnaHQsMCxFZS5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTpPP3QudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsaiwwLDAsRWUud2lkdGgsRWUuaGVpZ2h0LFZlLE5lLEVlLmRhdGEpOnQudGV4SW1hZ2UyRChyLlRFWFRVUkVfMkQsaixMZSxFZS53aWR0aCxFZS5oZWlnaHQsMCxWZSxOZSxFZS5kYXRhKX1lbHNlIGlmKEUuaXNEYXRhQXJyYXlUZXh0dXJlKU8/KHZlJiZ0LnRleFN0b3JhZ2UzRChyLlRFWFRVUkVfMkRfQVJSQVksaGUsTGUsY2Uud2lkdGgsY2UuaGVpZ2h0LGNlLmRlcHRoKSx0LnRleFN1YkltYWdlM0Qoci5URVhUVVJFXzJEX0FSUkFZLDAsMCwwLDAsY2Uud2lkdGgsY2UuaGVpZ2h0LGNlLmRlcHRoLFZlLE5lLGNlLmRhdGEpKTp0LnRleEltYWdlM0Qoci5URVhUVVJFXzJEX0FSUkFZLDAsTGUsY2Uud2lkdGgsY2UuaGVpZ2h0LGNlLmRlcHRoLDAsVmUsTmUsY2UuZGF0YSk7ZWxzZSBpZihFLmlzRGF0YTNEVGV4dHVyZSlPPyh2ZSYmdC50ZXhTdG9yYWdlM0Qoci5URVhUVVJFXzNELGhlLExlLGNlLndpZHRoLGNlLmhlaWdodCxjZS5kZXB0aCksdC50ZXhTdWJJbWFnZTNEKHIuVEVYVFVSRV8zRCwwLDAsMCwwLGNlLndpZHRoLGNlLmhlaWdodCxjZS5kZXB0aCxWZSxOZSxjZS5kYXRhKSk6dC50ZXhJbWFnZTNEKHIuVEVYVFVSRV8zRCwwLExlLGNlLndpZHRoLGNlLmhlaWdodCxjZS5kZXB0aCwwLFZlLE5lLGNlLmRhdGEpO2Vsc2UgaWYoRS5pc0ZyYW1lYnVmZmVyVGV4dHVyZSl7aWYodmUpaWYoTyl0LnRleFN0b3JhZ2UyRChyLlRFWFRVUkVfMkQsaGUsTGUsY2Uud2lkdGgsY2UuaGVpZ2h0KTtlbHNle2xldCBqPWNlLndpZHRoLGdlPWNlLmhlaWdodDtmb3IobGV0IHplPTA7emU8aGU7emUrKyl0LnRleEltYWdlMkQoci5URVhUVVJFXzJELHplLExlLGosZ2UsMCxWZSxOZSxudWxsKSxqPj49MSxnZT4+PTF9fWVsc2UgaWYoamUubGVuZ3RoPjAmJmF0KXtPJiZ2ZSYmdC50ZXhTdG9yYWdlMkQoci5URVhUVVJFXzJELGhlLExlLGplWzBdLndpZHRoLGplWzBdLmhlaWdodCk7Zm9yKGxldCBqPTAsZ2U9amUubGVuZ3RoO2o8Z2U7aisrKUVlPWplW2pdLE8/dC50ZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV8yRCxqLDAsMCxWZSxOZSxFZSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV8yRCxqLExlLFZlLE5lLEVlKTtFLmdlbmVyYXRlTWlwbWFwcz0hMX1lbHNlIE8/KHZlJiZ0LnRleFN0b3JhZ2UyRChyLlRFWFRVUkVfMkQsaGUsTGUsY2Uud2lkdGgsY2UuaGVpZ2h0KSx0LnRleFN1YkltYWdlMkQoci5URVhUVVJFXzJELDAsMCwwLFZlLE5lLGNlKSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV8yRCwwLExlLFZlLE5lLGNlKTtiKEUsYXQpJiZBKHNlKSxBZS5fX3ZlcnNpb249YWUudmVyc2lvbixFLm9uVXBkYXRlJiZFLm9uVXBkYXRlKEUpfUMuX192ZXJzaW9uPUUudmVyc2lvbn1mdW5jdGlvbiB3ZShDLEUsayl7aWYoRS5pbWFnZS5sZW5ndGghPT02KXJldHVybjtjb25zdCBzZT1PZShDLEUpLHRlPUUuc291cmNlO3QuYmluZFRleHR1cmUoci5URVhUVVJFX0NVQkVfTUFQLEMuX193ZWJnbFRleHR1cmUsci5URVhUVVJFMCtrKTtjb25zdCBhZT1uLmdldCh0ZSk7aWYodGUudmVyc2lvbiE9PWFlLl9fdmVyc2lvbnx8c2U9PT0hMCl7dC5hY3RpdmVUZXh0dXJlKHIuVEVYVFVSRTArayk7Y29uc3QgQWU9b3QuZ2V0UHJpbWFyaWVzKG90LndvcmtpbmdDb2xvclNwYWNlKSxvZT1FLmNvbG9yU3BhY2U9PT1nbj9udWxsOm90LmdldFByaW1hcmllcyhFLmNvbG9yU3BhY2UpLHhlPUUuY29sb3JTcGFjZT09PWdufHxBZT09PW9lP3IuTk9ORTpyLkJST1dTRVJfREVGQVVMVF9XRUJHTDtyLnBpeGVsU3RvcmVpKHIuVU5QQUNLX0ZMSVBfWV9XRUJHTCxFLmZsaXBZKSxyLnBpeGVsU3RvcmVpKHIuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLEUucHJlbXVsdGlwbHlBbHBoYSksci5waXhlbFN0b3JlaShyLlVOUEFDS19BTElHTk1FTlQsRS51bnBhY2tBbGlnbm1lbnQpLHIucGl4ZWxTdG9yZWkoci5VTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMLHhlKTtjb25zdCBEZT1FLmlzQ29tcHJlc3NlZFRleHR1cmV8fEUuaW1hZ2VbMF0uaXNDb21wcmVzc2VkVGV4dHVyZSx0dD1FLmltYWdlWzBdJiZFLmltYWdlWzBdLmlzRGF0YVRleHR1cmUsY2U9W107Zm9yKGxldCBqPTA7ajw2O2orKykhRGUmJiF0dD9jZVtqXT14KEUuaW1hZ2Vbal0sITEsITAsYyk6Y2Vbal09dHQ/RS5pbWFnZVtqXS5pbWFnZTpFLmltYWdlW2pdLGNlW2pdPXBlKEUsY2Vbal0pO2NvbnN0IGF0PWNlWzBdLFZlPXYoYXQpfHxvLE5lPXMuY29udmVydChFLmZvcm1hdCxFLmNvbG9yU3BhY2UpLExlPXMuY29udmVydChFLnR5cGUpLEVlPUwoRS5pbnRlcm5hbEZvcm1hdCxOZSxMZSxFLmNvbG9yU3BhY2UpLGplPW8mJkUuaXNWaWRlb1RleHR1cmUhPT0hMCxPPWFlLl9fdmVyc2lvbj09PXZvaWQgMHx8c2U9PT0hMDtsZXQgdmU9TShFLGF0LFZlKTtiZShyLlRFWFRVUkVfQ1VCRV9NQVAsRSxWZSk7bGV0IGhlO2lmKERlKXtqZSYmTyYmdC50ZXhTdG9yYWdlMkQoci5URVhUVVJFX0NVQkVfTUFQLHZlLEVlLGF0LndpZHRoLGF0LmhlaWdodCk7Zm9yKGxldCBqPTA7ajw2O2orKyl7aGU9Y2Vbal0ubWlwbWFwcztmb3IobGV0IGdlPTA7Z2U8aGUubGVuZ3RoO2dlKyspe2NvbnN0IHplPWhlW2dlXTtFLmZvcm1hdCE9PWFuP05lIT09bnVsbD9qZT90LmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osZ2UsMCwwLHplLndpZHRoLHplLmhlaWdodCxOZSx6ZS5kYXRhKTp0LmNvbXByZXNzZWRUZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osZ2UsRWUsemUud2lkdGgsemUuaGVpZ2h0LDAsemUuZGF0YSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKSIpOmplP3QudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtqLGdlLDAsMCx6ZS53aWR0aCx6ZS5oZWlnaHQsTmUsTGUsemUuZGF0YSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osZ2UsRWUsemUud2lkdGgsemUuaGVpZ2h0LDAsTmUsTGUsemUuZGF0YSl9fX1lbHNle2hlPUUubWlwbWFwcyxqZSYmTyYmKGhlLmxlbmd0aD4wJiZ2ZSsrLHQudGV4U3RvcmFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUCx2ZSxFZSxjZVswXS53aWR0aCxjZVswXS5oZWlnaHQpKTtmb3IobGV0IGo9MDtqPDY7aisrKWlmKHR0KXtqZT90LnRleFN1YkltYWdlMkQoci5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1graiwwLDAsMCxjZVtqXS53aWR0aCxjZVtqXS5oZWlnaHQsTmUsTGUsY2Vbal0uZGF0YSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osMCxFZSxjZVtqXS53aWR0aCxjZVtqXS5oZWlnaHQsMCxOZSxMZSxjZVtqXS5kYXRhKTtmb3IobGV0IGdlPTA7Z2U8aGUubGVuZ3RoO2dlKyspe2NvbnN0IGl0PWhlW2dlXS5pbWFnZVtqXS5pbWFnZTtqZT90LnRleFN1YkltYWdlMkQoci5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1graixnZSsxLDAsMCxpdC53aWR0aCxpdC5oZWlnaHQsTmUsTGUsaXQuZGF0YSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osZ2UrMSxFZSxpdC53aWR0aCxpdC5oZWlnaHQsMCxOZSxMZSxpdC5kYXRhKX19ZWxzZXtqZT90LnRleFN1YkltYWdlMkQoci5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1graiwwLDAsMCxOZSxMZSxjZVtqXSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osMCxFZSxOZSxMZSxjZVtqXSk7Zm9yKGxldCBnZT0wO2dlPGhlLmxlbmd0aDtnZSsrKXtjb25zdCB6ZT1oZVtnZV07amU/dC50ZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osZ2UrMSwwLDAsTmUsTGUsemUuaW1hZ2Vbal0pOnQudGV4SW1hZ2UyRChyLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtqLGdlKzEsRWUsTmUsTGUsemUuaW1hZ2Vbal0pfX19YihFLFZlKSYmQShyLlRFWFRVUkVfQ1VCRV9NQVApLGFlLl9fdmVyc2lvbj10ZS52ZXJzaW9uLEUub25VcGRhdGUmJkUub25VcGRhdGUoRSl9Qy5fX3ZlcnNpb249RS52ZXJzaW9ufWZ1bmN0aW9uIFBlKEMsRSxrLHNlLHRlLGFlKXtjb25zdCBBZT1zLmNvbnZlcnQoay5mb3JtYXQsay5jb2xvclNwYWNlKSxvZT1zLmNvbnZlcnQoay50eXBlKSx4ZT1MKGsuaW50ZXJuYWxGb3JtYXQsQWUsb2Usay5jb2xvclNwYWNlKTtpZighbi5nZXQoRSkuX19oYXNFeHRlcm5hbFRleHR1cmVzKXtjb25zdCB0dD1NYXRoLm1heCgxLEUud2lkdGg+PmFlKSxjZT1NYXRoLm1heCgxLEUuaGVpZ2h0Pj5hZSk7dGU9PT1yLlRFWFRVUkVfM0R8fHRlPT09ci5URVhUVVJFXzJEX0FSUkFZP3QudGV4SW1hZ2UzRCh0ZSxhZSx4ZSx0dCxjZSxFLmRlcHRoLDAsQWUsb2UsbnVsbCk6dC50ZXhJbWFnZTJEKHRlLGFlLHhlLHR0LGNlLDAsQWUsb2UsbnVsbCl9dC5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixDKSxpZShFKT9mLmZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoci5GUkFNRUJVRkZFUixzZSx0ZSxuLmdldChrKS5fX3dlYmdsVGV4dHVyZSwwLEooRSkpOih0ZT09PXIuVEVYVFVSRV8yRHx8dGU+PXIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YJiZ0ZTw9ci5URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1opJiZyLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHIuRlJBTUVCVUZGRVIsc2UsdGUsbi5nZXQoaykuX193ZWJnbFRleHR1cmUsYWUpLHQuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsbnVsbCl9ZnVuY3Rpb24gRChDLEUsayl7aWYoci5iaW5kUmVuZGVyYnVmZmVyKHIuUkVOREVSQlVGRkVSLEMpLEUuZGVwdGhCdWZmZXImJiFFLnN0ZW5jaWxCdWZmZXIpe2xldCBzZT1vPT09ITA/ci5ERVBUSF9DT01QT05FTlQyNDpyLkRFUFRIX0NPTVBPTkVOVDE2O2lmKGt8fGllKEUpKXtjb25zdCB0ZT1FLmRlcHRoVGV4dHVyZTt0ZSYmdGUuaXNEZXB0aFRleHR1cmUmJih0ZS50eXBlPT09Um4/c2U9ci5ERVBUSF9DT01QT05FTlQzMkY6dGUudHlwZT09PWpuJiYoc2U9ci5ERVBUSF9DT01QT05FTlQyNCkpO2NvbnN0IGFlPUooRSk7aWUoRSk/Zi5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoci5SRU5ERVJCVUZGRVIsYWUsc2UsRS53aWR0aCxFLmhlaWdodCk6ci5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoci5SRU5ERVJCVUZGRVIsYWUsc2UsRS53aWR0aCxFLmhlaWdodCl9ZWxzZSByLnJlbmRlcmJ1ZmZlclN0b3JhZ2Uoci5SRU5ERVJCVUZGRVIsc2UsRS53aWR0aCxFLmhlaWdodCk7ci5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihyLkZSQU1FQlVGRkVSLHIuREVQVEhfQVRUQUNITUVOVCxyLlJFTkRFUkJVRkZFUixDKX1lbHNlIGlmKEUuZGVwdGhCdWZmZXImJkUuc3RlbmNpbEJ1ZmZlcil7Y29uc3Qgc2U9SihFKTtrJiZpZShFKT09PSExP3IucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKHIuUkVOREVSQlVGRkVSLHNlLHIuREVQVEgyNF9TVEVOQ0lMOCxFLndpZHRoLEUuaGVpZ2h0KTppZShFKT9mLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVChyLlJFTkRFUkJVRkZFUixzZSxyLkRFUFRIMjRfU1RFTkNJTDgsRS53aWR0aCxFLmhlaWdodCk6ci5yZW5kZXJidWZmZXJTdG9yYWdlKHIuUkVOREVSQlVGRkVSLHIuREVQVEhfU1RFTkNJTCxFLndpZHRoLEUuaGVpZ2h0KSxyLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHIuRlJBTUVCVUZGRVIsci5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsci5SRU5ERVJCVUZGRVIsQyl9ZWxzZXtjb25zdCBzZT1FLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM9PT0hMD9FLnRleHR1cmU6W0UudGV4dHVyZV07Zm9yKGxldCB0ZT0wO3RlPHNlLmxlbmd0aDt0ZSsrKXtjb25zdCBhZT1zZVt0ZV0sQWU9cy5jb252ZXJ0KGFlLmZvcm1hdCxhZS5jb2xvclNwYWNlKSxvZT1zLmNvbnZlcnQoYWUudHlwZSkseGU9TChhZS5pbnRlcm5hbEZvcm1hdCxBZSxvZSxhZS5jb2xvclNwYWNlKSxEZT1KKEUpO2smJmllKEUpPT09ITE/ci5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoci5SRU5ERVJCVUZGRVIsRGUseGUsRS53aWR0aCxFLmhlaWdodCk6aWUoRSk/Zi5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoci5SRU5ERVJCVUZGRVIsRGUseGUsRS53aWR0aCxFLmhlaWdodCk6ci5yZW5kZXJidWZmZXJTdG9yYWdlKHIuUkVOREVSQlVGRkVSLHhlLEUud2lkdGgsRS5oZWlnaHQpfX1yLmJpbmRSZW5kZXJidWZmZXIoci5SRU5ERVJCVUZGRVIsbnVsbCl9ZnVuY3Rpb24gbGUoQyxFKXtpZihFJiZFLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KXRocm93IG5ldyBFcnJvcigiRGVwdGggVGV4dHVyZSB3aXRoIGN1YmUgcmVuZGVyIHRhcmdldHMgaXMgbm90IHN1cHBvcnRlZCIpO2lmKHQuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsQyksIShFLmRlcHRoVGV4dHVyZSYmRS5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUpKXRocm93IG5ldyBFcnJvcigicmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZSIpOyghbi5nZXQoRS5kZXB0aFRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlfHxFLmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCE9PUUud2lkdGh8fEUuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCE9PUUuaGVpZ2h0KSYmKEUuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPUUud2lkdGgsRS5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0PUUuaGVpZ2h0LEUuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlPSEwKSxRKEUuZGVwdGhUZXh0dXJlLDApO2NvbnN0IHNlPW4uZ2V0KEUuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSx0ZT1KKEUpO2lmKEUuZGVwdGhUZXh0dXJlLmZvcm1hdD09PVNpKWllKEUpP2YuZnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVChyLkZSQU1FQlVGRkVSLHIuREVQVEhfQVRUQUNITUVOVCxyLlRFWFRVUkVfMkQsc2UsMCx0ZSk6ci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLHIuREVQVEhfQVRUQUNITUVOVCxyLlRFWFRVUkVfMkQsc2UsMCk7ZWxzZSBpZihFLmRlcHRoVGV4dHVyZS5mb3JtYXQ9PT16aSlpZShFKT9mLmZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoci5GUkFNRUJVRkZFUixyLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCxyLlRFWFRVUkVfMkQsc2UsMCx0ZSk6ci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLHIuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULHIuVEVYVFVSRV8yRCxzZSwwKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0Iil9ZnVuY3Rpb24gSyhDKXtjb25zdCBFPW4uZ2V0KEMpLGs9Qy5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldD09PSEwO2lmKEMuZGVwdGhUZXh0dXJlJiYhRS5fX2F1dG9BbGxvY2F0ZURlcHRoQnVmZmVyKXtpZihrKXRocm93IG5ldyBFcnJvcigidGFyZ2V0LmRlcHRoVGV4dHVyZSBub3Qgc3VwcG9ydGVkIGluIEN1YmUgcmVuZGVyIHRhcmdldHMiKTtsZShFLl9fd2ViZ2xGcmFtZWJ1ZmZlcixDKX1lbHNlIGlmKGspe0UuX193ZWJnbERlcHRoYnVmZmVyPVtdO2ZvcihsZXQgc2U9MDtzZTw2O3NlKyspdC5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixFLl9fd2ViZ2xGcmFtZWJ1ZmZlcltzZV0pLEUuX193ZWJnbERlcHRoYnVmZmVyW3NlXT1yLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLEQoRS5fX3dlYmdsRGVwdGhidWZmZXJbc2VdLEMsITEpfWVsc2UgdC5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixFLl9fd2ViZ2xGcmFtZWJ1ZmZlciksRS5fX3dlYmdsRGVwdGhidWZmZXI9ci5jcmVhdGVSZW5kZXJidWZmZXIoKSxEKEUuX193ZWJnbERlcHRoYnVmZmVyLEMsITEpO3QuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsbnVsbCl9ZnVuY3Rpb24gdWUoQyxFLGspe2NvbnN0IHNlPW4uZ2V0KEMpO0UhPT12b2lkIDAmJlBlKHNlLl9fd2ViZ2xGcmFtZWJ1ZmZlcixDLEMudGV4dHVyZSxyLkNPTE9SX0FUVEFDSE1FTlQwLHIuVEVYVFVSRV8yRCwwKSxrIT09dm9pZCAwJiZLKEMpfWZ1bmN0aW9uIHJlKEMpe2NvbnN0IEU9Qy50ZXh0dXJlLGs9bi5nZXQoQyksc2U9bi5nZXQoRSk7Qy5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixOKSxDLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHMhPT0hMCYmKHNlLl9fd2ViZ2xUZXh0dXJlPT09dm9pZCAwJiYoc2UuX193ZWJnbFRleHR1cmU9ci5jcmVhdGVUZXh0dXJlKCkpLHNlLl9fdmVyc2lvbj1FLnZlcnNpb24sYS5tZW1vcnkudGV4dHVyZXMrKyk7Y29uc3QgdGU9Qy5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldD09PSEwLGFlPUMuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cz09PSEwLEFlPXYoQyl8fG87aWYodGUpe2suX193ZWJnbEZyYW1lYnVmZmVyPVtdO2ZvcihsZXQgb2U9MDtvZTw2O29lKyspaWYobyYmRS5taXBtYXBzJiZFLm1pcG1hcHMubGVuZ3RoPjApe2suX193ZWJnbEZyYW1lYnVmZmVyW29lXT1bXTtmb3IobGV0IHhlPTA7eGU8RS5taXBtYXBzLmxlbmd0aDt4ZSsrKWsuX193ZWJnbEZyYW1lYnVmZmVyW29lXVt4ZV09ci5jcmVhdGVGcmFtZWJ1ZmZlcigpfWVsc2Ugay5fX3dlYmdsRnJhbWVidWZmZXJbb2VdPXIuY3JlYXRlRnJhbWVidWZmZXIoKX1lbHNle2lmKG8mJkUubWlwbWFwcyYmRS5taXBtYXBzLmxlbmd0aD4wKXtrLl9fd2ViZ2xGcmFtZWJ1ZmZlcj1bXTtmb3IobGV0IG9lPTA7b2U8RS5taXBtYXBzLmxlbmd0aDtvZSsrKWsuX193ZWJnbEZyYW1lYnVmZmVyW29lXT1yLmNyZWF0ZUZyYW1lYnVmZmVyKCl9ZWxzZSBrLl9fd2ViZ2xGcmFtZWJ1ZmZlcj1yLmNyZWF0ZUZyYW1lYnVmZmVyKCk7aWYoYWUpaWYoaS5kcmF3QnVmZmVycyl7Y29uc3Qgb2U9Qy50ZXh0dXJlO2ZvcihsZXQgeGU9MCxEZT1vZS5sZW5ndGg7eGU8RGU7eGUrKyl7Y29uc3QgdHQ9bi5nZXQob2VbeGVdKTt0dC5fX3dlYmdsVGV4dHVyZT09PXZvaWQgMCYmKHR0Ll9fd2ViZ2xUZXh0dXJlPXIuY3JlYXRlVGV4dHVyZSgpLGEubWVtb3J5LnRleHR1cmVzKyspfX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMiBvciBXRUJHTF9kcmF3X2J1ZmZlcnMgZXh0ZW5zaW9uLiIpO2lmKG8mJkMuc2FtcGxlcz4wJiZpZShDKT09PSExKXtjb25zdCBvZT1hZT9FOltFXTtrLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj1yLmNyZWF0ZUZyYW1lYnVmZmVyKCksay5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXI9W10sdC5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixrLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7Zm9yKGxldCB4ZT0wO3hlPG9lLmxlbmd0aDt4ZSsrKXtjb25zdCBEZT1vZVt4ZV07ay5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbeGVdPXIuY3JlYXRlUmVuZGVyYnVmZmVyKCksci5iaW5kUmVuZGVyYnVmZmVyKHIuUkVOREVSQlVGRkVSLGsuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW3hlXSk7Y29uc3QgdHQ9cy5jb252ZXJ0KERlLmZvcm1hdCxEZS5jb2xvclNwYWNlKSxjZT1zLmNvbnZlcnQoRGUudHlwZSksYXQ9TChEZS5pbnRlcm5hbEZvcm1hdCx0dCxjZSxEZS5jb2xvclNwYWNlLEMuaXNYUlJlbmRlclRhcmdldD09PSEwKSxWZT1KKEMpO3IucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKHIuUkVOREVSQlVGRkVSLFZlLGF0LEMud2lkdGgsQy5oZWlnaHQpLHIuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoci5GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwK3hlLHIuUkVOREVSQlVGRkVSLGsuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW3hlXSl9ci5iaW5kUmVuZGVyYnVmZmVyKHIuUkVOREVSQlVGRkVSLG51bGwpLEMuZGVwdGhCdWZmZXImJihrLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj1yLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLEQoay5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIsQywhMCkpLHQuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsbnVsbCl9fWlmKHRlKXt0LmJpbmRUZXh0dXJlKHIuVEVYVFVSRV9DVUJFX01BUCxzZS5fX3dlYmdsVGV4dHVyZSksYmUoci5URVhUVVJFX0NVQkVfTUFQLEUsQWUpO2ZvcihsZXQgb2U9MDtvZTw2O29lKyspaWYobyYmRS5taXBtYXBzJiZFLm1pcG1hcHMubGVuZ3RoPjApZm9yKGxldCB4ZT0wO3hlPEUubWlwbWFwcy5sZW5ndGg7eGUrKylQZShrLl9fd2ViZ2xGcmFtZWJ1ZmZlcltvZV1beGVdLEMsRSxyLkNPTE9SX0FUVEFDSE1FTlQwLHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK29lLHhlKTtlbHNlIFBlKGsuX193ZWJnbEZyYW1lYnVmZmVyW29lXSxDLEUsci5DT0xPUl9BVFRBQ0hNRU5UMCxyLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtvZSwwKTtiKEUsQWUpJiZBKHIuVEVYVFVSRV9DVUJFX01BUCksdC51bmJpbmRUZXh0dXJlKCl9ZWxzZSBpZihhZSl7Y29uc3Qgb2U9Qy50ZXh0dXJlO2ZvcihsZXQgeGU9MCxEZT1vZS5sZW5ndGg7eGU8RGU7eGUrKyl7Y29uc3QgdHQ9b2VbeGVdLGNlPW4uZ2V0KHR0KTt0LmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8yRCxjZS5fX3dlYmdsVGV4dHVyZSksYmUoci5URVhUVVJFXzJELHR0LEFlKSxQZShrLl9fd2ViZ2xGcmFtZWJ1ZmZlcixDLHR0LHIuQ09MT1JfQVRUQUNITUVOVDAreGUsci5URVhUVVJFXzJELDApLGIodHQsQWUpJiZBKHIuVEVYVFVSRV8yRCl9dC51bmJpbmRUZXh0dXJlKCl9ZWxzZXtsZXQgb2U9ci5URVhUVVJFXzJEO2lmKChDLmlzV2ViR0wzRFJlbmRlclRhcmdldHx8Qy5pc1dlYkdMQXJyYXlSZW5kZXJUYXJnZXQpJiYobz9vZT1DLmlzV2ViR0wzRFJlbmRlclRhcmdldD9yLlRFWFRVUkVfM0Q6ci5URVhUVVJFXzJEX0FSUkFZOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMVGV4dHVyZXM6IFRIUkVFLkRhdGEzRFRleHR1cmUgYW5kIFRIUkVFLkRhdGFBcnJheVRleHR1cmUgb25seSBzdXBwb3J0ZWQgd2l0aCBXZWJHTDIuIikpLHQuYmluZFRleHR1cmUob2Usc2UuX193ZWJnbFRleHR1cmUpLGJlKG9lLEUsQWUpLG8mJkUubWlwbWFwcyYmRS5taXBtYXBzLmxlbmd0aD4wKWZvcihsZXQgeGU9MDt4ZTxFLm1pcG1hcHMubGVuZ3RoO3hlKyspUGUoay5fX3dlYmdsRnJhbWVidWZmZXJbeGVdLEMsRSxyLkNPTE9SX0FUVEFDSE1FTlQwLG9lLHhlKTtlbHNlIFBlKGsuX193ZWJnbEZyYW1lYnVmZmVyLEMsRSxyLkNPTE9SX0FUVEFDSE1FTlQwLG9lLDApO2IoRSxBZSkmJkEob2UpLHQudW5iaW5kVGV4dHVyZSgpfUMuZGVwdGhCdWZmZXImJksoQyl9ZnVuY3Rpb24gQ2UoQyl7Y29uc3QgRT12KEMpfHxvLGs9Qy5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzPT09ITA/Qy50ZXh0dXJlOltDLnRleHR1cmVdO2ZvcihsZXQgc2U9MCx0ZT1rLmxlbmd0aDtzZTx0ZTtzZSsrKXtjb25zdCBhZT1rW3NlXTtpZihiKGFlLEUpKXtjb25zdCBBZT1DLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0P3IuVEVYVFVSRV9DVUJFX01BUDpyLlRFWFRVUkVfMkQsb2U9bi5nZXQoYWUpLl9fd2ViZ2xUZXh0dXJlO3QuYmluZFRleHR1cmUoQWUsb2UpLEEoQWUpLHQudW5iaW5kVGV4dHVyZSgpfX19ZnVuY3Rpb24gVyhDKXtpZihvJiZDLnNhbXBsZXM+MCYmaWUoQyk9PT0hMSl7Y29uc3QgRT1DLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM/Qy50ZXh0dXJlOltDLnRleHR1cmVdLGs9Qy53aWR0aCxzZT1DLmhlaWdodDtsZXQgdGU9ci5DT0xPUl9CVUZGRVJfQklUO2NvbnN0IGFlPVtdLEFlPUMuc3RlbmNpbEJ1ZmZlcj9yLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVDpyLkRFUFRIX0FUVEFDSE1FTlQsb2U9bi5nZXQoQykseGU9Qy5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzPT09ITA7aWYoeGUpZm9yKGxldCBEZT0wO0RlPEUubGVuZ3RoO0RlKyspdC5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixvZS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLHIuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoci5GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwK0RlLHIuUkVOREVSQlVGRkVSLG51bGwpLHQuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsb2UuX193ZWJnbEZyYW1lYnVmZmVyKSxyLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHIuRFJBV19GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwK0RlLHIuVEVYVFVSRV8yRCxudWxsLDApO3QuYmluZEZyYW1lYnVmZmVyKHIuUkVBRF9GUkFNRUJVRkZFUixvZS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLHQuYmluZEZyYW1lYnVmZmVyKHIuRFJBV19GUkFNRUJVRkZFUixvZS5fX3dlYmdsRnJhbWVidWZmZXIpO2ZvcihsZXQgRGU9MDtEZTxFLmxlbmd0aDtEZSsrKXthZS5wdXNoKHIuQ09MT1JfQVRUQUNITUVOVDArRGUpLEMuZGVwdGhCdWZmZXImJmFlLnB1c2goQWUpO2NvbnN0IHR0PW9lLl9faWdub3JlRGVwdGhWYWx1ZXMhPT12b2lkIDA/b2UuX19pZ25vcmVEZXB0aFZhbHVlczohMTtpZih0dD09PSExJiYoQy5kZXB0aEJ1ZmZlciYmKHRlfD1yLkRFUFRIX0JVRkZFUl9CSVQpLEMuc3RlbmNpbEJ1ZmZlciYmKHRlfD1yLlNURU5DSUxfQlVGRkVSX0JJVCkpLHhlJiZyLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHIuUkVBRF9GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwLHIuUkVOREVSQlVGRkVSLG9lLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltEZV0pLHR0PT09ITAmJihyLmludmFsaWRhdGVGcmFtZWJ1ZmZlcihyLlJFQURfRlJBTUVCVUZGRVIsW0FlXSksci5pbnZhbGlkYXRlRnJhbWVidWZmZXIoci5EUkFXX0ZSQU1FQlVGRkVSLFtBZV0pKSx4ZSl7Y29uc3QgY2U9bi5nZXQoRVtEZV0pLl9fd2ViZ2xUZXh0dXJlO3IuZnJhbWVidWZmZXJUZXh0dXJlMkQoci5EUkFXX0ZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDAsci5URVhUVVJFXzJELGNlLDApfXIuYmxpdEZyYW1lYnVmZmVyKDAsMCxrLHNlLDAsMCxrLHNlLHRlLHIuTkVBUkVTVCksZCYmci5pbnZhbGlkYXRlRnJhbWVidWZmZXIoci5SRUFEX0ZSQU1FQlVGRkVSLGFlKX1pZih0LmJpbmRGcmFtZWJ1ZmZlcihyLlJFQURfRlJBTUVCVUZGRVIsbnVsbCksdC5iaW5kRnJhbWVidWZmZXIoci5EUkFXX0ZSQU1FQlVGRkVSLG51bGwpLHhlKWZvcihsZXQgRGU9MDtEZTxFLmxlbmd0aDtEZSsrKXt0LmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLG9lLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksci5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihyLkZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDArRGUsci5SRU5ERVJCVUZGRVIsb2UuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW0RlXSk7Y29uc3QgdHQ9bi5nZXQoRVtEZV0pLl9fd2ViZ2xUZXh0dXJlO3QuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsb2UuX193ZWJnbEZyYW1lYnVmZmVyKSxyLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHIuRFJBV19GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwK0RlLHIuVEVYVFVSRV8yRCx0dCwwKX10LmJpbmRGcmFtZWJ1ZmZlcihyLkRSQVdfRlJBTUVCVUZGRVIsb2UuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKX19ZnVuY3Rpb24gSihDKXtyZXR1cm4gTWF0aC5taW4odSxDLnNhbXBsZXMpfWZ1bmN0aW9uIGllKEMpe2NvbnN0IEU9bi5nZXQoQyk7cmV0dXJuIG8mJkMuc2FtcGxlcz4wJiZlLmhhcygiV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIik9PT0hMCYmRS5fX3VzZVJlbmRlclRvVGV4dHVyZSE9PSExfWZ1bmN0aW9uIG1lKEMpe2NvbnN0IEU9YS5yZW5kZXIuZnJhbWU7cC5nZXQoQykhPT1FJiYocC5zZXQoQyxFKSxDLnVwZGF0ZSgpKX1mdW5jdGlvbiBwZShDLEUpe2NvbnN0IGs9Qy5jb2xvclNwYWNlLHNlPUMuZm9ybWF0LHRlPUMudHlwZTtyZXR1cm4gQy5pc0NvbXByZXNzZWRUZXh0dXJlPT09ITB8fEMuaXNWaWRlb1RleHR1cmU9PT0hMHx8Qy5mb3JtYXQ9PT0kYXx8ayE9PVZuJiZrIT09Z24mJihvdC5nZXRUcmFuc2ZlcihrKT09PWN0P289PT0hMT9lLmhhcygiRVhUX3NSR0IiKT09PSEwJiZzZT09PWFuPyhDLmZvcm1hdD0kYSxDLm1pbkZpbHRlcj13dCxDLmdlbmVyYXRlTWlwbWFwcz0hMSk6RT1paC5zUkdCVG9MaW5lYXIoRSk6KHNlIT09YW58fHRlIT09UW4pJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXM6IHNSR0IgZW5jb2RlZCB0ZXh0dXJlcyBoYXZlIHRvIHVzZSBSR0JBRm9ybWF0IGFuZCBVbnNpZ25lZEJ5dGVUeXBlLiIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMVGV4dHVyZXM6IFVuc3VwcG9ydGVkIHRleHR1cmUgY29sb3Igc3BhY2U6IixrKSksRX10aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQ9Wix0aGlzLnJlc2V0VGV4dHVyZVVuaXRzPUYsdGhpcy5zZXRUZXh0dXJlMkQ9USx0aGlzLnNldFRleHR1cmUyREFycmF5PW5lLHRoaXMuc2V0VGV4dHVyZTNEPWZlLHRoaXMuc2V0VGV4dHVyZUN1YmU9JCx0aGlzLnJlYmluZFRleHR1cmVzPXVlLHRoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9cmUsdGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9Q2UsdGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1XLHRoaXMuc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlcj1LLHRoaXMuc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmU9UGUsdGhpcy51c2VNdWx0aXNhbXBsZWRSVFQ9aWV9ZnVuY3Rpb24gTXAocixlLHQpe2NvbnN0IG49dC5pc1dlYkdMMjtmdW5jdGlvbiBpKHMsYT1nbil7bGV0IG87Y29uc3QgbD1vdC5nZXRUcmFuc2ZlcihhKTtpZihzPT09UW4pcmV0dXJuIHIuVU5TSUdORURfQllURTtpZihzPT09X2MpcmV0dXJuIHIuVU5TSUdORURfU0hPUlRfNF80XzRfNDtpZihzPT09eGMpcmV0dXJuIHIuVU5TSUdORURfU0hPUlRfNV81XzVfMTtpZihzPT09bmQpcmV0dXJuIHIuQllURTtpZihzPT09aWQpcmV0dXJuIHIuU0hPUlQ7aWYocz09PUJhKXJldHVybiByLlVOU0lHTkVEX1NIT1JUO2lmKHM9PT1nYylyZXR1cm4gci5JTlQ7aWYocz09PWpuKXJldHVybiByLlVOU0lHTkVEX0lOVDtpZihzPT09Um4pcmV0dXJuIHIuRkxPQVQ7aWYocz09PXdyKXJldHVybiBuP3IuSEFMRl9GTE9BVDoobz1lLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpLG8hPT1udWxsP28uSEFMRl9GTE9BVF9PRVM6bnVsbCk7aWYocz09PXJkKXJldHVybiByLkFMUEhBO2lmKHM9PT1hbilyZXR1cm4gci5SR0JBO2lmKHM9PT1zZClyZXR1cm4gci5MVU1JTkFOQ0U7aWYocz09PWFkKXJldHVybiByLkxVTUlOQU5DRV9BTFBIQTtpZihzPT09U2kpcmV0dXJuIHIuREVQVEhfQ09NUE9ORU5UO2lmKHM9PT16aSlyZXR1cm4gci5ERVBUSF9TVEVOQ0lMO2lmKHM9PT0kYSlyZXR1cm4gbz1lLmdldCgiRVhUX3NSR0IiKSxvIT09bnVsbD9vLlNSR0JfQUxQSEFfRVhUOm51bGw7aWYocz09PW9kKXJldHVybiByLlJFRDtpZihzPT09eWMpcmV0dXJuIHIuUkVEX0lOVEVHRVI7aWYocz09PWxkKXJldHVybiByLlJHO2lmKHM9PT12YylyZXR1cm4gci5SR19JTlRFR0VSO2lmKHM9PT1NYylyZXR1cm4gci5SR0JBX0lOVEVHRVI7aWYocz09PXphfHxzPT09a2F8fHM9PT1HYXx8cz09PVZhKWlmKGw9PT1jdClpZihvPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Y19zcmdiIiksbyE9PW51bGwpe2lmKHM9PT16YSlyZXR1cm4gby5DT01QUkVTU0VEX1NSR0JfUzNUQ19EWFQxX0VYVDtpZihzPT09a2EpcmV0dXJuIG8uQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUMV9FWFQ7aWYocz09PUdhKXJldHVybiBvLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDNfRVhUO2lmKHM9PT1WYSlyZXR1cm4gby5DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQ1X0VYVH1lbHNlIHJldHVybiBudWxsO2Vsc2UgaWYobz1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKSxvIT09bnVsbCl7aWYocz09PXphKXJldHVybiBvLkNPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ7aWYocz09PWthKXJldHVybiBvLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUO2lmKHM9PT1HYSlyZXR1cm4gby5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtpZihzPT09VmEpcmV0dXJuIG8uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFR9ZWxzZSByZXR1cm4gbnVsbDtpZihzPT09U2N8fHM9PT1iY3x8cz09PXdjfHxzPT09RWMpaWYobz1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIiksbyE9PW51bGwpe2lmKHM9PT1TYylyZXR1cm4gby5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO2lmKHM9PT1iYylyZXR1cm4gby5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO2lmKHM9PT13YylyZXR1cm4gby5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZihzPT09RWMpcmV0dXJuIG8uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUd9ZWxzZSByZXR1cm4gbnVsbDtpZihzPT09QWMpcmV0dXJuIG89ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxIiksbyE9PW51bGw/by5DT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMOm51bGw7aWYocz09PVRjfHxzPT09Q2MpaWYobz1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YyIpLG8hPT1udWxsKXtpZihzPT09VGMpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfRVRDMjpvLkNPTVBSRVNTRURfUkdCOF9FVEMyO2lmKHM9PT1DYylyZXR1cm4gbD09PWN0P28uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfRVRDMl9FQUM6by5DT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDfWVsc2UgcmV0dXJuIG51bGw7aWYocz09PVJjfHxzPT09UGN8fHM9PT1MY3x8cz09PUljfHxzPT09VWN8fHM9PT1EY3x8cz09PU5jfHxzPT09RmN8fHM9PT1PY3x8cz09PUJjfHxzPT09emN8fHM9PT1rY3x8cz09PUdjfHxzPT09VmMpaWYobz1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSxvIT09bnVsbCl7aWYocz09PVJjKXJldHVybiBsPT09Y3Q/by5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzR4NF9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfS0hSO2lmKHM9PT1QYylyZXR1cm4gbD09PWN0P28uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ181eDRfS0hSOm8uQ09NUFJFU1NFRF9SR0JBX0FTVENfNXg0X0tIUjtpZihzPT09TGMpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNXg1X0tIUjpvLkNPTVBSRVNTRURfUkdCQV9BU1RDXzV4NV9LSFI7aWYocz09PUljKXJldHVybiBsPT09Y3Q/by5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzZ4NV9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ182eDVfS0hSO2lmKHM9PT1VYylyZXR1cm4gbD09PWN0P28uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ182eDZfS0hSOm8uQ09NUFJFU1NFRF9SR0JBX0FTVENfNng2X0tIUjtpZihzPT09RGMpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg1X0tIUjpvLkNPTVBSRVNTRURfUkdCQV9BU1RDXzh4NV9LSFI7aWYocz09PU5jKXJldHVybiBsPT09Y3Q/by5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4Nl9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDZfS0hSO2lmKHM9PT1GYylyZXR1cm4gbD09PWN0P28uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDhfS0hSOm8uQ09NUFJFU1NFRF9SR0JBX0FTVENfOHg4X0tIUjtpZihzPT09T2MpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4NV9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg1X0tIUjtpZihzPT09QmMpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4Nl9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg2X0tIUjtpZihzPT09emMpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4OF9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg4X0tIUjtpZihzPT09a2MpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4MTBfS0hSOm8uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4MTBfS0hSO2lmKHM9PT1HYylyZXR1cm4gbD09PWN0P28uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMngxMF9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMngxMF9LSFI7aWYocz09PVZjKXJldHVybiBsPT09Y3Q/by5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEyeDEyX0tIUjpvLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEyeDEyX0tIUn1lbHNlIHJldHVybiBudWxsO2lmKHM9PT1IYXx8cz09PUhjfHxzPT09V2MpaWYobz1lLmdldCgiRVhUX3RleHR1cmVfY29tcHJlc3Npb25fYnB0YyIpLG8hPT1udWxsKXtpZihzPT09SGEpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9CUFRDX1VOT1JNX0VYVDpvLkNPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNX0VYVDtpZihzPT09SGMpcmV0dXJuIG8uQ09NUFJFU1NFRF9SR0JfQlBUQ19TSUdORURfRkxPQVRfRVhUO2lmKHM9PT1XYylyZXR1cm4gby5DT01QUkVTU0VEX1JHQl9CUFRDX1VOU0lHTkVEX0ZMT0FUX0VYVH1lbHNlIHJldHVybiBudWxsO2lmKHM9PT1jZHx8cz09PVhjfHxzPT09cWN8fHM9PT0kYylpZihvPWUuZ2V0KCJFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9yZ3RjIiksbyE9PW51bGwpe2lmKHM9PT1IYSlyZXR1cm4gby5DT01QUkVTU0VEX1JFRF9SR1RDMV9FWFQ7aWYocz09PVhjKXJldHVybiBvLkNPTVBSRVNTRURfU0lHTkVEX1JFRF9SR1RDMV9FWFQ7aWYocz09PXFjKXJldHVybiBvLkNPTVBSRVNTRURfUkVEX0dSRUVOX1JHVEMyX0VYVDtpZihzPT09JGMpcmV0dXJuIG8uQ09NUFJFU1NFRF9TSUdORURfUkVEX0dSRUVOX1JHVEMyX0VYVH1lbHNlIHJldHVybiBudWxsO3JldHVybiBzPT09TWk/bj9yLlVOU0lHTkVEX0lOVF8yNF84OihvPWUuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIiksbyE9PW51bGw/by5VTlNJR05FRF9JTlRfMjRfOF9XRUJHTDpudWxsKTpyW3NdIT09dm9pZCAwP3Jbc106bnVsbH1yZXR1cm57Y29udmVydDppfX1jbGFzcyBTcCBleHRlbmRzIEJ0e2NvbnN0cnVjdG9yKGU9W10pe3N1cGVyKCksdGhpcy5pc0FycmF5Q2FtZXJhPSEwLHRoaXMuY2FtZXJhcz1lfX1jbGFzcyBZciBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzR3JvdXA9ITAsdGhpcy50eXBlPSJHcm91cCJ9fWNvbnN0IGJTPXt0eXBlOiJtb3ZlIn07Y2xhc3MgVWh7Y29uc3RydWN0b3IoKXt0aGlzLl90YXJnZXRSYXk9bnVsbCx0aGlzLl9ncmlwPW51bGwsdGhpcy5faGFuZD1udWxsfWdldEhhbmRTcGFjZSgpe3JldHVybiB0aGlzLl9oYW5kPT09bnVsbCYmKHRoaXMuX2hhbmQ9bmV3IFlyLHRoaXMuX2hhbmQubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLl9oYW5kLnZpc2libGU9ITEsdGhpcy5faGFuZC5qb2ludHM9e30sdGhpcy5faGFuZC5pbnB1dFN0YXRlPXtwaW5jaGluZzohMX0pLHRoaXMuX2hhbmR9Z2V0VGFyZ2V0UmF5U3BhY2UoKXtyZXR1cm4gdGhpcy5fdGFyZ2V0UmF5PT09bnVsbCYmKHRoaXMuX3RhcmdldFJheT1uZXcgWXIsdGhpcy5fdGFyZ2V0UmF5Lm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5fdGFyZ2V0UmF5LnZpc2libGU9ITEsdGhpcy5fdGFyZ2V0UmF5Lmhhc0xpbmVhclZlbG9jaXR5PSExLHRoaXMuX3RhcmdldFJheS5saW5lYXJWZWxvY2l0eT1uZXcgUCx0aGlzLl90YXJnZXRSYXkuaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuX3RhcmdldFJheS5hbmd1bGFyVmVsb2NpdHk9bmV3IFApLHRoaXMuX3RhcmdldFJheX1nZXRHcmlwU3BhY2UoKXtyZXR1cm4gdGhpcy5fZ3JpcD09PW51bGwmJih0aGlzLl9ncmlwPW5ldyBZcix0aGlzLl9ncmlwLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5fZ3JpcC52aXNpYmxlPSExLHRoaXMuX2dyaXAuaGFzTGluZWFyVmVsb2NpdHk9ITEsdGhpcy5fZ3JpcC5saW5lYXJWZWxvY2l0eT1uZXcgUCx0aGlzLl9ncmlwLmhhc0FuZ3VsYXJWZWxvY2l0eT0hMSx0aGlzLl9ncmlwLmFuZ3VsYXJWZWxvY2l0eT1uZXcgUCksdGhpcy5fZ3JpcH1kaXNwYXRjaEV2ZW50KGUpe3JldHVybiB0aGlzLl90YXJnZXRSYXkhPT1udWxsJiZ0aGlzLl90YXJnZXRSYXkuZGlzcGF0Y2hFdmVudChlKSx0aGlzLl9ncmlwIT09bnVsbCYmdGhpcy5fZ3JpcC5kaXNwYXRjaEV2ZW50KGUpLHRoaXMuX2hhbmQhPT1udWxsJiZ0aGlzLl9oYW5kLmRpc3BhdGNoRXZlbnQoZSksdGhpc31jb25uZWN0KGUpe2lmKGUmJmUuaGFuZCl7Y29uc3QgdD10aGlzLl9oYW5kO2lmKHQpZm9yKGNvbnN0IG4gb2YgZS5oYW5kLnZhbHVlcygpKXRoaXMuX2dldEhhbmRKb2ludCh0LG4pfXJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImNvbm5lY3RlZCIsZGF0YTplfSksdGhpc31kaXNjb25uZWN0KGUpe3JldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc2Nvbm5lY3RlZCIsZGF0YTplfSksdGhpcy5fdGFyZ2V0UmF5IT09bnVsbCYmKHRoaXMuX3RhcmdldFJheS52aXNpYmxlPSExKSx0aGlzLl9ncmlwIT09bnVsbCYmKHRoaXMuX2dyaXAudmlzaWJsZT0hMSksdGhpcy5faGFuZCE9PW51bGwmJih0aGlzLl9oYW5kLnZpc2libGU9ITEpLHRoaXN9dXBkYXRlKGUsdCxuKXtsZXQgaT1udWxsLHM9bnVsbCxhPW51bGw7Y29uc3Qgbz10aGlzLl90YXJnZXRSYXksbD10aGlzLl9ncmlwLGM9dGhpcy5faGFuZDtpZihlJiZ0LnNlc3Npb24udmlzaWJpbGl0eVN0YXRlIT09InZpc2libGUtYmx1cnJlZCIpe2lmKGMmJmUuaGFuZCl7YT0hMDtmb3IoY29uc3QgXyBvZiBlLmhhbmQudmFsdWVzKCkpe2NvbnN0IGc9dC5nZXRKb2ludFBvc2UoXyxuKSxtPXRoaXMuX2dldEhhbmRKb2ludChjLF8pO2chPT1udWxsJiYobS5tYXRyaXguZnJvbUFycmF5KGcudHJhbnNmb3JtLm1hdHJpeCksbS5tYXRyaXguZGVjb21wb3NlKG0ucG9zaXRpb24sbS5yb3RhdGlvbixtLnNjYWxlKSxtLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITAsbS5qb2ludFJhZGl1cz1nLnJhZGl1cyksbS52aXNpYmxlPWchPT1udWxsfWNvbnN0IGg9Yy5qb2ludHNbImluZGV4LWZpbmdlci10aXAiXSx1PWMuam9pbnRzWyJ0aHVtYi10aXAiXSxmPWgucG9zaXRpb24uZGlzdGFuY2VUbyh1LnBvc2l0aW9uKSxkPS4wMixwPS4wMDU7Yy5pbnB1dFN0YXRlLnBpbmNoaW5nJiZmPmQrcD8oYy5pbnB1dFN0YXRlLnBpbmNoaW5nPSExLHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToicGluY2hlbmQiLGhhbmRlZG5lc3M6ZS5oYW5kZWRuZXNzLHRhcmdldDp0aGlzfSkpOiFjLmlucHV0U3RhdGUucGluY2hpbmcmJmY8PWQtcCYmKGMuaW5wdXRTdGF0ZS5waW5jaGluZz0hMCx0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6InBpbmNoc3RhcnQiLGhhbmRlZG5lc3M6ZS5oYW5kZWRuZXNzLHRhcmdldDp0aGlzfSkpfWVsc2UgbCE9PW51bGwmJmUuZ3JpcFNwYWNlJiYocz10LmdldFBvc2UoZS5ncmlwU3BhY2UsbikscyE9PW51bGwmJihsLm1hdHJpeC5mcm9tQXJyYXkocy50cmFuc2Zvcm0ubWF0cml4KSxsLm1hdHJpeC5kZWNvbXBvc2UobC5wb3NpdGlvbixsLnJvdGF0aW9uLGwuc2NhbGUpLGwubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMCxzLmxpbmVhclZlbG9jaXR5PyhsLmhhc0xpbmVhclZlbG9jaXR5PSEwLGwubGluZWFyVmVsb2NpdHkuY29weShzLmxpbmVhclZlbG9jaXR5KSk6bC5oYXNMaW5lYXJWZWxvY2l0eT0hMSxzLmFuZ3VsYXJWZWxvY2l0eT8obC5oYXNBbmd1bGFyVmVsb2NpdHk9ITAsbC5hbmd1bGFyVmVsb2NpdHkuY29weShzLmFuZ3VsYXJWZWxvY2l0eSkpOmwuaGFzQW5ndWxhclZlbG9jaXR5PSExKSk7byE9PW51bGwmJihpPXQuZ2V0UG9zZShlLnRhcmdldFJheVNwYWNlLG4pLGk9PT1udWxsJiZzIT09bnVsbCYmKGk9cyksaSE9PW51bGwmJihvLm1hdHJpeC5mcm9tQXJyYXkoaS50cmFuc2Zvcm0ubWF0cml4KSxvLm1hdHJpeC5kZWNvbXBvc2Uoby5wb3NpdGlvbixvLnJvdGF0aW9uLG8uc2NhbGUpLG8ubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMCxpLmxpbmVhclZlbG9jaXR5PyhvLmhhc0xpbmVhclZlbG9jaXR5PSEwLG8ubGluZWFyVmVsb2NpdHkuY29weShpLmxpbmVhclZlbG9jaXR5KSk6by5oYXNMaW5lYXJWZWxvY2l0eT0hMSxpLmFuZ3VsYXJWZWxvY2l0eT8oby5oYXNBbmd1bGFyVmVsb2NpdHk9ITAsby5hbmd1bGFyVmVsb2NpdHkuY29weShpLmFuZ3VsYXJWZWxvY2l0eSkpOm8uaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuZGlzcGF0Y2hFdmVudChiUykpKX1yZXR1cm4gbyE9PW51bGwmJihvLnZpc2libGU9aSE9PW51bGwpLGwhPT1udWxsJiYobC52aXNpYmxlPXMhPT1udWxsKSxjIT09bnVsbCYmKGMudmlzaWJsZT1hIT09bnVsbCksdGhpc31fZ2V0SGFuZEpvaW50KGUsdCl7aWYoZS5qb2ludHNbdC5qb2ludE5hbWVdPT09dm9pZCAwKXtjb25zdCBuPW5ldyBZcjtuLm1hdHJpeEF1dG9VcGRhdGU9ITEsbi52aXNpYmxlPSExLGUuam9pbnRzW3Quam9pbnROYW1lXT1uLGUuYWRkKG4pfXJldHVybiBlLmpvaW50c1t0LmpvaW50TmFtZV19fWNsYXNzIHdTIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpO2NvbnN0IG49dGhpcztsZXQgaT1udWxsLHM9MSxhPW51bGwsbz0ibG9jYWwtZmxvb3IiLGw9MSxjPW51bGwsaD1udWxsLHU9bnVsbCxmPW51bGwsZD1udWxsLHA9bnVsbDtjb25zdCBfPXQuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKTtsZXQgZz1udWxsLG09bnVsbDtjb25zdCB5PVtdLHg9W10sdj1uZXcgcTtsZXQgUz1udWxsO2NvbnN0IGI9bmV3IEJ0O2IubGF5ZXJzLmVuYWJsZSgxKSxiLnZpZXdwb3J0PW5ldyBsdDtjb25zdCBBPW5ldyBCdDtBLmxheWVycy5lbmFibGUoMiksQS52aWV3cG9ydD1uZXcgbHQ7Y29uc3QgTD1bYixBXSxNPW5ldyBTcDtNLmxheWVycy5lbmFibGUoMSksTS5sYXllcnMuZW5hYmxlKDIpO2xldCB3PW51bGwsUj1udWxsO3RoaXMuY2FtZXJhQXV0b1VwZGF0ZT0hMCx0aGlzLmVuYWJsZWQ9ITEsdGhpcy5pc1ByZXNlbnRpbmc9ITEsdGhpcy5nZXRDb250cm9sbGVyPWZ1bmN0aW9uKCQpe2xldCBlZT15WyRdO3JldHVybiBlZT09PXZvaWQgMCYmKGVlPW5ldyBVaCx5WyRdPWVlKSxlZS5nZXRUYXJnZXRSYXlTcGFjZSgpfSx0aGlzLmdldENvbnRyb2xsZXJHcmlwPWZ1bmN0aW9uKCQpe2xldCBlZT15WyRdO3JldHVybiBlZT09PXZvaWQgMCYmKGVlPW5ldyBVaCx5WyRdPWVlKSxlZS5nZXRHcmlwU3BhY2UoKX0sdGhpcy5nZXRIYW5kPWZ1bmN0aW9uKCQpe2xldCBlZT15WyRdO3JldHVybiBlZT09PXZvaWQgMCYmKGVlPW5ldyBVaCx5WyRdPWVlKSxlZS5nZXRIYW5kU3BhY2UoKX07ZnVuY3Rpb24gTigkKXtjb25zdCBlZT14LmluZGV4T2YoJC5pbnB1dFNvdXJjZSk7aWYoZWU9PT0tMSlyZXR1cm47Y29uc3QgZGU9eVtlZV07ZGUhPT12b2lkIDAmJihkZS51cGRhdGUoJC5pbnB1dFNvdXJjZSwkLmZyYW1lLGN8fGEpLGRlLmRpc3BhdGNoRXZlbnQoe3R5cGU6JC50eXBlLGRhdGE6JC5pbnB1dFNvdXJjZX0pKX1mdW5jdGlvbiBCKCl7aS5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3QiLE4pLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLE4pLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixOKSxpLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNxdWVlemUiLE4pLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZXN0YXJ0IixOKSxpLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNxdWVlemVlbmQiLE4pLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kIixCKSxpLnJlbW92ZUV2ZW50TGlzdGVuZXIoImlucHV0c291cmNlc2NoYW5nZSIsSSk7Zm9yKGxldCAkPTA7JDx5Lmxlbmd0aDskKyspe2NvbnN0IGVlPXhbJF07ZWUhPT1udWxsJiYoeFskXT1udWxsLHlbJF0uZGlzY29ubmVjdChlZSkpfXc9bnVsbCxSPW51bGwsZS5zZXRSZW5kZXJUYXJnZXQoZyksZD1udWxsLGY9bnVsbCx1PW51bGwsaT1udWxsLG09bnVsbCxmZS5zdG9wKCksbi5pc1ByZXNlbnRpbmc9ITEsZS5zZXRQaXhlbFJhdGlvKFMpLGUuc2V0U2l6ZSh2LndpZHRoLHYuaGVpZ2h0LCExKSxuLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9dGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yPWZ1bmN0aW9uKCQpe3M9JCxuLmlzUHJlc2VudGluZz09PSEwJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYlhSTWFuYWdlcjogQ2Fubm90IGNoYW5nZSBmcmFtZWJ1ZmZlciBzY2FsZSB3aGlsZSBwcmVzZW50aW5nLiIpfSx0aGlzLnNldFJlZmVyZW5jZVNwYWNlVHlwZT1mdW5jdGlvbigkKXtvPSQsbi5pc1ByZXNlbnRpbmc9PT0hMCYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgcmVmZXJlbmNlIHNwYWNlIHR5cGUgd2hpbGUgcHJlc2VudGluZy4iKX0sdGhpcy5nZXRSZWZlcmVuY2VTcGFjZT1mdW5jdGlvbigpe3JldHVybiBjfHxhfSx0aGlzLnNldFJlZmVyZW5jZVNwYWNlPWZ1bmN0aW9uKCQpe2M9JH0sdGhpcy5nZXRCYXNlTGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gZiE9PW51bGw/ZjpkfSx0aGlzLmdldEJpbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdX0sdGhpcy5nZXRGcmFtZT1mdW5jdGlvbigpe3JldHVybiBwfSx0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gaX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKCQpe3JldHVybiB5cyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoaT0kLGkhPT1udWxsKXtpZihnPWUuZ2V0UmVuZGVyVGFyZ2V0KCksaS5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLE4pLGkuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLE4pLGkuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixOKSxpLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemUiLE4pLGkuYWRkRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZXN0YXJ0IixOKSxpLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemVlbmQiLE4pLGkuYWRkRXZlbnRMaXN0ZW5lcigiZW5kIixCKSxpLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0c291cmNlc2NoYW5nZSIsSSksXy54ckNvbXBhdGlibGUhPT0hMCYmKHlpZWxkIHQubWFrZVhSQ29tcGF0aWJsZSgpKSxTPWUuZ2V0UGl4ZWxSYXRpbygpLGUuZ2V0U2l6ZSh2KSxpLnJlbmRlclN0YXRlLmxheWVycz09PXZvaWQgMHx8ZS5jYXBhYmlsaXRpZXMuaXNXZWJHTDI9PT0hMSl7Y29uc3QgZWU9e2FudGlhbGlhczppLnJlbmRlclN0YXRlLmxheWVycz09PXZvaWQgMD9fLmFudGlhbGlhczohMCxhbHBoYTohMCxkZXB0aDpfLmRlcHRoLHN0ZW5jaWw6Xy5zdGVuY2lsLGZyYW1lYnVmZmVyU2NhbGVGYWN0b3I6c307ZD1uZXcgWFJXZWJHTExheWVyKGksdCxlZSksaS51cGRhdGVSZW5kZXJTdGF0ZSh7YmFzZUxheWVyOmR9KSxlLnNldFBpeGVsUmF0aW8oMSksZS5zZXRTaXplKGQuZnJhbWVidWZmZXJXaWR0aCxkLmZyYW1lYnVmZmVySGVpZ2h0LCExKSxtPW5ldyBMbihkLmZyYW1lYnVmZmVyV2lkdGgsZC5mcmFtZWJ1ZmZlckhlaWdodCx7Zm9ybWF0OmFuLHR5cGU6UW4sY29sb3JTcGFjZTplLm91dHB1dENvbG9yU3BhY2Usc3RlbmNpbEJ1ZmZlcjpfLnN0ZW5jaWx9KX1lbHNle2xldCBlZT1udWxsLGRlPW51bGwsVGU9bnVsbDtfLmRlcHRoJiYoVGU9Xy5zdGVuY2lsP3QuREVQVEgyNF9TVEVOQ0lMODp0LkRFUFRIX0NPTVBPTkVOVDI0LGVlPV8uc3RlbmNpbD96aTpTaSxkZT1fLnN0ZW5jaWw/TWk6am4pO2NvbnN0IGJlPXtjb2xvckZvcm1hdDp0LlJHQkE4LGRlcHRoRm9ybWF0OlRlLHNjYWxlRmFjdG9yOnN9O3U9bmV3IFhSV2ViR0xCaW5kaW5nKGksdCksZj11LmNyZWF0ZVByb2plY3Rpb25MYXllcihiZSksaS51cGRhdGVSZW5kZXJTdGF0ZSh7bGF5ZXJzOltmXX0pLGUuc2V0UGl4ZWxSYXRpbygxKSxlLnNldFNpemUoZi50ZXh0dXJlV2lkdGgsZi50ZXh0dXJlSGVpZ2h0LCExKSxtPW5ldyBMbihmLnRleHR1cmVXaWR0aCxmLnRleHR1cmVIZWlnaHQse2Zvcm1hdDphbix0eXBlOlFuLGRlcHRoVGV4dHVyZTpuZXcgQ2goZi50ZXh0dXJlV2lkdGgsZi50ZXh0dXJlSGVpZ2h0LGRlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGVlKSxzdGVuY2lsQnVmZmVyOl8uc3RlbmNpbCxjb2xvclNwYWNlOmUub3V0cHV0Q29sb3JTcGFjZSxzYW1wbGVzOl8uYW50aWFsaWFzPzQ6MH0pO2NvbnN0IE9lPWUucHJvcGVydGllcy5nZXQobSk7T2UuX19pZ25vcmVEZXB0aFZhbHVlcz1mLmlnbm9yZURlcHRoVmFsdWVzfW0uaXNYUlJlbmRlclRhcmdldD0hMCx0aGlzLnNldEZvdmVhdGlvbihsKSxjPW51bGwsYT15aWVsZCBpLnJlcXVlc3RSZWZlcmVuY2VTcGFjZShvKSxmZS5zZXRDb250ZXh0KGkpLGZlLnN0YXJ0KCksbi5pc1ByZXNlbnRpbmc9ITAsbi5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9fSl9LHRoaXMuZ2V0RW52aXJvbm1lbnRCbGVuZE1vZGU9ZnVuY3Rpb24oKXtpZihpIT09bnVsbClyZXR1cm4gaS5lbnZpcm9ubWVudEJsZW5kTW9kZX07ZnVuY3Rpb24gSSgkKXtmb3IobGV0IGVlPTA7ZWU8JC5yZW1vdmVkLmxlbmd0aDtlZSsrKXtjb25zdCBkZT0kLnJlbW92ZWRbZWVdLFRlPXguaW5kZXhPZihkZSk7VGU+PTAmJih4W1RlXT1udWxsLHlbVGVdLmRpc2Nvbm5lY3QoZGUpKX1mb3IobGV0IGVlPTA7ZWU8JC5hZGRlZC5sZW5ndGg7ZWUrKyl7Y29uc3QgZGU9JC5hZGRlZFtlZV07bGV0IFRlPXguaW5kZXhPZihkZSk7aWYoVGU9PT0tMSl7Zm9yKGxldCBPZT0wO09lPHkubGVuZ3RoO09lKyspaWYoT2U+PXgubGVuZ3RoKXt4LnB1c2goZGUpLFRlPU9lO2JyZWFrfWVsc2UgaWYoeFtPZV09PT1udWxsKXt4W09lXT1kZSxUZT1PZTticmVha31pZihUZT09PS0xKWJyZWFrfWNvbnN0IGJlPXlbVGVdO2JlJiZiZS5jb25uZWN0KGRlKX19Y29uc3QgVT1uZXcgUCx6PW5ldyBQO2Z1bmN0aW9uIEYoJCxlZSxkZSl7VS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZWUubWF0cml4V29ybGQpLHouc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGRlLm1hdHJpeFdvcmxkKTtjb25zdCBUZT1VLmRpc3RhbmNlVG8oeiksYmU9ZWUucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cyxPZT1kZS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzLEJlPWJlWzE0XS8oYmVbMTBdLTEpLHdlPWJlWzE0XS8oYmVbMTBdKzEpLFBlPShiZVs5XSsxKS9iZVs1XSxEPShiZVs5XS0xKS9iZVs1XSxsZT0oYmVbOF0tMSkvYmVbMF0sSz0oT2VbOF0rMSkvT2VbMF0sdWU9QmUqbGUscmU9QmUqSyxDZT1UZS8oLWxlK0spLFc9Q2UqLWxlO2VlLm1hdHJpeFdvcmxkLmRlY29tcG9zZSgkLnBvc2l0aW9uLCQucXVhdGVybmlvbiwkLnNjYWxlKSwkLnRyYW5zbGF0ZVgoVyksJC50cmFuc2xhdGVaKENlKSwkLm1hdHJpeFdvcmxkLmNvbXBvc2UoJC5wb3NpdGlvbiwkLnF1YXRlcm5pb24sJC5zY2FsZSksJC5tYXRyaXhXb3JsZEludmVyc2UuY29weSgkLm1hdHJpeFdvcmxkKS5pbnZlcnQoKTtjb25zdCBKPUJlK0NlLGllPXdlK0NlLG1lPXVlLVcscGU9cmUrKFRlLVcpLEM9UGUqd2UvaWUqSixFPUQqd2UvaWUqSjskLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKG1lLHBlLEMsRSxKLGllKSwkLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoJC5wcm9qZWN0aW9uTWF0cml4KS5pbnZlcnQoKX1mdW5jdGlvbiBaKCQsZWUpe2VlPT09bnVsbD8kLm1hdHJpeFdvcmxkLmNvcHkoJC5tYXRyaXgpOiQubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyhlZS5tYXRyaXhXb3JsZCwkLm1hdHJpeCksJC5tYXRyaXhXb3JsZEludmVyc2UuY29weSgkLm1hdHJpeFdvcmxkKS5pbnZlcnQoKX10aGlzLnVwZGF0ZUNhbWVyYT1mdW5jdGlvbigkKXtpZihpPT09bnVsbClyZXR1cm47TS5uZWFyPUEubmVhcj1iLm5lYXI9JC5uZWFyLE0uZmFyPUEuZmFyPWIuZmFyPSQuZmFyLCh3IT09TS5uZWFyfHxSIT09TS5mYXIpJiYoaS51cGRhdGVSZW5kZXJTdGF0ZSh7ZGVwdGhOZWFyOk0ubmVhcixkZXB0aEZhcjpNLmZhcn0pLHc9TS5uZWFyLFI9TS5mYXIpO2NvbnN0IGVlPSQucGFyZW50LGRlPU0uY2FtZXJhcztaKE0sZWUpO2ZvcihsZXQgVGU9MDtUZTxkZS5sZW5ndGg7VGUrKylaKGRlW1RlXSxlZSk7ZGUubGVuZ3RoPT09Mj9GKE0sYixBKTpNLnByb2plY3Rpb25NYXRyaXguY29weShiLnByb2plY3Rpb25NYXRyaXgpLFYoJCxNLGVlKX07ZnVuY3Rpb24gVigkLGVlLGRlKXtkZT09PW51bGw/JC5tYXRyaXguY29weShlZS5tYXRyaXhXb3JsZCk6KCQubWF0cml4LmNvcHkoZGUubWF0cml4V29ybGQpLCQubWF0cml4LmludmVydCgpLCQubWF0cml4Lm11bHRpcGx5KGVlLm1hdHJpeFdvcmxkKSksJC5tYXRyaXguZGVjb21wb3NlKCQucG9zaXRpb24sJC5xdWF0ZXJuaW9uLCQuc2NhbGUpLCQudXBkYXRlTWF0cml4V29ybGQoITApLCQucHJvamVjdGlvbk1hdHJpeC5jb3B5KGVlLnByb2plY3Rpb25NYXRyaXgpLCQucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShlZS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSksJC5pc1BlcnNwZWN0aXZlQ2FtZXJhJiYoJC5mb3Y9QXIqMipNYXRoLmF0YW4oMS8kLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbNV0pLCQuem9vbT0xKX10aGlzLmdldENhbWVyYT1mdW5jdGlvbigpe3JldHVybiBNfSx0aGlzLmdldEZvdmVhdGlvbj1mdW5jdGlvbigpe2lmKCEoZj09PW51bGwmJmQ9PT1udWxsKSlyZXR1cm4gbH0sdGhpcy5zZXRGb3ZlYXRpb249ZnVuY3Rpb24oJCl7bD0kLGYhPT1udWxsJiYoZi5maXhlZEZvdmVhdGlvbj0kKSxkIT09bnVsbCYmZC5maXhlZEZvdmVhdGlvbiE9PXZvaWQgMCYmKGQuZml4ZWRGb3ZlYXRpb249JCl9O2xldCBRPW51bGw7ZnVuY3Rpb24gbmUoJCxlZSl7aWYoaD1lZS5nZXRWaWV3ZXJQb3NlKGN8fGEpLHA9ZWUsaCE9PW51bGwpe2NvbnN0IGRlPWgudmlld3M7ZCE9PW51bGwmJihlLnNldFJlbmRlclRhcmdldEZyYW1lYnVmZmVyKG0sZC5mcmFtZWJ1ZmZlciksZS5zZXRSZW5kZXJUYXJnZXQobSkpO2xldCBUZT0hMTtkZS5sZW5ndGghPT1NLmNhbWVyYXMubGVuZ3RoJiYoTS5jYW1lcmFzLmxlbmd0aD0wLFRlPSEwKTtmb3IobGV0IGJlPTA7YmU8ZGUubGVuZ3RoO2JlKyspe2NvbnN0IE9lPWRlW2JlXTtsZXQgQmU9bnVsbDtpZihkIT09bnVsbClCZT1kLmdldFZpZXdwb3J0KE9lKTtlbHNle2NvbnN0IFBlPXUuZ2V0Vmlld1N1YkltYWdlKGYsT2UpO0JlPVBlLnZpZXdwb3J0LGJlPT09MCYmKGUuc2V0UmVuZGVyVGFyZ2V0VGV4dHVyZXMobSxQZS5jb2xvclRleHR1cmUsZi5pZ25vcmVEZXB0aFZhbHVlcz92b2lkIDA6UGUuZGVwdGhTdGVuY2lsVGV4dHVyZSksZS5zZXRSZW5kZXJUYXJnZXQobSkpfWxldCB3ZT1MW2JlXTt3ZT09PXZvaWQgMCYmKHdlPW5ldyBCdCx3ZS5sYXllcnMuZW5hYmxlKGJlKSx3ZS52aWV3cG9ydD1uZXcgbHQsTFtiZV09d2UpLHdlLm1hdHJpeC5mcm9tQXJyYXkoT2UudHJhbnNmb3JtLm1hdHJpeCksd2UubWF0cml4LmRlY29tcG9zZSh3ZS5wb3NpdGlvbix3ZS5xdWF0ZXJuaW9uLHdlLnNjYWxlKSx3ZS5wcm9qZWN0aW9uTWF0cml4LmZyb21BcnJheShPZS5wcm9qZWN0aW9uTWF0cml4KSx3ZS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHdlLnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpLHdlLnZpZXdwb3J0LnNldChCZS54LEJlLnksQmUud2lkdGgsQmUuaGVpZ2h0KSxiZT09PTAmJihNLm1hdHJpeC5jb3B5KHdlLm1hdHJpeCksTS5tYXRyaXguZGVjb21wb3NlKE0ucG9zaXRpb24sTS5xdWF0ZXJuaW9uLE0uc2NhbGUpKSxUZT09PSEwJiZNLmNhbWVyYXMucHVzaCh3ZSl9fWZvcihsZXQgZGU9MDtkZTx5Lmxlbmd0aDtkZSsrKXtjb25zdCBUZT14W2RlXSxiZT15W2RlXTtUZSE9PW51bGwmJmJlIT09dm9pZCAwJiZiZS51cGRhdGUoVGUsZWUsY3x8YSl9USYmUSgkLGVlKSxlZS5kZXRlY3RlZFBsYW5lcyYmbi5kaXNwYXRjaEV2ZW50KHt0eXBlOiJwbGFuZXNkZXRlY3RlZCIsZGF0YTplZX0pLHA9bnVsbH1jb25zdCBmZT1uZXcgWWQ7ZmUuc2V0QW5pbWF0aW9uTG9vcChuZSksdGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKCQpe1E9JH0sdGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7fX19ZnVuY3Rpb24gRVMocixlKXtmdW5jdGlvbiB0KGcsbSl7Zy5tYXRyaXhBdXRvVXBkYXRlPT09ITAmJmcudXBkYXRlTWF0cml4KCksbS52YWx1ZS5jb3B5KGcubWF0cml4KX1mdW5jdGlvbiBuKGcsbSl7bS5jb2xvci5nZXRSR0IoZy5mb2dDb2xvci52YWx1ZSxXZChyKSksbS5pc0ZvZz8oZy5mb2dOZWFyLnZhbHVlPW0ubmVhcixnLmZvZ0Zhci52YWx1ZT1tLmZhcik6bS5pc0ZvZ0V4cDImJihnLmZvZ0RlbnNpdHkudmFsdWU9bS5kZW5zaXR5KX1mdW5jdGlvbiBpKGcsbSx5LHgsdil7bS5pc01lc2hCYXNpY01hdGVyaWFsfHxtLmlzTWVzaExhbWJlcnRNYXRlcmlhbD9zKGcsbSk6bS5pc01lc2hUb29uTWF0ZXJpYWw/KHMoZyxtKSx1KGcsbSkpOm0uaXNNZXNoUGhvbmdNYXRlcmlhbD8ocyhnLG0pLGgoZyxtKSk6bS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsPyhzKGcsbSksZihnLG0pLG0uaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCYmZChnLG0sdikpOm0uaXNNZXNoTWF0Y2FwTWF0ZXJpYWw/KHMoZyxtKSxwKGcsbSkpOm0uaXNNZXNoRGVwdGhNYXRlcmlhbD9zKGcsbSk6bS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPyhzKGcsbSksXyhnLG0pKTptLmlzTWVzaE5vcm1hbE1hdGVyaWFsP3MoZyxtKTptLmlzTGluZUJhc2ljTWF0ZXJpYWw/KGEoZyxtKSxtLmlzTGluZURhc2hlZE1hdGVyaWFsJiZvKGcsbSkpOm0uaXNQb2ludHNNYXRlcmlhbD9sKGcsbSx5LHgpOm0uaXNTcHJpdGVNYXRlcmlhbD9jKGcsbSk6bS5pc1NoYWRvd01hdGVyaWFsPyhnLmNvbG9yLnZhbHVlLmNvcHkobS5jb2xvciksZy5vcGFjaXR5LnZhbHVlPW0ub3BhY2l0eSk6bS5pc1NoYWRlck1hdGVyaWFsJiYobS51bmlmb3Jtc05lZWRVcGRhdGU9ITEpfWZ1bmN0aW9uIHMoZyxtKXtnLm9wYWNpdHkudmFsdWU9bS5vcGFjaXR5LG0uY29sb3ImJmcuZGlmZnVzZS52YWx1ZS5jb3B5KG0uY29sb3IpLG0uZW1pc3NpdmUmJmcuZW1pc3NpdmUudmFsdWUuY29weShtLmVtaXNzaXZlKS5tdWx0aXBseVNjYWxhcihtLmVtaXNzaXZlSW50ZW5zaXR5KSxtLm1hcCYmKGcubWFwLnZhbHVlPW0ubWFwLHQobS5tYXAsZy5tYXBUcmFuc2Zvcm0pKSxtLmFscGhhTWFwJiYoZy5hbHBoYU1hcC52YWx1ZT1tLmFscGhhTWFwLHQobS5hbHBoYU1hcCxnLmFscGhhTWFwVHJhbnNmb3JtKSksbS5idW1wTWFwJiYoZy5idW1wTWFwLnZhbHVlPW0uYnVtcE1hcCx0KG0uYnVtcE1hcCxnLmJ1bXBNYXBUcmFuc2Zvcm0pLGcuYnVtcFNjYWxlLnZhbHVlPW0uYnVtcFNjYWxlLG0uc2lkZT09PVl0JiYoZy5idW1wU2NhbGUudmFsdWUqPS0xKSksbS5ub3JtYWxNYXAmJihnLm5vcm1hbE1hcC52YWx1ZT1tLm5vcm1hbE1hcCx0KG0ubm9ybWFsTWFwLGcubm9ybWFsTWFwVHJhbnNmb3JtKSxnLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkobS5ub3JtYWxTY2FsZSksbS5zaWRlPT09WXQmJmcubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpLG0uZGlzcGxhY2VtZW50TWFwJiYoZy5kaXNwbGFjZW1lbnRNYXAudmFsdWU9bS5kaXNwbGFjZW1lbnRNYXAsdChtLmRpc3BsYWNlbWVudE1hcCxnLmRpc3BsYWNlbWVudE1hcFRyYW5zZm9ybSksZy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1tLmRpc3BsYWNlbWVudFNjYWxlLGcuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1tLmRpc3BsYWNlbWVudEJpYXMpLG0uZW1pc3NpdmVNYXAmJihnLmVtaXNzaXZlTWFwLnZhbHVlPW0uZW1pc3NpdmVNYXAsdChtLmVtaXNzaXZlTWFwLGcuZW1pc3NpdmVNYXBUcmFuc2Zvcm0pKSxtLnNwZWN1bGFyTWFwJiYoZy5zcGVjdWxhck1hcC52YWx1ZT1tLnNwZWN1bGFyTWFwLHQobS5zcGVjdWxhck1hcCxnLnNwZWN1bGFyTWFwVHJhbnNmb3JtKSksbS5hbHBoYVRlc3Q+MCYmKGcuYWxwaGFUZXN0LnZhbHVlPW0uYWxwaGFUZXN0KTtjb25zdCB5PWUuZ2V0KG0pLmVudk1hcDtpZih5JiYoZy5lbnZNYXAudmFsdWU9eSxnLmZsaXBFbnZNYXAudmFsdWU9eS5pc0N1YmVUZXh0dXJlJiZ5LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT09PSExPy0xOjEsZy5yZWZsZWN0aXZpdHkudmFsdWU9bS5yZWZsZWN0aXZpdHksZy5pb3IudmFsdWU9bS5pb3IsZy5yZWZyYWN0aW9uUmF0aW8udmFsdWU9bS5yZWZyYWN0aW9uUmF0aW8pLG0ubGlnaHRNYXApe2cubGlnaHRNYXAudmFsdWU9bS5saWdodE1hcDtjb25zdCB4PXIuX3VzZUxlZ2FjeUxpZ2h0cz09PSEwP01hdGguUEk6MTtnLmxpZ2h0TWFwSW50ZW5zaXR5LnZhbHVlPW0ubGlnaHRNYXBJbnRlbnNpdHkqeCx0KG0ubGlnaHRNYXAsZy5saWdodE1hcFRyYW5zZm9ybSl9bS5hb01hcCYmKGcuYW9NYXAudmFsdWU9bS5hb01hcCxnLmFvTWFwSW50ZW5zaXR5LnZhbHVlPW0uYW9NYXBJbnRlbnNpdHksdChtLmFvTWFwLGcuYW9NYXBUcmFuc2Zvcm0pKX1mdW5jdGlvbiBhKGcsbSl7Zy5kaWZmdXNlLnZhbHVlLmNvcHkobS5jb2xvciksZy5vcGFjaXR5LnZhbHVlPW0ub3BhY2l0eSxtLm1hcCYmKGcubWFwLnZhbHVlPW0ubWFwLHQobS5tYXAsZy5tYXBUcmFuc2Zvcm0pKX1mdW5jdGlvbiBvKGcsbSl7Zy5kYXNoU2l6ZS52YWx1ZT1tLmRhc2hTaXplLGcudG90YWxTaXplLnZhbHVlPW0uZGFzaFNpemUrbS5nYXBTaXplLGcuc2NhbGUudmFsdWU9bS5zY2FsZX1mdW5jdGlvbiBsKGcsbSx5LHgpe2cuZGlmZnVzZS52YWx1ZS5jb3B5KG0uY29sb3IpLGcub3BhY2l0eS52YWx1ZT1tLm9wYWNpdHksZy5zaXplLnZhbHVlPW0uc2l6ZSp5LGcuc2NhbGUudmFsdWU9eCouNSxtLm1hcCYmKGcubWFwLnZhbHVlPW0ubWFwLHQobS5tYXAsZy51dlRyYW5zZm9ybSkpLG0uYWxwaGFNYXAmJihnLmFscGhhTWFwLnZhbHVlPW0uYWxwaGFNYXAsdChtLmFscGhhTWFwLGcuYWxwaGFNYXBUcmFuc2Zvcm0pKSxtLmFscGhhVGVzdD4wJiYoZy5hbHBoYVRlc3QudmFsdWU9bS5hbHBoYVRlc3QpfWZ1bmN0aW9uIGMoZyxtKXtnLmRpZmZ1c2UudmFsdWUuY29weShtLmNvbG9yKSxnLm9wYWNpdHkudmFsdWU9bS5vcGFjaXR5LGcucm90YXRpb24udmFsdWU9bS5yb3RhdGlvbixtLm1hcCYmKGcubWFwLnZhbHVlPW0ubWFwLHQobS5tYXAsZy5tYXBUcmFuc2Zvcm0pKSxtLmFscGhhTWFwJiYoZy5hbHBoYU1hcC52YWx1ZT1tLmFscGhhTWFwLHQobS5hbHBoYU1hcCxnLmFscGhhTWFwVHJhbnNmb3JtKSksbS5hbHBoYVRlc3Q+MCYmKGcuYWxwaGFUZXN0LnZhbHVlPW0uYWxwaGFUZXN0KX1mdW5jdGlvbiBoKGcsbSl7Zy5zcGVjdWxhci52YWx1ZS5jb3B5KG0uc3BlY3VsYXIpLGcuc2hpbmluZXNzLnZhbHVlPU1hdGgubWF4KG0uc2hpbmluZXNzLDFlLTQpfWZ1bmN0aW9uIHUoZyxtKXttLmdyYWRpZW50TWFwJiYoZy5ncmFkaWVudE1hcC52YWx1ZT1tLmdyYWRpZW50TWFwKX1mdW5jdGlvbiBmKGcsbSl7Zy5tZXRhbG5lc3MudmFsdWU9bS5tZXRhbG5lc3MsbS5tZXRhbG5lc3NNYXAmJihnLm1ldGFsbmVzc01hcC52YWx1ZT1tLm1ldGFsbmVzc01hcCx0KG0ubWV0YWxuZXNzTWFwLGcubWV0YWxuZXNzTWFwVHJhbnNmb3JtKSksZy5yb3VnaG5lc3MudmFsdWU9bS5yb3VnaG5lc3MsbS5yb3VnaG5lc3NNYXAmJihnLnJvdWdobmVzc01hcC52YWx1ZT1tLnJvdWdobmVzc01hcCx0KG0ucm91Z2huZXNzTWFwLGcucm91Z2huZXNzTWFwVHJhbnNmb3JtKSksZS5nZXQobSkuZW52TWFwJiYoZy5lbnZNYXBJbnRlbnNpdHkudmFsdWU9bS5lbnZNYXBJbnRlbnNpdHkpfWZ1bmN0aW9uIGQoZyxtLHkpe2cuaW9yLnZhbHVlPW0uaW9yLG0uc2hlZW4+MCYmKGcuc2hlZW5Db2xvci52YWx1ZS5jb3B5KG0uc2hlZW5Db2xvcikubXVsdGlwbHlTY2FsYXIobS5zaGVlbiksZy5zaGVlblJvdWdobmVzcy52YWx1ZT1tLnNoZWVuUm91Z2huZXNzLG0uc2hlZW5Db2xvck1hcCYmKGcuc2hlZW5Db2xvck1hcC52YWx1ZT1tLnNoZWVuQ29sb3JNYXAsdChtLnNoZWVuQ29sb3JNYXAsZy5zaGVlbkNvbG9yTWFwVHJhbnNmb3JtKSksbS5zaGVlblJvdWdobmVzc01hcCYmKGcuc2hlZW5Sb3VnaG5lc3NNYXAudmFsdWU9bS5zaGVlblJvdWdobmVzc01hcCx0KG0uc2hlZW5Sb3VnaG5lc3NNYXAsZy5zaGVlblJvdWdobmVzc01hcFRyYW5zZm9ybSkpKSxtLmNsZWFyY29hdD4wJiYoZy5jbGVhcmNvYXQudmFsdWU9bS5jbGVhcmNvYXQsZy5jbGVhcmNvYXRSb3VnaG5lc3MudmFsdWU9bS5jbGVhcmNvYXRSb3VnaG5lc3MsbS5jbGVhcmNvYXRNYXAmJihnLmNsZWFyY29hdE1hcC52YWx1ZT1tLmNsZWFyY29hdE1hcCx0KG0uY2xlYXJjb2F0TWFwLGcuY2xlYXJjb2F0TWFwVHJhbnNmb3JtKSksbS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJihnLmNsZWFyY29hdFJvdWdobmVzc01hcC52YWx1ZT1tLmNsZWFyY29hdFJvdWdobmVzc01hcCx0KG0uY2xlYXJjb2F0Um91Z2huZXNzTWFwLGcuY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtKSksbS5jbGVhcmNvYXROb3JtYWxNYXAmJihnLmNsZWFyY29hdE5vcm1hbE1hcC52YWx1ZT1tLmNsZWFyY29hdE5vcm1hbE1hcCx0KG0uY2xlYXJjb2F0Tm9ybWFsTWFwLGcuY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtKSxnLmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLmNvcHkobS5jbGVhcmNvYXROb3JtYWxTY2FsZSksbS5zaWRlPT09WXQmJmcuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpKSxtLmlyaWRlc2NlbmNlPjAmJihnLmlyaWRlc2NlbmNlLnZhbHVlPW0uaXJpZGVzY2VuY2UsZy5pcmlkZXNjZW5jZUlPUi52YWx1ZT1tLmlyaWRlc2NlbmNlSU9SLGcuaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtLnZhbHVlPW0uaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZVswXSxnLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bS52YWx1ZT1tLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2VbMV0sbS5pcmlkZXNjZW5jZU1hcCYmKGcuaXJpZGVzY2VuY2VNYXAudmFsdWU9bS5pcmlkZXNjZW5jZU1hcCx0KG0uaXJpZGVzY2VuY2VNYXAsZy5pcmlkZXNjZW5jZU1hcFRyYW5zZm9ybSkpLG0uaXJpZGVzY2VuY2VUaGlja25lc3NNYXAmJihnLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnZhbHVlPW0uaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsdChtLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLGcuaXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm0pKSksbS50cmFuc21pc3Npb24+MCYmKGcudHJhbnNtaXNzaW9uLnZhbHVlPW0udHJhbnNtaXNzaW9uLGcudHJhbnNtaXNzaW9uU2FtcGxlck1hcC52YWx1ZT15LnRleHR1cmUsZy50cmFuc21pc3Npb25TYW1wbGVyU2l6ZS52YWx1ZS5zZXQoeS53aWR0aCx5LmhlaWdodCksbS50cmFuc21pc3Npb25NYXAmJihnLnRyYW5zbWlzc2lvbk1hcC52YWx1ZT1tLnRyYW5zbWlzc2lvbk1hcCx0KG0udHJhbnNtaXNzaW9uTWFwLGcudHJhbnNtaXNzaW9uTWFwVHJhbnNmb3JtKSksZy50aGlja25lc3MudmFsdWU9bS50aGlja25lc3MsbS50aGlja25lc3NNYXAmJihnLnRoaWNrbmVzc01hcC52YWx1ZT1tLnRoaWNrbmVzc01hcCx0KG0udGhpY2tuZXNzTWFwLGcudGhpY2tuZXNzTWFwVHJhbnNmb3JtKSksZy5hdHRlbnVhdGlvbkRpc3RhbmNlLnZhbHVlPW0uYXR0ZW51YXRpb25EaXN0YW5jZSxnLmF0dGVudWF0aW9uQ29sb3IudmFsdWUuY29weShtLmF0dGVudWF0aW9uQ29sb3IpKSxtLmFuaXNvdHJvcHk+MCYmKGcuYW5pc290cm9weVZlY3Rvci52YWx1ZS5zZXQobS5hbmlzb3Ryb3B5Kk1hdGguY29zKG0uYW5pc290cm9weVJvdGF0aW9uKSxtLmFuaXNvdHJvcHkqTWF0aC5zaW4obS5hbmlzb3Ryb3B5Um90YXRpb24pKSxtLmFuaXNvdHJvcHlNYXAmJihnLmFuaXNvdHJvcHlNYXAudmFsdWU9bS5hbmlzb3Ryb3B5TWFwLHQobS5hbmlzb3Ryb3B5TWFwLGcuYW5pc290cm9weU1hcFRyYW5zZm9ybSkpKSxnLnNwZWN1bGFySW50ZW5zaXR5LnZhbHVlPW0uc3BlY3VsYXJJbnRlbnNpdHksZy5zcGVjdWxhckNvbG9yLnZhbHVlLmNvcHkobS5zcGVjdWxhckNvbG9yKSxtLnNwZWN1bGFyQ29sb3JNYXAmJihnLnNwZWN1bGFyQ29sb3JNYXAudmFsdWU9bS5zcGVjdWxhckNvbG9yTWFwLHQobS5zcGVjdWxhckNvbG9yTWFwLGcuc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybSkpLG0uc3BlY3VsYXJJbnRlbnNpdHlNYXAmJihnLnNwZWN1bGFySW50ZW5zaXR5TWFwLnZhbHVlPW0uc3BlY3VsYXJJbnRlbnNpdHlNYXAsdChtLnNwZWN1bGFySW50ZW5zaXR5TWFwLGcuc3BlY3VsYXJJbnRlbnNpdHlNYXBUcmFuc2Zvcm0pKX1mdW5jdGlvbiBwKGcsbSl7bS5tYXRjYXAmJihnLm1hdGNhcC52YWx1ZT1tLm1hdGNhcCl9ZnVuY3Rpb24gXyhnLG0pe2NvbnN0IHk9ZS5nZXQobSkubGlnaHQ7Zy5yZWZlcmVuY2VQb3NpdGlvbi52YWx1ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oeS5tYXRyaXhXb3JsZCksZy5uZWFyRGlzdGFuY2UudmFsdWU9eS5zaGFkb3cuY2FtZXJhLm5lYXIsZy5mYXJEaXN0YW5jZS52YWx1ZT15LnNoYWRvdy5jYW1lcmEuZmFyfXJldHVybntyZWZyZXNoRm9nVW5pZm9ybXM6bixyZWZyZXNoTWF0ZXJpYWxVbmlmb3JtczppfX1mdW5jdGlvbiBBUyhyLGUsdCxuKXtsZXQgaT17fSxzPXt9LGE9W107Y29uc3Qgbz10LmlzV2ViR0wyP3IuZ2V0UGFyYW1ldGVyKHIuTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTKTowO2Z1bmN0aW9uIGwoeSx4KXtjb25zdCB2PXgucHJvZ3JhbTtuLnVuaWZvcm1CbG9ja0JpbmRpbmcoeSx2KX1mdW5jdGlvbiBjKHkseCl7bGV0IHY9aVt5LmlkXTt2PT09dm9pZCAwJiYocCh5KSx2PWgoeSksaVt5LmlkXT12LHkuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZykpO2NvbnN0IFM9eC5wcm9ncmFtO24udXBkYXRlVUJPTWFwcGluZyh5LFMpO2NvbnN0IGI9ZS5yZW5kZXIuZnJhbWU7c1t5LmlkXSE9PWImJihmKHkpLHNbeS5pZF09Yil9ZnVuY3Rpb24gaCh5KXtjb25zdCB4PXUoKTt5Ll9fYmluZGluZ1BvaW50SW5kZXg9eDtjb25zdCB2PXIuY3JlYXRlQnVmZmVyKCksUz15Ll9fc2l6ZSxiPXkudXNhZ2U7cmV0dXJuIHIuYmluZEJ1ZmZlcihyLlVOSUZPUk1fQlVGRkVSLHYpLHIuYnVmZmVyRGF0YShyLlVOSUZPUk1fQlVGRkVSLFMsYiksci5iaW5kQnVmZmVyKHIuVU5JRk9STV9CVUZGRVIsbnVsbCksci5iaW5kQnVmZmVyQmFzZShyLlVOSUZPUk1fQlVGRkVSLHgsdiksdn1mdW5jdGlvbiB1KCl7Zm9yKGxldCB5PTA7eTxvO3krKylpZihhLmluZGV4T2YoeSk9PT0tMSlyZXR1cm4gYS5wdXNoKHkpLHk7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6IE1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91c2x5IHVzYWJsZSB1bmlmb3JtcyBncm91cHMgcmVhY2hlZC4iKSwwfWZ1bmN0aW9uIGYoeSl7Y29uc3QgeD1pW3kuaWRdLHY9eS51bmlmb3JtcyxTPXkuX19jYWNoZTtyLmJpbmRCdWZmZXIoci5VTklGT1JNX0JVRkZFUix4KTtmb3IobGV0IGI9MCxBPXYubGVuZ3RoO2I8QTtiKyspe2NvbnN0IEw9dltiXTtpZihkKEwsYixTKT09PSEwKXtjb25zdCBNPUwuX19vZmZzZXQsdz1BcnJheS5pc0FycmF5KEwudmFsdWUpP0wudmFsdWU6W0wudmFsdWVdO2xldCBSPTA7Zm9yKGxldCBOPTA7Tjx3Lmxlbmd0aDtOKyspe2NvbnN0IEI9d1tOXSxJPV8oQik7dHlwZW9mIEI9PSJudW1iZXIiPyhMLl9fZGF0YVswXT1CLHIuYnVmZmVyU3ViRGF0YShyLlVOSUZPUk1fQlVGRkVSLE0rUixMLl9fZGF0YSkpOkIuaXNNYXRyaXgzPyhMLl9fZGF0YVswXT1CLmVsZW1lbnRzWzBdLEwuX19kYXRhWzFdPUIuZWxlbWVudHNbMV0sTC5fX2RhdGFbMl09Qi5lbGVtZW50c1syXSxMLl9fZGF0YVszXT1CLmVsZW1lbnRzWzBdLEwuX19kYXRhWzRdPUIuZWxlbWVudHNbM10sTC5fX2RhdGFbNV09Qi5lbGVtZW50c1s0XSxMLl9fZGF0YVs2XT1CLmVsZW1lbnRzWzVdLEwuX19kYXRhWzddPUIuZWxlbWVudHNbMF0sTC5fX2RhdGFbOF09Qi5lbGVtZW50c1s2XSxMLl9fZGF0YVs5XT1CLmVsZW1lbnRzWzddLEwuX19kYXRhWzEwXT1CLmVsZW1lbnRzWzhdLEwuX19kYXRhWzExXT1CLmVsZW1lbnRzWzBdKTooQi50b0FycmF5KEwuX19kYXRhLFIpLFIrPUkuc3RvcmFnZS9GbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpfXIuYnVmZmVyU3ViRGF0YShyLlVOSUZPUk1fQlVGRkVSLE0sTC5fX2RhdGEpfX1yLmJpbmRCdWZmZXIoci5VTklGT1JNX0JVRkZFUixudWxsKX1mdW5jdGlvbiBkKHkseCx2KXtjb25zdCBTPXkudmFsdWU7aWYodlt4XT09PXZvaWQgMCl7aWYodHlwZW9mIFM9PSJudW1iZXIiKXZbeF09UztlbHNle2NvbnN0IGI9QXJyYXkuaXNBcnJheShTKT9TOltTXSxBPVtdO2ZvcihsZXQgTD0wO0w8Yi5sZW5ndGg7TCsrKUEucHVzaChiW0xdLmNsb25lKCkpO3ZbeF09QX1yZXR1cm4hMH1lbHNlIGlmKHR5cGVvZiBTPT0ibnVtYmVyIil7aWYodlt4XSE9PVMpcmV0dXJuIHZbeF09UywhMH1lbHNle2NvbnN0IGI9QXJyYXkuaXNBcnJheSh2W3hdKT92W3hdOlt2W3hdXSxBPUFycmF5LmlzQXJyYXkoUyk/UzpbU107Zm9yKGxldCBMPTA7TDxiLmxlbmd0aDtMKyspe2NvbnN0IE09YltMXTtpZihNLmVxdWFscyhBW0xdKT09PSExKXJldHVybiBNLmNvcHkoQVtMXSksITB9fXJldHVybiExfWZ1bmN0aW9uIHAoeSl7Y29uc3QgeD15LnVuaWZvcm1zO2xldCB2PTA7Y29uc3QgUz0xNjtsZXQgYj0wO2ZvcihsZXQgQT0wLEw9eC5sZW5ndGg7QTxMO0ErKyl7Y29uc3QgTT14W0FdLHc9e2JvdW5kYXJ5OjAsc3RvcmFnZTowfSxSPUFycmF5LmlzQXJyYXkoTS52YWx1ZSk/TS52YWx1ZTpbTS52YWx1ZV07Zm9yKGxldCBOPTAsQj1SLmxlbmd0aDtOPEI7TisrKXtjb25zdCBJPVJbTl0sVT1fKEkpO3cuYm91bmRhcnkrPVUuYm91bmRhcnksdy5zdG9yYWdlKz1VLnN0b3JhZ2V9aWYoTS5fX2RhdGE9bmV3IEZsb2F0MzJBcnJheSh3LnN0b3JhZ2UvRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKSxNLl9fb2Zmc2V0PXYsQT4wKXtiPXYlUztjb25zdCBOPVMtYjtiIT09MCYmTi13LmJvdW5kYXJ5PDAmJih2Kz1TLWIsTS5fX29mZnNldD12KX12Kz13LnN0b3JhZ2V9cmV0dXJuIGI9diVTLGI+MCYmKHYrPVMtYikseS5fX3NpemU9dix5Ll9fY2FjaGU9e30sdGhpc31mdW5jdGlvbiBfKHkpe2NvbnN0IHg9e2JvdW5kYXJ5OjAsc3RvcmFnZTowfTtyZXR1cm4gdHlwZW9mIHk9PSJudW1iZXIiPyh4LmJvdW5kYXJ5PTQseC5zdG9yYWdlPTQpOnkuaXNWZWN0b3IyPyh4LmJvdW5kYXJ5PTgseC5zdG9yYWdlPTgpOnkuaXNWZWN0b3IzfHx5LmlzQ29sb3I/KHguYm91bmRhcnk9MTYseC5zdG9yYWdlPTEyKTp5LmlzVmVjdG9yND8oeC5ib3VuZGFyeT0xNix4LnN0b3JhZ2U9MTYpOnkuaXNNYXRyaXgzPyh4LmJvdW5kYXJ5PTQ4LHguc3RvcmFnZT00OCk6eS5pc01hdHJpeDQ/KHguYm91bmRhcnk9NjQseC5zdG9yYWdlPTY0KTp5LmlzVGV4dHVyZT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgc2FtcGxlcnMgY2FuIG5vdCBiZSBwYXJ0IG9mIGFuIHVuaWZvcm1zIGdyb3VwLiIpOmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVW5zdXBwb3J0ZWQgdW5pZm9ybSB2YWx1ZSB0eXBlLiIseSkseH1mdW5jdGlvbiBnKHkpe2NvbnN0IHg9eS50YXJnZXQ7eC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixnKTtjb25zdCB2PWEuaW5kZXhPZih4Ll9fYmluZGluZ1BvaW50SW5kZXgpO2Euc3BsaWNlKHYsMSksci5kZWxldGVCdWZmZXIoaVt4LmlkXSksZGVsZXRlIGlbeC5pZF0sZGVsZXRlIHNbeC5pZF19ZnVuY3Rpb24gbSgpe2Zvcihjb25zdCB5IGluIGkpci5kZWxldGVCdWZmZXIoaVt5XSk7YT1bXSxpPXt9LHM9e319cmV0dXJue2JpbmQ6bCx1cGRhdGU6YyxkaXNwb3NlOm19fWNsYXNzIGJwe2NvbnN0cnVjdG9yKGU9e30pe2NvbnN0e2NhbnZhczp0PUVkKCksY29udGV4dDpuPW51bGwsZGVwdGg6aT0hMCxzdGVuY2lsOnM9ITAsYWxwaGE6YT0hMSxhbnRpYWxpYXM6bz0hMSxwcmVtdWx0aXBsaWVkQWxwaGE6bD0hMCxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6Yz0hMSxwb3dlclByZWZlcmVuY2U6aD0iZGVmYXVsdCIsZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDp1PSExfT1lO3RoaXMuaXNXZWJHTFJlbmRlcmVyPSEwO2xldCBmO24hPT1udWxsP2Y9bi5nZXRDb250ZXh0QXR0cmlidXRlcygpLmFscGhhOmY9YTtjb25zdCBkPW5ldyBVaW50MzJBcnJheSg0KSxwPW5ldyBJbnQzMkFycmF5KDQpO2xldCBfPW51bGwsZz1udWxsO2NvbnN0IG09W10seT1bXTt0aGlzLmRvbUVsZW1lbnQ9dCx0aGlzLmRlYnVnPXtjaGVja1NoYWRlckVycm9yczohMCxvblNoYWRlckVycm9yOm51bGx9LHRoaXMuYXV0b0NsZWFyPSEwLHRoaXMuYXV0b0NsZWFyQ29sb3I9ITAsdGhpcy5hdXRvQ2xlYXJEZXB0aD0hMCx0aGlzLmF1dG9DbGVhclN0ZW5jaWw9ITAsdGhpcy5zb3J0T2JqZWN0cz0hMCx0aGlzLmNsaXBwaW5nUGxhbmVzPVtdLHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQ9ITEsdGhpcy5fb3V0cHV0Q29sb3JTcGFjZT1QdCx0aGlzLl91c2VMZWdhY3lMaWdodHM9ITEsdGhpcy50b25lTWFwcGluZz1Kbix0aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmU9MTtjb25zdCB4PXRoaXM7bGV0IHY9ITEsUz0wLGI9MCxBPW51bGwsTD0tMSxNPW51bGw7Y29uc3Qgdz1uZXcgbHQsUj1uZXcgbHQ7bGV0IE49bnVsbDtjb25zdCBCPW5ldyB5ZSgwKTtsZXQgST0wLFU9dC53aWR0aCx6PXQuaGVpZ2h0LEY9MSxaPW51bGwsVj1udWxsO2NvbnN0IFE9bmV3IGx0KDAsMCxVLHopLG5lPW5ldyBsdCgwLDAsVSx6KTtsZXQgZmU9ITE7Y29uc3QgJD1uZXcgcXM7bGV0IGVlPSExLGRlPSExLFRlPW51bGw7Y29uc3QgYmU9bmV3IEllLE9lPW5ldyBxLEJlPW5ldyBQLHdlPXtiYWNrZ3JvdW5kOm51bGwsZm9nOm51bGwsZW52aXJvbm1lbnQ6bnVsbCxvdmVycmlkZU1hdGVyaWFsOm51bGwsaXNTY2VuZTohMH07ZnVuY3Rpb24gUGUoKXtyZXR1cm4gQT09PW51bGw/RjoxfWxldCBEPW47ZnVuY3Rpb24gbGUoVCxHKXtmb3IobGV0IFg9MDtYPFQubGVuZ3RoO1grKyl7Y29uc3QgWT1UW1hdLEg9dC5nZXRDb250ZXh0KFksRyk7aWYoSCE9PW51bGwpcmV0dXJuIEh9cmV0dXJuIG51bGx9dHJ5e2NvbnN0IFQ9e2FscGhhOiEwLGRlcHRoOmksc3RlbmNpbDpzLGFudGlhbGlhczpvLHByZW11bHRpcGxpZWRBbHBoYTpsLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjpjLHBvd2VyUHJlZmVyZW5jZTpoLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6dX07aWYoInNldEF0dHJpYnV0ZSJpbiB0JiZ0LnNldEF0dHJpYnV0ZSgiZGF0YS1lbmdpbmUiLGB0aHJlZS5qcyByJHtmdH1gKSx0LmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLGplLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIixPLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IiLHZlLCExKSxEPT09bnVsbCl7Y29uc3QgRz1bIndlYmdsMiIsIndlYmdsIiwiZXhwZXJpbWVudGFsLXdlYmdsIl07aWYoeC5pc1dlYkdMMVJlbmRlcmVyPT09ITAmJkcuc2hpZnQoKSxEPWxlKEcsVCksRD09PW51bGwpdGhyb3cgbGUoRyk/bmV3IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0IHdpdGggeW91ciBzZWxlY3RlZCBhdHRyaWJ1dGVzLiIpOm5ldyBFcnJvcigiRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dC4iKX10eXBlb2YgV2ViR0xSZW5kZXJpbmdDb250ZXh0IT0idW5kZWZpbmVkIiYmRCBpbnN0YW5jZW9mIFdlYkdMUmVuZGVyaW5nQ29udGV4dCYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTCAxIHN1cHBvcnQgd2FzIGRlcHJlY2F0ZWQgaW4gcjE1MyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHIxNjMuIiksRC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQ9PT12b2lkIDAmJihELmdldFNoYWRlclByZWNpc2lvbkZvcm1hdD1mdW5jdGlvbigpe3JldHVybntyYW5nZU1pbjoxLHJhbmdlTWF4OjEscHJlY2lzaW9uOjF9fSl9Y2F0Y2goVCl7dGhyb3cgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlcjogIitULm1lc3NhZ2UpLFR9bGV0IEssdWUscmUsQ2UsVyxKLGllLG1lLHBlLEMsRSxrLHNlLHRlLGFlLEFlLG9lLHhlLERlLHR0LGNlLGF0LFZlLE5lO2Z1bmN0aW9uIExlKCl7Sz1uZXcgR3YoRCksdWU9bmV3IE52KEQsSyxlKSxLLmluaXQodWUpLGF0PW5ldyBNcChELEssdWUpLHJlPW5ldyBNUyhELEssdWUpLENlPW5ldyBXdihEKSxXPW5ldyBjUyxKPW5ldyBTUyhELEsscmUsVyx1ZSxhdCxDZSksaWU9bmV3IE92KHgpLG1lPW5ldyBrdih4KSxwZT1uZXcgSXgoRCx1ZSksVmU9bmV3IFV2KEQsSyxwZSx1ZSksQz1uZXcgVnYoRCxwZSxDZSxWZSksRT1uZXcgWXYoRCxDLHBlLENlKSxEZT1uZXcgJHYoRCx1ZSxKKSxBZT1uZXcgRnYoVyksaz1uZXcgbFMoeCxpZSxtZSxLLHVlLFZlLEFlKSxzZT1uZXcgRVMoeCxXKSx0ZT1uZXcgdVMsYWU9bmV3IF9TKEssdWUpLHhlPW5ldyBJdih4LGllLG1lLHJlLEUsZixsKSxvZT1uZXcgdlMoeCxFLHVlKSxOZT1uZXcgQVMoRCxDZSx1ZSxyZSksdHQ9bmV3IER2KEQsSyxDZSx1ZSksY2U9bmV3IEh2KEQsSyxDZSx1ZSksQ2UucHJvZ3JhbXM9ay5wcm9ncmFtcyx4LmNhcGFiaWxpdGllcz11ZSx4LmV4dGVuc2lvbnM9Syx4LnByb3BlcnRpZXM9Vyx4LnJlbmRlckxpc3RzPXRlLHguc2hhZG93TWFwPW9lLHguc3RhdGU9cmUseC5pbmZvPUNlfUxlKCk7Y29uc3QgRWU9bmV3IHdTKHgsRCk7dGhpcy54cj1FZSx0aGlzLmdldENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gRH0sdGhpcy5nZXRDb250ZXh0QXR0cmlidXRlcz1mdW5jdGlvbigpe3JldHVybiBELmdldENvbnRleHRBdHRyaWJ1dGVzKCl9LHRoaXMuZm9yY2VDb250ZXh0TG9zcz1mdW5jdGlvbigpe2NvbnN0IFQ9Sy5nZXQoIldFQkdMX2xvc2VfY29udGV4dCIpO1QmJlQubG9zZUNvbnRleHQoKX0sdGhpcy5mb3JjZUNvbnRleHRSZXN0b3JlPWZ1bmN0aW9uKCl7Y29uc3QgVD1LLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7VCYmVC5yZXN0b3JlQ29udGV4dCgpfSx0aGlzLmdldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4gRn0sdGhpcy5zZXRQaXhlbFJhdGlvPWZ1bmN0aW9uKFQpe1QhPT12b2lkIDAmJihGPVQsdGhpcy5zZXRTaXplKFUseiwhMSkpfSx0aGlzLmdldFNpemU9ZnVuY3Rpb24oVCl7cmV0dXJuIFQuc2V0KFUseil9LHRoaXMuc2V0U2l6ZT1mdW5jdGlvbihULEcsWD0hMCl7aWYoRWUuaXNQcmVzZW50aW5nKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IENhbid0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLiIpO3JldHVybn1VPVQsej1HLHQud2lkdGg9TWF0aC5mbG9vcihUKkYpLHQuaGVpZ2h0PU1hdGguZmxvb3IoRypGKSxYPT09ITAmJih0LnN0eWxlLndpZHRoPVQrInB4Iix0LnN0eWxlLmhlaWdodD1HKyJweCIpLHRoaXMuc2V0Vmlld3BvcnQoMCwwLFQsRyl9LHRoaXMuZ2V0RHJhd2luZ0J1ZmZlclNpemU9ZnVuY3Rpb24oVCl7cmV0dXJuIFQuc2V0KFUqRix6KkYpLmZsb29yKCl9LHRoaXMuc2V0RHJhd2luZ0J1ZmZlclNpemU9ZnVuY3Rpb24oVCxHLFgpe1U9VCx6PUcsRj1YLHQud2lkdGg9TWF0aC5mbG9vcihUKlgpLHQuaGVpZ2h0PU1hdGguZmxvb3IoRypYKSx0aGlzLnNldFZpZXdwb3J0KDAsMCxULEcpfSx0aGlzLmdldEN1cnJlbnRWaWV3cG9ydD1mdW5jdGlvbihUKXtyZXR1cm4gVC5jb3B5KHcpfSx0aGlzLmdldFZpZXdwb3J0PWZ1bmN0aW9uKFQpe3JldHVybiBULmNvcHkoUSl9LHRoaXMuc2V0Vmlld3BvcnQ9ZnVuY3Rpb24oVCxHLFgsWSl7VC5pc1ZlY3RvcjQ/US5zZXQoVC54LFQueSxULnosVC53KTpRLnNldChULEcsWCxZKSxyZS52aWV3cG9ydCh3LmNvcHkoUSkubXVsdGlwbHlTY2FsYXIoRikuZmxvb3IoKSl9LHRoaXMuZ2V0U2Npc3Nvcj1mdW5jdGlvbihUKXtyZXR1cm4gVC5jb3B5KG5lKX0sdGhpcy5zZXRTY2lzc29yPWZ1bmN0aW9uKFQsRyxYLFkpe1QuaXNWZWN0b3I0P25lLnNldChULngsVC55LFQueixULncpOm5lLnNldChULEcsWCxZKSxyZS5zY2lzc29yKFIuY29weShuZSkubXVsdGlwbHlTY2FsYXIoRikuZmxvb3IoKSl9LHRoaXMuZ2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZmV9LHRoaXMuc2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oVCl7cmUuc2V0U2Npc3NvclRlc3QoZmU9VCl9LHRoaXMuc2V0T3BhcXVlU29ydD1mdW5jdGlvbihUKXtaPVR9LHRoaXMuc2V0VHJhbnNwYXJlbnRTb3J0PWZ1bmN0aW9uKFQpe1Y9VH0sdGhpcy5nZXRDbGVhckNvbG9yPWZ1bmN0aW9uKFQpe3JldHVybiBULmNvcHkoeGUuZ2V0Q2xlYXJDb2xvcigpKX0sdGhpcy5zZXRDbGVhckNvbG9yPWZ1bmN0aW9uKCl7eGUuc2V0Q2xlYXJDb2xvci5hcHBseSh4ZSxhcmd1bWVudHMpfSx0aGlzLmdldENsZWFyQWxwaGE9ZnVuY3Rpb24oKXtyZXR1cm4geGUuZ2V0Q2xlYXJBbHBoYSgpfSx0aGlzLnNldENsZWFyQWxwaGE9ZnVuY3Rpb24oKXt4ZS5zZXRDbGVhckFscGhhLmFwcGx5KHhlLGFyZ3VtZW50cyl9LHRoaXMuY2xlYXI9ZnVuY3Rpb24oVD0hMCxHPSEwLFg9ITApe2xldCBZPTA7aWYoVCl7bGV0IEg9ITE7aWYoQSE9PW51bGwpe2NvbnN0IE1lPUEudGV4dHVyZS5mb3JtYXQ7SD1NZT09PU1jfHxNZT09PXZjfHxNZT09PXljfWlmKEgpe2NvbnN0IE1lPUEudGV4dHVyZS50eXBlLFJlPU1lPT09UW58fE1lPT09am58fE1lPT09QmF8fE1lPT09TWl8fE1lPT09X2N8fE1lPT09eGMsRmU9eGUuZ2V0Q2xlYXJDb2xvcigpLEhlPXhlLmdldENsZWFyQWxwaGEoKSxKZT1GZS5yLFhlPUZlLmcsWWU9RmUuYjtSZT8oZFswXT1KZSxkWzFdPVhlLGRbMl09WWUsZFszXT1IZSxELmNsZWFyQnVmZmVydWl2KEQuQ09MT1IsMCxkKSk6KHBbMF09SmUscFsxXT1YZSxwWzJdPVllLHBbM109SGUsRC5jbGVhckJ1ZmZlcml2KEQuQ09MT1IsMCxwKSl9ZWxzZSBZfD1ELkNPTE9SX0JVRkZFUl9CSVR9RyYmKFl8PUQuREVQVEhfQlVGRkVSX0JJVCksWCYmKFl8PUQuU1RFTkNJTF9CVUZGRVJfQklULHRoaXMuc3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldE1hc2soNDI5NDk2NzI5NSkpLEQuY2xlYXIoWSl9LHRoaXMuY2xlYXJDb2xvcj1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITAsITEsITEpfSx0aGlzLmNsZWFyRGVwdGg9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCExLCEwLCExKX0sdGhpcy5jbGVhclN0ZW5jaWw9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCExLCExLCEwKX0sdGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IixqZSwhMSksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsTywhMSksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yIix2ZSwhMSksdGUuZGlzcG9zZSgpLGFlLmRpc3Bvc2UoKSxXLmRpc3Bvc2UoKSxpZS5kaXNwb3NlKCksbWUuZGlzcG9zZSgpLEUuZGlzcG9zZSgpLFZlLmRpc3Bvc2UoKSxOZS5kaXNwb3NlKCksay5kaXNwb3NlKCksRWUuZGlzcG9zZSgpLEVlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlc3Npb25zdGFydCIsbm4pLEVlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlc3Npb25lbmQiLHV0KSxUZSYmKFRlLmRpc3Bvc2UoKSxUZT1udWxsKSxybi5zdG9wKCl9O2Z1bmN0aW9uIGplKFQpe1QucHJldmVudERlZmF1bHQoKSxjb25zb2xlLmxvZygiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LiIpLHY9ITB9ZnVuY3Rpb24gTygpe2NvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLiIpLHY9ITE7Y29uc3QgVD1DZS5hdXRvUmVzZXQsRz1vZS5lbmFibGVkLFg9b2UuYXV0b1VwZGF0ZSxZPW9lLm5lZWRzVXBkYXRlLEg9b2UudHlwZTtMZSgpLENlLmF1dG9SZXNldD1ULG9lLmVuYWJsZWQ9RyxvZS5hdXRvVXBkYXRlPVgsb2UubmVlZHNVcGRhdGU9WSxvZS50eXBlPUh9ZnVuY3Rpb24gdmUoVCl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQSBXZWJHTCBjb250ZXh0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiBSZWFzb246ICIsVC5zdGF0dXNNZXNzYWdlKX1mdW5jdGlvbiBoZShUKXtjb25zdCBHPVQudGFyZ2V0O0cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaGUpLGooRyl9ZnVuY3Rpb24gaihUKXtnZShUKSxXLnJlbW92ZShUKX1mdW5jdGlvbiBnZShUKXtjb25zdCBHPVcuZ2V0KFQpLnByb2dyYW1zO0chPT12b2lkIDAmJihHLmZvckVhY2goZnVuY3Rpb24oWCl7ay5yZWxlYXNlUHJvZ3JhbShYKX0pLFQuaXNTaGFkZXJNYXRlcmlhbCYmay5yZWxlYXNlU2hhZGVyQ2FjaGUoVCkpfXRoaXMucmVuZGVyQnVmZmVyRGlyZWN0PWZ1bmN0aW9uKFQsRyxYLFksSCxNZSl7Rz09PW51bGwmJihHPXdlKTtjb25zdCBSZT1ILmlzTWVzaCYmSC5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpPDAsRmU9WUEoVCxHLFgsWSxIKTtyZS5zZXRNYXRlcmlhbChZLFJlKTtsZXQgSGU9WC5pbmRleCxKZT0xO2lmKFkud2lyZWZyYW1lPT09ITApe2lmKEhlPUMuZ2V0V2lyZWZyYW1lQXR0cmlidXRlKFgpLEhlPT09dm9pZCAwKXJldHVybjtKZT0yfWNvbnN0IFhlPVguZHJhd1JhbmdlLFllPVguYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgVHQ9WGUuc3RhcnQqSmUsd249KFhlLnN0YXJ0K1hlLmNvdW50KSpKZTtNZSE9PW51bGwmJihUdD1NYXRoLm1heChUdCxNZS5zdGFydCpKZSksd249TWF0aC5taW4od24sKE1lLnN0YXJ0K01lLmNvdW50KSpKZSkpLEhlIT09bnVsbD8oVHQ9TWF0aC5tYXgoVHQsMCksd249TWF0aC5taW4od24sSGUuY291bnQpKTpZZSE9bnVsbCYmKFR0PU1hdGgubWF4KFR0LDApLHduPU1hdGgubWluKHduLFllLmNvdW50KSk7Y29uc3QgT3Q9d24tVHQ7aWYoT3Q8MHx8T3Q9PT0xLzApcmV0dXJuO1ZlLnNldHVwKEgsWSxGZSxYLEhlKTtsZXQgX2ksZ3Q9dHQ7aWYoSGUhPT1udWxsJiYoX2k9cGUuZ2V0KEhlKSxndD1jZSxndC5zZXRJbmRleChfaSkpLEguaXNNZXNoKVkud2lyZWZyYW1lPT09ITA/KHJlLnNldExpbmVXaWR0aChZLndpcmVmcmFtZUxpbmV3aWR0aCpQZSgpKSxndC5zZXRNb2RlKEQuTElORVMpKTpndC5zZXRNb2RlKEQuVFJJQU5HTEVTKTtlbHNlIGlmKEguaXNMaW5lKXtsZXQgUWU9WS5saW5ld2lkdGg7UWU9PT12b2lkIDAmJihRZT0xKSxyZS5zZXRMaW5lV2lkdGgoUWUqUGUoKSksSC5pc0xpbmVTZWdtZW50cz9ndC5zZXRNb2RlKEQuTElORVMpOkguaXNMaW5lTG9vcD9ndC5zZXRNb2RlKEQuTElORV9MT09QKTpndC5zZXRNb2RlKEQuTElORV9TVFJJUCl9ZWxzZSBILmlzUG9pbnRzP2d0LnNldE1vZGUoRC5QT0lOVFMpOkguaXNTcHJpdGUmJmd0LnNldE1vZGUoRC5UUklBTkdMRVMpO2lmKEguaXNCYXRjaGVkTWVzaClndC5yZW5kZXJNdWx0aURyYXcoSC5fbXVsdGlEcmF3U3RhcnRzLEguX211bHRpRHJhd0NvdW50cyxILl9tdWx0aURyYXdDb3VudCk7ZWxzZSBpZihILmlzSW5zdGFuY2VkTWVzaClndC5yZW5kZXJJbnN0YW5jZXMoVHQsT3QsSC5jb3VudCk7ZWxzZSBpZihYLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkpe2NvbnN0IFFlPVguX21heEluc3RhbmNlQ291bnQhPT12b2lkIDA/WC5fbWF4SW5zdGFuY2VDb3VudDoxLzAsdmY9TWF0aC5taW4oWC5pbnN0YW5jZUNvdW50LFFlKTtndC5yZW5kZXJJbnN0YW5jZXMoVHQsT3QsdmYpfWVsc2UgZ3QucmVuZGVyKFR0LE90KX07ZnVuY3Rpb24gemUoVCxHLFgpe1QudHJhbnNwYXJlbnQ9PT0hMCYmVC5zaWRlPT09R24mJlQuZm9yY2VTaW5nbGVQYXNzPT09ITE/KFQuc2lkZT1ZdCxULm5lZWRzVXBkYXRlPSEwLGFjKFQsRyxYKSxULnNpZGU9WW4sVC5uZWVkc1VwZGF0ZT0hMCxhYyhULEcsWCksVC5zaWRlPUduKTphYyhULEcsWCl9dGhpcy5jb21waWxlPWZ1bmN0aW9uKFQsRyxYPW51bGwpe1g9PT1udWxsJiYoWD1UKSxnPWFlLmdldChYKSxnLmluaXQoKSx5LnB1c2goZyksWC50cmF2ZXJzZVZpc2libGUoZnVuY3Rpb24oSCl7SC5pc0xpZ2h0JiZILmxheWVycy50ZXN0KEcubGF5ZXJzKSYmKGcucHVzaExpZ2h0KEgpLEguY2FzdFNoYWRvdyYmZy5wdXNoU2hhZG93KEgpKX0pLFQhPT1YJiZULnRyYXZlcnNlVmlzaWJsZShmdW5jdGlvbihIKXtILmlzTGlnaHQmJkgubGF5ZXJzLnRlc3QoRy5sYXllcnMpJiYoZy5wdXNoTGlnaHQoSCksSC5jYXN0U2hhZG93JiZnLnB1c2hTaGFkb3coSCkpfSksZy5zZXR1cExpZ2h0cyh4Ll91c2VMZWdhY3lMaWdodHMpO2NvbnN0IFk9bmV3IFNldDtyZXR1cm4gVC50cmF2ZXJzZShmdW5jdGlvbihIKXtjb25zdCBNZT1ILm1hdGVyaWFsO2lmKE1lKWlmKEFycmF5LmlzQXJyYXkoTWUpKWZvcihsZXQgUmU9MDtSZTxNZS5sZW5ndGg7UmUrKyl7Y29uc3QgRmU9TWVbUmVdO3plKEZlLFgsSCksWS5hZGQoRmUpfWVsc2UgemUoTWUsWCxIKSxZLmFkZChNZSl9KSx5LnBvcCgpLGc9bnVsbCxZfSx0aGlzLmNvbXBpbGVBc3luYz1mdW5jdGlvbihULEcsWD1udWxsKXtjb25zdCBZPXRoaXMuY29tcGlsZShULEcsWCk7cmV0dXJuIG5ldyBQcm9taXNlKEg9PntmdW5jdGlvbiBNZSgpe2lmKFkuZm9yRWFjaChmdW5jdGlvbihSZSl7Vy5nZXQoUmUpLmN1cnJlbnRQcm9ncmFtLmlzUmVhZHkoKSYmWS5kZWxldGUoUmUpfSksWS5zaXplPT09MCl7SChUKTtyZXR1cm59c2V0VGltZW91dChNZSwxMCl9Sy5nZXQoIktIUl9wYXJhbGxlbF9zaGFkZXJfY29tcGlsZSIpIT09bnVsbD9NZSgpOnNldFRpbWVvdXQoTWUsMTApfSl9O2xldCBpdD1udWxsO2Z1bmN0aW9uIEZ0KFQpe2l0JiZpdChUKX1mdW5jdGlvbiBubigpe3JuLnN0b3AoKX1mdW5jdGlvbiB1dCgpe3JuLnN0YXJ0KCl9Y29uc3Qgcm49bmV3IFlkO3JuLnNldEFuaW1hdGlvbkxvb3AoRnQpLHR5cGVvZiBzZWxmIT0idW5kZWZpbmVkIiYmcm4uc2V0Q29udGV4dChzZWxmKSx0aGlzLnNldEFuaW1hdGlvbkxvb3A9ZnVuY3Rpb24oVCl7aXQ9VCxFZS5zZXRBbmltYXRpb25Mb29wKFQpLFQ9PT1udWxsP3JuLnN0b3AoKTpybi5zdGFydCgpfSxFZS5hZGRFdmVudExpc3RlbmVyKCJzZXNzaW9uc3RhcnQiLG5uKSxFZS5hZGRFdmVudExpc3RlbmVyKCJzZXNzaW9uZW5kIix1dCksdGhpcy5yZW5kZXI9ZnVuY3Rpb24oVCxHKXtpZihHIT09dm9pZCAwJiZHLmlzQ2FtZXJhIT09ITApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyOiBjYW1lcmEgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkNhbWVyYS4iKTtyZXR1cm59aWYodj09PSEwKXJldHVybjtULm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiZULnVwZGF0ZU1hdHJpeFdvcmxkKCksRy5wYXJlbnQ9PT1udWxsJiZHLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiZHLnVwZGF0ZU1hdHJpeFdvcmxkKCksRWUuZW5hYmxlZD09PSEwJiZFZS5pc1ByZXNlbnRpbmc9PT0hMCYmKEVlLmNhbWVyYUF1dG9VcGRhdGU9PT0hMCYmRWUudXBkYXRlQ2FtZXJhKEcpLEc9RWUuZ2V0Q2FtZXJhKCkpLFQuaXNTY2VuZT09PSEwJiZULm9uQmVmb3JlUmVuZGVyKHgsVCxHLEEpLGc9YWUuZ2V0KFQseS5sZW5ndGgpLGcuaW5pdCgpLHkucHVzaChnKSxiZS5tdWx0aXBseU1hdHJpY2VzKEcucHJvamVjdGlvbk1hdHJpeCxHLm1hdHJpeFdvcmxkSW52ZXJzZSksJC5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChiZSksZGU9dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCxlZT1BZS5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsZGUpLF89dGUuZ2V0KFQsbS5sZW5ndGgpLF8uaW5pdCgpLG0ucHVzaChfKSwkbihULEcsMCx4LnNvcnRPYmplY3RzKSxfLmZpbmlzaCgpLHguc29ydE9iamVjdHM9PT0hMCYmXy5zb3J0KFosViksdGhpcy5pbmZvLnJlbmRlci5mcmFtZSsrLGVlPT09ITAmJkFlLmJlZ2luU2hhZG93cygpO2NvbnN0IFg9Zy5zdGF0ZS5zaGFkb3dzQXJyYXk7aWYob2UucmVuZGVyKFgsVCxHKSxlZT09PSEwJiZBZS5lbmRTaGFkb3dzKCksdGhpcy5pbmZvLmF1dG9SZXNldD09PSEwJiZ0aGlzLmluZm8ucmVzZXQoKSx4ZS5yZW5kZXIoXyxUKSxnLnNldHVwTGlnaHRzKHguX3VzZUxlZ2FjeUxpZ2h0cyksRy5pc0FycmF5Q2FtZXJhKXtjb25zdCBZPUcuY2FtZXJhcztmb3IobGV0IEg9MCxNZT1ZLmxlbmd0aDtIPE1lO0grKyl7Y29uc3QgUmU9WVtIXTtLMChfLFQsUmUsUmUudmlld3BvcnQpfX1lbHNlIEswKF8sVCxHKTtBIT09bnVsbCYmKEoudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoQSksSi51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoQSkpLFQuaXNTY2VuZT09PSEwJiZULm9uQWZ0ZXJSZW5kZXIoeCxULEcpLFZlLnJlc2V0RGVmYXVsdFN0YXRlKCksTD0tMSxNPW51bGwseS5wb3AoKSx5Lmxlbmd0aD4wP2c9eVt5Lmxlbmd0aC0xXTpnPW51bGwsbS5wb3AoKSxtLmxlbmd0aD4wP189bVttLmxlbmd0aC0xXTpfPW51bGx9O2Z1bmN0aW9uICRuKFQsRyxYLFkpe2lmKFQudmlzaWJsZT09PSExKXJldHVybjtpZihULmxheWVycy50ZXN0KEcubGF5ZXJzKSl7aWYoVC5pc0dyb3VwKVg9VC5yZW5kZXJPcmRlcjtlbHNlIGlmKFQuaXNMT0QpVC5hdXRvVXBkYXRlPT09ITAmJlQudXBkYXRlKEcpO2Vsc2UgaWYoVC5pc0xpZ2h0KWcucHVzaExpZ2h0KFQpLFQuY2FzdFNoYWRvdyYmZy5wdXNoU2hhZG93KFQpO2Vsc2UgaWYoVC5pc1Nwcml0ZSl7aWYoIVQuZnJ1c3R1bUN1bGxlZHx8JC5pbnRlcnNlY3RzU3ByaXRlKFQpKXtZJiZCZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oVC5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KGJlKTtjb25zdCBSZT1FLnVwZGF0ZShUKSxGZT1ULm1hdGVyaWFsO0ZlLnZpc2libGUmJl8ucHVzaChULFJlLEZlLFgsQmUueixudWxsKX19ZWxzZSBpZigoVC5pc01lc2h8fFQuaXNMaW5lfHxULmlzUG9pbnRzKSYmKCFULmZydXN0dW1DdWxsZWR8fCQuaW50ZXJzZWN0c09iamVjdChUKSkpe2NvbnN0IFJlPUUudXBkYXRlKFQpLEZlPVQubWF0ZXJpYWw7aWYoWSYmKFQuYm91bmRpbmdTcGhlcmUhPT12b2lkIDA/KFQuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZULmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLEJlLmNvcHkoVC5ib3VuZGluZ1NwaGVyZS5jZW50ZXIpKTooUmUuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZSZS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxCZS5jb3B5KFJlLmJvdW5kaW5nU3BoZXJlLmNlbnRlcikpLEJlLmFwcGx5TWF0cml4NChULm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoYmUpKSxBcnJheS5pc0FycmF5KEZlKSl7Y29uc3QgSGU9UmUuZ3JvdXBzO2ZvcihsZXQgSmU9MCxYZT1IZS5sZW5ndGg7SmU8WGU7SmUrKyl7Y29uc3QgWWU9SGVbSmVdLFR0PUZlW1llLm1hdGVyaWFsSW5kZXhdO1R0JiZUdC52aXNpYmxlJiZfLnB1c2goVCxSZSxUdCxYLEJlLnosWWUpfX1lbHNlIEZlLnZpc2libGUmJl8ucHVzaChULFJlLEZlLFgsQmUueixudWxsKX19Y29uc3QgTWU9VC5jaGlsZHJlbjtmb3IobGV0IFJlPTAsRmU9TWUubGVuZ3RoO1JlPEZlO1JlKyspJG4oTWVbUmVdLEcsWCxZKX1mdW5jdGlvbiBLMChULEcsWCxZKXtjb25zdCBIPVQub3BhcXVlLE1lPVQudHJhbnNtaXNzaXZlLFJlPVQudHJhbnNwYXJlbnQ7Zy5zZXR1cExpZ2h0c1ZpZXcoWCksZWU9PT0hMCYmQWUuc2V0R2xvYmFsU3RhdGUoeC5jbGlwcGluZ1BsYW5lcyxYKSxNZS5sZW5ndGg+MCYmJEEoSCxNZSxHLFgpLFkmJnJlLnZpZXdwb3J0KHcuY29weShZKSksSC5sZW5ndGg+MCYmc2MoSCxHLFgpLE1lLmxlbmd0aD4wJiZzYyhNZSxHLFgpLFJlLmxlbmd0aD4wJiZzYyhSZSxHLFgpLHJlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCkscmUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCEwKSxyZS5idWZmZXJzLmNvbG9yLnNldE1hc2soITApLHJlLnNldFBvbHlnb25PZmZzZXQoITEpfWZ1bmN0aW9uICRBKFQsRyxYLFkpe2lmKChYLmlzU2NlbmU9PT0hMD9YLm92ZXJyaWRlTWF0ZXJpYWw6bnVsbCkhPT1udWxsKXJldHVybjtjb25zdCBNZT11ZS5pc1dlYkdMMjtUZT09PW51bGwmJihUZT1uZXcgTG4oMSwxLHtnZW5lcmF0ZU1pcG1hcHM6ITAsdHlwZTpLLmhhcygiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0Iik/d3I6UW4sbWluRmlsdGVyOnZpLHNhbXBsZXM6TWU/NDowfSkpLHguZ2V0RHJhd2luZ0J1ZmZlclNpemUoT2UpLE1lP1RlLnNldFNpemUoT2UueCxPZS55KTpUZS5zZXRTaXplKFlhKE9lLngpLFlhKE9lLnkpKTtjb25zdCBSZT14LmdldFJlbmRlclRhcmdldCgpO3guc2V0UmVuZGVyVGFyZ2V0KFRlKSx4LmdldENsZWFyQ29sb3IoQiksST14LmdldENsZWFyQWxwaGEoKSxJPDEmJnguc2V0Q2xlYXJDb2xvcigxNjc3NzIxNSwuNSkseC5jbGVhcigpO2NvbnN0IEZlPXgudG9uZU1hcHBpbmc7eC50b25lTWFwcGluZz1KbixzYyhULFgsWSksSi51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldChUZSksSi51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoVGUpO2xldCBIZT0hMTtmb3IobGV0IEplPTAsWGU9Ry5sZW5ndGg7SmU8WGU7SmUrKyl7Y29uc3QgWWU9R1tKZV0sVHQ9WWUub2JqZWN0LHduPVllLmdlb21ldHJ5LE90PVllLm1hdGVyaWFsLF9pPVllLmdyb3VwO2lmKE90LnNpZGU9PT1HbiYmVHQubGF5ZXJzLnRlc3QoWS5sYXllcnMpKXtjb25zdCBndD1PdC5zaWRlO090LnNpZGU9WXQsT3QubmVlZHNVcGRhdGU9ITAsUTAoVHQsWCxZLHduLE90LF9pKSxPdC5zaWRlPWd0LE90Lm5lZWRzVXBkYXRlPSEwLEhlPSEwfX1IZT09PSEwJiYoSi51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldChUZSksSi51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoVGUpKSx4LnNldFJlbmRlclRhcmdldChSZSkseC5zZXRDbGVhckNvbG9yKEIsSSkseC50b25lTWFwcGluZz1GZX1mdW5jdGlvbiBzYyhULEcsWCl7Y29uc3QgWT1HLmlzU2NlbmU9PT0hMD9HLm92ZXJyaWRlTWF0ZXJpYWw6bnVsbDtmb3IobGV0IEg9MCxNZT1ULmxlbmd0aDtIPE1lO0grKyl7Y29uc3QgUmU9VFtIXSxGZT1SZS5vYmplY3QsSGU9UmUuZ2VvbWV0cnksSmU9WT09PW51bGw/UmUubWF0ZXJpYWw6WSxYZT1SZS5ncm91cDtGZS5sYXllcnMudGVzdChYLmxheWVycykmJlEwKEZlLEcsWCxIZSxKZSxYZSl9fWZ1bmN0aW9uIFEwKFQsRyxYLFksSCxNZSl7VC5vbkJlZm9yZVJlbmRlcih4LEcsWCxZLEgsTWUpLFQubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoWC5tYXRyaXhXb3JsZEludmVyc2UsVC5tYXRyaXhXb3JsZCksVC5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KFQubW9kZWxWaWV3TWF0cml4KSxILm9uQmVmb3JlUmVuZGVyKHgsRyxYLFksVCxNZSksSC50cmFuc3BhcmVudD09PSEwJiZILnNpZGU9PT1HbiYmSC5mb3JjZVNpbmdsZVBhc3M9PT0hMT8oSC5zaWRlPVl0LEgubmVlZHNVcGRhdGU9ITAseC5yZW5kZXJCdWZmZXJEaXJlY3QoWCxHLFksSCxULE1lKSxILnNpZGU9WW4sSC5uZWVkc1VwZGF0ZT0hMCx4LnJlbmRlckJ1ZmZlckRpcmVjdChYLEcsWSxILFQsTWUpLEguc2lkZT1Hbik6eC5yZW5kZXJCdWZmZXJEaXJlY3QoWCxHLFksSCxULE1lKSxULm9uQWZ0ZXJSZW5kZXIoeCxHLFgsWSxILE1lKX1mdW5jdGlvbiBhYyhULEcsWCl7Ry5pc1NjZW5lIT09ITAmJihHPXdlKTtjb25zdCBZPVcuZ2V0KFQpLEg9Zy5zdGF0ZS5saWdodHMsTWU9Zy5zdGF0ZS5zaGFkb3dzQXJyYXksUmU9SC5zdGF0ZS52ZXJzaW9uLEZlPWsuZ2V0UGFyYW1ldGVycyhULEguc3RhdGUsTWUsRyxYKSxIZT1rLmdldFByb2dyYW1DYWNoZUtleShGZSk7bGV0IEplPVkucHJvZ3JhbXM7WS5lbnZpcm9ubWVudD1ULmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/Ry5lbnZpcm9ubWVudDpudWxsLFkuZm9nPUcuZm9nLFkuZW52TWFwPShULmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/bWU6aWUpLmdldChULmVudk1hcHx8WS5lbnZpcm9ubWVudCksSmU9PT12b2lkIDAmJihULmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGhlKSxKZT1uZXcgTWFwLFkucHJvZ3JhbXM9SmUpO2xldCBYZT1KZS5nZXQoSGUpO2lmKFhlIT09dm9pZCAwKXtpZihZLmN1cnJlbnRQcm9ncmFtPT09WGUmJlkubGlnaHRzU3RhdGVWZXJzaW9uPT09UmUpcmV0dXJuIGVfKFQsRmUpLFhlfWVsc2UgRmUudW5pZm9ybXM9ay5nZXRVbmlmb3JtcyhUKSxULm9uQnVpbGQoWCxGZSx4KSxULm9uQmVmb3JlQ29tcGlsZShGZSx4KSxYZT1rLmFjcXVpcmVQcm9ncmFtKEZlLEhlKSxKZS5zZXQoSGUsWGUpLFkudW5pZm9ybXM9RmUudW5pZm9ybXM7Y29uc3QgWWU9WS51bmlmb3JtcztyZXR1cm4oIVQuaXNTaGFkZXJNYXRlcmlhbCYmIVQuaXNSYXdTaGFkZXJNYXRlcmlhbHx8VC5jbGlwcGluZz09PSEwKSYmKFllLmNsaXBwaW5nUGxhbmVzPUFlLnVuaWZvcm0pLGVfKFQsRmUpLFkubmVlZHNMaWdodHM9SkEoVCksWS5saWdodHNTdGF0ZVZlcnNpb249UmUsWS5uZWVkc0xpZ2h0cyYmKFllLmFtYmllbnRMaWdodENvbG9yLnZhbHVlPUguc3RhdGUuYW1iaWVudCxZZS5saWdodFByb2JlLnZhbHVlPUguc3RhdGUucHJvYmUsWWUuZGlyZWN0aW9uYWxMaWdodHMudmFsdWU9SC5zdGF0ZS5kaXJlY3Rpb25hbCxZZS5kaXJlY3Rpb25hbExpZ2h0U2hhZG93cy52YWx1ZT1ILnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93LFllLnNwb3RMaWdodHMudmFsdWU9SC5zdGF0ZS5zcG90LFllLnNwb3RMaWdodFNoYWRvd3MudmFsdWU9SC5zdGF0ZS5zcG90U2hhZG93LFllLnJlY3RBcmVhTGlnaHRzLnZhbHVlPUguc3RhdGUucmVjdEFyZWEsWWUubHRjXzEudmFsdWU9SC5zdGF0ZS5yZWN0QXJlYUxUQzEsWWUubHRjXzIudmFsdWU9SC5zdGF0ZS5yZWN0QXJlYUxUQzIsWWUucG9pbnRMaWdodHMudmFsdWU9SC5zdGF0ZS5wb2ludCxZZS5wb2ludExpZ2h0U2hhZG93cy52YWx1ZT1ILnN0YXRlLnBvaW50U2hhZG93LFllLmhlbWlzcGhlcmVMaWdodHMudmFsdWU9SC5zdGF0ZS5oZW1pLFllLmRpcmVjdGlvbmFsU2hhZG93TWFwLnZhbHVlPUguc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAsWWUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWU9SC5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeCxZZS5zcG90U2hhZG93TWFwLnZhbHVlPUguc3RhdGUuc3BvdFNoYWRvd01hcCxZZS5zcG90TGlnaHRNYXRyaXgudmFsdWU9SC5zdGF0ZS5zcG90TGlnaHRNYXRyaXgsWWUuc3BvdExpZ2h0TWFwLnZhbHVlPUguc3RhdGUuc3BvdExpZ2h0TWFwLFllLnBvaW50U2hhZG93TWFwLnZhbHVlPUguc3RhdGUucG9pbnRTaGFkb3dNYXAsWWUucG9pbnRTaGFkb3dNYXRyaXgudmFsdWU9SC5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeCksWS5jdXJyZW50UHJvZ3JhbT1YZSxZLnVuaWZvcm1zTGlzdD1udWxsLFhlfWZ1bmN0aW9uIGowKFQpe2lmKFQudW5pZm9ybXNMaXN0PT09bnVsbCl7Y29uc3QgRz1ULmN1cnJlbnRQcm9ncmFtLmdldFVuaWZvcm1zKCk7VC51bmlmb3Jtc0xpc3Q9Ym8uc2VxV2l0aFZhbHVlKEcuc2VxLFQudW5pZm9ybXMpfXJldHVybiBULnVuaWZvcm1zTGlzdH1mdW5jdGlvbiBlXyhULEcpe2NvbnN0IFg9Vy5nZXQoVCk7WC5vdXRwdXRDb2xvclNwYWNlPUcub3V0cHV0Q29sb3JTcGFjZSxYLmJhdGNoaW5nPUcuYmF0Y2hpbmcsWC5pbnN0YW5jaW5nPUcuaW5zdGFuY2luZyxYLmluc3RhbmNpbmdDb2xvcj1HLmluc3RhbmNpbmdDb2xvcixYLnNraW5uaW5nPUcuc2tpbm5pbmcsWC5tb3JwaFRhcmdldHM9Ry5tb3JwaFRhcmdldHMsWC5tb3JwaE5vcm1hbHM9Ry5tb3JwaE5vcm1hbHMsWC5tb3JwaENvbG9ycz1HLm1vcnBoQ29sb3JzLFgubW9ycGhUYXJnZXRzQ291bnQ9Ry5tb3JwaFRhcmdldHNDb3VudCxYLm51bUNsaXBwaW5nUGxhbmVzPUcubnVtQ2xpcHBpbmdQbGFuZXMsWC5udW1JbnRlcnNlY3Rpb249Ry5udW1DbGlwSW50ZXJzZWN0aW9uLFgudmVydGV4QWxwaGFzPUcudmVydGV4QWxwaGFzLFgudmVydGV4VGFuZ2VudHM9Ry52ZXJ0ZXhUYW5nZW50cyxYLnRvbmVNYXBwaW5nPUcudG9uZU1hcHBpbmd9ZnVuY3Rpb24gWUEoVCxHLFgsWSxIKXtHLmlzU2NlbmUhPT0hMCYmKEc9d2UpLEoucmVzZXRUZXh0dXJlVW5pdHMoKTtjb25zdCBNZT1HLmZvZyxSZT1ZLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/Ry5lbnZpcm9ubWVudDpudWxsLEZlPUE9PT1udWxsP3gub3V0cHV0Q29sb3JTcGFjZTpBLmlzWFJSZW5kZXJUYXJnZXQ9PT0hMD9BLnRleHR1cmUuY29sb3JTcGFjZTpWbixIZT0oWS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP21lOmllKS5nZXQoWS5lbnZNYXB8fFJlKSxKZT1ZLnZlcnRleENvbG9ycz09PSEwJiYhIVguYXR0cmlidXRlcy5jb2xvciYmWC5hdHRyaWJ1dGVzLmNvbG9yLml0ZW1TaXplPT09NCxYZT0hIVguYXR0cmlidXRlcy50YW5nZW50JiYoISFZLm5vcm1hbE1hcHx8WS5hbmlzb3Ryb3B5PjApLFllPSEhWC5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sVHQ9ISFYLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwsd249ISFYLm1vcnBoQXR0cmlidXRlcy5jb2xvcjtsZXQgT3Q9Sm47WS50b25lTWFwcGVkJiYoQT09PW51bGx8fEEuaXNYUlJlbmRlclRhcmdldD09PSEwKSYmKE90PXgudG9uZU1hcHBpbmcpO2NvbnN0IF9pPVgubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9ufHxYLm1vcnBoQXR0cmlidXRlcy5ub3JtYWx8fFgubW9ycGhBdHRyaWJ1dGVzLmNvbG9yLGd0PV9pIT09dm9pZCAwP19pLmxlbmd0aDowLFFlPVcuZ2V0KFkpLHZmPWcuc3RhdGUubGlnaHRzO2lmKGVlPT09ITAmJihkZT09PSEwfHxUIT09TSkpe2NvbnN0IFRuPVQ9PT1NJiZZLmlkPT09TDtBZS5zZXRTdGF0ZShZLFQsVG4pfWxldCBNdD0hMTtZLnZlcnNpb249PT1RZS5fX3ZlcnNpb24/KFFlLm5lZWRzTGlnaHRzJiZRZS5saWdodHNTdGF0ZVZlcnNpb24hPT12Zi5zdGF0ZS52ZXJzaW9ufHxRZS5vdXRwdXRDb2xvclNwYWNlIT09RmV8fEguaXNCYXRjaGVkTWVzaCYmUWUuYmF0Y2hpbmc9PT0hMXx8IUguaXNCYXRjaGVkTWVzaCYmUWUuYmF0Y2hpbmc9PT0hMHx8SC5pc0luc3RhbmNlZE1lc2gmJlFlLmluc3RhbmNpbmc9PT0hMXx8IUguaXNJbnN0YW5jZWRNZXNoJiZRZS5pbnN0YW5jaW5nPT09ITB8fEguaXNTa2lubmVkTWVzaCYmUWUuc2tpbm5pbmc9PT0hMXx8IUguaXNTa2lubmVkTWVzaCYmUWUuc2tpbm5pbmc9PT0hMHx8SC5pc0luc3RhbmNlZE1lc2gmJlFlLmluc3RhbmNpbmdDb2xvcj09PSEwJiZILmluc3RhbmNlQ29sb3I9PT1udWxsfHxILmlzSW5zdGFuY2VkTWVzaCYmUWUuaW5zdGFuY2luZ0NvbG9yPT09ITEmJkguaW5zdGFuY2VDb2xvciE9PW51bGx8fFFlLmVudk1hcCE9PUhlfHxZLmZvZz09PSEwJiZRZS5mb2chPT1NZXx8UWUubnVtQ2xpcHBpbmdQbGFuZXMhPT12b2lkIDAmJihRZS5udW1DbGlwcGluZ1BsYW5lcyE9PUFlLm51bVBsYW5lc3x8UWUubnVtSW50ZXJzZWN0aW9uIT09QWUubnVtSW50ZXJzZWN0aW9uKXx8UWUudmVydGV4QWxwaGFzIT09SmV8fFFlLnZlcnRleFRhbmdlbnRzIT09WGV8fFFlLm1vcnBoVGFyZ2V0cyE9PVllfHxRZS5tb3JwaE5vcm1hbHMhPT1UdHx8UWUubW9ycGhDb2xvcnMhPT13bnx8UWUudG9uZU1hcHBpbmchPT1PdHx8dWUuaXNXZWJHTDI9PT0hMCYmUWUubW9ycGhUYXJnZXRzQ291bnQhPT1ndCkmJihNdD0hMCk6KE10PSEwLFFlLl9fdmVyc2lvbj1ZLnZlcnNpb24pO2xldCB4cj1RZS5jdXJyZW50UHJvZ3JhbTtNdD09PSEwJiYoeHI9YWMoWSxHLEgpKTtsZXQgdF89ITEsSWE9ITEsTWY9ITE7Y29uc3QgJHQ9eHIuZ2V0VW5pZm9ybXMoKSx5cj1RZS51bmlmb3JtcztpZihyZS51c2VQcm9ncmFtKHhyLnByb2dyYW0pJiYodF89ITAsSWE9ITAsTWY9ITApLFkuaWQhPT1MJiYoTD1ZLmlkLElhPSEwKSx0X3x8TSE9PVQpeyR0LnNldFZhbHVlKEQsInByb2plY3Rpb25NYXRyaXgiLFQucHJvamVjdGlvbk1hdHJpeCksJHQuc2V0VmFsdWUoRCwidmlld01hdHJpeCIsVC5tYXRyaXhXb3JsZEludmVyc2UpO2NvbnN0IFRuPSR0Lm1hcC5jYW1lcmFQb3NpdGlvbjtUbiE9PXZvaWQgMCYmVG4uc2V0VmFsdWUoRCxCZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oVC5tYXRyaXhXb3JsZCkpLHVlLmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJiR0LnNldFZhbHVlKEQsImxvZ0RlcHRoQnVmRkMiLDIvKE1hdGgubG9nKFQuZmFyKzEpL01hdGguTE4yKSksKFkuaXNNZXNoUGhvbmdNYXRlcmlhbHx8WS5pc01lc2hUb29uTWF0ZXJpYWx8fFkuaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxZLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fFkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8WS5pc1NoYWRlck1hdGVyaWFsKSYmJHQuc2V0VmFsdWUoRCwiaXNPcnRob2dyYXBoaWMiLFQuaXNPcnRob2dyYXBoaWNDYW1lcmE9PT0hMCksTSE9PVQmJihNPVQsSWE9ITAsTWY9ITApfWlmKEguaXNTa2lubmVkTWVzaCl7JHQuc2V0T3B0aW9uYWwoRCxILCJiaW5kTWF0cml4IiksJHQuc2V0T3B0aW9uYWwoRCxILCJiaW5kTWF0cml4SW52ZXJzZSIpO2NvbnN0IFRuPUguc2tlbGV0b247VG4mJih1ZS5mbG9hdFZlcnRleFRleHR1cmVzPyhUbi5ib25lVGV4dHVyZT09PW51bGwmJlRuLmNvbXB1dGVCb25lVGV4dHVyZSgpLCR0LnNldFZhbHVlKEQsImJvbmVUZXh0dXJlIixUbi5ib25lVGV4dHVyZSxKKSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2lubmVkTWVzaCBjYW4gb25seSBiZSB1c2VkIHdpdGggV2ViR0wgMi4gV2l0aCBXZWJHTCAxIE9FU190ZXh0dXJlX2Zsb2F0IGFuZCB2ZXJ0ZXggdGV4dHVyZXMgc3VwcG9ydCBpcyByZXF1aXJlZC4iKSl9SC5pc0JhdGNoZWRNZXNoJiYoJHQuc2V0T3B0aW9uYWwoRCxILCJiYXRjaGluZ1RleHR1cmUiKSwkdC5zZXRWYWx1ZShELCJiYXRjaGluZ1RleHR1cmUiLEguX21hdHJpY2VzVGV4dHVyZSxKKSk7Y29uc3QgU2Y9WC5tb3JwaEF0dHJpYnV0ZXM7aWYoKFNmLnBvc2l0aW9uIT09dm9pZCAwfHxTZi5ub3JtYWwhPT12b2lkIDB8fFNmLmNvbG9yIT09dm9pZCAwJiZ1ZS5pc1dlYkdMMj09PSEwKSYmRGUudXBkYXRlKEgsWCx4ciksKElhfHxRZS5yZWNlaXZlU2hhZG93IT09SC5yZWNlaXZlU2hhZG93KSYmKFFlLnJlY2VpdmVTaGFkb3c9SC5yZWNlaXZlU2hhZG93LCR0LnNldFZhbHVlKEQsInJlY2VpdmVTaGFkb3ciLEgucmVjZWl2ZVNoYWRvdykpLFkuaXNNZXNoR291cmF1ZE1hdGVyaWFsJiZZLmVudk1hcCE9PW51bGwmJih5ci5lbnZNYXAudmFsdWU9SGUseXIuZmxpcEVudk1hcC52YWx1ZT1IZS5pc0N1YmVUZXh0dXJlJiZIZS5pc1JlbmRlclRhcmdldFRleHR1cmU9PT0hMT8tMToxKSxJYSYmKCR0LnNldFZhbHVlKEQsInRvbmVNYXBwaW5nRXhwb3N1cmUiLHgudG9uZU1hcHBpbmdFeHBvc3VyZSksUWUubmVlZHNMaWdodHMmJlpBKHlyLE1mKSxNZSYmWS5mb2c9PT0hMCYmc2UucmVmcmVzaEZvZ1VuaWZvcm1zKHlyLE1lKSxzZS5yZWZyZXNoTWF0ZXJpYWxVbmlmb3Jtcyh5cixZLEYseixUZSksYm8udXBsb2FkKEQsajAoUWUpLHlyLEopKSxZLmlzU2hhZGVyTWF0ZXJpYWwmJlkudW5pZm9ybXNOZWVkVXBkYXRlPT09ITAmJihiby51cGxvYWQoRCxqMChRZSkseXIsSiksWS51bmlmb3Jtc05lZWRVcGRhdGU9ITEpLFkuaXNTcHJpdGVNYXRlcmlhbCYmJHQuc2V0VmFsdWUoRCwiY2VudGVyIixILmNlbnRlciksJHQuc2V0VmFsdWUoRCwibW9kZWxWaWV3TWF0cml4IixILm1vZGVsVmlld01hdHJpeCksJHQuc2V0VmFsdWUoRCwibm9ybWFsTWF0cml4IixILm5vcm1hbE1hdHJpeCksJHQuc2V0VmFsdWUoRCwibW9kZWxNYXRyaXgiLEgubWF0cml4V29ybGQpLFkuaXNTaGFkZXJNYXRlcmlhbHx8WS5pc1Jhd1NoYWRlck1hdGVyaWFsKXtjb25zdCBUbj1ZLnVuaWZvcm1zR3JvdXBzO2ZvcihsZXQgYmY9MCxLQT1Ubi5sZW5ndGg7YmY8S0E7YmYrKylpZih1ZS5pc1dlYkdMMil7Y29uc3Qgbl89VG5bYmZdO05lLnVwZGF0ZShuXyx4ciksTmUuYmluZChuXyx4cil9ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVuaWZvcm0gQnVmZmVyIE9iamVjdHMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMIDIuIil9cmV0dXJuIHhyfWZ1bmN0aW9uIFpBKFQsRyl7VC5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZT1HLFQubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZT1HLFQuZGlyZWN0aW9uYWxMaWdodHMubmVlZHNVcGRhdGU9RyxULmRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzLm5lZWRzVXBkYXRlPUcsVC5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZT1HLFQucG9pbnRMaWdodFNoYWRvd3MubmVlZHNVcGRhdGU9RyxULnNwb3RMaWdodHMubmVlZHNVcGRhdGU9RyxULnNwb3RMaWdodFNoYWRvd3MubmVlZHNVcGRhdGU9RyxULnJlY3RBcmVhTGlnaHRzLm5lZWRzVXBkYXRlPUcsVC5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlPUd9ZnVuY3Rpb24gSkEoVCl7cmV0dXJuIFQuaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxULmlzTWVzaFRvb25NYXRlcmlhbHx8VC5pc01lc2hQaG9uZ01hdGVyaWFsfHxULmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWx8fFQuaXNTaGFkb3dNYXRlcmlhbHx8VC5pc1NoYWRlck1hdGVyaWFsJiZULmxpZ2h0cz09PSEwfXRoaXMuZ2V0QWN0aXZlQ3ViZUZhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gU30sdGhpcy5nZXRBY3RpdmVNaXBtYXBMZXZlbD1mdW5jdGlvbigpe3JldHVybiBifSx0aGlzLmdldFJlbmRlclRhcmdldD1mdW5jdGlvbigpe3JldHVybiBBfSx0aGlzLnNldFJlbmRlclRhcmdldFRleHR1cmVzPWZ1bmN0aW9uKFQsRyxYKXtXLmdldChULnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlPUcsVy5nZXQoVC5kZXB0aFRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlPVg7Y29uc3QgWT1XLmdldChUKTtZLl9faGFzRXh0ZXJuYWxUZXh0dXJlcz0hMCxZLl9faGFzRXh0ZXJuYWxUZXh0dXJlcyYmKFkuX19hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlcj1YPT09dm9pZCAwLFkuX19hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlcnx8Sy5oYXMoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpPT09ITAmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFJlbmRlci10by10ZXh0dXJlIGV4dGVuc2lvbiB3YXMgZGlzYWJsZWQgYmVjYXVzZSBhbiBleHRlcm5hbCB0ZXh0dXJlIHdhcyBwcm92aWRlZCIpLFkuX191c2VSZW5kZXJUb1RleHR1cmU9ITEpKX0sdGhpcy5zZXRSZW5kZXJUYXJnZXRGcmFtZWJ1ZmZlcj1mdW5jdGlvbihULEcpe2NvbnN0IFg9Vy5nZXQoVCk7WC5fX3dlYmdsRnJhbWVidWZmZXI9RyxYLl9fdXNlRGVmYXVsdEZyYW1lYnVmZmVyPUc9PT12b2lkIDB9LHRoaXMuc2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKFQsRz0wLFg9MCl7QT1ULFM9RyxiPVg7bGV0IFk9ITAsSD1udWxsLE1lPSExLFJlPSExO2lmKFQpe2NvbnN0IEhlPVcuZ2V0KFQpO0hlLl9fdXNlRGVmYXVsdEZyYW1lYnVmZmVyIT09dm9pZCAwPyhyZS5iaW5kRnJhbWVidWZmZXIoRC5GUkFNRUJVRkZFUixudWxsKSxZPSExKTpIZS5fX3dlYmdsRnJhbWVidWZmZXI9PT12b2lkIDA/Si5zZXR1cFJlbmRlclRhcmdldChUKTpIZS5fX2hhc0V4dGVybmFsVGV4dHVyZXMmJkoucmViaW5kVGV4dHVyZXMoVCxXLmdldChULnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlLFcuZ2V0KFQuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSk7Y29uc3QgSmU9VC50ZXh0dXJlOyhKZS5pc0RhdGEzRFRleHR1cmV8fEplLmlzRGF0YUFycmF5VGV4dHVyZXx8SmUuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlKSYmKFJlPSEwKTtjb25zdCBYZT1XLmdldChUKS5fX3dlYmdsRnJhbWVidWZmZXI7VC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldD8oQXJyYXkuaXNBcnJheShYZVtHXSk/SD1YZVtHXVtYXTpIPVhlW0ddLE1lPSEwKTp1ZS5pc1dlYkdMMiYmVC5zYW1wbGVzPjAmJkoudXNlTXVsdGlzYW1wbGVkUlRUKFQpPT09ITE/SD1XLmdldChUKS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI6QXJyYXkuaXNBcnJheShYZSk/SD1YZVtYXTpIPVhlLHcuY29weShULnZpZXdwb3J0KSxSLmNvcHkoVC5zY2lzc29yKSxOPVQuc2Npc3NvclRlc3R9ZWxzZSB3LmNvcHkoUSkubXVsdGlwbHlTY2FsYXIoRikuZmxvb3IoKSxSLmNvcHkobmUpLm11bHRpcGx5U2NhbGFyKEYpLmZsb29yKCksTj1mZTtpZihyZS5iaW5kRnJhbWVidWZmZXIoRC5GUkFNRUJVRkZFUixIKSYmdWUuZHJhd0J1ZmZlcnMmJlkmJnJlLmRyYXdCdWZmZXJzKFQsSCkscmUudmlld3BvcnQodykscmUuc2Npc3NvcihSKSxyZS5zZXRTY2lzc29yVGVzdChOKSxNZSl7Y29uc3QgSGU9Vy5nZXQoVC50ZXh0dXJlKTtELmZyYW1lYnVmZmVyVGV4dHVyZTJEKEQuRlJBTUVCVUZGRVIsRC5DT0xPUl9BVFRBQ0hNRU5UMCxELlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtHLEhlLl9fd2ViZ2xUZXh0dXJlLFgpfWVsc2UgaWYoUmUpe2NvbnN0IEhlPVcuZ2V0KFQudGV4dHVyZSksSmU9R3x8MDtELmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKEQuRlJBTUVCVUZGRVIsRC5DT0xPUl9BVFRBQ0hNRU5UMCxIZS5fX3dlYmdsVGV4dHVyZSxYfHwwLEplKX1MPS0xfSx0aGlzLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM9ZnVuY3Rpb24oVCxHLFgsWSxILE1lLFJlKXtpZighKFQmJlQuaXNXZWJHTFJlbmRlclRhcmdldCkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4iKTtyZXR1cm59bGV0IEZlPVcuZ2V0KFQpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtpZihULmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0JiZSZSE9PXZvaWQgMCYmKEZlPUZlW1JlXSksRmUpe3JlLmJpbmRGcmFtZWJ1ZmZlcihELkZSQU1FQlVGRkVSLEZlKTt0cnl7Y29uc3QgSGU9VC50ZXh0dXJlLEplPUhlLmZvcm1hdCxYZT1IZS50eXBlO2lmKEplIT09YW4mJmF0LmNvbnZlcnQoSmUpIT09RC5nZXRQYXJhbWV0ZXIoRC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LiIpO3JldHVybn1jb25zdCBZZT1YZT09PXdyJiYoSy5oYXMoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpfHx1ZS5pc1dlYkdMMiYmSy5oYXMoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSk7aWYoWGUhPT1RbiYmYXQuY29udmVydChYZSkhPT1ELmdldFBhcmFtZXRlcihELklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSkmJiEoWGU9PT1SbiYmKHVlLmlzV2ViR0wyfHxLLmhhcygiT0VTX3RleHR1cmVfZmxvYXQiKXx8Sy5oYXMoIldFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCIpKSkmJiFZZSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFVuc2lnbmVkQnl0ZVR5cGUgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLiIpO3JldHVybn1HPj0wJiZHPD1ULndpZHRoLVkmJlg+PTAmJlg8PVQuaGVpZ2h0LUgmJkQucmVhZFBpeGVscyhHLFgsWSxILGF0LmNvbnZlcnQoSmUpLGF0LmNvbnZlcnQoWGUpLE1lKX1maW5hbGx5e2NvbnN0IEhlPUEhPT1udWxsP1cuZ2V0KEEpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjpudWxsO3JlLmJpbmRGcmFtZWJ1ZmZlcihELkZSQU1FQlVGRkVSLEhlKX19fSx0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbihULEcsWD0wKXtjb25zdCBZPU1hdGgucG93KDIsLVgpLEg9TWF0aC5mbG9vcihHLmltYWdlLndpZHRoKlkpLE1lPU1hdGguZmxvb3IoRy5pbWFnZS5oZWlnaHQqWSk7Si5zZXRUZXh0dXJlMkQoRywwKSxELmNvcHlUZXhTdWJJbWFnZTJEKEQuVEVYVFVSRV8yRCxYLDAsMCxULngsVC55LEgsTWUpLHJlLnVuYmluZFRleHR1cmUoKX0sdGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZT1mdW5jdGlvbihULEcsWCxZPTApe2NvbnN0IEg9Ry5pbWFnZS53aWR0aCxNZT1HLmltYWdlLmhlaWdodCxSZT1hdC5jb252ZXJ0KFguZm9ybWF0KSxGZT1hdC5jb252ZXJ0KFgudHlwZSk7Si5zZXRUZXh0dXJlMkQoWCwwKSxELnBpeGVsU3RvcmVpKEQuVU5QQUNLX0ZMSVBfWV9XRUJHTCxYLmZsaXBZKSxELnBpeGVsU3RvcmVpKEQuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLFgucHJlbXVsdGlwbHlBbHBoYSksRC5waXhlbFN0b3JlaShELlVOUEFDS19BTElHTk1FTlQsWC51bnBhY2tBbGlnbm1lbnQpLEcuaXNEYXRhVGV4dHVyZT9ELnRleFN1YkltYWdlMkQoRC5URVhUVVJFXzJELFksVC54LFQueSxILE1lLFJlLEZlLEcuaW1hZ2UuZGF0YSk6Ry5pc0NvbXByZXNzZWRUZXh0dXJlP0QuY29tcHJlc3NlZFRleFN1YkltYWdlMkQoRC5URVhUVVJFXzJELFksVC54LFQueSxHLm1pcG1hcHNbMF0ud2lkdGgsRy5taXBtYXBzWzBdLmhlaWdodCxSZSxHLm1pcG1hcHNbMF0uZGF0YSk6RC50ZXhTdWJJbWFnZTJEKEQuVEVYVFVSRV8yRCxZLFQueCxULnksUmUsRmUsRy5pbWFnZSksWT09PTAmJlguZ2VuZXJhdGVNaXBtYXBzJiZELmdlbmVyYXRlTWlwbWFwKEQuVEVYVFVSRV8yRCkscmUudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q9ZnVuY3Rpb24oVCxHLFgsWSxIPTApe2lmKHguaXNXZWJHTDFSZW5kZXJlcil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q6IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7cmV0dXJufWNvbnN0IE1lPVQubWF4LngtVC5taW4ueCsxLFJlPVQubWF4LnktVC5taW4ueSsxLEZlPVQubWF4LnotVC5taW4ueisxLEhlPWF0LmNvbnZlcnQoWS5mb3JtYXQpLEplPWF0LmNvbnZlcnQoWS50eXBlKTtsZXQgWGU7aWYoWS5pc0RhdGEzRFRleHR1cmUpSi5zZXRUZXh0dXJlM0QoWSwwKSxYZT1ELlRFWFRVUkVfM0Q7ZWxzZSBpZihZLmlzRGF0YUFycmF5VGV4dHVyZSlKLnNldFRleHR1cmUyREFycmF5KFksMCksWGU9RC5URVhUVVJFXzJEX0FSUkFZO2Vsc2V7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q6IG9ubHkgc3VwcG9ydHMgVEhSRUUuRGF0YVRleHR1cmUzRCBhbmQgVEhSRUUuRGF0YVRleHR1cmUyREFycmF5LiIpO3JldHVybn1ELnBpeGVsU3RvcmVpKEQuVU5QQUNLX0ZMSVBfWV9XRUJHTCxZLmZsaXBZKSxELnBpeGVsU3RvcmVpKEQuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLFkucHJlbXVsdGlwbHlBbHBoYSksRC5waXhlbFN0b3JlaShELlVOUEFDS19BTElHTk1FTlQsWS51bnBhY2tBbGlnbm1lbnQpO2NvbnN0IFllPUQuZ2V0UGFyYW1ldGVyKEQuVU5QQUNLX1JPV19MRU5HVEgpLFR0PUQuZ2V0UGFyYW1ldGVyKEQuVU5QQUNLX0lNQUdFX0hFSUdIVCksd249RC5nZXRQYXJhbWV0ZXIoRC5VTlBBQ0tfU0tJUF9QSVhFTFMpLE90PUQuZ2V0UGFyYW1ldGVyKEQuVU5QQUNLX1NLSVBfUk9XUyksX2k9RC5nZXRQYXJhbWV0ZXIoRC5VTlBBQ0tfU0tJUF9JTUFHRVMpLGd0PVguaXNDb21wcmVzc2VkVGV4dHVyZT9YLm1pcG1hcHNbMF06WC5pbWFnZTtELnBpeGVsU3RvcmVpKEQuVU5QQUNLX1JPV19MRU5HVEgsZ3Qud2lkdGgpLEQucGl4ZWxTdG9yZWkoRC5VTlBBQ0tfSU1BR0VfSEVJR0hULGd0LmhlaWdodCksRC5waXhlbFN0b3JlaShELlVOUEFDS19TS0lQX1BJWEVMUyxULm1pbi54KSxELnBpeGVsU3RvcmVpKEQuVU5QQUNLX1NLSVBfUk9XUyxULm1pbi55KSxELnBpeGVsU3RvcmVpKEQuVU5QQUNLX1NLSVBfSU1BR0VTLFQubWluLnopLFguaXNEYXRhVGV4dHVyZXx8WC5pc0RhdGEzRFRleHR1cmU/RC50ZXhTdWJJbWFnZTNEKFhlLEgsRy54LEcueSxHLnosTWUsUmUsRmUsSGUsSmUsZ3QuZGF0YSk6WC5pc0NvbXByZXNzZWRBcnJheVRleHR1cmU/KGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlci5jb3B5VGV4dHVyZVRvVGV4dHVyZTNEOiB1bnRlc3RlZCBzdXBwb3J0IGZvciBjb21wcmVzc2VkIHNyY1RleHR1cmUuIiksRC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRChYZSxILEcueCxHLnksRy56LE1lLFJlLEZlLEhlLGd0LmRhdGEpKTpELnRleFN1YkltYWdlM0QoWGUsSCxHLngsRy55LEcueixNZSxSZSxGZSxIZSxKZSxndCksRC5waXhlbFN0b3JlaShELlVOUEFDS19ST1dfTEVOR1RILFllKSxELnBpeGVsU3RvcmVpKEQuVU5QQUNLX0lNQUdFX0hFSUdIVCxUdCksRC5waXhlbFN0b3JlaShELlVOUEFDS19TS0lQX1BJWEVMUyx3biksRC5waXhlbFN0b3JlaShELlVOUEFDS19TS0lQX1JPV1MsT3QpLEQucGl4ZWxTdG9yZWkoRC5VTlBBQ0tfU0tJUF9JTUFHRVMsX2kpLEg9PT0wJiZZLmdlbmVyYXRlTWlwbWFwcyYmRC5nZW5lcmF0ZU1pcG1hcChYZSkscmUudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmluaXRUZXh0dXJlPWZ1bmN0aW9uKFQpe1QuaXNDdWJlVGV4dHVyZT9KLnNldFRleHR1cmVDdWJlKFQsMCk6VC5pc0RhdGEzRFRleHR1cmU/Si5zZXRUZXh0dXJlM0QoVCwwKTpULmlzRGF0YUFycmF5VGV4dHVyZXx8VC5pc0NvbXByZXNzZWRBcnJheVRleHR1cmU/Si5zZXRUZXh0dXJlMkRBcnJheShULDApOkouc2V0VGV4dHVyZTJEKFQsMCkscmUudW5iaW5kVGV4dHVyZSgpfSx0aGlzLnJlc2V0U3RhdGU9ZnVuY3Rpb24oKXtTPTAsYj0wLEE9bnVsbCxyZS5yZXNldCgpLFZlLnJlc2V0KCl9LHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18hPSJ1bmRlZmluZWQiJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1nZXQgY29vcmRpbmF0ZVN5c3RlbSgpe3JldHVybiBQbn1nZXQgb3V0cHV0Q29sb3JTcGFjZSgpe3JldHVybiB0aGlzLl9vdXRwdXRDb2xvclNwYWNlfXNldCBvdXRwdXRDb2xvclNwYWNlKGUpe3RoaXMuX291dHB1dENvbG9yU3BhY2U9ZTtjb25zdCB0PXRoaXMuZ2V0Q29udGV4dCgpO3QuZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U9ZT09PXFhPyJkaXNwbGF5LXAzIjoic3JnYiIsdC51bnBhY2tDb2xvclNwYWNlPW90LndvcmtpbmdDb2xvclNwYWNlPT09THM/ImRpc3BsYXktcDMiOiJzcmdiIn1nZXQgcGh5c2ljYWxseUNvcnJlY3RMaWdodHMoKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUaGUgcHJvcGVydHkgLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzIGhhcyBiZWVuIHJlbW92ZWQuIFNldCByZW5kZXJlci51c2VMZWdhY3lMaWdodHMgaW5zdGVhZC4iKSwhdGhpcy51c2VMZWdhY3lMaWdodHN9c2V0IHBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzKGUpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGhlIHByb3BlcnR5IC5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyBoYXMgYmVlbiByZW1vdmVkLiBTZXQgcmVuZGVyZXIudXNlTGVnYWN5TGlnaHRzIGluc3RlYWQuIiksdGhpcy51c2VMZWdhY3lMaWdodHM9IWV9Z2V0IG91dHB1dEVuY29kaW5nKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogUHJvcGVydHkgLm91dHB1dEVuY29kaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAub3V0cHV0Q29sb3JTcGFjZSBpbnN0ZWFkLiIpLHRoaXMub3V0cHV0Q29sb3JTcGFjZT09PVB0P2JpOlpjfXNldCBvdXRwdXRFbmNvZGluZyhlKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFByb3BlcnR5IC5vdXRwdXRFbmNvZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm91dHB1dENvbG9yU3BhY2UgaW5zdGVhZC4iKSx0aGlzLm91dHB1dENvbG9yU3BhY2U9ZT09PWJpP1B0OlZufWdldCB1c2VMZWdhY3lMaWdodHMoKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUaGUgcHJvcGVydHkgLnVzZUxlZ2FjeUxpZ2h0cyBoYXMgYmVlbiBkZXByZWNhdGVkLiBNaWdyYXRlIHlvdXIgbGlnaHRpbmcgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgZ3VpZGU6IGh0dHBzOi8vZGlzY291cnNlLnRocmVlanMub3JnL3QvdXBkYXRlcy10by1saWdodGluZy1pbi10aHJlZS1qcy1yMTU1LzUzNzMzLiIpLHRoaXMuX3VzZUxlZ2FjeUxpZ2h0c31zZXQgdXNlTGVnYWN5TGlnaHRzKGUpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGhlIHByb3BlcnR5IC51c2VMZWdhY3lMaWdodHMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTWlncmF0ZSB5b3VyIGxpZ2h0aW5nIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGd1aWRlOiBodHRwczovL2Rpc2NvdXJzZS50aHJlZWpzLm9yZy90L3VwZGF0ZXMtdG8tbGlnaHRpbmctaW4tdGhyZWUtanMtcjE1NS81MzczMy4iKSx0aGlzLl91c2VMZWdhY3lMaWdodHM9ZX19Y2xhc3Mgd3AgZXh0ZW5kcyBicHt9d3AucHJvdG90eXBlLmlzV2ViR0wxUmVuZGVyZXI9ITA7Y2xhc3Mgd297Y29uc3RydWN0b3IoZSx0PTI1ZS01KXt0aGlzLmlzRm9nRXhwMj0hMCx0aGlzLm5hbWU9IiIsdGhpcy5jb2xvcj1uZXcgeWUoZSksdGhpcy5kZW5zaXR5PXR9Y2xvbmUoKXtyZXR1cm4gbmV3IHdvKHRoaXMuY29sb3IsdGhpcy5kZW5zaXR5KX10b0pTT04oKXtyZXR1cm57dHlwZToiRm9nRXhwMiIsbmFtZTp0aGlzLm5hbWUsY29sb3I6dGhpcy5jb2xvci5nZXRIZXgoKSxkZW5zaXR5OnRoaXMuZGVuc2l0eX19fWNsYXNzIEVve2NvbnN0cnVjdG9yKGUsdD0xLG49MWUzKXt0aGlzLmlzRm9nPSEwLHRoaXMubmFtZT0iIix0aGlzLmNvbG9yPW5ldyB5ZShlKSx0aGlzLm5lYXI9dCx0aGlzLmZhcj1ufWNsb25lKCl7cmV0dXJuIG5ldyBFbyh0aGlzLmNvbG9yLHRoaXMubmVhcix0aGlzLmZhcil9dG9KU09OKCl7cmV0dXJue3R5cGU6IkZvZyIsbmFtZTp0aGlzLm5hbWUsY29sb3I6dGhpcy5jb2xvci5nZXRIZXgoKSxuZWFyOnRoaXMubmVhcixmYXI6dGhpcy5mYXJ9fX1jbGFzcyBFcCBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzU2NlbmU9ITAsdGhpcy50eXBlPSJTY2VuZSIsdGhpcy5iYWNrZ3JvdW5kPW51bGwsdGhpcy5lbnZpcm9ubWVudD1udWxsLHRoaXMuZm9nPW51bGwsdGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcz0wLHRoaXMuYmFja2dyb3VuZEludGVuc2l0eT0xLHRoaXMub3ZlcnJpZGVNYXRlcmlhbD1udWxsLHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18hPSJ1bmRlZmluZWQiJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1jb3B5KGUsdCl7cmV0dXJuIHN1cGVyLmNvcHkoZSx0KSxlLmJhY2tncm91bmQhPT1udWxsJiYodGhpcy5iYWNrZ3JvdW5kPWUuYmFja2dyb3VuZC5jbG9uZSgpKSxlLmVudmlyb25tZW50IT09bnVsbCYmKHRoaXMuZW52aXJvbm1lbnQ9ZS5lbnZpcm9ubWVudC5jbG9uZSgpKSxlLmZvZyE9PW51bGwmJih0aGlzLmZvZz1lLmZvZy5jbG9uZSgpKSx0aGlzLmJhY2tncm91bmRCbHVycmluZXNzPWUuYmFja2dyb3VuZEJsdXJyaW5lc3MsdGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5PWUuYmFja2dyb3VuZEludGVuc2l0eSxlLm92ZXJyaWRlTWF0ZXJpYWwhPT1udWxsJiYodGhpcy5vdmVycmlkZU1hdGVyaWFsPWUub3ZlcnJpZGVNYXRlcmlhbC5jbG9uZSgpKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ZS5tYXRyaXhBdXRvVXBkYXRlLHRoaXN9dG9KU09OKGUpe2NvbnN0IHQ9c3VwZXIudG9KU09OKGUpO3JldHVybiB0aGlzLmZvZyE9PW51bGwmJih0Lm9iamVjdC5mb2c9dGhpcy5mb2cudG9KU09OKCkpLHRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3M+MCYmKHQub2JqZWN0LmJhY2tncm91bmRCbHVycmluZXNzPXRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3MpLHRoaXMuYmFja2dyb3VuZEludGVuc2l0eSE9PTEmJih0Lm9iamVjdC5iYWNrZ3JvdW5kSW50ZW5zaXR5PXRoaXMuYmFja2dyb3VuZEludGVuc2l0eSksdH19Y2xhc3MgQW97Y29uc3RydWN0b3IoZSx0KXt0aGlzLmlzSW50ZXJsZWF2ZWRCdWZmZXI9ITAsdGhpcy5hcnJheT1lLHRoaXMuc3RyaWRlPXQsdGhpcy5jb3VudD1lIT09dm9pZCAwP2UubGVuZ3RoL3Q6MCx0aGlzLnVzYWdlPU5zLHRoaXMuX3VwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX0sdGhpcy51cGRhdGVSYW5nZXM9W10sdGhpcy52ZXJzaW9uPTAsdGhpcy51dWlkPV9uKCl9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUoZSl7ZT09PSEwJiZ0aGlzLnZlcnNpb24rK31nZXQgdXBkYXRlUmFuZ2UoKXtyZXR1cm4gY29uc29sZS53YXJuKCdUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlcjogInVwZGF0ZVJhbmdlIiBpcyBkZXByZWNhdGVkIGFuZCByZW1vdmVkIGluIHIxNjkuIFVzZSAiYWRkVXBkYXRlUmFuZ2UoKSIgaW5zdGVhZC4nKSx0aGlzLl91cGRhdGVSYW5nZX1zZXRVc2FnZShlKXtyZXR1cm4gdGhpcy51c2FnZT1lLHRoaXN9YWRkVXBkYXRlUmFuZ2UoZSx0KXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDplLGNvdW50OnR9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkoZSl7cmV0dXJuIHRoaXMuYXJyYXk9bmV3IGUuYXJyYXkuY29uc3RydWN0b3IoZS5hcnJheSksdGhpcy5jb3VudD1lLmNvdW50LHRoaXMuc3RyaWRlPWUuc3RyaWRlLHRoaXMudXNhZ2U9ZS51c2FnZSx0aGlzfWNvcHlBdChlLHQsbil7ZSo9dGhpcy5zdHJpZGUsbio9dC5zdHJpZGU7Zm9yKGxldCBpPTAscz10aGlzLnN0cmlkZTtpPHM7aSsrKXRoaXMuYXJyYXlbZStpXT10LmFycmF5W24raV07cmV0dXJuIHRoaXN9c2V0KGUsdD0wKXtyZXR1cm4gdGhpcy5hcnJheS5zZXQoZSx0KSx0aGlzfWNsb25lKGUpe2UuYXJyYXlCdWZmZXJzPT09dm9pZCAwJiYoZS5hcnJheUJ1ZmZlcnM9e30pLHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkPT09dm9pZCAwJiYodGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9X24oKSksZS5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPT09dm9pZCAwJiYoZS5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPXRoaXMuYXJyYXkuc2xpY2UoMCkuYnVmZmVyKTtjb25zdCB0PW5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKGUuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSksbj1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0LHRoaXMuc3RyaWRlKTtyZXR1cm4gbi5zZXRVc2FnZSh0aGlzLnVzYWdlKSxufW9uVXBsb2FkKGUpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9ZSx0aGlzfXRvSlNPTihlKXtyZXR1cm4gZS5hcnJheUJ1ZmZlcnM9PT12b2lkIDAmJihlLmFycmF5QnVmZmVycz17fSksdGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9PT12b2lkIDAmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1fbigpKSxlLmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09PT12b2lkIDAmJihlLmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09QXJyYXkuZnJvbShuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheS5idWZmZXIpKSkse3V1aWQ6dGhpcy51dWlkLGJ1ZmZlcjp0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxzdHJpZGU6dGhpcy5zdHJpZGV9fX1jb25zdCBKdD1uZXcgUDtjbGFzcyBRaXtjb25zdHJ1Y3RvcihlLHQsbixpPSExKXt0aGlzLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5uYW1lPSIiLHRoaXMuZGF0YT1lLHRoaXMuaXRlbVNpemU9dCx0aGlzLm9mZnNldD1uLHRoaXMubm9ybWFsaXplZD1pfWdldCBjb3VudCgpe3JldHVybiB0aGlzLmRhdGEuY291bnR9Z2V0IGFycmF5KCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheX1zZXQgbmVlZHNVcGRhdGUoZSl7dGhpcy5kYXRhLm5lZWRzVXBkYXRlPWV9YXBwbHlNYXRyaXg0KGUpe2ZvcihsZXQgdD0wLG49dGhpcy5kYXRhLmNvdW50O3Q8bjt0KyspSnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLHQpLEp0LmFwcGx5TWF0cml4NChlKSx0aGlzLnNldFhZWih0LEp0LngsSnQueSxKdC56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeChlKXtmb3IobGV0IHQ9MCxuPXRoaXMuY291bnQ7dDxuO3QrKylKdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsdCksSnQuYXBwbHlOb3JtYWxNYXRyaXgoZSksdGhpcy5zZXRYWVoodCxKdC54LEp0LnksSnQueik7cmV0dXJuIHRoaXN9dHJhbnNmb3JtRGlyZWN0aW9uKGUpe2ZvcihsZXQgdD0wLG49dGhpcy5jb3VudDt0PG47dCsrKUp0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyx0KSxKdC50cmFuc2Zvcm1EaXJlY3Rpb24oZSksdGhpcy5zZXRYWVoodCxKdC54LEp0LnksSnQueik7cmV0dXJuIHRoaXN9c2V0WChlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVtlKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdPXQsdGhpc31zZXRZKGUsdCl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHQ9cWUodCx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W2UqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsxXT10LHRoaXN9c2V0WihlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVtlKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl09dCx0aGlzfXNldFcoZSx0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYodD1xZSh0LHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbZSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdPXQsdGhpc31nZXRYKGUpe2xldCB0PXRoaXMuZGF0YS5hcnJheVtlKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9Z2V0WShlKXtsZXQgdD10aGlzLmRhdGEuYXJyYXlbZSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9Z2V0WihlKXtsZXQgdD10aGlzLmRhdGEuYXJyYXlbZSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9Z2V0VyhlKXtsZXQgdD10aGlzLmRhdGEuYXJyYXlbZSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9c2V0WFkoZSx0LG4pe3JldHVybiBlPWUqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCx0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSksbj1xZShuLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbZSswXT10LHRoaXMuZGF0YS5hcnJheVtlKzFdPW4sdGhpc31zZXRYWVooZSx0LG4saSl7cmV0dXJuIGU9ZSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCYmKHQ9cWUodCx0aGlzLmFycmF5KSxuPXFlKG4sdGhpcy5hcnJheSksaT1xZShpLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbZSswXT10LHRoaXMuZGF0YS5hcnJheVtlKzFdPW4sdGhpcy5kYXRhLmFycmF5W2UrMl09aSx0aGlzfXNldFhZWlcoZSx0LG4saSxzKXtyZXR1cm4gZT1lKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQsdGhpcy5ub3JtYWxpemVkJiYodD1xZSh0LHRoaXMuYXJyYXkpLG49cWUobix0aGlzLmFycmF5KSxpPXFlKGksdGhpcy5hcnJheSkscz1xZShzLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbZSswXT10LHRoaXMuZGF0YS5hcnJheVtlKzFdPW4sdGhpcy5kYXRhLmFycmF5W2UrMl09aSx0aGlzLmRhdGEuYXJyYXlbZSszXT1zLHRoaXN9Y2xvbmUoZSl7aWYoZT09PXZvaWQgMCl7Y29uc29sZS5sb2coIlRIUkVFLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLmNsb25lKCk6IENsb25pbmcgYW4gaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlLWludGVybGVhdmUgYnVmZmVyIGRhdGEuIik7Y29uc3QgdD1bXTtmb3IobGV0IG49MDtuPHRoaXMuY291bnQ7bisrKXtjb25zdCBpPW4qdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDtmb3IobGV0IHM9MDtzPHRoaXMuaXRlbVNpemU7cysrKXQucHVzaCh0aGlzLmRhdGEuYXJyYXlbaStzXSl9cmV0dXJuIG5ldyBLZShuZXcgdGhpcy5hcnJheS5jb25zdHJ1Y3Rvcih0KSx0aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCl9ZWxzZSByZXR1cm4gZS5pbnRlcmxlYXZlZEJ1ZmZlcnM9PT12b2lkIDAmJihlLmludGVybGVhdmVkQnVmZmVycz17fSksZS5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdPT09dm9pZCAwJiYoZS5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdPXRoaXMuZGF0YS5jbG9uZShlKSksbmV3IFFpKGUuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXSx0aGlzLml0ZW1TaXplLHRoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCl9dG9KU09OKGUpe2lmKGU9PT12b2lkIDApe2NvbnNvbGUubG9nKCJUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS50b0pTT04oKTogU2VyaWFsaXppbmcgYW4gaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlLWludGVybGVhdmUgYnVmZmVyIGRhdGEuIik7Y29uc3QgdD1bXTtmb3IobGV0IG49MDtuPHRoaXMuY291bnQ7bisrKXtjb25zdCBpPW4qdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDtmb3IobGV0IHM9MDtzPHRoaXMuaXRlbVNpemU7cysrKXQucHVzaCh0aGlzLmRhdGEuYXJyYXlbaStzXSl9cmV0dXJue2l0ZW1TaXplOnRoaXMuaXRlbVNpemUsdHlwZTp0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6dCxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19ZWxzZSByZXR1cm4gZS5pbnRlcmxlYXZlZEJ1ZmZlcnM9PT12b2lkIDAmJihlLmludGVybGVhdmVkQnVmZmVycz17fSksZS5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdPT09dm9pZCAwJiYoZS5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdPXRoaXMuZGF0YS50b0pTT04oZSkpLHtpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiEwLGl0ZW1TaXplOnRoaXMuaXRlbVNpemUsZGF0YTp0aGlzLmRhdGEudXVpZCxvZmZzZXQ6dGhpcy5vZmZzZXQsbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9fX1jbGFzcyBEaCBleHRlbmRzIEh0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5pc1Nwcml0ZU1hdGVyaWFsPSEwLHRoaXMudHlwZT0iU3ByaXRlTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHllKDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLnJvdGF0aW9uPTAsdGhpcy5zaXplQXR0ZW51YXRpb249ITAsdGhpcy50cmFuc3BhcmVudD0hMCx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuY29sb3IuY29weShlLmNvbG9yKSx0aGlzLm1hcD1lLm1hcCx0aGlzLmFscGhhTWFwPWUuYWxwaGFNYXAsdGhpcy5yb3RhdGlvbj1lLnJvdGF0aW9uLHRoaXMuc2l6ZUF0dGVudWF0aW9uPWUuc2l6ZUF0dGVudWF0aW9uLHRoaXMuZm9nPWUuZm9nLHRoaXN9fWxldCBacjtjb25zdCBacz1uZXcgUCxKcj1uZXcgUCxLcj1uZXcgUCxRcj1uZXcgcSxKcz1uZXcgcSxBcD1uZXcgSWUsVG89bmV3IFAsS3M9bmV3IFAsQ289bmV3IFAsVHA9bmV3IHEsTmg9bmV3IHEsQ3A9bmV3IHE7Y2xhc3MgUnAgZXh0ZW5kcyBydHtjb25zdHJ1Y3RvcihlPW5ldyBEaCl7aWYoc3VwZXIoKSx0aGlzLmlzU3ByaXRlPSEwLHRoaXMudHlwZT0iU3ByaXRlIixacj09PXZvaWQgMCl7WnI9bmV3IGtlO2NvbnN0IHQ9bmV3IEZsb2F0MzJBcnJheShbLS41LC0uNSwwLDAsMCwuNSwtLjUsMCwxLDAsLjUsLjUsMCwxLDEsLS41LC41LDAsMCwxXSksbj1uZXcgQW8odCw1KTtaci5zZXRJbmRleChbMCwxLDIsMCwyLDNdKSxaci5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUWkobiwzLDAsITEpKSxaci5zZXRBdHRyaWJ1dGUoInV2IixuZXcgUWkobiwyLDMsITEpKX10aGlzLmdlb21ldHJ5PVpyLHRoaXMubWF0ZXJpYWw9ZSx0aGlzLmNlbnRlcj1uZXcgcSguNSwuNSl9cmF5Y2FzdChlLHQpe2UuY2FtZXJhPT09bnVsbCYmY29uc29sZS5lcnJvcignVEhSRUUuU3ByaXRlOiAiUmF5Y2FzdGVyLmNhbWVyYSIgbmVlZHMgdG8gYmUgc2V0IGluIG9yZGVyIHRvIHJheWNhc3QgYWdhaW5zdCBzcHJpdGVzLicpLEpyLnNldEZyb21NYXRyaXhTY2FsZSh0aGlzLm1hdHJpeFdvcmxkKSxBcC5jb3B5KGUuY2FtZXJhLm1hdHJpeFdvcmxkKSx0aGlzLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKGUuY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSx0aGlzLm1hdHJpeFdvcmxkKSxLci5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tb2RlbFZpZXdNYXRyaXgpLGUuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEmJnRoaXMubWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uPT09ITEmJkpyLm11bHRpcGx5U2NhbGFyKC1Lci56KTtjb25zdCBuPXRoaXMubWF0ZXJpYWwucm90YXRpb247bGV0IGkscztuIT09MCYmKHM9TWF0aC5jb3MobiksaT1NYXRoLnNpbihuKSk7Y29uc3QgYT10aGlzLmNlbnRlcjtSbyhUby5zZXQoLS41LC0uNSwwKSxLcixhLEpyLGkscyksUm8oS3Muc2V0KC41LC0uNSwwKSxLcixhLEpyLGkscyksUm8oQ28uc2V0KC41LC41LDApLEtyLGEsSnIsaSxzKSxUcC5zZXQoMCwwKSxOaC5zZXQoMSwwKSxDcC5zZXQoMSwxKTtsZXQgbz1lLnJheS5pbnRlcnNlY3RUcmlhbmdsZShUbyxLcyxDbywhMSxacyk7aWYobz09PW51bGwmJihSbyhLcy5zZXQoLS41LC41LDApLEtyLGEsSnIsaSxzKSxOaC5zZXQoMCwxKSxvPWUucmF5LmludGVyc2VjdFRyaWFuZ2xlKFRvLENvLEtzLCExLFpzKSxvPT09bnVsbCkpcmV0dXJuO2NvbnN0IGw9ZS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oWnMpO2w8ZS5uZWFyfHxsPmUuZmFyfHx0LnB1c2goe2Rpc3RhbmNlOmwscG9pbnQ6WnMuY2xvbmUoKSx1djpjbi5nZXRJbnRlcnBvbGF0aW9uKFpzLFRvLEtzLENvLFRwLE5oLENwLG5ldyBxKSxmYWNlOm51bGwsb2JqZWN0OnRoaXN9KX1jb3B5KGUsdCl7cmV0dXJuIHN1cGVyLmNvcHkoZSx0KSxlLmNlbnRlciE9PXZvaWQgMCYmdGhpcy5jZW50ZXIuY29weShlLmNlbnRlciksdGhpcy5tYXRlcmlhbD1lLm1hdGVyaWFsLHRoaXN9fWZ1bmN0aW9uIFJvKHIsZSx0LG4saSxzKXtRci5zdWJWZWN0b3JzKHIsdCkuYWRkU2NhbGFyKC41KS5tdWx0aXBseShuKSxpIT09dm9pZCAwPyhKcy54PXMqUXIueC1pKlFyLnksSnMueT1pKlFyLngrcypRci55KTpKcy5jb3B5KFFyKSxyLmNvcHkoZSksci54Kz1Kcy54LHIueSs9SnMueSxyLmFwcGx5TWF0cml4NChBcCl9Y29uc3QgUG89bmV3IFAsUHA9bmV3IFA7Y2xhc3MgTHAgZXh0ZW5kcyBydHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5fY3VycmVudExldmVsPTAsdGhpcy50eXBlPSJMT0QiLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse2xldmVsczp7ZW51bWVyYWJsZTohMCx2YWx1ZTpbXX0saXNMT0Q6e3ZhbHVlOiEwfX0pLHRoaXMuYXV0b1VwZGF0ZT0hMH1jb3B5KGUpe3N1cGVyLmNvcHkoZSwhMSk7Y29uc3QgdD1lLmxldmVscztmb3IobGV0IG49MCxpPXQubGVuZ3RoO248aTtuKyspe2NvbnN0IHM9dFtuXTt0aGlzLmFkZExldmVsKHMub2JqZWN0LmNsb25lKCkscy5kaXN0YW5jZSxzLmh5c3RlcmVzaXMpfXJldHVybiB0aGlzLmF1dG9VcGRhdGU9ZS5hdXRvVXBkYXRlLHRoaXN9YWRkTGV2ZWwoZSx0PTAsbj0wKXt0PU1hdGguYWJzKHQpO2NvbnN0IGk9dGhpcy5sZXZlbHM7bGV0IHM7Zm9yKHM9MDtzPGkubGVuZ3RoJiYhKHQ8aVtzXS5kaXN0YW5jZSk7cysrKTtyZXR1cm4gaS5zcGxpY2UocywwLHtkaXN0YW5jZTp0LGh5c3RlcmVzaXM6bixvYmplY3Q6ZX0pLHRoaXMuYWRkKGUpLHRoaXN9Z2V0Q3VycmVudExldmVsKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnRMZXZlbH1nZXRPYmplY3RGb3JEaXN0YW5jZShlKXtjb25zdCB0PXRoaXMubGV2ZWxzO2lmKHQubGVuZ3RoPjApe2xldCBuLGk7Zm9yKG49MSxpPXQubGVuZ3RoO248aTtuKyspe2xldCBzPXRbbl0uZGlzdGFuY2U7aWYodFtuXS5vYmplY3QudmlzaWJsZSYmKHMtPXMqdFtuXS5oeXN0ZXJlc2lzKSxlPHMpYnJlYWt9cmV0dXJuIHRbbi0xXS5vYmplY3R9cmV0dXJuIG51bGx9cmF5Y2FzdChlLHQpe2lmKHRoaXMubGV2ZWxzLmxlbmd0aD4wKXtQby5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7Y29uc3QgaT1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhQbyk7dGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZShpKS5yYXljYXN0KGUsdCl9fXVwZGF0ZShlKXtjb25zdCB0PXRoaXMubGV2ZWxzO2lmKHQubGVuZ3RoPjEpe1BvLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLm1hdHJpeFdvcmxkKSxQcC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7Y29uc3Qgbj1Qby5kaXN0YW5jZVRvKFBwKS9lLnpvb207dFswXS5vYmplY3QudmlzaWJsZT0hMDtsZXQgaSxzO2ZvcihpPTEscz10Lmxlbmd0aDtpPHM7aSsrKXtsZXQgYT10W2ldLmRpc3RhbmNlO2lmKHRbaV0ub2JqZWN0LnZpc2libGUmJihhLT1hKnRbaV0uaHlzdGVyZXNpcyksbj49YSl0W2ktMV0ub2JqZWN0LnZpc2libGU9ITEsdFtpXS5vYmplY3QudmlzaWJsZT0hMDtlbHNlIGJyZWFrfWZvcih0aGlzLl9jdXJyZW50TGV2ZWw9aS0xO2k8cztpKyspdFtpXS5vYmplY3QudmlzaWJsZT0hMX19dG9KU09OKGUpe2NvbnN0IHQ9c3VwZXIudG9KU09OKGUpO3RoaXMuYXV0b1VwZGF0ZT09PSExJiYodC5vYmplY3QuYXV0b1VwZGF0ZT0hMSksdC5vYmplY3QubGV2ZWxzPVtdO2NvbnN0IG49dGhpcy5sZXZlbHM7Zm9yKGxldCBpPTAscz1uLmxlbmd0aDtpPHM7aSsrKXtjb25zdCBhPW5baV07dC5vYmplY3QubGV2ZWxzLnB1c2goe29iamVjdDphLm9iamVjdC51dWlkLGRpc3RhbmNlOmEuZGlzdGFuY2UsaHlzdGVyZXNpczphLmh5c3RlcmVzaXN9KX1yZXR1cm4gdH19Y29uc3QgSXA9bmV3IFAsVXA9bmV3IGx0LERwPW5ldyBsdCxUUz1uZXcgUCxOcD1uZXcgSWUsTG89bmV3IFAsRmg9bmV3IEd0LEZwPW5ldyBJZSxPaD1uZXcgVXI7Y2xhc3MgT3AgZXh0ZW5kcyBMdHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy5pc1NraW5uZWRNZXNoPSEwLHRoaXMudHlwZT0iU2tpbm5lZE1lc2giLHRoaXMuYmluZE1vZGU9cGMsdGhpcy5iaW5kTWF0cml4PW5ldyBJZSx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlPW5ldyBJZSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsfWNvbXB1dGVCb3VuZGluZ0JveCgpe2NvbnN0IGU9dGhpcy5nZW9tZXRyeTt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IER0KSx0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpO2NvbnN0IHQ9ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7Zm9yKGxldCBuPTA7bjx0LmNvdW50O24rKyl0aGlzLmdldFZlcnRleFBvc2l0aW9uKG4sTG8pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChMbyl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5O3RoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgR3QpLHRoaXMuYm91bmRpbmdTcGhlcmUubWFrZUVtcHR5KCk7Y29uc3QgdD1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtmb3IobGV0IG49MDtuPHQuY291bnQ7bisrKXRoaXMuZ2V0VmVydGV4UG9zaXRpb24obixMbyksdGhpcy5ib3VuZGluZ1NwaGVyZS5leHBhbmRCeVBvaW50KExvKX1jb3B5KGUsdCl7cmV0dXJuIHN1cGVyLmNvcHkoZSx0KSx0aGlzLmJpbmRNb2RlPWUuYmluZE1vZGUsdGhpcy5iaW5kTWF0cml4LmNvcHkoZS5iaW5kTWF0cml4KSx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoZS5iaW5kTWF0cml4SW52ZXJzZSksdGhpcy5za2VsZXRvbj1lLnNrZWxldG9uLGUuYm91bmRpbmdCb3ghPT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1lLmJvdW5kaW5nQm94LmNsb25lKCkpLGUuYm91bmRpbmdTcGhlcmUhPT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1lLmJvdW5kaW5nU3BoZXJlLmNsb25lKCkpLHRoaXN9cmF5Y2FzdChlLHQpe2NvbnN0IG49dGhpcy5tYXRlcmlhbCxpPXRoaXMubWF0cml4V29ybGQ7biE9PXZvaWQgMCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLEZoLmNvcHkodGhpcy5ib3VuZGluZ1NwaGVyZSksRmguYXBwbHlNYXRyaXg0KGkpLGUucmF5LmludGVyc2VjdHNTcGhlcmUoRmgpIT09ITEmJihGcC5jb3B5KGkpLmludmVydCgpLE9oLmNvcHkoZS5yYXkpLmFwcGx5TWF0cml4NChGcCksISh0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmT2guaW50ZXJzZWN0c0JveCh0aGlzLmJvdW5kaW5nQm94KT09PSExKSYmdGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnMoZSx0LE9oKSkpfWdldFZlcnRleFBvc2l0aW9uKGUsdCl7cmV0dXJuIHN1cGVyLmdldFZlcnRleFBvc2l0aW9uKGUsdCksdGhpcy5hcHBseUJvbmVUcmFuc2Zvcm0oZSx0KSx0fWJpbmQoZSx0KXt0aGlzLnNrZWxldG9uPWUsdD09PXZvaWQgMCYmKHRoaXMudXBkYXRlTWF0cml4V29ybGQoITApLHRoaXMuc2tlbGV0b24uY2FsY3VsYXRlSW52ZXJzZXMoKSx0PXRoaXMubWF0cml4V29ybGQpLHRoaXMuYmluZE1hdHJpeC5jb3B5KHQpLHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSh0KS5pbnZlcnQoKX1wb3NlKCl7dGhpcy5za2VsZXRvbi5wb3NlKCl9bm9ybWFsaXplU2tpbldlaWdodHMoKXtjb25zdCBlPW5ldyBsdCx0PXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0O2ZvcihsZXQgbj0wLGk9dC5jb3VudDtuPGk7bisrKXtlLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxuKTtjb25zdCBzPTEvZS5tYW5oYXR0YW5MZW5ndGgoKTtzIT09MS8wP2UubXVsdGlwbHlTY2FsYXIocyk6ZS5zZXQoMSwwLDAsMCksdC5zZXRYWVpXKG4sZS54LGUueSxlLnosZS53KX19dXBkYXRlTWF0cml4V29ybGQoZSl7c3VwZXIudXBkYXRlTWF0cml4V29ybGQoZSksdGhpcy5iaW5kTW9kZT09PXBjP3RoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKTp0aGlzLmJpbmRNb2RlPT09dGQ/dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuYmluZE1hdHJpeCkuaW52ZXJ0KCk6Y29uc29sZS53YXJuKCJUSFJFRS5Ta2lubmVkTWVzaDogVW5yZWNvZ25pemVkIGJpbmRNb2RlOiAiK3RoaXMuYmluZE1vZGUpfWFwcGx5Qm9uZVRyYW5zZm9ybShlLHQpe2NvbnN0IG49dGhpcy5za2VsZXRvbixpPXRoaXMuZ2VvbWV0cnk7VXAuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLmF0dHJpYnV0ZXMuc2tpbkluZGV4LGUpLERwLmZyb21CdWZmZXJBdHRyaWJ1dGUoaS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQsZSksSXAuY29weSh0KS5hcHBseU1hdHJpeDQodGhpcy5iaW5kTWF0cml4KSx0LnNldCgwLDAsMCk7Zm9yKGxldCBzPTA7czw0O3MrKyl7Y29uc3QgYT1EcC5nZXRDb21wb25lbnQocyk7aWYoYSE9PTApe2NvbnN0IG89VXAuZ2V0Q29tcG9uZW50KHMpO05wLm11bHRpcGx5TWF0cmljZXMobi5ib25lc1tvXS5tYXRyaXhXb3JsZCxuLmJvbmVJbnZlcnNlc1tvXSksdC5hZGRTY2FsZWRWZWN0b3IoVFMuY29weShJcCkuYXBwbHlNYXRyaXg0KE5wKSxhKX19cmV0dXJuIHQuYXBwbHlNYXRyaXg0KHRoaXMuYmluZE1hdHJpeEludmVyc2UpfWJvbmVUcmFuc2Zvcm0oZSx0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Ta2lubmVkTWVzaDogLmJvbmVUcmFuc2Zvcm0oKSB3YXMgcmVuYW1lZCB0byAuYXBwbHlCb25lVHJhbnNmb3JtKCkgaW4gcjE1MS4iKSx0aGlzLmFwcGx5Qm9uZVRyYW5zZm9ybShlLHQpfX1jbGFzcyBCaCBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzQm9uZT0hMCx0aGlzLnR5cGU9IkJvbmUifX1jbGFzcyBqaSBleHRlbmRzIEV0e2NvbnN0cnVjdG9yKGU9bnVsbCx0PTEsbj0xLGkscyxhLG8sbCxjPWJ0LGg9YnQsdSxmKXtzdXBlcihudWxsLGEsbyxsLGMsaCxpLHMsdSxmKSx0aGlzLmlzRGF0YVRleHR1cmU9ITAsdGhpcy5pbWFnZT17ZGF0YTplLHdpZHRoOnQsaGVpZ2h0Om59LHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MX19Y29uc3QgQnA9bmV3IEllLENTPW5ldyBJZTtjbGFzcyBJb3tjb25zdHJ1Y3RvcihlPVtdLHQ9W10pe3RoaXMudXVpZD1fbigpLHRoaXMuYm9uZXM9ZS5zbGljZSgwKSx0aGlzLmJvbmVJbnZlcnNlcz10LHRoaXMuYm9uZU1hdHJpY2VzPW51bGwsdGhpcy5ib25lVGV4dHVyZT1udWxsLHRoaXMuaW5pdCgpfWluaXQoKXtjb25zdCBlPXRoaXMuYm9uZXMsdD10aGlzLmJvbmVJbnZlcnNlcztpZih0aGlzLmJvbmVNYXRyaWNlcz1uZXcgRmxvYXQzMkFycmF5KGUubGVuZ3RoKjE2KSx0Lmxlbmd0aD09PTApdGhpcy5jYWxjdWxhdGVJbnZlcnNlcygpO2Vsc2UgaWYoZS5sZW5ndGghPT10Lmxlbmd0aCl7Y29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogTnVtYmVyIG9mIGludmVyc2UgYm9uZSBtYXRyaWNlcyBkb2VzIG5vdCBtYXRjaCBhbW91bnQgb2YgYm9uZXMuIiksdGhpcy5ib25lSW52ZXJzZXM9W107Zm9yKGxldCBuPTAsaT10aGlzLmJvbmVzLmxlbmd0aDtuPGk7bisrKXRoaXMuYm9uZUludmVyc2VzLnB1c2gobmV3IEllKX19Y2FsY3VsYXRlSW52ZXJzZXMoKXt0aGlzLmJvbmVJbnZlcnNlcy5sZW5ndGg9MDtmb3IobGV0IGU9MCx0PXRoaXMuYm9uZXMubGVuZ3RoO2U8dDtlKyspe2NvbnN0IG49bmV3IEllO3RoaXMuYm9uZXNbZV0mJm4uY29weSh0aGlzLmJvbmVzW2VdLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSx0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG4pfX1wb3NlKCl7Zm9yKGxldCBlPTAsdD10aGlzLmJvbmVzLmxlbmd0aDtlPHQ7ZSsrKXtjb25zdCBuPXRoaXMuYm9uZXNbZV07biYmbi5tYXRyaXhXb3JsZC5jb3B5KHRoaXMuYm9uZUludmVyc2VzW2VdKS5pbnZlcnQoKX1mb3IobGV0IGU9MCx0PXRoaXMuYm9uZXMubGVuZ3RoO2U8dDtlKyspe2NvbnN0IG49dGhpcy5ib25lc1tlXTtuJiYobi5wYXJlbnQmJm4ucGFyZW50LmlzQm9uZT8obi5tYXRyaXguY29weShuLnBhcmVudC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksbi5tYXRyaXgubXVsdGlwbHkobi5tYXRyaXhXb3JsZCkpOm4ubWF0cml4LmNvcHkobi5tYXRyaXhXb3JsZCksbi5tYXRyaXguZGVjb21wb3NlKG4ucG9zaXRpb24sbi5xdWF0ZXJuaW9uLG4uc2NhbGUpKX19dXBkYXRlKCl7Y29uc3QgZT10aGlzLmJvbmVzLHQ9dGhpcy5ib25lSW52ZXJzZXMsbj10aGlzLmJvbmVNYXRyaWNlcyxpPXRoaXMuYm9uZVRleHR1cmU7Zm9yKGxldCBzPTAsYT1lLmxlbmd0aDtzPGE7cysrKXtjb25zdCBvPWVbc10/ZVtzXS5tYXRyaXhXb3JsZDpDUztCcC5tdWx0aXBseU1hdHJpY2VzKG8sdFtzXSksQnAudG9BcnJheShuLHMqMTYpfWkhPT1udWxsJiYoaS5uZWVkc1VwZGF0ZT0hMCl9Y2xvbmUoKXtyZXR1cm4gbmV3IElvKHRoaXMuYm9uZXMsdGhpcy5ib25lSW52ZXJzZXMpfWNvbXB1dGVCb25lVGV4dHVyZSgpe2xldCBlPU1hdGguc3FydCh0aGlzLmJvbmVzLmxlbmd0aCo0KTtlPU1hdGguY2VpbChlLzQpKjQsZT1NYXRoLm1heChlLDQpO2NvbnN0IHQ9bmV3IEZsb2F0MzJBcnJheShlKmUqNCk7dC5zZXQodGhpcy5ib25lTWF0cmljZXMpO2NvbnN0IG49bmV3IGppKHQsZSxlLGFuLFJuKTtyZXR1cm4gbi5uZWVkc1VwZGF0ZT0hMCx0aGlzLmJvbmVNYXRyaWNlcz10LHRoaXMuYm9uZVRleHR1cmU9bix0aGlzfWdldEJvbmVCeU5hbWUoZSl7Zm9yKGxldCB0PTAsbj10aGlzLmJvbmVzLmxlbmd0aDt0PG47dCsrKXtjb25zdCBpPXRoaXMuYm9uZXNbdF07aWYoaS5uYW1lPT09ZSlyZXR1cm4gaX19ZGlzcG9zZSgpe3RoaXMuYm9uZVRleHR1cmUhPT1udWxsJiYodGhpcy5ib25lVGV4dHVyZS5kaXNwb3NlKCksdGhpcy5ib25lVGV4dHVyZT1udWxsKX1mcm9tSlNPTihlLHQpe3RoaXMudXVpZD1lLnV1aWQ7Zm9yKGxldCBuPTAsaT1lLmJvbmVzLmxlbmd0aDtuPGk7bisrKXtjb25zdCBzPWUuYm9uZXNbbl07bGV0IGE9dFtzXTthPT09dm9pZCAwJiYoY29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogTm8gYm9uZSBmb3VuZCB3aXRoIFVVSUQ6IixzKSxhPW5ldyBCaCksdGhpcy5ib25lcy5wdXNoKGEpLHRoaXMuYm9uZUludmVyc2VzLnB1c2gobmV3IEllKCkuZnJvbUFycmF5KGUuYm9uZUludmVyc2VzW25dKSl9cmV0dXJuIHRoaXMuaW5pdCgpLHRoaXN9dG9KU09OKCl7Y29uc3QgZT17bWV0YWRhdGE6e3ZlcnNpb246NC42LHR5cGU6IlNrZWxldG9uIixnZW5lcmF0b3I6IlNrZWxldG9uLnRvSlNPTiJ9LGJvbmVzOltdLGJvbmVJbnZlcnNlczpbXX07ZS51dWlkPXRoaXMudXVpZDtjb25zdCB0PXRoaXMuYm9uZXMsbj10aGlzLmJvbmVJbnZlcnNlcztmb3IobGV0IGk9MCxzPXQubGVuZ3RoO2k8cztpKyspe2NvbnN0IGE9dFtpXTtlLmJvbmVzLnB1c2goYS51dWlkKTtjb25zdCBvPW5baV07ZS5ib25lSW52ZXJzZXMucHVzaChvLnRvQXJyYXkoKSl9cmV0dXJuIGV9fWNsYXNzIGpyIGV4dGVuZHMgS2V7Y29uc3RydWN0b3IoZSx0LG4saT0xKXtzdXBlcihlLHQsbiksdGhpcy5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT0hMCx0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9aX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMubWVzaFBlckF0dHJpYnV0ZT1lLm1lc2hQZXJBdHRyaWJ1dGUsdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO3JldHVybiBlLm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLGUuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITAsZX19Y29uc3QgZXM9bmV3IEllLHpwPW5ldyBJZSxVbz1bXSxrcD1uZXcgRHQsUlM9bmV3IEllLFFzPW5ldyBMdCxqcz1uZXcgR3Q7Y2xhc3MgR3AgZXh0ZW5kcyBMdHtjb25zdHJ1Y3RvcihlLHQsbil7c3VwZXIoZSx0KSx0aGlzLmlzSW5zdGFuY2VkTWVzaD0hMCx0aGlzLmluc3RhbmNlTWF0cml4PW5ldyBqcihuZXcgRmxvYXQzMkFycmF5KG4qMTYpLDE2KSx0aGlzLmluc3RhbmNlQ29sb3I9bnVsbCx0aGlzLmNvdW50PW4sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbDtmb3IobGV0IGk9MDtpPG47aSsrKXRoaXMuc2V0TWF0cml4QXQoaSxSUyl9Y29tcHV0ZUJvdW5kaW5nQm94KCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5LHQ9dGhpcy5jb3VudDt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IER0KSxlLmJvdW5kaW5nQm94PT09bnVsbCYmZS5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpO2ZvcihsZXQgbj0wO248dDtuKyspdGhpcy5nZXRNYXRyaXhBdChuLGVzKSxrcC5jb3B5KGUuYm91bmRpbmdCb3gpLmFwcGx5TWF0cml4NChlcyksdGhpcy5ib3VuZGluZ0JveC51bmlvbihrcCl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5LHQ9dGhpcy5jb3VudDt0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IEd0KSxlLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmZS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzLmJvdW5kaW5nU3BoZXJlLm1ha2VFbXB0eSgpO2ZvcihsZXQgbj0wO248dDtuKyspdGhpcy5nZXRNYXRyaXhBdChuLGVzKSxqcy5jb3B5KGUuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NChlcyksdGhpcy5ib3VuZGluZ1NwaGVyZS51bmlvbihqcyl9Y29weShlLHQpe3JldHVybiBzdXBlci5jb3B5KGUsdCksdGhpcy5pbnN0YW5jZU1hdHJpeC5jb3B5KGUuaW5zdGFuY2VNYXRyaXgpLGUuaW5zdGFuY2VDb2xvciE9PW51bGwmJih0aGlzLmluc3RhbmNlQ29sb3I9ZS5pbnN0YW5jZUNvbG9yLmNsb25lKCkpLHRoaXMuY291bnQ9ZS5jb3VudCxlLmJvdW5kaW5nQm94IT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9ZS5ib3VuZGluZ0JveC5jbG9uZSgpKSxlLmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9ZS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKSx0aGlzfWdldENvbG9yQXQoZSx0KXt0LmZyb21BcnJheSh0aGlzLmluc3RhbmNlQ29sb3IuYXJyYXksZSozKX1nZXRNYXRyaXhBdChlLHQpe3QuZnJvbUFycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksZSoxNil9cmF5Y2FzdChlLHQpe2NvbnN0IG49dGhpcy5tYXRyaXhXb3JsZCxpPXRoaXMuY291bnQ7aWYoUXMuZ2VvbWV0cnk9dGhpcy5nZW9tZXRyeSxRcy5tYXRlcmlhbD10aGlzLm1hdGVyaWFsLFFzLm1hdGVyaWFsIT09dm9pZCAwJiYodGhpcy5ib3VuZGluZ1NwaGVyZT09PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksanMuY29weSh0aGlzLmJvdW5kaW5nU3BoZXJlKSxqcy5hcHBseU1hdHJpeDQobiksZS5yYXkuaW50ZXJzZWN0c1NwaGVyZShqcykhPT0hMSkpZm9yKGxldCBzPTA7czxpO3MrKyl7dGhpcy5nZXRNYXRyaXhBdChzLGVzKSx6cC5tdWx0aXBseU1hdHJpY2VzKG4sZXMpLFFzLm1hdHJpeFdvcmxkPXpwLFFzLnJheWNhc3QoZSxVbyk7Zm9yKGxldCBhPTAsbz1Vby5sZW5ndGg7YTxvO2ErKyl7Y29uc3QgbD1Vb1thXTtsLmluc3RhbmNlSWQ9cyxsLm9iamVjdD10aGlzLHQucHVzaChsKX1Vby5sZW5ndGg9MH19c2V0Q29sb3JBdChlLHQpe3RoaXMuaW5zdGFuY2VDb2xvcj09PW51bGwmJih0aGlzLmluc3RhbmNlQ29sb3I9bmV3IGpyKG5ldyBGbG9hdDMyQXJyYXkodGhpcy5pbnN0YW5jZU1hdHJpeC5jb3VudCozKSwzKSksdC50b0FycmF5KHRoaXMuaW5zdGFuY2VDb2xvci5hcnJheSxlKjMpfXNldE1hdHJpeEF0KGUsdCl7dC50b0FycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksZSoxNil9dXBkYXRlTW9ycGhUYXJnZXRzKCl7fWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWZ1bmN0aW9uIFBTKHIsZSl7cmV0dXJuIHIuei1lLnp9ZnVuY3Rpb24gTFMocixlKXtyZXR1cm4gZS56LXIuen1jbGFzcyBJU3tjb25zdHJ1Y3Rvcigpe3RoaXMuaW5kZXg9MCx0aGlzLnBvb2w9W10sdGhpcy5saXN0PVtdfXB1c2goZSx0KXtjb25zdCBuPXRoaXMucG9vbCxpPXRoaXMubGlzdDt0aGlzLmluZGV4Pj1uLmxlbmd0aCYmbi5wdXNoKHtzdGFydDotMSxjb3VudDotMSx6Oi0xfSk7Y29uc3Qgcz1uW3RoaXMuaW5kZXhdO2kucHVzaChzKSx0aGlzLmluZGV4Kysscy5zdGFydD1lLnN0YXJ0LHMuY291bnQ9ZS5jb3VudCxzLno9dH1yZXNldCgpe3RoaXMubGlzdC5sZW5ndGg9MCx0aGlzLmluZGV4PTB9fWNvbnN0IHRzPSJiYXRjaElkIixJaT1uZXcgSWUsVnA9bmV3IEllLFVTPW5ldyBJZSxIcD1uZXcgSWUsemg9bmV3IHFzLERvPW5ldyBEdCxlcj1uZXcgR3QsZWE9bmV3IFAsa2g9bmV3IElTLFd0PW5ldyBMdCxObz1bXTtmdW5jdGlvbiBEUyhyLGUsdD0wKXtjb25zdCBuPWUuaXRlbVNpemU7aWYoci5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfHxyLmFycmF5LmNvbnN0cnVjdG9yIT09ZS5hcnJheS5jb25zdHJ1Y3Rvcil7Y29uc3QgaT1yLmNvdW50O2ZvcihsZXQgcz0wO3M8aTtzKyspZm9yKGxldCBhPTA7YTxuO2ErKyllLnNldENvbXBvbmVudChzK3QsYSxyLmdldENvbXBvbmVudChzLGEpKX1lbHNlIGUuYXJyYXkuc2V0KHIuYXJyYXksdCpuKTtlLm5lZWRzVXBkYXRlPSEwfWNsYXNzIFdwIGV4dGVuZHMgTHR7Z2V0IG1heEdlb21ldHJ5Q291bnQoKXtyZXR1cm4gdGhpcy5fbWF4R2VvbWV0cnlDb3VudH1jb25zdHJ1Y3RvcihlLHQsbj10KjIsaSl7c3VwZXIobmV3IGtlLGkpLHRoaXMuaXNCYXRjaGVkTWVzaD0hMCx0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQ9ITAsdGhpcy5zb3J0T2JqZWN0cz0hMCx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsLHRoaXMuY3VzdG9tU29ydD1udWxsLHRoaXMuX2RyYXdSYW5nZXM9W10sdGhpcy5fcmVzZXJ2ZWRSYW5nZXM9W10sdGhpcy5fdmlzaWJpbGl0eT1bXSx0aGlzLl9hY3RpdmU9W10sdGhpcy5fYm91bmRzPVtdLHRoaXMuX21heEdlb21ldHJ5Q291bnQ9ZSx0aGlzLl9tYXhWZXJ0ZXhDb3VudD10LHRoaXMuX21heEluZGV4Q291bnQ9bix0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkPSExLHRoaXMuX2dlb21ldHJ5Q291bnQ9MCx0aGlzLl9tdWx0aURyYXdDb3VudHM9bmV3IEludDMyQXJyYXkoZSksdGhpcy5fbXVsdGlEcmF3U3RhcnRzPW5ldyBJbnQzMkFycmF5KGUpLHRoaXMuX211bHRpRHJhd0NvdW50PTAsdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQ9ITAsdGhpcy5fbWF0cmljZXNUZXh0dXJlPW51bGwsdGhpcy5faW5pdE1hdHJpY2VzVGV4dHVyZSgpfV9pbml0TWF0cmljZXNUZXh0dXJlKCl7bGV0IGU9TWF0aC5zcXJ0KHRoaXMuX21heEdlb21ldHJ5Q291bnQqNCk7ZT1NYXRoLmNlaWwoZS80KSo0LGU9TWF0aC5tYXgoZSw0KTtjb25zdCB0PW5ldyBGbG9hdDMyQXJyYXkoZSplKjQpLG49bmV3IGppKHQsZSxlLGFuLFJuKTt0aGlzLl9tYXRyaWNlc1RleHR1cmU9bn1faW5pdGlhbGl6ZUdlb21ldHJ5KGUpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeSxuPXRoaXMuX21heFZlcnRleENvdW50LGk9dGhpcy5fbWF4R2VvbWV0cnlDb3VudCxzPXRoaXMuX21heEluZGV4Q291bnQ7aWYodGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZD09PSExKXtmb3IoY29uc3QgbyBpbiBlLmF0dHJpYnV0ZXMpe2NvbnN0IGw9ZS5nZXRBdHRyaWJ1dGUobykse2FycmF5OmMsaXRlbVNpemU6aCxub3JtYWxpemVkOnV9PWwsZj1uZXcgYy5jb25zdHJ1Y3RvcihuKmgpLGQ9bmV3IGwuY29uc3RydWN0b3IoZixoLHUpO2Quc2V0VXNhZ2UobC51c2FnZSksdC5zZXRBdHRyaWJ1dGUobyxkKX1pZihlLmdldEluZGV4KCkhPT1udWxsKXtjb25zdCBvPW4+NjU1MzY/bmV3IFVpbnQzMkFycmF5KHMpOm5ldyBVaW50MTZBcnJheShzKTt0LnNldEluZGV4KG5ldyBLZShvLDEpKX1jb25zdCBhPWk+NjU1MzY/bmV3IFVpbnQzMkFycmF5KG4pOm5ldyBVaW50MTZBcnJheShuKTt0LnNldEF0dHJpYnV0ZSh0cyxuZXcgS2UoYSwxKSksdGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZD0hMH19X3ZhbGlkYXRlR2VvbWV0cnkoZSl7aWYoZS5nZXRBdHRyaWJ1dGUodHMpKXRocm93IG5ldyBFcnJvcihgQmF0Y2hlZE1lc2g6IEdlb21ldHJ5IGNhbm5vdCB1c2UgYXR0cmlidXRlICIke3RzfSJgKTtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYoQm9vbGVhbihlLmdldEluZGV4KCkpIT09Qm9vbGVhbih0LmdldEluZGV4KCkpKXRocm93IG5ldyBFcnJvcignQmF0Y2hlZE1lc2g6IEFsbCBnZW9tZXRyaWVzIG11c3QgY29uc2lzdGVudGx5IGhhdmUgImluZGV4Ii4nKTtmb3IoY29uc3QgbiBpbiB0LmF0dHJpYnV0ZXMpe2lmKG49PT10cyljb250aW51ZTtpZighZS5oYXNBdHRyaWJ1dGUobikpdGhyb3cgbmV3IEVycm9yKGBCYXRjaGVkTWVzaDogQWRkZWQgZ2VvbWV0cnkgbWlzc2luZyAiJHtufSIuIEFsbCBnZW9tZXRyaWVzIG11c3QgaGF2ZSBjb25zaXN0ZW50IGF0dHJpYnV0ZXMuYCk7Y29uc3QgaT1lLmdldEF0dHJpYnV0ZShuKSxzPXQuZ2V0QXR0cmlidXRlKG4pO2lmKGkuaXRlbVNpemUhPT1zLml0ZW1TaXplfHxpLm5vcm1hbGl6ZWQhPT1zLm5vcm1hbGl6ZWQpdGhyb3cgbmV3IEVycm9yKCJCYXRjaGVkTWVzaDogQWxsIGF0dHJpYnV0ZXMgbXVzdCBoYXZlIGEgY29uc2lzdGVudCBpdGVtU2l6ZSBhbmQgbm9ybWFsaXplZCB2YWx1ZS4iKX19c2V0Q3VzdG9tU29ydChlKXtyZXR1cm4gdGhpcy5jdXN0b21Tb3J0PWUsdGhpc31jb21wdXRlQm91bmRpbmdCb3goKXt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IER0KTtjb25zdCBlPXRoaXMuX2dlb21ldHJ5Q291bnQsdD10aGlzLmJvdW5kaW5nQm94LG49dGhpcy5fYWN0aXZlO3QubWFrZUVtcHR5KCk7Zm9yKGxldCBpPTA7aTxlO2krKyluW2ldIT09ITEmJih0aGlzLmdldE1hdHJpeEF0KGksSWkpLHRoaXMuZ2V0Qm91bmRpbmdCb3hBdChpLERvKS5hcHBseU1hdHJpeDQoSWkpLHQudW5pb24oRG8pKX1jb21wdXRlQm91bmRpbmdTcGhlcmUoKXt0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IEd0KTtjb25zdCBlPXRoaXMuX2dlb21ldHJ5Q291bnQsdD10aGlzLmJvdW5kaW5nU3BoZXJlLG49dGhpcy5fYWN0aXZlO3QubWFrZUVtcHR5KCk7Zm9yKGxldCBpPTA7aTxlO2krKyluW2ldIT09ITEmJih0aGlzLmdldE1hdHJpeEF0KGksSWkpLHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdChpLGVyKS5hcHBseU1hdHJpeDQoSWkpLHQudW5pb24oZXIpKX1hZGRHZW9tZXRyeShlLHQ9LTEsbj0tMSl7aWYodGhpcy5faW5pdGlhbGl6ZUdlb21ldHJ5KGUpLHRoaXMuX3ZhbGlkYXRlR2VvbWV0cnkoZSksdGhpcy5fZ2VvbWV0cnlDb3VudD49dGhpcy5fbWF4R2VvbWV0cnlDb3VudCl0aHJvdyBuZXcgRXJyb3IoIkJhdGNoZWRNZXNoOiBNYXhpbXVtIGdlb21ldHJ5IGNvdW50IHJlYWNoZWQuIik7Y29uc3QgaT17dmVydGV4U3RhcnQ6LTEsdmVydGV4Q291bnQ6LTEsaW5kZXhTdGFydDotMSxpbmRleENvdW50Oi0xfTtsZXQgcz1udWxsO2NvbnN0IGE9dGhpcy5fcmVzZXJ2ZWRSYW5nZXMsbz10aGlzLl9kcmF3UmFuZ2VzLGw9dGhpcy5fYm91bmRzO3RoaXMuX2dlb21ldHJ5Q291bnQhPT0wJiYocz1hW2EubGVuZ3RoLTFdKSx0PT09LTE/aS52ZXJ0ZXhDb3VudD1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5jb3VudDppLnZlcnRleENvdW50PXQscz09PW51bGw/aS52ZXJ0ZXhTdGFydD0wOmkudmVydGV4U3RhcnQ9cy52ZXJ0ZXhTdGFydCtzLnZlcnRleENvdW50O2NvbnN0IGM9ZS5nZXRJbmRleCgpLGg9YyE9PW51bGw7aWYoaCYmKG49PT0tMT9pLmluZGV4Q291bnQ9Yy5jb3VudDppLmluZGV4Q291bnQ9bixzPT09bnVsbD9pLmluZGV4U3RhcnQ9MDppLmluZGV4U3RhcnQ9cy5pbmRleFN0YXJ0K3MuaW5kZXhDb3VudCksaS5pbmRleFN0YXJ0IT09LTEmJmkuaW5kZXhTdGFydCtpLmluZGV4Q291bnQ+dGhpcy5fbWF4SW5kZXhDb3VudHx8aS52ZXJ0ZXhTdGFydCtpLnZlcnRleENvdW50PnRoaXMuX21heFZlcnRleENvdW50KXRocm93IG5ldyBFcnJvcigiQmF0Y2hlZE1lc2g6IFJlc2VydmVkIHNwYWNlIHJlcXVlc3QgZXhjZWVkcyB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZS4iKTtjb25zdCB1PXRoaXMuX3Zpc2liaWxpdHksZj10aGlzLl9hY3RpdmUsZD10aGlzLl9tYXRyaWNlc1RleHR1cmUscD10aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YTt1LnB1c2goITApLGYucHVzaCghMCk7Y29uc3QgXz10aGlzLl9nZW9tZXRyeUNvdW50O3RoaXMuX2dlb21ldHJ5Q291bnQrKyxVUy50b0FycmF5KHAsXyoxNiksZC5uZWVkc1VwZGF0ZT0hMCxhLnB1c2goaSksby5wdXNoKHtzdGFydDpoP2kuaW5kZXhTdGFydDppLnZlcnRleFN0YXJ0LGNvdW50Oi0xfSksbC5wdXNoKHtib3hJbml0aWFsaXplZDohMSxib3g6bmV3IER0LHNwaGVyZUluaXRpYWxpemVkOiExLHNwaGVyZTpuZXcgR3R9KTtjb25zdCBnPXRoaXMuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKHRzKTtmb3IobGV0IG09MDttPGkudmVydGV4Q291bnQ7bSsrKWcuc2V0WChpLnZlcnRleFN0YXJ0K20sXyk7cmV0dXJuIGcubmVlZHNVcGRhdGU9ITAsdGhpcy5zZXRHZW9tZXRyeUF0KF8sZSksX31zZXRHZW9tZXRyeUF0KGUsdCl7aWYoZT49dGhpcy5fZ2VvbWV0cnlDb3VudCl0aHJvdyBuZXcgRXJyb3IoIkJhdGNoZWRNZXNoOiBNYXhpbXVtIGdlb21ldHJ5IGNvdW50IHJlYWNoZWQuIik7dGhpcy5fdmFsaWRhdGVHZW9tZXRyeSh0KTtjb25zdCBuPXRoaXMuZ2VvbWV0cnksaT1uLmdldEluZGV4KCkhPT1udWxsLHM9bi5nZXRJbmRleCgpLGE9dC5nZXRJbmRleCgpLG89dGhpcy5fcmVzZXJ2ZWRSYW5nZXNbZV07aWYoaSYmYS5jb3VudD5vLmluZGV4Q291bnR8fHQuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudD5vLnZlcnRleENvdW50KXRocm93IG5ldyBFcnJvcigiQmF0Y2hlZE1lc2g6IFJlc2VydmVkIHNwYWNlIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHByb3ZpZGVkIGdlb21ldHJ5LiIpO2NvbnN0IGw9by52ZXJ0ZXhTdGFydCxjPW8udmVydGV4Q291bnQ7Zm9yKGNvbnN0IGQgaW4gbi5hdHRyaWJ1dGVzKXtpZihkPT09dHMpY29udGludWU7Y29uc3QgcD10LmdldEF0dHJpYnV0ZShkKSxfPW4uZ2V0QXR0cmlidXRlKGQpO0RTKHAsXyxsKTtjb25zdCBnPXAuaXRlbVNpemU7Zm9yKGxldCBtPXAuY291bnQseT1jO208eTttKyspe2NvbnN0IHg9bCttO2ZvcihsZXQgdj0wO3Y8Zzt2KyspXy5zZXRDb21wb25lbnQoeCx2LDApfV8ubmVlZHNVcGRhdGU9ITB9aWYoaSl7Y29uc3QgZD1vLmluZGV4U3RhcnQ7Zm9yKGxldCBwPTA7cDxhLmNvdW50O3ArKylzLnNldFgoZCtwLGwrYS5nZXRYKHApKTtmb3IobGV0IHA9YS5jb3VudCxfPW8uaW5kZXhDb3VudDtwPF87cCsrKXMuc2V0WChkK3AsbCk7cy5uZWVkc1VwZGF0ZT0hMH1jb25zdCBoPXRoaXMuX2JvdW5kc1tlXTt0LmJvdW5kaW5nQm94IT09bnVsbD8oaC5ib3guY29weSh0LmJvdW5kaW5nQm94KSxoLmJveEluaXRpYWxpemVkPSEwKTpoLmJveEluaXRpYWxpemVkPSExLHQuYm91bmRpbmdTcGhlcmUhPT1udWxsPyhoLnNwaGVyZS5jb3B5KHQuYm91bmRpbmdTcGhlcmUpLGguc3BoZXJlSW5pdGlhbGl6ZWQ9ITApOmguc3BoZXJlSW5pdGlhbGl6ZWQ9ITE7Y29uc3QgdT10aGlzLl9kcmF3UmFuZ2VzW2VdLGY9dC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7cmV0dXJuIHUuY291bnQ9aT9hLmNvdW50OmYuY291bnQsdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQ9ITAsZX1kZWxldGVHZW9tZXRyeShlKXtjb25zdCB0PXRoaXMuX2FjdGl2ZTtyZXR1cm4gZT49dC5sZW5ndGh8fHRbZV09PT0hMT90aGlzOih0W2VdPSExLHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkPSEwLHRoaXMpfWdldEJvdW5kaW5nQm94QXQoZSx0KXtpZih0aGlzLl9hY3RpdmVbZV09PT0hMSlyZXR1cm4gdGhpcztjb25zdCBpPXRoaXMuX2JvdW5kc1tlXSxzPWkuYm94LGE9dGhpcy5nZW9tZXRyeTtpZihpLmJveEluaXRpYWxpemVkPT09ITEpe3MubWFrZUVtcHR5KCk7Y29uc3Qgbz1hLmluZGV4LGw9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGM9dGhpcy5fZHJhd1Jhbmdlc1tlXTtmb3IobGV0IGg9Yy5zdGFydCx1PWMuc3RhcnQrYy5jb3VudDtoPHU7aCsrKXtsZXQgZj1oO28mJihmPW8uZ2V0WChmKSkscy5leHBhbmRCeVBvaW50KGVhLmZyb21CdWZmZXJBdHRyaWJ1dGUobCxmKSl9aS5ib3hJbml0aWFsaXplZD0hMH1yZXR1cm4gdC5jb3B5KHMpLHR9Z2V0Qm91bmRpbmdTcGhlcmVBdChlLHQpe2lmKHRoaXMuX2FjdGl2ZVtlXT09PSExKXJldHVybiB0aGlzO2NvbnN0IGk9dGhpcy5fYm91bmRzW2VdLHM9aS5zcGhlcmUsYT10aGlzLmdlb21ldHJ5O2lmKGkuc3BoZXJlSW5pdGlhbGl6ZWQ9PT0hMSl7cy5tYWtlRW1wdHkoKSx0aGlzLmdldEJvdW5kaW5nQm94QXQoZSxEbyksRG8uZ2V0Q2VudGVyKHMuY2VudGVyKTtjb25zdCBvPWEuaW5kZXgsbD1hLmF0dHJpYnV0ZXMucG9zaXRpb24sYz10aGlzLl9kcmF3UmFuZ2VzW2VdO2xldCBoPTA7Zm9yKGxldCB1PWMuc3RhcnQsZj1jLnN0YXJ0K2MuY291bnQ7dTxmO3UrKyl7bGV0IGQ9dTtvJiYoZD1vLmdldFgoZCkpLGVhLmZyb21CdWZmZXJBdHRyaWJ1dGUobCxkKSxoPU1hdGgubWF4KGgscy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoZWEpKX1zLnJhZGl1cz1NYXRoLnNxcnQoaCksaS5zcGhlcmVJbml0aWFsaXplZD0hMH1yZXR1cm4gdC5jb3B5KHMpLHR9c2V0TWF0cml4QXQoZSx0KXtjb25zdCBuPXRoaXMuX2FjdGl2ZSxpPXRoaXMuX21hdHJpY2VzVGV4dHVyZSxzPXRoaXMuX21hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhLGE9dGhpcy5fZ2VvbWV0cnlDb3VudDtyZXR1cm4gZT49YXx8bltlXT09PSExP3RoaXM6KHQudG9BcnJheShzLGUqMTYpLGkubmVlZHNVcGRhdGU9ITAsdGhpcyl9Z2V0TWF0cml4QXQoZSx0KXtjb25zdCBuPXRoaXMuX2FjdGl2ZSxpPXRoaXMuX21hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhLHM9dGhpcy5fZ2VvbWV0cnlDb3VudDtyZXR1cm4gZT49c3x8bltlXT09PSExP251bGw6dC5mcm9tQXJyYXkoaSxlKjE2KX1zZXRWaXNpYmxlQXQoZSx0KXtjb25zdCBuPXRoaXMuX3Zpc2liaWxpdHksaT10aGlzLl9hY3RpdmUscz10aGlzLl9nZW9tZXRyeUNvdW50O3JldHVybiBlPj1zfHxpW2VdPT09ITF8fG5bZV09PT10P3RoaXM6KG5bZV09dCx0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZD0hMCx0aGlzKX1nZXRWaXNpYmxlQXQoZSl7Y29uc3QgdD10aGlzLl92aXNpYmlsaXR5LG49dGhpcy5fYWN0aXZlLGk9dGhpcy5fZ2VvbWV0cnlDb3VudDtyZXR1cm4gZT49aXx8bltlXT09PSExPyExOnRbZV19cmF5Y2FzdChlLHQpe2NvbnN0IG49dGhpcy5fdmlzaWJpbGl0eSxpPXRoaXMuX2FjdGl2ZSxzPXRoaXMuX2RyYXdSYW5nZXMsYT10aGlzLl9nZW9tZXRyeUNvdW50LG89dGhpcy5tYXRyaXhXb3JsZCxsPXRoaXMuZ2VvbWV0cnk7V3QubWF0ZXJpYWw9dGhpcy5tYXRlcmlhbCxXdC5nZW9tZXRyeS5pbmRleD1sLmluZGV4LFd0Lmdlb21ldHJ5LmF0dHJpYnV0ZXM9bC5hdHRyaWJ1dGVzLFd0Lmdlb21ldHJ5LmJvdW5kaW5nQm94PT09bnVsbCYmKFd0Lmdlb21ldHJ5LmJvdW5kaW5nQm94PW5ldyBEdCksV3QuZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYoV3QuZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmU9bmV3IEd0KTtmb3IobGV0IGM9MDtjPGE7YysrKXtpZighbltjXXx8IWlbY10pY29udGludWU7Y29uc3QgaD1zW2NdO1d0Lmdlb21ldHJ5LnNldERyYXdSYW5nZShoLnN0YXJ0LGguY291bnQpLHRoaXMuZ2V0TWF0cml4QXQoYyxXdC5tYXRyaXhXb3JsZCkucHJlbXVsdGlwbHkobyksdGhpcy5nZXRCb3VuZGluZ0JveEF0KGMsV3QuZ2VvbWV0cnkuYm91bmRpbmdCb3gpLHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdChjLFd0Lmdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlKSxXdC5yYXljYXN0KGUsTm8pO2ZvcihsZXQgdT0wLGY9Tm8ubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9Tm9bdV07ZC5vYmplY3Q9dGhpcyxkLmJhdGNoSWQ9Yyx0LnB1c2goZCl9Tm8ubGVuZ3RoPTB9V3QubWF0ZXJpYWw9bnVsbCxXdC5nZW9tZXRyeS5pbmRleD1udWxsLFd0Lmdlb21ldHJ5LmF0dHJpYnV0ZXM9e30sV3QuZ2VvbWV0cnkuc2V0RHJhd1JhbmdlKDAsMS8wKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuZ2VvbWV0cnk9ZS5nZW9tZXRyeS5jbG9uZSgpLHRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD1lLnBlck9iamVjdEZydXN0dW1DdWxsZWQsdGhpcy5zb3J0T2JqZWN0cz1lLnNvcnRPYmplY3RzLHRoaXMuYm91bmRpbmdCb3g9ZS5ib3VuZGluZ0JveCE9PW51bGw/ZS5ib3VuZGluZ0JveC5jbG9uZSgpOm51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1lLmJvdW5kaW5nU3BoZXJlIT09bnVsbD9lLmJvdW5kaW5nU3BoZXJlLmNsb25lKCk6bnVsbCx0aGlzLl9kcmF3UmFuZ2VzPWUuX2RyYXdSYW5nZXMubWFwKHQ9PnZyKHt9LHQpKSx0aGlzLl9yZXNlcnZlZFJhbmdlcz1lLl9yZXNlcnZlZFJhbmdlcy5tYXAodD0+dnIoe30sdCkpLHRoaXMuX3Zpc2liaWxpdHk9ZS5fdmlzaWJpbGl0eS5zbGljZSgpLHRoaXMuX2FjdGl2ZT1lLl9hY3RpdmUuc2xpY2UoKSx0aGlzLl9ib3VuZHM9ZS5fYm91bmRzLm1hcCh0PT4oe2JveEluaXRpYWxpemVkOnQuYm94SW5pdGlhbGl6ZWQsYm94OnQuYm94LmNsb25lKCksc3BoZXJlSW5pdGlhbGl6ZWQ6dC5zcGhlcmVJbml0aWFsaXplZCxzcGhlcmU6dC5zcGhlcmUuY2xvbmUoKX0pKSx0aGlzLl9tYXhHZW9tZXRyeUNvdW50PWUuX21heEdlb21ldHJ5Q291bnQsdGhpcy5fbWF4VmVydGV4Q291bnQ9ZS5fbWF4VmVydGV4Q291bnQsdGhpcy5fbWF4SW5kZXhDb3VudD1lLl9tYXhJbmRleENvdW50LHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQ9ZS5fZ2VvbWV0cnlJbml0aWFsaXplZCx0aGlzLl9nZW9tZXRyeUNvdW50PWUuX2dlb21ldHJ5Q291bnQsdGhpcy5fbXVsdGlEcmF3Q291bnRzPWUuX211bHRpRHJhd0NvdW50cy5zbGljZSgpLHRoaXMuX211bHRpRHJhd1N0YXJ0cz1lLl9tdWx0aURyYXdTdGFydHMuc2xpY2UoKSx0aGlzLl9tYXRyaWNlc1RleHR1cmU9ZS5fbWF0cmljZXNUZXh0dXJlLmNsb25lKCksdGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGE9dGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLnNsaWNlKCksdGhpc31kaXNwb3NlKCl7cmV0dXJuIHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMuX21hdHJpY2VzVGV4dHVyZS5kaXNwb3NlKCksdGhpcy5fbWF0cmljZXNUZXh0dXJlPW51bGwsdGhpc31vbkJlZm9yZVJlbmRlcihlLHQsbixpLHMpe2lmKCF0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCYmIXRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCYmIXRoaXMuc29ydE9iamVjdHMpcmV0dXJuO2NvbnN0IGE9aS5nZXRJbmRleCgpLG89YT09PW51bGw/MTphLmFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULGw9dGhpcy5fdmlzaWJpbGl0eSxjPXRoaXMuX211bHRpRHJhd1N0YXJ0cyxoPXRoaXMuX211bHRpRHJhd0NvdW50cyx1PXRoaXMuX2RyYXdSYW5nZXMsZj10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQ7ZiYmKEhwLm11bHRpcGx5TWF0cmljZXMobi5wcm9qZWN0aW9uTWF0cml4LG4ubWF0cml4V29ybGRJbnZlcnNlKS5tdWx0aXBseSh0aGlzLm1hdHJpeFdvcmxkKSx6aC5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChIcCxlLmlzV2ViR1BVUmVuZGVyZXI/RXI6UG4pKTtsZXQgZD0wO2lmKHRoaXMuc29ydE9iamVjdHMpe1ZwLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksZWEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG4ubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NChWcCk7Zm9yKGxldCBnPTAsbT1sLmxlbmd0aDtnPG07ZysrKWlmKGxbZ10pe3RoaXMuZ2V0TWF0cml4QXQoZyxJaSksdGhpcy5nZXRCb3VuZGluZ1NwaGVyZUF0KGcsZXIpLmFwcGx5TWF0cml4NChJaSk7bGV0IHk9ITE7aWYoZiYmKHk9IXpoLmludGVyc2VjdHNTcGhlcmUoZXIpKSwheSl7Y29uc3QgeD1lYS5kaXN0YW5jZVRvKGVyLmNlbnRlcik7a2gucHVzaCh1W2ddLHgpfX1jb25zdCBwPWtoLmxpc3QsXz10aGlzLmN1c3RvbVNvcnQ7Xz09PW51bGw/cC5zb3J0KHMudHJhbnNwYXJlbnQ/TFM6UFMpOl8uY2FsbCh0aGlzLHAsbik7Zm9yKGxldCBnPTAsbT1wLmxlbmd0aDtnPG07ZysrKXtjb25zdCB5PXBbZ107Y1tkXT15LnN0YXJ0Km8saFtkXT15LmNvdW50LGQrK31raC5yZXNldCgpfWVsc2UgZm9yKGxldCBwPTAsXz1sLmxlbmd0aDtwPF87cCsrKWlmKGxbcF0pe2xldCBnPSExO2lmKGYmJih0aGlzLmdldE1hdHJpeEF0KHAsSWkpLHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdChwLGVyKS5hcHBseU1hdHJpeDQoSWkpLGc9IXpoLmludGVyc2VjdHNTcGhlcmUoZXIpKSwhZyl7Y29uc3QgbT11W3BdO2NbZF09bS5zdGFydCpvLGhbZF09bS5jb3VudCxkKyt9fXRoaXMuX211bHRpRHJhd0NvdW50PWQsdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQ9ITF9b25CZWZvcmVTaGFkb3coZSx0LG4saSxzLGEpe3RoaXMub25CZWZvcmVSZW5kZXIoZSxudWxsLGkscyxhKX19Y2xhc3MgS3QgZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNMaW5lQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5ZSgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpbmV3aWR0aD0xLHRoaXMubGluZWNhcD0icm91bmQiLHRoaXMubGluZWpvaW49InJvdW5kIix0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuY29sb3IuY29weShlLmNvbG9yKSx0aGlzLm1hcD1lLm1hcCx0aGlzLmxpbmV3aWR0aD1lLmxpbmV3aWR0aCx0aGlzLmxpbmVjYXA9ZS5saW5lY2FwLHRoaXMubGluZWpvaW49ZS5saW5lam9pbix0aGlzLmZvZz1lLmZvZyx0aGlzfX1jb25zdCBYcD1uZXcgUCxxcD1uZXcgUCwkcD1uZXcgSWUsR2g9bmV3IFVyLEZvPW5ldyBHdDtjbGFzcyBVaSBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKGU9bmV3IGtlLHQ9bmV3IEt0KXtzdXBlcigpLHRoaXMuaXNMaW5lPSEwLHRoaXMudHlwZT0iTGluZSIsdGhpcy5nZW9tZXRyeT1lLHRoaXMubWF0ZXJpYWw9dCx0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpfWNvcHkoZSx0KXtyZXR1cm4gc3VwZXIuY29weShlLHQpLHRoaXMubWF0ZXJpYWw9QXJyYXkuaXNBcnJheShlLm1hdGVyaWFsKT9lLm1hdGVyaWFsLnNsaWNlKCk6ZS5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PWUuZ2VvbWV0cnksdGhpc31jb21wdXRlTGluZURpc3RhbmNlcygpe2NvbnN0IGU9dGhpcy5nZW9tZXRyeTtpZihlLmluZGV4PT09bnVsbCl7Y29uc3QgdD1lLmF0dHJpYnV0ZXMucG9zaXRpb24sbj1bMF07Zm9yKGxldCBpPTEscz10LmNvdW50O2k8cztpKyspWHAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGktMSkscXAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGkpLG5baV09bltpLTFdLG5baV0rPVhwLmRpc3RhbmNlVG8ocXApO2Uuc2V0QXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBTZShuLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7cmV0dXJuIHRoaXN9cmF5Y2FzdChlLHQpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxpPXRoaXMubWF0cml4V29ybGQscz1lLnBhcmFtcy5MaW5lLnRocmVzaG9sZCxhPW4uZHJhd1JhbmdlO2lmKG4uYm91bmRpbmdTcGhlcmU9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLEZvLmNvcHkobi5ib3VuZGluZ1NwaGVyZSksRm8uYXBwbHlNYXRyaXg0KGkpLEZvLnJhZGl1cys9cyxlLnJheS5pbnRlcnNlY3RzU3BoZXJlKEZvKT09PSExKXJldHVybjskcC5jb3B5KGkpLmludmVydCgpLEdoLmNvcHkoZS5yYXkpLmFwcGx5TWF0cml4NCgkcCk7Y29uc3Qgbz1zLygodGhpcy5zY2FsZS54K3RoaXMuc2NhbGUueSt0aGlzLnNjYWxlLnopLzMpLGw9bypvLGM9bmV3IFAsaD1uZXcgUCx1PW5ldyBQLGY9bmV3IFAsZD10aGlzLmlzTGluZVNlZ21lbnRzPzI6MSxwPW4uaW5kZXgsZz1uLmF0dHJpYnV0ZXMucG9zaXRpb247aWYocCE9PW51bGwpe2NvbnN0IG09TWF0aC5tYXgoMCxhLnN0YXJ0KSx5PU1hdGgubWluKHAuY291bnQsYS5zdGFydCthLmNvdW50KTtmb3IobGV0IHg9bSx2PXktMTt4PHY7eCs9ZCl7Y29uc3QgUz1wLmdldFgoeCksYj1wLmdldFgoeCsxKTtpZihjLmZyb21CdWZmZXJBdHRyaWJ1dGUoZyxTKSxoLmZyb21CdWZmZXJBdHRyaWJ1dGUoZyxiKSxHaC5kaXN0YW5jZVNxVG9TZWdtZW50KGMsaCxmLHUpPmwpY29udGludWU7Zi5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCk7Y29uc3QgTD1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhmKTtMPGUubmVhcnx8TD5lLmZhcnx8dC5wdXNoKHtkaXN0YW5jZTpMLHBvaW50OnUuY2xvbmUoKS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksaW5kZXg6eCxmYWNlOm51bGwsZmFjZUluZGV4Om51bGwsb2JqZWN0OnRoaXN9KX19ZWxzZXtjb25zdCBtPU1hdGgubWF4KDAsYS5zdGFydCkseT1NYXRoLm1pbihnLmNvdW50LGEuc3RhcnQrYS5jb3VudCk7Zm9yKGxldCB4PW0sdj15LTE7eDx2O3grPWQpe2lmKGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShnLHgpLGguZnJvbUJ1ZmZlckF0dHJpYnV0ZShnLHgrMSksR2guZGlzdGFuY2VTcVRvU2VnbWVudChjLGgsZix1KT5sKWNvbnRpbnVlO2YuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpO2NvbnN0IGI9ZS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oZik7YjxlLm5lYXJ8fGI+ZS5mYXJ8fHQucHVzaCh7ZGlzdGFuY2U6Yixwb2ludDp1LmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4OngsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSl9fX11cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXModCk7aWYobi5sZW5ndGg+MCl7Y29uc3QgaT10W25bMF1dO2lmKGkhPT12b2lkIDApe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgcz0wLGE9aS5sZW5ndGg7czxhO3MrKyl7Y29uc3Qgbz1pW3NdLm5hbWV8fFN0cmluZyhzKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W29dPXN9fX19fWNvbnN0IFlwPW5ldyBQLFpwPW5ldyBQO2NsYXNzIFduIGV4dGVuZHMgVWl7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpLHRoaXMuaXNMaW5lU2VnbWVudHM9ITAsdGhpcy50eXBlPSJMaW5lU2VnbWVudHMifWNvbXB1dGVMaW5lRGlzdGFuY2VzKCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5O2lmKGUuaW5kZXg9PT1udWxsKXtjb25zdCB0PWUuYXR0cmlidXRlcy5wb3NpdGlvbixuPVtdO2ZvcihsZXQgaT0wLHM9dC5jb3VudDtpPHM7aSs9MilZcC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsaSksWnAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGkrMSksbltpXT1pPT09MD8wOm5baS0xXSxuW2krMV09bltpXStZcC5kaXN0YW5jZVRvKFpwKTtlLnNldEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIixuZXcgU2UobiwxKSl9ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLkxpbmVTZWdtZW50cy5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7cmV0dXJuIHRoaXN9fWNsYXNzIEpwIGV4dGVuZHMgVWl7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpLHRoaXMuaXNMaW5lTG9vcD0hMCx0aGlzLnR5cGU9IkxpbmVMb29wIn19Y2xhc3MgVmggZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNQb2ludHNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlBvaW50c01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5ZSgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5zaXplPTEsdGhpcy5zaXplQXR0ZW51YXRpb249ITAsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXMoZSl9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLmNvbG9yLmNvcHkoZS5jb2xvciksdGhpcy5tYXA9ZS5tYXAsdGhpcy5hbHBoYU1hcD1lLmFscGhhTWFwLHRoaXMuc2l6ZT1lLnNpemUsdGhpcy5zaXplQXR0ZW51YXRpb249ZS5zaXplQXR0ZW51YXRpb24sdGhpcy5mb2c9ZS5mb2csdGhpc319Y29uc3QgS3A9bmV3IEllLEhoPW5ldyBVcixPbz1uZXcgR3QsQm89bmV3IFA7Y2xhc3MgUXAgZXh0ZW5kcyBydHtjb25zdHJ1Y3RvcihlPW5ldyBrZSx0PW5ldyBWaCl7c3VwZXIoKSx0aGlzLmlzUG9pbnRzPSEwLHRoaXMudHlwZT0iUG9pbnRzIix0aGlzLmdlb21ldHJ5PWUsdGhpcy5tYXRlcmlhbD10LHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9Y29weShlLHQpe3JldHVybiBzdXBlci5jb3B5KGUsdCksdGhpcy5tYXRlcmlhbD1BcnJheS5pc0FycmF5KGUubWF0ZXJpYWwpP2UubWF0ZXJpYWwuc2xpY2UoKTplLm1hdGVyaWFsLHRoaXMuZ2VvbWV0cnk9ZS5nZW9tZXRyeSx0aGlzfXJheWNhc3QoZSx0KXtjb25zdCBuPXRoaXMuZ2VvbWV0cnksaT10aGlzLm1hdHJpeFdvcmxkLHM9ZS5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZCxhPW4uZHJhd1JhbmdlO2lmKG4uYm91bmRpbmdTcGhlcmU9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLE9vLmNvcHkobi5ib3VuZGluZ1NwaGVyZSksT28uYXBwbHlNYXRyaXg0KGkpLE9vLnJhZGl1cys9cyxlLnJheS5pbnRlcnNlY3RzU3BoZXJlKE9vKT09PSExKXJldHVybjtLcC5jb3B5KGkpLmludmVydCgpLEhoLmNvcHkoZS5yYXkpLmFwcGx5TWF0cml4NChLcCk7Y29uc3Qgbz1zLygodGhpcy5zY2FsZS54K3RoaXMuc2NhbGUueSt0aGlzLnNjYWxlLnopLzMpLGw9bypvLGM9bi5pbmRleCx1PW4uYXR0cmlidXRlcy5wb3NpdGlvbjtpZihjIT09bnVsbCl7Y29uc3QgZj1NYXRoLm1heCgwLGEuc3RhcnQpLGQ9TWF0aC5taW4oYy5jb3VudCxhLnN0YXJ0K2EuY291bnQpO2ZvcihsZXQgcD1mLF89ZDtwPF87cCsrKXtjb25zdCBnPWMuZ2V0WChwKTtCby5mcm9tQnVmZmVyQXR0cmlidXRlKHUsZyksanAoQm8sZyxsLGksZSx0LHRoaXMpfX1lbHNle2NvbnN0IGY9TWF0aC5tYXgoMCxhLnN0YXJ0KSxkPU1hdGgubWluKHUuY291bnQsYS5zdGFydCthLmNvdW50KTtmb3IobGV0IHA9ZixfPWQ7cDxfO3ArKylCby5mcm9tQnVmZmVyQXR0cmlidXRlKHUscCksanAoQm8scCxsLGksZSx0LHRoaXMpfX11cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXModCk7aWYobi5sZW5ndGg+MCl7Y29uc3QgaT10W25bMF1dO2lmKGkhPT12b2lkIDApe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgcz0wLGE9aS5sZW5ndGg7czxhO3MrKyl7Y29uc3Qgbz1pW3NdLm5hbWV8fFN0cmluZyhzKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W29dPXN9fX19fWZ1bmN0aW9uIGpwKHIsZSx0LG4saSxzLGEpe2NvbnN0IG89SGguZGlzdGFuY2VTcVRvUG9pbnQocik7aWYobzx0KXtjb25zdCBsPW5ldyBQO0hoLmNsb3Nlc3RQb2ludFRvUG9pbnQocixsKSxsLmFwcGx5TWF0cml4NChuKTtjb25zdCBjPWkucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKGwpO2lmKGM8aS5uZWFyfHxjPmkuZmFyKXJldHVybjtzLnB1c2goe2Rpc3RhbmNlOmMsZGlzdGFuY2VUb1JheTpNYXRoLnNxcnQobykscG9pbnQ6bCxpbmRleDplLGZhY2U6bnVsbCxvYmplY3Q6YX0pfX1jbGFzcyBOUyBleHRlbmRzIEV0e2NvbnN0cnVjdG9yKGUsdCxuLGkscyxhLG8sbCxjKXtzdXBlcihlLHQsbixpLHMsYSxvLGwsYyksdGhpcy5pc1ZpZGVvVGV4dHVyZT0hMCx0aGlzLm1pbkZpbHRlcj1hIT09dm9pZCAwP2E6d3QsdGhpcy5tYWdGaWx0ZXI9cyE9PXZvaWQgMD9zOnd0LHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExO2NvbnN0IGg9dGhpcztmdW5jdGlvbiB1KCl7aC5uZWVkc1VwZGF0ZT0hMCxlLnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2sodSl9InJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2siaW4gZSYmZS5yZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrKHUpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuaW1hZ2UpLmNvcHkodGhpcyl9dXBkYXRlKCl7Y29uc3QgZT10aGlzLmltYWdlOyJyZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrImluIGU9PT0hMSYmZS5yZWFkeVN0YXRlPj1lLkhBVkVfQ1VSUkVOVF9EQVRBJiYodGhpcy5uZWVkc1VwZGF0ZT0hMCl9fWNsYXNzIEZTIGV4dGVuZHMgRXR7Y29uc3RydWN0b3IoZSx0KXtzdXBlcih7d2lkdGg6ZSxoZWlnaHQ6dH0pLHRoaXMuaXNGcmFtZWJ1ZmZlclRleHR1cmU9ITAsdGhpcy5tYWdGaWx0ZXI9YnQsdGhpcy5taW5GaWx0ZXI9YnQsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5uZWVkc1VwZGF0ZT0hMH19Y2xhc3Mgem8gZXh0ZW5kcyBFdHtjb25zdHJ1Y3RvcihlLHQsbixpLHMsYSxvLGwsYyxoLHUsZil7c3VwZXIobnVsbCxhLG8sbCxjLGgsaSxzLHUsZiksdGhpcy5pc0NvbXByZXNzZWRUZXh0dXJlPSEwLHRoaXMuaW1hZ2U9e3dpZHRoOnQsaGVpZ2h0Om59LHRoaXMubWlwbWFwcz1lLHRoaXMuZmxpcFk9ITEsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9fWNsYXNzIE9TIGV4dGVuZHMgem97Y29uc3RydWN0b3IoZSx0LG4saSxzLGEpe3N1cGVyKGUsdCxuLHMsYSksdGhpcy5pc0NvbXByZXNzZWRBcnJheVRleHR1cmU9ITAsdGhpcy5pbWFnZS5kZXB0aD1pLHRoaXMud3JhcFI9enR9fWNsYXNzIEJTIGV4dGVuZHMgem97Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKHZvaWQgMCxlWzBdLndpZHRoLGVbMF0uaGVpZ2h0LHQsbixLbiksdGhpcy5pc0NvbXByZXNzZWRDdWJlVGV4dHVyZT0hMCx0aGlzLmlzQ3ViZVRleHR1cmU9ITAsdGhpcy5pbWFnZT1lfX1jbGFzcyB6UyBleHRlbmRzIEV0e2NvbnN0cnVjdG9yKGUsdCxuLGkscyxhLG8sbCxjKXtzdXBlcihlLHQsbixpLHMsYSxvLGwsYyksdGhpcy5pc0NhbnZhc1RleHR1cmU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMH19Y2xhc3MgRm57Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU9IkN1cnZlIix0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz0yMDB9Z2V0UG9pbnQoKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZTogLmdldFBvaW50KCkgbm90IGltcGxlbWVudGVkLiIpLG51bGx9Z2V0UG9pbnRBdChlLHQpe2NvbnN0IG49dGhpcy5nZXRVdG9UbWFwcGluZyhlKTtyZXR1cm4gdGhpcy5nZXRQb2ludChuLHQpfWdldFBvaW50cyhlPTUpe2NvbnN0IHQ9W107Zm9yKGxldCBuPTA7bjw9ZTtuKyspdC5wdXNoKHRoaXMuZ2V0UG9pbnQobi9lKSk7cmV0dXJuIHR9Z2V0U3BhY2VkUG9pbnRzKGU9NSl7Y29uc3QgdD1bXTtmb3IobGV0IG49MDtuPD1lO24rKyl0LnB1c2godGhpcy5nZXRQb2ludEF0KG4vZSkpO3JldHVybiB0fWdldExlbmd0aCgpe2NvbnN0IGU9dGhpcy5nZXRMZW5ndGhzKCk7cmV0dXJuIGVbZS5sZW5ndGgtMV19Z2V0TGVuZ3RocyhlPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zKXtpZih0aGlzLmNhY2hlQXJjTGVuZ3RocyYmdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoPT09ZSsxJiYhdGhpcy5uZWVkc1VwZGF0ZSlyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7dGhpcy5uZWVkc1VwZGF0ZT0hMTtjb25zdCB0PVtdO2xldCBuLGk9dGhpcy5nZXRQb2ludCgwKSxzPTA7dC5wdXNoKDApO2ZvcihsZXQgYT0xO2E8PWU7YSsrKW49dGhpcy5nZXRQb2ludChhL2UpLHMrPW4uZGlzdGFuY2VUbyhpKSx0LnB1c2gocyksaT1uO3JldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Rocz10LHR9dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5nZXRMZW5ndGhzKCl9Z2V0VXRvVG1hcHBpbmcoZSx0KXtjb25zdCBuPXRoaXMuZ2V0TGVuZ3RocygpO2xldCBpPTA7Y29uc3Qgcz1uLmxlbmd0aDtsZXQgYTt0P2E9dDphPWUqbltzLTFdO2xldCBvPTAsbD1zLTEsYztmb3IoO288PWw7KWlmKGk9TWF0aC5mbG9vcihvKyhsLW8pLzIpLGM9bltpXS1hLGM8MClvPWkrMTtlbHNlIGlmKGM+MClsPWktMTtlbHNle2w9aTticmVha31pZihpPWwsbltpXT09PWEpcmV0dXJuIGkvKHMtMSk7Y29uc3QgaD1uW2ldLGY9bltpKzFdLWgsZD0oYS1oKS9mO3JldHVybihpK2QpLyhzLTEpfWdldFRhbmdlbnQoZSx0KXtsZXQgaT1lLTFlLTQscz1lKzFlLTQ7aTwwJiYoaT0wKSxzPjEmJihzPTEpO2NvbnN0IGE9dGhpcy5nZXRQb2ludChpKSxvPXRoaXMuZ2V0UG9pbnQocyksbD10fHwoYS5pc1ZlY3RvcjI/bmV3IHE6bmV3IFApO3JldHVybiBsLmNvcHkobykuc3ViKGEpLm5vcm1hbGl6ZSgpLGx9Z2V0VGFuZ2VudEF0KGUsdCl7Y29uc3Qgbj10aGlzLmdldFV0b1RtYXBwaW5nKGUpO3JldHVybiB0aGlzLmdldFRhbmdlbnQobix0KX1jb21wdXRlRnJlbmV0RnJhbWVzKGUsdCl7Y29uc3Qgbj1uZXcgUCxpPVtdLHM9W10sYT1bXSxvPW5ldyBQLGw9bmV3IEllO2ZvcihsZXQgZD0wO2Q8PWU7ZCsrKXtjb25zdCBwPWQvZTtpW2RdPXRoaXMuZ2V0VGFuZ2VudEF0KHAsbmV3IFApfXNbMF09bmV3IFAsYVswXT1uZXcgUDtsZXQgYz1OdW1iZXIuTUFYX1ZBTFVFO2NvbnN0IGg9TWF0aC5hYnMoaVswXS54KSx1PU1hdGguYWJzKGlbMF0ueSksZj1NYXRoLmFicyhpWzBdLnopO2g8PWMmJihjPWgsbi5zZXQoMSwwLDApKSx1PD1jJiYoYz11LG4uc2V0KDAsMSwwKSksZjw9YyYmbi5zZXQoMCwwLDEpLG8uY3Jvc3NWZWN0b3JzKGlbMF0sbikubm9ybWFsaXplKCksc1swXS5jcm9zc1ZlY3RvcnMoaVswXSxvKSxhWzBdLmNyb3NzVmVjdG9ycyhpWzBdLHNbMF0pO2ZvcihsZXQgZD0xO2Q8PWU7ZCsrKXtpZihzW2RdPXNbZC0xXS5jbG9uZSgpLGFbZF09YVtkLTFdLmNsb25lKCksby5jcm9zc1ZlY3RvcnMoaVtkLTFdLGlbZF0pLG8ubGVuZ3RoKCk+TnVtYmVyLkVQU0lMT04pe28ubm9ybWFsaXplKCk7Y29uc3QgcD1NYXRoLmFjb3MoX3QoaVtkLTFdLmRvdChpW2RdKSwtMSwxKSk7c1tkXS5hcHBseU1hdHJpeDQobC5tYWtlUm90YXRpb25BeGlzKG8scCkpfWFbZF0uY3Jvc3NWZWN0b3JzKGlbZF0sc1tkXSl9aWYodD09PSEwKXtsZXQgZD1NYXRoLmFjb3MoX3Qoc1swXS5kb3Qoc1tlXSksLTEsMSkpO2QvPWUsaVswXS5kb3Qoby5jcm9zc1ZlY3RvcnMoc1swXSxzW2VdKSk+MCYmKGQ9LWQpO2ZvcihsZXQgcD0xO3A8PWU7cCsrKXNbcF0uYXBwbHlNYXRyaXg0KGwubWFrZVJvdGF0aW9uQXhpcyhpW3BdLGQqcCkpLGFbcF0uY3Jvc3NWZWN0b3JzKGlbcF0sc1twXSl9cmV0dXJue3RhbmdlbnRzOmksbm9ybWFsczpzLGJpbm9ybWFsczphfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weShlKXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9ZS5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc310b0pTT04oKXtjb25zdCBlPXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O3JldHVybiBlLmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyxlLnR5cGU9dGhpcy50eXBlLGV9ZnJvbUpTT04oZSl7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWUuYXJjTGVuZ3RoRGl2aXNpb25zLHRoaXN9fWNsYXNzIGtvIGV4dGVuZHMgRm57Y29uc3RydWN0b3IoZT0wLHQ9MCxuPTEsaT0xLHM9MCxhPU1hdGguUEkqMixvPSExLGw9MCl7c3VwZXIoKSx0aGlzLmlzRWxsaXBzZUN1cnZlPSEwLHRoaXMudHlwZT0iRWxsaXBzZUN1cnZlIix0aGlzLmFYPWUsdGhpcy5hWT10LHRoaXMueFJhZGl1cz1uLHRoaXMueVJhZGl1cz1pLHRoaXMuYVN0YXJ0QW5nbGU9cyx0aGlzLmFFbmRBbmdsZT1hLHRoaXMuYUNsb2Nrd2lzZT1vLHRoaXMuYVJvdGF0aW9uPWx9Z2V0UG9pbnQoZSx0KXtjb25zdCBuPXR8fG5ldyBxLGk9TWF0aC5QSSoyO2xldCBzPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGU7Y29uc3QgYT1NYXRoLmFicyhzKTxOdW1iZXIuRVBTSUxPTjtmb3IoO3M8MDspcys9aTtmb3IoO3M+aTspcy09aTtzPE51bWJlci5FUFNJTE9OJiYoYT9zPTA6cz1pKSx0aGlzLmFDbG9ja3dpc2U9PT0hMCYmIWEmJihzPT09aT9zPS1pOnM9cy1pKTtjb25zdCBvPXRoaXMuYVN0YXJ0QW5nbGUrZSpzO2xldCBsPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKG8pLGM9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4obyk7aWYodGhpcy5hUm90YXRpb24hPT0wKXtjb25zdCBoPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSx1PU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxmPWwtdGhpcy5hWCxkPWMtdGhpcy5hWTtsPWYqaC1kKnUrdGhpcy5hWCxjPWYqdStkKmgrdGhpcy5hWX1yZXR1cm4gbi5zZXQobCxjKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuYVg9ZS5hWCx0aGlzLmFZPWUuYVksdGhpcy54UmFkaXVzPWUueFJhZGl1cyx0aGlzLnlSYWRpdXM9ZS55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9ZS5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT1lLmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9ZS5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPWUuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgZT1zdXBlci50b0pTT04oKTtyZXR1cm4gZS5hWD10aGlzLmFYLGUuYVk9dGhpcy5hWSxlLnhSYWRpdXM9dGhpcy54UmFkaXVzLGUueVJhZGl1cz10aGlzLnlSYWRpdXMsZS5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLGUuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLGUuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsZS5hUm90YXRpb249dGhpcy5hUm90YXRpb24sZX1mcm9tSlNPTihlKXtyZXR1cm4gc3VwZXIuZnJvbUpTT04oZSksdGhpcy5hWD1lLmFYLHRoaXMuYVk9ZS5hWSx0aGlzLnhSYWRpdXM9ZS54UmFkaXVzLHRoaXMueVJhZGl1cz1lLnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT1lLmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPWUuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT1lLmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249ZS5hUm90YXRpb24sdGhpc319Y2xhc3MgZW0gZXh0ZW5kcyBrb3tjb25zdHJ1Y3RvcihlLHQsbixpLHMsYSl7c3VwZXIoZSx0LG4sbixpLHMsYSksdGhpcy5pc0FyY0N1cnZlPSEwLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiBXaCgpe2xldCByPTAsZT0wLHQ9MCxuPTA7ZnVuY3Rpb24gaShzLGEsbyxsKXtyPXMsZT1vLHQ9LTMqcyszKmEtMipvLWwsbj0yKnMtMiphK28rbH1yZXR1cm57aW5pdENhdG11bGxSb206ZnVuY3Rpb24ocyxhLG8sbCxjKXtpKGEsbyxjKihvLXMpLGMqKGwtYSkpfSxpbml0Tm9udW5pZm9ybUNhdG11bGxSb206ZnVuY3Rpb24ocyxhLG8sbCxjLGgsdSl7bGV0IGY9KGEtcykvYy0oby1zKS8oYytoKSsoby1hKS9oLGQ9KG8tYSkvaC0obC1hKS8oaCt1KSsobC1vKS91O2YqPWgsZCo9aCxpKGEsbyxmLGQpfSxjYWxjOmZ1bmN0aW9uKHMpe2NvbnN0IGE9cypzLG89YSpzO3JldHVybiByK2Uqcyt0KmErbipvfX19Y29uc3QgR289bmV3IFAsWGg9bmV3IFdoLHFoPW5ldyBXaCwkaD1uZXcgV2g7Y2xhc3MgdG0gZXh0ZW5kcyBGbntjb25zdHJ1Y3RvcihlPVtdLHQ9ITEsbj0iY2VudHJpcGV0YWwiLGk9LjUpe3N1cGVyKCksdGhpcy5pc0NhdG11bGxSb21DdXJ2ZTM9ITAsdGhpcy50eXBlPSJDYXRtdWxsUm9tQ3VydmUzIix0aGlzLnBvaW50cz1lLHRoaXMuY2xvc2VkPXQsdGhpcy5jdXJ2ZVR5cGU9bix0aGlzLnRlbnNpb249aX1nZXRQb2ludChlLHQ9bmV3IFApe2NvbnN0IG49dCxpPXRoaXMucG9pbnRzLHM9aS5sZW5ndGgsYT0ocy0odGhpcy5jbG9zZWQ/MDoxKSkqZTtsZXQgbz1NYXRoLmZsb29yKGEpLGw9YS1vO3RoaXMuY2xvc2VkP28rPW8+MD8wOihNYXRoLmZsb29yKE1hdGguYWJzKG8pL3MpKzEpKnM6bD09PTAmJm89PT1zLTEmJihvPXMtMixsPTEpO2xldCBjLGg7dGhpcy5jbG9zZWR8fG8+MD9jPWlbKG8tMSklc106KEdvLnN1YlZlY3RvcnMoaVswXSxpWzFdKS5hZGQoaVswXSksYz1Hbyk7Y29uc3QgdT1pW28lc10sZj1pWyhvKzEpJXNdO2lmKHRoaXMuY2xvc2VkfHxvKzI8cz9oPWlbKG8rMiklc106KEdvLnN1YlZlY3RvcnMoaVtzLTFdLGlbcy0yXSkuYWRkKGlbcy0xXSksaD1HbyksdGhpcy5jdXJ2ZVR5cGU9PT0iY2VudHJpcGV0YWwifHx0aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIil7Y29uc3QgZD10aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIj8uNTouMjU7bGV0IHA9TWF0aC5wb3coYy5kaXN0YW5jZVRvU3F1YXJlZCh1KSxkKSxfPU1hdGgucG93KHUuZGlzdGFuY2VUb1NxdWFyZWQoZiksZCksZz1NYXRoLnBvdyhmLmRpc3RhbmNlVG9TcXVhcmVkKGgpLGQpO188MWUtNCYmKF89MSkscDwxZS00JiYocD1fKSxnPDFlLTQmJihnPV8pLFhoLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShjLngsdS54LGYueCxoLngscCxfLGcpLHFoLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShjLnksdS55LGYueSxoLnkscCxfLGcpLCRoLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShjLnosdS56LGYueixoLnoscCxfLGcpfWVsc2UgdGhpcy5jdXJ2ZVR5cGU9PT0iY2F0bXVsbHJvbSImJihYaC5pbml0Q2F0bXVsbFJvbShjLngsdS54LGYueCxoLngsdGhpcy50ZW5zaW9uKSxxaC5pbml0Q2F0bXVsbFJvbShjLnksdS55LGYueSxoLnksdGhpcy50ZW5zaW9uKSwkaC5pbml0Q2F0bXVsbFJvbShjLnosdS56LGYueixoLnosdGhpcy50ZW5zaW9uKSk7cmV0dXJuIG4uc2V0KFhoLmNhbGMobCkscWguY2FsYyhsKSwkaC5jYWxjKGwpKSxufWNvcHkoZSl7c3VwZXIuY29weShlKSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IHQ9MCxuPWUucG9pbnRzLmxlbmd0aDt0PG47dCsrKXtjb25zdCBpPWUucG9pbnRzW3RdO3RoaXMucG9pbnRzLnB1c2goaS5jbG9uZSgpKX1yZXR1cm4gdGhpcy5jbG9zZWQ9ZS5jbG9zZWQsdGhpcy5jdXJ2ZVR5cGU9ZS5jdXJ2ZVR5cGUsdGhpcy50ZW5zaW9uPWUudGVuc2lvbix0aGlzfXRvSlNPTigpe2NvbnN0IGU9c3VwZXIudG9KU09OKCk7ZS5wb2ludHM9W107Zm9yKGxldCB0PTAsbj10aGlzLnBvaW50cy5sZW5ndGg7dDxuO3QrKyl7Y29uc3QgaT10aGlzLnBvaW50c1t0XTtlLnBvaW50cy5wdXNoKGkudG9BcnJheSgpKX1yZXR1cm4gZS5jbG9zZWQ9dGhpcy5jbG9zZWQsZS5jdXJ2ZVR5cGU9dGhpcy5jdXJ2ZVR5cGUsZS50ZW5zaW9uPXRoaXMudGVuc2lvbixlfWZyb21KU09OKGUpe3N1cGVyLmZyb21KU09OKGUpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgdD0wLG49ZS5wb2ludHMubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IGk9ZS5wb2ludHNbdF07dGhpcy5wb2ludHMucHVzaChuZXcgUCgpLmZyb21BcnJheShpKSl9cmV0dXJuIHRoaXMuY2xvc2VkPWUuY2xvc2VkLHRoaXMuY3VydmVUeXBlPWUuY3VydmVUeXBlLHRoaXMudGVuc2lvbj1lLnRlbnNpb24sdGhpc319ZnVuY3Rpb24gbm0ocixlLHQsbixpKXtjb25zdCBzPShuLWUpKi41LGE9KGktdCkqLjUsbz1yKnIsbD1yKm87cmV0dXJuKDIqdC0yKm4rcythKSpsKygtMyp0KzMqbi0yKnMtYSkqbytzKnIrdH1mdW5jdGlvbiBrUyhyLGUpe2NvbnN0IHQ9MS1yO3JldHVybiB0KnQqZX1mdW5jdGlvbiBHUyhyLGUpe3JldHVybiAyKigxLXIpKnIqZX1mdW5jdGlvbiBWUyhyLGUpe3JldHVybiByKnIqZX1mdW5jdGlvbiB0YShyLGUsdCxuKXtyZXR1cm4ga1MocixlKStHUyhyLHQpK1ZTKHIsbil9ZnVuY3Rpb24gSFMocixlKXtjb25zdCB0PTEtcjtyZXR1cm4gdCp0KnQqZX1mdW5jdGlvbiBXUyhyLGUpe2NvbnN0IHQ9MS1yO3JldHVybiAzKnQqdCpyKmV9ZnVuY3Rpb24gWFMocixlKXtyZXR1cm4gMyooMS1yKSpyKnIqZX1mdW5jdGlvbiBxUyhyLGUpe3JldHVybiByKnIqciplfWZ1bmN0aW9uIG5hKHIsZSx0LG4saSl7cmV0dXJuIEhTKHIsZSkrV1Mocix0KStYUyhyLG4pK3FTKHIsaSl9Y2xhc3MgWWggZXh0ZW5kcyBGbntjb25zdHJ1Y3RvcihlPW5ldyBxLHQ9bmV3IHEsbj1uZXcgcSxpPW5ldyBxKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlPSEwLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSIsdGhpcy52MD1lLHRoaXMudjE9dCx0aGlzLnYyPW4sdGhpcy52Mz1pfWdldFBvaW50KGUsdD1uZXcgcSl7Y29uc3Qgbj10LGk9dGhpcy52MCxzPXRoaXMudjEsYT10aGlzLnYyLG89dGhpcy52MztyZXR1cm4gbi5zZXQobmEoZSxpLngscy54LGEueCxvLngpLG5hKGUsaS55LHMueSxhLnksby55KSksbn1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMudjAuY29weShlLnYwKSx0aGlzLnYxLmNvcHkoZS52MSksdGhpcy52Mi5jb3B5KGUudjIpLHRoaXMudjMuY29weShlLnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IGU9c3VwZXIudG9KU09OKCk7cmV0dXJuIGUudjA9dGhpcy52MC50b0FycmF5KCksZS52MT10aGlzLnYxLnRvQXJyYXkoKSxlLnYyPXRoaXMudjIudG9BcnJheSgpLGUudjM9dGhpcy52My50b0FycmF5KCksZX1mcm9tSlNPTihlKXtyZXR1cm4gc3VwZXIuZnJvbUpTT04oZSksdGhpcy52MC5mcm9tQXJyYXkoZS52MCksdGhpcy52MS5mcm9tQXJyYXkoZS52MSksdGhpcy52Mi5mcm9tQXJyYXkoZS52MiksdGhpcy52My5mcm9tQXJyYXkoZS52MyksdGhpc319Y2xhc3MgaW0gZXh0ZW5kcyBGbntjb25zdHJ1Y3RvcihlPW5ldyBQLHQ9bmV3IFAsbj1uZXcgUCxpPW5ldyBQKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlMz0hMCx0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIix0aGlzLnYwPWUsdGhpcy52MT10LHRoaXMudjI9bix0aGlzLnYzPWl9Z2V0UG9pbnQoZSx0PW5ldyBQKXtjb25zdCBuPXQsaT10aGlzLnYwLHM9dGhpcy52MSxhPXRoaXMudjIsbz10aGlzLnYzO3JldHVybiBuLnNldChuYShlLGkueCxzLngsYS54LG8ueCksbmEoZSxpLnkscy55LGEueSxvLnkpLG5hKGUsaS56LHMueixhLnosby56KSksbn1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMudjAuY29weShlLnYwKSx0aGlzLnYxLmNvcHkoZS52MSksdGhpcy52Mi5jb3B5KGUudjIpLHRoaXMudjMuY29weShlLnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IGU9c3VwZXIudG9KU09OKCk7cmV0dXJuIGUudjA9dGhpcy52MC50b0FycmF5KCksZS52MT10aGlzLnYxLnRvQXJyYXkoKSxlLnYyPXRoaXMudjIudG9BcnJheSgpLGUudjM9dGhpcy52My50b0FycmF5KCksZX1mcm9tSlNPTihlKXtyZXR1cm4gc3VwZXIuZnJvbUpTT04oZSksdGhpcy52MC5mcm9tQXJyYXkoZS52MCksdGhpcy52MS5mcm9tQXJyYXkoZS52MSksdGhpcy52Mi5mcm9tQXJyYXkoZS52MiksdGhpcy52My5mcm9tQXJyYXkoZS52MyksdGhpc319Y2xhc3MgWmggZXh0ZW5kcyBGbntjb25zdHJ1Y3RvcihlPW5ldyBxLHQ9bmV3IHEpe3N1cGVyKCksdGhpcy5pc0xpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZSIsdGhpcy52MT1lLHRoaXMudjI9dH1nZXRQb2ludChlLHQ9bmV3IHEpe2NvbnN0IG49dDtyZXR1cm4gZT09PTE/bi5jb3B5KHRoaXMudjIpOihuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLG4ubXVsdGlwbHlTY2FsYXIoZSkuYWRkKHRoaXMudjEpKSxufWdldFBvaW50QXQoZSx0KXtyZXR1cm4gdGhpcy5nZXRQb2ludChlLHQpfWdldFRhbmdlbnQoZSx0PW5ldyBxKXtyZXR1cm4gdC5zdWJWZWN0b3JzKHRoaXMudjIsdGhpcy52MSkubm9ybWFsaXplKCl9Z2V0VGFuZ2VudEF0KGUsdCl7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChlLHQpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy52MS5jb3B5KGUudjEpLHRoaXMudjIuY29weShlLnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IGU9c3VwZXIudG9KU09OKCk7cmV0dXJuIGUudjE9dGhpcy52MS50b0FycmF5KCksZS52Mj10aGlzLnYyLnRvQXJyYXkoKSxlfWZyb21KU09OKGUpe3JldHVybiBzdXBlci5mcm9tSlNPTihlKSx0aGlzLnYxLmZyb21BcnJheShlLnYxKSx0aGlzLnYyLmZyb21BcnJheShlLnYyKSx0aGlzfX1jbGFzcyBybSBleHRlbmRzIEZue2NvbnN0cnVjdG9yKGU9bmV3IFAsdD1uZXcgUCl7c3VwZXIoKSx0aGlzLmlzTGluZUN1cnZlMz0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiLHRoaXMudjE9ZSx0aGlzLnYyPXR9Z2V0UG9pbnQoZSx0PW5ldyBQKXtjb25zdCBuPXQ7cmV0dXJuIGU9PT0xP24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKGUpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KGUsdCl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoZSx0KX1nZXRUYW5nZW50KGUsdD1uZXcgUCl7cmV0dXJuIHQuc3ViVmVjdG9ycyh0aGlzLnYyLHRoaXMudjEpLm5vcm1hbGl6ZSgpfWdldFRhbmdlbnRBdChlLHQpe3JldHVybiB0aGlzLmdldFRhbmdlbnQoZSx0KX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMudjEuY29weShlLnYxKSx0aGlzLnYyLmNvcHkoZS52MiksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO3JldHVybiBlLnYxPXRoaXMudjEudG9BcnJheSgpLGUudjI9dGhpcy52Mi50b0FycmF5KCksZX1mcm9tSlNPTihlKXtyZXR1cm4gc3VwZXIuZnJvbUpTT04oZSksdGhpcy52MS5mcm9tQXJyYXkoZS52MSksdGhpcy52Mi5mcm9tQXJyYXkoZS52MiksdGhpc319Y2xhc3MgSmggZXh0ZW5kcyBGbntjb25zdHJ1Y3RvcihlPW5ldyBxLHQ9bmV3IHEsbj1uZXcgcSl7c3VwZXIoKSx0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZSIsdGhpcy52MD1lLHRoaXMudjE9dCx0aGlzLnYyPW59Z2V0UG9pbnQoZSx0PW5ldyBxKXtjb25zdCBuPXQsaT10aGlzLnYwLHM9dGhpcy52MSxhPXRoaXMudjI7cmV0dXJuIG4uc2V0KHRhKGUsaS54LHMueCxhLngpLHRhKGUsaS55LHMueSxhLnkpKSxufWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy52MC5jb3B5KGUudjApLHRoaXMudjEuY29weShlLnYxKSx0aGlzLnYyLmNvcHkoZS52MiksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO3JldHVybiBlLnYwPXRoaXMudjAudG9BcnJheSgpLGUudjE9dGhpcy52MS50b0FycmF5KCksZS52Mj10aGlzLnYyLnRvQXJyYXkoKSxlfWZyb21KU09OKGUpe3JldHVybiBzdXBlci5mcm9tSlNPTihlKSx0aGlzLnYwLmZyb21BcnJheShlLnYwKSx0aGlzLnYxLmZyb21BcnJheShlLnYxKSx0aGlzLnYyLmZyb21BcnJheShlLnYyKSx0aGlzfX1jbGFzcyBLaCBleHRlbmRzIEZue2NvbnN0cnVjdG9yKGU9bmV3IFAsdD1uZXcgUCxuPW5ldyBQKXtzdXBlcigpLHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9ZSx0aGlzLnYxPXQsdGhpcy52Mj1ufWdldFBvaW50KGUsdD1uZXcgUCl7Y29uc3Qgbj10LGk9dGhpcy52MCxzPXRoaXMudjEsYT10aGlzLnYyO3JldHVybiBuLnNldCh0YShlLGkueCxzLngsYS54KSx0YShlLGkueSxzLnksYS55KSx0YShlLGkueixzLnosYS56KSksbn1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMudjAuY29weShlLnYwKSx0aGlzLnYxLmNvcHkoZS52MSksdGhpcy52Mi5jb3B5KGUudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgZT1zdXBlci50b0pTT04oKTtyZXR1cm4gZS52MD10aGlzLnYwLnRvQXJyYXkoKSxlLnYxPXRoaXMudjEudG9BcnJheSgpLGUudjI9dGhpcy52Mi50b0FycmF5KCksZX1mcm9tSlNPTihlKXtyZXR1cm4gc3VwZXIuZnJvbUpTT04oZSksdGhpcy52MC5mcm9tQXJyYXkoZS52MCksdGhpcy52MS5mcm9tQXJyYXkoZS52MSksdGhpcy52Mi5mcm9tQXJyYXkoZS52MiksdGhpc319Y2xhc3MgUWggZXh0ZW5kcyBGbntjb25zdHJ1Y3RvcihlPVtdKXtzdXBlcigpLHRoaXMuaXNTcGxpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IlNwbGluZUN1cnZlIix0aGlzLnBvaW50cz1lfWdldFBvaW50KGUsdD1uZXcgcSl7Y29uc3Qgbj10LGk9dGhpcy5wb2ludHMscz0oaS5sZW5ndGgtMSkqZSxhPU1hdGguZmxvb3Iocyksbz1zLWEsbD1pW2E9PT0wP2E6YS0xXSxjPWlbYV0saD1pW2E+aS5sZW5ndGgtMj9pLmxlbmd0aC0xOmErMV0sdT1pW2E+aS5sZW5ndGgtMz9pLmxlbmd0aC0xOmErMl07cmV0dXJuIG4uc2V0KG5tKG8sbC54LGMueCxoLngsdS54KSxubShvLGwueSxjLnksaC55LHUueSkpLG59Y29weShlKXtzdXBlci5jb3B5KGUpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgdD0wLG49ZS5wb2ludHMubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IGk9ZS5wb2ludHNbdF07dGhpcy5wb2ludHMucHVzaChpLmNsb25lKCkpfXJldHVybiB0aGlzfXRvSlNPTigpe2NvbnN0IGU9c3VwZXIudG9KU09OKCk7ZS5wb2ludHM9W107Zm9yKGxldCB0PTAsbj10aGlzLnBvaW50cy5sZW5ndGg7dDxuO3QrKyl7Y29uc3QgaT10aGlzLnBvaW50c1t0XTtlLnBvaW50cy5wdXNoKGkudG9BcnJheSgpKX1yZXR1cm4gZX1mcm9tSlNPTihlKXtzdXBlci5mcm9tSlNPTihlKSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IHQ9MCxuPWUucG9pbnRzLmxlbmd0aDt0PG47dCsrKXtjb25zdCBpPWUucG9pbnRzW3RdO3RoaXMucG9pbnRzLnB1c2gobmV3IHEoKS5mcm9tQXJyYXkoaSkpfXJldHVybiB0aGlzfX12YXIgVm89T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6ZW0sQ2F0bXVsbFJvbUN1cnZlMzp0bSxDdWJpY0JlemllckN1cnZlOlloLEN1YmljQmV6aWVyQ3VydmUzOmltLEVsbGlwc2VDdXJ2ZTprbyxMaW5lQ3VydmU6WmgsTGluZUN1cnZlMzpybSxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpKaCxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6S2gsU3BsaW5lQ3VydmU6UWh9KTtjbGFzcyBzbSBleHRlbmRzIEZue2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkN1cnZlUGF0aCIsdGhpcy5jdXJ2ZXM9W10sdGhpcy5hdXRvQ2xvc2U9ITF9YWRkKGUpe3RoaXMuY3VydmVzLnB1c2goZSl9Y2xvc2VQYXRoKCl7Y29uc3QgZT10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSx0PXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTtpZighZS5lcXVhbHModCkpe2NvbnN0IG49ZS5pc1ZlY3RvcjI9PT0hMD8iTGluZUN1cnZlIjoiTGluZUN1cnZlMyI7dGhpcy5jdXJ2ZXMucHVzaChuZXcgVm9bbl0odCxlKSl9cmV0dXJuIHRoaXN9Z2V0UG9pbnQoZSx0KXtjb25zdCBuPWUqdGhpcy5nZXRMZW5ndGgoKSxpPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7bGV0IHM9MDtmb3IoO3M8aS5sZW5ndGg7KXtpZihpW3NdPj1uKXtjb25zdCBhPWlbc10tbixvPXRoaXMuY3VydmVzW3NdLGw9by5nZXRMZW5ndGgoKSxjPWw9PT0wPzA6MS1hL2w7cmV0dXJuIG8uZ2V0UG9pbnRBdChjLHQpfXMrK31yZXR1cm4gbnVsbH1nZXRMZW5ndGgoKXtjb25zdCBlPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIGVbZS5sZW5ndGgtMV19dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5jYWNoZUxlbmd0aHM9bnVsbCx0aGlzLmdldEN1cnZlTGVuZ3RocygpfWdldEN1cnZlTGVuZ3Rocygpe2lmKHRoaXMuY2FjaGVMZW5ndGhzJiZ0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGg9PT10aGlzLmN1cnZlcy5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO2NvbnN0IGU9W107bGV0IHQ9MDtmb3IobGV0IG49MCxpPXRoaXMuY3VydmVzLmxlbmd0aDtuPGk7bisrKXQrPXRoaXMuY3VydmVzW25dLmdldExlbmd0aCgpLGUucHVzaCh0KTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9ZSxlfWdldFNwYWNlZFBvaW50cyhlPTQwKXtjb25zdCB0PVtdO2ZvcihsZXQgbj0wO248PWU7bisrKXQucHVzaCh0aGlzLmdldFBvaW50KG4vZSkpO3JldHVybiB0aGlzLmF1dG9DbG9zZSYmdC5wdXNoKHRbMF0pLHR9Z2V0UG9pbnRzKGU9MTIpe2NvbnN0IHQ9W107bGV0IG47Zm9yKGxldCBpPTAscz10aGlzLmN1cnZlcztpPHMubGVuZ3RoO2krKyl7Y29uc3QgYT1zW2ldLG89YS5pc0VsbGlwc2VDdXJ2ZT9lKjI6YS5pc0xpbmVDdXJ2ZXx8YS5pc0xpbmVDdXJ2ZTM/MTphLmlzU3BsaW5lQ3VydmU/ZSphLnBvaW50cy5sZW5ndGg6ZSxsPWEuZ2V0UG9pbnRzKG8pO2ZvcihsZXQgYz0wO2M8bC5sZW5ndGg7YysrKXtjb25zdCBoPWxbY107biYmbi5lcXVhbHMoaCl8fCh0LnB1c2goaCksbj1oKX19cmV0dXJuIHRoaXMuYXV0b0Nsb3NlJiZ0Lmxlbmd0aD4xJiYhdFt0Lmxlbmd0aC0xXS5lcXVhbHModFswXSkmJnQucHVzaCh0WzBdKSx0fWNvcHkoZSl7c3VwZXIuY29weShlKSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IHQ9MCxuPWUuY3VydmVzLmxlbmd0aDt0PG47dCsrKXtjb25zdCBpPWUuY3VydmVzW3RdO3RoaXMuY3VydmVzLnB1c2goaS5jbG9uZSgpKX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2U9ZS5hdXRvQ2xvc2UsdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO2UuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlLGUuY3VydmVzPVtdO2ZvcihsZXQgdD0wLG49dGhpcy5jdXJ2ZXMubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IGk9dGhpcy5jdXJ2ZXNbdF07ZS5jdXJ2ZXMucHVzaChpLnRvSlNPTigpKX1yZXR1cm4gZX1mcm9tSlNPTihlKXtzdXBlci5mcm9tSlNPTihlKSx0aGlzLmF1dG9DbG9zZT1lLmF1dG9DbG9zZSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IHQ9MCxuPWUuY3VydmVzLmxlbmd0aDt0PG47dCsrKXtjb25zdCBpPWUuY3VydmVzW3RdO3RoaXMuY3VydmVzLnB1c2gobmV3IFZvW2kudHlwZV0oKS5mcm9tSlNPTihpKSl9cmV0dXJuIHRoaXN9fWxldCBpYT1jbGFzcyBleHRlbmRzIHNte2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy50eXBlPSJQYXRoIix0aGlzLmN1cnJlbnRQb2ludD1uZXcgcSxlJiZ0aGlzLnNldEZyb21Qb2ludHMoZSl9c2V0RnJvbVBvaW50cyhlKXt0aGlzLm1vdmVUbyhlWzBdLngsZVswXS55KTtmb3IobGV0IHQ9MSxuPWUubGVuZ3RoO3Q8bjt0KyspdGhpcy5saW5lVG8oZVt0XS54LGVbdF0ueSk7cmV0dXJuIHRoaXN9bW92ZVRvKGUsdCl7cmV0dXJuIHRoaXMuY3VycmVudFBvaW50LnNldChlLHQpLHRoaXN9bGluZVRvKGUsdCl7Y29uc3Qgbj1uZXcgWmgodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgcShlLHQpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQoZSx0KSx0aGlzfXF1YWRyYXRpY0N1cnZlVG8oZSx0LG4saSl7Y29uc3Qgcz1uZXcgSmgodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgcShlLHQpLG5ldyBxKG4saSkpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKHMpLHRoaXMuY3VycmVudFBvaW50LnNldChuLGkpLHRoaXN9YmV6aWVyQ3VydmVUbyhlLHQsbixpLHMsYSl7Y29uc3Qgbz1uZXcgWWgodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgcShlLHQpLG5ldyBxKG4saSksbmV3IHEocyxhKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2gobyksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHMsYSksdGhpc31zcGxpbmVUaHJ1KGUpe2NvbnN0IHQ9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdChlKSxuPW5ldyBRaCh0KTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGVbZS5sZW5ndGgtMV0pLHRoaXN9YXJjKGUsdCxuLGkscyxhKXtjb25zdCBvPXRoaXMuY3VycmVudFBvaW50LngsbD10aGlzLmN1cnJlbnRQb2ludC55O3JldHVybiB0aGlzLmFic2FyYyhlK28sdCtsLG4saSxzLGEpLHRoaXN9YWJzYXJjKGUsdCxuLGkscyxhKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKGUsdCxuLG4saSxzLGEpLHRoaXN9ZWxsaXBzZShlLHQsbixpLHMsYSxvLGwpe2NvbnN0IGM9dGhpcy5jdXJyZW50UG9pbnQueCxoPXRoaXMuY3VycmVudFBvaW50Lnk7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZShlK2MsdCtoLG4saSxzLGEsbyxsKSx0aGlzfWFic2VsbGlwc2UoZSx0LG4saSxzLGEsbyxsKXtjb25zdCBjPW5ldyBrbyhlLHQsbixpLHMsYSxvLGwpO2lmKHRoaXMuY3VydmVzLmxlbmd0aD4wKXtjb25zdCB1PWMuZ2V0UG9pbnQoMCk7dS5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyh1LngsdS55KX10aGlzLmN1cnZlcy5wdXNoKGMpO2NvbnN0IGg9Yy5nZXRQb2ludCgxKTtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuY29weShoKSx0aGlzfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5jdXJyZW50UG9pbnQuY29weShlLmN1cnJlbnRQb2ludCksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO3JldHVybiBlLmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCksZX1mcm9tSlNPTihlKXtyZXR1cm4gc3VwZXIuZnJvbUpTT04oZSksdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KGUuY3VycmVudFBvaW50KSx0aGlzfX07Y2xhc3MgcmEgZXh0ZW5kcyBrZXtjb25zdHJ1Y3RvcihlPVtuZXcgcSgwLC0uNSksbmV3IHEoLjUsMCksbmV3IHEoMCwuNSldLHQ9MTIsbj0wLGk9TWF0aC5QSSoyKXtzdXBlcigpLHRoaXMudHlwZT0iTGF0aGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtwb2ludHM6ZSxzZWdtZW50czp0LHBoaVN0YXJ0Om4scGhpTGVuZ3RoOml9LHQ9TWF0aC5mbG9vcih0KSxpPV90KGksMCxNYXRoLlBJKjIpO2NvbnN0IHM9W10sYT1bXSxvPVtdLGw9W10sYz1bXSxoPTEvdCx1PW5ldyBQLGY9bmV3IHEsZD1uZXcgUCxwPW5ldyBQLF89bmV3IFA7bGV0IGc9MCxtPTA7Zm9yKGxldCB5PTA7eTw9ZS5sZW5ndGgtMTt5Kyspc3dpdGNoKHkpe2Nhc2UgMDpnPWVbeSsxXS54LWVbeV0ueCxtPWVbeSsxXS55LWVbeV0ueSxkLng9bSoxLGQueT0tZyxkLno9bSowLF8uY29weShkKSxkLm5vcm1hbGl6ZSgpLGwucHVzaChkLngsZC55LGQueik7YnJlYWs7Y2FzZSBlLmxlbmd0aC0xOmwucHVzaChfLngsXy55LF8ueik7YnJlYWs7ZGVmYXVsdDpnPWVbeSsxXS54LWVbeV0ueCxtPWVbeSsxXS55LWVbeV0ueSxkLng9bSoxLGQueT0tZyxkLno9bSowLHAuY29weShkKSxkLngrPV8ueCxkLnkrPV8ueSxkLnorPV8ueixkLm5vcm1hbGl6ZSgpLGwucHVzaChkLngsZC55LGQueiksXy5jb3B5KHApfWZvcihsZXQgeT0wO3k8PXQ7eSsrKXtjb25zdCB4PW4reSpoKmksdj1NYXRoLnNpbih4KSxTPU1hdGguY29zKHgpO2ZvcihsZXQgYj0wO2I8PWUubGVuZ3RoLTE7YisrKXt1Lng9ZVtiXS54KnYsdS55PWVbYl0ueSx1Lno9ZVtiXS54KlMsYS5wdXNoKHUueCx1LnksdS56KSxmLng9eS90LGYueT1iLyhlLmxlbmd0aC0xKSxvLnB1c2goZi54LGYueSk7Y29uc3QgQT1sWzMqYiswXSp2LEw9bFszKmIrMV0sTT1sWzMqYiswXSpTO2MucHVzaChBLEwsTSl9fWZvcihsZXQgeT0wO3k8dDt5KyspZm9yKGxldCB4PTA7eDxlLmxlbmd0aC0xO3grKyl7Y29uc3Qgdj14K3kqZS5sZW5ndGgsUz12LGI9ditlLmxlbmd0aCxBPXYrZS5sZW5ndGgrMSxMPXYrMTtzLnB1c2goUyxiLEwpLHMucHVzaChBLEwsYil9dGhpcy5zZXRJbmRleChzKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShhLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBTZShvLDIpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgU2UoYywzKSl9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSxlLnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKGUpe3JldHVybiBuZXcgcmEoZS5wb2ludHMsZS5zZWdtZW50cyxlLnBoaVN0YXJ0LGUucGhpTGVuZ3RoKX19Y2xhc3MgSG8gZXh0ZW5kcyByYXtjb25zdHJ1Y3RvcihlPTEsdD0xLG49NCxpPTgpe2NvbnN0IHM9bmV3IGlhO3MuYWJzYXJjKDAsLXQvMixlLE1hdGguUEkqMS41LDApLHMuYWJzYXJjKDAsdC8yLGUsMCxNYXRoLlBJKi41KSxzdXBlcihzLmdldFBvaW50cyhuKSxpKSx0aGlzLnR5cGU9IkNhcHN1bGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6ZSxsZW5ndGg6dCxjYXBTZWdtZW50czpuLHJhZGlhbFNlZ21lbnRzOml9fXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IEhvKGUucmFkaXVzLGUubGVuZ3RoLGUuY2FwU2VnbWVudHMsZS5yYWRpYWxTZWdtZW50cyl9fWNsYXNzIFdvIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT0xLHQ9MzIsbj0wLGk9TWF0aC5QSSoyKXtzdXBlcigpLHRoaXMudHlwZT0iQ2lyY2xlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOmUsc2VnbWVudHM6dCx0aGV0YVN0YXJ0Om4sdGhldGFMZW5ndGg6aX0sdD1NYXRoLm1heCgzLHQpO2NvbnN0IHM9W10sYT1bXSxvPVtdLGw9W10sYz1uZXcgUCxoPW5ldyBxO2EucHVzaCgwLDAsMCksby5wdXNoKDAsMCwxKSxsLnB1c2goLjUsLjUpO2ZvcihsZXQgdT0wLGY9Mzt1PD10O3UrKyxmKz0zKXtjb25zdCBkPW4rdS90Kmk7Yy54PWUqTWF0aC5jb3MoZCksYy55PWUqTWF0aC5zaW4oZCksYS5wdXNoKGMueCxjLnksYy56KSxvLnB1c2goMCwwLDEpLGgueD0oYVtmXS9lKzEpLzIsaC55PShhW2YrMV0vZSsxKS8yLGwucHVzaChoLngsaC55KX1mb3IobGV0IHU9MTt1PD10O3UrKylzLnB1c2godSx1KzEsMCk7dGhpcy5zZXRJbmRleChzKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShhLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgU2UobywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU2UobCwyKSl9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSxlLnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKGUpe3JldHVybiBuZXcgV28oZS5yYWRpdXMsZS5zZWdtZW50cyxlLnRoZXRhU3RhcnQsZS50aGV0YUxlbmd0aCl9fWNsYXNzIG5zIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT0xLHQ9MSxuPTEsaT0zMixzPTEsYT0hMSxvPTAsbD1NYXRoLlBJKjIpe3N1cGVyKCksdGhpcy50eXBlPSJDeWxpbmRlckdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1c1RvcDplLHJhZGl1c0JvdHRvbTp0LGhlaWdodDpuLHJhZGlhbFNlZ21lbnRzOmksaGVpZ2h0U2VnbWVudHM6cyxvcGVuRW5kZWQ6YSx0aGV0YVN0YXJ0Om8sdGhldGFMZW5ndGg6bH07Y29uc3QgYz10aGlzO2k9TWF0aC5mbG9vcihpKSxzPU1hdGguZmxvb3Iocyk7Y29uc3QgaD1bXSx1PVtdLGY9W10sZD1bXTtsZXQgcD0wO2NvbnN0IF89W10sZz1uLzI7bGV0IG09MDt5KCksYT09PSExJiYoZT4wJiZ4KCEwKSx0PjAmJngoITEpKSx0aGlzLnNldEluZGV4KGgpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFNlKHUsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBTZShmLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBTZShkLDIpKTtmdW5jdGlvbiB5KCl7Y29uc3Qgdj1uZXcgUCxTPW5ldyBQO2xldCBiPTA7Y29uc3QgQT0odC1lKS9uO2ZvcihsZXQgTD0wO0w8PXM7TCsrKXtjb25zdCBNPVtdLHc9TC9zLFI9dyoodC1lKStlO2ZvcihsZXQgTj0wO048PWk7TisrKXtjb25zdCBCPU4vaSxJPUIqbCtvLFU9TWF0aC5zaW4oSSksej1NYXRoLmNvcyhJKTtTLng9UipVLFMueT0tdypuK2csUy56PVIqeix1LnB1c2goUy54LFMueSxTLnopLHYuc2V0KFUsQSx6KS5ub3JtYWxpemUoKSxmLnB1c2godi54LHYueSx2LnopLGQucHVzaChCLDEtdyksTS5wdXNoKHArKyl9Xy5wdXNoKE0pfWZvcihsZXQgTD0wO0w8aTtMKyspZm9yKGxldCBNPTA7TTxzO00rKyl7Y29uc3Qgdz1fW01dW0xdLFI9X1tNKzFdW0xdLE49X1tNKzFdW0wrMV0sQj1fW01dW0wrMV07aC5wdXNoKHcsUixCKSxoLnB1c2goUixOLEIpLGIrPTZ9Yy5hZGRHcm91cChtLGIsMCksbSs9Yn1mdW5jdGlvbiB4KHYpe2NvbnN0IFM9cCxiPW5ldyBxLEE9bmV3IFA7bGV0IEw9MDtjb25zdCBNPXY9PT0hMD9lOnQsdz12PT09ITA/MTotMTtmb3IobGV0IE49MTtOPD1pO04rKyl1LnB1c2goMCxnKncsMCksZi5wdXNoKDAsdywwKSxkLnB1c2goLjUsLjUpLHArKztjb25zdCBSPXA7Zm9yKGxldCBOPTA7Tjw9aTtOKyspe2NvbnN0IEk9Ti9pKmwrbyxVPU1hdGguY29zKEkpLHo9TWF0aC5zaW4oSSk7QS54PU0qeixBLnk9Zyp3LEEuej1NKlUsdS5wdXNoKEEueCxBLnksQS56KSxmLnB1c2goMCx3LDApLGIueD1VKi41Ky41LGIueT16Ki41KncrLjUsZC5wdXNoKGIueCxiLnkpLHArK31mb3IobGV0IE49MDtOPGk7TisrKXtjb25zdCBCPVMrTixJPVIrTjt2PT09ITA/aC5wdXNoKEksSSsxLEIpOmgucHVzaChJKzEsSSxCKSxMKz0zfWMuYWRkR3JvdXAobSxMLHY9PT0hMD8xOjIpLG0rPUx9fWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IG5zKGUucmFkaXVzVG9wLGUucmFkaXVzQm90dG9tLGUuaGVpZ2h0LGUucmFkaWFsU2VnbWVudHMsZS5oZWlnaHRTZWdtZW50cyxlLm9wZW5FbmRlZCxlLnRoZXRhU3RhcnQsZS50aGV0YUxlbmd0aCl9fWNsYXNzIFhvIGV4dGVuZHMgbnN7Y29uc3RydWN0b3IoZT0xLHQ9MSxuPTMyLGk9MSxzPSExLGE9MCxvPU1hdGguUEkqMil7c3VwZXIoMCxlLHQsbixpLHMsYSxvKSx0aGlzLnR5cGU9IkNvbmVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6ZSxoZWlnaHQ6dCxyYWRpYWxTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOmksb3BlbkVuZGVkOnMsdGhldGFTdGFydDphLHRoZXRhTGVuZ3RoOm99fXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IFhvKGUucmFkaXVzLGUuaGVpZ2h0LGUucmFkaWFsU2VnbWVudHMsZS5oZWlnaHRTZWdtZW50cyxlLm9wZW5FbmRlZCxlLnRoZXRhU3RhcnQsZS50aGV0YUxlbmd0aCl9fWNsYXNzIERpIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT1bXSx0PVtdLG49MSxpPTApe3N1cGVyKCksdGhpcy50eXBlPSJQb2x5aGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17dmVydGljZXM6ZSxpbmRpY2VzOnQscmFkaXVzOm4sZGV0YWlsOml9O2NvbnN0IHM9W10sYT1bXTtvKGkpLGMobiksaCgpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFNlKHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBTZShzLnNsaWNlKCksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGEsMikpLGk9PT0wP3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTp0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTtmdW5jdGlvbiBvKHkpe2NvbnN0IHg9bmV3IFAsdj1uZXcgUCxTPW5ldyBQO2ZvcihsZXQgYj0wO2I8dC5sZW5ndGg7Yis9MylkKHRbYiswXSx4KSxkKHRbYisxXSx2KSxkKHRbYisyXSxTKSxsKHgsdixTLHkpfWZ1bmN0aW9uIGwoeSx4LHYsUyl7Y29uc3QgYj1TKzEsQT1bXTtmb3IobGV0IEw9MDtMPD1iO0wrKyl7QVtMXT1bXTtjb25zdCBNPXkuY2xvbmUoKS5sZXJwKHYsTC9iKSx3PXguY2xvbmUoKS5sZXJwKHYsTC9iKSxSPWItTDtmb3IobGV0IE49MDtOPD1SO04rKylOPT09MCYmTD09PWI/QVtMXVtOXT1NOkFbTF1bTl09TS5jbG9uZSgpLmxlcnAodyxOL1IpfWZvcihsZXQgTD0wO0w8YjtMKyspZm9yKGxldCBNPTA7TTwyKihiLUwpLTE7TSsrKXtjb25zdCB3PU1hdGguZmxvb3IoTS8yKTtNJTI9PT0wPyhmKEFbTF1bdysxXSksZihBW0wrMV1bd10pLGYoQVtMXVt3XSkpOihmKEFbTF1bdysxXSksZihBW0wrMV1bdysxXSksZihBW0wrMV1bd10pKX19ZnVuY3Rpb24gYyh5KXtjb25zdCB4PW5ldyBQO2ZvcihsZXQgdj0wO3Y8cy5sZW5ndGg7dis9Myl4Lng9c1t2KzBdLHgueT1zW3YrMV0seC56PXNbdisyXSx4Lm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHkpLHNbdiswXT14Lngsc1t2KzFdPXgueSxzW3YrMl09eC56fWZ1bmN0aW9uIGgoKXtjb25zdCB5PW5ldyBQO2ZvcihsZXQgeD0wO3g8cy5sZW5ndGg7eCs9Myl7eS54PXNbeCswXSx5Lnk9c1t4KzFdLHkuej1zW3grMl07Y29uc3Qgdj1nKHkpLzIvTWF0aC5QSSsuNSxTPW0oeSkvTWF0aC5QSSsuNTthLnB1c2godiwxLVMpfXAoKSx1KCl9ZnVuY3Rpb24gdSgpe2ZvcihsZXQgeT0wO3k8YS5sZW5ndGg7eSs9Nil7Y29uc3QgeD1hW3krMF0sdj1hW3krMl0sUz1hW3krNF0sYj1NYXRoLm1heCh4LHYsUyksQT1NYXRoLm1pbih4LHYsUyk7Yj4uOSYmQTwuMSYmKHg8LjImJihhW3krMF0rPTEpLHY8LjImJihhW3krMl0rPTEpLFM8LjImJihhW3krNF0rPTEpKX19ZnVuY3Rpb24gZih5KXtzLnB1c2goeS54LHkueSx5LnopfWZ1bmN0aW9uIGQoeSx4KXtjb25zdCB2PXkqMzt4Lng9ZVt2KzBdLHgueT1lW3YrMV0seC56PWVbdisyXX1mdW5jdGlvbiBwKCl7Y29uc3QgeT1uZXcgUCx4PW5ldyBQLHY9bmV3IFAsUz1uZXcgUCxiPW5ldyBxLEE9bmV3IHEsTD1uZXcgcTtmb3IobGV0IE09MCx3PTA7TTxzLmxlbmd0aDtNKz05LHcrPTYpe3kuc2V0KHNbTSswXSxzW00rMV0sc1tNKzJdKSx4LnNldChzW00rM10sc1tNKzRdLHNbTSs1XSksdi5zZXQoc1tNKzZdLHNbTSs3XSxzW00rOF0pLGIuc2V0KGFbdyswXSxhW3crMV0pLEEuc2V0KGFbdysyXSxhW3crM10pLEwuc2V0KGFbdys0XSxhW3crNV0pLFMuY29weSh5KS5hZGQoeCkuYWRkKHYpLmRpdmlkZVNjYWxhcigzKTtjb25zdCBSPWcoUyk7XyhiLHcrMCx5LFIpLF8oQSx3KzIseCxSKSxfKEwsdys0LHYsUil9fWZ1bmN0aW9uIF8oeSx4LHYsUyl7UzwwJiZ5Lng9PT0xJiYoYVt4XT15LngtMSksdi54PT09MCYmdi56PT09MCYmKGFbeF09Uy8yL01hdGguUEkrLjUpfWZ1bmN0aW9uIGcoeSl7cmV0dXJuIE1hdGguYXRhbjIoeS56LC15LngpfWZ1bmN0aW9uIG0oeSl7cmV0dXJuIE1hdGguYXRhbjIoLXkueSxNYXRoLnNxcnQoeS54KnkueCt5LnoqeS56KSl9fWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IERpKGUudmVydGljZXMsZS5pbmRpY2VzLGUucmFkaXVzLGUuZGV0YWlscyl9fWNsYXNzIHFvIGV4dGVuZHMgRGl7Y29uc3RydWN0b3IoZT0xLHQ9MCl7Y29uc3Qgbj0oMStNYXRoLnNxcnQoNSkpLzIsaT0xL24scz1bLTEsLTEsLTEsLTEsLTEsMSwtMSwxLC0xLC0xLDEsMSwxLC0xLC0xLDEsLTEsMSwxLDEsLTEsMSwxLDEsMCwtaSwtbiwwLC1pLG4sMCxpLC1uLDAsaSxuLC1pLC1uLDAsLWksbiwwLGksLW4sMCxpLG4sMCwtbiwwLC1pLG4sMCwtaSwtbiwwLGksbiwwLGldLGE9WzMsMTEsNywzLDcsMTUsMywxNSwxMyw3LDE5LDE3LDcsMTcsNiw3LDYsMTUsMTcsNCw4LDE3LDgsMTAsMTcsMTAsNiw4LDAsMTYsOCwxNiwyLDgsMiwxMCwwLDEyLDEsMCwxLDE4LDAsMTgsMTYsNiwxMCwyLDYsMiwxMyw2LDEzLDE1LDIsMTYsMTgsMiwxOCwzLDIsMywxMywxOCwxLDksMTgsOSwxMSwxOCwxMSwzLDQsMTQsMTIsNCwxMiwwLDQsMCw4LDExLDksNSwxMSw1LDE5LDExLDE5LDcsMTksNSwxNCwxOSwxNCw0LDE5LDQsMTcsMSwxMiwxNCwxLDE0LDUsMSw1LDldO3N1cGVyKHMsYSxlLHQpLHRoaXMudHlwZT0iRG9kZWNhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOmUsZGV0YWlsOnR9fXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IHFvKGUucmFkaXVzLGUuZGV0YWlsKX19Y29uc3QgJG89bmV3IFAsWW89bmV3IFAsamg9bmV3IFAsWm89bmV3IGNuO2NsYXNzIGFtIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT1udWxsLHQ9MSl7aWYoc3VwZXIoKSx0aGlzLnR5cGU9IkVkZ2VzR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17Z2VvbWV0cnk6ZSx0aHJlc2hvbGRBbmdsZTp0fSxlIT09bnVsbCl7Y29uc3QgaT1NYXRoLnBvdygxMCw0KSxzPU1hdGguY29zKEhpKnQpLGE9ZS5nZXRJbmRleCgpLG89ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksbD1hP2EuY291bnQ6by5jb3VudCxjPVswLDAsMF0saD1bImEiLCJiIiwiYyJdLHU9bmV3IEFycmF5KDMpLGY9e30sZD1bXTtmb3IobGV0IHA9MDtwPGw7cCs9Myl7YT8oY1swXT1hLmdldFgocCksY1sxXT1hLmdldFgocCsxKSxjWzJdPWEuZ2V0WChwKzIpKTooY1swXT1wLGNbMV09cCsxLGNbMl09cCsyKTtjb25zdHthOl8sYjpnLGM6bX09Wm87aWYoXy5mcm9tQnVmZmVyQXR0cmlidXRlKG8sY1swXSksZy5mcm9tQnVmZmVyQXR0cmlidXRlKG8sY1sxXSksbS5mcm9tQnVmZmVyQXR0cmlidXRlKG8sY1syXSksWm8uZ2V0Tm9ybWFsKGpoKSx1WzBdPWAke01hdGgucm91bmQoXy54KmkpfSwke01hdGgucm91bmQoXy55KmkpfSwke01hdGgucm91bmQoXy56KmkpfWAsdVsxXT1gJHtNYXRoLnJvdW5kKGcueCppKX0sJHtNYXRoLnJvdW5kKGcueSppKX0sJHtNYXRoLnJvdW5kKGcueippKX1gLHVbMl09YCR7TWF0aC5yb3VuZChtLngqaSl9LCR7TWF0aC5yb3VuZChtLnkqaSl9LCR7TWF0aC5yb3VuZChtLnoqaSl9YCwhKHVbMF09PT11WzFdfHx1WzFdPT09dVsyXXx8dVsyXT09PXVbMF0pKWZvcihsZXQgeT0wO3k8Mzt5Kyspe2NvbnN0IHg9KHkrMSklMyx2PXVbeV0sUz11W3hdLGI9Wm9baFt5XV0sQT1ab1toW3hdXSxMPWAke3Z9XyR7U31gLE09YCR7U31fJHt2fWA7TSBpbiBmJiZmW01dPyhqaC5kb3QoZltNXS5ub3JtYWwpPD1zJiYoZC5wdXNoKGIueCxiLnksYi56KSxkLnB1c2goQS54LEEueSxBLnopKSxmW01dPW51bGwpOkwgaW4gZnx8KGZbTF09e2luZGV4MDpjW3ldLGluZGV4MTpjW3hdLG5vcm1hbDpqaC5jbG9uZSgpfSl9fWZvcihjb25zdCBwIGluIGYpaWYoZltwXSl7Y29uc3R7aW5kZXgwOl8saW5kZXgxOmd9PWZbcF07JG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLF8pLFlvLmZyb21CdWZmZXJBdHRyaWJ1dGUobyxnKSxkLnB1c2goJG8ueCwkby55LCRvLnopLGQucHVzaChZby54LFlvLnksWW8ueil9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoZCwzKSl9fWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfX1jbGFzcyBvaSBleHRlbmRzIGlhe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMudXVpZD1fbigpLHRoaXMudHlwZT0iU2hhcGUiLHRoaXMuaG9sZXM9W119Z2V0UG9pbnRzSG9sZXMoZSl7Y29uc3QgdD1bXTtmb3IobGV0IG49MCxpPXRoaXMuaG9sZXMubGVuZ3RoO248aTtuKyspdFtuXT10aGlzLmhvbGVzW25dLmdldFBvaW50cyhlKTtyZXR1cm4gdH1leHRyYWN0UG9pbnRzKGUpe3JldHVybntzaGFwZTp0aGlzLmdldFBvaW50cyhlKSxob2xlczp0aGlzLmdldFBvaW50c0hvbGVzKGUpfX1jb3B5KGUpe3N1cGVyLmNvcHkoZSksdGhpcy5ob2xlcz1bXTtmb3IobGV0IHQ9MCxuPWUuaG9sZXMubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IGk9ZS5ob2xlc1t0XTt0aGlzLmhvbGVzLnB1c2goaS5jbG9uZSgpKX1yZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO2UudXVpZD10aGlzLnV1aWQsZS5ob2xlcz1bXTtmb3IobGV0IHQ9MCxuPXRoaXMuaG9sZXMubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IGk9dGhpcy5ob2xlc1t0XTtlLmhvbGVzLnB1c2goaS50b0pTT04oKSl9cmV0dXJuIGV9ZnJvbUpTT04oZSl7c3VwZXIuZnJvbUpTT04oZSksdGhpcy51dWlkPWUudXVpZCx0aGlzLmhvbGVzPVtdO2ZvcihsZXQgdD0wLG49ZS5ob2xlcy5sZW5ndGg7dDxuO3QrKyl7Y29uc3QgaT1lLmhvbGVzW3RdO3RoaXMuaG9sZXMucHVzaChuZXcgaWEoKS5mcm9tSlNPTihpKSl9cmV0dXJuIHRoaXN9fWNvbnN0ICRTPXt0cmlhbmd1bGF0ZTpmdW5jdGlvbihyLGUsdD0yKXtjb25zdCBuPWUmJmUubGVuZ3RoLGk9bj9lWzBdKnQ6ci5sZW5ndGg7bGV0IHM9b20ociwwLGksdCwhMCk7Y29uc3QgYT1bXTtpZighc3x8cy5uZXh0PT09cy5wcmV2KXJldHVybiBhO2xldCBvLGwsYyxoLHUsZixkO2lmKG4mJihzPVFTKHIsZSxzLHQpKSxyLmxlbmd0aD44MCp0KXtvPWM9clswXSxsPWg9clsxXTtmb3IobGV0IHA9dDtwPGk7cCs9dCl1PXJbcF0sZj1yW3ArMV0sdTxvJiYobz11KSxmPGwmJihsPWYpLHU+YyYmKGM9dSksZj5oJiYoaD1mKTtkPU1hdGgubWF4KGMtbyxoLWwpLGQ9ZCE9PTA/MzI3NjcvZDowfXJldHVybiBzYShzLGEsdCxvLGwsZCwwKSxhfX07ZnVuY3Rpb24gb20ocixlLHQsbixpKXtsZXQgcyxhO2lmKGk9PT1jYihyLGUsdCxuKT4wKWZvcihzPWU7czx0O3MrPW4pYT1obShzLHJbc10scltzKzFdLGEpO2Vsc2UgZm9yKHM9dC1uO3M+PWU7cy09bilhPWhtKHMscltzXSxyW3MrMV0sYSk7cmV0dXJuIGEmJkpvKGEsYS5uZXh0KSYmKG9hKGEpLGE9YS5uZXh0KSxhfWZ1bmN0aW9uIHRyKHIsZSl7aWYoIXIpcmV0dXJuIHI7ZXx8KGU9cik7bGV0IHQ9cixuO2RvIGlmKG49ITEsIXQuc3RlaW5lciYmKEpvKHQsdC5uZXh0KXx8ZHQodC5wcmV2LHQsdC5uZXh0KT09PTApKXtpZihvYSh0KSx0PWU9dC5wcmV2LHQ9PT10Lm5leHQpYnJlYWs7bj0hMH1lbHNlIHQ9dC5uZXh0O3doaWxlKG58fHQhPT1lKTtyZXR1cm4gZX1mdW5jdGlvbiBzYShyLGUsdCxuLGkscyxhKXtpZighcilyZXR1cm47IWEmJnMmJmliKHIsbixpLHMpO2xldCBvPXIsbCxjO2Zvcig7ci5wcmV2IT09ci5uZXh0Oyl7aWYobD1yLnByZXYsYz1yLm5leHQscz9aUyhyLG4saSxzKTpZUyhyKSl7ZS5wdXNoKGwuaS90fDApLGUucHVzaChyLmkvdHwwKSxlLnB1c2goYy5pL3R8MCksb2Eocikscj1jLm5leHQsbz1jLm5leHQ7Y29udGludWV9aWYocj1jLHI9PT1vKXthP2E9PT0xPyhyPUpTKHRyKHIpLGUsdCksc2EocixlLHQsbixpLHMsMikpOmE9PT0yJiZLUyhyLGUsdCxuLGkscyk6c2EodHIociksZSx0LG4saSxzLDEpO2JyZWFrfX19ZnVuY3Rpb24gWVMocil7Y29uc3QgZT1yLnByZXYsdD1yLG49ci5uZXh0O2lmKGR0KGUsdCxuKT49MClyZXR1cm4hMTtjb25zdCBpPWUueCxzPXQueCxhPW4ueCxvPWUueSxsPXQueSxjPW4ueSxoPWk8cz9pPGE/aTphOnM8YT9zOmEsdT1vPGw/bzxjP286YzpsPGM/bDpjLGY9aT5zP2k+YT9pOmE6cz5hP3M6YSxkPW8+bD9vPmM/bzpjOmw+Yz9sOmM7bGV0IHA9bi5uZXh0O2Zvcig7cCE9PWU7KXtpZihwLng+PWgmJnAueDw9ZiYmcC55Pj11JiZwLnk8PWQmJmlzKGksbyxzLGwsYSxjLHAueCxwLnkpJiZkdChwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIFpTKHIsZSx0LG4pe2NvbnN0IGk9ci5wcmV2LHM9cixhPXIubmV4dDtpZihkdChpLHMsYSk+PTApcmV0dXJuITE7Y29uc3Qgbz1pLngsbD1zLngsYz1hLngsaD1pLnksdT1zLnksZj1hLnksZD1vPGw/bzxjP286YzpsPGM/bDpjLHA9aDx1P2g8Zj9oOmY6dTxmP3U6ZixfPW8+bD9vPmM/bzpjOmw+Yz9sOmMsZz1oPnU/aD5mP2g6Zjp1PmY/dTpmLG09ZXUoZCxwLGUsdCxuKSx5PWV1KF8sZyxlLHQsbik7bGV0IHg9ci5wcmV2Wix2PXIubmV4dFo7Zm9yKDt4JiZ4Lno+PW0mJnYmJnYuejw9eTspe2lmKHgueD49ZCYmeC54PD1fJiZ4Lnk+PXAmJngueTw9ZyYmeCE9PWkmJnghPT1hJiZpcyhvLGgsbCx1LGMsZix4LngseC55KSYmZHQoeC5wcmV2LHgseC5uZXh0KT49MHx8KHg9eC5wcmV2Wix2Lng+PWQmJnYueDw9XyYmdi55Pj1wJiZ2Lnk8PWcmJnYhPT1pJiZ2IT09YSYmaXMobyxoLGwsdSxjLGYsdi54LHYueSkmJmR0KHYucHJldix2LHYubmV4dCk+PTApKXJldHVybiExO3Y9di5uZXh0Wn1mb3IoO3gmJnguej49bTspe2lmKHgueD49ZCYmeC54PD1fJiZ4Lnk+PXAmJngueTw9ZyYmeCE9PWkmJnghPT1hJiZpcyhvLGgsbCx1LGMsZix4LngseC55KSYmZHQoeC5wcmV2LHgseC5uZXh0KT49MClyZXR1cm4hMTt4PXgucHJldlp9Zm9yKDt2JiZ2Lno8PXk7KXtpZih2Lng+PWQmJnYueDw9XyYmdi55Pj1wJiZ2Lnk8PWcmJnYhPT1pJiZ2IT09YSYmaXMobyxoLGwsdSxjLGYsdi54LHYueSkmJmR0KHYucHJldix2LHYubmV4dCk+PTApcmV0dXJuITE7dj12Lm5leHRafXJldHVybiEwfWZ1bmN0aW9uIEpTKHIsZSx0KXtsZXQgbj1yO2Rve2NvbnN0IGk9bi5wcmV2LHM9bi5uZXh0Lm5leHQ7IUpvKGkscykmJmxtKGksbixuLm5leHQscykmJmFhKGkscykmJmFhKHMsaSkmJihlLnB1c2goaS5pL3R8MCksZS5wdXNoKG4uaS90fDApLGUucHVzaChzLmkvdHwwKSxvYShuKSxvYShuLm5leHQpLG49cj1zKSxuPW4ubmV4dH13aGlsZShuIT09cik7cmV0dXJuIHRyKG4pfWZ1bmN0aW9uIEtTKHIsZSx0LG4saSxzKXtsZXQgYT1yO2Rve2xldCBvPWEubmV4dC5uZXh0O2Zvcig7byE9PWEucHJldjspe2lmKGEuaSE9PW8uaSYmYWIoYSxvKSl7bGV0IGw9Y20oYSxvKTthPXRyKGEsYS5uZXh0KSxsPXRyKGwsbC5uZXh0KSxzYShhLGUsdCxuLGkscywwKSxzYShsLGUsdCxuLGkscywwKTtyZXR1cm59bz1vLm5leHR9YT1hLm5leHR9d2hpbGUoYSE9PXIpfWZ1bmN0aW9uIFFTKHIsZSx0LG4pe2NvbnN0IGk9W107bGV0IHMsYSxvLGwsYztmb3Iocz0wLGE9ZS5sZW5ndGg7czxhO3MrKylvPWVbc10qbixsPXM8YS0xP2VbcysxXSpuOnIubGVuZ3RoLGM9b20ocixvLGwsbiwhMSksYz09PWMubmV4dCYmKGMuc3RlaW5lcj0hMCksaS5wdXNoKHNiKGMpKTtmb3IoaS5zb3J0KGpTKSxzPTA7czxpLmxlbmd0aDtzKyspdD1lYihpW3NdLHQpO3JldHVybiB0fWZ1bmN0aW9uIGpTKHIsZSl7cmV0dXJuIHIueC1lLnh9ZnVuY3Rpb24gZWIocixlKXtjb25zdCB0PXRiKHIsZSk7aWYoIXQpcmV0dXJuIGU7Y29uc3Qgbj1jbSh0LHIpO3JldHVybiB0cihuLG4ubmV4dCksdHIodCx0Lm5leHQpfWZ1bmN0aW9uIHRiKHIsZSl7bGV0IHQ9ZSxuPS0xLzAsaTtjb25zdCBzPXIueCxhPXIueTtkb3tpZihhPD10LnkmJmE+PXQubmV4dC55JiZ0Lm5leHQueSE9PXQueSl7Y29uc3QgZj10LngrKGEtdC55KSoodC5uZXh0LngtdC54KS8odC5uZXh0LnktdC55KTtpZihmPD1zJiZmPm4mJihuPWYsaT10Lng8dC5uZXh0Lng/dDp0Lm5leHQsZj09PXMpKXJldHVybiBpfXQ9dC5uZXh0fXdoaWxlKHQhPT1lKTtpZighaSlyZXR1cm4gbnVsbDtjb25zdCBvPWksbD1pLngsYz1pLnk7bGV0IGg9MS8wLHU7dD1pO2RvIHM+PXQueCYmdC54Pj1sJiZzIT09dC54JiZpcyhhPGM/czpuLGEsbCxjLGE8Yz9uOnMsYSx0LngsdC55KSYmKHU9TWF0aC5hYnMoYS10LnkpLyhzLXQueCksYWEodCxyKSYmKHU8aHx8dT09PWgmJih0Lng+aS54fHx0Lng9PT1pLngmJm5iKGksdCkpKSYmKGk9dCxoPXUpKSx0PXQubmV4dDt3aGlsZSh0IT09byk7cmV0dXJuIGl9ZnVuY3Rpb24gbmIocixlKXtyZXR1cm4gZHQoci5wcmV2LHIsZS5wcmV2KTwwJiZkdChlLm5leHQscixyLm5leHQpPDB9ZnVuY3Rpb24gaWIocixlLHQsbil7bGV0IGk9cjtkbyBpLno9PT0wJiYoaS56PWV1KGkueCxpLnksZSx0LG4pKSxpLnByZXZaPWkucHJldixpLm5leHRaPWkubmV4dCxpPWkubmV4dDt3aGlsZShpIT09cik7aS5wcmV2Wi5uZXh0Wj1udWxsLGkucHJldlo9bnVsbCxyYihpKX1mdW5jdGlvbiByYihyKXtsZXQgZSx0LG4saSxzLGEsbyxsLGM9MTtkb3tmb3IodD1yLHI9bnVsbCxzPW51bGwsYT0wO3Q7KXtmb3IoYSsrLG49dCxvPTAsZT0wO2U8YyYmKG8rKyxuPW4ubmV4dFosISFuKTtlKyspO2ZvcihsPWM7bz4wfHxsPjAmJm47KW8hPT0wJiYobD09PTB8fCFufHx0Lno8PW4ueik/KGk9dCx0PXQubmV4dFosby0tKTooaT1uLG49bi5uZXh0WixsLS0pLHM/cy5uZXh0Wj1pOnI9aSxpLnByZXZaPXMscz1pO3Q9bn1zLm5leHRaPW51bGwsYyo9Mn13aGlsZShhPjEpO3JldHVybiByfWZ1bmN0aW9uIGV1KHIsZSx0LG4saSl7cmV0dXJuIHI9KHItdCkqaXwwLGU9KGUtbikqaXwwLHI9KHJ8cjw8OCkmMTY3MTE5MzUscj0ocnxyPDw0KSYyNTI2NDUxMzUscj0ocnxyPDwyKSY4NTg5OTM0NTkscj0ocnxyPDwxKSYxNDMxNjU1NzY1LGU9KGV8ZTw8OCkmMTY3MTE5MzUsZT0oZXxlPDw0KSYyNTI2NDUxMzUsZT0oZXxlPDwyKSY4NTg5OTM0NTksZT0oZXxlPDwxKSYxNDMxNjU1NzY1LHJ8ZTw8MX1mdW5jdGlvbiBzYihyKXtsZXQgZT1yLHQ9cjtkbyhlLng8dC54fHxlLng9PT10LngmJmUueTx0LnkpJiYodD1lKSxlPWUubmV4dDt3aGlsZShlIT09cik7cmV0dXJuIHR9ZnVuY3Rpb24gaXMocixlLHQsbixpLHMsYSxvKXtyZXR1cm4oaS1hKSooZS1vKT49KHItYSkqKHMtbykmJihyLWEpKihuLW8pPj0odC1hKSooZS1vKSYmKHQtYSkqKHMtbyk+PShpLWEpKihuLW8pfWZ1bmN0aW9uIGFiKHIsZSl7cmV0dXJuIHIubmV4dC5pIT09ZS5pJiZyLnByZXYuaSE9PWUuaSYmIW9iKHIsZSkmJihhYShyLGUpJiZhYShlLHIpJiZsYihyLGUpJiYoZHQoci5wcmV2LHIsZS5wcmV2KXx8ZHQocixlLnByZXYsZSkpfHxKbyhyLGUpJiZkdChyLnByZXYscixyLm5leHQpPjAmJmR0KGUucHJldixlLGUubmV4dCk+MCl9ZnVuY3Rpb24gZHQocixlLHQpe3JldHVybihlLnktci55KSoodC54LWUueCktKGUueC1yLngpKih0LnktZS55KX1mdW5jdGlvbiBKbyhyLGUpe3JldHVybiByLng9PT1lLngmJnIueT09PWUueX1mdW5jdGlvbiBsbShyLGUsdCxuKXtjb25zdCBpPVFvKGR0KHIsZSx0KSkscz1RbyhkdChyLGUsbikpLGE9UW8oZHQodCxuLHIpKSxvPVFvKGR0KHQsbixlKSk7cmV0dXJuISEoaSE9PXMmJmEhPT1vfHxpPT09MCYmS28ocix0LGUpfHxzPT09MCYmS28ocixuLGUpfHxhPT09MCYmS28odCxyLG4pfHxvPT09MCYmS28odCxlLG4pKX1mdW5jdGlvbiBLbyhyLGUsdCl7cmV0dXJuIGUueDw9TWF0aC5tYXgoci54LHQueCkmJmUueD49TWF0aC5taW4oci54LHQueCkmJmUueTw9TWF0aC5tYXgoci55LHQueSkmJmUueT49TWF0aC5taW4oci55LHQueSl9ZnVuY3Rpb24gUW8ocil7cmV0dXJuIHI+MD8xOnI8MD8tMTowfWZ1bmN0aW9uIG9iKHIsZSl7bGV0IHQ9cjtkb3tpZih0LmkhPT1yLmkmJnQubmV4dC5pIT09ci5pJiZ0LmkhPT1lLmkmJnQubmV4dC5pIT09ZS5pJiZsbSh0LHQubmV4dCxyLGUpKXJldHVybiEwO3Q9dC5uZXh0fXdoaWxlKHQhPT1yKTtyZXR1cm4hMX1mdW5jdGlvbiBhYShyLGUpe3JldHVybiBkdChyLnByZXYscixyLm5leHQpPDA/ZHQocixlLHIubmV4dCk+PTAmJmR0KHIsci5wcmV2LGUpPj0wOmR0KHIsZSxyLnByZXYpPDB8fGR0KHIsci5uZXh0LGUpPDB9ZnVuY3Rpb24gbGIocixlKXtsZXQgdD1yLG49ITE7Y29uc3QgaT0oci54K2UueCkvMixzPShyLnkrZS55KS8yO2RvIHQueT5zIT10Lm5leHQueT5zJiZ0Lm5leHQueSE9PXQueSYmaTwodC5uZXh0LngtdC54KSoocy10LnkpLyh0Lm5leHQueS10LnkpK3QueCYmKG49IW4pLHQ9dC5uZXh0O3doaWxlKHQhPT1yKTtyZXR1cm4gbn1mdW5jdGlvbiBjbShyLGUpe2NvbnN0IHQ9bmV3IHR1KHIuaSxyLngsci55KSxuPW5ldyB0dShlLmksZS54LGUueSksaT1yLm5leHQscz1lLnByZXY7cmV0dXJuIHIubmV4dD1lLGUucHJldj1yLHQubmV4dD1pLGkucHJldj10LG4ubmV4dD10LHQucHJldj1uLHMubmV4dD1uLG4ucHJldj1zLG59ZnVuY3Rpb24gaG0ocixlLHQsbil7Y29uc3QgaT1uZXcgdHUocixlLHQpO3JldHVybiBuPyhpLm5leHQ9bi5uZXh0LGkucHJldj1uLG4ubmV4dC5wcmV2PWksbi5uZXh0PWkpOihpLnByZXY9aSxpLm5leHQ9aSksaX1mdW5jdGlvbiBvYShyKXtyLm5leHQucHJldj1yLnByZXYsci5wcmV2Lm5leHQ9ci5uZXh0LHIucHJldlomJihyLnByZXZaLm5leHRaPXIubmV4dFopLHIubmV4dFomJihyLm5leHRaLnByZXZaPXIucHJldlopfWZ1bmN0aW9uIHR1KHIsZSx0KXt0aGlzLmk9cix0aGlzLng9ZSx0aGlzLnk9dCx0aGlzLnByZXY9bnVsbCx0aGlzLm5leHQ9bnVsbCx0aGlzLno9MCx0aGlzLnByZXZaPW51bGwsdGhpcy5uZXh0Wj1udWxsLHRoaXMuc3RlaW5lcj0hMX1mdW5jdGlvbiBjYihyLGUsdCxuKXtsZXQgaT0wO2ZvcihsZXQgcz1lLGE9dC1uO3M8dDtzKz1uKWkrPShyW2FdLXJbc10pKihyW3MrMV0rclthKzFdKSxhPXM7cmV0dXJuIGl9Y2xhc3Mgdm57c3RhdGljIGFyZWEoZSl7Y29uc3QgdD1lLmxlbmd0aDtsZXQgbj0wO2ZvcihsZXQgaT10LTEscz0wO3M8dDtpPXMrKyluKz1lW2ldLngqZVtzXS55LWVbc10ueCplW2ldLnk7cmV0dXJuIG4qLjV9c3RhdGljIGlzQ2xvY2tXaXNlKGUpe3JldHVybiB2bi5hcmVhKGUpPDB9c3RhdGljIHRyaWFuZ3VsYXRlU2hhcGUoZSx0KXtjb25zdCBuPVtdLGk9W10scz1bXTt1bShlKSxmbShuLGUpO2xldCBhPWUubGVuZ3RoO3QuZm9yRWFjaCh1bSk7Zm9yKGxldCBsPTA7bDx0Lmxlbmd0aDtsKyspaS5wdXNoKGEpLGErPXRbbF0ubGVuZ3RoLGZtKG4sdFtsXSk7Y29uc3Qgbz0kUy50cmlhbmd1bGF0ZShuLGkpO2ZvcihsZXQgbD0wO2w8by5sZW5ndGg7bCs9MylzLnB1c2goby5zbGljZShsLGwrMykpO3JldHVybiBzfX1mdW5jdGlvbiB1bShyKXtjb25zdCBlPXIubGVuZ3RoO2U+MiYmcltlLTFdLmVxdWFscyhyWzBdKSYmci5wb3AoKX1mdW5jdGlvbiBmbShyLGUpe2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXIucHVzaChlW3RdLngpLHIucHVzaChlW3RdLnkpfWxldCBkbT1jbGFzcyBvXyBleHRlbmRzIGtle2NvbnN0cnVjdG9yKGU9bmV3IG9pKFtuZXcgcSguNSwuNSksbmV3IHEoLS41LC41KSxuZXcgcSgtLjUsLS41KSxuZXcgcSguNSwtLjUpXSksdD17fSl7c3VwZXIoKSx0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6ZSxvcHRpb25zOnR9LGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtjb25zdCBuPXRoaXMsaT1bXSxzPVtdO2ZvcihsZXQgbz0wLGw9ZS5sZW5ndGg7bzxsO28rKyl7Y29uc3QgYz1lW29dO2EoYyl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoaSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU2UocywyKSksdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO2Z1bmN0aW9uIGEobyl7Y29uc3QgbD1bXSxjPXQuY3VydmVTZWdtZW50cyE9PXZvaWQgMD90LmN1cnZlU2VnbWVudHM6MTIsaD10LnN0ZXBzIT09dm9pZCAwP3Quc3RlcHM6MSx1PXQuZGVwdGghPT12b2lkIDA/dC5kZXB0aDoxO2xldCBmPXQuYmV2ZWxFbmFibGVkIT09dm9pZCAwP3QuYmV2ZWxFbmFibGVkOiEwLGQ9dC5iZXZlbFRoaWNrbmVzcyE9PXZvaWQgMD90LmJldmVsVGhpY2tuZXNzOi4yLHA9dC5iZXZlbFNpemUhPT12b2lkIDA/dC5iZXZlbFNpemU6ZC0uMSxfPXQuYmV2ZWxPZmZzZXQhPT12b2lkIDA/dC5iZXZlbE9mZnNldDowLGc9dC5iZXZlbFNlZ21lbnRzIT09dm9pZCAwP3QuYmV2ZWxTZWdtZW50czozO2NvbnN0IG09dC5leHRydWRlUGF0aCx5PXQuVVZHZW5lcmF0b3IhPT12b2lkIDA/dC5VVkdlbmVyYXRvcjpoYjtsZXQgeCx2PSExLFMsYixBLEw7bSYmKHg9bS5nZXRTcGFjZWRQb2ludHMoaCksdj0hMCxmPSExLFM9bS5jb21wdXRlRnJlbmV0RnJhbWVzKGgsITEpLGI9bmV3IFAsQT1uZXcgUCxMPW5ldyBQKSxmfHwoZz0wLGQ9MCxwPTAsXz0wKTtjb25zdCBNPW8uZXh0cmFjdFBvaW50cyhjKTtsZXQgdz1NLnNoYXBlO2NvbnN0IFI9TS5ob2xlcztpZighdm4uaXNDbG9ja1dpc2Uodykpe3c9dy5yZXZlcnNlKCk7Zm9yKGxldCBEPTAsbGU9Ui5sZW5ndGg7RDxsZTtEKyspe2NvbnN0IEs9UltEXTt2bi5pc0Nsb2NrV2lzZShLKSYmKFJbRF09Sy5yZXZlcnNlKCkpfX1jb25zdCBCPXZuLnRyaWFuZ3VsYXRlU2hhcGUodyxSKSxJPXc7Zm9yKGxldCBEPTAsbGU9Ui5sZW5ndGg7RDxsZTtEKyspe2NvbnN0IEs9UltEXTt3PXcuY29uY2F0KEspfWZ1bmN0aW9uIFUoRCxsZSxLKXtyZXR1cm4gbGV8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0IiksRC5jbG9uZSgpLmFkZFNjYWxlZFZlY3RvcihsZSxLKX1jb25zdCB6PXcubGVuZ3RoLEY9Qi5sZW5ndGg7ZnVuY3Rpb24gWihELGxlLEspe2xldCB1ZSxyZSxDZTtjb25zdCBXPUQueC1sZS54LEo9RC55LWxlLnksaWU9Sy54LUQueCxtZT1LLnktRC55LHBlPVcqVytKKkosQz1XKm1lLUoqaWU7aWYoTWF0aC5hYnMoQyk+TnVtYmVyLkVQU0lMT04pe2NvbnN0IEU9TWF0aC5zcXJ0KHBlKSxrPU1hdGguc3FydChpZSppZSttZSptZSksc2U9bGUueC1KL0UsdGU9bGUueStXL0UsYWU9Sy54LW1lL2ssQWU9Sy55K2llL2ssb2U9KChhZS1zZSkqbWUtKEFlLXRlKSppZSkvKFcqbWUtSippZSk7dWU9c2UrVypvZS1ELngscmU9dGUrSipvZS1ELnk7Y29uc3QgeGU9dWUqdWUrcmUqcmU7aWYoeGU8PTIpcmV0dXJuIG5ldyBxKHVlLHJlKTtDZT1NYXRoLnNxcnQoeGUvMil9ZWxzZXtsZXQgRT0hMTtXPk51bWJlci5FUFNJTE9OP2llPk51bWJlci5FUFNJTE9OJiYoRT0hMCk6VzwtTnVtYmVyLkVQU0lMT04/aWU8LU51bWJlci5FUFNJTE9OJiYoRT0hMCk6TWF0aC5zaWduKEopPT09TWF0aC5zaWduKG1lKSYmKEU9ITApLEU/KHVlPS1KLHJlPVcsQ2U9TWF0aC5zcXJ0KHBlKSk6KHVlPVcscmU9SixDZT1NYXRoLnNxcnQocGUvMikpfXJldHVybiBuZXcgcSh1ZS9DZSxyZS9DZSl9Y29uc3QgVj1bXTtmb3IobGV0IEQ9MCxsZT1JLmxlbmd0aCxLPWxlLTEsdWU9RCsxO0Q8bGU7RCsrLEsrKyx1ZSsrKUs9PT1sZSYmKEs9MCksdWU9PT1sZSYmKHVlPTApLFZbRF09WihJW0RdLElbS10sSVt1ZV0pO2NvbnN0IFE9W107bGV0IG5lLGZlPVYuY29uY2F0KCk7Zm9yKGxldCBEPTAsbGU9Ui5sZW5ndGg7RDxsZTtEKyspe2NvbnN0IEs9UltEXTtuZT1bXTtmb3IobGV0IHVlPTAscmU9Sy5sZW5ndGgsQ2U9cmUtMSxXPXVlKzE7dWU8cmU7dWUrKyxDZSsrLFcrKylDZT09PXJlJiYoQ2U9MCksVz09PXJlJiYoVz0wKSxuZVt1ZV09WihLW3VlXSxLW0NlXSxLW1ddKTtRLnB1c2gobmUpLGZlPWZlLmNvbmNhdChuZSl9Zm9yKGxldCBEPTA7RDxnO0QrKyl7Y29uc3QgbGU9RC9nLEs9ZCpNYXRoLmNvcyhsZSpNYXRoLlBJLzIpLHVlPXAqTWF0aC5zaW4obGUqTWF0aC5QSS8yKStfO2ZvcihsZXQgcmU9MCxDZT1JLmxlbmd0aDtyZTxDZTtyZSsrKXtjb25zdCBXPVUoSVtyZV0sVltyZV0sdWUpO2JlKFcueCxXLnksLUspfWZvcihsZXQgcmU9MCxDZT1SLmxlbmd0aDtyZTxDZTtyZSsrKXtjb25zdCBXPVJbcmVdO25lPVFbcmVdO2ZvcihsZXQgSj0wLGllPVcubGVuZ3RoO0o8aWU7SisrKXtjb25zdCBtZT1VKFdbSl0sbmVbSl0sdWUpO2JlKG1lLngsbWUueSwtSyl9fX1jb25zdCAkPXArXztmb3IobGV0IEQ9MDtEPHo7RCsrKXtjb25zdCBsZT1mP1Uod1tEXSxmZVtEXSwkKTp3W0RdO3Y/KEEuY29weShTLm5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGxlLngpLGIuY29weShTLmJpbm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIobGUueSksTC5jb3B5KHhbMF0pLmFkZChBKS5hZGQoYiksYmUoTC54LEwueSxMLnopKTpiZShsZS54LGxlLnksMCl9Zm9yKGxldCBEPTE7RDw9aDtEKyspZm9yKGxldCBsZT0wO2xlPHo7bGUrKyl7Y29uc3QgSz1mP1Uod1tsZV0sZmVbbGVdLCQpOndbbGVdO3Y/KEEuY29weShTLm5vcm1hbHNbRF0pLm11bHRpcGx5U2NhbGFyKEsueCksYi5jb3B5KFMuYmlub3JtYWxzW0RdKS5tdWx0aXBseVNjYWxhcihLLnkpLEwuY29weSh4W0RdKS5hZGQoQSkuYWRkKGIpLGJlKEwueCxMLnksTC56KSk6YmUoSy54LEsueSx1L2gqRCl9Zm9yKGxldCBEPWctMTtEPj0wO0QtLSl7Y29uc3QgbGU9RC9nLEs9ZCpNYXRoLmNvcyhsZSpNYXRoLlBJLzIpLHVlPXAqTWF0aC5zaW4obGUqTWF0aC5QSS8yKStfO2ZvcihsZXQgcmU9MCxDZT1JLmxlbmd0aDtyZTxDZTtyZSsrKXtjb25zdCBXPVUoSVtyZV0sVltyZV0sdWUpO2JlKFcueCxXLnksdStLKX1mb3IobGV0IHJlPTAsQ2U9Ui5sZW5ndGg7cmU8Q2U7cmUrKyl7Y29uc3QgVz1SW3JlXTtuZT1RW3JlXTtmb3IobGV0IEo9MCxpZT1XLmxlbmd0aDtKPGllO0orKyl7Y29uc3QgbWU9VShXW0pdLG5lW0pdLHVlKTt2P2JlKG1lLngsbWUueSt4W2gtMV0ueSx4W2gtMV0ueCtLKTpiZShtZS54LG1lLnksdStLKX19fWVlKCksZGUoKTtmdW5jdGlvbiBlZSgpe2NvbnN0IEQ9aS5sZW5ndGgvMztpZihmKXtsZXQgbGU9MCxLPXoqbGU7Zm9yKGxldCB1ZT0wO3VlPEY7dWUrKyl7Y29uc3QgcmU9Qlt1ZV07T2UocmVbMl0rSyxyZVsxXStLLHJlWzBdK0spfWxlPWgrZyoyLEs9eipsZTtmb3IobGV0IHVlPTA7dWU8Rjt1ZSsrKXtjb25zdCByZT1CW3VlXTtPZShyZVswXStLLHJlWzFdK0sscmVbMl0rSyl9fWVsc2V7Zm9yKGxldCBsZT0wO2xlPEY7bGUrKyl7Y29uc3QgSz1CW2xlXTtPZShLWzJdLEtbMV0sS1swXSl9Zm9yKGxldCBsZT0wO2xlPEY7bGUrKyl7Y29uc3QgSz1CW2xlXTtPZShLWzBdK3oqaCxLWzFdK3oqaCxLWzJdK3oqaCl9fW4uYWRkR3JvdXAoRCxpLmxlbmd0aC8zLUQsMCl9ZnVuY3Rpb24gZGUoKXtjb25zdCBEPWkubGVuZ3RoLzM7bGV0IGxlPTA7VGUoSSxsZSksbGUrPUkubGVuZ3RoO2ZvcihsZXQgSz0wLHVlPVIubGVuZ3RoO0s8dWU7SysrKXtjb25zdCByZT1SW0tdO1RlKHJlLGxlKSxsZSs9cmUubGVuZ3RofW4uYWRkR3JvdXAoRCxpLmxlbmd0aC8zLUQsMSl9ZnVuY3Rpb24gVGUoRCxsZSl7bGV0IEs9RC5sZW5ndGg7Zm9yKDstLUs+PTA7KXtjb25zdCB1ZT1LO2xldCByZT1LLTE7cmU8MCYmKHJlPUQubGVuZ3RoLTEpO2ZvcihsZXQgQ2U9MCxXPWgrZyoyO0NlPFc7Q2UrKyl7Y29uc3QgSj16KkNlLGllPXoqKENlKzEpLG1lPWxlK3VlK0oscGU9bGUrcmUrSixDPWxlK3JlK2llLEU9bGUrdWUraWU7QmUobWUscGUsQyxFKX19fWZ1bmN0aW9uIGJlKEQsbGUsSyl7bC5wdXNoKEQpLGwucHVzaChsZSksbC5wdXNoKEspfWZ1bmN0aW9uIE9lKEQsbGUsSyl7d2UoRCksd2UobGUpLHdlKEspO2NvbnN0IHVlPWkubGVuZ3RoLzMscmU9eS5nZW5lcmF0ZVRvcFVWKG4saSx1ZS0zLHVlLTIsdWUtMSk7UGUocmVbMF0pLFBlKHJlWzFdKSxQZShyZVsyXSl9ZnVuY3Rpb24gQmUoRCxsZSxLLHVlKXt3ZShEKSx3ZShsZSksd2UodWUpLHdlKGxlKSx3ZShLKSx3ZSh1ZSk7Y29uc3QgcmU9aS5sZW5ndGgvMyxDZT15LmdlbmVyYXRlU2lkZVdhbGxVVihuLGkscmUtNixyZS0zLHJlLTIscmUtMSk7UGUoQ2VbMF0pLFBlKENlWzFdKSxQZShDZVszXSksUGUoQ2VbMV0pLFBlKENlWzJdKSxQZShDZVszXSl9ZnVuY3Rpb24gd2UoRCl7aS5wdXNoKGxbRCozKzBdKSxpLnB1c2gobFtEKjMrMV0pLGkucHVzaChsW0QqMysyXSl9ZnVuY3Rpb24gUGUoRCl7cy5wdXNoKEQueCkscy5wdXNoKEQueSl9fX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LGUucGFyYW1ldGVycyksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpLHQ9dGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxuPXRoaXMucGFyYW1ldGVycy5vcHRpb25zO3JldHVybiB1Yih0LG4sZSl9c3RhdGljIGZyb21KU09OKGUsdCl7Y29uc3Qgbj1bXTtmb3IobGV0IHM9MCxhPWUuc2hhcGVzLmxlbmd0aDtzPGE7cysrKXtjb25zdCBvPXRbZS5zaGFwZXNbc11dO24ucHVzaChvKX1jb25zdCBpPWUub3B0aW9ucy5leHRydWRlUGF0aDtyZXR1cm4gaSE9PXZvaWQgMCYmKGUub3B0aW9ucy5leHRydWRlUGF0aD1uZXcgVm9baS50eXBlXSgpLmZyb21KU09OKGkpKSxuZXcgb18obixlLm9wdGlvbnMpfX07Y29uc3QgaGI9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24ocixlLHQsbixpKXtjb25zdCBzPWVbdCozXSxhPWVbdCozKzFdLG89ZVtuKjNdLGw9ZVtuKjMrMV0sYz1lW2kqM10saD1lW2kqMysxXTtyZXR1cm5bbmV3IHEocyxhKSxuZXcgcShvLGwpLG5ldyBxKGMsaCldfSxnZW5lcmF0ZVNpZGVXYWxsVVY6ZnVuY3Rpb24ocixlLHQsbixpLHMpe2NvbnN0IGE9ZVt0KjNdLG89ZVt0KjMrMV0sbD1lW3QqMysyXSxjPWVbbiozXSxoPWVbbiozKzFdLHU9ZVtuKjMrMl0sZj1lW2kqM10sZD1lW2kqMysxXSxwPWVbaSozKzJdLF89ZVtzKjNdLGc9ZVtzKjMrMV0sbT1lW3MqMysyXTtyZXR1cm4gTWF0aC5hYnMoby1oKTxNYXRoLmFicyhhLWMpP1tuZXcgcShhLDEtbCksbmV3IHEoYywxLXUpLG5ldyBxKGYsMS1wKSxuZXcgcShfLDEtbSldOltuZXcgcShvLDEtbCksbmV3IHEoaCwxLXUpLG5ldyBxKGQsMS1wKSxuZXcgcShnLDEtbSldfX07ZnVuY3Rpb24gdWIocixlLHQpe2lmKHQuc2hhcGVzPVtdLEFycmF5LmlzQXJyYXkocikpZm9yKGxldCBuPTAsaT1yLmxlbmd0aDtuPGk7bisrKXtjb25zdCBzPXJbbl07dC5zaGFwZXMucHVzaChzLnV1aWQpfWVsc2UgdC5zaGFwZXMucHVzaChyLnV1aWQpO3JldHVybiB0Lm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSxlKSxlLmV4dHJ1ZGVQYXRoIT09dm9pZCAwJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPWUuZXh0cnVkZVBhdGgudG9KU09OKCkpLHR9Y2xhc3Mgam8gZXh0ZW5kcyBEaXtjb25zdHJ1Y3RvcihlPTEsdD0wKXtjb25zdCBuPSgxK01hdGguc3FydCg1KSkvMixpPVstMSxuLDAsMSxuLDAsLTEsLW4sMCwxLC1uLDAsMCwtMSxuLDAsMSxuLDAsLTEsLW4sMCwxLC1uLG4sMCwtMSxuLDAsMSwtbiwwLC0xLC1uLDAsMV0scz1bMCwxMSw1LDAsNSwxLDAsMSw3LDAsNywxMCwwLDEwLDExLDEsNSw5LDUsMTEsNCwxMSwxMCwyLDEwLDcsNiw3LDEsOCwzLDksNCwzLDQsMiwzLDIsNiwzLDYsOCwzLDgsOSw0LDksNSwyLDQsMTEsNiwyLDEwLDgsNiw3LDksOCwxXTtzdXBlcihpLHMsZSx0KSx0aGlzLnR5cGU9Ikljb3NhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOmUsZGV0YWlsOnR9fXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IGpvKGUucmFkaXVzLGUuZGV0YWlsKX19Y2xhc3MgbGEgZXh0ZW5kcyBEaXtjb25zdHJ1Y3RvcihlPTEsdD0wKXtjb25zdCBuPVsxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMV0saT1bMCwyLDQsMCw0LDMsMCwzLDUsMCw1LDIsMSwyLDUsMSw1LDMsMSwzLDQsMSw0LDJdO3N1cGVyKG4saSxlLHQpLHRoaXMudHlwZT0iT2N0YWhlZHJvbkdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czplLGRldGFpbDp0fX1zdGF0aWMgZnJvbUpTT04oZSl7cmV0dXJuIG5ldyBsYShlLnJhZGl1cyxlLmRldGFpbCl9fWNsYXNzIGVsIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT0uNSx0PTEsbj0zMixpPTEscz0wLGE9TWF0aC5QSSoyKXtzdXBlcigpLHRoaXMudHlwZT0iUmluZ0dlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e2lubmVyUmFkaXVzOmUsb3V0ZXJSYWRpdXM6dCx0aGV0YVNlZ21lbnRzOm4scGhpU2VnbWVudHM6aSx0aGV0YVN0YXJ0OnMsdGhldGFMZW5ndGg6YX0sbj1NYXRoLm1heCgzLG4pLGk9TWF0aC5tYXgoMSxpKTtjb25zdCBvPVtdLGw9W10sYz1bXSxoPVtdO2xldCB1PWU7Y29uc3QgZj0odC1lKS9pLGQ9bmV3IFAscD1uZXcgcTtmb3IobGV0IF89MDtfPD1pO18rKyl7Zm9yKGxldCBnPTA7Zzw9bjtnKyspe2NvbnN0IG09cytnL24qYTtkLng9dSpNYXRoLmNvcyhtKSxkLnk9dSpNYXRoLnNpbihtKSxsLnB1c2goZC54LGQueSxkLnopLGMucHVzaCgwLDAsMSkscC54PShkLngvdCsxKS8yLHAueT0oZC55L3QrMSkvMixoLnB1c2gocC54LHAueSl9dSs9Zn1mb3IobGV0IF89MDtfPGk7XysrKXtjb25zdCBnPV8qKG4rMSk7Zm9yKGxldCBtPTA7bTxuO20rKyl7Y29uc3QgeT1tK2cseD15LHY9eStuKzEsUz15K24rMixiPXkrMTtvLnB1c2goeCx2LGIpLG8ucHVzaCh2LFMsYil9fXRoaXMuc2V0SW5kZXgobyksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UobCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKGMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGgsMikpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IGVsKGUuaW5uZXJSYWRpdXMsZS5vdXRlclJhZGl1cyxlLnRoZXRhU2VnbWVudHMsZS5waGlTZWdtZW50cyxlLnRoZXRhU3RhcnQsZS50aGV0YUxlbmd0aCl9fWNsYXNzIHRsIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT1uZXcgb2koW25ldyBxKDAsLjUpLG5ldyBxKC0uNSwtLjUpLG5ldyBxKC41LC0uNSldKSx0PTEyKXtzdXBlcigpLHRoaXMudHlwZT0iU2hhcGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6ZSxjdXJ2ZVNlZ21lbnRzOnR9O2NvbnN0IG49W10saT1bXSxzPVtdLGE9W107bGV0IG89MCxsPTA7aWYoQXJyYXkuaXNBcnJheShlKT09PSExKWMoZSk7ZWxzZSBmb3IobGV0IGg9MDtoPGUubGVuZ3RoO2grKyljKGVbaF0pLHRoaXMuYWRkR3JvdXAobyxsLGgpLG8rPWwsbD0wO3RoaXMuc2V0SW5kZXgobiksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoaSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGEsMikpO2Z1bmN0aW9uIGMoaCl7Y29uc3QgdT1pLmxlbmd0aC8zLGY9aC5leHRyYWN0UG9pbnRzKHQpO2xldCBkPWYuc2hhcGU7Y29uc3QgcD1mLmhvbGVzO3ZuLmlzQ2xvY2tXaXNlKGQpPT09ITEmJihkPWQucmV2ZXJzZSgpKTtmb3IobGV0IGc9MCxtPXAubGVuZ3RoO2c8bTtnKyspe2NvbnN0IHk9cFtnXTt2bi5pc0Nsb2NrV2lzZSh5KT09PSEwJiYocFtnXT15LnJldmVyc2UoKSl9Y29uc3QgXz12bi50cmlhbmd1bGF0ZVNoYXBlKGQscCk7Zm9yKGxldCBnPTAsbT1wLmxlbmd0aDtnPG07ZysrKXtjb25zdCB5PXBbZ107ZD1kLmNvbmNhdCh5KX1mb3IobGV0IGc9MCxtPWQubGVuZ3RoO2c8bTtnKyspe2NvbnN0IHk9ZFtnXTtpLnB1c2goeS54LHkueSwwKSxzLnB1c2goMCwwLDEpLGEucHVzaCh5LngseS55KX1mb3IobGV0IGc9MCxtPV8ubGVuZ3RoO2c8bTtnKyspe2NvbnN0IHk9X1tnXSx4PXlbMF0rdSx2PXlbMV0rdSxTPXlbMl0rdTtuLnB1c2goeCx2LFMpLGwrPTN9fX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LGUucGFyYW1ldGVycyksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpLHQ9dGhpcy5wYXJhbWV0ZXJzLnNoYXBlcztyZXR1cm4gZmIodCxlKX1zdGF0aWMgZnJvbUpTT04oZSx0KXtjb25zdCBuPVtdO2ZvcihsZXQgaT0wLHM9ZS5zaGFwZXMubGVuZ3RoO2k8cztpKyspe2NvbnN0IGE9dFtlLnNoYXBlc1tpXV07bi5wdXNoKGEpfXJldHVybiBuZXcgdGwobixlLmN1cnZlU2VnbWVudHMpfX1mdW5jdGlvbiBmYihyLGUpe2lmKGUuc2hhcGVzPVtdLEFycmF5LmlzQXJyYXkocikpZm9yKGxldCB0PTAsbj1yLmxlbmd0aDt0PG47dCsrKXtjb25zdCBpPXJbdF07ZS5zaGFwZXMucHVzaChpLnV1aWQpfWVsc2UgZS5zaGFwZXMucHVzaChyLnV1aWQpO3JldHVybiBlfWNsYXNzIGNhIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT0xLHQ9MzIsbj0xNixpPTAscz1NYXRoLlBJKjIsYT0wLG89TWF0aC5QSSl7c3VwZXIoKSx0aGlzLnR5cGU9IlNwaGVyZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czplLHdpZHRoU2VnbWVudHM6dCxoZWlnaHRTZWdtZW50czpuLHBoaVN0YXJ0OmkscGhpTGVuZ3RoOnMsdGhldGFTdGFydDphLHRoZXRhTGVuZ3RoOm99LHQ9TWF0aC5tYXgoMyxNYXRoLmZsb29yKHQpKSxuPU1hdGgubWF4KDIsTWF0aC5mbG9vcihuKSk7Y29uc3QgbD1NYXRoLm1pbihhK28sTWF0aC5QSSk7bGV0IGM9MDtjb25zdCBoPVtdLHU9bmV3IFAsZj1uZXcgUCxkPVtdLHA9W10sXz1bXSxnPVtdO2ZvcihsZXQgbT0wO208PW47bSsrKXtjb25zdCB5PVtdLHg9bS9uO2xldCB2PTA7bT09PTAmJmE9PT0wP3Y9LjUvdDptPT09biYmbD09PU1hdGguUEkmJih2PS0uNS90KTtmb3IobGV0IFM9MDtTPD10O1MrKyl7Y29uc3QgYj1TL3Q7dS54PS1lKk1hdGguY29zKGkrYipzKSpNYXRoLnNpbihhK3gqbyksdS55PWUqTWF0aC5jb3MoYSt4Km8pLHUuej1lKk1hdGguc2luKGkrYipzKSpNYXRoLnNpbihhK3gqbykscC5wdXNoKHUueCx1LnksdS56KSxmLmNvcHkodSkubm9ybWFsaXplKCksXy5wdXNoKGYueCxmLnksZi56KSxnLnB1c2goYit2LDEteCkseS5wdXNoKGMrKyl9aC5wdXNoKHkpfWZvcihsZXQgbT0wO208bjttKyspZm9yKGxldCB5PTA7eTx0O3krKyl7Y29uc3QgeD1oW21dW3krMV0sdj1oW21dW3ldLFM9aFttKzFdW3ldLGI9aFttKzFdW3krMV07KG0hPT0wfHxhPjApJiZkLnB1c2goeCx2LGIpLChtIT09bi0xfHxsPE1hdGguUEkpJiZkLnB1c2godixTLGIpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKF8sMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGcsMikpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IGNhKGUucmFkaXVzLGUud2lkdGhTZWdtZW50cyxlLmhlaWdodFNlZ21lbnRzLGUucGhpU3RhcnQsZS5waGlMZW5ndGgsZS50aGV0YVN0YXJ0LGUudGhldGFMZW5ndGgpfX1jbGFzcyBubCBleHRlbmRzIERpe2NvbnN0cnVjdG9yKGU9MSx0PTApe2NvbnN0IG49WzEsMSwxLC0xLC0xLDEsLTEsMSwtMSwxLC0xLC0xXSxpPVsyLDEsMCwwLDMsMiwxLDMsMCwyLDMsMV07c3VwZXIobixpLGUsdCksdGhpcy50eXBlPSJUZXRyYWhlZHJvbkdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czplLGRldGFpbDp0fX1zdGF0aWMgZnJvbUpTT04oZSl7cmV0dXJuIG5ldyBubChlLnJhZGl1cyxlLmRldGFpbCl9fWNsYXNzIGlsIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT0xLHQ9LjQsbj0xMixpPTQ4LHM9TWF0aC5QSSoyKXtzdXBlcigpLHRoaXMudHlwZT0iVG9ydXNHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6ZSx0dWJlOnQscmFkaWFsU2VnbWVudHM6bix0dWJ1bGFyU2VnbWVudHM6aSxhcmM6c30sbj1NYXRoLmZsb29yKG4pLGk9TWF0aC5mbG9vcihpKTtjb25zdCBhPVtdLG89W10sbD1bXSxjPVtdLGg9bmV3IFAsdT1uZXcgUCxmPW5ldyBQO2ZvcihsZXQgZD0wO2Q8PW47ZCsrKWZvcihsZXQgcD0wO3A8PWk7cCsrKXtjb25zdCBfPXAvaSpzLGc9ZC9uKk1hdGguUEkqMjt1Lng9KGUrdCpNYXRoLmNvcyhnKSkqTWF0aC5jb3MoXyksdS55PShlK3QqTWF0aC5jb3MoZykpKk1hdGguc2luKF8pLHUuej10Kk1hdGguc2luKGcpLG8ucHVzaCh1LngsdS55LHUueiksaC54PWUqTWF0aC5jb3MoXyksaC55PWUqTWF0aC5zaW4oXyksZi5zdWJWZWN0b3JzKHUsaCkubm9ybWFsaXplKCksbC5wdXNoKGYueCxmLnksZi56KSxjLnB1c2gocC9pKSxjLnB1c2goZC9uKX1mb3IobGV0IGQ9MTtkPD1uO2QrKylmb3IobGV0IHA9MTtwPD1pO3ArKyl7Y29uc3QgXz0oaSsxKSpkK3AtMSxnPShpKzEpKihkLTEpK3AtMSxtPShpKzEpKihkLTEpK3AseT0oaSsxKSpkK3A7YS5wdXNoKF8sZyx5KSxhLnB1c2goZyxtLHkpfXRoaXMuc2V0SW5kZXgoYSksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UobywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKGwsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGMsMikpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IGlsKGUucmFkaXVzLGUudHViZSxlLnJhZGlhbFNlZ21lbnRzLGUudHVidWxhclNlZ21lbnRzLGUuYXJjKX19Y2xhc3MgcmwgZXh0ZW5kcyBrZXtjb25zdHJ1Y3RvcihlPTEsdD0uNCxuPTY0LGk9OCxzPTIsYT0zKXtzdXBlcigpLHRoaXMudHlwZT0iVG9ydXNLbm90R2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOmUsdHViZTp0LHR1YnVsYXJTZWdtZW50czpuLHJhZGlhbFNlZ21lbnRzOmkscDpzLHE6YX0sbj1NYXRoLmZsb29yKG4pLGk9TWF0aC5mbG9vcihpKTtjb25zdCBvPVtdLGw9W10sYz1bXSxoPVtdLHU9bmV3IFAsZj1uZXcgUCxkPW5ldyBQLHA9bmV3IFAsXz1uZXcgUCxnPW5ldyBQLG09bmV3IFA7Zm9yKGxldCB4PTA7eDw9bjsrK3gpe2NvbnN0IHY9eC9uKnMqTWF0aC5QSSoyO3kodixzLGEsZSxkKSx5KHYrLjAxLHMsYSxlLHApLGcuc3ViVmVjdG9ycyhwLGQpLG0uYWRkVmVjdG9ycyhwLGQpLF8uY3Jvc3NWZWN0b3JzKGcsbSksbS5jcm9zc1ZlY3RvcnMoXyxnKSxfLm5vcm1hbGl6ZSgpLG0ubm9ybWFsaXplKCk7Zm9yKGxldCBTPTA7Uzw9aTsrK1Mpe2NvbnN0IGI9Uy9pKk1hdGguUEkqMixBPS10Kk1hdGguY29zKGIpLEw9dCpNYXRoLnNpbihiKTt1Lng9ZC54KyhBKm0ueCtMKl8ueCksdS55PWQueSsoQSptLnkrTCpfLnkpLHUuej1kLnorKEEqbS56K0wqXy56KSxsLnB1c2godS54LHUueSx1LnopLGYuc3ViVmVjdG9ycyh1LGQpLm5vcm1hbGl6ZSgpLGMucHVzaChmLngsZi55LGYueiksaC5wdXNoKHgvbiksaC5wdXNoKFMvaSl9fWZvcihsZXQgeD0xO3g8PW47eCsrKWZvcihsZXQgdj0xO3Y8PWk7disrKXtjb25zdCBTPShpKzEpKih4LTEpKyh2LTEpLGI9KGkrMSkqeCsodi0xKSxBPShpKzEpKngrdixMPShpKzEpKih4LTEpK3Y7by5wdXNoKFMsYixMKSxvLnB1c2goYixBLEwpfXRoaXMuc2V0SW5kZXgobyksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UobCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKGMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGgsMikpO2Z1bmN0aW9uIHkoeCx2LFMsYixBKXtjb25zdCBMPU1hdGguY29zKHgpLE09TWF0aC5zaW4oeCksdz1TL3YqeCxSPU1hdGguY29zKHcpO0EueD1iKigyK1IpKi41KkwsQS55PWIqKDIrUikqTSouNSxBLno9YipNYXRoLnNpbih3KSouNX19Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSxlLnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKGUpe3JldHVybiBuZXcgcmwoZS5yYWRpdXMsZS50dWJlLGUudHVidWxhclNlZ21lbnRzLGUucmFkaWFsU2VnbWVudHMsZS5wLGUucSl9fWNsYXNzIHNsIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT1uZXcgS2gobmV3IFAoLTEsLTEsMCksbmV3IFAoLTEsMSwwKSxuZXcgUCgxLDEsMCkpLHQ9NjQsbj0xLGk9OCxzPSExKXtzdXBlcigpLHRoaXMudHlwZT0iVHViZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3BhdGg6ZSx0dWJ1bGFyU2VnbWVudHM6dCxyYWRpdXM6bixyYWRpYWxTZWdtZW50czppLGNsb3NlZDpzfTtjb25zdCBhPWUuY29tcHV0ZUZyZW5ldEZyYW1lcyh0LHMpO3RoaXMudGFuZ2VudHM9YS50YW5nZW50cyx0aGlzLm5vcm1hbHM9YS5ub3JtYWxzLHRoaXMuYmlub3JtYWxzPWEuYmlub3JtYWxzO2NvbnN0IG89bmV3IFAsbD1uZXcgUCxjPW5ldyBxO2xldCBoPW5ldyBQO2NvbnN0IHU9W10sZj1bXSxkPVtdLHA9W107XygpLHRoaXMuc2V0SW5kZXgocCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UodSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKGYsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGQsMikpO2Z1bmN0aW9uIF8oKXtmb3IobGV0IHg9MDt4PHQ7eCsrKWcoeCk7ZyhzPT09ITE/dDowKSx5KCksbSgpfWZ1bmN0aW9uIGcoeCl7aD1lLmdldFBvaW50QXQoeC90LGgpO2NvbnN0IHY9YS5ub3JtYWxzW3hdLFM9YS5iaW5vcm1hbHNbeF07Zm9yKGxldCBiPTA7Yjw9aTtiKyspe2NvbnN0IEE9Yi9pKk1hdGguUEkqMixMPU1hdGguc2luKEEpLE09LU1hdGguY29zKEEpO2wueD1NKnYueCtMKlMueCxsLnk9TSp2LnkrTCpTLnksbC56PU0qdi56K0wqUy56LGwubm9ybWFsaXplKCksZi5wdXNoKGwueCxsLnksbC56KSxvLng9aC54K24qbC54LG8ueT1oLnkrbipsLnksby56PWgueituKmwueix1LnB1c2goby54LG8ueSxvLnopfX1mdW5jdGlvbiBtKCl7Zm9yKGxldCB4PTE7eDw9dDt4KyspZm9yKGxldCB2PTE7djw9aTt2Kyspe2NvbnN0IFM9KGkrMSkqKHgtMSkrKHYtMSksYj0oaSsxKSp4Kyh2LTEpLEE9KGkrMSkqeCt2LEw9KGkrMSkqKHgtMSkrdjtwLnB1c2goUyxiLEwpLHAucHVzaChiLEEsTCl9fWZ1bmN0aW9uIHkoKXtmb3IobGV0IHg9MDt4PD10O3grKylmb3IobGV0IHY9MDt2PD1pO3YrKyljLng9eC90LGMueT12L2ksZC5wdXNoKGMueCxjLnkpfX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LGUucGFyYW1ldGVycyksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO3JldHVybiBlLnBhdGg9dGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCksZX1zdGF0aWMgZnJvbUpTT04oZSl7cmV0dXJuIG5ldyBzbChuZXcgVm9bZS5wYXRoLnR5cGVdKCkuZnJvbUpTT04oZS5wYXRoKSxlLnR1YnVsYXJTZWdtZW50cyxlLnJhZGl1cyxlLnJhZGlhbFNlZ21lbnRzLGUuY2xvc2VkKX19Y2xhc3MgcG0gZXh0ZW5kcyBrZXtjb25zdHJ1Y3RvcihlPW51bGwpe2lmKHN1cGVyKCksdGhpcy50eXBlPSJXaXJlZnJhbWVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtnZW9tZXRyeTplfSxlIT09bnVsbCl7Y29uc3QgdD1bXSxuPW5ldyBTZXQsaT1uZXcgUCxzPW5ldyBQO2lmKGUuaW5kZXghPT1udWxsKXtjb25zdCBhPWUuYXR0cmlidXRlcy5wb3NpdGlvbixvPWUuaW5kZXg7bGV0IGw9ZS5ncm91cHM7bC5sZW5ndGg9PT0wJiYobD1be3N0YXJ0OjAsY291bnQ6by5jb3VudCxtYXRlcmlhbEluZGV4OjB9XSk7Zm9yKGxldCBjPTAsaD1sLmxlbmd0aDtjPGg7KytjKXtjb25zdCB1PWxbY10sZj11LnN0YXJ0LGQ9dS5jb3VudDtmb3IobGV0IHA9ZixfPWYrZDtwPF87cCs9Mylmb3IobGV0IGc9MDtnPDM7ZysrKXtjb25zdCBtPW8uZ2V0WChwK2cpLHk9by5nZXRYKHArKGcrMSklMyk7aS5mcm9tQnVmZmVyQXR0cmlidXRlKGEsbSkscy5mcm9tQnVmZmVyQXR0cmlidXRlKGEseSksbW0oaSxzLG4pPT09ITAmJih0LnB1c2goaS54LGkueSxpLnopLHQucHVzaChzLngscy55LHMueikpfX19ZWxzZXtjb25zdCBhPWUuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IG89MCxsPWEuY291bnQvMztvPGw7bysrKWZvcihsZXQgYz0wO2M8MztjKyspe2NvbnN0IGg9MypvK2MsdT0zKm8rKGMrMSklMztpLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxoKSxzLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSx1KSxtbShpLHMsbik9PT0hMCYmKHQucHVzaChpLngsaS55LGkueiksdC5wdXNoKHMueCxzLnkscy56KSl9fXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFNlKHQsMykpfX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LGUucGFyYW1ldGVycyksdGhpc319ZnVuY3Rpb24gbW0ocixlLHQpe2NvbnN0IG49YCR7ci54fSwke3IueX0sJHtyLnp9LSR7ZS54fSwke2UueX0sJHtlLnp9YCxpPWAke2UueH0sJHtlLnl9LCR7ZS56fS0ke3IueH0sJHtyLnl9LCR7ci56fWA7cmV0dXJuIHQuaGFzKG4pPT09ITB8fHQuaGFzKGkpPT09ITA/ITE6KHQuYWRkKG4pLHQuYWRkKGkpLCEwKX12YXIgZ209T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQm94R2VvbWV0cnk6WWksQ2Fwc3VsZUdlb21ldHJ5OkhvLENpcmNsZUdlb21ldHJ5OldvLENvbmVHZW9tZXRyeTpYbyxDeWxpbmRlckdlb21ldHJ5Om5zLERvZGVjYWhlZHJvbkdlb21ldHJ5OnFvLEVkZ2VzR2VvbWV0cnk6YW0sRXh0cnVkZUdlb21ldHJ5OmRtLEljb3NhaGVkcm9uR2VvbWV0cnk6am8sTGF0aGVHZW9tZXRyeTpyYSxPY3RhaGVkcm9uR2VvbWV0cnk6bGEsUGxhbmVHZW9tZXRyeTokcyxQb2x5aGVkcm9uR2VvbWV0cnk6RGksUmluZ0dlb21ldHJ5OmVsLFNoYXBlR2VvbWV0cnk6dGwsU3BoZXJlR2VvbWV0cnk6Y2EsVGV0cmFoZWRyb25HZW9tZXRyeTpubCxUb3J1c0dlb21ldHJ5OmlsLFRvcnVzS25vdEdlb21ldHJ5OnJsLFR1YmVHZW9tZXRyeTpzbCxXaXJlZnJhbWVHZW9tZXRyeTpwbX0pO2NsYXNzIF9tIGV4dGVuZHMgSHR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzU2hhZG93TWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJTaGFkb3dNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgeWUoMCksdGhpcy50cmFuc3BhcmVudD0hMCx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuY29sb3IuY29weShlLmNvbG9yKSx0aGlzLmZvZz1lLmZvZyx0aGlzfX1jbGFzcyB4bSBleHRlbmRzIEhue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuaXNSYXdTaGFkZXJNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlJhd1NoYWRlck1hdGVyaWFsIn19Y2xhc3MgbnUgZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD0hMCx0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifSx0aGlzLnR5cGU9Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5ZSgxNjc3NzIxNSksdGhpcy5yb3VnaG5lc3M9MSx0aGlzLm1ldGFsbmVzcz0wLHRoaXMubWFwPW51bGwsdGhpcy5saWdodE1hcD1udWxsLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9MSx0aGlzLmFvTWFwPW51bGwsdGhpcy5hb01hcEludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmU9bmV3IHllKDApLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlTWFwPW51bGwsdGhpcy5idW1wTWFwPW51bGwsdGhpcy5idW1wU2NhbGU9MSx0aGlzLm5vcm1hbE1hcD1udWxsLHRoaXMubm9ybWFsTWFwVHlwZT13aSx0aGlzLm5vcm1hbFNjYWxlPW5ldyBxKDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5yb3VnaG5lc3NNYXA9bnVsbCx0aGlzLm1ldGFsbmVzc01hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuZW52TWFwSW50ZW5zaXR5PTEsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiJ9LHRoaXMuY29sb3IuY29weShlLmNvbG9yKSx0aGlzLnJvdWdobmVzcz1lLnJvdWdobmVzcyx0aGlzLm1ldGFsbmVzcz1lLm1ldGFsbmVzcyx0aGlzLm1hcD1lLm1hcCx0aGlzLmxpZ2h0TWFwPWUubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT1lLmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9ZS5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PWUuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KGUuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9ZS5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PWUuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPWUuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT1lLmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD1lLm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9ZS5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weShlLm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1lLmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWUuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPWUuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLnJvdWdobmVzc01hcD1lLnJvdWdobmVzc01hcCx0aGlzLm1ldGFsbmVzc01hcD1lLm1ldGFsbmVzc01hcCx0aGlzLmFscGhhTWFwPWUuYWxwaGFNYXAsdGhpcy5lbnZNYXA9ZS5lbnZNYXAsdGhpcy5lbnZNYXBJbnRlbnNpdHk9ZS5lbnZNYXBJbnRlbnNpdHksdGhpcy53aXJlZnJhbWU9ZS53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9ZS53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPWUud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPWUud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mbGF0U2hhZGluZz1lLmZsYXRTaGFkaW5nLHRoaXMuZm9nPWUuZm9nLHRoaXN9fWNsYXNzIHltIGV4dGVuZHMgbnV7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw9ITAsdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn0sdGhpcy50eXBlPSJNZXNoUGh5c2ljYWxNYXRlcmlhbCIsdGhpcy5hbmlzb3Ryb3B5Um90YXRpb249MCx0aGlzLmFuaXNvdHJvcHlNYXA9bnVsbCx0aGlzLmNsZWFyY29hdE1hcD1udWxsLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzPTAsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9bnVsbCx0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlPW5ldyBxKDEsMSksdGhpcy5jbGVhcmNvYXROb3JtYWxNYXA9bnVsbCx0aGlzLmlvcj0xLjUsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJlZmxlY3Rpdml0eSIse2dldDpmdW5jdGlvbigpe3JldHVybiBfdCgyLjUqKHRoaXMuaW9yLTEpLyh0aGlzLmlvcisxKSwwLDEpfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5pb3I9KDErLjQqdCkvKDEtLjQqdCl9fSksdGhpcy5pcmlkZXNjZW5jZU1hcD1udWxsLHRoaXMuaXJpZGVzY2VuY2VJT1I9MS4zLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZT1bMTAwLDQwMF0sdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD1udWxsLHRoaXMuc2hlZW5Db2xvcj1uZXcgeWUoMCksdGhpcy5zaGVlbkNvbG9yTWFwPW51bGwsdGhpcy5zaGVlblJvdWdobmVzcz0xLHRoaXMuc2hlZW5Sb3VnaG5lc3NNYXA9bnVsbCx0aGlzLnRyYW5zbWlzc2lvbk1hcD1udWxsLHRoaXMudGhpY2tuZXNzPTAsdGhpcy50aGlja25lc3NNYXA9bnVsbCx0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2U9MS8wLHRoaXMuYXR0ZW51YXRpb25Db2xvcj1uZXcgeWUoMSwxLDEpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHk9MSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwPW51bGwsdGhpcy5zcGVjdWxhckNvbG9yPW5ldyB5ZSgxLDEsMSksdGhpcy5zcGVjdWxhckNvbG9yTWFwPW51bGwsdGhpcy5fYW5pc290cm9weT0wLHRoaXMuX2NsZWFyY29hdD0wLHRoaXMuX2lyaWRlc2NlbmNlPTAsdGhpcy5fc2hlZW49MCx0aGlzLl90cmFuc21pc3Npb249MCx0aGlzLnNldFZhbHVlcyhlKX1nZXQgYW5pc290cm9weSgpe3JldHVybiB0aGlzLl9hbmlzb3Ryb3B5fXNldCBhbmlzb3Ryb3B5KGUpe3RoaXMuX2FuaXNvdHJvcHk+MCE9ZT4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9hbmlzb3Ryb3B5PWV9Z2V0IGNsZWFyY29hdCgpe3JldHVybiB0aGlzLl9jbGVhcmNvYXR9c2V0IGNsZWFyY29hdChlKXt0aGlzLl9jbGVhcmNvYXQ+MCE9ZT4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9jbGVhcmNvYXQ9ZX1nZXQgaXJpZGVzY2VuY2UoKXtyZXR1cm4gdGhpcy5faXJpZGVzY2VuY2V9c2V0IGlyaWRlc2NlbmNlKGUpe3RoaXMuX2lyaWRlc2NlbmNlPjAhPWU+MCYmdGhpcy52ZXJzaW9uKyssdGhpcy5faXJpZGVzY2VuY2U9ZX1nZXQgc2hlZW4oKXtyZXR1cm4gdGhpcy5fc2hlZW59c2V0IHNoZWVuKGUpe3RoaXMuX3NoZWVuPjAhPWU+MCYmdGhpcy52ZXJzaW9uKyssdGhpcy5fc2hlZW49ZX1nZXQgdHJhbnNtaXNzaW9uKCl7cmV0dXJuIHRoaXMuX3RyYW5zbWlzc2lvbn1zZXQgdHJhbnNtaXNzaW9uKGUpe3RoaXMuX3RyYW5zbWlzc2lvbj4wIT1lPjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX3RyYW5zbWlzc2lvbj1lfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn0sdGhpcy5hbmlzb3Ryb3B5PWUuYW5pc290cm9weSx0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbj1lLmFuaXNvdHJvcHlSb3RhdGlvbix0aGlzLmFuaXNvdHJvcHlNYXA9ZS5hbmlzb3Ryb3B5TWFwLHRoaXMuY2xlYXJjb2F0PWUuY2xlYXJjb2F0LHRoaXMuY2xlYXJjb2F0TWFwPWUuY2xlYXJjb2F0TWFwLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzPWUuY2xlYXJjb2F0Um91Z2huZXNzLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwPWUuY2xlYXJjb2F0Um91Z2huZXNzTWFwLHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPWUuY2xlYXJjb2F0Tm9ybWFsTWFwLHRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUuY29weShlLmNsZWFyY29hdE5vcm1hbFNjYWxlKSx0aGlzLmlvcj1lLmlvcix0aGlzLmlyaWRlc2NlbmNlPWUuaXJpZGVzY2VuY2UsdGhpcy5pcmlkZXNjZW5jZU1hcD1lLmlyaWRlc2NlbmNlTWFwLHRoaXMuaXJpZGVzY2VuY2VJT1I9ZS5pcmlkZXNjZW5jZUlPUix0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2U9Wy4uLmUuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZV0sdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD1lLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLHRoaXMuc2hlZW49ZS5zaGVlbix0aGlzLnNoZWVuQ29sb3IuY29weShlLnNoZWVuQ29sb3IpLHRoaXMuc2hlZW5Db2xvck1hcD1lLnNoZWVuQ29sb3JNYXAsdGhpcy5zaGVlblJvdWdobmVzcz1lLnNoZWVuUm91Z2huZXNzLHRoaXMuc2hlZW5Sb3VnaG5lc3NNYXA9ZS5zaGVlblJvdWdobmVzc01hcCx0aGlzLnRyYW5zbWlzc2lvbj1lLnRyYW5zbWlzc2lvbix0aGlzLnRyYW5zbWlzc2lvbk1hcD1lLnRyYW5zbWlzc2lvbk1hcCx0aGlzLnRoaWNrbmVzcz1lLnRoaWNrbmVzcyx0aGlzLnRoaWNrbmVzc01hcD1lLnRoaWNrbmVzc01hcCx0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2U9ZS5hdHRlbnVhdGlvbkRpc3RhbmNlLHRoaXMuYXR0ZW51YXRpb25Db2xvci5jb3B5KGUuYXR0ZW51YXRpb25Db2xvciksdGhpcy5zcGVjdWxhckludGVuc2l0eT1lLnNwZWN1bGFySW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXA9ZS5zcGVjdWxhckludGVuc2l0eU1hcCx0aGlzLnNwZWN1bGFyQ29sb3IuY29weShlLnNwZWN1bGFyQ29sb3IpLHRoaXMuc3BlY3VsYXJDb2xvck1hcD1lLnNwZWN1bGFyQ29sb3JNYXAsdGhpc319Y2xhc3Mgdm0gZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNNZXNoUGhvbmdNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hQaG9uZ01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5ZSgxNjc3NzIxNSksdGhpcy5zcGVjdWxhcj1uZXcgeWUoMTExODQ4MSksdGhpcy5zaGluaW5lc3M9MzAsdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZT1uZXcgeWUoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPXdpLHRoaXMubm9ybWFsU2NhbGU9bmV3IHEoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5jb21iaW5lPVNzLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXMoZSl9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLmNvbG9yLmNvcHkoZS5jb2xvciksdGhpcy5zcGVjdWxhci5jb3B5KGUuc3BlY3VsYXIpLHRoaXMuc2hpbmluZXNzPWUuc2hpbmluZXNzLHRoaXMubWFwPWUubWFwLHRoaXMubGlnaHRNYXA9ZS5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PWUubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD1lLmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9ZS5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkoZS5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD1lLmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9ZS5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9ZS5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPWUuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPWUubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT1lLm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KGUubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPWUuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9ZS5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9ZS5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuc3BlY3VsYXJNYXA9ZS5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPWUuYWxwaGFNYXAsdGhpcy5lbnZNYXA9ZS5lbnZNYXAsdGhpcy5jb21iaW5lPWUuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT1lLnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz1lLnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT1lLndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1lLndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9ZS53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49ZS53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZsYXRTaGFkaW5nPWUuZmxhdFNoYWRpbmcsdGhpcy5mb2c9ZS5mb2csdGhpc319Y2xhc3MgTW0gZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNNZXNoVG9vbk1hdGVyaWFsPSEwLHRoaXMuZGVmaW5lcz17VE9PTjoiIn0sdGhpcy50eXBlPSJNZXNoVG9vbk1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5ZSgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmdyYWRpZW50TWFwPW51bGwsdGhpcy5saWdodE1hcD1udWxsLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9MSx0aGlzLmFvTWFwPW51bGwsdGhpcy5hb01hcEludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmU9bmV3IHllKDApLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlTWFwPW51bGwsdGhpcy5idW1wTWFwPW51bGwsdGhpcy5idW1wU2NhbGU9MSx0aGlzLm5vcm1hbE1hcD1udWxsLHRoaXMubm9ybWFsTWFwVHlwZT13aSx0aGlzLm5vcm1hbFNjYWxlPW5ldyBxKDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKGUpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5jb2xvci5jb3B5KGUuY29sb3IpLHRoaXMubWFwPWUubWFwLHRoaXMuZ3JhZGllbnRNYXA9ZS5ncmFkaWVudE1hcCx0aGlzLmxpZ2h0TWFwPWUubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT1lLmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9ZS5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PWUuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KGUuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9ZS5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PWUuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPWUuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT1lLmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD1lLm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9ZS5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weShlLm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1lLmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWUuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPWUuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLmFscGhhTWFwPWUuYWxwaGFNYXAsdGhpcy53aXJlZnJhbWU9ZS53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9ZS53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPWUud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPWUud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mb2c9ZS5mb2csdGhpc319Y2xhc3MgU20gZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNNZXNoTm9ybWFsTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJNZXNoTm9ybWFsTWF0ZXJpYWwiLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9d2ksdGhpcy5ub3JtYWxTY2FsZT1uZXcgcSgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuYnVtcE1hcD1lLmJ1bXBNYXAsdGhpcy5idW1wU2NhbGU9ZS5idW1wU2NhbGUsdGhpcy5ub3JtYWxNYXA9ZS5ub3JtYWxNYXAsdGhpcy5ub3JtYWxNYXBUeXBlPWUubm9ybWFsTWFwVHlwZSx0aGlzLm5vcm1hbFNjYWxlLmNvcHkoZS5ub3JtYWxTY2FsZSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9ZS5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1lLmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz1lLmRpc3BsYWNlbWVudEJpYXMsdGhpcy53aXJlZnJhbWU9ZS53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9ZS53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy5mbGF0U2hhZGluZz1lLmZsYXRTaGFkaW5nLHRoaXN9fWNsYXNzIGJtIGV4dGVuZHMgSHR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzTWVzaExhbWJlcnRNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hMYW1iZXJ0TWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHllKDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyB5ZSgwKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZU1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9d2ksdGhpcy5ub3JtYWxTY2FsZT1uZXcgcSgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMuc3BlY3VsYXJNYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5lbnZNYXA9bnVsbCx0aGlzLmNvbWJpbmU9U3MsdGhpcy5yZWZsZWN0aXZpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuY29sb3IuY29weShlLmNvbG9yKSx0aGlzLm1hcD1lLm1hcCx0aGlzLmxpZ2h0TWFwPWUubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT1lLmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9ZS5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PWUuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KGUuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9ZS5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PWUuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPWUuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT1lLmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD1lLm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9ZS5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weShlLm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1lLmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWUuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPWUuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLnNwZWN1bGFyTWFwPWUuc3BlY3VsYXJNYXAsdGhpcy5hbHBoYU1hcD1lLmFscGhhTWFwLHRoaXMuZW52TWFwPWUuZW52TWFwLHRoaXMuY29tYmluZT1lLmNvbWJpbmUsdGhpcy5yZWZsZWN0aXZpdHk9ZS5yZWZsZWN0aXZpdHksdGhpcy5yZWZyYWN0aW9uUmF0aW89ZS5yZWZyYWN0aW9uUmF0aW8sdGhpcy53aXJlZnJhbWU9ZS53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9ZS53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPWUud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPWUud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mbGF0U2hhZGluZz1lLmZsYXRTaGFkaW5nLHRoaXMuZm9nPWUuZm9nLHRoaXN9fWNsYXNzIHdtIGV4dGVuZHMgSHR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzTWVzaE1hdGNhcE1hdGVyaWFsPSEwLHRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifSx0aGlzLnR5cGU9Ik1lc2hNYXRjYXBNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgeWUoMTY3NzcyMTUpLHRoaXMubWF0Y2FwPW51bGwsdGhpcy5tYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPXdpLHRoaXMubm9ybWFsU2NhbGU9bmV3IHEoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifSx0aGlzLmNvbG9yLmNvcHkoZS5jb2xvciksdGhpcy5tYXRjYXA9ZS5tYXRjYXAsdGhpcy5tYXA9ZS5tYXAsdGhpcy5idW1wTWFwPWUuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT1lLmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD1lLm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9ZS5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weShlLm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1lLmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWUuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPWUuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLmFscGhhTWFwPWUuYWxwaGFNYXAsdGhpcy5mbGF0U2hhZGluZz1lLmZsYXRTaGFkaW5nLHRoaXMuZm9nPWUuZm9nLHRoaXN9fWNsYXNzIEVtIGV4dGVuZHMgS3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzTGluZURhc2hlZE1hdGVyaWFsPSEwLHRoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIix0aGlzLnNjYWxlPTEsdGhpcy5kYXNoU2l6ZT0zLHRoaXMuZ2FwU2l6ZT0xLHRoaXMuc2V0VmFsdWVzKGUpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5zY2FsZT1lLnNjYWxlLHRoaXMuZGFzaFNpemU9ZS5kYXNoU2l6ZSx0aGlzLmdhcFNpemU9ZS5nYXBTaXplLHRoaXN9fWZ1bmN0aW9uIG5yKHIsZSx0KXtyZXR1cm4hcnx8IXQmJnIuY29uc3RydWN0b3I9PT1lP3I6dHlwZW9mIGUuQllURVNfUEVSX0VMRU1FTlQ9PSJudW1iZXIiP25ldyBlKHIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHIpfWZ1bmN0aW9uIEFtKHIpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcocikmJiEociBpbnN0YW5jZW9mIERhdGFWaWV3KX1mdW5jdGlvbiBUbShyKXtmdW5jdGlvbiBlKGkscyl7cmV0dXJuIHJbaV0tcltzXX1jb25zdCB0PXIubGVuZ3RoLG49bmV3IEFycmF5KHQpO2ZvcihsZXQgaT0wO2khPT10OysraSluW2ldPWk7cmV0dXJuIG4uc29ydChlKSxufWZ1bmN0aW9uIGl1KHIsZSx0KXtjb25zdCBuPXIubGVuZ3RoLGk9bmV3IHIuY29uc3RydWN0b3Iobik7Zm9yKGxldCBzPTAsYT0wO2EhPT1uOysrcyl7Y29uc3Qgbz10W3NdKmU7Zm9yKGxldCBsPTA7bCE9PWU7KytsKWlbYSsrXT1yW28rbF19cmV0dXJuIGl9ZnVuY3Rpb24gcnUocixlLHQsbil7bGV0IGk9MSxzPXJbMF07Zm9yKDtzIT09dm9pZCAwJiZzW25dPT09dm9pZCAwOylzPXJbaSsrXTtpZihzPT09dm9pZCAwKXJldHVybjtsZXQgYT1zW25dO2lmKGEhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheShhKSlkbyBhPXNbbl0sYSE9PXZvaWQgMCYmKGUucHVzaChzLnRpbWUpLHQucHVzaC5hcHBseSh0LGEpKSxzPXJbaSsrXTt3aGlsZShzIT09dm9pZCAwKTtlbHNlIGlmKGEudG9BcnJheSE9PXZvaWQgMClkbyBhPXNbbl0sYSE9PXZvaWQgMCYmKGUucHVzaChzLnRpbWUpLGEudG9BcnJheSh0LHQubGVuZ3RoKSkscz1yW2krK107d2hpbGUocyE9PXZvaWQgMCk7ZWxzZSBkbyBhPXNbbl0sYSE9PXZvaWQgMCYmKGUucHVzaChzLnRpbWUpLHQucHVzaChhKSkscz1yW2krK107d2hpbGUocyE9PXZvaWQgMCl9ZnVuY3Rpb24gZGIocixlLHQsbixpPTMwKXtjb25zdCBzPXIuY2xvbmUoKTtzLm5hbWU9ZTtjb25zdCBhPVtdO2ZvcihsZXQgbD0wO2w8cy50cmFja3MubGVuZ3RoOysrbCl7Y29uc3QgYz1zLnRyYWNrc1tsXSxoPWMuZ2V0VmFsdWVTaXplKCksdT1bXSxmPVtdO2ZvcihsZXQgZD0wO2Q8Yy50aW1lcy5sZW5ndGg7KytkKXtjb25zdCBwPWMudGltZXNbZF0qaTtpZighKHA8dHx8cD49bikpe3UucHVzaChjLnRpbWVzW2RdKTtmb3IobGV0IF89MDtfPGg7KytfKWYucHVzaChjLnZhbHVlc1tkKmgrX10pfX11Lmxlbmd0aCE9PTAmJihjLnRpbWVzPW5yKHUsYy50aW1lcy5jb25zdHJ1Y3RvciksYy52YWx1ZXM9bnIoZixjLnZhbHVlcy5jb25zdHJ1Y3RvciksYS5wdXNoKGMpKX1zLnRyYWNrcz1hO2xldCBvPTEvMDtmb3IobGV0IGw9MDtsPHMudHJhY2tzLmxlbmd0aDsrK2wpbz5zLnRyYWNrc1tsXS50aW1lc1swXSYmKG89cy50cmFja3NbbF0udGltZXNbMF0pO2ZvcihsZXQgbD0wO2w8cy50cmFja3MubGVuZ3RoOysrbClzLnRyYWNrc1tsXS5zaGlmdCgtMSpvKTtyZXR1cm4gcy5yZXNldER1cmF0aW9uKCksc31mdW5jdGlvbiBwYihyLGU9MCx0PXIsbj0zMCl7bjw9MCYmKG49MzApO2NvbnN0IGk9dC50cmFja3MubGVuZ3RoLHM9ZS9uO2ZvcihsZXQgYT0wO2E8aTsrK2Epe2NvbnN0IG89dC50cmFja3NbYV0sbD1vLlZhbHVlVHlwZU5hbWU7aWYobD09PSJib29sInx8bD09PSJzdHJpbmciKWNvbnRpbnVlO2NvbnN0IGM9ci50cmFja3MuZmluZChmdW5jdGlvbihtKXtyZXR1cm4gbS5uYW1lPT09by5uYW1lJiZtLlZhbHVlVHlwZU5hbWU9PT1sfSk7aWYoYz09PXZvaWQgMCljb250aW51ZTtsZXQgaD0wO2NvbnN0IHU9by5nZXRWYWx1ZVNpemUoKTtvLmNyZWF0ZUludGVycG9sYW50LmlzSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kR0xURkN1YmljU3BsaW5lJiYoaD11LzMpO2xldCBmPTA7Y29uc3QgZD1jLmdldFZhbHVlU2l6ZSgpO2MuY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUmJihmPWQvMyk7Y29uc3QgcD1vLnRpbWVzLmxlbmd0aC0xO2xldCBfO2lmKHM8PW8udGltZXNbMF0pe2NvbnN0IG09aCx5PXUtaDtfPW8udmFsdWVzLnNsaWNlKG0seSl9ZWxzZSBpZihzPj1vLnRpbWVzW3BdKXtjb25zdCBtPXAqdStoLHk9bSt1LWg7Xz1vLnZhbHVlcy5zbGljZShtLHkpfWVsc2V7Y29uc3QgbT1vLmNyZWF0ZUludGVycG9sYW50KCkseT1oLHg9dS1oO20uZXZhbHVhdGUocyksXz1tLnJlc3VsdEJ1ZmZlci5zbGljZSh5LHgpfWw9PT0icXVhdGVybmlvbiImJm5ldyBsbigpLmZyb21BcnJheShfKS5ub3JtYWxpemUoKS5jb25qdWdhdGUoKS50b0FycmF5KF8pO2NvbnN0IGc9Yy50aW1lcy5sZW5ndGg7Zm9yKGxldCBtPTA7bTxnOysrbSl7Y29uc3QgeT1tKmQrZjtpZihsPT09InF1YXRlcm5pb24iKWxuLm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KGMudmFsdWVzLHksXywwLGMudmFsdWVzLHkpO2Vsc2V7Y29uc3QgeD1kLWYqMjtmb3IobGV0IHY9MDt2PHg7Kyt2KWMudmFsdWVzW3krdl0tPV9bdl19fX1yZXR1cm4gci5ibGVuZE1vZGU9WWMscn1jb25zdCBtYj17Y29udmVydEFycmF5Om5yLGlzVHlwZWRBcnJheTpBbSxnZXRLZXlmcmFtZU9yZGVyOlRtLHNvcnRlZEFycmF5Oml1LGZsYXR0ZW5KU09OOnJ1LHN1YmNsaXA6ZGIsbWFrZUNsaXBBZGRpdGl2ZTpwYn07Y2xhc3MgaGF7Y29uc3RydWN0b3IoZSx0LG4saSl7dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM9ZSx0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMucmVzdWx0QnVmZmVyPWkhPT12b2lkIDA/aTpuZXcgdC5jb25zdHJ1Y3RvcihuKSx0aGlzLnNhbXBsZVZhbHVlcz10LHRoaXMudmFsdWVTaXplPW4sdGhpcy5zZXR0aW5ncz1udWxsLHRoaXMuRGVmYXVsdFNldHRpbmdzXz17fX1ldmFsdWF0ZShlKXtjb25zdCB0PXRoaXMucGFyYW1ldGVyUG9zaXRpb25zO2xldCBuPXRoaXMuX2NhY2hlZEluZGV4LGk9dFtuXSxzPXRbbi0xXTtlOnt0OntsZXQgYTtuOntpOmlmKCEoZTxpKSl7Zm9yKGxldCBvPW4rMjs7KXtpZihpPT09dm9pZCAwKXtpZihlPHMpYnJlYWsgaTtyZXR1cm4gbj10Lmxlbmd0aCx0aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuY29weVNhbXBsZVZhbHVlXyhuLTEpfWlmKG49PT1vKWJyZWFrO2lmKHM9aSxpPXRbKytuXSxlPGkpYnJlYWsgdH1hPXQubGVuZ3RoO2JyZWFrIG59aWYoIShlPj1zKSl7Y29uc3Qgbz10WzFdO2U8byYmKG49MixzPW8pO2ZvcihsZXQgbD1uLTI7Oyl7aWYocz09PXZvaWQgMClyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oMCk7aWYobj09PWwpYnJlYWs7aWYoaT1zLHM9dFstLW4tMV0sZT49cylicmVhayB0fWE9bixuPTA7YnJlYWsgbn1icmVhayBlfWZvcig7bjxhOyl7Y29uc3Qgbz1uK2E+Pj4xO2U8dFtvXT9hPW86bj1vKzF9aWYoaT10W25dLHM9dFtuLTFdLHM9PT12b2lkIDApcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5jb3B5U2FtcGxlVmFsdWVfKDApO2lmKGk9PT12b2lkIDApcmV0dXJuIG49dC5sZW5ndGgsdGhpcy5fY2FjaGVkSW5kZXg9bix0aGlzLmNvcHlTYW1wbGVWYWx1ZV8obi0xKX10aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuaW50ZXJ2YWxDaGFuZ2VkXyhuLHMsaSl9cmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKG4scyxlLGkpfWdldFNldHRpbmdzXygpe3JldHVybiB0aGlzLnNldHRpbmdzfHx0aGlzLkRlZmF1bHRTZXR0aW5nc199Y29weVNhbXBsZVZhbHVlXyhlKXtjb25zdCB0PXRoaXMucmVzdWx0QnVmZmVyLG49dGhpcy5zYW1wbGVWYWx1ZXMsaT10aGlzLnZhbHVlU2l6ZSxzPWUqaTtmb3IobGV0IGE9MDthIT09aTsrK2EpdFthXT1uW3MrYV07cmV0dXJuIHR9aW50ZXJwb2xhdGVfKCl7dGhyb3cgbmV3IEVycm9yKCJjYWxsIHRvIGFic3RyYWN0IG1ldGhvZCIpfWludGVydmFsQ2hhbmdlZF8oKXt9fWNsYXNzIENtIGV4dGVuZHMgaGF7Y29uc3RydWN0b3IoZSx0LG4saSl7c3VwZXIoZSx0LG4saSksdGhpcy5fd2VpZ2h0UHJldj0tMCx0aGlzLl9vZmZzZXRQcmV2PS0wLHRoaXMuX3dlaWdodE5leHQ9LTAsdGhpcy5fb2Zmc2V0TmV4dD0tMCx0aGlzLkRlZmF1bHRTZXR0aW5nc189e2VuZGluZ1N0YXJ0OmtpLGVuZGluZ0VuZDpraX19aW50ZXJ2YWxDaGFuZ2VkXyhlLHQsbil7Y29uc3QgaT10aGlzLnBhcmFtZXRlclBvc2l0aW9ucztsZXQgcz1lLTIsYT1lKzEsbz1pW3NdLGw9aVthXTtpZihvPT09dm9pZCAwKXN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0KXtjYXNlIEdpOnM9ZSxvPTIqdC1uO2JyZWFrO2Nhc2UgUHM6cz1pLmxlbmd0aC0yLG89dCtpW3NdLWlbcysxXTticmVhaztkZWZhdWx0OnM9ZSxvPW59aWYobD09PXZvaWQgMClzd2l0Y2godGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQpe2Nhc2UgR2k6YT1lLGw9MipuLXQ7YnJlYWs7Y2FzZSBQczphPTEsbD1uK2lbMV0taVswXTticmVhaztkZWZhdWx0OmE9ZS0xLGw9dH1jb25zdCBjPShuLXQpKi41LGg9dGhpcy52YWx1ZVNpemU7dGhpcy5fd2VpZ2h0UHJldj1jLyh0LW8pLHRoaXMuX3dlaWdodE5leHQ9Yy8obC1uKSx0aGlzLl9vZmZzZXRQcmV2PXMqaCx0aGlzLl9vZmZzZXROZXh0PWEqaH1pbnRlcnBvbGF0ZV8oZSx0LG4saSl7Y29uc3Qgcz10aGlzLnJlc3VsdEJ1ZmZlcixhPXRoaXMuc2FtcGxlVmFsdWVzLG89dGhpcy52YWx1ZVNpemUsbD1lKm8sYz1sLW8saD10aGlzLl9vZmZzZXRQcmV2LHU9dGhpcy5fb2Zmc2V0TmV4dCxmPXRoaXMuX3dlaWdodFByZXYsZD10aGlzLl93ZWlnaHROZXh0LHA9KG4tdCkvKGktdCksXz1wKnAsZz1fKnAsbT0tZipnKzIqZipfLWYqcCx5PSgxK2YpKmcrKC0xLjUtMipmKSpfKygtLjUrZikqcCsxLHg9KC0xLWQpKmcrKDEuNStkKSpfKy41KnAsdj1kKmctZCpfO2ZvcihsZXQgUz0wO1MhPT1vOysrUylzW1NdPW0qYVtoK1NdK3kqYVtjK1NdK3gqYVtsK1NdK3YqYVt1K1NdO3JldHVybiBzfX1jbGFzcyBzdSBleHRlbmRzIGhhe2NvbnN0cnVjdG9yKGUsdCxuLGkpe3N1cGVyKGUsdCxuLGkpfWludGVycG9sYXRlXyhlLHQsbixpKXtjb25zdCBzPXRoaXMucmVzdWx0QnVmZmVyLGE9dGhpcy5zYW1wbGVWYWx1ZXMsbz10aGlzLnZhbHVlU2l6ZSxsPWUqbyxjPWwtbyxoPShuLXQpLyhpLXQpLHU9MS1oO2ZvcihsZXQgZj0wO2YhPT1vOysrZilzW2ZdPWFbYytmXSp1K2FbbCtmXSpoO3JldHVybiBzfX1jbGFzcyBSbSBleHRlbmRzIGhhe2NvbnN0cnVjdG9yKGUsdCxuLGkpe3N1cGVyKGUsdCxuLGkpfWludGVycG9sYXRlXyhlKXtyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKGUtMSl9fWNsYXNzIE9ue2NvbnN0cnVjdG9yKGUsdCxuLGkpe2lmKGU9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayBuYW1lIGlzIHVuZGVmaW5lZCIpO2lmKHQ9PT12b2lkIDB8fHQubGVuZ3RoPT09MCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IG5vIGtleWZyYW1lcyBpbiB0cmFjayBuYW1lZCAiK2UpO3RoaXMubmFtZT1lLHRoaXMudGltZXM9bnIodCx0aGlzLlRpbWVCdWZmZXJUeXBlKSx0aGlzLnZhbHVlcz1ucihuLHRoaXMuVmFsdWVCdWZmZXJUeXBlKSx0aGlzLnNldEludGVycG9sYXRpb24oaXx8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9c3RhdGljIHRvSlNPTihlKXtjb25zdCB0PWUuY29uc3RydWN0b3I7bGV0IG47aWYodC50b0pTT04hPT10aGlzLnRvSlNPTiluPXQudG9KU09OKGUpO2Vsc2V7bj17bmFtZTplLm5hbWUsdGltZXM6bnIoZS50aW1lcyxBcnJheSksdmFsdWVzOm5yKGUudmFsdWVzLEFycmF5KX07Y29uc3QgaT1lLmdldEludGVycG9sYXRpb24oKTtpIT09ZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiYmKG4uaW50ZXJwb2xhdGlvbj1pKX1yZXR1cm4gbi50eXBlPWUuVmFsdWVUeXBlTmFtZSxufUludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlKGUpe3JldHVybiBuZXcgUm0odGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGUpfUludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcihlKXtyZXR1cm4gbmV3IHN1KHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSxlKX1JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGgoZSl7cmV0dXJuIG5ldyBDbSh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksZSl9c2V0SW50ZXJwb2xhdGlvbihlKXtsZXQgdDtzd2l0Y2goZSl7Y2FzZSBDczp0PXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU7YnJlYWs7Y2FzZSBSczp0PXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyO2JyZWFrO2Nhc2UgV2E6dD10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDticmVha31pZih0PT09dm9pZCAwKXtjb25zdCBuPSJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAiK3RoaXMuVmFsdWVUeXBlTmFtZSsiIGtleWZyYW1lIHRyYWNrIG5hbWVkICIrdGhpcy5uYW1lO2lmKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ9PT12b2lkIDApaWYoZSE9PXRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pdGhpcy5zZXRJbnRlcnBvbGF0aW9uKHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pO2Vsc2UgdGhyb3cgbmV3IEVycm9yKG4pO3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLktleWZyYW1lVHJhY2s6IixuKSx0aGlzfXJldHVybiB0aGlzLmNyZWF0ZUludGVycG9sYW50PXQsdGhpc31nZXRJbnRlcnBvbGF0aW9uKCl7c3dpdGNoKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpe2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpyZXR1cm4gQ3M7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpyZXR1cm4gUnM7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpyZXR1cm4gV2F9fWdldFZhbHVlU2l6ZSgpe3JldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgvdGhpcy50aW1lcy5sZW5ndGh9c2hpZnQoZSl7aWYoZSE9PTApe2NvbnN0IHQ9dGhpcy50aW1lcztmb3IobGV0IG49MCxpPXQubGVuZ3RoO24hPT1pOysrbil0W25dKz1lfXJldHVybiB0aGlzfXNjYWxlKGUpe2lmKGUhPT0xKXtjb25zdCB0PXRoaXMudGltZXM7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuIT09aTsrK24pdFtuXSo9ZX1yZXR1cm4gdGhpc310cmltKGUsdCl7Y29uc3Qgbj10aGlzLnRpbWVzLGk9bi5sZW5ndGg7bGV0IHM9MCxhPWktMTtmb3IoO3MhPT1pJiZuW3NdPGU7KSsrcztmb3IoO2EhPT0tMSYmblthXT50OyktLWE7aWYoKythLHMhPT0wfHxhIT09aSl7cz49YSYmKGE9TWF0aC5tYXgoYSwxKSxzPWEtMSk7Y29uc3Qgbz10aGlzLmdldFZhbHVlU2l6ZSgpO3RoaXMudGltZXM9bi5zbGljZShzLGEpLHRoaXMudmFsdWVzPXRoaXMudmFsdWVzLnNsaWNlKHMqbyxhKm8pfXJldHVybiB0aGlzfXZhbGlkYXRlKCl7bGV0IGU9ITA7Y29uc3QgdD10aGlzLmdldFZhbHVlU2l6ZSgpO3QtTWF0aC5mbG9vcih0KSE9PTAmJihjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBJbnZhbGlkIHZhbHVlIHNpemUgaW4gdHJhY2suIix0aGlzKSxlPSExKTtjb25zdCBuPXRoaXMudGltZXMsaT10aGlzLnZhbHVlcyxzPW4ubGVuZ3RoO3M9PT0wJiYoY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuIix0aGlzKSxlPSExKTtsZXQgYT1udWxsO2ZvcihsZXQgbz0wO28hPT1zO28rKyl7Y29uc3QgbD1uW29dO2lmKHR5cGVvZiBsPT0ibnVtYmVyIiYmaXNOYU4obCkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFRpbWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsdGhpcyxvLGwpLGU9ITE7YnJlYWt9aWYoYSE9PW51bGwmJmE+bCl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuIix0aGlzLG8sbCxhKSxlPSExO2JyZWFrfWE9bH1pZihpIT09dm9pZCAwJiZBbShpKSlmb3IobGV0IG89MCxsPWkubGVuZ3RoO28hPT1sOysrbyl7Y29uc3QgYz1pW29dO2lmKGlzTmFOKGMpKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBWYWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIix0aGlzLG8sYyksZT0hMTticmVha319cmV0dXJuIGV9b3B0aW1pemUoKXtjb25zdCBlPXRoaXMudGltZXMuc2xpY2UoKSx0PXRoaXMudmFsdWVzLnNsaWNlKCksbj10aGlzLmdldFZhbHVlU2l6ZSgpLGk9dGhpcy5nZXRJbnRlcnBvbGF0aW9uKCk9PT1XYSxzPWUubGVuZ3RoLTE7bGV0IGE9MTtmb3IobGV0IG89MTtvPHM7KytvKXtsZXQgbD0hMTtjb25zdCBjPWVbb10saD1lW28rMV07aWYoYyE9PWgmJihvIT09MXx8YyE9PWVbMF0pKWlmKGkpbD0hMDtlbHNle2NvbnN0IHU9bypuLGY9dS1uLGQ9dStuO2ZvcihsZXQgcD0wO3AhPT1uOysrcCl7Y29uc3QgXz10W3UrcF07aWYoXyE9PXRbZitwXXx8XyE9PXRbZCtwXSl7bD0hMDticmVha319fWlmKGwpe2lmKG8hPT1hKXtlW2FdPWVbb107Y29uc3QgdT1vKm4sZj1hKm47Zm9yKGxldCBkPTA7ZCE9PW47KytkKXRbZitkXT10W3UrZF19KythfX1pZihzPjApe2VbYV09ZVtzXTtmb3IobGV0IG89cypuLGw9YSpuLGM9MDtjIT09bjsrK2MpdFtsK2NdPXRbbytjXTsrK2F9cmV0dXJuIGEhPT1lLmxlbmd0aD8odGhpcy50aW1lcz1lLnNsaWNlKDAsYSksdGhpcy52YWx1ZXM9dC5zbGljZSgwLGEqbikpOih0aGlzLnRpbWVzPWUsdGhpcy52YWx1ZXM9dCksdGhpc31jbG9uZSgpe2NvbnN0IGU9dGhpcy50aW1lcy5zbGljZSgpLHQ9dGhpcy52YWx1ZXMuc2xpY2UoKSxuPXRoaXMuY29uc3RydWN0b3IsaT1uZXcgbih0aGlzLm5hbWUsZSx0KTtyZXR1cm4gaS5jcmVhdGVJbnRlcnBvbGFudD10aGlzLmNyZWF0ZUludGVycG9sYW50LGl9fU9uLnByb3RvdHlwZS5UaW1lQnVmZmVyVHlwZT1GbG9hdDMyQXJyYXksT24ucHJvdG90eXBlLlZhbHVlQnVmZmVyVHlwZT1GbG9hdDMyQXJyYXksT24ucHJvdG90eXBlLkRlZmF1bHRJbnRlcnBvbGF0aW9uPVJzO2NsYXNzIGlyIGV4dGVuZHMgT257fWlyLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJib29sIixpci5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUFycmF5LGlyLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj1Dcyxpci5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyPXZvaWQgMCxpci5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoPXZvaWQgMDtjbGFzcyBhdSBleHRlbmRzIE9ue31hdS5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0iY29sb3IiO2NsYXNzIHVhIGV4dGVuZHMgT257fXVhLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJudW1iZXIiO2NsYXNzIFBtIGV4dGVuZHMgaGF7Y29uc3RydWN0b3IoZSx0LG4saSl7c3VwZXIoZSx0LG4saSl9aW50ZXJwb2xhdGVfKGUsdCxuLGkpe2NvbnN0IHM9dGhpcy5yZXN1bHRCdWZmZXIsYT10aGlzLnNhbXBsZVZhbHVlcyxvPXRoaXMudmFsdWVTaXplLGw9KG4tdCkvKGktdCk7bGV0IGM9ZSpvO2ZvcihsZXQgaD1jK287YyE9PWg7Yys9NClsbi5zbGVycEZsYXQocywwLGEsYy1vLGEsYyxsKTtyZXR1cm4gc319Y2xhc3MgcnMgZXh0ZW5kcyBPbntJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIoZSl7cmV0dXJuIG5ldyBQbSh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksZSl9fXJzLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJxdWF0ZXJuaW9uIixycy5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249UnMscnMucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aD12b2lkIDA7Y2xhc3MgcnIgZXh0ZW5kcyBPbnt9cnIucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9InN0cmluZyIscnIucHJvdG90eXBlLlZhbHVlQnVmZmVyVHlwZT1BcnJheSxyci5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249Q3MscnIucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcj12b2lkIDAscnIucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aD12b2lkIDA7Y2xhc3MgZmEgZXh0ZW5kcyBPbnt9ZmEucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9InZlY3RvciI7Y2xhc3MgZGF7Y29uc3RydWN0b3IoZSx0PS0xLG4saT1YYSl7dGhpcy5uYW1lPWUsdGhpcy50cmFja3M9bix0aGlzLmR1cmF0aW9uPXQsdGhpcy5ibGVuZE1vZGU9aSx0aGlzLnV1aWQ9X24oKSx0aGlzLmR1cmF0aW9uPDAmJnRoaXMucmVzZXREdXJhdGlvbigpfXN0YXRpYyBwYXJzZShlKXtjb25zdCB0PVtdLG49ZS50cmFja3MsaT0xLyhlLmZwc3x8MSk7Zm9yKGxldCBhPTAsbz1uLmxlbmd0aDthIT09bzsrK2EpdC5wdXNoKF9iKG5bYV0pLnNjYWxlKGkpKTtjb25zdCBzPW5ldyB0aGlzKGUubmFtZSxlLmR1cmF0aW9uLHQsZS5ibGVuZE1vZGUpO3JldHVybiBzLnV1aWQ9ZS51dWlkLHN9c3RhdGljIHRvSlNPTihlKXtjb25zdCB0PVtdLG49ZS50cmFja3MsaT17bmFtZTplLm5hbWUsZHVyYXRpb246ZS5kdXJhdGlvbix0cmFja3M6dCx1dWlkOmUudXVpZCxibGVuZE1vZGU6ZS5ibGVuZE1vZGV9O2ZvcihsZXQgcz0wLGE9bi5sZW5ndGg7cyE9PWE7KytzKXQucHVzaChPbi50b0pTT04obltzXSkpO3JldHVybiBpfXN0YXRpYyBDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZShlLHQsbixpKXtjb25zdCBzPXQubGVuZ3RoLGE9W107Zm9yKGxldCBvPTA7bzxzO28rKyl7bGV0IGw9W10sYz1bXTtsLnB1c2goKG8rcy0xKSVzLG8sKG8rMSklcyksYy5wdXNoKDAsMSwwKTtjb25zdCBoPVRtKGwpO2w9aXUobCwxLGgpLGM9aXUoYywxLGgpLCFpJiZsWzBdPT09MCYmKGwucHVzaChzKSxjLnB1c2goY1swXSkpLGEucHVzaChuZXcgdWEoIi5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIit0W29dLm5hbWUrIl0iLGwsYykuc2NhbGUoMS9uKSl9cmV0dXJuIG5ldyB0aGlzKGUsLTEsYSl9c3RhdGljIGZpbmRCeU5hbWUoZSx0KXtsZXQgbj1lO2lmKCFBcnJheS5pc0FycmF5KGUpKXtjb25zdCBpPWU7bj1pLmdlb21ldHJ5JiZpLmdlb21ldHJ5LmFuaW1hdGlvbnN8fGkuYW5pbWF0aW9uc31mb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKylpZihuW2ldLm5hbWU9PT10KXJldHVybiBuW2ldO3JldHVybiBudWxsfXN0YXRpYyBDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlcyhlLHQsbil7Y29uc3QgaT17fSxzPS9eKFtcdy1dKj8pKFtcZF0rKSQvO2ZvcihsZXQgbz0wLGw9ZS5sZW5ndGg7bzxsO28rKyl7Y29uc3QgYz1lW29dLGg9Yy5uYW1lLm1hdGNoKHMpO2lmKGgmJmgubGVuZ3RoPjEpe2NvbnN0IHU9aFsxXTtsZXQgZj1pW3VdO2Z8fChpW3VdPWY9W10pLGYucHVzaChjKX19Y29uc3QgYT1bXTtmb3IoY29uc3QgbyBpbiBpKWEucHVzaCh0aGlzLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKG8saVtvXSx0LG4pKTtyZXR1cm4gYX1zdGF0aWMgcGFyc2VBbmltYXRpb24oZSx0KXtpZighZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uQ2xpcDogTm8gYW5pbWF0aW9uIGluIEpTT05Mb2FkZXIgZGF0YS4iKSxudWxsO2NvbnN0IG49ZnVuY3Rpb24odSxmLGQscCxfKXtpZihkLmxlbmd0aCE9PTApe2NvbnN0IGc9W10sbT1bXTtydShkLGcsbSxwKSxnLmxlbmd0aCE9PTAmJl8ucHVzaChuZXcgdShmLGcsbSkpfX0saT1bXSxzPWUubmFtZXx8ImRlZmF1bHQiLGE9ZS5mcHN8fDMwLG89ZS5ibGVuZE1vZGU7bGV0IGw9ZS5sZW5ndGh8fC0xO2NvbnN0IGM9ZS5oaWVyYXJjaHl8fFtdO2ZvcihsZXQgdT0wO3U8Yy5sZW5ndGg7dSsrKXtjb25zdCBmPWNbdV0ua2V5cztpZighKCFmfHxmLmxlbmd0aD09PTApKWlmKGZbMF0ubW9ycGhUYXJnZXRzKXtjb25zdCBkPXt9O2xldCBwO2ZvcihwPTA7cDxmLmxlbmd0aDtwKyspaWYoZltwXS5tb3JwaFRhcmdldHMpZm9yKGxldCBfPTA7XzxmW3BdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7XysrKWRbZltwXS5tb3JwaFRhcmdldHNbX11dPS0xO2Zvcihjb25zdCBfIGluIGQpe2NvbnN0IGc9W10sbT1bXTtmb3IobGV0IHk9MDt5IT09ZltwXS5tb3JwaFRhcmdldHMubGVuZ3RoOysreSl7Y29uc3QgeD1mW3BdO2cucHVzaCh4LnRpbWUpLG0ucHVzaCh4Lm1vcnBoVGFyZ2V0PT09Xz8xOjApfWkucHVzaChuZXcgdWEoIi5tb3JwaFRhcmdldEluZmx1ZW5jZVsiK18rIl0iLGcsbSkpfWw9ZC5sZW5ndGgqYX1lbHNle2NvbnN0IGQ9Ii5ib25lc1siK3RbdV0ubmFtZSsiXSI7bihmYSxkKyIucG9zaXRpb24iLGYsInBvcyIsaSksbihycyxkKyIucXVhdGVybmlvbiIsZiwicm90IixpKSxuKGZhLGQrIi5zY2FsZSIsZiwic2NsIixpKX19cmV0dXJuIGkubGVuZ3RoPT09MD9udWxsOm5ldyB0aGlzKHMsbCxpLG8pfXJlc2V0RHVyYXRpb24oKXtjb25zdCBlPXRoaXMudHJhY2tzO2xldCB0PTA7Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuIT09aTsrK24pe2NvbnN0IHM9dGhpcy50cmFja3Nbbl07dD1NYXRoLm1heCh0LHMudGltZXNbcy50aW1lcy5sZW5ndGgtMV0pfXJldHVybiB0aGlzLmR1cmF0aW9uPXQsdGhpc310cmltKCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnRyYWNrcy5sZW5ndGg7ZSsrKXRoaXMudHJhY2tzW2VdLnRyaW0oMCx0aGlzLmR1cmF0aW9uKTtyZXR1cm4gdGhpc312YWxpZGF0ZSgpe2xldCBlPSEwO2ZvcihsZXQgdD0wO3Q8dGhpcy50cmFja3MubGVuZ3RoO3QrKyllPWUmJnRoaXMudHJhY2tzW3RdLnZhbGlkYXRlKCk7cmV0dXJuIGV9b3B0aW1pemUoKXtmb3IobGV0IGU9MDtlPHRoaXMudHJhY2tzLmxlbmd0aDtlKyspdGhpcy50cmFja3NbZV0ub3B0aW1pemUoKTtyZXR1cm4gdGhpc31jbG9uZSgpe2NvbnN0IGU9W107Zm9yKGxldCB0PTA7dDx0aGlzLnRyYWNrcy5sZW5ndGg7dCsrKWUucHVzaCh0aGlzLnRyYWNrc1t0XS5jbG9uZSgpKTtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5uYW1lLHRoaXMuZHVyYXRpb24sZSx0aGlzLmJsZW5kTW9kZSl9dG9KU09OKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9KU09OKHRoaXMpfX1mdW5jdGlvbiBnYihyKXtzd2l0Y2goci50b0xvd2VyQ2FzZSgpKXtjYXNlInNjYWxhciI6Y2FzZSJkb3VibGUiOmNhc2UiZmxvYXQiOmNhc2UibnVtYmVyIjpjYXNlImludGVnZXIiOnJldHVybiB1YTtjYXNlInZlY3RvciI6Y2FzZSJ2ZWN0b3IyIjpjYXNlInZlY3RvcjMiOmNhc2UidmVjdG9yNCI6cmV0dXJuIGZhO2Nhc2UiY29sb3IiOnJldHVybiBhdTtjYXNlInF1YXRlcm5pb24iOnJldHVybiBycztjYXNlImJvb2wiOmNhc2UiYm9vbGVhbiI6cmV0dXJuIGlyO2Nhc2Uic3RyaW5nIjpyZXR1cm4gcnJ9dGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIityKX1mdW5jdGlvbiBfYihyKXtpZihyLnR5cGU9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayB0eXBlIHVuZGVmaW5lZCwgY2FuIG5vdCBwYXJzZSIpO2NvbnN0IGU9Z2Ioci50eXBlKTtpZihyLnRpbWVzPT09dm9pZCAwKXtjb25zdCB0PVtdLG49W107cnUoci5rZXlzLHQsbiwidmFsdWUiKSxyLnRpbWVzPXQsci52YWx1ZXM9bn1yZXR1cm4gZS5wYXJzZSE9PXZvaWQgMD9lLnBhcnNlKHIpOm5ldyBlKHIubmFtZSxyLnRpbWVzLHIudmFsdWVzLHIuaW50ZXJwb2xhdGlvbil9Y29uc3Qgc3I9e2VuYWJsZWQ6ITEsZmlsZXM6e30sYWRkOmZ1bmN0aW9uKHIsZSl7dGhpcy5lbmFibGVkIT09ITEmJih0aGlzLmZpbGVzW3JdPWUpfSxnZXQ6ZnVuY3Rpb24ocil7aWYodGhpcy5lbmFibGVkIT09ITEpcmV0dXJuIHRoaXMuZmlsZXNbcl19LHJlbW92ZTpmdW5jdGlvbihyKXtkZWxldGUgdGhpcy5maWxlc1tyXX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmZpbGVzPXt9fX07Y2xhc3Mgb3V7Y29uc3RydWN0b3IoZSx0LG4pe2NvbnN0IGk9dGhpcztsZXQgcz0hMSxhPTAsbz0wLGw7Y29uc3QgYz1bXTt0aGlzLm9uU3RhcnQ9dm9pZCAwLHRoaXMub25Mb2FkPWUsdGhpcy5vblByb2dyZXNzPXQsdGhpcy5vbkVycm9yPW4sdGhpcy5pdGVtU3RhcnQ9ZnVuY3Rpb24oaCl7bysrLHM9PT0hMSYmaS5vblN0YXJ0IT09dm9pZCAwJiZpLm9uU3RhcnQoaCxhLG8pLHM9ITB9LHRoaXMuaXRlbUVuZD1mdW5jdGlvbihoKXthKyssaS5vblByb2dyZXNzIT09dm9pZCAwJiZpLm9uUHJvZ3Jlc3MoaCxhLG8pLGE9PT1vJiYocz0hMSxpLm9uTG9hZCE9PXZvaWQgMCYmaS5vbkxvYWQoKSl9LHRoaXMuaXRlbUVycm9yPWZ1bmN0aW9uKGgpe2kub25FcnJvciE9PXZvaWQgMCYmaS5vbkVycm9yKGgpfSx0aGlzLnJlc29sdmVVUkw9ZnVuY3Rpb24oaCl7cmV0dXJuIGw/bChoKTpofSx0aGlzLnNldFVSTE1vZGlmaWVyPWZ1bmN0aW9uKGgpe3JldHVybiBsPWgsdGhpc30sdGhpcy5hZGRIYW5kbGVyPWZ1bmN0aW9uKGgsdSl7cmV0dXJuIGMucHVzaChoLHUpLHRoaXN9LHRoaXMucmVtb3ZlSGFuZGxlcj1mdW5jdGlvbihoKXtjb25zdCB1PWMuaW5kZXhPZihoKTtyZXR1cm4gdSE9PS0xJiZjLnNwbGljZSh1LDIpLHRoaXN9LHRoaXMuZ2V0SGFuZGxlcj1mdW5jdGlvbihoKXtmb3IobGV0IHU9MCxmPWMubGVuZ3RoO3U8Zjt1Kz0yKXtjb25zdCBkPWNbdV0scD1jW3UrMV07aWYoZC5nbG9iYWwmJihkLmxhc3RJbmRleD0wKSxkLnRlc3QoaCkpcmV0dXJuIHB9cmV0dXJuIG51bGx9fX1jb25zdCBMbT1uZXcgb3U7Y2xhc3MgdW57Y29uc3RydWN0b3IoZSl7dGhpcy5tYW5hZ2VyPWUhPT12b2lkIDA/ZTpMbSx0aGlzLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLHRoaXMud2l0aENyZWRlbnRpYWxzPSExLHRoaXMucGF0aD0iIix0aGlzLnJlc291cmNlUGF0aD0iIix0aGlzLnJlcXVlc3RIZWFkZXI9e319bG9hZCgpe31sb2FkQXN5bmMoZSx0KXtjb25zdCBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGkscyl7bi5sb2FkKGUsaSx0LHMpfSl9cGFyc2UoKXt9c2V0Q3Jvc3NPcmlnaW4oZSl7cmV0dXJuIHRoaXMuY3Jvc3NPcmlnaW49ZSx0aGlzfXNldFdpdGhDcmVkZW50aWFscyhlKXtyZXR1cm4gdGhpcy53aXRoQ3JlZGVudGlhbHM9ZSx0aGlzfXNldFBhdGgoZSl7cmV0dXJuIHRoaXMucGF0aD1lLHRoaXN9c2V0UmVzb3VyY2VQYXRoKGUpe3JldHVybiB0aGlzLnJlc291cmNlUGF0aD1lLHRoaXN9c2V0UmVxdWVzdEhlYWRlcihlKXtyZXR1cm4gdGhpcy5yZXF1ZXN0SGVhZGVyPWUsdGhpc319dW4uREVGQVVMVF9NQVRFUklBTF9OQU1FPSJfX0RFRkFVTFQiO2NvbnN0IGxpPXt9O2NsYXNzIHhiIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlKSx0aGlzLnJlc3BvbnNlPXR9fWNsYXNzIGNpIGV4dGVuZHMgdW57Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9bG9hZChlLHQsbixpKXtlPT09dm9pZCAwJiYoZT0iIiksdGhpcy5wYXRoIT09dm9pZCAwJiYoZT10aGlzLnBhdGgrZSksZT10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTChlKTtjb25zdCBzPXNyLmdldChlKTtpZihzIT09dm9pZCAwKXJldHVybiB0aGlzLm1hbmFnZXIuaXRlbVN0YXJ0KGUpLHNldFRpbWVvdXQoKCk9Pnt0JiZ0KHMpLHRoaXMubWFuYWdlci5pdGVtRW5kKGUpfSwwKSxzO2lmKGxpW2VdIT09dm9pZCAwKXtsaVtlXS5wdXNoKHtvbkxvYWQ6dCxvblByb2dyZXNzOm4sb25FcnJvcjppfSk7cmV0dXJufWxpW2VdPVtdLGxpW2VdLnB1c2goe29uTG9hZDp0LG9uUHJvZ3Jlc3M6bixvbkVycm9yOml9KTtjb25zdCBhPW5ldyBSZXF1ZXN0KGUse2hlYWRlcnM6bmV3IEhlYWRlcnModGhpcy5yZXF1ZXN0SGVhZGVyKSxjcmVkZW50aWFsczp0aGlzLndpdGhDcmVkZW50aWFscz8iaW5jbHVkZSI6InNhbWUtb3JpZ2luIn0pLG89dGhpcy5taW1lVHlwZSxsPXRoaXMucmVzcG9uc2VUeXBlO2ZldGNoKGEpLnRoZW4oYz0+e2lmKGMuc3RhdHVzPT09MjAwfHxjLnN0YXR1cz09PTApe2lmKGMuc3RhdHVzPT09MCYmY29uc29sZS53YXJuKCJUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLiIpLHR5cGVvZiBSZWFkYWJsZVN0cmVhbT09InVuZGVmaW5lZCJ8fGMuYm9keT09PXZvaWQgMHx8Yy5ib2R5LmdldFJlYWRlcj09PXZvaWQgMClyZXR1cm4gYztjb25zdCBoPWxpW2VdLHU9Yy5ib2R5LmdldFJlYWRlcigpLGY9Yy5oZWFkZXJzLmdldCgiQ29udGVudC1MZW5ndGgiKXx8Yy5oZWFkZXJzLmdldCgiWC1GaWxlLVNpemUiKSxkPWY/cGFyc2VJbnQoZik6MCxwPWQhPT0wO2xldCBfPTA7Y29uc3QgZz1uZXcgUmVhZGFibGVTdHJlYW0oe3N0YXJ0KG0pe3koKTtmdW5jdGlvbiB5KCl7dS5yZWFkKCkudGhlbigoe2RvbmU6eCx2YWx1ZTp2fSk9PntpZih4KW0uY2xvc2UoKTtlbHNle18rPXYuYnl0ZUxlbmd0aDtjb25zdCBTPW5ldyBQcm9ncmVzc0V2ZW50KCJwcm9ncmVzcyIse2xlbmd0aENvbXB1dGFibGU6cCxsb2FkZWQ6Xyx0b3RhbDpkfSk7Zm9yKGxldCBiPTAsQT1oLmxlbmd0aDtiPEE7YisrKXtjb25zdCBMPWhbYl07TC5vblByb2dyZXNzJiZMLm9uUHJvZ3Jlc3MoUyl9bS5lbnF1ZXVlKHYpLHkoKX19KX19fSk7cmV0dXJuIG5ldyBSZXNwb25zZShnKX1lbHNlIHRocm93IG5ldyB4YihgZmV0Y2ggZm9yICIke2MudXJsfSIgcmVzcG9uZGVkIHdpdGggJHtjLnN0YXR1c306ICR7Yy5zdGF0dXNUZXh0fWAsYyl9KS50aGVuKGM9Pntzd2l0Y2gobCl7Y2FzZSJhcnJheWJ1ZmZlciI6cmV0dXJuIGMuYXJyYXlCdWZmZXIoKTtjYXNlImJsb2IiOnJldHVybiBjLmJsb2IoKTtjYXNlImRvY3VtZW50IjpyZXR1cm4gYy50ZXh0KCkudGhlbihoPT5uZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGgsbykpO2Nhc2UianNvbiI6cmV0dXJuIGMuanNvbigpO2RlZmF1bHQ6aWYobz09PXZvaWQgMClyZXR1cm4gYy50ZXh0KCk7e2NvbnN0IHU9L2NoYXJzZXQ9Ij8oW147IlxzXSopIj8vaS5leGVjKG8pLGY9dSYmdVsxXT91WzFdLnRvTG93ZXJDYXNlKCk6dm9pZCAwLGQ9bmV3IFRleHREZWNvZGVyKGYpO3JldHVybiBjLmFycmF5QnVmZmVyKCkudGhlbihwPT5kLmRlY29kZShwKSl9fX0pLnRoZW4oYz0+e3NyLmFkZChlLGMpO2NvbnN0IGg9bGlbZV07ZGVsZXRlIGxpW2VdO2ZvcihsZXQgdT0wLGY9aC5sZW5ndGg7dTxmO3UrKyl7Y29uc3QgZD1oW3VdO2Qub25Mb2FkJiZkLm9uTG9hZChjKX19KS5jYXRjaChjPT57Y29uc3QgaD1saVtlXTtpZihoPT09dm9pZCAwKXRocm93IHRoaXMubWFuYWdlci5pdGVtRXJyb3IoZSksYztkZWxldGUgbGlbZV07Zm9yKGxldCB1PTAsZj1oLmxlbmd0aDt1PGY7dSsrKXtjb25zdCBkPWhbdV07ZC5vbkVycm9yJiZkLm9uRXJyb3IoYyl9dGhpcy5tYW5hZ2VyLml0ZW1FcnJvcihlKX0pLmZpbmFsbHkoKCk9Pnt0aGlzLm1hbmFnZXIuaXRlbUVuZChlKX0pLHRoaXMubWFuYWdlci5pdGVtU3RhcnQoZSl9c2V0UmVzcG9uc2VUeXBlKGUpe3JldHVybiB0aGlzLnJlc3BvbnNlVHlwZT1lLHRoaXN9c2V0TWltZVR5cGUoZSl7cmV0dXJuIHRoaXMubWltZVR5cGU9ZSx0aGlzfX1jbGFzcyB5YiBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9bmV3IGNpKHRoaXMubWFuYWdlcik7YS5zZXRQYXRoKHRoaXMucGF0aCksYS5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksYS5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpLGEubG9hZChlLGZ1bmN0aW9uKG8pe3RyeXt0KHMucGFyc2UoSlNPTi5wYXJzZShvKSkpfWNhdGNoKGwpe2k/aShsKTpjb25zb2xlLmVycm9yKGwpLHMubWFuYWdlci5pdGVtRXJyb3IoZSl9fSxuLGkpfXBhcnNlKGUpe2NvbnN0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2NvbnN0IGk9ZGEucGFyc2UoZVtuXSk7dC5wdXNoKGkpfXJldHVybiB0fX1jbGFzcyB2YiBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9W10sbz1uZXcgem8sbD1uZXcgY2kodGhpcy5tYW5hZ2VyKTtsLnNldFBhdGgodGhpcy5wYXRoKSxsLnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKSxsLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxsLnNldFdpdGhDcmVkZW50aWFscyhzLndpdGhDcmVkZW50aWFscyk7bGV0IGM9MDtmdW5jdGlvbiBoKHUpe2wubG9hZChlW3VdLGZ1bmN0aW9uKGYpe2NvbnN0IGQ9cy5wYXJzZShmLCEwKTthW3VdPXt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodCxmb3JtYXQ6ZC5mb3JtYXQsbWlwbWFwczpkLm1pcG1hcHN9LGMrPTEsYz09PTYmJihkLm1pcG1hcENvdW50PT09MSYmKG8ubWluRmlsdGVyPXd0KSxvLmltYWdlPWEsby5mb3JtYXQ9ZC5mb3JtYXQsby5uZWVkc1VwZGF0ZT0hMCx0JiZ0KG8pKX0sbixpKX1pZihBcnJheS5pc0FycmF5KGUpKWZvcihsZXQgdT0wLGY9ZS5sZW5ndGg7dTxmOysrdSloKHUpO2Vsc2UgbC5sb2FkKGUsZnVuY3Rpb24odSl7Y29uc3QgZj1zLnBhcnNlKHUsITApO2lmKGYuaXNDdWJlbWFwKXtjb25zdCBkPWYubWlwbWFwcy5sZW5ndGgvZi5taXBtYXBDb3VudDtmb3IobGV0IHA9MDtwPGQ7cCsrKXthW3BdPXttaXBtYXBzOltdfTtmb3IobGV0IF89MDtfPGYubWlwbWFwQ291bnQ7XysrKWFbcF0ubWlwbWFwcy5wdXNoKGYubWlwbWFwc1twKmYubWlwbWFwQ291bnQrX10pLGFbcF0uZm9ybWF0PWYuZm9ybWF0LGFbcF0ud2lkdGg9Zi53aWR0aCxhW3BdLmhlaWdodD1mLmhlaWdodH1vLmltYWdlPWF9ZWxzZSBvLmltYWdlLndpZHRoPWYud2lkdGgsby5pbWFnZS5oZWlnaHQ9Zi5oZWlnaHQsby5taXBtYXBzPWYubWlwbWFwcztmLm1pcG1hcENvdW50PT09MSYmKG8ubWluRmlsdGVyPXd0KSxvLmZvcm1hdD1mLmZvcm1hdCxvLm5lZWRzVXBkYXRlPSEwLHQmJnQobyl9LG4saSk7cmV0dXJuIG99fWNsYXNzIHBhIGV4dGVuZHMgdW57Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9bG9hZChlLHQsbixpKXt0aGlzLnBhdGghPT12b2lkIDAmJihlPXRoaXMucGF0aCtlKSxlPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGUpO2NvbnN0IHM9dGhpcyxhPXNyLmdldChlKTtpZihhIT09dm9pZCAwKXJldHVybiBzLm1hbmFnZXIuaXRlbVN0YXJ0KGUpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0JiZ0KGEpLHMubWFuYWdlci5pdGVtRW5kKGUpfSwwKSxhO2NvbnN0IG89T3MoImltZyIpO2Z1bmN0aW9uIGwoKXtoKCksc3IuYWRkKGUsdGhpcyksdCYmdCh0aGlzKSxzLm1hbmFnZXIuaXRlbUVuZChlKX1mdW5jdGlvbiBjKHUpe2goKSxpJiZpKHUpLHMubWFuYWdlci5pdGVtRXJyb3IoZSkscy5tYW5hZ2VyLml0ZW1FbmQoZSl9ZnVuY3Rpb24gaCgpe28ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsbCwhMSksby5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsYywhMSl9cmV0dXJuIG8uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsbCwhMSksby5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYywhMSksZS5zbGljZSgwLDUpIT09ImRhdGE6IiYmdGhpcy5jcm9zc09yaWdpbiE9PXZvaWQgMCYmKG8uY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbikscy5tYW5hZ2VyLml0ZW1TdGFydChlKSxvLnNyYz1lLG99fWNsYXNzIE1iIGV4dGVuZHMgdW57Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9bG9hZChlLHQsbixpKXtjb25zdCBzPW5ldyBYcztzLmNvbG9yU3BhY2U9UHQ7Y29uc3QgYT1uZXcgcGEodGhpcy5tYW5hZ2VyKTthLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pLGEuc2V0UGF0aCh0aGlzLnBhdGgpO2xldCBvPTA7ZnVuY3Rpb24gbChjKXthLmxvYWQoZVtjXSxmdW5jdGlvbihoKXtzLmltYWdlc1tjXT1oLG8rKyxvPT09NiYmKHMubmVlZHNVcGRhdGU9ITAsdCYmdChzKSl9LHZvaWQgMCxpKX1mb3IobGV0IGM9MDtjPGUubGVuZ3RoOysrYylsKGMpO3JldHVybiBzfX1jbGFzcyBTYiBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9bmV3IGppLG89bmV3IGNpKHRoaXMubWFuYWdlcik7cmV0dXJuIG8uc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLG8uc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLG8uc2V0UGF0aCh0aGlzLnBhdGgpLG8uc2V0V2l0aENyZWRlbnRpYWxzKHMud2l0aENyZWRlbnRpYWxzKSxvLmxvYWQoZSxmdW5jdGlvbihsKXtsZXQgYzt0cnl7Yz1zLnBhcnNlKGwpfWNhdGNoKGgpe2lmKGkhPT12b2lkIDApaShoKTtlbHNle2NvbnNvbGUuZXJyb3IoaCk7cmV0dXJufX1jLmltYWdlIT09dm9pZCAwP2EuaW1hZ2U9Yy5pbWFnZTpjLmRhdGEhPT12b2lkIDAmJihhLmltYWdlLndpZHRoPWMud2lkdGgsYS5pbWFnZS5oZWlnaHQ9Yy5oZWlnaHQsYS5pbWFnZS5kYXRhPWMuZGF0YSksYS53cmFwUz1jLndyYXBTIT09dm9pZCAwP2Mud3JhcFM6enQsYS53cmFwVD1jLndyYXBUIT09dm9pZCAwP2Mud3JhcFQ6enQsYS5tYWdGaWx0ZXI9Yy5tYWdGaWx0ZXIhPT12b2lkIDA/Yy5tYWdGaWx0ZXI6d3QsYS5taW5GaWx0ZXI9Yy5taW5GaWx0ZXIhPT12b2lkIDA/Yy5taW5GaWx0ZXI6d3QsYS5hbmlzb3Ryb3B5PWMuYW5pc290cm9weSE9PXZvaWQgMD9jLmFuaXNvdHJvcHk6MSxjLmNvbG9yU3BhY2UhPT12b2lkIDA/YS5jb2xvclNwYWNlPWMuY29sb3JTcGFjZTpjLmVuY29kaW5nIT09dm9pZCAwJiYoYS5lbmNvZGluZz1jLmVuY29kaW5nKSxjLmZsaXBZIT09dm9pZCAwJiYoYS5mbGlwWT1jLmZsaXBZKSxjLmZvcm1hdCE9PXZvaWQgMCYmKGEuZm9ybWF0PWMuZm9ybWF0KSxjLnR5cGUhPT12b2lkIDAmJihhLnR5cGU9Yy50eXBlKSxjLm1pcG1hcHMhPT12b2lkIDAmJihhLm1pcG1hcHM9Yy5taXBtYXBzLGEubWluRmlsdGVyPXZpKSxjLm1pcG1hcENvdW50PT09MSYmKGEubWluRmlsdGVyPXd0KSxjLmdlbmVyYXRlTWlwbWFwcyE9PXZvaWQgMCYmKGEuZ2VuZXJhdGVNaXBtYXBzPWMuZ2VuZXJhdGVNaXBtYXBzKSxhLm5lZWRzVXBkYXRlPSEwLHQmJnQoYSxjKX0sbixpKSxhfX1jbGFzcyBiYiBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz1uZXcgRXQsYT1uZXcgcGEodGhpcy5tYW5hZ2VyKTtyZXR1cm4gYS5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKSxhLnNldFBhdGgodGhpcy5wYXRoKSxhLmxvYWQoZSxmdW5jdGlvbihvKXtzLmltYWdlPW8scy5uZWVkc1VwZGF0ZT0hMCx0IT09dm9pZCAwJiZ0KHMpfSxuLGkpLHN9fWNsYXNzIE5pIGV4dGVuZHMgcnR7Y29uc3RydWN0b3IoZSx0PTEpe3N1cGVyKCksdGhpcy5pc0xpZ2h0PSEwLHRoaXMudHlwZT0iTGlnaHQiLHRoaXMuY29sb3I9bmV3IHllKGUpLHRoaXMuaW50ZW5zaXR5PXR9ZGlzcG9zZSgpe31jb3B5KGUsdCl7cmV0dXJuIHN1cGVyLmNvcHkoZSx0KSx0aGlzLmNvbG9yLmNvcHkoZS5jb2xvciksdGhpcy5pbnRlbnNpdHk9ZS5pbnRlbnNpdHksdGhpc310b0pTT04oZSl7Y29uc3QgdD1zdXBlci50b0pTT04oZSk7cmV0dXJuIHQub2JqZWN0LmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCksdC5vYmplY3QuaW50ZW5zaXR5PXRoaXMuaW50ZW5zaXR5LHRoaXMuZ3JvdW5kQ29sb3IhPT12b2lkIDAmJih0Lm9iamVjdC5ncm91bmRDb2xvcj10aGlzLmdyb3VuZENvbG9yLmdldEhleCgpKSx0aGlzLmRpc3RhbmNlIT09dm9pZCAwJiYodC5vYmplY3QuZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSksdGhpcy5hbmdsZSE9PXZvaWQgMCYmKHQub2JqZWN0LmFuZ2xlPXRoaXMuYW5nbGUpLHRoaXMuZGVjYXkhPT12b2lkIDAmJih0Lm9iamVjdC5kZWNheT10aGlzLmRlY2F5KSx0aGlzLnBlbnVtYnJhIT09dm9pZCAwJiYodC5vYmplY3QucGVudW1icmE9dGhpcy5wZW51bWJyYSksdGhpcy5zaGFkb3chPT12b2lkIDAmJih0Lm9iamVjdC5zaGFkb3c9dGhpcy5zaGFkb3cudG9KU09OKCkpLHR9fWNsYXNzIEltIGV4dGVuZHMgTml7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKGUsbiksdGhpcy5pc0hlbWlzcGhlcmVMaWdodD0hMCx0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KHJ0LkRFRkFVTFRfVVApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5ncm91bmRDb2xvcj1uZXcgeWUodCl9Y29weShlLHQpe3JldHVybiBzdXBlci5jb3B5KGUsdCksdGhpcy5ncm91bmRDb2xvci5jb3B5KGUuZ3JvdW5kQ29sb3IpLHRoaXN9fWNvbnN0IGx1PW5ldyBJZSxVbT1uZXcgUCxEbT1uZXcgUDtjbGFzcyBjdXtjb25zdHJ1Y3RvcihlKXt0aGlzLmNhbWVyYT1lLHRoaXMuYmlhcz0wLHRoaXMubm9ybWFsQmlhcz0wLHRoaXMucmFkaXVzPTEsdGhpcy5ibHVyU2FtcGxlcz04LHRoaXMubWFwU2l6ZT1uZXcgcSg1MTIsNTEyKSx0aGlzLm1hcD1udWxsLHRoaXMubWFwUGFzcz1udWxsLHRoaXMubWF0cml4PW5ldyBJZSx0aGlzLmF1dG9VcGRhdGU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMSx0aGlzLl9mcnVzdHVtPW5ldyBxcyx0aGlzLl9mcmFtZUV4dGVudHM9bmV3IHEoMSwxKSx0aGlzLl92aWV3cG9ydENvdW50PTEsdGhpcy5fdmlld3BvcnRzPVtuZXcgbHQoMCwwLDEsMSldfWdldFZpZXdwb3J0Q291bnQoKXtyZXR1cm4gdGhpcy5fdmlld3BvcnRDb3VudH1nZXRGcnVzdHVtKCl7cmV0dXJuIHRoaXMuX2ZydXN0dW19dXBkYXRlTWF0cmljZXMoZSl7Y29uc3QgdD10aGlzLmNhbWVyYSxuPXRoaXMubWF0cml4O1VtLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLm1hdHJpeFdvcmxkKSx0LnBvc2l0aW9uLmNvcHkoVW0pLERtLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLnRhcmdldC5tYXRyaXhXb3JsZCksdC5sb29rQXQoRG0pLHQudXBkYXRlTWF0cml4V29ybGQoKSxsdS5tdWx0aXBseU1hdHJpY2VzKHQucHJvamVjdGlvbk1hdHJpeCx0Lm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChsdSksbi5zZXQoLjUsMCwwLC41LDAsLjUsMCwuNSwwLDAsLjUsLjUsMCwwLDAsMSksbi5tdWx0aXBseShsdSl9Z2V0Vmlld3BvcnQoZSl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1tlXX1nZXRGcmFtZUV4dGVudHMoKXtyZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzfWRpc3Bvc2UoKXt0aGlzLm1hcCYmdGhpcy5tYXAuZGlzcG9zZSgpLHRoaXMubWFwUGFzcyYmdGhpcy5tYXBQYXNzLmRpc3Bvc2UoKX1jb3B5KGUpe3JldHVybiB0aGlzLmNhbWVyYT1lLmNhbWVyYS5jbG9uZSgpLHRoaXMuYmlhcz1lLmJpYXMsdGhpcy5yYWRpdXM9ZS5yYWRpdXMsdGhpcy5tYXBTaXplLmNvcHkoZS5tYXBTaXplKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCBlPXt9O3JldHVybiB0aGlzLmJpYXMhPT0wJiYoZS5iaWFzPXRoaXMuYmlhcyksdGhpcy5ub3JtYWxCaWFzIT09MCYmKGUubm9ybWFsQmlhcz10aGlzLm5vcm1hbEJpYXMpLHRoaXMucmFkaXVzIT09MSYmKGUucmFkaXVzPXRoaXMucmFkaXVzKSwodGhpcy5tYXBTaXplLnghPT01MTJ8fHRoaXMubWFwU2l6ZS55IT09NTEyKSYmKGUubWFwU2l6ZT10aGlzLm1hcFNpemUudG9BcnJheSgpKSxlLmNhbWVyYT10aGlzLmNhbWVyYS50b0pTT04oITEpLm9iamVjdCxkZWxldGUgZS5jYW1lcmEubWF0cml4LGV9fWNsYXNzIHdiIGV4dGVuZHMgY3V7Y29uc3RydWN0b3IoKXtzdXBlcihuZXcgQnQoNTAsMSwuNSw1MDApKSx0aGlzLmlzU3BvdExpZ2h0U2hhZG93PSEwLHRoaXMuZm9jdXM9MX11cGRhdGVNYXRyaWNlcyhlKXtjb25zdCB0PXRoaXMuY2FtZXJhLG49QXIqMiplLmFuZ2xlKnRoaXMuZm9jdXMsaT10aGlzLm1hcFNpemUud2lkdGgvdGhpcy5tYXBTaXplLmhlaWdodCxzPWUuZGlzdGFuY2V8fHQuZmFyOyhuIT09dC5mb3Z8fGkhPT10LmFzcGVjdHx8cyE9PXQuZmFyKSYmKHQuZm92PW4sdC5hc3BlY3Q9aSx0LmZhcj1zLHQudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKSxzdXBlci51cGRhdGVNYXRyaWNlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuZm9jdXM9ZS5mb2N1cyx0aGlzfX1jbGFzcyBObSBleHRlbmRzIE5pe2NvbnN0cnVjdG9yKGUsdCxuPTAsaT1NYXRoLlBJLzMscz0wLGE9Mil7c3VwZXIoZSx0KSx0aGlzLmlzU3BvdExpZ2h0PSEwLHRoaXMudHlwZT0iU3BvdExpZ2h0Iix0aGlzLnBvc2l0aW9uLmNvcHkocnQuREVGQVVMVF9VUCksdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLnRhcmdldD1uZXcgcnQsdGhpcy5kaXN0YW5jZT1uLHRoaXMuYW5nbGU9aSx0aGlzLnBlbnVtYnJhPXMsdGhpcy5kZWNheT1hLHRoaXMubWFwPW51bGwsdGhpcy5zaGFkb3c9bmV3IHdifWdldCBwb3dlcigpe3JldHVybiB0aGlzLmludGVuc2l0eSpNYXRoLlBJfXNldCBwb3dlcihlKXt0aGlzLmludGVuc2l0eT1lL01hdGguUEl9ZGlzcG9zZSgpe3RoaXMuc2hhZG93LmRpc3Bvc2UoKX1jb3B5KGUsdCl7cmV0dXJuIHN1cGVyLmNvcHkoZSx0KSx0aGlzLmRpc3RhbmNlPWUuZGlzdGFuY2UsdGhpcy5hbmdsZT1lLmFuZ2xlLHRoaXMucGVudW1icmE9ZS5wZW51bWJyYSx0aGlzLmRlY2F5PWUuZGVjYXksdGhpcy50YXJnZXQ9ZS50YXJnZXQuY2xvbmUoKSx0aGlzLnNoYWRvdz1lLnNoYWRvdy5jbG9uZSgpLHRoaXN9fWNvbnN0IEZtPW5ldyBJZSxtYT1uZXcgUCxodT1uZXcgUDtjbGFzcyBFYiBleHRlbmRzIGN1e2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IEJ0KDkwLDEsLjUsNTAwKSksdGhpcy5pc1BvaW50TGlnaHRTaGFkb3c9ITAsdGhpcy5fZnJhbWVFeHRlbnRzPW5ldyBxKDQsMiksdGhpcy5fdmlld3BvcnRDb3VudD02LHRoaXMuX3ZpZXdwb3J0cz1bbmV3IGx0KDIsMSwxLDEpLG5ldyBsdCgwLDEsMSwxKSxuZXcgbHQoMywxLDEsMSksbmV3IGx0KDEsMSwxLDEpLG5ldyBsdCgzLDAsMSwxKSxuZXcgbHQoMSwwLDEsMSldLHRoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgUCgxLDAsMCksbmV3IFAoLTEsMCwwKSxuZXcgUCgwLDAsMSksbmV3IFAoMCwwLC0xKSxuZXcgUCgwLDEsMCksbmV3IFAoMCwtMSwwKV0sdGhpcy5fY3ViZVVwcz1bbmV3IFAoMCwxLDApLG5ldyBQKDAsMSwwKSxuZXcgUCgwLDEsMCksbmV3IFAoMCwxLDApLG5ldyBQKDAsMCwxKSxuZXcgUCgwLDAsLTEpXX11cGRhdGVNYXRyaWNlcyhlLHQ9MCl7Y29uc3Qgbj10aGlzLmNhbWVyYSxpPXRoaXMubWF0cml4LHM9ZS5kaXN0YW5jZXx8bi5mYXI7cyE9PW4uZmFyJiYobi5mYXI9cyxuLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSksbWEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUubWF0cml4V29ybGQpLG4ucG9zaXRpb24uY29weShtYSksaHUuY29weShuLnBvc2l0aW9uKSxodS5hZGQodGhpcy5fY3ViZURpcmVjdGlvbnNbdF0pLG4udXAuY29weSh0aGlzLl9jdWJlVXBzW3RdKSxuLmxvb2tBdChodSksbi51cGRhdGVNYXRyaXhXb3JsZCgpLGkubWFrZVRyYW5zbGF0aW9uKC1tYS54LC1tYS55LC1tYS56KSxGbS5tdWx0aXBseU1hdHJpY2VzKG4ucHJvamVjdGlvbk1hdHJpeCxuLm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChGbSl9fWNsYXNzIE9tIGV4dGVuZHMgTml7Y29uc3RydWN0b3IoZSx0LG49MCxpPTIpe3N1cGVyKGUsdCksdGhpcy5pc1BvaW50TGlnaHQ9ITAsdGhpcy50eXBlPSJQb2ludExpZ2h0Iix0aGlzLmRpc3RhbmNlPW4sdGhpcy5kZWNheT1pLHRoaXMuc2hhZG93PW5ldyBFYn1nZXQgcG93ZXIoKXtyZXR1cm4gdGhpcy5pbnRlbnNpdHkqNCpNYXRoLlBJfXNldCBwb3dlcihlKXt0aGlzLmludGVuc2l0eT1lLyg0Kk1hdGguUEkpfWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weShlLHQpe3JldHVybiBzdXBlci5jb3B5KGUsdCksdGhpcy5kaXN0YW5jZT1lLmRpc3RhbmNlLHRoaXMuZGVjYXk9ZS5kZWNheSx0aGlzLnNoYWRvdz1lLnNoYWRvdy5jbG9uZSgpLHRoaXN9fWNsYXNzIEFiIGV4dGVuZHMgY3V7Y29uc3RydWN0b3IoKXtzdXBlcihuZXcgdm8oLTUsNSw1LC01LC41LDUwMCkpLHRoaXMuaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93PSEwfX1jbGFzcyBCbSBleHRlbmRzIE5pe2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0KSx0aGlzLmlzRGlyZWN0aW9uYWxMaWdodD0hMCx0aGlzLnR5cGU9IkRpcmVjdGlvbmFsTGlnaHQiLHRoaXMucG9zaXRpb24uY29weShydC5ERUZBVUxUX1VQKSx0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMudGFyZ2V0PW5ldyBydCx0aGlzLnNoYWRvdz1uZXcgQWJ9ZGlzcG9zZSgpe3RoaXMuc2hhZG93LmRpc3Bvc2UoKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMudGFyZ2V0PWUudGFyZ2V0LmNsb25lKCksdGhpcy5zaGFkb3c9ZS5zaGFkb3cuY2xvbmUoKSx0aGlzfX1jbGFzcyB6bSBleHRlbmRzIE5pe2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0KSx0aGlzLmlzQW1iaWVudExpZ2h0PSEwLHRoaXMudHlwZT0iQW1iaWVudExpZ2h0In19Y2xhc3Mga20gZXh0ZW5kcyBOaXtjb25zdHJ1Y3RvcihlLHQsbj0xMCxpPTEwKXtzdXBlcihlLHQpLHRoaXMuaXNSZWN0QXJlYUxpZ2h0PSEwLHRoaXMudHlwZT0iUmVjdEFyZWFMaWdodCIsdGhpcy53aWR0aD1uLHRoaXMuaGVpZ2h0PWl9Z2V0IHBvd2VyKCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5KnRoaXMud2lkdGgqdGhpcy5oZWlnaHQqTWF0aC5QSX1zZXQgcG93ZXIoZSl7dGhpcy5pbnRlbnNpdHk9ZS8odGhpcy53aWR0aCp0aGlzLmhlaWdodCpNYXRoLlBJKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMud2lkdGg9ZS53aWR0aCx0aGlzLmhlaWdodD1lLmhlaWdodCx0aGlzfXRvSlNPTihlKXtjb25zdCB0PXN1cGVyLnRvSlNPTihlKTtyZXR1cm4gdC5vYmplY3Qud2lkdGg9dGhpcy53aWR0aCx0Lm9iamVjdC5oZWlnaHQ9dGhpcy5oZWlnaHQsdH19Y2xhc3MgR217Y29uc3RydWN0b3IoKXt0aGlzLmlzU3BoZXJpY2FsSGFybW9uaWNzMz0hMCx0aGlzLmNvZWZmaWNpZW50cz1bXTtmb3IobGV0IGU9MDtlPDk7ZSsrKXRoaXMuY29lZmZpY2llbnRzLnB1c2gobmV3IFApfXNldChlKXtmb3IobGV0IHQ9MDt0PDk7dCsrKXRoaXMuY29lZmZpY2llbnRzW3RdLmNvcHkoZVt0XSk7cmV0dXJuIHRoaXN9emVybygpe2ZvcihsZXQgZT0wO2U8OTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0uc2V0KDAsMCwwKTtyZXR1cm4gdGhpc31nZXRBdChlLHQpe2NvbnN0IG49ZS54LGk9ZS55LHM9ZS56LGE9dGhpcy5jb2VmZmljaWVudHM7cmV0dXJuIHQuY29weShhWzBdKS5tdWx0aXBseVNjYWxhciguMjgyMDk1KSx0LmFkZFNjYWxlZFZlY3RvcihhWzFdLC40ODg2MDMqaSksdC5hZGRTY2FsZWRWZWN0b3IoYVsyXSwuNDg4NjAzKnMpLHQuYWRkU2NhbGVkVmVjdG9yKGFbM10sLjQ4ODYwMypuKSx0LmFkZFNjYWxlZFZlY3RvcihhWzRdLDEuMDkyNTQ4KihuKmkpKSx0LmFkZFNjYWxlZFZlY3RvcihhWzVdLDEuMDkyNTQ4KihpKnMpKSx0LmFkZFNjYWxlZFZlY3RvcihhWzZdLC4zMTUzOTIqKDMqcypzLTEpKSx0LmFkZFNjYWxlZFZlY3RvcihhWzddLDEuMDkyNTQ4KihuKnMpKSx0LmFkZFNjYWxlZFZlY3RvcihhWzhdLC41NDYyNzQqKG4qbi1pKmkpKSx0fWdldElycmFkaWFuY2VBdChlLHQpe2NvbnN0IG49ZS54LGk9ZS55LHM9ZS56LGE9dGhpcy5jb2VmZmljaWVudHM7cmV0dXJuIHQuY29weShhWzBdKS5tdWx0aXBseVNjYWxhciguODg2MjI3KSx0LmFkZFNjYWxlZFZlY3RvcihhWzFdLDIqLjUxMTY2NCppKSx0LmFkZFNjYWxlZFZlY3RvcihhWzJdLDIqLjUxMTY2NCpzKSx0LmFkZFNjYWxlZFZlY3RvcihhWzNdLDIqLjUxMTY2NCpuKSx0LmFkZFNjYWxlZFZlY3RvcihhWzRdLDIqLjQyOTA0MypuKmkpLHQuYWRkU2NhbGVkVmVjdG9yKGFbNV0sMiouNDI5MDQzKmkqcyksdC5hZGRTY2FsZWRWZWN0b3IoYVs2XSwuNzQzMTI1KnMqcy0uMjQ3NzA4KSx0LmFkZFNjYWxlZFZlY3RvcihhWzddLDIqLjQyOTA0MypuKnMpLHQuYWRkU2NhbGVkVmVjdG9yKGFbOF0sLjQyOTA0MyoobipuLWkqaSkpLHR9YWRkKGUpe2ZvcihsZXQgdD0wO3Q8OTt0KyspdGhpcy5jb2VmZmljaWVudHNbdF0uYWRkKGUuY29lZmZpY2llbnRzW3RdKTtyZXR1cm4gdGhpc31hZGRTY2FsZWRTSChlLHQpe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5jb2VmZmljaWVudHNbbl0uYWRkU2NhbGVkVmVjdG9yKGUuY29lZmZpY2llbnRzW25dLHQpO3JldHVybiB0aGlzfXNjYWxlKGUpe2ZvcihsZXQgdD0wO3Q8OTt0KyspdGhpcy5jb2VmZmljaWVudHNbdF0ubXVsdGlwbHlTY2FsYXIoZSk7cmV0dXJuIHRoaXN9bGVycChlLHQpe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5jb2VmZmljaWVudHNbbl0ubGVycChlLmNvZWZmaWNpZW50c1tuXSx0KTtyZXR1cm4gdGhpc31lcXVhbHMoZSl7Zm9yKGxldCB0PTA7dDw5O3QrKylpZighdGhpcy5jb2VmZmljaWVudHNbdF0uZXF1YWxzKGUuY29lZmZpY2llbnRzW3RdKSlyZXR1cm4hMTtyZXR1cm4hMH1jb3B5KGUpe3JldHVybiB0aGlzLnNldChlLmNvZWZmaWNpZW50cyl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWZyb21BcnJheShlLHQ9MCl7Y29uc3Qgbj10aGlzLmNvZWZmaWNpZW50cztmb3IobGV0IGk9MDtpPDk7aSsrKW5baV0uZnJvbUFycmF5KGUsdCtpKjMpO3JldHVybiB0aGlzfXRvQXJyYXkoZT1bXSx0PTApe2NvbnN0IG49dGhpcy5jb2VmZmljaWVudHM7Zm9yKGxldCBpPTA7aTw5O2krKyluW2ldLnRvQXJyYXkoZSx0K2kqMyk7cmV0dXJuIGV9c3RhdGljIGdldEJhc2lzQXQoZSx0KXtjb25zdCBuPWUueCxpPWUueSxzPWUuejt0WzBdPS4yODIwOTUsdFsxXT0uNDg4NjAzKmksdFsyXT0uNDg4NjAzKnMsdFszXT0uNDg4NjAzKm4sdFs0XT0xLjA5MjU0OCpuKmksdFs1XT0xLjA5MjU0OCppKnMsdFs2XT0uMzE1MzkyKigzKnMqcy0xKSx0WzddPTEuMDkyNTQ4Km4qcyx0WzhdPS41NDYyNzQqKG4qbi1pKmkpfX1jbGFzcyBWbSBleHRlbmRzIE5pe2NvbnN0cnVjdG9yKGU9bmV3IEdtLHQ9MSl7c3VwZXIodm9pZCAwLHQpLHRoaXMuaXNMaWdodFByb2JlPSEwLHRoaXMuc2g9ZX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuc2guY29weShlLnNoKSx0aGlzfWZyb21KU09OKGUpe3JldHVybiB0aGlzLmludGVuc2l0eT1lLmludGVuc2l0eSx0aGlzLnNoLmZyb21BcnJheShlLnNoKSx0aGlzfXRvSlNPTihlKXtjb25zdCB0PXN1cGVyLnRvSlNPTihlKTtyZXR1cm4gdC5vYmplY3Quc2g9dGhpcy5zaC50b0FycmF5KCksdH19Y2xhc3MgYWwgZXh0ZW5kcyB1bntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnRleHR1cmVzPXt9fWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9bmV3IGNpKHMubWFuYWdlcik7YS5zZXRQYXRoKHMucGF0aCksYS5zZXRSZXF1ZXN0SGVhZGVyKHMucmVxdWVzdEhlYWRlciksYS5zZXRXaXRoQ3JlZGVudGlhbHMocy53aXRoQ3JlZGVudGlhbHMpLGEubG9hZChlLGZ1bmN0aW9uKG8pe3RyeXt0KHMucGFyc2UoSlNPTi5wYXJzZShvKSkpfWNhdGNoKGwpe2k/aShsKTpjb25zb2xlLmVycm9yKGwpLHMubWFuYWdlci5pdGVtRXJyb3IoZSl9fSxuLGkpfXBhcnNlKGUpe2NvbnN0IHQ9dGhpcy50ZXh0dXJlcztmdW5jdGlvbiBuKHMpe3JldHVybiB0W3NdPT09dm9pZCAwJiZjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsTG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZSIscyksdFtzXX1jb25zdCBpPWFsLmNyZWF0ZU1hdGVyaWFsRnJvbVR5cGUoZS50eXBlKTtpZihlLnV1aWQhPT12b2lkIDAmJihpLnV1aWQ9ZS51dWlkKSxlLm5hbWUhPT12b2lkIDAmJihpLm5hbWU9ZS5uYW1lKSxlLmNvbG9yIT09dm9pZCAwJiZpLmNvbG9yIT09dm9pZCAwJiZpLmNvbG9yLnNldEhleChlLmNvbG9yKSxlLnJvdWdobmVzcyE9PXZvaWQgMCYmKGkucm91Z2huZXNzPWUucm91Z2huZXNzKSxlLm1ldGFsbmVzcyE9PXZvaWQgMCYmKGkubWV0YWxuZXNzPWUubWV0YWxuZXNzKSxlLnNoZWVuIT09dm9pZCAwJiYoaS5zaGVlbj1lLnNoZWVuKSxlLnNoZWVuQ29sb3IhPT12b2lkIDAmJihpLnNoZWVuQ29sb3I9bmV3IHllKCkuc2V0SGV4KGUuc2hlZW5Db2xvcikpLGUuc2hlZW5Sb3VnaG5lc3MhPT12b2lkIDAmJihpLnNoZWVuUm91Z2huZXNzPWUuc2hlZW5Sb3VnaG5lc3MpLGUuZW1pc3NpdmUhPT12b2lkIDAmJmkuZW1pc3NpdmUhPT12b2lkIDAmJmkuZW1pc3NpdmUuc2V0SGV4KGUuZW1pc3NpdmUpLGUuc3BlY3VsYXIhPT12b2lkIDAmJmkuc3BlY3VsYXIhPT12b2lkIDAmJmkuc3BlY3VsYXIuc2V0SGV4KGUuc3BlY3VsYXIpLGUuc3BlY3VsYXJJbnRlbnNpdHkhPT12b2lkIDAmJihpLnNwZWN1bGFySW50ZW5zaXR5PWUuc3BlY3VsYXJJbnRlbnNpdHkpLGUuc3BlY3VsYXJDb2xvciE9PXZvaWQgMCYmaS5zcGVjdWxhckNvbG9yIT09dm9pZCAwJiZpLnNwZWN1bGFyQ29sb3Iuc2V0SGV4KGUuc3BlY3VsYXJDb2xvciksZS5zaGluaW5lc3MhPT12b2lkIDAmJihpLnNoaW5pbmVzcz1lLnNoaW5pbmVzcyksZS5jbGVhcmNvYXQhPT12b2lkIDAmJihpLmNsZWFyY29hdD1lLmNsZWFyY29hdCksZS5jbGVhcmNvYXRSb3VnaG5lc3MhPT12b2lkIDAmJihpLmNsZWFyY29hdFJvdWdobmVzcz1lLmNsZWFyY29hdFJvdWdobmVzcyksZS5pcmlkZXNjZW5jZSE9PXZvaWQgMCYmKGkuaXJpZGVzY2VuY2U9ZS5pcmlkZXNjZW5jZSksZS5pcmlkZXNjZW5jZUlPUiE9PXZvaWQgMCYmKGkuaXJpZGVzY2VuY2VJT1I9ZS5pcmlkZXNjZW5jZUlPUiksZS5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIT09dm9pZCAwJiYoaS5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPWUuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSksZS50cmFuc21pc3Npb24hPT12b2lkIDAmJihpLnRyYW5zbWlzc2lvbj1lLnRyYW5zbWlzc2lvbiksZS50aGlja25lc3MhPT12b2lkIDAmJihpLnRoaWNrbmVzcz1lLnRoaWNrbmVzcyksZS5hdHRlbnVhdGlvbkRpc3RhbmNlIT09dm9pZCAwJiYoaS5hdHRlbnVhdGlvbkRpc3RhbmNlPWUuYXR0ZW51YXRpb25EaXN0YW5jZSksZS5hdHRlbnVhdGlvbkNvbG9yIT09dm9pZCAwJiZpLmF0dGVudWF0aW9uQ29sb3IhPT12b2lkIDAmJmkuYXR0ZW51YXRpb25Db2xvci5zZXRIZXgoZS5hdHRlbnVhdGlvbkNvbG9yKSxlLmFuaXNvdHJvcHkhPT12b2lkIDAmJihpLmFuaXNvdHJvcHk9ZS5hbmlzb3Ryb3B5KSxlLmFuaXNvdHJvcHlSb3RhdGlvbiE9PXZvaWQgMCYmKGkuYW5pc290cm9weVJvdGF0aW9uPWUuYW5pc290cm9weVJvdGF0aW9uKSxlLmZvZyE9PXZvaWQgMCYmKGkuZm9nPWUuZm9nKSxlLmZsYXRTaGFkaW5nIT09dm9pZCAwJiYoaS5mbGF0U2hhZGluZz1lLmZsYXRTaGFkaW5nKSxlLmJsZW5kaW5nIT09dm9pZCAwJiYoaS5ibGVuZGluZz1lLmJsZW5kaW5nKSxlLmNvbWJpbmUhPT12b2lkIDAmJihpLmNvbWJpbmU9ZS5jb21iaW5lKSxlLnNpZGUhPT12b2lkIDAmJihpLnNpZGU9ZS5zaWRlKSxlLnNoYWRvd1NpZGUhPT12b2lkIDAmJihpLnNoYWRvd1NpZGU9ZS5zaGFkb3dTaWRlKSxlLm9wYWNpdHkhPT12b2lkIDAmJihpLm9wYWNpdHk9ZS5vcGFjaXR5KSxlLnRyYW5zcGFyZW50IT09dm9pZCAwJiYoaS50cmFuc3BhcmVudD1lLnRyYW5zcGFyZW50KSxlLmFscGhhVGVzdCE9PXZvaWQgMCYmKGkuYWxwaGFUZXN0PWUuYWxwaGFUZXN0KSxlLmFscGhhSGFzaCE9PXZvaWQgMCYmKGkuYWxwaGFIYXNoPWUuYWxwaGFIYXNoKSxlLmRlcHRoRnVuYyE9PXZvaWQgMCYmKGkuZGVwdGhGdW5jPWUuZGVwdGhGdW5jKSxlLmRlcHRoVGVzdCE9PXZvaWQgMCYmKGkuZGVwdGhUZXN0PWUuZGVwdGhUZXN0KSxlLmRlcHRoV3JpdGUhPT12b2lkIDAmJihpLmRlcHRoV3JpdGU9ZS5kZXB0aFdyaXRlKSxlLmNvbG9yV3JpdGUhPT12b2lkIDAmJihpLmNvbG9yV3JpdGU9ZS5jb2xvcldyaXRlKSxlLmJsZW5kU3JjIT09dm9pZCAwJiYoaS5ibGVuZFNyYz1lLmJsZW5kU3JjKSxlLmJsZW5kRHN0IT09dm9pZCAwJiYoaS5ibGVuZERzdD1lLmJsZW5kRHN0KSxlLmJsZW5kRXF1YXRpb24hPT12b2lkIDAmJihpLmJsZW5kRXF1YXRpb249ZS5ibGVuZEVxdWF0aW9uKSxlLmJsZW5kU3JjQWxwaGEhPT12b2lkIDAmJihpLmJsZW5kU3JjQWxwaGE9ZS5ibGVuZFNyY0FscGhhKSxlLmJsZW5kRHN0QWxwaGEhPT12b2lkIDAmJihpLmJsZW5kRHN0QWxwaGE9ZS5ibGVuZERzdEFscGhhKSxlLmJsZW5kRXF1YXRpb25BbHBoYSE9PXZvaWQgMCYmKGkuYmxlbmRFcXVhdGlvbkFscGhhPWUuYmxlbmRFcXVhdGlvbkFscGhhKSxlLmJsZW5kQ29sb3IhPT12b2lkIDAmJmkuYmxlbmRDb2xvciE9PXZvaWQgMCYmaS5ibGVuZENvbG9yLnNldEhleChlLmJsZW5kQ29sb3IpLGUuYmxlbmRBbHBoYSE9PXZvaWQgMCYmKGkuYmxlbmRBbHBoYT1lLmJsZW5kQWxwaGEpLGUuc3RlbmNpbFdyaXRlTWFzayE9PXZvaWQgMCYmKGkuc3RlbmNpbFdyaXRlTWFzaz1lLnN0ZW5jaWxXcml0ZU1hc2spLGUuc3RlbmNpbEZ1bmMhPT12b2lkIDAmJihpLnN0ZW5jaWxGdW5jPWUuc3RlbmNpbEZ1bmMpLGUuc3RlbmNpbFJlZiE9PXZvaWQgMCYmKGkuc3RlbmNpbFJlZj1lLnN0ZW5jaWxSZWYpLGUuc3RlbmNpbEZ1bmNNYXNrIT09dm9pZCAwJiYoaS5zdGVuY2lsRnVuY01hc2s9ZS5zdGVuY2lsRnVuY01hc2spLGUuc3RlbmNpbEZhaWwhPT12b2lkIDAmJihpLnN0ZW5jaWxGYWlsPWUuc3RlbmNpbEZhaWwpLGUuc3RlbmNpbFpGYWlsIT09dm9pZCAwJiYoaS5zdGVuY2lsWkZhaWw9ZS5zdGVuY2lsWkZhaWwpLGUuc3RlbmNpbFpQYXNzIT09dm9pZCAwJiYoaS5zdGVuY2lsWlBhc3M9ZS5zdGVuY2lsWlBhc3MpLGUuc3RlbmNpbFdyaXRlIT09dm9pZCAwJiYoaS5zdGVuY2lsV3JpdGU9ZS5zdGVuY2lsV3JpdGUpLGUud2lyZWZyYW1lIT09dm9pZCAwJiYoaS53aXJlZnJhbWU9ZS53aXJlZnJhbWUpLGUud2lyZWZyYW1lTGluZXdpZHRoIT09dm9pZCAwJiYoaS53aXJlZnJhbWVMaW5ld2lkdGg9ZS53aXJlZnJhbWVMaW5ld2lkdGgpLGUud2lyZWZyYW1lTGluZWNhcCE9PXZvaWQgMCYmKGkud2lyZWZyYW1lTGluZWNhcD1lLndpcmVmcmFtZUxpbmVjYXApLGUud2lyZWZyYW1lTGluZWpvaW4hPT12b2lkIDAmJihpLndpcmVmcmFtZUxpbmVqb2luPWUud2lyZWZyYW1lTGluZWpvaW4pLGUucm90YXRpb24hPT12b2lkIDAmJihpLnJvdGF0aW9uPWUucm90YXRpb24pLGUubGluZXdpZHRoIT09dm9pZCAwJiYoaS5saW5ld2lkdGg9ZS5saW5ld2lkdGgpLGUuZGFzaFNpemUhPT12b2lkIDAmJihpLmRhc2hTaXplPWUuZGFzaFNpemUpLGUuZ2FwU2l6ZSE9PXZvaWQgMCYmKGkuZ2FwU2l6ZT1lLmdhcFNpemUpLGUuc2NhbGUhPT12b2lkIDAmJihpLnNjYWxlPWUuc2NhbGUpLGUucG9seWdvbk9mZnNldCE9PXZvaWQgMCYmKGkucG9seWdvbk9mZnNldD1lLnBvbHlnb25PZmZzZXQpLGUucG9seWdvbk9mZnNldEZhY3RvciE9PXZvaWQgMCYmKGkucG9seWdvbk9mZnNldEZhY3Rvcj1lLnBvbHlnb25PZmZzZXRGYWN0b3IpLGUucG9seWdvbk9mZnNldFVuaXRzIT09dm9pZCAwJiYoaS5wb2x5Z29uT2Zmc2V0VW5pdHM9ZS5wb2x5Z29uT2Zmc2V0VW5pdHMpLGUuZGl0aGVyaW5nIT09dm9pZCAwJiYoaS5kaXRoZXJpbmc9ZS5kaXRoZXJpbmcpLGUuYWxwaGFUb0NvdmVyYWdlIT09dm9pZCAwJiYoaS5hbHBoYVRvQ292ZXJhZ2U9ZS5hbHBoYVRvQ292ZXJhZ2UpLGUucHJlbXVsdGlwbGllZEFscGhhIT09dm9pZCAwJiYoaS5wcmVtdWx0aXBsaWVkQWxwaGE9ZS5wcmVtdWx0aXBsaWVkQWxwaGEpLGUuZm9yY2VTaW5nbGVQYXNzIT09dm9pZCAwJiYoaS5mb3JjZVNpbmdsZVBhc3M9ZS5mb3JjZVNpbmdsZVBhc3MpLGUudmlzaWJsZSE9PXZvaWQgMCYmKGkudmlzaWJsZT1lLnZpc2libGUpLGUudG9uZU1hcHBlZCE9PXZvaWQgMCYmKGkudG9uZU1hcHBlZD1lLnRvbmVNYXBwZWQpLGUudXNlckRhdGEhPT12b2lkIDAmJihpLnVzZXJEYXRhPWUudXNlckRhdGEpLGUudmVydGV4Q29sb3JzIT09dm9pZCAwJiYodHlwZW9mIGUudmVydGV4Q29sb3JzPT0ibnVtYmVyIj9pLnZlcnRleENvbG9ycz1lLnZlcnRleENvbG9ycz4wOmkudmVydGV4Q29sb3JzPWUudmVydGV4Q29sb3JzKSxlLnVuaWZvcm1zIT09dm9pZCAwKWZvcihjb25zdCBzIGluIGUudW5pZm9ybXMpe2NvbnN0IGE9ZS51bmlmb3Jtc1tzXTtzd2l0Y2goaS51bmlmb3Jtc1tzXT17fSxhLnR5cGUpe2Nhc2UidCI6aS51bmlmb3Jtc1tzXS52YWx1ZT1uKGEudmFsdWUpO2JyZWFrO2Nhc2UiYyI6aS51bmlmb3Jtc1tzXS52YWx1ZT1uZXcgeWUoKS5zZXRIZXgoYS52YWx1ZSk7YnJlYWs7Y2FzZSJ2MiI6aS51bmlmb3Jtc1tzXS52YWx1ZT1uZXcgcSgpLmZyb21BcnJheShhLnZhbHVlKTticmVhaztjYXNlInYzIjppLnVuaWZvcm1zW3NdLnZhbHVlPW5ldyBQKCkuZnJvbUFycmF5KGEudmFsdWUpO2JyZWFrO2Nhc2UidjQiOmkudW5pZm9ybXNbc10udmFsdWU9bmV3IGx0KCkuZnJvbUFycmF5KGEudmFsdWUpO2JyZWFrO2Nhc2UibTMiOmkudW5pZm9ybXNbc10udmFsdWU9bmV3IFplKCkuZnJvbUFycmF5KGEudmFsdWUpO2JyZWFrO2Nhc2UibTQiOmkudW5pZm9ybXNbc10udmFsdWU9bmV3IEllKCkuZnJvbUFycmF5KGEudmFsdWUpO2JyZWFrO2RlZmF1bHQ6aS51bmlmb3Jtc1tzXS52YWx1ZT1hLnZhbHVlfX1pZihlLmRlZmluZXMhPT12b2lkIDAmJihpLmRlZmluZXM9ZS5kZWZpbmVzKSxlLnZlcnRleFNoYWRlciE9PXZvaWQgMCYmKGkudmVydGV4U2hhZGVyPWUudmVydGV4U2hhZGVyKSxlLmZyYWdtZW50U2hhZGVyIT09dm9pZCAwJiYoaS5mcmFnbWVudFNoYWRlcj1lLmZyYWdtZW50U2hhZGVyKSxlLmdsc2xWZXJzaW9uIT09dm9pZCAwJiYoaS5nbHNsVmVyc2lvbj1lLmdsc2xWZXJzaW9uKSxlLmV4dGVuc2lvbnMhPT12b2lkIDApZm9yKGNvbnN0IHMgaW4gZS5leHRlbnNpb25zKWkuZXh0ZW5zaW9uc1tzXT1lLmV4dGVuc2lvbnNbc107aWYoZS5saWdodHMhPT12b2lkIDAmJihpLmxpZ2h0cz1lLmxpZ2h0cyksZS5jbGlwcGluZyE9PXZvaWQgMCYmKGkuY2xpcHBpbmc9ZS5jbGlwcGluZyksZS5zaXplIT09dm9pZCAwJiYoaS5zaXplPWUuc2l6ZSksZS5zaXplQXR0ZW51YXRpb24hPT12b2lkIDAmJihpLnNpemVBdHRlbnVhdGlvbj1lLnNpemVBdHRlbnVhdGlvbiksZS5tYXAhPT12b2lkIDAmJihpLm1hcD1uKGUubWFwKSksZS5tYXRjYXAhPT12b2lkIDAmJihpLm1hdGNhcD1uKGUubWF0Y2FwKSksZS5hbHBoYU1hcCE9PXZvaWQgMCYmKGkuYWxwaGFNYXA9bihlLmFscGhhTWFwKSksZS5idW1wTWFwIT09dm9pZCAwJiYoaS5idW1wTWFwPW4oZS5idW1wTWFwKSksZS5idW1wU2NhbGUhPT12b2lkIDAmJihpLmJ1bXBTY2FsZT1lLmJ1bXBTY2FsZSksZS5ub3JtYWxNYXAhPT12b2lkIDAmJihpLm5vcm1hbE1hcD1uKGUubm9ybWFsTWFwKSksZS5ub3JtYWxNYXBUeXBlIT09dm9pZCAwJiYoaS5ub3JtYWxNYXBUeXBlPWUubm9ybWFsTWFwVHlwZSksZS5ub3JtYWxTY2FsZSE9PXZvaWQgMCl7bGV0IHM9ZS5ub3JtYWxTY2FsZTtBcnJheS5pc0FycmF5KHMpPT09ITEmJihzPVtzLHNdKSxpLm5vcm1hbFNjYWxlPW5ldyBxKCkuZnJvbUFycmF5KHMpfXJldHVybiBlLmRpc3BsYWNlbWVudE1hcCE9PXZvaWQgMCYmKGkuZGlzcGxhY2VtZW50TWFwPW4oZS5kaXNwbGFjZW1lbnRNYXApKSxlLmRpc3BsYWNlbWVudFNjYWxlIT09dm9pZCAwJiYoaS5kaXNwbGFjZW1lbnRTY2FsZT1lLmRpc3BsYWNlbWVudFNjYWxlKSxlLmRpc3BsYWNlbWVudEJpYXMhPT12b2lkIDAmJihpLmRpc3BsYWNlbWVudEJpYXM9ZS5kaXNwbGFjZW1lbnRCaWFzKSxlLnJvdWdobmVzc01hcCE9PXZvaWQgMCYmKGkucm91Z2huZXNzTWFwPW4oZS5yb3VnaG5lc3NNYXApKSxlLm1ldGFsbmVzc01hcCE9PXZvaWQgMCYmKGkubWV0YWxuZXNzTWFwPW4oZS5tZXRhbG5lc3NNYXApKSxlLmVtaXNzaXZlTWFwIT09dm9pZCAwJiYoaS5lbWlzc2l2ZU1hcD1uKGUuZW1pc3NpdmVNYXApKSxlLmVtaXNzaXZlSW50ZW5zaXR5IT09dm9pZCAwJiYoaS5lbWlzc2l2ZUludGVuc2l0eT1lLmVtaXNzaXZlSW50ZW5zaXR5KSxlLnNwZWN1bGFyTWFwIT09dm9pZCAwJiYoaS5zcGVjdWxhck1hcD1uKGUuc3BlY3VsYXJNYXApKSxlLnNwZWN1bGFySW50ZW5zaXR5TWFwIT09dm9pZCAwJiYoaS5zcGVjdWxhckludGVuc2l0eU1hcD1uKGUuc3BlY3VsYXJJbnRlbnNpdHlNYXApKSxlLnNwZWN1bGFyQ29sb3JNYXAhPT12b2lkIDAmJihpLnNwZWN1bGFyQ29sb3JNYXA9bihlLnNwZWN1bGFyQ29sb3JNYXApKSxlLmVudk1hcCE9PXZvaWQgMCYmKGkuZW52TWFwPW4oZS5lbnZNYXApKSxlLmVudk1hcEludGVuc2l0eSE9PXZvaWQgMCYmKGkuZW52TWFwSW50ZW5zaXR5PWUuZW52TWFwSW50ZW5zaXR5KSxlLnJlZmxlY3Rpdml0eSE9PXZvaWQgMCYmKGkucmVmbGVjdGl2aXR5PWUucmVmbGVjdGl2aXR5KSxlLnJlZnJhY3Rpb25SYXRpbyE9PXZvaWQgMCYmKGkucmVmcmFjdGlvblJhdGlvPWUucmVmcmFjdGlvblJhdGlvKSxlLmxpZ2h0TWFwIT09dm9pZCAwJiYoaS5saWdodE1hcD1uKGUubGlnaHRNYXApKSxlLmxpZ2h0TWFwSW50ZW5zaXR5IT09dm9pZCAwJiYoaS5saWdodE1hcEludGVuc2l0eT1lLmxpZ2h0TWFwSW50ZW5zaXR5KSxlLmFvTWFwIT09dm9pZCAwJiYoaS5hb01hcD1uKGUuYW9NYXApKSxlLmFvTWFwSW50ZW5zaXR5IT09dm9pZCAwJiYoaS5hb01hcEludGVuc2l0eT1lLmFvTWFwSW50ZW5zaXR5KSxlLmdyYWRpZW50TWFwIT09dm9pZCAwJiYoaS5ncmFkaWVudE1hcD1uKGUuZ3JhZGllbnRNYXApKSxlLmNsZWFyY29hdE1hcCE9PXZvaWQgMCYmKGkuY2xlYXJjb2F0TWFwPW4oZS5jbGVhcmNvYXRNYXApKSxlLmNsZWFyY29hdFJvdWdobmVzc01hcCE9PXZvaWQgMCYmKGkuY2xlYXJjb2F0Um91Z2huZXNzTWFwPW4oZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXApKSxlLmNsZWFyY29hdE5vcm1hbE1hcCE9PXZvaWQgMCYmKGkuY2xlYXJjb2F0Tm9ybWFsTWFwPW4oZS5jbGVhcmNvYXROb3JtYWxNYXApKSxlLmNsZWFyY29hdE5vcm1hbFNjYWxlIT09dm9pZCAwJiYoaS5jbGVhcmNvYXROb3JtYWxTY2FsZT1uZXcgcSgpLmZyb21BcnJheShlLmNsZWFyY29hdE5vcm1hbFNjYWxlKSksZS5pcmlkZXNjZW5jZU1hcCE9PXZvaWQgMCYmKGkuaXJpZGVzY2VuY2VNYXA9bihlLmlyaWRlc2NlbmNlTWFwKSksZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCE9PXZvaWQgMCYmKGkuaXJpZGVzY2VuY2VUaGlja25lc3NNYXA9bihlLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwKSksZS50cmFuc21pc3Npb25NYXAhPT12b2lkIDAmJihpLnRyYW5zbWlzc2lvbk1hcD1uKGUudHJhbnNtaXNzaW9uTWFwKSksZS50aGlja25lc3NNYXAhPT12b2lkIDAmJihpLnRoaWNrbmVzc01hcD1uKGUudGhpY2tuZXNzTWFwKSksZS5hbmlzb3Ryb3B5TWFwIT09dm9pZCAwJiYoaS5hbmlzb3Ryb3B5TWFwPW4oZS5hbmlzb3Ryb3B5TWFwKSksZS5zaGVlbkNvbG9yTWFwIT09dm9pZCAwJiYoaS5zaGVlbkNvbG9yTWFwPW4oZS5zaGVlbkNvbG9yTWFwKSksZS5zaGVlblJvdWdobmVzc01hcCE9PXZvaWQgMCYmKGkuc2hlZW5Sb3VnaG5lc3NNYXA9bihlLnNoZWVuUm91Z2huZXNzTWFwKSksaX1zZXRUZXh0dXJlcyhlKXtyZXR1cm4gdGhpcy50ZXh0dXJlcz1lLHRoaXN9c3RhdGljIGNyZWF0ZU1hdGVyaWFsRnJvbVR5cGUoZSl7Y29uc3QgdD17U2hhZG93TWF0ZXJpYWw6X20sU3ByaXRlTWF0ZXJpYWw6RGgsUmF3U2hhZGVyTWF0ZXJpYWw6eG0sU2hhZGVyTWF0ZXJpYWw6SG4sUG9pbnRzTWF0ZXJpYWw6VmgsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6eW0sTWVzaFN0YW5kYXJkTWF0ZXJpYWw6bnUsTWVzaFBob25nTWF0ZXJpYWw6dm0sTWVzaFRvb25NYXRlcmlhbDpNbSxNZXNoTm9ybWFsTWF0ZXJpYWw6U20sTWVzaExhbWJlcnRNYXRlcmlhbDpibSxNZXNoRGVwdGhNYXRlcmlhbDpMaCxNZXNoRGlzdGFuY2VNYXRlcmlhbDpJaCxNZXNoQmFzaWNNYXRlcmlhbDpQaSxNZXNoTWF0Y2FwTWF0ZXJpYWw6d20sTGluZURhc2hlZE1hdGVyaWFsOkVtLExpbmVCYXNpY01hdGVyaWFsOkt0LE1hdGVyaWFsOkh0fTtyZXR1cm4gbmV3IHRbZV19fWNsYXNzIHV1e3N0YXRpYyBkZWNvZGVUZXh0KGUpe2lmKHR5cGVvZiBUZXh0RGVjb2RlciE9InVuZGVmaW5lZCIpcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShlKTtsZXQgdD0iIjtmb3IobGV0IG49MCxpPWUubGVuZ3RoO248aTtuKyspdCs9U3RyaW5nLmZyb21DaGFyQ29kZShlW25dKTt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUodCkpfWNhdGNoKG4pe3JldHVybiB0fX1zdGF0aWMgZXh0cmFjdFVybEJhc2UoZSl7Y29uc3QgdD1lLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuIHQ9PT0tMT8iLi8iOmUuc2xpY2UoMCx0KzEpfXN0YXRpYyByZXNvbHZlVVJMKGUsdCl7cmV0dXJuIHR5cGVvZiBlIT0ic3RyaW5nInx8ZT09PSIiPyIiOigvXmh0dHBzPzpcL1wvL2kudGVzdCh0KSYmL15cLy8udGVzdChlKSYmKHQ9dC5yZXBsYWNlKC8oXmh0dHBzPzpcL1wvW15cL10rKS4qL2ksIiQxIikpLC9eKGh0dHBzPzopP1wvXC8vaS50ZXN0KGUpfHwvXmRhdGE6LiosLiokL2kudGVzdChlKXx8L15ibG9iOi4qJC9pLnRlc3QoZSk/ZTp0K2UpfX1jbGFzcyBIbSBleHRlbmRzIGtle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk9ITAsdGhpcy50eXBlPSJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbnN0YW5jZUNvdW50PTEvMH1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuaW5zdGFuY2VDb3VudD1lLmluc3RhbmNlQ291bnQsdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO3JldHVybiBlLmluc3RhbmNlQ291bnQ9dGhpcy5pbnN0YW5jZUNvdW50LGUuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMCxlfX1jbGFzcyBXbSBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9bmV3IGNpKHMubWFuYWdlcik7YS5zZXRQYXRoKHMucGF0aCksYS5zZXRSZXF1ZXN0SGVhZGVyKHMucmVxdWVzdEhlYWRlciksYS5zZXRXaXRoQ3JlZGVudGlhbHMocy53aXRoQ3JlZGVudGlhbHMpLGEubG9hZChlLGZ1bmN0aW9uKG8pe3RyeXt0KHMucGFyc2UoSlNPTi5wYXJzZShvKSkpfWNhdGNoKGwpe2k/aShsKTpjb25zb2xlLmVycm9yKGwpLHMubWFuYWdlci5pdGVtRXJyb3IoZSl9fSxuLGkpfXBhcnNlKGUpe2NvbnN0IHQ9e30sbj17fTtmdW5jdGlvbiBpKGQscCl7aWYodFtwXSE9PXZvaWQgMClyZXR1cm4gdFtwXTtjb25zdCBnPWQuaW50ZXJsZWF2ZWRCdWZmZXJzW3BdLG09cyhkLGcuYnVmZmVyKSx5PVRyKGcudHlwZSxtKSx4PW5ldyBBbyh5LGcuc3RyaWRlKTtyZXR1cm4geC51dWlkPWcudXVpZCx0W3BdPXgseH1mdW5jdGlvbiBzKGQscCl7aWYobltwXSE9PXZvaWQgMClyZXR1cm4gbltwXTtjb25zdCBnPWQuYXJyYXlCdWZmZXJzW3BdLG09bmV3IFVpbnQzMkFycmF5KGcpLmJ1ZmZlcjtyZXR1cm4gbltwXT1tLG19Y29uc3QgYT1lLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk/bmV3IEhtOm5ldyBrZSxvPWUuZGF0YS5pbmRleDtpZihvIT09dm9pZCAwKXtjb25zdCBkPVRyKG8udHlwZSxvLmFycmF5KTthLnNldEluZGV4KG5ldyBLZShkLDEpKX1jb25zdCBsPWUuZGF0YS5hdHRyaWJ1dGVzO2Zvcihjb25zdCBkIGluIGwpe2NvbnN0IHA9bFtkXTtsZXQgXztpZihwLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IGc9aShlLmRhdGEscC5kYXRhKTtfPW5ldyBRaShnLHAuaXRlbVNpemUscC5vZmZzZXQscC5ub3JtYWxpemVkKX1lbHNle2NvbnN0IGc9VHIocC50eXBlLHAuYXJyYXkpLG09cC5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT9qcjpLZTtfPW5ldyBtKGcscC5pdGVtU2l6ZSxwLm5vcm1hbGl6ZWQpfXAubmFtZSE9PXZvaWQgMCYmKF8ubmFtZT1wLm5hbWUpLHAudXNhZ2UhPT12b2lkIDAmJl8uc2V0VXNhZ2UocC51c2FnZSksYS5zZXRBdHRyaWJ1dGUoZCxfKX1jb25zdCBjPWUuZGF0YS5tb3JwaEF0dHJpYnV0ZXM7aWYoYylmb3IoY29uc3QgZCBpbiBjKXtjb25zdCBwPWNbZF0sXz1bXTtmb3IobGV0IGc9MCxtPXAubGVuZ3RoO2c8bTtnKyspe2NvbnN0IHk9cFtnXTtsZXQgeDtpZih5LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IHY9aShlLmRhdGEseS5kYXRhKTt4PW5ldyBRaSh2LHkuaXRlbVNpemUseS5vZmZzZXQseS5ub3JtYWxpemVkKX1lbHNle2NvbnN0IHY9VHIoeS50eXBlLHkuYXJyYXkpO3g9bmV3IEtlKHYseS5pdGVtU2l6ZSx5Lm5vcm1hbGl6ZWQpfXkubmFtZSE9PXZvaWQgMCYmKHgubmFtZT15Lm5hbWUpLF8ucHVzaCh4KX1hLm1vcnBoQXR0cmlidXRlc1tkXT1ffWUuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZSYmKGEubW9ycGhUYXJnZXRzUmVsYXRpdmU9ITApO2NvbnN0IHU9ZS5kYXRhLmdyb3Vwc3x8ZS5kYXRhLmRyYXdjYWxsc3x8ZS5kYXRhLm9mZnNldHM7aWYodSE9PXZvaWQgMClmb3IobGV0IGQ9MCxwPXUubGVuZ3RoO2QhPT1wOysrZCl7Y29uc3QgXz11W2RdO2EuYWRkR3JvdXAoXy5zdGFydCxfLmNvdW50LF8ubWF0ZXJpYWxJbmRleCl9Y29uc3QgZj1lLmRhdGEuYm91bmRpbmdTcGhlcmU7aWYoZiE9PXZvaWQgMCl7Y29uc3QgZD1uZXcgUDtmLmNlbnRlciE9PXZvaWQgMCYmZC5mcm9tQXJyYXkoZi5jZW50ZXIpLGEuYm91bmRpbmdTcGhlcmU9bmV3IEd0KGQsZi5yYWRpdXMpfXJldHVybiBlLm5hbWUmJihhLm5hbWU9ZS5uYW1lKSxlLnVzZXJEYXRhJiYoYS51c2VyRGF0YT1lLnVzZXJEYXRhKSxhfX1jbGFzcyBUYiBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9dGhpcy5wYXRoPT09IiI/dXUuZXh0cmFjdFVybEJhc2UoZSk6dGhpcy5wYXRoO3RoaXMucmVzb3VyY2VQYXRoPXRoaXMucmVzb3VyY2VQYXRofHxhO2NvbnN0IG89bmV3IGNpKHRoaXMubWFuYWdlcik7by5zZXRQYXRoKHRoaXMucGF0aCksby5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksby5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpLG8ubG9hZChlLGZ1bmN0aW9uKGwpe2xldCBjPW51bGw7dHJ5e2M9SlNPTi5wYXJzZShsKX1jYXRjaCh1KXtpIT09dm9pZCAwJiZpKHUpLGNvbnNvbGUuZXJyb3IoIlRIUkVFOk9iamVjdExvYWRlcjogQ2FuJ3QgcGFyc2UgIitlKyIuIix1Lm1lc3NhZ2UpO3JldHVybn1jb25zdCBoPWMubWV0YWRhdGE7aWYoaD09PXZvaWQgMHx8aC50eXBlPT09dm9pZCAwfHxoLnR5cGUudG9Mb3dlckNhc2UoKT09PSJnZW9tZXRyeSIpe2khPT12b2lkIDAmJmkobmV3IEVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIitlKSksY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW4ndCBsb2FkICIrZSk7cmV0dXJufXMucGFyc2UoYyx0KX0sbixpKX1sb2FkQXN5bmMoZSx0KXtyZXR1cm4geXModGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49dGhpcyxpPXRoaXMucGF0aD09PSIiP3V1LmV4dHJhY3RVcmxCYXNlKGUpOnRoaXMucGF0aDt0aGlzLnJlc291cmNlUGF0aD10aGlzLnJlc291cmNlUGF0aHx8aTtjb25zdCBzPW5ldyBjaSh0aGlzLm1hbmFnZXIpO3Muc2V0UGF0aCh0aGlzLnBhdGgpLHMuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLHMuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKTtjb25zdCBhPXlpZWxkIHMubG9hZEFzeW5jKGUsdCksbz1KU09OLnBhcnNlKGEpLGw9by5tZXRhZGF0YTtpZihsPT09dm9pZCAwfHxsLnR5cGU9PT12b2lkIDB8fGwudHlwZS50b0xvd2VyQ2FzZSgpPT09Imdlb21ldHJ5Iil0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk9iamVjdExvYWRlcjogQ2FuJ3QgbG9hZCAiK2UpO3JldHVybiB5aWVsZCBuLnBhcnNlQXN5bmMobyl9KX1wYXJzZShlLHQpe2NvbnN0IG49dGhpcy5wYXJzZUFuaW1hdGlvbnMoZS5hbmltYXRpb25zKSxpPXRoaXMucGFyc2VTaGFwZXMoZS5zaGFwZXMpLHM9dGhpcy5wYXJzZUdlb21ldHJpZXMoZS5nZW9tZXRyaWVzLGkpLGE9dGhpcy5wYXJzZUltYWdlcyhlLmltYWdlcyxmdW5jdGlvbigpe3QhPT12b2lkIDAmJnQoYyl9KSxvPXRoaXMucGFyc2VUZXh0dXJlcyhlLnRleHR1cmVzLGEpLGw9dGhpcy5wYXJzZU1hdGVyaWFscyhlLm1hdGVyaWFscyxvKSxjPXRoaXMucGFyc2VPYmplY3QoZS5vYmplY3QscyxsLG8sbiksaD10aGlzLnBhcnNlU2tlbGV0b25zKGUuc2tlbGV0b25zLGMpO2lmKHRoaXMuYmluZFNrZWxldG9ucyhjLGgpLHQhPT12b2lkIDApe2xldCB1PSExO2Zvcihjb25zdCBmIGluIGEpaWYoYVtmXS5kYXRhIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCl7dT0hMDticmVha311PT09ITEmJnQoYyl9cmV0dXJuIGN9cGFyc2VBc3luYyhlKXtyZXR1cm4geXModGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHQ9dGhpcy5wYXJzZUFuaW1hdGlvbnMoZS5hbmltYXRpb25zKSxuPXRoaXMucGFyc2VTaGFwZXMoZS5zaGFwZXMpLGk9dGhpcy5wYXJzZUdlb21ldHJpZXMoZS5nZW9tZXRyaWVzLG4pLHM9eWllbGQgdGhpcy5wYXJzZUltYWdlc0FzeW5jKGUuaW1hZ2VzKSxhPXRoaXMucGFyc2VUZXh0dXJlcyhlLnRleHR1cmVzLHMpLG89dGhpcy5wYXJzZU1hdGVyaWFscyhlLm1hdGVyaWFscyxhKSxsPXRoaXMucGFyc2VPYmplY3QoZS5vYmplY3QsaSxvLGEsdCksYz10aGlzLnBhcnNlU2tlbGV0b25zKGUuc2tlbGV0b25zLGwpO3JldHVybiB0aGlzLmJpbmRTa2VsZXRvbnMobCxjKSxsfSl9cGFyc2VTaGFwZXMoZSl7Y29uc3QgdD17fTtpZihlIT09dm9pZCAwKWZvcihsZXQgbj0wLGk9ZS5sZW5ndGg7bjxpO24rKyl7Y29uc3Qgcz1uZXcgb2koKS5mcm9tSlNPTihlW25dKTt0W3MudXVpZF09c31yZXR1cm4gdH1wYXJzZVNrZWxldG9ucyhlLHQpe2NvbnN0IG49e30saT17fTtpZih0LnRyYXZlcnNlKGZ1bmN0aW9uKHMpe3MuaXNCb25lJiYoaVtzLnV1aWRdPXMpfSksZSE9PXZvaWQgMClmb3IobGV0IHM9MCxhPWUubGVuZ3RoO3M8YTtzKyspe2NvbnN0IG89bmV3IElvKCkuZnJvbUpTT04oZVtzXSxpKTtuW28udXVpZF09b31yZXR1cm4gbn1wYXJzZUdlb21ldHJpZXMoZSx0KXtjb25zdCBuPXt9O2lmKGUhPT12b2lkIDApe2NvbnN0IGk9bmV3IFdtO2ZvcihsZXQgcz0wLGE9ZS5sZW5ndGg7czxhO3MrKyl7bGV0IG87Y29uc3QgbD1lW3NdO3N3aXRjaChsLnR5cGUpe2Nhc2UiQnVmZmVyR2VvbWV0cnkiOmNhc2UiSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiOm89aS5wYXJzZShsKTticmVhaztkZWZhdWx0OmwudHlwZSBpbiBnbT9vPWdtW2wudHlwZV0uZnJvbUpTT04obCx0KTpjb25zb2xlLndhcm4oYFRIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSAiJHtsLnR5cGV9ImApfW8udXVpZD1sLnV1aWQsbC5uYW1lIT09dm9pZCAwJiYoby5uYW1lPWwubmFtZSksbC51c2VyRGF0YSE9PXZvaWQgMCYmKG8udXNlckRhdGE9bC51c2VyRGF0YSksbltsLnV1aWRdPW99fXJldHVybiBufXBhcnNlTWF0ZXJpYWxzKGUsdCl7Y29uc3Qgbj17fSxpPXt9O2lmKGUhPT12b2lkIDApe2NvbnN0IHM9bmV3IGFsO3Muc2V0VGV4dHVyZXModCk7Zm9yKGxldCBhPTAsbz1lLmxlbmd0aDthPG87YSsrKXtjb25zdCBsPWVbYV07bltsLnV1aWRdPT09dm9pZCAwJiYobltsLnV1aWRdPXMucGFyc2UobCkpLGlbbC51dWlkXT1uW2wudXVpZF19fXJldHVybiBpfXBhcnNlQW5pbWF0aW9ucyhlKXtjb25zdCB0PXt9O2lmKGUhPT12b2lkIDApZm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2NvbnN0IGk9ZVtuXSxzPWRhLnBhcnNlKGkpO3Rbcy51dWlkXT1zfXJldHVybiB0fXBhcnNlSW1hZ2VzKGUsdCl7Y29uc3Qgbj10aGlzLGk9e307bGV0IHM7ZnVuY3Rpb24gYShsKXtyZXR1cm4gbi5tYW5hZ2VyLml0ZW1TdGFydChsKSxzLmxvYWQobCxmdW5jdGlvbigpe24ubWFuYWdlci5pdGVtRW5kKGwpfSx2b2lkIDAsZnVuY3Rpb24oKXtuLm1hbmFnZXIuaXRlbUVycm9yKGwpLG4ubWFuYWdlci5pdGVtRW5kKGwpfSl9ZnVuY3Rpb24gbyhsKXtpZih0eXBlb2YgbD09InN0cmluZyIpe2NvbnN0IGM9bCxoPS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KGMpP2M6bi5yZXNvdXJjZVBhdGgrYztyZXR1cm4gYShoKX1lbHNlIHJldHVybiBsLmRhdGE/e2RhdGE6VHIobC50eXBlLGwuZGF0YSksd2lkdGg6bC53aWR0aCxoZWlnaHQ6bC5oZWlnaHR9Om51bGx9aWYoZSE9PXZvaWQgMCYmZS5sZW5ndGg+MCl7Y29uc3QgbD1uZXcgb3UodCk7cz1uZXcgcGEobCkscy5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTtmb3IobGV0IGM9MCxoPWUubGVuZ3RoO2M8aDtjKyspe2NvbnN0IHU9ZVtjXSxmPXUudXJsO2lmKEFycmF5LmlzQXJyYXkoZikpe2NvbnN0IGQ9W107Zm9yKGxldCBwPTAsXz1mLmxlbmd0aDtwPF87cCsrKXtjb25zdCBnPWZbcF0sbT1vKGcpO20hPT1udWxsJiYobSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ/ZC5wdXNoKG0pOmQucHVzaChuZXcgamkobS5kYXRhLG0ud2lkdGgsbS5oZWlnaHQpKSl9aVt1LnV1aWRdPW5ldyBXaShkKX1lbHNle2NvbnN0IGQ9byh1LnVybCk7aVt1LnV1aWRdPW5ldyBXaShkKX19fXJldHVybiBpfXBhcnNlSW1hZ2VzQXN5bmMoZSl7cmV0dXJuIHlzKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCB0PXRoaXMsbj17fTtsZXQgaTtmdW5jdGlvbiBzKGEpe3JldHVybiB5cyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYodHlwZW9mIGE9PSJzdHJpbmciKXtjb25zdCBvPWEsbD0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChvKT9vOnQucmVzb3VyY2VQYXRoK287cmV0dXJuIHlpZWxkIGkubG9hZEFzeW5jKGwpfWVsc2UgcmV0dXJuIGEuZGF0YT97ZGF0YTpUcihhLnR5cGUsYS5kYXRhKSx3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodH06bnVsbH0pfWlmKGUhPT12b2lkIDAmJmUubGVuZ3RoPjApe2k9bmV3IHBhKHRoaXMubWFuYWdlciksaS5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTtmb3IobGV0IGE9MCxvPWUubGVuZ3RoO2E8bzthKyspe2NvbnN0IGw9ZVthXSxjPWwudXJsO2lmKEFycmF5LmlzQXJyYXkoYykpe2NvbnN0IGg9W107Zm9yKGxldCB1PTAsZj1jLmxlbmd0aDt1PGY7dSsrKXtjb25zdCBkPWNbdV0scD15aWVsZCBzKGQpO3AhPT1udWxsJiYocCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ/aC5wdXNoKHApOmgucHVzaChuZXcgamkocC5kYXRhLHAud2lkdGgscC5oZWlnaHQpKSl9bltsLnV1aWRdPW5ldyBXaShoKX1lbHNle2NvbnN0IGg9eWllbGQgcyhsLnVybCk7bltsLnV1aWRdPW5ldyBXaShoKX19fXJldHVybiBufSl9cGFyc2VUZXh0dXJlcyhlLHQpe2Z1bmN0aW9uIG4ocyxhKXtyZXR1cm4gdHlwZW9mIHM9PSJudW1iZXIiP3M6KGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlVGV4dHVyZTogQ29uc3RhbnQgc2hvdWxkIGJlIGluIG51bWVyaWMgZm9ybS4iLHMpLGFbc10pfWNvbnN0IGk9e307aWYoZSE9PXZvaWQgMClmb3IobGV0IHM9MCxhPWUubGVuZ3RoO3M8YTtzKyspe2NvbnN0IG89ZVtzXTtvLmltYWdlPT09dm9pZCAwJiZjb25zb2xlLndhcm4oJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gImltYWdlIiBzcGVjaWZpZWQgZm9yJyxvLnV1aWQpLHRbby5pbWFnZV09PT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UiLG8uaW1hZ2UpO2NvbnN0IGw9dFtvLmltYWdlXSxjPWwuZGF0YTtsZXQgaDtBcnJheS5pc0FycmF5KGMpPyhoPW5ldyBYcyxjLmxlbmd0aD09PTYmJihoLm5lZWRzVXBkYXRlPSEwKSk6KGMmJmMuZGF0YT9oPW5ldyBqaTpoPW5ldyBFdCxjJiYoaC5uZWVkc1VwZGF0ZT0hMCkpLGguc291cmNlPWwsaC51dWlkPW8udXVpZCxvLm5hbWUhPT12b2lkIDAmJihoLm5hbWU9by5uYW1lKSxvLm1hcHBpbmchPT12b2lkIDAmJihoLm1hcHBpbmc9bihvLm1hcHBpbmcsQ2IpKSxvLmNoYW5uZWwhPT12b2lkIDAmJihoLmNoYW5uZWw9by5jaGFubmVsKSxvLm9mZnNldCE9PXZvaWQgMCYmaC5vZmZzZXQuZnJvbUFycmF5KG8ub2Zmc2V0KSxvLnJlcGVhdCE9PXZvaWQgMCYmaC5yZXBlYXQuZnJvbUFycmF5KG8ucmVwZWF0KSxvLmNlbnRlciE9PXZvaWQgMCYmaC5jZW50ZXIuZnJvbUFycmF5KG8uY2VudGVyKSxvLnJvdGF0aW9uIT09dm9pZCAwJiYoaC5yb3RhdGlvbj1vLnJvdGF0aW9uKSxvLndyYXAhPT12b2lkIDAmJihoLndyYXBTPW4oby53cmFwWzBdLFhtKSxoLndyYXBUPW4oby53cmFwWzFdLFhtKSksby5mb3JtYXQhPT12b2lkIDAmJihoLmZvcm1hdD1vLmZvcm1hdCksby5pbnRlcm5hbEZvcm1hdCE9PXZvaWQgMCYmKGguaW50ZXJuYWxGb3JtYXQ9by5pbnRlcm5hbEZvcm1hdCksby50eXBlIT09dm9pZCAwJiYoaC50eXBlPW8udHlwZSksby5jb2xvclNwYWNlIT09dm9pZCAwJiYoaC5jb2xvclNwYWNlPW8uY29sb3JTcGFjZSksby5lbmNvZGluZyE9PXZvaWQgMCYmKGguZW5jb2Rpbmc9by5lbmNvZGluZyksby5taW5GaWx0ZXIhPT12b2lkIDAmJihoLm1pbkZpbHRlcj1uKG8ubWluRmlsdGVyLHFtKSksby5tYWdGaWx0ZXIhPT12b2lkIDAmJihoLm1hZ0ZpbHRlcj1uKG8ubWFnRmlsdGVyLHFtKSksby5hbmlzb3Ryb3B5IT09dm9pZCAwJiYoaC5hbmlzb3Ryb3B5PW8uYW5pc290cm9weSksby5mbGlwWSE9PXZvaWQgMCYmKGguZmxpcFk9by5mbGlwWSksby5nZW5lcmF0ZU1pcG1hcHMhPT12b2lkIDAmJihoLmdlbmVyYXRlTWlwbWFwcz1vLmdlbmVyYXRlTWlwbWFwcyksby5wcmVtdWx0aXBseUFscGhhIT09dm9pZCAwJiYoaC5wcmVtdWx0aXBseUFscGhhPW8ucHJlbXVsdGlwbHlBbHBoYSksby51bnBhY2tBbGlnbm1lbnQhPT12b2lkIDAmJihoLnVucGFja0FsaWdubWVudD1vLnVucGFja0FsaWdubWVudCksby5jb21wYXJlRnVuY3Rpb24hPT12b2lkIDAmJihoLmNvbXBhcmVGdW5jdGlvbj1vLmNvbXBhcmVGdW5jdGlvbiksby51c2VyRGF0YSE9PXZvaWQgMCYmKGgudXNlckRhdGE9by51c2VyRGF0YSksaVtvLnV1aWRdPWh9cmV0dXJuIGl9cGFyc2VPYmplY3QoZSx0LG4saSxzKXtsZXQgYTtmdW5jdGlvbiBvKGYpe3JldHVybiB0W2ZdPT09dm9pZCAwJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5IixmKSx0W2ZdfWZ1bmN0aW9uIGwoZil7aWYoZiE9PXZvaWQgMCl7aWYoQXJyYXkuaXNBcnJheShmKSl7Y29uc3QgZD1bXTtmb3IobGV0IHA9MCxfPWYubGVuZ3RoO3A8XztwKyspe2NvbnN0IGc9ZltwXTtuW2ddPT09dm9pZCAwJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsIixnKSxkLnB1c2gobltnXSl9cmV0dXJuIGR9cmV0dXJuIG5bZl09PT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLGYpLG5bZl19fWZ1bmN0aW9uIGMoZil7cmV0dXJuIGlbZl09PT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZSIsZiksaVtmXX1sZXQgaCx1O3N3aXRjaChlLnR5cGUpe2Nhc2UiU2NlbmUiOmE9bmV3IEVwLGUuYmFja2dyb3VuZCE9PXZvaWQgMCYmKE51bWJlci5pc0ludGVnZXIoZS5iYWNrZ3JvdW5kKT9hLmJhY2tncm91bmQ9bmV3IHllKGUuYmFja2dyb3VuZCk6YS5iYWNrZ3JvdW5kPWMoZS5iYWNrZ3JvdW5kKSksZS5lbnZpcm9ubWVudCE9PXZvaWQgMCYmKGEuZW52aXJvbm1lbnQ9YyhlLmVudmlyb25tZW50KSksZS5mb2chPT12b2lkIDAmJihlLmZvZy50eXBlPT09IkZvZyI/YS5mb2c9bmV3IEVvKGUuZm9nLmNvbG9yLGUuZm9nLm5lYXIsZS5mb2cuZmFyKTplLmZvZy50eXBlPT09IkZvZ0V4cDIiJiYoYS5mb2c9bmV3IHdvKGUuZm9nLmNvbG9yLGUuZm9nLmRlbnNpdHkpKSxlLmZvZy5uYW1lIT09IiImJihhLmZvZy5uYW1lPWUuZm9nLm5hbWUpKSxlLmJhY2tncm91bmRCbHVycmluZXNzIT09dm9pZCAwJiYoYS5iYWNrZ3JvdW5kQmx1cnJpbmVzcz1lLmJhY2tncm91bmRCbHVycmluZXNzKSxlLmJhY2tncm91bmRJbnRlbnNpdHkhPT12b2lkIDAmJihhLmJhY2tncm91bmRJbnRlbnNpdHk9ZS5iYWNrZ3JvdW5kSW50ZW5zaXR5KTticmVhaztjYXNlIlBlcnNwZWN0aXZlQ2FtZXJhIjphPW5ldyBCdChlLmZvdixlLmFzcGVjdCxlLm5lYXIsZS5mYXIpLGUuZm9jdXMhPT12b2lkIDAmJihhLmZvY3VzPWUuZm9jdXMpLGUuem9vbSE9PXZvaWQgMCYmKGEuem9vbT1lLnpvb20pLGUuZmlsbUdhdWdlIT09dm9pZCAwJiYoYS5maWxtR2F1Z2U9ZS5maWxtR2F1Z2UpLGUuZmlsbU9mZnNldCE9PXZvaWQgMCYmKGEuZmlsbU9mZnNldD1lLmZpbG1PZmZzZXQpLGUudmlldyE9PXZvaWQgMCYmKGEudmlldz1PYmplY3QuYXNzaWduKHt9LGUudmlldykpO2JyZWFrO2Nhc2UiT3J0aG9ncmFwaGljQ2FtZXJhIjphPW5ldyB2byhlLmxlZnQsZS5yaWdodCxlLnRvcCxlLmJvdHRvbSxlLm5lYXIsZS5mYXIpLGUuem9vbSE9PXZvaWQgMCYmKGEuem9vbT1lLnpvb20pLGUudmlldyE9PXZvaWQgMCYmKGEudmlldz1PYmplY3QuYXNzaWduKHt9LGUudmlldykpO2JyZWFrO2Nhc2UiQW1iaWVudExpZ2h0IjphPW5ldyB6bShlLmNvbG9yLGUuaW50ZW5zaXR5KTticmVhaztjYXNlIkRpcmVjdGlvbmFsTGlnaHQiOmE9bmV3IEJtKGUuY29sb3IsZS5pbnRlbnNpdHkpO2JyZWFrO2Nhc2UiUG9pbnRMaWdodCI6YT1uZXcgT20oZS5jb2xvcixlLmludGVuc2l0eSxlLmRpc3RhbmNlLGUuZGVjYXkpO2JyZWFrO2Nhc2UiUmVjdEFyZWFMaWdodCI6YT1uZXcga20oZS5jb2xvcixlLmludGVuc2l0eSxlLndpZHRoLGUuaGVpZ2h0KTticmVhaztjYXNlIlNwb3RMaWdodCI6YT1uZXcgTm0oZS5jb2xvcixlLmludGVuc2l0eSxlLmRpc3RhbmNlLGUuYW5nbGUsZS5wZW51bWJyYSxlLmRlY2F5KTticmVhaztjYXNlIkhlbWlzcGhlcmVMaWdodCI6YT1uZXcgSW0oZS5jb2xvcixlLmdyb3VuZENvbG9yLGUuaW50ZW5zaXR5KTticmVhaztjYXNlIkxpZ2h0UHJvYmUiOmE9bmV3IFZtKCkuZnJvbUpTT04oZSk7YnJlYWs7Y2FzZSJTa2lubmVkTWVzaCI6aD1vKGUuZ2VvbWV0cnkpLHU9bChlLm1hdGVyaWFsKSxhPW5ldyBPcChoLHUpLGUuYmluZE1vZGUhPT12b2lkIDAmJihhLmJpbmRNb2RlPWUuYmluZE1vZGUpLGUuYmluZE1hdHJpeCE9PXZvaWQgMCYmYS5iaW5kTWF0cml4LmZyb21BcnJheShlLmJpbmRNYXRyaXgpLGUuc2tlbGV0b24hPT12b2lkIDAmJihhLnNrZWxldG9uPWUuc2tlbGV0b24pO2JyZWFrO2Nhc2UiTWVzaCI6aD1vKGUuZ2VvbWV0cnkpLHU9bChlLm1hdGVyaWFsKSxhPW5ldyBMdChoLHUpO2JyZWFrO2Nhc2UiSW5zdGFuY2VkTWVzaCI6aD1vKGUuZ2VvbWV0cnkpLHU9bChlLm1hdGVyaWFsKTtjb25zdCBmPWUuY291bnQsZD1lLmluc3RhbmNlTWF0cml4LHA9ZS5pbnN0YW5jZUNvbG9yO2E9bmV3IEdwKGgsdSxmKSxhLmluc3RhbmNlTWF0cml4PW5ldyBqcihuZXcgRmxvYXQzMkFycmF5KGQuYXJyYXkpLDE2KSxwIT09dm9pZCAwJiYoYS5pbnN0YW5jZUNvbG9yPW5ldyBqcihuZXcgRmxvYXQzMkFycmF5KHAuYXJyYXkpLHAuaXRlbVNpemUpKTticmVhaztjYXNlIkJhdGNoZWRNZXNoIjpoPW8oZS5nZW9tZXRyeSksdT1sKGUubWF0ZXJpYWwpLGE9bmV3IFdwKGUubWF4R2VvbWV0cnlDb3VudCxlLm1heFZlcnRleENvdW50LGUubWF4SW5kZXhDb3VudCx1KSxhLmdlb21ldHJ5PWgsYS5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkPWUucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCxhLnNvcnRPYmplY3RzPWUuc29ydE9iamVjdHMsYS5fZHJhd1Jhbmdlcz1lLmRyYXdSYW5nZXMsYS5fcmVzZXJ2ZWRSYW5nZXM9ZS5yZXNlcnZlZFJhbmdlcyxhLl92aXNpYmlsaXR5PWUudmlzaWJpbGl0eSxhLl9hY3RpdmU9ZS5hY3RpdmUsYS5fYm91bmRzPWUuYm91bmRzLm1hcChfPT57Y29uc3QgZz1uZXcgRHQ7Zy5taW4uZnJvbUFycmF5KF8uYm94TWluKSxnLm1heC5mcm9tQXJyYXkoXy5ib3hNYXgpO2NvbnN0IG09bmV3IEd0O3JldHVybiBtLnJhZGl1cz1fLnNwaGVyZVJhZGl1cyxtLmNlbnRlci5mcm9tQXJyYXkoXy5zcGhlcmVDZW50ZXIpLHtib3hJbml0aWFsaXplZDpfLmJveEluaXRpYWxpemVkLGJveDpnLHNwaGVyZUluaXRpYWxpemVkOl8uc3BoZXJlSW5pdGlhbGl6ZWQsc3BoZXJlOm19fSksYS5fbWF4R2VvbWV0cnlDb3VudD1lLm1heEdlb21ldHJ5Q291bnQsYS5fbWF4VmVydGV4Q291bnQ9ZS5tYXhWZXJ0ZXhDb3VudCxhLl9tYXhJbmRleENvdW50PWUubWF4SW5kZXhDb3VudCxhLl9nZW9tZXRyeUluaXRpYWxpemVkPWUuZ2VvbWV0cnlJbml0aWFsaXplZCxhLl9nZW9tZXRyeUNvdW50PWUuZ2VvbWV0cnlDb3VudCxhLl9tYXRyaWNlc1RleHR1cmU9YyhlLm1hdHJpY2VzVGV4dHVyZS51dWlkKTticmVhaztjYXNlIkxPRCI6YT1uZXcgTHA7YnJlYWs7Y2FzZSJMaW5lIjphPW5ldyBVaShvKGUuZ2VvbWV0cnkpLGwoZS5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UiTGluZUxvb3AiOmE9bmV3IEpwKG8oZS5nZW9tZXRyeSksbChlLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJMaW5lU2VnbWVudHMiOmE9bmV3IFduKG8oZS5nZW9tZXRyeSksbChlLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJQb2ludENsb3VkIjpjYXNlIlBvaW50cyI6YT1uZXcgUXAobyhlLmdlb21ldHJ5KSxsKGUubWF0ZXJpYWwpKTticmVhaztjYXNlIlNwcml0ZSI6YT1uZXcgUnAobChlLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJHcm91cCI6YT1uZXcgWXI7YnJlYWs7Y2FzZSJCb25lIjphPW5ldyBCaDticmVhaztkZWZhdWx0OmE9bmV3IHJ0fWlmKGEudXVpZD1lLnV1aWQsZS5uYW1lIT09dm9pZCAwJiYoYS5uYW1lPWUubmFtZSksZS5tYXRyaXghPT12b2lkIDA/KGEubWF0cml4LmZyb21BcnJheShlLm1hdHJpeCksZS5tYXRyaXhBdXRvVXBkYXRlIT09dm9pZCAwJiYoYS5tYXRyaXhBdXRvVXBkYXRlPWUubWF0cml4QXV0b1VwZGF0ZSksYS5tYXRyaXhBdXRvVXBkYXRlJiZhLm1hdHJpeC5kZWNvbXBvc2UoYS5wb3NpdGlvbixhLnF1YXRlcm5pb24sYS5zY2FsZSkpOihlLnBvc2l0aW9uIT09dm9pZCAwJiZhLnBvc2l0aW9uLmZyb21BcnJheShlLnBvc2l0aW9uKSxlLnJvdGF0aW9uIT09dm9pZCAwJiZhLnJvdGF0aW9uLmZyb21BcnJheShlLnJvdGF0aW9uKSxlLnF1YXRlcm5pb24hPT12b2lkIDAmJmEucXVhdGVybmlvbi5mcm9tQXJyYXkoZS5xdWF0ZXJuaW9uKSxlLnNjYWxlIT09dm9pZCAwJiZhLnNjYWxlLmZyb21BcnJheShlLnNjYWxlKSksZS51cCE9PXZvaWQgMCYmYS51cC5mcm9tQXJyYXkoZS51cCksZS5jYXN0U2hhZG93IT09dm9pZCAwJiYoYS5jYXN0U2hhZG93PWUuY2FzdFNoYWRvdyksZS5yZWNlaXZlU2hhZG93IT09dm9pZCAwJiYoYS5yZWNlaXZlU2hhZG93PWUucmVjZWl2ZVNoYWRvdyksZS5zaGFkb3cmJihlLnNoYWRvdy5iaWFzIT09dm9pZCAwJiYoYS5zaGFkb3cuYmlhcz1lLnNoYWRvdy5iaWFzKSxlLnNoYWRvdy5ub3JtYWxCaWFzIT09dm9pZCAwJiYoYS5zaGFkb3cubm9ybWFsQmlhcz1lLnNoYWRvdy5ub3JtYWxCaWFzKSxlLnNoYWRvdy5yYWRpdXMhPT12b2lkIDAmJihhLnNoYWRvdy5yYWRpdXM9ZS5zaGFkb3cucmFkaXVzKSxlLnNoYWRvdy5tYXBTaXplIT09dm9pZCAwJiZhLnNoYWRvdy5tYXBTaXplLmZyb21BcnJheShlLnNoYWRvdy5tYXBTaXplKSxlLnNoYWRvdy5jYW1lcmEhPT12b2lkIDAmJihhLnNoYWRvdy5jYW1lcmE9dGhpcy5wYXJzZU9iamVjdChlLnNoYWRvdy5jYW1lcmEpKSksZS52aXNpYmxlIT09dm9pZCAwJiYoYS52aXNpYmxlPWUudmlzaWJsZSksZS5mcnVzdHVtQ3VsbGVkIT09dm9pZCAwJiYoYS5mcnVzdHVtQ3VsbGVkPWUuZnJ1c3R1bUN1bGxlZCksZS5yZW5kZXJPcmRlciE9PXZvaWQgMCYmKGEucmVuZGVyT3JkZXI9ZS5yZW5kZXJPcmRlciksZS51c2VyRGF0YSE9PXZvaWQgMCYmKGEudXNlckRhdGE9ZS51c2VyRGF0YSksZS5sYXllcnMhPT12b2lkIDAmJihhLmxheWVycy5tYXNrPWUubGF5ZXJzKSxlLmNoaWxkcmVuIT09dm9pZCAwKXtjb25zdCBmPWUuY2hpbGRyZW47Zm9yKGxldCBkPTA7ZDxmLmxlbmd0aDtkKyspYS5hZGQodGhpcy5wYXJzZU9iamVjdChmW2RdLHQsbixpLHMpKX1pZihlLmFuaW1hdGlvbnMhPT12b2lkIDApe2NvbnN0IGY9ZS5hbmltYXRpb25zO2ZvcihsZXQgZD0wO2Q8Zi5sZW5ndGg7ZCsrKXtjb25zdCBwPWZbZF07YS5hbmltYXRpb25zLnB1c2goc1twXSl9fWlmKGUudHlwZT09PSJMT0QiKXtlLmF1dG9VcGRhdGUhPT12b2lkIDAmJihhLmF1dG9VcGRhdGU9ZS5hdXRvVXBkYXRlKTtjb25zdCBmPWUubGV2ZWxzO2ZvcihsZXQgZD0wO2Q8Zi5sZW5ndGg7ZCsrKXtjb25zdCBwPWZbZF0sXz1hLmdldE9iamVjdEJ5UHJvcGVydHkoInV1aWQiLHAub2JqZWN0KTtfIT09dm9pZCAwJiZhLmFkZExldmVsKF8scC5kaXN0YW5jZSxwLmh5c3RlcmVzaXMpfX1yZXR1cm4gYX1iaW5kU2tlbGV0b25zKGUsdCl7T2JqZWN0LmtleXModCkubGVuZ3RoIT09MCYmZS50cmF2ZXJzZShmdW5jdGlvbihuKXtpZihuLmlzU2tpbm5lZE1lc2g9PT0hMCYmbi5za2VsZXRvbiE9PXZvaWQgMCl7Y29uc3QgaT10W24uc2tlbGV0b25dO2k9PT12b2lkIDA/Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IE5vIHNrZWxldG9uIGZvdW5kIHdpdGggVVVJRDoiLG4uc2tlbGV0b24pOm4uYmluZChpLG4uYmluZE1hdHJpeCl9fSl9fWNvbnN0IENiPXtVVk1hcHBpbmc6RmEsQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOktuLEN1YmVSZWZyYWN0aW9uTWFwcGluZzp5aSxFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzpicyxFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzp3cyxDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpicn0sWG09e1JlcGVhdFdyYXBwaW5nOkVzLENsYW1wVG9FZGdlV3JhcHBpbmc6enQsTWlycm9yZWRSZXBlYXRXcmFwcGluZzpBc30scW09e05lYXJlc3RGaWx0ZXI6YnQsTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI6T2EsTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjpUcyxMaW5lYXJGaWx0ZXI6d3QsTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcjptYyxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI6dml9O2NsYXNzIFJiIGV4dGVuZHMgdW57Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5pc0ltYWdlQml0bWFwTG9hZGVyPSEwLHR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcD09InVuZGVmaW5lZCImJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGNyZWF0ZUltYWdlQml0bWFwKCkgbm90IHN1cHBvcnRlZC4iKSx0eXBlb2YgZmV0Y2g9PSJ1bmRlZmluZWQiJiZjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuIiksdGhpcy5vcHRpb25zPXtwcmVtdWx0aXBseUFscGhhOiJub25lIn19c2V0T3B0aW9ucyhlKXtyZXR1cm4gdGhpcy5vcHRpb25zPWUsdGhpc31sb2FkKGUsdCxuLGkpe2U9PT12b2lkIDAmJihlPSIiKSx0aGlzLnBhdGghPT12b2lkIDAmJihlPXRoaXMucGF0aCtlKSxlPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGUpO2NvbnN0IHM9dGhpcyxhPXNyLmdldChlKTtpZihhIT09dm9pZCAwKXJldHVybiBzLm1hbmFnZXIuaXRlbVN0YXJ0KGUpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0JiZ0KGEpLHMubWFuYWdlci5pdGVtRW5kKGUpfSwwKSxhO2NvbnN0IG89e307by5jcmVkZW50aWFscz10aGlzLmNyb3NzT3JpZ2luPT09ImFub255bW91cyI/InNhbWUtb3JpZ2luIjoiaW5jbHVkZSIsby5oZWFkZXJzPXRoaXMucmVxdWVzdEhlYWRlcixmZXRjaChlLG8pLnRoZW4oZnVuY3Rpb24obCl7cmV0dXJuIGwuYmxvYigpfSkudGhlbihmdW5jdGlvbihsKXtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAobCxPYmplY3QuYXNzaWduKHMub3B0aW9ucyx7Y29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSkpfSkudGhlbihmdW5jdGlvbihsKXtzci5hZGQoZSxsKSx0JiZ0KGwpLHMubWFuYWdlci5pdGVtRW5kKGUpfSkuY2F0Y2goZnVuY3Rpb24obCl7aSYmaShsKSxzLm1hbmFnZXIuaXRlbUVycm9yKGUpLHMubWFuYWdlci5pdGVtRW5kKGUpfSkscy5tYW5hZ2VyLml0ZW1TdGFydChlKX19bGV0IG9sO2NsYXNzIGZ1e3N0YXRpYyBnZXRDb250ZXh0KCl7cmV0dXJuIG9sPT09dm9pZCAwJiYob2w9bmV3KHdpbmRvdy5BdWRpb0NvbnRleHR8fHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQpKSxvbH1zdGF0aWMgc2V0Q29udGV4dChlKXtvbD1lfX1jbGFzcyBQYiBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9bmV3IGNpKHRoaXMubWFuYWdlcik7YS5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIiksYS5zZXRQYXRoKHRoaXMucGF0aCksYS5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksYS5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpLGEubG9hZChlLGZ1bmN0aW9uKGwpe3RyeXtjb25zdCBjPWwuc2xpY2UoMCk7ZnUuZ2V0Q29udGV4dCgpLmRlY29kZUF1ZGlvRGF0YShjLGZ1bmN0aW9uKHUpe3QodSl9KS5jYXRjaChvKX1jYXRjaChjKXtvKGMpfX0sbixpKTtmdW5jdGlvbiBvKGwpe2k/aShsKTpjb25zb2xlLmVycm9yKGwpLHMubWFuYWdlci5pdGVtRXJyb3IoZSl9fX1jb25zdCAkbT1uZXcgSWUsWW09bmV3IEllLGFyPW5ldyBJZTtjbGFzcyBMYntjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZT0iU3RlcmVvQ2FtZXJhIix0aGlzLmFzcGVjdD0xLHRoaXMuZXllU2VwPS4wNjQsdGhpcy5jYW1lcmFMPW5ldyBCdCx0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSgxKSx0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNhbWVyYVI9bmV3IEJ0LHRoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKDIpLHRoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuX2NhY2hlPXtmb2N1czpudWxsLGZvdjpudWxsLGFzcGVjdDpudWxsLG5lYXI6bnVsbCxmYXI6bnVsbCx6b29tOm51bGwsZXllU2VwOm51bGx9fXVwZGF0ZShlKXtjb25zdCB0PXRoaXMuX2NhY2hlO2lmKHQuZm9jdXMhPT1lLmZvY3VzfHx0LmZvdiE9PWUuZm92fHx0LmFzcGVjdCE9PWUuYXNwZWN0KnRoaXMuYXNwZWN0fHx0Lm5lYXIhPT1lLm5lYXJ8fHQuZmFyIT09ZS5mYXJ8fHQuem9vbSE9PWUuem9vbXx8dC5leWVTZXAhPT10aGlzLmV5ZVNlcCl7dC5mb2N1cz1lLmZvY3VzLHQuZm92PWUuZm92LHQuYXNwZWN0PWUuYXNwZWN0KnRoaXMuYXNwZWN0LHQubmVhcj1lLm5lYXIsdC5mYXI9ZS5mYXIsdC56b29tPWUuem9vbSx0LmV5ZVNlcD10aGlzLmV5ZVNlcCxhci5jb3B5KGUucHJvamVjdGlvbk1hdHJpeCk7Y29uc3QgaT10LmV5ZVNlcC8yLHM9aSp0Lm5lYXIvdC5mb2N1cyxhPXQubmVhcipNYXRoLnRhbihIaSp0LmZvdiouNSkvdC56b29tO2xldCBvLGw7WW0uZWxlbWVudHNbMTJdPS1pLCRtLmVsZW1lbnRzWzEyXT1pLG89LWEqdC5hc3BlY3QrcyxsPWEqdC5hc3BlY3Qrcyxhci5lbGVtZW50c1swXT0yKnQubmVhci8obC1vKSxhci5lbGVtZW50c1s4XT0obCtvKS8obC1vKSx0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KGFyKSxvPS1hKnQuYXNwZWN0LXMsbD1hKnQuYXNwZWN0LXMsYXIuZWxlbWVudHNbMF09Mip0Lm5lYXIvKGwtbyksYXIuZWxlbWVudHNbOF09KGwrbykvKGwtbyksdGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weShhcil9dGhpcy5jYW1lcmFMLm1hdHJpeFdvcmxkLmNvcHkoZS5tYXRyaXhXb3JsZCkubXVsdGlwbHkoWW0pLHRoaXMuY2FtZXJhUi5tYXRyaXhXb3JsZC5jb3B5KGUubWF0cml4V29ybGQpLm11bHRpcGx5KCRtKX19Y2xhc3MgWm17Y29uc3RydWN0b3IoZT0hMCl7dGhpcy5hdXRvU3RhcnQ9ZSx0aGlzLnN0YXJ0VGltZT0wLHRoaXMub2xkVGltZT0wLHRoaXMuZWxhcHNlZFRpbWU9MCx0aGlzLnJ1bm5pbmc9ITF9c3RhcnQoKXt0aGlzLnN0YXJ0VGltZT1KbSgpLHRoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZSx0aGlzLmVsYXBzZWRUaW1lPTAsdGhpcy5ydW5uaW5nPSEwfXN0b3AoKXt0aGlzLmdldEVsYXBzZWRUaW1lKCksdGhpcy5ydW5uaW5nPSExLHRoaXMuYXV0b1N0YXJ0PSExfWdldEVsYXBzZWRUaW1lKCl7cmV0dXJuIHRoaXMuZ2V0RGVsdGEoKSx0aGlzLmVsYXBzZWRUaW1lfWdldERlbHRhKCl7bGV0IGU9MDtpZih0aGlzLmF1dG9TdGFydCYmIXRoaXMucnVubmluZylyZXR1cm4gdGhpcy5zdGFydCgpLDA7aWYodGhpcy5ydW5uaW5nKXtjb25zdCB0PUptKCk7ZT0odC10aGlzLm9sZFRpbWUpLzFlMyx0aGlzLm9sZFRpbWU9dCx0aGlzLmVsYXBzZWRUaW1lKz1lfXJldHVybiBlfX1mdW5jdGlvbiBKbSgpe3JldHVybih0eXBlb2YgcGVyZm9ybWFuY2U9PSJ1bmRlZmluZWQiP0RhdGU6cGVyZm9ybWFuY2UpLm5vdygpfWNvbnN0IG9yPW5ldyBQLEttPW5ldyBsbixJYj1uZXcgUCxscj1uZXcgUDtjbGFzcyBVYiBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkF1ZGlvTGlzdGVuZXIiLHRoaXMuY29udGV4dD1mdS5nZXRDb250ZXh0KCksdGhpcy5nYWluPXRoaXMuY29udGV4dC5jcmVhdGVHYWluKCksdGhpcy5nYWluLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmZpbHRlcj1udWxsLHRoaXMudGltZURlbHRhPTAsdGhpcy5fY2xvY2s9bmV3IFptfWdldElucHV0KCl7cmV0dXJuIHRoaXMuZ2Fpbn1yZW1vdmVGaWx0ZXIoKXtyZXR1cm4gdGhpcy5maWx0ZXIhPT1udWxsJiYodGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPW51bGwpLHRoaXN9Z2V0RmlsdGVyKCl7cmV0dXJuIHRoaXMuZmlsdGVyfXNldEZpbHRlcihlKXtyZXR1cm4gdGhpcy5maWx0ZXIhPT1udWxsPyh0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pKTp0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPWUsdGhpcy5nYWluLmNvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzfWdldE1hc3RlclZvbHVtZSgpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX1zZXRNYXN0ZXJWb2x1bWUoZSl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZShlLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9dXBkYXRlTWF0cml4V29ybGQoZSl7c3VwZXIudXBkYXRlTWF0cml4V29ybGQoZSk7Y29uc3QgdD10aGlzLmNvbnRleHQubGlzdGVuZXIsbj10aGlzLnVwO2lmKHRoaXMudGltZURlbHRhPXRoaXMuX2Nsb2NrLmdldERlbHRhKCksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2Uob3IsS20sSWIpLGxyLnNldCgwLDAsLTEpLmFwcGx5UXVhdGVybmlvbihLbSksdC5wb3NpdGlvblgpe2NvbnN0IGk9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3RoaXMudGltZURlbHRhO3QucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG9yLngsaSksdC5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUob3IueSxpKSx0LnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShvci56LGkpLHQuZm9yd2FyZFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobHIueCxpKSx0LmZvcndhcmRZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGxyLnksaSksdC5mb3J3YXJkWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShsci56LGkpLHQudXBYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG4ueCxpKSx0LnVwWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShuLnksaSksdC51cFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobi56LGkpfWVsc2UgdC5zZXRQb3NpdGlvbihvci54LG9yLnksb3IueiksdC5zZXRPcmllbnRhdGlvbihsci54LGxyLnksbHIueixuLngsbi55LG4ueil9fWNsYXNzIFFtIGV4dGVuZHMgcnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnR5cGU9IkF1ZGlvIix0aGlzLmxpc3RlbmVyPWUsdGhpcy5jb250ZXh0PWUuY29udGV4dCx0aGlzLmdhaW49dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKSx0aGlzLmdhaW4uY29ubmVjdChlLmdldElucHV0KCkpLHRoaXMuYXV0b3BsYXk9ITEsdGhpcy5idWZmZXI9bnVsbCx0aGlzLmRldHVuZT0wLHRoaXMubG9vcD0hMSx0aGlzLmxvb3BTdGFydD0wLHRoaXMubG9vcEVuZD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5kdXJhdGlvbj12b2lkIDAsdGhpcy5wbGF5YmFja1JhdGU9MSx0aGlzLmlzUGxheWluZz0hMSx0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMCx0aGlzLnNvdXJjZT1udWxsLHRoaXMuc291cmNlVHlwZT0iZW1wdHkiLHRoaXMuX3N0YXJ0ZWRBdD0wLHRoaXMuX3Byb2dyZXNzPTAsdGhpcy5fY29ubmVjdGVkPSExLHRoaXMuZmlsdGVycz1bXX1nZXRPdXRwdXQoKXtyZXR1cm4gdGhpcy5nYWlufXNldE5vZGVTb3VyY2UoZSl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0iYXVkaW9Ob2RlIix0aGlzLnNvdXJjZT1lLHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0TWVkaWFFbGVtZW50U291cmNlKGUpe3JldHVybiB0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMSx0aGlzLnNvdXJjZVR5cGU9Im1lZGlhTm9kZSIsdGhpcy5zb3VyY2U9dGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZShlKSx0aGlzLmNvbm5lY3QoKSx0aGlzfXNldE1lZGlhU3RyZWFtU291cmNlKGUpe3JldHVybiB0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMSx0aGlzLnNvdXJjZVR5cGU9Im1lZGlhU3RyZWFtTm9kZSIsdGhpcy5zb3VyY2U9dGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKGUpLHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0QnVmZmVyKGUpe3JldHVybiB0aGlzLmJ1ZmZlcj1lLHRoaXMuc291cmNlVHlwZT0iYnVmZmVyIix0aGlzLmF1dG9wbGF5JiZ0aGlzLnBsYXkoKSx0aGlzfXBsYXkoZT0wKXtpZih0aGlzLmlzUGxheWluZz09PSEwKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiBBdWRpbyBpcyBhbHJlYWR5IHBsYXlpbmcuIik7cmV0dXJufWlmKHRoaXMuaGFzUGxheWJhY2tDb250cm9sPT09ITEpe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7cmV0dXJufXRoaXMuX3N0YXJ0ZWRBdD10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrZTtjb25zdCB0PXRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtyZXR1cm4gdC5idWZmZXI9dGhpcy5idWZmZXIsdC5sb29wPXRoaXMubG9vcCx0Lmxvb3BTdGFydD10aGlzLmxvb3BTdGFydCx0Lmxvb3BFbmQ9dGhpcy5sb29wRW5kLHQub25lbmRlZD10aGlzLm9uRW5kZWQuYmluZCh0aGlzKSx0LnN0YXJ0KHRoaXMuX3N0YXJ0ZWRBdCx0aGlzLl9wcm9ncmVzcyt0aGlzLm9mZnNldCx0aGlzLmR1cmF0aW9uKSx0aGlzLmlzUGxheWluZz0hMCx0aGlzLnNvdXJjZT10LHRoaXMuc2V0RGV0dW5lKHRoaXMuZGV0dW5lKSx0aGlzLnNldFBsYXliYWNrUmF0ZSh0aGlzLnBsYXliYWNrUmF0ZSksdGhpcy5jb25uZWN0KCl9cGF1c2UoKXtpZih0aGlzLmhhc1BsYXliYWNrQ29udHJvbD09PSExKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO3JldHVybn1yZXR1cm4gdGhpcy5pc1BsYXlpbmc9PT0hMCYmKHRoaXMuX3Byb2dyZXNzKz1NYXRoLm1heCh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRlZEF0LDApKnRoaXMucGxheWJhY2tSYXRlLHRoaXMubG9vcD09PSEwJiYodGhpcy5fcHJvZ3Jlc3M9dGhpcy5fcHJvZ3Jlc3MlKHRoaXMuZHVyYXRpb258fHRoaXMuYnVmZmVyLmR1cmF0aW9uKSksdGhpcy5zb3VyY2Uuc3RvcCgpLHRoaXMuc291cmNlLm9uZW5kZWQ9bnVsbCx0aGlzLmlzUGxheWluZz0hMSksdGhpc31zdG9wKCl7aWYodGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9PT0hMSl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtyZXR1cm59cmV0dXJuIHRoaXMuX3Byb2dyZXNzPTAsdGhpcy5zb3VyY2UhPT1udWxsJiYodGhpcy5zb3VyY2Uuc3RvcCgpLHRoaXMuc291cmNlLm9uZW5kZWQ9bnVsbCksdGhpcy5pc1BsYXlpbmc9ITEsdGhpc31jb25uZWN0KCl7aWYodGhpcy5maWx0ZXJzLmxlbmd0aD4wKXt0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMuZmlsdGVyc1swXSk7Zm9yKGxldCBlPTEsdD10aGlzLmZpbHRlcnMubGVuZ3RoO2U8dDtlKyspdGhpcy5maWx0ZXJzW2UtMV0uY29ubmVjdCh0aGlzLmZpbHRlcnNbZV0pO3RoaXMuZmlsdGVyc1t0aGlzLmZpbHRlcnMubGVuZ3RoLTFdLmNvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSl9ZWxzZSB0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpO3JldHVybiB0aGlzLl9jb25uZWN0ZWQ9ITAsdGhpc31kaXNjb25uZWN0KCl7aWYodGhpcy5fY29ubmVjdGVkIT09ITEpe2lmKHRoaXMuZmlsdGVycy5sZW5ndGg+MCl7dGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2ZvcihsZXQgZT0xLHQ9dGhpcy5maWx0ZXJzLmxlbmd0aDtlPHQ7ZSsrKXRoaXMuZmlsdGVyc1tlLTFdLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzW2VdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5kaXNjb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpcy5fY29ubmVjdGVkPSExLHRoaXN9fWdldEZpbHRlcnMoKXtyZXR1cm4gdGhpcy5maWx0ZXJzfXNldEZpbHRlcnMoZSl7cmV0dXJuIGV8fChlPVtdKSx0aGlzLl9jb25uZWN0ZWQ9PT0hMD8odGhpcy5kaXNjb25uZWN0KCksdGhpcy5maWx0ZXJzPWUuc2xpY2UoKSx0aGlzLmNvbm5lY3QoKSk6dGhpcy5maWx0ZXJzPWUuc2xpY2UoKSx0aGlzfXNldERldHVuZShlKXtpZih0aGlzLmRldHVuZT1lLHRoaXMuc291cmNlLmRldHVuZSE9PXZvaWQgMClyZXR1cm4gdGhpcy5pc1BsYXlpbmc9PT0hMCYmdGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSh0aGlzLmRldHVuZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfWdldERldHVuZSgpe3JldHVybiB0aGlzLmRldHVuZX1nZXRGaWx0ZXIoKXtyZXR1cm4gdGhpcy5nZXRGaWx0ZXJzKClbMF19c2V0RmlsdGVyKGUpe3JldHVybiB0aGlzLnNldEZpbHRlcnMoZT9bZV06W10pfXNldFBsYXliYWNrUmF0ZShlKXtpZih0aGlzLmhhc1BsYXliYWNrQ29udHJvbD09PSExKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO3JldHVybn1yZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU9ZSx0aGlzLmlzUGxheWluZz09PSEwJiZ0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMucGxheWJhY2tSYXRlLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9Z2V0UGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlfW9uRW5kZWQoKXt0aGlzLmlzUGxheWluZz0hMX1nZXRMb29wKCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPT09ITE/KGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIiksITEpOnRoaXMubG9vcH1zZXRMb29wKGUpe2lmKHRoaXMuaGFzUGxheWJhY2tDb250cm9sPT09ITEpe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7cmV0dXJufXJldHVybiB0aGlzLmxvb3A9ZSx0aGlzLmlzUGxheWluZz09PSEwJiYodGhpcy5zb3VyY2UubG9vcD10aGlzLmxvb3ApLHRoaXN9c2V0TG9vcFN0YXJ0KGUpe3JldHVybiB0aGlzLmxvb3BTdGFydD1lLHRoaXN9c2V0TG9vcEVuZChlKXtyZXR1cm4gdGhpcy5sb29wRW5kPWUsdGhpc31nZXRWb2x1bWUoKXtyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWV9c2V0Vm9sdW1lKGUpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfX1jb25zdCBjcj1uZXcgUCxqbT1uZXcgbG4sRGI9bmV3IFAsaHI9bmV3IFA7Y2xhc3MgTmIgZXh0ZW5kcyBRbXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnBhbm5lcj10aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCksdGhpcy5wYW5uZXIucGFubmluZ01vZGVsPSJIUlRGIix0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbil9Y29ubmVjdCgpe3N1cGVyLmNvbm5lY3QoKSx0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbil9ZGlzY29ubmVjdCgpe3N1cGVyLmRpc2Nvbm5lY3QoKSx0aGlzLnBhbm5lci5kaXNjb25uZWN0KHRoaXMuZ2Fpbil9Z2V0T3V0cHV0KCl7cmV0dXJuIHRoaXMucGFubmVyfWdldFJlZkRpc3RhbmNlKCl7cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlfXNldFJlZkRpc3RhbmNlKGUpe3JldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZT1lLHRoaXN9Z2V0Um9sbG9mZkZhY3Rvcigpe3JldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yfXNldFJvbGxvZmZGYWN0b3IoZSl7cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I9ZSx0aGlzfWdldERpc3RhbmNlTW9kZWwoKXtyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbH1zZXREaXN0YW5jZU1vZGVsKGUpe3JldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsPWUsdGhpc31nZXRNYXhEaXN0YW5jZSgpe3JldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZX1zZXRNYXhEaXN0YW5jZShlKXtyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U9ZSx0aGlzfXNldERpcmVjdGlvbmFsQ29uZShlLHQsbil7cmV0dXJuIHRoaXMucGFubmVyLmNvbmVJbm5lckFuZ2xlPWUsdGhpcy5wYW5uZXIuY29uZU91dGVyQW5nbGU9dCx0aGlzLnBhbm5lci5jb25lT3V0ZXJHYWluPW4sdGhpc311cGRhdGVNYXRyaXhXb3JsZChlKXtpZihzdXBlci51cGRhdGVNYXRyaXhXb3JsZChlKSx0aGlzLmhhc1BsYXliYWNrQ29udHJvbD09PSEwJiZ0aGlzLmlzUGxheWluZz09PSExKXJldHVybjt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShjcixqbSxEYiksaHIuc2V0KDAsMCwxKS5hcHBseVF1YXRlcm5pb24oam0pO2NvbnN0IHQ9dGhpcy5wYW5uZXI7aWYodC5wb3NpdGlvblgpe2NvbnN0IG49dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3RoaXMubGlzdGVuZXIudGltZURlbHRhO3QucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGNyLngsbiksdC5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoY3IueSxuKSx0LnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShjci56LG4pLHQub3JpZW50YXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGhyLngsbiksdC5vcmllbnRhdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoaHIueSxuKSx0Lm9yaWVudGF0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShoci56LG4pfWVsc2UgdC5zZXRQb3NpdGlvbihjci54LGNyLnksY3IueiksdC5zZXRPcmllbnRhdGlvbihoci54LGhyLnksaHIueil9fWNsYXNzIEZie2NvbnN0cnVjdG9yKGUsdD0yMDQ4KXt0aGlzLmFuYWx5c2VyPWUuY29udGV4dC5jcmVhdGVBbmFseXNlcigpLHRoaXMuYW5hbHlzZXIuZmZ0U2l6ZT10LHRoaXMuZGF0YT1uZXcgVWludDhBcnJheSh0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50KSxlLmdldE91dHB1dCgpLmNvbm5lY3QodGhpcy5hbmFseXNlcil9Z2V0RnJlcXVlbmN5RGF0YSgpe3JldHVybiB0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKHRoaXMuZGF0YSksdGhpcy5kYXRhfWdldEF2ZXJhZ2VGcmVxdWVuY3koKXtsZXQgZT0wO2NvbnN0IHQ9dGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspZSs9dFtuXTtyZXR1cm4gZS90Lmxlbmd0aH19Y2xhc3MgZWd7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuYmluZGluZz1lLHRoaXMudmFsdWVTaXplPW47bGV0IGkscyxhO3N3aXRjaCh0KXtjYXNlInF1YXRlcm5pb24iOmk9dGhpcy5fc2xlcnAscz10aGlzLl9zbGVycEFkZGl0aXZlLGE9dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24sdGhpcy5idWZmZXI9bmV3IEZsb2F0NjRBcnJheShuKjYpLHRoaXMuX3dvcmtJbmRleD01O2JyZWFrO2Nhc2Uic3RyaW5nIjpjYXNlImJvb2wiOmk9dGhpcy5fc2VsZWN0LHM9dGhpcy5fc2VsZWN0LGE9dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU90aGVyLHRoaXMuYnVmZmVyPW5ldyBBcnJheShuKjUpO2JyZWFrO2RlZmF1bHQ6aT10aGlzLl9sZXJwLHM9dGhpcy5fbGVycEFkZGl0aXZlLGE9dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU51bWVyaWMsdGhpcy5idWZmZXI9bmV3IEZsb2F0NjRBcnJheShuKjUpfXRoaXMuX21peEJ1ZmZlclJlZ2lvbj1pLHRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlPXMsdGhpcy5fc2V0SWRlbnRpdHk9YSx0aGlzLl9vcmlnSW5kZXg9Myx0aGlzLl9hZGRJbmRleD00LHRoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTAsdGhpcy51c2VDb3VudD0wLHRoaXMucmVmZXJlbmNlQ291bnQ9MH1hY2N1bXVsYXRlKGUsdCl7Y29uc3Qgbj10aGlzLmJ1ZmZlcixpPXRoaXMudmFsdWVTaXplLHM9ZSppK2k7bGV0IGE9dGhpcy5jdW11bGF0aXZlV2VpZ2h0O2lmKGE9PT0wKXtmb3IobGV0IG89MDtvIT09aTsrK28pbltzK29dPW5bb107YT10fWVsc2V7YSs9dDtjb25zdCBvPXQvYTt0aGlzLl9taXhCdWZmZXJSZWdpb24obixzLDAsbyxpKX10aGlzLmN1bXVsYXRpdmVXZWlnaHQ9YX1hY2N1bXVsYXRlQWRkaXRpdmUoZSl7Y29uc3QgdD10aGlzLmJ1ZmZlcixuPXRoaXMudmFsdWVTaXplLGk9bip0aGlzLl9hZGRJbmRleDt0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZT09PTAmJnRoaXMuX3NldElkZW50aXR5KCksdGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUodCxpLDAsZSxuKSx0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSs9ZX1hcHBseShlKXtjb25zdCB0PXRoaXMudmFsdWVTaXplLG49dGhpcy5idWZmZXIsaT1lKnQrdCxzPXRoaXMuY3VtdWxhdGl2ZVdlaWdodCxhPXRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlLG89dGhpcy5iaW5kaW5nO2lmKHRoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTAsczwxKXtjb25zdCBsPXQqdGhpcy5fb3JpZ0luZGV4O3RoaXMuX21peEJ1ZmZlclJlZ2lvbihuLGksbCwxLXMsdCl9YT4wJiZ0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZShuLGksdGhpcy5fYWRkSW5kZXgqdCwxLHQpO2ZvcihsZXQgbD10LGM9dCt0O2whPT1jOysrbClpZihuW2xdIT09bltsK3RdKXtvLnNldFZhbHVlKG4saSk7YnJlYWt9fXNhdmVPcmlnaW5hbFN0YXRlKCl7Y29uc3QgZT10aGlzLmJpbmRpbmcsdD10aGlzLmJ1ZmZlcixuPXRoaXMudmFsdWVTaXplLGk9bip0aGlzLl9vcmlnSW5kZXg7ZS5nZXRWYWx1ZSh0LGkpO2ZvcihsZXQgcz1uLGE9aTtzIT09YTsrK3MpdFtzXT10W2krcyVuXTt0aGlzLl9zZXRJZGVudGl0eSgpLHRoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTB9cmVzdG9yZU9yaWdpbmFsU3RhdGUoKXtjb25zdCBlPXRoaXMudmFsdWVTaXplKjM7dGhpcy5iaW5kaW5nLnNldFZhbHVlKHRoaXMuYnVmZmVyLGUpfV9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpe2NvbnN0IGU9dGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemUsdD1lK3RoaXMudmFsdWVTaXplO2ZvcihsZXQgbj1lO248dDtuKyspdGhpcy5idWZmZXJbbl09MH1fc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24oKXt0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpLHRoaXMuYnVmZmVyW3RoaXMuX2FkZEluZGV4KnRoaXMudmFsdWVTaXplKzNdPTF9X3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcigpe2NvbnN0IGU9dGhpcy5fb3JpZ0luZGV4KnRoaXMudmFsdWVTaXplLHQ9dGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemU7Zm9yKGxldCBuPTA7bjx0aGlzLnZhbHVlU2l6ZTtuKyspdGhpcy5idWZmZXJbdCtuXT10aGlzLmJ1ZmZlcltlK25dfV9zZWxlY3QoZSx0LG4saSxzKXtpZihpPj0uNSlmb3IobGV0IGE9MDthIT09czsrK2EpZVt0K2FdPWVbbithXX1fc2xlcnAoZSx0LG4saSl7bG4uc2xlcnBGbGF0KGUsdCxlLHQsZSxuLGkpfV9zbGVycEFkZGl0aXZlKGUsdCxuLGkscyl7Y29uc3QgYT10aGlzLl93b3JrSW5kZXgqcztsbi5tdWx0aXBseVF1YXRlcm5pb25zRmxhdChlLGEsZSx0LGUsbiksbG4uc2xlcnBGbGF0KGUsdCxlLHQsZSxhLGkpfV9sZXJwKGUsdCxuLGkscyl7Y29uc3QgYT0xLWk7Zm9yKGxldCBvPTA7byE9PXM7KytvKXtjb25zdCBsPXQrbztlW2xdPWVbbF0qYStlW24rb10qaX19X2xlcnBBZGRpdGl2ZShlLHQsbixpLHMpe2ZvcihsZXQgYT0wO2EhPT1zOysrYSl7Y29uc3Qgbz10K2E7ZVtvXT1lW29dK2VbbithXSppfX19Y29uc3QgZHU9IlxcW1xcXVxcLjpcXC8iLE9iPW5ldyBSZWdFeHAoIlsiK2R1KyJdIiwiZyIpLHB1PSJbXiIrZHUrIl0iLEJiPSJbXiIrZHUucmVwbGFjZSgiXFwuIiwiIikrIl0iLHpiPS8oKD86V0MrW1wvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCJXQyIscHUpLGtiPS8oV0NPRCspPy8uc291cmNlLnJlcGxhY2UoIldDT0QiLEJiKSxHYj0vKD86XC4oV0MrKSg/OlxbKC4rKVxdKT8pPy8uc291cmNlLnJlcGxhY2UoIldDIixwdSksVmI9L1wuKFdDKykoPzpcWyguKylcXSk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLHB1KSxIYj1uZXcgUmVnRXhwKCJeIit6YitrYitHYitWYisiJCIpLFdiPVsibWF0ZXJpYWwiLCJtYXRlcmlhbHMiLCJib25lcyIsIm1hcCJdO2NsYXNzIFhie2NvbnN0cnVjdG9yKGUsdCxuKXtjb25zdCBpPW58fG50LnBhcnNlVHJhY2tOYW1lKHQpO3RoaXMuX3RhcmdldEdyb3VwPWUsdGhpcy5fYmluZGluZ3M9ZS5zdWJzY3JpYmVfKHQsaSl9Z2V0VmFsdWUoZSx0KXt0aGlzLmJpbmQoKTtjb25zdCBuPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxpPXRoaXMuX2JpbmRpbmdzW25dO2khPT12b2lkIDAmJmkuZ2V0VmFsdWUoZSx0KX1zZXRWYWx1ZShlLHQpe2NvbnN0IG49dGhpcy5fYmluZGluZ3M7Zm9yKGxldCBpPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxzPW4ubGVuZ3RoO2khPT1zOysraSluW2ldLnNldFZhbHVlKGUsdCl9YmluZCgpe2NvbnN0IGU9dGhpcy5fYmluZGluZ3M7Zm9yKGxldCB0PXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxuPWUubGVuZ3RoO3QhPT1uOysrdCllW3RdLmJpbmQoKX11bmJpbmQoKXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzO2ZvcihsZXQgdD10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sbj1lLmxlbmd0aDt0IT09bjsrK3QpZVt0XS51bmJpbmQoKX19Y2xhc3MgbnR7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMucGF0aD10LHRoaXMucGFyc2VkUGF0aD1ufHxudC5wYXJzZVRyYWNrTmFtZSh0KSx0aGlzLm5vZGU9bnQuZmluZE5vZGUoZSx0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUpLHRoaXMucm9vdE5vZGU9ZSx0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYm91bmQsdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmJvdW5kfXN0YXRpYyBjcmVhdGUoZSx0LG4pe3JldHVybiBlJiZlLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA/bmV3IG50LkNvbXBvc2l0ZShlLHQsbik6bmV3IG50KGUsdCxuKX1zdGF0aWMgc2FuaXRpemVOb2RlTmFtZShlKXtyZXR1cm4gZS5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZShPYiwiIil9c3RhdGljIHBhcnNlVHJhY2tOYW1lKGUpe2NvbnN0IHQ9SGIuZXhlYyhlKTtpZih0PT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoIlByb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogIitlKTtjb25zdCBuPXtub2RlTmFtZTp0WzJdLG9iamVjdE5hbWU6dFszXSxvYmplY3RJbmRleDp0WzRdLHByb3BlcnR5TmFtZTp0WzVdLHByb3BlcnR5SW5kZXg6dFs2XX0saT1uLm5vZGVOYW1lJiZuLm5vZGVOYW1lLmxhc3RJbmRleE9mKCIuIik7aWYoaSE9PXZvaWQgMCYmaSE9PS0xKXtjb25zdCBzPW4ubm9kZU5hbWUuc3Vic3RyaW5nKGkrMSk7V2IuaW5kZXhPZihzKSE9PS0xJiYobi5ub2RlTmFtZT1uLm5vZGVOYW1lLnN1YnN0cmluZygwLGkpLG4ub2JqZWN0TmFtZT1zKX1pZihuLnByb3BlcnR5TmFtZT09PW51bGx8fG4ucHJvcGVydHlOYW1lLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJQcm9wZXJ0eUJpbmRpbmc6IGNhbiBub3QgcGFyc2UgcHJvcGVydHlOYW1lIGZyb20gdHJhY2tOYW1lOiAiK2UpO3JldHVybiBufXN0YXRpYyBmaW5kTm9kZShlLHQpe2lmKHQ9PT12b2lkIDB8fHQ9PT0iInx8dD09PSIuInx8dD09PS0xfHx0PT09ZS5uYW1lfHx0PT09ZS51dWlkKXJldHVybiBlO2lmKGUuc2tlbGV0b24pe2NvbnN0IG49ZS5za2VsZXRvbi5nZXRCb25lQnlOYW1lKHQpO2lmKG4hPT12b2lkIDApcmV0dXJuIG59aWYoZS5jaGlsZHJlbil7Y29uc3Qgbj1mdW5jdGlvbihzKXtmb3IobGV0IGE9MDthPHMubGVuZ3RoO2ErKyl7Y29uc3Qgbz1zW2FdO2lmKG8ubmFtZT09PXR8fG8udXVpZD09PXQpcmV0dXJuIG87Y29uc3QgbD1uKG8uY2hpbGRyZW4pO2lmKGwpcmV0dXJuIGx9cmV0dXJuIG51bGx9LGk9bihlLmNoaWxkcmVuKTtpZihpKXJldHVybiBpfXJldHVybiBudWxsfV9nZXRWYWx1ZV91bmF2YWlsYWJsZSgpe31fc2V0VmFsdWVfdW5hdmFpbGFibGUoKXt9X2dldFZhbHVlX2RpcmVjdChlLHQpe2VbdF09dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdfV9nZXRWYWx1ZV9hcnJheShlLHQpe2NvbnN0IG49dGhpcy5yZXNvbHZlZFByb3BlcnR5O2ZvcihsZXQgaT0wLHM9bi5sZW5ndGg7aSE9PXM7KytpKWVbdCsrXT1uW2ldfV9nZXRWYWx1ZV9hcnJheUVsZW1lbnQoZSx0KXtlW3RdPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdfV9nZXRWYWx1ZV90b0FycmF5KGUsdCl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LnRvQXJyYXkoZSx0KX1fc2V0VmFsdWVfZGlyZWN0KGUsdCl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWVbdF19X3NldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZShlLHQpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1lW3RdLHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZShlLHQpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1lW3RdLHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5KGUsdCl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCBpPTAscz1uLmxlbmd0aDtpIT09czsrK2kpbltpXT1lW3QrK119X3NldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlKGUsdCl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCBpPTAscz1uLmxlbmd0aDtpIT09czsrK2kpbltpXT1lW3QrK107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoZSx0KXtjb25zdCBuPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtmb3IobGV0IGk9MCxzPW4ubGVuZ3RoO2khPT1zOysraSluW2ldPWVbdCsrXTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnQoZSx0KXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1lW3RdfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUoZSx0KXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1lW3RdLHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZShlLHQpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPWVbdF0sdGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfZnJvbUFycmF5KGUsdCl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheShlLHQpfV9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUoZSx0KXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGUsdCksdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKGUsdCl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheShlLHQpLHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X2dldFZhbHVlX3VuYm91bmQoZSx0KXt0aGlzLmJpbmQoKSx0aGlzLmdldFZhbHVlKGUsdCl9X3NldFZhbHVlX3VuYm91bmQoZSx0KXt0aGlzLmJpbmQoKSx0aGlzLnNldFZhbHVlKGUsdCl9YmluZCgpe2xldCBlPXRoaXMubm9kZTtjb25zdCB0PXRoaXMucGFyc2VkUGF0aCxuPXQub2JqZWN0TmFtZSxpPXQucHJvcGVydHlOYW1lO2xldCBzPXQucHJvcGVydHlJbmRleDtpZihlfHwoZT1udC5maW5kTm9kZSh0aGlzLnJvb3ROb2RlLHQubm9kZU5hbWUpLHRoaXMubm9kZT1lKSx0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlLHRoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5hdmFpbGFibGUsIWUpe2NvbnNvbGUud2FybigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBObyB0YXJnZXQgbm9kZSBmb3VuZCBmb3IgdHJhY2s6ICIrdGhpcy5wYXRoKyIuIik7cmV0dXJufWlmKG4pe2xldCBjPXQub2JqZWN0SW5kZXg7c3dpdGNoKG4pe2Nhc2UibWF0ZXJpYWxzIjppZighZS5tYXRlcmlhbCl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuIix0aGlzKTtyZXR1cm59aWYoIWUubWF0ZXJpYWwubWF0ZXJpYWxzKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LiIsdGhpcyk7cmV0dXJufWU9ZS5tYXRlcmlhbC5tYXRlcmlhbHM7YnJlYWs7Y2FzZSJib25lcyI6aWYoIWUuc2tlbGV0b24pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLiIsdGhpcyk7cmV0dXJufWU9ZS5za2VsZXRvbi5ib25lcztmb3IobGV0IGg9MDtoPGUubGVuZ3RoO2grKylpZihlW2hdLm5hbWU9PT1jKXtjPWg7YnJlYWt9YnJlYWs7Y2FzZSJtYXAiOmlmKCJtYXAiaW4gZSl7ZT1lLm1hcDticmVha31pZighZS5tYXRlcmlhbCl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuIix0aGlzKTtyZXR1cm59aWYoIWUubWF0ZXJpYWwubWFwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXAgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWFwLiIsdGhpcyk7cmV0dXJufWU9ZS5tYXRlcmlhbC5tYXA7YnJlYWs7ZGVmYXVsdDppZihlW25dPT09dm9pZCAwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLiIsdGhpcyk7cmV0dXJufWU9ZVtuXX1pZihjIT09dm9pZCAwKXtpZihlW2NdPT09dm9pZCAwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuIix0aGlzLGUpO3JldHVybn1lPWVbY119fWNvbnN0IGE9ZVtpXTtpZihhPT09dm9pZCAwKXtjb25zdCBjPXQubm9kZU5hbWU7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogIitjKyIuIitpKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iLGUpO3JldHVybn1sZXQgbz10aGlzLlZlcnNpb25pbmcuTm9uZTt0aGlzLnRhcmdldE9iamVjdD1lLGUubmVlZHNVcGRhdGUhPT12b2lkIDA/bz10aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU6ZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlIT09dm9pZCAwJiYobz10aGlzLlZlcnNpb25pbmcuTWF0cml4V29ybGROZWVkc1VwZGF0ZSk7bGV0IGw9dGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7aWYocyE9PXZvaWQgMCl7aWYoaT09PSJtb3JwaFRhcmdldEluZmx1ZW5jZXMiKXtpZighZS5nZW9tZXRyeSl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuIix0aGlzKTtyZXR1cm59aWYoIWUuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuIix0aGlzKTtyZXR1cm59ZS5tb3JwaFRhcmdldERpY3Rpb25hcnlbc10hPT12b2lkIDAmJihzPWUubW9ycGhUYXJnZXREaWN0aW9uYXJ5W3NdKX1sPXRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT1hLHRoaXMucHJvcGVydHlJbmRleD1zfWVsc2UgYS5mcm9tQXJyYXkhPT12b2lkIDAmJmEudG9BcnJheSE9PXZvaWQgMD8obD10aGlzLkJpbmRpbmdUeXBlLkhhc0Zyb21Ub0FycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT1hKTpBcnJheS5pc0FycmF5KGEpPyhsPXRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXksdGhpcy5yZXNvbHZlZFByb3BlcnR5PWEpOnRoaXMucHJvcGVydHlOYW1lPWk7dGhpcy5nZXRWYWx1ZT10aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbbF0sdGhpcy5zZXRWYWx1ZT10aGlzLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nW2xdW29dfXVuYmluZCgpe3RoaXMubm9kZT1udWxsLHRoaXMuZ2V0VmFsdWU9dGhpcy5fZ2V0VmFsdWVfdW5ib3VuZCx0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYm91bmR9fW50LkNvbXBvc2l0ZT1YYixudC5wcm90b3R5cGUuQmluZGluZ1R5cGU9e0RpcmVjdDowLEVudGlyZUFycmF5OjEsQXJyYXlFbGVtZW50OjIsSGFzRnJvbVRvQXJyYXk6M30sbnQucHJvdG90eXBlLlZlcnNpb25pbmc9e05vbmU6MCxOZWVkc1VwZGF0ZToxLE1hdHJpeFdvcmxkTmVlZHNVcGRhdGU6Mn0sbnQucHJvdG90eXBlLkdldHRlckJ5QmluZGluZ1R5cGU9W250LnByb3RvdHlwZS5fZ2V0VmFsdWVfZGlyZWN0LG50LnByb3RvdHlwZS5fZ2V0VmFsdWVfYXJyYXksbnQucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheUVsZW1lbnQsbnQucHJvdG90eXBlLl9nZXRWYWx1ZV90b0FycmF5XSxudC5wcm90b3R5cGUuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc9W1tudC5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdCxudC5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSxudC5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlXSxbbnQucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheSxudC5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlLG50LnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZV0sW250LnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50LG50LnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlLG50LnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdLFtudC5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheSxudC5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSxudC5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlXV07Y2xhc3MgcWJ7Y29uc3RydWN0b3IoKXt0aGlzLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA9ITAsdGhpcy51dWlkPV9uKCksdGhpcy5fb2JqZWN0cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLHRoaXMubkNhY2hlZE9iamVjdHNfPTA7Y29uc3QgZT17fTt0aGlzLl9pbmRpY2VzQnlVVUlEPWU7Zm9yKGxldCBuPTAsaT1hcmd1bWVudHMubGVuZ3RoO24hPT1pOysrbillW2FyZ3VtZW50c1tuXS51dWlkXT1uO3RoaXMuX3BhdGhzPVtdLHRoaXMuX3BhcnNlZFBhdGhzPVtdLHRoaXMuX2JpbmRpbmdzPVtdLHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aD17fTtjb25zdCB0PXRoaXM7dGhpcy5zdGF0cz17b2JqZWN0czp7Z2V0IHRvdGFsKCl7cmV0dXJuIHQuX29iamVjdHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdGhpcy50b3RhbC10Lm5DYWNoZWRPYmplY3RzX319LGdldCBiaW5kaW5nc1Blck9iamVjdCgpe3JldHVybiB0Ll9iaW5kaW5ncy5sZW5ndGh9fX1hZGQoKXtjb25zdCBlPXRoaXMuX29iamVjdHMsdD10aGlzLl9pbmRpY2VzQnlVVUlELG49dGhpcy5fcGF0aHMsaT10aGlzLl9wYXJzZWRQYXRocyxzPXRoaXMuX2JpbmRpbmdzLGE9cy5sZW5ndGg7bGV0IG8sbD1lLmxlbmd0aCxjPXRoaXMubkNhY2hlZE9iamVjdHNfO2ZvcihsZXQgaD0wLHU9YXJndW1lbnRzLmxlbmd0aDtoIT09dTsrK2gpe2NvbnN0IGY9YXJndW1lbnRzW2hdLGQ9Zi51dWlkO2xldCBwPXRbZF07aWYocD09PXZvaWQgMCl7cD1sKyssdFtkXT1wLGUucHVzaChmKTtmb3IobGV0IF89MCxnPWE7XyE9PWc7KytfKXNbX10ucHVzaChuZXcgbnQoZixuW19dLGlbX10pKX1lbHNlIGlmKHA8Yyl7bz1lW3BdO2NvbnN0IF89LS1jLGc9ZVtfXTt0W2cudXVpZF09cCxlW3BdPWcsdFtkXT1fLGVbX109Zjtmb3IobGV0IG09MCx5PWE7bSE9PXk7KyttKXtjb25zdCB4PXNbbV0sdj14W19dO2xldCBTPXhbcF07eFtwXT12LFM9PT12b2lkIDAmJihTPW5ldyBudChmLG5bbV0saVttXSkpLHhbX109U319ZWxzZSBlW3BdIT09byYmY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCBkZXRlY3RlZC4gQ2xlYW4gdGhlIGNhY2hlcyBvciByZWNyZWF0ZSB5b3VyIGluZnJhc3RydWN0dXJlIHdoZW4gcmVsb2FkaW5nIHNjZW5lcy4iKX10aGlzLm5DYWNoZWRPYmplY3RzXz1jfXJlbW92ZSgpe2NvbnN0IGU9dGhpcy5fb2JqZWN0cyx0PXRoaXMuX2luZGljZXNCeVVVSUQsbj10aGlzLl9iaW5kaW5ncyxpPW4ubGVuZ3RoO2xldCBzPXRoaXMubkNhY2hlZE9iamVjdHNfO2ZvcihsZXQgYT0wLG89YXJndW1lbnRzLmxlbmd0aDthIT09bzsrK2Epe2NvbnN0IGw9YXJndW1lbnRzW2FdLGM9bC51dWlkLGg9dFtjXTtpZihoIT09dm9pZCAwJiZoPj1zKXtjb25zdCB1PXMrKyxmPWVbdV07dFtmLnV1aWRdPWgsZVtoXT1mLHRbY109dSxlW3VdPWw7Zm9yKGxldCBkPTAscD1pO2QhPT1wOysrZCl7Y29uc3QgXz1uW2RdLGc9X1t1XSxtPV9baF07X1toXT1nLF9bdV09bX19fXRoaXMubkNhY2hlZE9iamVjdHNfPXN9dW5jYWNoZSgpe2NvbnN0IGU9dGhpcy5fb2JqZWN0cyx0PXRoaXMuX2luZGljZXNCeVVVSUQsbj10aGlzLl9iaW5kaW5ncyxpPW4ubGVuZ3RoO2xldCBzPXRoaXMubkNhY2hlZE9iamVjdHNfLGE9ZS5sZW5ndGg7Zm9yKGxldCBvPTAsbD1hcmd1bWVudHMubGVuZ3RoO28hPT1sOysrbyl7Y29uc3QgYz1hcmd1bWVudHNbb10saD1jLnV1aWQsdT10W2hdO2lmKHUhPT12b2lkIDApaWYoZGVsZXRlIHRbaF0sdTxzKXtjb25zdCBmPS0tcyxkPWVbZl0scD0tLWEsXz1lW3BdO3RbZC51dWlkXT11LGVbdV09ZCx0W18udXVpZF09ZixlW2ZdPV8sZS5wb3AoKTtmb3IobGV0IGc9MCxtPWk7ZyE9PW07KytnKXtjb25zdCB5PW5bZ10seD15W2ZdLHY9eVtwXTt5W3VdPXgseVtmXT12LHkucG9wKCl9fWVsc2V7Y29uc3QgZj0tLWEsZD1lW2ZdO2Y+MCYmKHRbZC51dWlkXT11KSxlW3VdPWQsZS5wb3AoKTtmb3IobGV0IHA9MCxfPWk7cCE9PV87KytwKXtjb25zdCBnPW5bcF07Z1t1XT1nW2ZdLGcucG9wKCl9fX10aGlzLm5DYWNoZWRPYmplY3RzXz1zfXN1YnNjcmliZV8oZSx0KXtjb25zdCBuPXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aDtsZXQgaT1uW2VdO2NvbnN0IHM9dGhpcy5fYmluZGluZ3M7aWYoaSE9PXZvaWQgMClyZXR1cm4gc1tpXTtjb25zdCBhPXRoaXMuX3BhdGhzLG89dGhpcy5fcGFyc2VkUGF0aHMsbD10aGlzLl9vYmplY3RzLGM9bC5sZW5ndGgsaD10aGlzLm5DYWNoZWRPYmplY3RzXyx1PW5ldyBBcnJheShjKTtpPXMubGVuZ3RoLG5bZV09aSxhLnB1c2goZSksby5wdXNoKHQpLHMucHVzaCh1KTtmb3IobGV0IGY9aCxkPWwubGVuZ3RoO2YhPT1kOysrZil7Y29uc3QgcD1sW2ZdO3VbZl09bmV3IG50KHAsZSx0KX1yZXR1cm4gdX11bnN1YnNjcmliZV8oZSl7Y29uc3QgdD10aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsbj10W2VdO2lmKG4hPT12b2lkIDApe2NvbnN0IGk9dGhpcy5fcGF0aHMscz10aGlzLl9wYXJzZWRQYXRocyxhPXRoaXMuX2JpbmRpbmdzLG89YS5sZW5ndGgtMSxsPWFbb10sYz1lW29dO3RbY109bixhW25dPWwsYS5wb3AoKSxzW25dPXNbb10scy5wb3AoKSxpW25dPWlbb10saS5wb3AoKX19fWNsYXNzIHRne2NvbnN0cnVjdG9yKGUsdCxuPW51bGwsaT10LmJsZW5kTW9kZSl7dGhpcy5fbWl4ZXI9ZSx0aGlzLl9jbGlwPXQsdGhpcy5fbG9jYWxSb290PW4sdGhpcy5ibGVuZE1vZGU9aTtjb25zdCBzPXQudHJhY2tzLGE9cy5sZW5ndGgsbz1uZXcgQXJyYXkoYSksbD17ZW5kaW5nU3RhcnQ6a2ksZW5kaW5nRW5kOmtpfTtmb3IobGV0IGM9MDtjIT09YTsrK2Mpe2NvbnN0IGg9c1tjXS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTtvW2NdPWgsaC5zZXR0aW5ncz1sfXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9bCx0aGlzLl9pbnRlcnBvbGFudHM9byx0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPW5ldyBBcnJheShhKSx0aGlzLl9jYWNoZUluZGV4PW51bGwsdGhpcy5fYnlDbGlwQ2FjaGVJbmRleD1udWxsLHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PW51bGwsdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLmxvb3A9dWQsdGhpcy5fbG9vcENvdW50PS0xLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMudGltZT0wLHRoaXMudGltZVNjYWxlPTEsdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPTEsdGhpcy53ZWlnaHQ9MSx0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9MSx0aGlzLnJlcGV0aXRpb25zPTEvMCx0aGlzLnBhdXNlZD0hMSx0aGlzLmVuYWJsZWQ9ITAsdGhpcy5jbGFtcFdoZW5GaW5pc2hlZD0hMSx0aGlzLnplcm9TbG9wZUF0U3RhcnQ9ITAsdGhpcy56ZXJvU2xvcGVBdEVuZD0hMH1wbGF5KCl7cmV0dXJuIHRoaXMuX21peGVyLl9hY3RpdmF0ZUFjdGlvbih0aGlzKSx0aGlzfXN0b3AoKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24odGhpcyksdGhpcy5yZXNldCgpfXJlc2V0KCl7cmV0dXJuIHRoaXMucGF1c2VkPSExLHRoaXMuZW5hYmxlZD0hMCx0aGlzLnRpbWU9MCx0aGlzLl9sb29wQ291bnQ9LTEsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKX1pc1J1bm5pbmcoKXtyZXR1cm4gdGhpcy5lbmFibGVkJiYhdGhpcy5wYXVzZWQmJnRoaXMudGltZVNjYWxlIT09MCYmdGhpcy5fc3RhcnRUaW1lPT09bnVsbCYmdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfWlzU2NoZWR1bGVkKCl7cmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKX1zdGFydEF0KGUpe3JldHVybiB0aGlzLl9zdGFydFRpbWU9ZSx0aGlzfXNldExvb3AoZSx0KXtyZXR1cm4gdGhpcy5sb29wPWUsdGhpcy5yZXBldGl0aW9ucz10LHRoaXN9c2V0RWZmZWN0aXZlV2VpZ2h0KGUpe3JldHVybiB0aGlzLndlaWdodD1lLHRoaXMuX2VmZmVjdGl2ZVdlaWdodD10aGlzLmVuYWJsZWQ/ZTowLHRoaXMuc3RvcEZhZGluZygpfWdldEVmZmVjdGl2ZVdlaWdodCgpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHR9ZmFkZUluKGUpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyhlLDAsMSl9ZmFkZU91dChlKXtyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoZSwxLDApfWNyb3NzRmFkZUZyb20oZSx0LG4pe2lmKGUuZmFkZU91dCh0KSx0aGlzLmZhZGVJbih0KSxuKXtjb25zdCBpPXRoaXMuX2NsaXAuZHVyYXRpb24scz1lLl9jbGlwLmR1cmF0aW9uLGE9cy9pLG89aS9zO2Uud2FycCgxLGEsdCksdGhpcy53YXJwKG8sMSx0KX1yZXR1cm4gdGhpc31jcm9zc0ZhZGVUbyhlLHQsbil7cmV0dXJuIGUuY3Jvc3NGYWRlRnJvbSh0aGlzLHQsbil9c3RvcEZhZGluZygpe2NvbnN0IGU9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7cmV0dXJuIGUhPT1udWxsJiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoZSkpLHRoaXN9c2V0RWZmZWN0aXZlVGltZVNjYWxlKGUpe3JldHVybiB0aGlzLnRpbWVTY2FsZT1lLHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10aGlzLnBhdXNlZD8wOmUsdGhpcy5zdG9wV2FycGluZygpfWdldEVmZmVjdGl2ZVRpbWVTY2FsZSgpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGV9c2V0RHVyYXRpb24oZSl7cmV0dXJuIHRoaXMudGltZVNjYWxlPXRoaXMuX2NsaXAuZHVyYXRpb24vZSx0aGlzLnN0b3BXYXJwaW5nKCl9c3luY1dpdGgoZSl7cmV0dXJuIHRoaXMudGltZT1lLnRpbWUsdGhpcy50aW1lU2NhbGU9ZS50aW1lU2NhbGUsdGhpcy5zdG9wV2FycGluZygpfWhhbHQoZSl7cmV0dXJuIHRoaXMud2FycCh0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsMCxlKX13YXJwKGUsdCxuKXtjb25zdCBpPXRoaXMuX21peGVyLHM9aS50aW1lLGE9dGhpcy50aW1lU2NhbGU7bGV0IG89dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7bz09PW51bGwmJihvPWkuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSx0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1vKTtjb25zdCBsPW8ucGFyYW1ldGVyUG9zaXRpb25zLGM9by5zYW1wbGVWYWx1ZXM7cmV0dXJuIGxbMF09cyxsWzFdPXMrbixjWzBdPWUvYSxjWzFdPXQvYSx0aGlzfXN0b3BXYXJwaW5nKCl7Y29uc3QgZT10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtyZXR1cm4gZSE9PW51bGwmJih0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1udWxsLHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudChlKSksdGhpc31nZXRNaXhlcigpe3JldHVybiB0aGlzLl9taXhlcn1nZXRDbGlwKCl7cmV0dXJuIHRoaXMuX2NsaXB9Z2V0Um9vdCgpe3JldHVybiB0aGlzLl9sb2NhbFJvb3R8fHRoaXMuX21peGVyLl9yb290fV91cGRhdGUoZSx0LG4saSl7aWYoIXRoaXMuZW5hYmxlZCl7dGhpcy5fdXBkYXRlV2VpZ2h0KGUpO3JldHVybn1jb25zdCBzPXRoaXMuX3N0YXJ0VGltZTtpZihzIT09bnVsbCl7Y29uc3QgbD0oZS1zKSpuO2w8MHx8bj09PTA/dD0wOih0aGlzLl9zdGFydFRpbWU9bnVsbCx0PW4qbCl9dCo9dGhpcy5fdXBkYXRlVGltZVNjYWxlKGUpO2NvbnN0IGE9dGhpcy5fdXBkYXRlVGltZSh0KSxvPXRoaXMuX3VwZGF0ZVdlaWdodChlKTtpZihvPjApe2NvbnN0IGw9dGhpcy5faW50ZXJwb2xhbnRzLGM9dGhpcy5fcHJvcGVydHlCaW5kaW5ncztzd2l0Y2godGhpcy5ibGVuZE1vZGUpe2Nhc2UgWWM6Zm9yKGxldCBoPTAsdT1sLmxlbmd0aDtoIT09dTsrK2gpbFtoXS5ldmFsdWF0ZShhKSxjW2hdLmFjY3VtdWxhdGVBZGRpdGl2ZShvKTticmVhaztjYXNlIFhhOmRlZmF1bHQ6Zm9yKGxldCBoPTAsdT1sLmxlbmd0aDtoIT09dTsrK2gpbFtoXS5ldmFsdWF0ZShhKSxjW2hdLmFjY3VtdWxhdGUoaSxvKX19fV91cGRhdGVXZWlnaHQoZSl7bGV0IHQ9MDtpZih0aGlzLmVuYWJsZWQpe3Q9dGhpcy53ZWlnaHQ7Y29uc3Qgbj10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtpZihuIT09bnVsbCl7Y29uc3QgaT1uLmV2YWx1YXRlKGUpWzBdO3QqPWksZT5uLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcEZhZGluZygpLGk9PT0wJiYodGhpcy5lbmFibGVkPSExKSl9fXJldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dCx0fV91cGRhdGVUaW1lU2NhbGUoZSl7bGV0IHQ9MDtpZighdGhpcy5wYXVzZWQpe3Q9dGhpcy50aW1lU2NhbGU7Y29uc3Qgbj10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtpZihuIT09bnVsbCl7Y29uc3QgaT1uLmV2YWx1YXRlKGUpWzBdO3QqPWksZT5uLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcFdhcnBpbmcoKSx0PT09MD90aGlzLnBhdXNlZD0hMDp0aGlzLnRpbWVTY2FsZT10KX19cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10LHR9X3VwZGF0ZVRpbWUoZSl7Y29uc3QgdD10aGlzLl9jbGlwLmR1cmF0aW9uLG49dGhpcy5sb29wO2xldCBpPXRoaXMudGltZStlLHM9dGhpcy5fbG9vcENvdW50O2NvbnN0IGE9bj09PWZkO2lmKGU9PT0wKXJldHVybiBzPT09LTE/aTphJiYocyYxKT09PTE/dC1pOmk7aWYobj09PWhkKXtzPT09LTEmJih0aGlzLl9sb29wQ291bnQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLCEwLCExKSk7ZTp7aWYoaT49dClpPXQ7ZWxzZSBpZihpPDApaT0wO2Vsc2V7dGhpcy50aW1lPWk7YnJlYWsgZX10aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMSx0aGlzLnRpbWU9aSx0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsYWN0aW9uOnRoaXMsZGlyZWN0aW9uOmU8MD8tMToxfSl9fWVsc2V7aWYocz09PS0xJiYoZT49MD8ocz0wLHRoaXMuX3NldEVuZGluZ3MoITAsdGhpcy5yZXBldGl0aW9ucz09PTAsYSkpOnRoaXMuX3NldEVuZGluZ3ModGhpcy5yZXBldGl0aW9ucz09PTAsITAsYSkpLGk+PXR8fGk8MCl7Y29uc3Qgbz1NYXRoLmZsb29yKGkvdCk7aS09dCpvLHMrPU1hdGguYWJzKG8pO2NvbnN0IGw9dGhpcy5yZXBldGl0aW9ucy1zO2lmKGw8PTApdGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITEsaT1lPjA/dDowLHRoaXMudGltZT1pLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246ZT4wPzE6LTF9KTtlbHNle2lmKGw9PT0xKXtjb25zdCBjPWU8MDt0aGlzLl9zZXRFbmRpbmdzKGMsIWMsYSl9ZWxzZSB0aGlzLl9zZXRFbmRpbmdzKCExLCExLGEpO3RoaXMuX2xvb3BDb3VudD1zLHRoaXMudGltZT1pLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6Imxvb3AiLGFjdGlvbjp0aGlzLGxvb3BEZWx0YTpvfSl9fWVsc2UgdGhpcy50aW1lPWk7aWYoYSYmKHMmMSk9PT0xKXJldHVybiB0LWl9cmV0dXJuIGl9X3NldEVuZGluZ3MoZSx0LG4pe2NvbnN0IGk9dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncztuPyhpLmVuZGluZ1N0YXJ0PUdpLGkuZW5kaW5nRW5kPUdpKTooZT9pLmVuZGluZ1N0YXJ0PXRoaXMuemVyb1Nsb3BlQXRTdGFydD9HaTpraTppLmVuZGluZ1N0YXJ0PVBzLHQ/aS5lbmRpbmdFbmQ9dGhpcy56ZXJvU2xvcGVBdEVuZD9HaTpraTppLmVuZGluZ0VuZD1Qcyl9X3NjaGVkdWxlRmFkaW5nKGUsdCxuKXtjb25zdCBpPXRoaXMuX21peGVyLHM9aS50aW1lO2xldCBhPXRoaXMuX3dlaWdodEludGVycG9sYW50O2E9PT1udWxsJiYoYT1pLl9sZW5kQ29udHJvbEludGVycG9sYW50KCksdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9YSk7Y29uc3Qgbz1hLnBhcmFtZXRlclBvc2l0aW9ucyxsPWEuc2FtcGxlVmFsdWVzO3JldHVybiBvWzBdPXMsbFswXT10LG9bMV09cytlLGxbMV09bix0aGlzfX1jb25zdCAkYj1uZXcgRmxvYXQzMkFycmF5KDEpO2NsYXNzIFliIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLl9yb290PWUsdGhpcy5faW5pdE1lbW9yeU1hbmFnZXIoKSx0aGlzLl9hY2N1SW5kZXg9MCx0aGlzLnRpbWU9MCx0aGlzLnRpbWVTY2FsZT0xfV9iaW5kQWN0aW9uKGUsdCl7Y29uc3Qgbj1lLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QsaT1lLl9jbGlwLnRyYWNrcyxzPWkubGVuZ3RoLGE9ZS5fcHJvcGVydHlCaW5kaW5ncyxvPWUuX2ludGVycG9sYW50cyxsPW4udXVpZCxjPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZTtsZXQgaD1jW2xdO2g9PT12b2lkIDAmJihoPXt9LGNbbF09aCk7Zm9yKGxldCB1PTA7dSE9PXM7Kyt1KXtjb25zdCBmPWlbdV0sZD1mLm5hbWU7bGV0IHA9aFtkXTtpZihwIT09dm9pZCAwKSsrcC5yZWZlcmVuY2VDb3VudCxhW3VdPXA7ZWxzZXtpZihwPWFbdV0scCE9PXZvaWQgMCl7cC5fY2FjaGVJbmRleD09PW51bGwmJigrK3AucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKHAsbCxkKSk7Y29udGludWV9Y29uc3QgXz10JiZ0Ll9wcm9wZXJ0eUJpbmRpbmdzW3VdLmJpbmRpbmcucGFyc2VkUGF0aDtwPW5ldyBlZyhudC5jcmVhdGUobixkLF8pLGYuVmFsdWVUeXBlTmFtZSxmLmdldFZhbHVlU2l6ZSgpKSwrK3AucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKHAsbCxkKSxhW3VdPXB9b1t1XS5yZXN1bHRCdWZmZXI9cC5idWZmZXJ9fV9hY3RpdmF0ZUFjdGlvbihlKXtpZighdGhpcy5faXNBY3RpdmVBY3Rpb24oZSkpe2lmKGUuX2NhY2hlSW5kZXg9PT1udWxsKXtjb25zdCBuPShlLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QpLnV1aWQsaT1lLl9jbGlwLnV1aWQscz10aGlzLl9hY3Rpb25zQnlDbGlwW2ldO3RoaXMuX2JpbmRBY3Rpb24oZSxzJiZzLmtub3duQWN0aW9uc1swXSksdGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24oZSxpLG4pfWNvbnN0IHQ9ZS5fcHJvcGVydHlCaW5kaW5ncztmb3IobGV0IG49MCxpPXQubGVuZ3RoO24hPT1pOysrbil7Y29uc3Qgcz10W25dO3MudXNlQ291bnQrKz09PTAmJih0aGlzLl9sZW5kQmluZGluZyhzKSxzLnNhdmVPcmlnaW5hbFN0YXRlKCkpfXRoaXMuX2xlbmRBY3Rpb24oZSl9fV9kZWFjdGl2YXRlQWN0aW9uKGUpe2lmKHRoaXMuX2lzQWN0aXZlQWN0aW9uKGUpKXtjb25zdCB0PWUuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuIT09aTsrK24pe2NvbnN0IHM9dFtuXTstLXMudXNlQ291bnQ9PT0wJiYocy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpLHRoaXMuX3Rha2VCYWNrQmluZGluZyhzKSl9dGhpcy5fdGFrZUJhY2tBY3Rpb24oZSl9fV9pbml0TWVtb3J5TWFuYWdlcigpe3RoaXMuX2FjdGlvbnM9W10sdGhpcy5fbkFjdGl2ZUFjdGlvbnM9MCx0aGlzLl9hY3Rpb25zQnlDbGlwPXt9LHRoaXMuX2JpbmRpbmdzPVtdLHRoaXMuX25BY3RpdmVCaW5kaW5ncz0wLHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZT17fSx0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzPVtdLHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzPTA7Y29uc3QgZT10aGlzO3RoaXMuc3RhdHM9e2FjdGlvbnM6e2dldCB0b3RhbCgpe3JldHVybiBlLl9hY3Rpb25zLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIGUuX25BY3RpdmVBY3Rpb25zfX0sYmluZGluZ3M6e2dldCB0b3RhbCgpe3JldHVybiBlLl9iaW5kaW5ncy5sZW5ndGh9LGdldCBpblVzZSgpe3JldHVybiBlLl9uQWN0aXZlQmluZGluZ3N9fSxjb250cm9sSW50ZXJwb2xhbnRzOntnZXQgdG90YWwoKXtyZXR1cm4gZS5fY29udHJvbEludGVycG9sYW50cy5sZW5ndGh9LGdldCBpblVzZSgpe3JldHVybiBlLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50c319fX1faXNBY3RpdmVBY3Rpb24oZSl7Y29uc3QgdD1lLl9jYWNoZUluZGV4O3JldHVybiB0IT09bnVsbCYmdDx0aGlzLl9uQWN0aXZlQWN0aW9uc31fYWRkSW5hY3RpdmVBY3Rpb24oZSx0LG4pe2NvbnN0IGk9dGhpcy5fYWN0aW9ucyxzPXRoaXMuX2FjdGlvbnNCeUNsaXA7bGV0IGE9c1t0XTtpZihhPT09dm9pZCAwKWE9e2tub3duQWN0aW9uczpbZV0sYWN0aW9uQnlSb290Ont9fSxlLl9ieUNsaXBDYWNoZUluZGV4PTAsc1t0XT1hO2Vsc2V7Y29uc3Qgbz1hLmtub3duQWN0aW9ucztlLl9ieUNsaXBDYWNoZUluZGV4PW8ubGVuZ3RoLG8ucHVzaChlKX1lLl9jYWNoZUluZGV4PWkubGVuZ3RoLGkucHVzaChlKSxhLmFjdGlvbkJ5Um9vdFtuXT1lfV9yZW1vdmVJbmFjdGl2ZUFjdGlvbihlKXtjb25zdCB0PXRoaXMuX2FjdGlvbnMsbj10W3QubGVuZ3RoLTFdLGk9ZS5fY2FjaGVJbmRleDtuLl9jYWNoZUluZGV4PWksdFtpXT1uLHQucG9wKCksZS5fY2FjaGVJbmRleD1udWxsO2NvbnN0IHM9ZS5fY2xpcC51dWlkLGE9dGhpcy5fYWN0aW9uc0J5Q2xpcCxvPWFbc10sbD1vLmtub3duQWN0aW9ucyxjPWxbbC5sZW5ndGgtMV0saD1lLl9ieUNsaXBDYWNoZUluZGV4O2MuX2J5Q2xpcENhY2hlSW5kZXg9aCxsW2hdPWMsbC5wb3AoKSxlLl9ieUNsaXBDYWNoZUluZGV4PW51bGw7Y29uc3QgdT1vLmFjdGlvbkJ5Um9vdCxmPShlLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QpLnV1aWQ7ZGVsZXRlIHVbZl0sbC5sZW5ndGg9PT0wJiZkZWxldGUgYVtzXSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKGUpfV9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKGUpe2NvbnN0IHQ9ZS5fcHJvcGVydHlCaW5kaW5ncztmb3IobGV0IG49MCxpPXQubGVuZ3RoO24hPT1pOysrbil7Y29uc3Qgcz10W25dOy0tcy5yZWZlcmVuY2VDb3VudD09PTAmJnRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyhzKX19X2xlbmRBY3Rpb24oZSl7Y29uc3QgdD10aGlzLl9hY3Rpb25zLG49ZS5fY2FjaGVJbmRleCxpPXRoaXMuX25BY3RpdmVBY3Rpb25zKysscz10W2ldO2UuX2NhY2hlSW5kZXg9aSx0W2ldPWUscy5fY2FjaGVJbmRleD1uLHRbbl09c31fdGFrZUJhY2tBY3Rpb24oZSl7Y29uc3QgdD10aGlzLl9hY3Rpb25zLG49ZS5fY2FjaGVJbmRleCxpPS0tdGhpcy5fbkFjdGl2ZUFjdGlvbnMscz10W2ldO2UuX2NhY2hlSW5kZXg9aSx0W2ldPWUscy5fY2FjaGVJbmRleD1uLHRbbl09c31fYWRkSW5hY3RpdmVCaW5kaW5nKGUsdCxuKXtjb25zdCBpPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxzPXRoaXMuX2JpbmRpbmdzO2xldCBhPWlbdF07YT09PXZvaWQgMCYmKGE9e30saVt0XT1hKSxhW25dPWUsZS5fY2FjaGVJbmRleD1zLmxlbmd0aCxzLnB1c2goZSl9X3JlbW92ZUluYWN0aXZlQmluZGluZyhlKXtjb25zdCB0PXRoaXMuX2JpbmRpbmdzLG49ZS5iaW5kaW5nLGk9bi5yb290Tm9kZS51dWlkLHM9bi5wYXRoLGE9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLG89YVtpXSxsPXRbdC5sZW5ndGgtMV0sYz1lLl9jYWNoZUluZGV4O2wuX2NhY2hlSW5kZXg9Yyx0W2NdPWwsdC5wb3AoKSxkZWxldGUgb1tzXSxPYmplY3Qua2V5cyhvKS5sZW5ndGg9PT0wJiZkZWxldGUgYVtpXX1fbGVuZEJpbmRpbmcoZSl7Y29uc3QgdD10aGlzLl9iaW5kaW5ncyxuPWUuX2NhY2hlSW5kZXgsaT10aGlzLl9uQWN0aXZlQmluZGluZ3MrKyxzPXRbaV07ZS5fY2FjaGVJbmRleD1pLHRbaV09ZSxzLl9jYWNoZUluZGV4PW4sdFtuXT1zfV90YWtlQmFja0JpbmRpbmcoZSl7Y29uc3QgdD10aGlzLl9iaW5kaW5ncyxuPWUuX2NhY2hlSW5kZXgsaT0tLXRoaXMuX25BY3RpdmVCaW5kaW5ncyxzPXRbaV07ZS5fY2FjaGVJbmRleD1pLHRbaV09ZSxzLl9jYWNoZUluZGV4PW4sdFtuXT1zfV9sZW5kQ29udHJvbEludGVycG9sYW50KCl7Y29uc3QgZT10aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLHQ9dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMrKztsZXQgbj1lW3RdO3JldHVybiBuPT09dm9pZCAwJiYobj1uZXcgc3UobmV3IEZsb2F0MzJBcnJheSgyKSxuZXcgRmxvYXQzMkFycmF5KDIpLDEsJGIpLG4uX19jYWNoZUluZGV4PXQsZVt0XT1uKSxufV90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudChlKXtjb25zdCB0PXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsbj1lLl9fY2FjaGVJbmRleCxpPS0tdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMscz10W2ldO2UuX19jYWNoZUluZGV4PWksdFtpXT1lLHMuX19jYWNoZUluZGV4PW4sdFtuXT1zfWNsaXBBY3Rpb24oZSx0LG4pe2NvbnN0IGk9dHx8dGhpcy5fcm9vdCxzPWkudXVpZDtsZXQgYT10eXBlb2YgZT09InN0cmluZyI/ZGEuZmluZEJ5TmFtZShpLGUpOmU7Y29uc3Qgbz1hIT09bnVsbD9hLnV1aWQ6ZSxsPXRoaXMuX2FjdGlvbnNCeUNsaXBbb107bGV0IGM9bnVsbDtpZihuPT09dm9pZCAwJiYoYSE9PW51bGw/bj1hLmJsZW5kTW9kZTpuPVhhKSxsIT09dm9pZCAwKXtjb25zdCB1PWwuYWN0aW9uQnlSb290W3NdO2lmKHUhPT12b2lkIDAmJnUuYmxlbmRNb2RlPT09bilyZXR1cm4gdTtjPWwua25vd25BY3Rpb25zWzBdLGE9PT1udWxsJiYoYT1jLl9jbGlwKX1pZihhPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdCBoPW5ldyB0Zyh0aGlzLGEsdCxuKTtyZXR1cm4gdGhpcy5fYmluZEFjdGlvbihoLGMpLHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGgsbyxzKSxofWV4aXN0aW5nQWN0aW9uKGUsdCl7Y29uc3Qgbj10fHx0aGlzLl9yb290LGk9bi51dWlkLHM9dHlwZW9mIGU9PSJzdHJpbmciP2RhLmZpbmRCeU5hbWUobixlKTplLGE9cz9zLnV1aWQ6ZSxvPXRoaXMuX2FjdGlvbnNCeUNsaXBbYV07cmV0dXJuIG8hPT12b2lkIDAmJm8uYWN0aW9uQnlSb290W2ldfHxudWxsfXN0b3BBbGxBY3Rpb24oKXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsdD10aGlzLl9uQWN0aXZlQWN0aW9ucztmb3IobGV0IG49dC0xO24+PTA7LS1uKWVbbl0uc3RvcCgpO3JldHVybiB0aGlzfXVwZGF0ZShlKXtlKj10aGlzLnRpbWVTY2FsZTtjb25zdCB0PXRoaXMuX2FjdGlvbnMsbj10aGlzLl9uQWN0aXZlQWN0aW9ucyxpPXRoaXMudGltZSs9ZSxzPU1hdGguc2lnbihlKSxhPXRoaXMuX2FjY3VJbmRleF49MTtmb3IobGV0IGM9MDtjIT09bjsrK2MpdFtjXS5fdXBkYXRlKGksZSxzLGEpO2NvbnN0IG89dGhpcy5fYmluZGluZ3MsbD10aGlzLl9uQWN0aXZlQmluZGluZ3M7Zm9yKGxldCBjPTA7YyE9PWw7KytjKW9bY10uYXBwbHkoYSk7cmV0dXJuIHRoaXN9c2V0VGltZShlKXt0aGlzLnRpbWU9MDtmb3IobGV0IHQ9MDt0PHRoaXMuX2FjdGlvbnMubGVuZ3RoO3QrKyl0aGlzLl9hY3Rpb25zW3RdLnRpbWU9MDtyZXR1cm4gdGhpcy51cGRhdGUoZSl9Z2V0Um9vdCgpe3JldHVybiB0aGlzLl9yb290fXVuY2FjaGVDbGlwKGUpe2NvbnN0IHQ9dGhpcy5fYWN0aW9ucyxuPWUudXVpZCxpPXRoaXMuX2FjdGlvbnNCeUNsaXAscz1pW25dO2lmKHMhPT12b2lkIDApe2NvbnN0IGE9cy5rbm93bkFjdGlvbnM7Zm9yKGxldCBvPTAsbD1hLmxlbmd0aDtvIT09bDsrK28pe2NvbnN0IGM9YVtvXTt0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGMpO2NvbnN0IGg9Yy5fY2FjaGVJbmRleCx1PXRbdC5sZW5ndGgtMV07Yy5fY2FjaGVJbmRleD1udWxsLGMuX2J5Q2xpcENhY2hlSW5kZXg9bnVsbCx1Ll9jYWNoZUluZGV4PWgsdFtoXT11LHQucG9wKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbihjKX1kZWxldGUgaVtuXX19dW5jYWNoZVJvb3QoZSl7Y29uc3QgdD1lLnV1aWQsbj10aGlzLl9hY3Rpb25zQnlDbGlwO2Zvcihjb25zdCBhIGluIG4pe2NvbnN0IG89blthXS5hY3Rpb25CeVJvb3QsbD1vW3RdO2whPT12b2lkIDAmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGwpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGwpKX1jb25zdCBpPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxzPWlbdF07aWYocyE9PXZvaWQgMClmb3IoY29uc3QgYSBpbiBzKXtjb25zdCBvPXNbYV07by5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyhvKX19dW5jYWNoZUFjdGlvbihlLHQpe2NvbnN0IG49dGhpcy5leGlzdGluZ0FjdGlvbihlLHQpO24hPT1udWxsJiYodGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihuKSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbihuKSl9fWNsYXNzIG11e2NvbnN0cnVjdG9yKGUpe3RoaXMudmFsdWU9ZX1jbG9uZSgpe3JldHVybiBuZXcgbXUodGhpcy52YWx1ZS5jbG9uZT09PXZvaWQgMD90aGlzLnZhbHVlOnRoaXMudmFsdWUuY2xvbmUoKSl9fWxldCBaYj0wO2NsYXNzIEpiIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNVbmlmb3Jtc0dyb3VwPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlpiKyt9KSx0aGlzLm5hbWU9IiIsdGhpcy51c2FnZT1Ocyx0aGlzLnVuaWZvcm1zPVtdfWFkZChlKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5wdXNoKGUpLHRoaXN9cmVtb3ZlKGUpe2NvbnN0IHQ9dGhpcy51bmlmb3Jtcy5pbmRleE9mKGUpO3JldHVybiB0IT09LTEmJnRoaXMudW5pZm9ybXMuc3BsaWNlKHQsMSksdGhpc31zZXROYW1lKGUpe3JldHVybiB0aGlzLm5hbWU9ZSx0aGlzfXNldFVzYWdlKGUpe3JldHVybiB0aGlzLnVzYWdlPWUsdGhpc31kaXNwb3NlKCl7cmV0dXJuIHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KSx0aGlzfWNvcHkoZSl7dGhpcy5uYW1lPWUubmFtZSx0aGlzLnVzYWdlPWUudXNhZ2U7Y29uc3QgdD1lLnVuaWZvcm1zO3RoaXMudW5pZm9ybXMubGVuZ3RoPTA7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKXRoaXMudW5pZm9ybXMucHVzaCh0W25dLmNsb25lKCkpO3JldHVybiB0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y2xhc3MgS2IgZXh0ZW5kcyBBb3tjb25zdHJ1Y3RvcihlLHQsbj0xKXtzdXBlcihlLHQpLHRoaXMuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj0hMCx0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9bn1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMubWVzaFBlckF0dHJpYnV0ZT1lLm1lc2hQZXJBdHRyaWJ1dGUsdGhpc31jbG9uZShlKXtjb25zdCB0PXN1cGVyLmNsb25lKGUpO3JldHVybiB0Lm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLHR9dG9KU09OKGUpe2NvbnN0IHQ9c3VwZXIudG9KU09OKGUpO3JldHVybiB0LmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI9ITAsdC5tZXNoUGVyQXR0cmlidXRlPXRoaXMubWVzaFBlckF0dHJpYnV0ZSx0fX1jbGFzcyBRYntjb25zdHJ1Y3RvcihlLHQsbixpLHMpe3RoaXMuaXNHTEJ1ZmZlckF0dHJpYnV0ZT0hMCx0aGlzLm5hbWU9IiIsdGhpcy5idWZmZXI9ZSx0aGlzLnR5cGU9dCx0aGlzLml0ZW1TaXplPW4sdGhpcy5lbGVtZW50U2l6ZT1pLHRoaXMuY291bnQ9cyx0aGlzLnZlcnNpb249MH1zZXQgbmVlZHNVcGRhdGUoZSl7ZT09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRCdWZmZXIoZSl7cmV0dXJuIHRoaXMuYnVmZmVyPWUsdGhpc31zZXRUeXBlKGUsdCl7cmV0dXJuIHRoaXMudHlwZT1lLHRoaXMuZWxlbWVudFNpemU9dCx0aGlzfXNldEl0ZW1TaXplKGUpe3JldHVybiB0aGlzLml0ZW1TaXplPWUsdGhpc31zZXRDb3VudChlKXtyZXR1cm4gdGhpcy5jb3VudD1lLHRoaXN9fWNsYXNzIGpie2NvbnN0cnVjdG9yKGUsdCxuPTAsaT0xLzApe3RoaXMucmF5PW5ldyBVcihlLHQpLHRoaXMubmVhcj1uLHRoaXMuZmFyPWksdGhpcy5jYW1lcmE9bnVsbCx0aGlzLmxheWVycz1uZXcgaW8sdGhpcy5wYXJhbXM9e01lc2g6e30sTGluZTp7dGhyZXNob2xkOjF9LExPRDp7fSxQb2ludHM6e3RocmVzaG9sZDoxfSxTcHJpdGU6e319fXNldChlLHQpe3RoaXMucmF5LnNldChlLHQpfXNldEZyb21DYW1lcmEoZSx0KXt0LmlzUGVyc3BlY3RpdmVDYW1lcmE/KHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24odC5tYXRyaXhXb3JsZCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldChlLngsZS55LC41KS51bnByb2plY3QodCkuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCksdGhpcy5jYW1lcmE9dCk6dC5pc09ydGhvZ3JhcGhpY0NhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldChlLngsZS55LCh0Lm5lYXIrdC5mYXIpLyh0Lm5lYXItdC5mYXIpKS51bnByb2plY3QodCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCgwLDAsLTEpLnRyYW5zZm9ybURpcmVjdGlvbih0Lm1hdHJpeFdvcmxkKSx0aGlzLmNhbWVyYT10KTpjb25zb2xlLmVycm9yKCJUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlOiAiK3QudHlwZSl9aW50ZXJzZWN0T2JqZWN0KGUsdD0hMCxuPVtdKXtyZXR1cm4gZ3UoZSx0aGlzLG4sdCksbi5zb3J0KG5nKSxufWludGVyc2VjdE9iamVjdHMoZSx0PSEwLG49W10pe2ZvcihsZXQgaT0wLHM9ZS5sZW5ndGg7aTxzO2krKylndShlW2ldLHRoaXMsbix0KTtyZXR1cm4gbi5zb3J0KG5nKSxufX1mdW5jdGlvbiBuZyhyLGUpe3JldHVybiByLmRpc3RhbmNlLWUuZGlzdGFuY2V9ZnVuY3Rpb24gZ3UocixlLHQsbil7aWYoci5sYXllcnMudGVzdChlLmxheWVycykmJnIucmF5Y2FzdChlLHQpLG49PT0hMCl7Y29uc3QgaT1yLmNoaWxkcmVuO2ZvcihsZXQgcz0wLGE9aS5sZW5ndGg7czxhO3MrKylndShpW3NdLGUsdCwhMCl9fWNsYXNzIGUxe2NvbnN0cnVjdG9yKGU9MSx0PTAsbj0wKXtyZXR1cm4gdGhpcy5yYWRpdXM9ZSx0aGlzLnBoaT10LHRoaXMudGhldGE9bix0aGlzfXNldChlLHQsbil7cmV0dXJuIHRoaXMucmFkaXVzPWUsdGhpcy5waGk9dCx0aGlzLnRoZXRhPW4sdGhpc31jb3B5KGUpe3JldHVybiB0aGlzLnJhZGl1cz1lLnJhZGl1cyx0aGlzLnBoaT1lLnBoaSx0aGlzLnRoZXRhPWUudGhldGEsdGhpc31tYWtlU2FmZSgpe3JldHVybiB0aGlzLnBoaT1NYXRoLm1heCgxZS02LE1hdGgubWluKE1hdGguUEktMWUtNix0aGlzLnBoaSkpLHRoaXN9c2V0RnJvbVZlY3RvcjMoZSl7cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhlLngsZS55LGUueil9c2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhlLHQsbil7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChlKmUrdCp0K24qbiksdGhpcy5yYWRpdXM9PT0wPyh0aGlzLnRoZXRhPTAsdGhpcy5waGk9MCk6KHRoaXMudGhldGE9TWF0aC5hdGFuMihlLG4pLHRoaXMucGhpPU1hdGguYWNvcyhfdCh0L3RoaXMucmFkaXVzLC0xLDEpKSksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIHQxe2NvbnN0cnVjdG9yKGU9MSx0PTAsbj0wKXtyZXR1cm4gdGhpcy5yYWRpdXM9ZSx0aGlzLnRoZXRhPXQsdGhpcy55PW4sdGhpc31zZXQoZSx0LG4pe3JldHVybiB0aGlzLnJhZGl1cz1lLHRoaXMudGhldGE9dCx0aGlzLnk9bix0aGlzfWNvcHkoZSl7cmV0dXJuIHRoaXMucmFkaXVzPWUucmFkaXVzLHRoaXMudGhldGE9ZS50aGV0YSx0aGlzLnk9ZS55LHRoaXN9c2V0RnJvbVZlY3RvcjMoZSl7cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhlLngsZS55LGUueil9c2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhlLHQsbil7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChlKmUrbipuKSx0aGlzLnRoZXRhPU1hdGguYXRhbjIoZSxuKSx0aGlzLnk9dCx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y29uc3QgaWc9bmV3IHE7Y2xhc3MgbjF7Y29uc3RydWN0b3IoZT1uZXcgcSgxLzAsMS8wKSx0PW5ldyBxKC0xLzAsLTEvMCkpe3RoaXMuaXNCb3gyPSEwLHRoaXMubWluPWUsdGhpcy5tYXg9dH1zZXQoZSx0KXtyZXR1cm4gdGhpcy5taW4uY29weShlKSx0aGlzLm1heC5jb3B5KHQpLHRoaXN9c2V0RnJvbVBvaW50cyhlKXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoZVt0XSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUoZSx0KXtjb25zdCBuPWlnLmNvcHkodCkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KGUpLnN1YihuKSx0aGlzLm1heC5jb3B5KGUpLmFkZChuKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KGUubWluKSx0aGlzLm1heC5jb3B5KGUubWF4KSx0aGlzfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLm1pbi54PXRoaXMubWluLnk9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT0tMS8wLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueX1nZXRDZW50ZXIoZSl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Uuc2V0KDAsMCk6ZS5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZShlKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/ZS5zZXQoMCwwKTplLnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfWV4cGFuZEJ5UG9pbnQoZSl7cmV0dXJuIHRoaXMubWluLm1pbihlKSx0aGlzLm1heC5tYXgoZSksdGhpc31leHBhbmRCeVZlY3RvcihlKXtyZXR1cm4gdGhpcy5taW4uc3ViKGUpLHRoaXMubWF4LmFkZChlKSx0aGlzfWV4cGFuZEJ5U2NhbGFyKGUpe3JldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLWUpLHRoaXMubWF4LmFkZFNjYWxhcihlKSx0aGlzfWNvbnRhaW5zUG9pbnQoZSl7cmV0dXJuIShlLng8dGhpcy5taW4ueHx8ZS54PnRoaXMubWF4Lnh8fGUueTx0aGlzLm1pbi55fHxlLnk+dGhpcy5tYXgueSl9Y29udGFpbnNCb3goZSl7cmV0dXJuIHRoaXMubWluLng8PWUubWluLngmJmUubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PWUubWluLnkmJmUubWF4Lnk8PXRoaXMubWF4Lnl9Z2V0UGFyYW1ldGVyKGUsdCl7cmV0dXJuIHQuc2V0KChlLngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKGUueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSl9aW50ZXJzZWN0c0JveChlKXtyZXR1cm4hKGUubWF4Lng8dGhpcy5taW4ueHx8ZS5taW4ueD50aGlzLm1heC54fHxlLm1heC55PHRoaXMubWluLnl8fGUubWluLnk+dGhpcy5tYXgueSl9Y2xhbXBQb2ludChlLHQpe3JldHVybiB0LmNvcHkoZSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludChlKXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KGUsaWcpLmRpc3RhbmNlVG8oZSl9aW50ZXJzZWN0KGUpe3JldHVybiB0aGlzLm1pbi5tYXgoZS5taW4pLHRoaXMubWF4Lm1pbihlLm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbihlKXtyZXR1cm4gdGhpcy5taW4ubWluKGUubWluKSx0aGlzLm1heC5tYXgoZS5tYXgpLHRoaXN9dHJhbnNsYXRlKGUpe3JldHVybiB0aGlzLm1pbi5hZGQoZSksdGhpcy5tYXguYWRkKGUpLHRoaXN9ZXF1YWxzKGUpe3JldHVybiBlLm1pbi5lcXVhbHModGhpcy5taW4pJiZlLm1heC5lcXVhbHModGhpcy5tYXgpfX1jb25zdCByZz1uZXcgUCxsbD1uZXcgUDtjbGFzcyBpMXtjb25zdHJ1Y3RvcihlPW5ldyBQLHQ9bmV3IFApe3RoaXMuc3RhcnQ9ZSx0aGlzLmVuZD10fXNldChlLHQpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkoZSksdGhpcy5lbmQuY29weSh0KSx0aGlzfWNvcHkoZSl7cmV0dXJuIHRoaXMuc3RhcnQuY29weShlLnN0YXJ0KSx0aGlzLmVuZC5jb3B5KGUuZW5kKSx0aGlzfWdldENlbnRlcihlKXtyZXR1cm4gZS5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsdGhpcy5lbmQpLm11bHRpcGx5U2NhbGFyKC41KX1kZWx0YShlKXtyZXR1cm4gZS5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpfWRpc3RhbmNlU3EoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmVuZCl9ZGlzdGFuY2UoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX1hdChlLHQpe3JldHVybiB0aGlzLmRlbHRhKHQpLm11bHRpcGx5U2NhbGFyKGUpLmFkZCh0aGlzLnN0YXJ0KX1jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKGUsdCl7cmcuc3ViVmVjdG9ycyhlLHRoaXMuc3RhcnQpLGxsLnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCk7Y29uc3Qgbj1sbC5kb3QobGwpO2xldCBzPWxsLmRvdChyZykvbjtyZXR1cm4gdCYmKHM9X3QocywwLDEpKSxzfWNsb3Nlc3RQb2ludFRvUG9pbnQoZSx0LG4pe2NvbnN0IGk9dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKGUsdCk7cmV0dXJuIHRoaXMuZGVsdGEobikubXVsdGlwbHlTY2FsYXIoaSkuYWRkKHRoaXMuc3RhcnQpfWFwcGx5TWF0cml4NChlKXtyZXR1cm4gdGhpcy5zdGFydC5hcHBseU1hdHJpeDQoZSksdGhpcy5lbmQuYXBwbHlNYXRyaXg0KGUpLHRoaXN9ZXF1YWxzKGUpe3JldHVybiBlLnN0YXJ0LmVxdWFscyh0aGlzLnN0YXJ0KSYmZS5lbmQuZXF1YWxzKHRoaXMuZW5kKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNvbnN0IHNnPW5ldyBQO2NsYXNzIHIxIGV4dGVuZHMgcnR7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMubGlnaHQ9ZSx0aGlzLm1hdHJpeD1lLm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNvbG9yPXQsdGhpcy50eXBlPSJTcG90TGlnaHRIZWxwZXIiO2NvbnN0IG49bmV3IGtlLGk9WzAsMCwwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLC0xLDAsMSwwLDAsMCwwLDEsMSwwLDAsMCwwLC0xLDFdO2ZvcihsZXQgYT0wLG89MSxsPTMyO2E8bDthKyssbysrKXtjb25zdCBjPWEvbCpNYXRoLlBJKjIsaD1vL2wqTWF0aC5QSSoyO2kucHVzaChNYXRoLmNvcyhjKSxNYXRoLnNpbihjKSwxLE1hdGguY29zKGgpLE1hdGguc2luKGgpLDEpfW4uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFNlKGksMykpO2NvbnN0IHM9bmV3IEt0KHtmb2c6ITEsdG9uZU1hcHBlZDohMX0pO3RoaXMuY29uZT1uZXcgV24obixzKSx0aGlzLmFkZCh0aGlzLmNvbmUpLHRoaXMudXBkYXRlKCl9ZGlzcG9zZSgpe3RoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKX11cGRhdGUoKXt0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLmxpZ2h0LnRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLmxpZ2h0LmRpc3RhbmNlP3RoaXMubGlnaHQuZGlzdGFuY2U6MWUzLHQ9ZSpNYXRoLnRhbih0aGlzLmxpZ2h0LmFuZ2xlKTt0aGlzLmNvbmUuc2NhbGUuc2V0KHQsdCxlKSxzZy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQpLHRoaXMuY29uZS5sb29rQXQoc2cpLHRoaXMuY29sb3IhPT12b2lkIDA/dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTp0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKX19Y29uc3QgRmk9bmV3IFAsY2w9bmV3IEllLF91PW5ldyBJZTtjbGFzcyBzMSBleHRlbmRzIFdue2NvbnN0cnVjdG9yKGUpe2NvbnN0IHQ9YWcoZSksbj1uZXcga2UsaT1bXSxzPVtdLGE9bmV3IHllKDAsMCwxKSxvPW5ldyB5ZSgwLDEsMCk7Zm9yKGxldCBjPTA7Yzx0Lmxlbmd0aDtjKyspe2NvbnN0IGg9dFtjXTtoLnBhcmVudCYmaC5wYXJlbnQuaXNCb25lJiYoaS5wdXNoKDAsMCwwKSxpLnB1c2goMCwwLDApLHMucHVzaChhLnIsYS5nLGEuYikscy5wdXNoKG8ucixvLmcsby5iKSl9bi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoaSwzKSksbi5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgU2UocywzKSk7Y29uc3QgbD1uZXcgS3Qoe3ZlcnRleENvbG9yczohMCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSx0b25lTWFwcGVkOiExLHRyYW5zcGFyZW50OiEwfSk7c3VwZXIobixsKSx0aGlzLmlzU2tlbGV0b25IZWxwZXI9ITAsdGhpcy50eXBlPSJTa2VsZXRvbkhlbHBlciIsdGhpcy5yb290PWUsdGhpcy5ib25lcz10LHRoaXMubWF0cml4PWUubWF0cml4V29ybGQsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExfXVwZGF0ZU1hdHJpeFdvcmxkKGUpe2NvbnN0IHQ9dGhpcy5ib25lcyxuPXRoaXMuZ2VvbWV0cnksaT1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtfdS5jb3B5KHRoaXMucm9vdC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk7Zm9yKGxldCBzPTAsYT0wO3M8dC5sZW5ndGg7cysrKXtjb25zdCBvPXRbc107by5wYXJlbnQmJm8ucGFyZW50LmlzQm9uZSYmKGNsLm11bHRpcGx5TWF0cmljZXMoX3Usby5tYXRyaXhXb3JsZCksRmkuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNsKSxpLnNldFhZWihhLEZpLngsRmkueSxGaS56KSxjbC5tdWx0aXBseU1hdHJpY2VzKF91LG8ucGFyZW50Lm1hdHJpeFdvcmxkKSxGaS5zZXRGcm9tTWF0cml4UG9zaXRpb24oY2wpLGkuc2V0WFlaKGErMSxGaS54LEZpLnksRmkueiksYSs9Mil9bi5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITAsc3VwZXIudXBkYXRlTWF0cml4V29ybGQoZSl9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1mdW5jdGlvbiBhZyhyKXtjb25zdCBlPVtdO3IuaXNCb25lPT09ITAmJmUucHVzaChyKTtmb3IobGV0IHQ9MDt0PHIuY2hpbGRyZW4ubGVuZ3RoO3QrKyllLnB1c2guYXBwbHkoZSxhZyhyLmNoaWxkcmVuW3RdKSk7cmV0dXJuIGV9Y2xhc3MgYTEgZXh0ZW5kcyBMdHtjb25zdHJ1Y3RvcihlLHQsbil7Y29uc3QgaT1uZXcgY2EodCw0LDIpLHM9bmV3IFBpKHt3aXJlZnJhbWU6ITAsZm9nOiExLHRvbmVNYXBwZWQ6ITF9KTtzdXBlcihpLHMpLHRoaXMubGlnaHQ9ZSx0aGlzLmNvbG9yPW4sdGhpcy50eXBlPSJQb2ludExpZ2h0SGVscGVyIix0aGlzLm1hdHJpeD10aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX11cGRhdGUoKXt0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLmNvbG9yIT09dm9pZCAwP3RoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOnRoaXMubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKX19Y29uc3QgbzE9bmV3IFAsb2c9bmV3IHllLGxnPW5ldyB5ZTtjbGFzcyBsMSBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcigpLHRoaXMubGlnaHQ9ZSx0aGlzLm1hdHJpeD1lLm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNvbG9yPW4sdGhpcy50eXBlPSJIZW1pc3BoZXJlTGlnaHRIZWxwZXIiO2NvbnN0IGk9bmV3IGxhKHQpO2kucm90YXRlWShNYXRoLlBJKi41KSx0aGlzLm1hdGVyaWFsPW5ldyBQaSh7d2lyZWZyYW1lOiEwLGZvZzohMSx0b25lTWFwcGVkOiExfSksdGhpcy5jb2xvcj09PXZvaWQgMCYmKHRoaXMubWF0ZXJpYWwudmVydGV4Q29sb3JzPSEwKTtjb25zdCBzPWkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLGE9bmV3IEZsb2F0MzJBcnJheShzLmNvdW50KjMpO2kuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IEtlKGEsMykpLHRoaXMuYWRkKG5ldyBMdChpLHRoaXMubWF0ZXJpYWwpKSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmNoaWxkcmVuWzBdLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLmNoaWxkcmVuWzBdLm1hdGVyaWFsLmRpc3Bvc2UoKX11cGRhdGUoKXtjb25zdCBlPXRoaXMuY2hpbGRyZW5bMF07aWYodGhpcy5jb2xvciE9PXZvaWQgMCl0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTtlbHNle2NvbnN0IHQ9ZS5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoImNvbG9yIik7b2cuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSxsZy5jb3B5KHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IpO2ZvcihsZXQgbj0wLGk9dC5jb3VudDtuPGk7bisrKXtjb25zdCBzPW48aS8yP29nOmxnO3Quc2V0WFlaKG4scy5yLHMuZyxzLmIpfXQubmVlZHNVcGRhdGU9ITB9dGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksZS5sb29rQXQobzEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQubWF0cml4V29ybGQpLm5lZ2F0ZSgpKX19Y2xhc3MgYzEgZXh0ZW5kcyBXbntjb25zdHJ1Y3RvcihlPTEwLHQ9MTAsbj00NDczOTI0LGk9ODk0Nzg0OCl7bj1uZXcgeWUobiksaT1uZXcgeWUoaSk7Y29uc3Qgcz10LzIsYT1lL3Qsbz1lLzIsbD1bXSxjPVtdO2ZvcihsZXQgZj0wLGQ9MCxwPS1vO2Y8PXQ7ZisrLHArPWEpe2wucHVzaCgtbywwLHAsbywwLHApLGwucHVzaChwLDAsLW8scCwwLG8pO2NvbnN0IF89Zj09PXM/bjppO18udG9BcnJheShjLGQpLGQrPTMsXy50b0FycmF5KGMsZCksZCs9MyxfLnRvQXJyYXkoYyxkKSxkKz0zLF8udG9BcnJheShjLGQpLGQrPTN9Y29uc3QgaD1uZXcga2U7aC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UobCwzKSksaC5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgU2UoYywzKSk7Y29uc3QgdT1uZXcgS3Qoe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSk7c3VwZXIoaCx1KSx0aGlzLnR5cGU9IkdyaWRIZWxwZXIifWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y2xhc3MgaDEgZXh0ZW5kcyBXbntjb25zdHJ1Y3RvcihlPTEwLHQ9MTYsbj04LGk9NjQscz00NDczOTI0LGE9ODk0Nzg0OCl7cz1uZXcgeWUocyksYT1uZXcgeWUoYSk7Y29uc3Qgbz1bXSxsPVtdO2lmKHQ+MSlmb3IobGV0IHU9MDt1PHQ7dSsrKXtjb25zdCBmPXUvdCooTWF0aC5QSSoyKSxkPU1hdGguc2luKGYpKmUscD1NYXRoLmNvcyhmKSplO28ucHVzaCgwLDAsMCksby5wdXNoKGQsMCxwKTtjb25zdCBfPXUmMT9zOmE7bC5wdXNoKF8ucixfLmcsXy5iKSxsLnB1c2goXy5yLF8uZyxfLmIpfWZvcihsZXQgdT0wO3U8bjt1Kyspe2NvbnN0IGY9dSYxP3M6YSxkPWUtZS9uKnU7Zm9yKGxldCBwPTA7cDxpO3ArKyl7bGV0IF89cC9pKihNYXRoLlBJKjIpLGc9TWF0aC5zaW4oXykqZCxtPU1hdGguY29zKF8pKmQ7by5wdXNoKGcsMCxtKSxsLnB1c2goZi5yLGYuZyxmLmIpLF89KHArMSkvaSooTWF0aC5QSSoyKSxnPU1hdGguc2luKF8pKmQsbT1NYXRoLmNvcyhfKSpkLG8ucHVzaChnLDAsbSksbC5wdXNoKGYucixmLmcsZi5iKX19Y29uc3QgYz1uZXcga2U7Yy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UobywzKSksYy5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgU2UobCwzKSk7Y29uc3QgaD1uZXcgS3Qoe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSk7c3VwZXIoYyxoKSx0aGlzLnR5cGU9IlBvbGFyR3JpZEhlbHBlciJ9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1jb25zdCBjZz1uZXcgUCxobD1uZXcgUCxoZz1uZXcgUDtjbGFzcyB1MSBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcigpLHRoaXMubGlnaHQ9ZSx0aGlzLm1hdHJpeD1lLm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNvbG9yPW4sdGhpcy50eXBlPSJEaXJlY3Rpb25hbExpZ2h0SGVscGVyIix0PT09dm9pZCAwJiYodD0xKTtsZXQgaT1uZXcga2U7aS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoWy10LHQsMCx0LHQsMCx0LC10LDAsLXQsLXQsMCwtdCx0LDBdLDMpKTtjb25zdCBzPW5ldyBLdCh7Zm9nOiExLHRvbmVNYXBwZWQ6ITF9KTt0aGlzLmxpZ2h0UGxhbmU9bmV3IFVpKGkscyksdGhpcy5hZGQodGhpcy5saWdodFBsYW5lKSxpPW5ldyBrZSxpLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShbMCwwLDAsMCwwLDFdLDMpKSx0aGlzLnRhcmdldExpbmU9bmV3IFVpKGkscyksdGhpcy5hZGQodGhpcy50YXJnZXRMaW5lKSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCksdGhpcy50YXJnZXRMaW5lLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpfXVwZGF0ZSgpe3RoaXMubGlnaHQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubGlnaHQudGFyZ2V0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxjZy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCksaGwuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKSxoZy5zdWJWZWN0b3JzKGhsLGNnKSx0aGlzLmxpZ2h0UGxhbmUubG9va0F0KGhsKSx0aGlzLmNvbG9yIT09dm9pZCAwPyh0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcikpOih0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSksdGhpcy50YXJnZXRMaW5lLmxvb2tBdChobCksdGhpcy50YXJnZXRMaW5lLnNjYWxlLno9aGcubGVuZ3RoKCl9fWNvbnN0IHVsPW5ldyBQLHh0PW5ldyBfbztjbGFzcyBmMSBleHRlbmRzIFdue2NvbnN0cnVjdG9yKGUpe2NvbnN0IHQ9bmV3IGtlLG49bmV3IEt0KHtjb2xvcjoxNjc3NzIxNSx2ZXJ0ZXhDb2xvcnM6ITAsdG9uZU1hcHBlZDohMX0pLGk9W10scz1bXSxhPXt9O28oIm4xIiwibjIiKSxvKCJuMiIsIm40IiksbygibjQiLCJuMyIpLG8oIm4zIiwibjEiKSxvKCJmMSIsImYyIiksbygiZjIiLCJmNCIpLG8oImY0IiwiZjMiKSxvKCJmMyIsImYxIiksbygibjEiLCJmMSIpLG8oIm4yIiwiZjIiKSxvKCJuMyIsImYzIiksbygibjQiLCJmNCIpLG8oInAiLCJuMSIpLG8oInAiLCJuMiIpLG8oInAiLCJuMyIpLG8oInAiLCJuNCIpLG8oInUxIiwidTIiKSxvKCJ1MiIsInUzIiksbygidTMiLCJ1MSIpLG8oImMiLCJ0IiksbygicCIsImMiKSxvKCJjbjEiLCJjbjIiKSxvKCJjbjMiLCJjbjQiKSxvKCJjZjEiLCJjZjIiKSxvKCJjZjMiLCJjZjQiKTtmdW5jdGlvbiBvKHAsXyl7bChwKSxsKF8pfWZ1bmN0aW9uIGwocCl7aS5wdXNoKDAsMCwwKSxzLnB1c2goMCwwLDApLGFbcF09PT12b2lkIDAmJihhW3BdPVtdKSxhW3BdLnB1c2goaS5sZW5ndGgvMy0xKX10LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShpLDMpKSx0LnNldEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBTZShzLDMpKSxzdXBlcih0LG4pLHRoaXMudHlwZT0iQ2FtZXJhSGVscGVyIix0aGlzLmNhbWVyYT1lLHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgmJnRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSx0aGlzLm1hdHJpeD1lLm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLnBvaW50TWFwPWEsdGhpcy51cGRhdGUoKTtjb25zdCBjPW5ldyB5ZSgxNjc1NTIwMCksaD1uZXcgeWUoMTY3MTE2ODApLHU9bmV3IHllKDQzNzc1KSxmPW5ldyB5ZSgxNjc3NzIxNSksZD1uZXcgeWUoMzM1NTQ0Myk7dGhpcy5zZXRDb2xvcnMoYyxoLHUsZixkKX1zZXRDb2xvcnMoZSx0LG4saSxzKXtjb25zdCBvPXRoaXMuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO28uc2V0WFlaKDAsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDEsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDIsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDMsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDQsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDUsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDYsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDcsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDgsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDksZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDEwLGUucixlLmcsZS5iKSxvLnNldFhZWigxMSxlLnIsZS5nLGUuYiksby5zZXRYWVooMTIsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDEzLGUucixlLmcsZS5iKSxvLnNldFhZWigxNCxlLnIsZS5nLGUuYiksby5zZXRYWVooMTUsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDE2LGUucixlLmcsZS5iKSxvLnNldFhZWigxNyxlLnIsZS5nLGUuYiksby5zZXRYWVooMTgsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDE5LGUucixlLmcsZS5iKSxvLnNldFhZWigyMCxlLnIsZS5nLGUuYiksby5zZXRYWVooMjEsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDIyLGUucixlLmcsZS5iKSxvLnNldFhZWigyMyxlLnIsZS5nLGUuYiksby5zZXRYWVooMjQsdC5yLHQuZyx0LmIpLG8uc2V0WFlaKDI1LHQucix0LmcsdC5iKSxvLnNldFhZWigyNix0LnIsdC5nLHQuYiksby5zZXRYWVooMjcsdC5yLHQuZyx0LmIpLG8uc2V0WFlaKDI4LHQucix0LmcsdC5iKSxvLnNldFhZWigyOSx0LnIsdC5nLHQuYiksby5zZXRYWVooMzAsdC5yLHQuZyx0LmIpLG8uc2V0WFlaKDMxLHQucix0LmcsdC5iKSxvLnNldFhZWigzMixuLnIsbi5nLG4uYiksby5zZXRYWVooMzMsbi5yLG4uZyxuLmIpLG8uc2V0WFlaKDM0LG4ucixuLmcsbi5iKSxvLnNldFhZWigzNSxuLnIsbi5nLG4uYiksby5zZXRYWVooMzYsbi5yLG4uZyxuLmIpLG8uc2V0WFlaKDM3LG4ucixuLmcsbi5iKSxvLnNldFhZWigzOCxpLnIsaS5nLGkuYiksby5zZXRYWVooMzksaS5yLGkuZyxpLmIpLG8uc2V0WFlaKDQwLHMucixzLmcscy5iKSxvLnNldFhZWig0MSxzLnIscy5nLHMuYiksby5zZXRYWVooNDIscy5yLHMuZyxzLmIpLG8uc2V0WFlaKDQzLHMucixzLmcscy5iKSxvLnNldFhZWig0NCxzLnIscy5nLHMuYiksby5zZXRYWVooNDUscy5yLHMuZyxzLmIpLG8uc2V0WFlaKDQ2LHMucixzLmcscy5iKSxvLnNldFhZWig0NyxzLnIscy5nLHMuYiksby5zZXRYWVooNDgscy5yLHMuZyxzLmIpLG8uc2V0WFlaKDQ5LHMucixzLmcscy5iKSxvLm5lZWRzVXBkYXRlPSEwfXVwZGF0ZSgpe2NvbnN0IGU9dGhpcy5nZW9tZXRyeSx0PXRoaXMucG9pbnRNYXAsbj0xLGk9MTt4dC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKSxBdCgiYyIsdCxlLHh0LDAsMCwtMSksQXQoInQiLHQsZSx4dCwwLDAsMSksQXQoIm4xIix0LGUseHQsLW4sLWksLTEpLEF0KCJuMiIsdCxlLHh0LG4sLWksLTEpLEF0KCJuMyIsdCxlLHh0LC1uLGksLTEpLEF0KCJuNCIsdCxlLHh0LG4saSwtMSksQXQoImYxIix0LGUseHQsLW4sLWksMSksQXQoImYyIix0LGUseHQsbiwtaSwxKSxBdCgiZjMiLHQsZSx4dCwtbixpLDEpLEF0KCJmNCIsdCxlLHh0LG4saSwxKSxBdCgidTEiLHQsZSx4dCxuKi43LGkqMS4xLC0xKSxBdCgidTIiLHQsZSx4dCwtbiouNyxpKjEuMSwtMSksQXQoInUzIix0LGUseHQsMCxpKjIsLTEpLEF0KCJjZjEiLHQsZSx4dCwtbiwwLDEpLEF0KCJjZjIiLHQsZSx4dCxuLDAsMSksQXQoImNmMyIsdCxlLHh0LDAsLWksMSksQXQoImNmNCIsdCxlLHh0LDAsaSwxKSxBdCgiY24xIix0LGUseHQsLW4sMCwtMSksQXQoImNuMiIsdCxlLHh0LG4sMCwtMSksQXQoImNuMyIsdCxlLHh0LDAsLWksLTEpLEF0KCJjbjQiLHQsZSx4dCwwLGksLTEpLGUuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLm5lZWRzVXBkYXRlPSEwfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19ZnVuY3Rpb24gQXQocixlLHQsbixpLHMsYSl7dWwuc2V0KGkscyxhKS51bnByb2plY3Qobik7Y29uc3Qgbz1lW3JdO2lmKG8hPT12b2lkIDApe2NvbnN0IGw9dC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7Zm9yKGxldCBjPTAsaD1vLmxlbmd0aDtjPGg7YysrKWwuc2V0WFlaKG9bY10sdWwueCx1bC55LHVsLnopfX1jb25zdCBmbD1uZXcgRHQ7Y2xhc3MgZDEgZXh0ZW5kcyBXbntjb25zdHJ1Y3RvcihlLHQ9MTY3NzY5NjApe2NvbnN0IG49bmV3IFVpbnQxNkFycmF5KFswLDEsMSwyLDIsMywzLDAsNCw1LDUsNiw2LDcsNyw0LDAsNCwxLDUsMiw2LDMsN10pLGk9bmV3IEZsb2F0MzJBcnJheSg4KjMpLHM9bmV3IGtlO3Muc2V0SW5kZXgobmV3IEtlKG4sMSkpLHMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEtlKGksMykpLHN1cGVyKHMsbmV3IEt0KHtjb2xvcjp0LHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5vYmplY3Q9ZSx0aGlzLnR5cGU9IkJveEhlbHBlciIsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMudXBkYXRlKCl9dXBkYXRlKGUpe2lmKGUhPT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuQm94SGVscGVyOiAudXBkYXRlKCkgaGFzIG5vIGxvbmdlciBhcmd1bWVudHMuIiksdGhpcy5vYmplY3QhPT12b2lkIDAmJmZsLnNldEZyb21PYmplY3QodGhpcy5vYmplY3QpLGZsLmlzRW1wdHkoKSlyZXR1cm47Y29uc3QgdD1mbC5taW4sbj1mbC5tYXgsaT10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24scz1pLmFycmF5O3NbMF09bi54LHNbMV09bi55LHNbMl09bi56LHNbM109dC54LHNbNF09bi55LHNbNV09bi56LHNbNl09dC54LHNbN109dC55LHNbOF09bi56LHNbOV09bi54LHNbMTBdPXQueSxzWzExXT1uLnosc1sxMl09bi54LHNbMTNdPW4ueSxzWzE0XT10Lnosc1sxNV09dC54LHNbMTZdPW4ueSxzWzE3XT10Lnosc1sxOF09dC54LHNbMTldPXQueSxzWzIwXT10Lnosc1syMV09bi54LHNbMjJdPXQueSxzWzIzXT10LnosaS5uZWVkc1VwZGF0ZT0hMCx0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfXNldEZyb21PYmplY3QoZSl7cmV0dXJuIHRoaXMub2JqZWN0PWUsdGhpcy51cGRhdGUoKSx0aGlzfWNvcHkoZSx0KXtyZXR1cm4gc3VwZXIuY29weShlLHQpLHRoaXMub2JqZWN0PWUub2JqZWN0LHRoaXN9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1jbGFzcyBwMSBleHRlbmRzIFdue2NvbnN0cnVjdG9yKGUsdD0xNjc3Njk2MCl7Y29uc3Qgbj1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LDQsMCw0LDEsNSwyLDYsMyw3XSksaT1bMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwtMSwtMSwxLC0xLC0xLC0xLC0xLDEsLTEsLTFdLHM9bmV3IGtlO3Muc2V0SW5kZXgobmV3IEtlKG4sMSkpLHMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFNlKGksMykpLHN1cGVyKHMsbmV3IEt0KHtjb2xvcjp0LHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5ib3g9ZSx0aGlzLnR5cGU9IkJveDNIZWxwZXIiLHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl9dXBkYXRlTWF0cml4V29ybGQoZSl7Y29uc3QgdD10aGlzLmJveDt0LmlzRW1wdHkoKXx8KHQuZ2V0Q2VudGVyKHRoaXMucG9zaXRpb24pLHQuZ2V0U2l6ZSh0aGlzLnNjYWxlKSx0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKC41KSxzdXBlci51cGRhdGVNYXRyaXhXb3JsZChlKSl9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1jbGFzcyBtMSBleHRlbmRzIFVpe2NvbnN0cnVjdG9yKGUsdD0xLG49MTY3NzY5NjApe2NvbnN0IGk9bixzPVsxLC0xLDAsLTEsMSwwLC0xLC0xLDAsMSwxLDAsLTEsMSwwLC0xLC0xLDAsMSwtMSwwLDEsMSwwXSxhPW5ldyBrZTthLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShzLDMpKSxhLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHN1cGVyKGEsbmV3IEt0KHtjb2xvcjppLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy50eXBlPSJQbGFuZUhlbHBlciIsdGhpcy5wbGFuZT1lLHRoaXMuc2l6ZT10O2NvbnN0IG89WzEsMSwwLC0xLDEsMCwtMSwtMSwwLDEsMSwwLC0xLC0xLDAsMSwtMSwwXSxsPW5ldyBrZTtsLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShvLDMpKSxsLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuYWRkKG5ldyBMdChsLG5ldyBQaSh7Y29sb3I6aSxvcGFjaXR5Oi4yLHRyYW5zcGFyZW50OiEwLGRlcHRoV3JpdGU6ITEsdG9uZU1hcHBlZDohMX0pKSl9dXBkYXRlTWF0cml4V29ybGQoZSl7dGhpcy5wb3NpdGlvbi5zZXQoMCwwLDApLHRoaXMuc2NhbGUuc2V0KC41KnRoaXMuc2l6ZSwuNSp0aGlzLnNpemUsMSksdGhpcy5sb29rQXQodGhpcy5wbGFuZS5ub3JtYWwpLHRoaXMudHJhbnNsYXRlWigtdGhpcy5wbGFuZS5jb25zdGFudCksc3VwZXIudXBkYXRlTWF0cml4V29ybGQoZSl9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpLHRoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfX1jb25zdCB1Zz1uZXcgUDtsZXQgZGwseHU7Y2xhc3MgZzEgZXh0ZW5kcyBydHtjb25zdHJ1Y3RvcihlPW5ldyBQKDAsMCwxKSx0PW5ldyBQKDAsMCwwKSxuPTEsaT0xNjc3Njk2MCxzPW4qLjIsYT1zKi4yKXtzdXBlcigpLHRoaXMudHlwZT0iQXJyb3dIZWxwZXIiLGRsPT09dm9pZCAwJiYoZGw9bmV3IGtlLGRsLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShbMCwwLDAsMCwxLDBdLDMpKSx4dT1uZXcgbnMoMCwuNSwxLDUsMSkseHUudHJhbnNsYXRlKDAsLS41LDApKSx0aGlzLnBvc2l0aW9uLmNvcHkodCksdGhpcy5saW5lPW5ldyBVaShkbCxuZXcgS3Qoe2NvbG9yOmksdG9uZU1hcHBlZDohMX0pKSx0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmFkZCh0aGlzLmxpbmUpLHRoaXMuY29uZT1uZXcgTHQoeHUsbmV3IFBpKHtjb2xvcjppLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5hZGQodGhpcy5jb25lKSx0aGlzLnNldERpcmVjdGlvbihlKSx0aGlzLnNldExlbmd0aChuLHMsYSl9c2V0RGlyZWN0aW9uKGUpe2lmKGUueT4uOTk5OTkpdGhpcy5xdWF0ZXJuaW9uLnNldCgwLDAsMCwxKTtlbHNlIGlmKGUueTwtLjk5OTk5KXRoaXMucXVhdGVybmlvbi5zZXQoMSwwLDAsMCk7ZWxzZXt1Zy5zZXQoZS56LDAsLWUueCkubm9ybWFsaXplKCk7Y29uc3QgdD1NYXRoLmFjb3MoZS55KTt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh1Zyx0KX19c2V0TGVuZ3RoKGUsdD1lKi4yLG49dCouMil7dGhpcy5saW5lLnNjYWxlLnNldCgxLE1hdGgubWF4KDFlLTQsZS10KSwxKSx0aGlzLmxpbmUudXBkYXRlTWF0cml4KCksdGhpcy5jb25lLnNjYWxlLnNldChuLHQsbiksdGhpcy5jb25lLnBvc2l0aW9uLnk9ZSx0aGlzLmNvbmUudXBkYXRlTWF0cml4KCl9c2V0Q29sb3IoZSl7dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLnNldChlKSx0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KGUpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSwhMSksdGhpcy5saW5lLmNvcHkoZS5saW5lKSx0aGlzLmNvbmUuY29weShlLmNvbmUpLHRoaXN9ZGlzcG9zZSgpe3RoaXMubGluZS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5saW5lLm1hdGVyaWFsLmRpc3Bvc2UoKSx0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCl9fWNsYXNzIF8xIGV4dGVuZHMgV257Y29uc3RydWN0b3IoZT0xKXtjb25zdCB0PVswLDAsMCxlLDAsMCwwLDAsMCwwLGUsMCwwLDAsMCwwLDAsZV0sbj1bMSwwLDAsMSwuNiwwLDAsMSwwLC42LDEsMCwwLDAsMSwwLC42LDFdLGk9bmV3IGtlO2kuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFNlKHQsMykpLGkuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IFNlKG4sMykpO2NvbnN0IHM9bmV3IEt0KHt2ZXJ0ZXhDb2xvcnM6ITAsdG9uZU1hcHBlZDohMX0pO3N1cGVyKGkscyksdGhpcy50eXBlPSJBeGVzSGVscGVyIn1zZXRDb2xvcnMoZSx0LG4pe2NvbnN0IGk9bmV3IHllLHM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLmFycmF5O3JldHVybiBpLnNldChlKSxpLnRvQXJyYXkocywwKSxpLnRvQXJyYXkocywzKSxpLnNldCh0KSxpLnRvQXJyYXkocyw2KSxpLnRvQXJyYXkocyw5KSxpLnNldChuKSxpLnRvQXJyYXkocywxMiksaS50b0FycmF5KHMsMTUpLHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5uZWVkc1VwZGF0ZT0hMCx0aGlzfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y2xhc3MgeDF7Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU9IlNoYXBlUGF0aCIsdGhpcy5jb2xvcj1uZXcgeWUsdGhpcy5zdWJQYXRocz1bXSx0aGlzLmN1cnJlbnRQYXRoPW51bGx9bW92ZVRvKGUsdCl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGg9bmV3IGlhLHRoaXMuc3ViUGF0aHMucHVzaCh0aGlzLmN1cnJlbnRQYXRoKSx0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyhlLHQpLHRoaXN9bGluZVRvKGUsdCl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGgubGluZVRvKGUsdCksdGhpc31xdWFkcmF0aWNDdXJ2ZVRvKGUsdCxuLGkpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8oZSx0LG4saSksdGhpc31iZXppZXJDdXJ2ZVRvKGUsdCxuLGkscyxhKXtyZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKGUsdCxuLGkscyxhKSx0aGlzfXNwbGluZVRocnUoZSl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGguc3BsaW5lVGhydShlKSx0aGlzfXRvU2hhcGVzKGUpe2Z1bmN0aW9uIHQobSl7Y29uc3QgeT1bXTtmb3IobGV0IHg9MCx2PW0ubGVuZ3RoO3g8djt4Kyspe2NvbnN0IFM9bVt4XSxiPW5ldyBvaTtiLmN1cnZlcz1TLmN1cnZlcyx5LnB1c2goYil9cmV0dXJuIHl9ZnVuY3Rpb24gbihtLHkpe2NvbnN0IHg9eS5sZW5ndGg7bGV0IHY9ITE7Zm9yKGxldCBTPXgtMSxiPTA7Yjx4O1M9YisrKXtsZXQgQT15W1NdLEw9eVtiXSxNPUwueC1BLngsdz1MLnktQS55O2lmKE1hdGguYWJzKHcpPk51bWJlci5FUFNJTE9OKXtpZih3PDAmJihBPXlbYl0sTT0tTSxMPXlbU10sdz0tdyksbS55PEEueXx8bS55PkwueSljb250aW51ZTtpZihtLnk9PT1BLnkpe2lmKG0ueD09PUEueClyZXR1cm4hMH1lbHNle2NvbnN0IFI9dyoobS54LUEueCktTSoobS55LUEueSk7aWYoUj09PTApcmV0dXJuITA7aWYoUjwwKWNvbnRpbnVlO3Y9IXZ9fWVsc2V7aWYobS55IT09QS55KWNvbnRpbnVlO2lmKEwueDw9bS54JiZtLng8PUEueHx8QS54PD1tLngmJm0ueDw9TC54KXJldHVybiEwfX1yZXR1cm4gdn1jb25zdCBpPXZuLmlzQ2xvY2tXaXNlLHM9dGhpcy5zdWJQYXRocztpZihzLmxlbmd0aD09PTApcmV0dXJuW107bGV0IGEsbyxsO2NvbnN0IGM9W107aWYocy5sZW5ndGg9PT0xKXJldHVybiBvPXNbMF0sbD1uZXcgb2ksbC5jdXJ2ZXM9by5jdXJ2ZXMsYy5wdXNoKGwpLGM7bGV0IGg9IWkoc1swXS5nZXRQb2ludHMoKSk7aD1lPyFoOmg7Y29uc3QgdT1bXSxmPVtdO2xldCBkPVtdLHA9MCxfO2ZbcF09dm9pZCAwLGRbcF09W107Zm9yKGxldCBtPTAseT1zLmxlbmd0aDttPHk7bSsrKW89c1ttXSxfPW8uZ2V0UG9pbnRzKCksYT1pKF8pLGE9ZT8hYTphLGE/KCFoJiZmW3BdJiZwKyssZltwXT17czpuZXcgb2kscDpffSxmW3BdLnMuY3VydmVzPW8uY3VydmVzLGgmJnArKyxkW3BdPVtdKTpkW3BdLnB1c2goe2g6byxwOl9bMF19KTtpZighZlswXSlyZXR1cm4gdChzKTtpZihmLmxlbmd0aD4xKXtsZXQgbT0hMSx5PTA7Zm9yKGxldCB4PTAsdj1mLmxlbmd0aDt4PHY7eCsrKXVbeF09W107Zm9yKGxldCB4PTAsdj1mLmxlbmd0aDt4PHY7eCsrKXtjb25zdCBTPWRbeF07Zm9yKGxldCBiPTA7YjxTLmxlbmd0aDtiKyspe2NvbnN0IEE9U1tiXTtsZXQgTD0hMDtmb3IobGV0IE09MDtNPGYubGVuZ3RoO00rKyluKEEucCxmW01dLnApJiYoeCE9PU0mJnkrKyxMPyhMPSExLHVbTV0ucHVzaChBKSk6bT0hMCk7TCYmdVt4XS5wdXNoKEEpfX15PjAmJm09PT0hMSYmKGQ9dSl9bGV0IGc7Zm9yKGxldCBtPTAseT1mLmxlbmd0aDttPHk7bSsrKXtsPWZbbV0ucyxjLnB1c2gobCksZz1kW21dO2ZvcihsZXQgeD0wLHY9Zy5sZW5ndGg7eDx2O3grKylsLmhvbGVzLnB1c2goZ1t4XS5oKX1yZXR1cm4gY319dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyE9InVuZGVmaW5lZCImJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicmVnaXN0ZXIiLHtkZXRhaWw6e3JldmlzaW9uOmZ0fX0pKSx0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKHdpbmRvdy5fX1RIUkVFX18/Y29uc29sZS53YXJuKCJXQVJOSU5HOiBNdWx0aXBsZSBpbnN0YW5jZXMgb2YgVGhyZWUuanMgYmVpbmcgaW1wb3J0ZWQuIik6d2luZG93Ll9fVEhSRUVfXz1mdCk7dmFyIHkxPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEFDRVNGaWxtaWNUb25lTWFwcGluZzpqZixBZGRFcXVhdGlvbjp4aSxBZGRPcGVyYXRpb246WmYsQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGU6WWMsQWRkaXRpdmVCbGVuZGluZzpjYyxBbHBoYUZvcm1hdDpyZCxBbHdheXNDb21wYXJlOlNkLEFsd2F5c0RlcHRoOlZmLEFsd2F5c1N0ZW5jaWxGdW5jOkpjLEFtYmllbnRMaWdodDp6bSxBbmltYXRpb25BY3Rpb246dGcsQW5pbWF0aW9uQ2xpcDpkYSxBbmltYXRpb25Mb2FkZXI6eWIsQW5pbWF0aW9uTWl4ZXI6WWIsQW5pbWF0aW9uT2JqZWN0R3JvdXA6cWIsQW5pbWF0aW9uVXRpbHM6bWIsQXJjQ3VydmU6ZW0sQXJyYXlDYW1lcmE6U3AsQXJyb3dIZWxwZXI6ZzEsQXR0YWNoZWRCaW5kTW9kZTpwYyxBdWRpbzpRbSxBdWRpb0FuYWx5c2VyOkZiLEF1ZGlvQ29udGV4dDpmdSxBdWRpb0xpc3RlbmVyOlViLEF1ZGlvTG9hZGVyOlBiLEF4ZXNIZWxwZXI6XzEsQmFja1NpZGU6WXQsQmFzaWNEZXB0aFBhY2tpbmc6ZGQsQmFzaWNTaGFkb3dNYXA6dnMsQmF0Y2hlZE1lc2g6V3AsQm9uZTpCaCxCb29sZWFuS2V5ZnJhbWVUcmFjazppcixCb3gyOm4xLEJveDM6RHQsQm94M0hlbHBlcjpwMSxCb3hHZW9tZXRyeTpZaSxCb3hIZWxwZXI6ZDEsQnVmZmVyQXR0cmlidXRlOktlLEJ1ZmZlckdlb21ldHJ5OmtlLEJ1ZmZlckdlb21ldHJ5TG9hZGVyOldtLEJ5dGVUeXBlOm5kLENhY2hlOnNyLENhbWVyYTpfbyxDYW1lcmFIZWxwZXI6ZjEsQ2FudmFzVGV4dHVyZTp6UyxDYXBzdWxlR2VvbWV0cnk6SG8sQ2F0bXVsbFJvbUN1cnZlMzp0bSxDaW5lb25Ub25lTWFwcGluZzpRZixDaXJjbGVHZW9tZXRyeTpXbyxDbGFtcFRvRWRnZVdyYXBwaW5nOnp0LENsb2NrOlptLENvbG9yOnllLENvbG9yS2V5ZnJhbWVUcmFjazphdSxDb2xvck1hbmFnZW1lbnQ6b3QsQ29tcHJlc3NlZEFycmF5VGV4dHVyZTpPUyxDb21wcmVzc2VkQ3ViZVRleHR1cmU6QlMsQ29tcHJlc3NlZFRleHR1cmU6em8sQ29tcHJlc3NlZFRleHR1cmVMb2FkZXI6dmIsQ29uZUdlb21ldHJ5OlhvLENvbnN0YW50QWxwaGFGYWN0b3I6emYsQ29uc3RhbnRDb2xvckZhY3RvcjpPZixDdWJlQ2FtZXJhOnFkLEN1YmVSZWZsZWN0aW9uTWFwcGluZzpLbixDdWJlUmVmcmFjdGlvbk1hcHBpbmc6eWksQ3ViZVRleHR1cmU6WHMsQ3ViZVRleHR1cmVMb2FkZXI6TWIsQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6YnIsQ3ViaWNCZXppZXJDdXJ2ZTpZaCxDdWJpY0JlemllckN1cnZlMzppbSxDdWJpY0ludGVycG9sYW50OkNtLEN1bGxGYWNlQmFjazpNcixDdWxsRmFjZUZyb250OlVhLEN1bGxGYWNlRnJvbnRCYWNrOmxjLEN1bGxGYWNlTm9uZTpzbixDdXJ2ZTpGbixDdXJ2ZVBhdGg6c20sQ3VzdG9tQmxlbmRpbmc6RWYsQ3VzdG9tVG9uZU1hcHBpbmc6ZWQsQ3lsaW5kZXJHZW9tZXRyeTpucyxDeWxpbmRyaWNhbDp0MSxEYXRhM0RUZXh0dXJlOnNoLERhdGFBcnJheVRleHR1cmU6SmEsRGF0YVRleHR1cmU6amksRGF0YVRleHR1cmVMb2FkZXI6U2IsRGF0YVV0aWxzOl94LERlY3JlbWVudFN0ZW5jaWxPcDp5XyxEZWNyZW1lbnRXcmFwU3RlbmNpbE9wOk1fLERlZmF1bHRMb2FkaW5nTWFuYWdlcjpMbSxEZXB0aEZvcm1hdDpTaSxEZXB0aFN0ZW5jaWxGb3JtYXQ6emksRGVwdGhUZXh0dXJlOkNoLERldGFjaGVkQmluZE1vZGU6dGQsRGlyZWN0aW9uYWxMaWdodDpCbSxEaXJlY3Rpb25hbExpZ2h0SGVscGVyOnUxLERpc2NyZXRlSW50ZXJwb2xhbnQ6Um0sRGlzcGxheVAzQ29sb3JTcGFjZTpxYSxEb2RlY2FoZWRyb25HZW9tZXRyeTpxbyxEb3VibGVTaWRlOkduLERzdEFscGhhRmFjdG9yOklmLERzdENvbG9yRmFjdG9yOkRmLER5bmFtaWNDb3B5VXNhZ2U6Rl8sRHluYW1pY0RyYXdVc2FnZTpQXyxEeW5hbWljUmVhZFVzYWdlOlVfLEVkZ2VzR2VvbWV0cnk6YW0sRWxsaXBzZUN1cnZlOmtvLEVxdWFsQ29tcGFyZTp4ZCxFcXVhbERlcHRoOldmLEVxdWFsU3RlbmNpbEZ1bmM6RV8sRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6YnMsRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6d3MsRXVsZXI6R3MsRXZlbnREaXNwYXRjaGVyOmVpLEV4dHJ1ZGVHZW9tZXRyeTpkbSxGaWxlTG9hZGVyOmNpLEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGU6YngsRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTpTZSxGbG9hdDY0QnVmZmVyQXR0cmlidXRlOnd4LEZsb2F0VHlwZTpSbixGb2c6RW8sRm9nRXhwMjp3byxGcmFtZWJ1ZmZlclRleHR1cmU6RlMsRnJvbnRTaWRlOlluLEZydXN0dW06cXMsR0xCdWZmZXJBdHRyaWJ1dGU6UWIsR0xTTDE6Ql8sR0xTTDM6UWMsR3JlYXRlckNvbXBhcmU6eWQsR3JlYXRlckRlcHRoOnFmLEdyZWF0ZXJFcXVhbENvbXBhcmU6TWQsR3JlYXRlckVxdWFsRGVwdGg6WGYsR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM6Ul8sR3JlYXRlclN0ZW5jaWxGdW5jOlRfLEdyaWRIZWxwZXI6YzEsR3JvdXA6WXIsSGFsZkZsb2F0VHlwZTp3cixIZW1pc3BoZXJlTGlnaHQ6SW0sSGVtaXNwaGVyZUxpZ2h0SGVscGVyOmwxLEljb3NhaGVkcm9uR2VvbWV0cnk6am8sSW1hZ2VCaXRtYXBMb2FkZXI6UmIsSW1hZ2VMb2FkZXI6cGEsSW1hZ2VVdGlsczppaCxJbmNyZW1lbnRTdGVuY2lsT3A6eF8sSW5jcmVtZW50V3JhcFN0ZW5jaWxPcDp2XyxJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6anIsSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk6SG0sSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6S2IsSW5zdGFuY2VkTWVzaDpHcCxJbnQxNkJ1ZmZlckF0dHJpYnV0ZTpNeCxJbnQzMkJ1ZmZlckF0dHJpYnV0ZTpTeCxJbnQ4QnVmZmVyQXR0cmlidXRlOnh4LEludFR5cGU6Z2MsSW50ZXJsZWF2ZWRCdWZmZXI6QW8sSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6UWksSW50ZXJwb2xhbnQ6aGEsSW50ZXJwb2xhdGVEaXNjcmV0ZTpDcyxJbnRlcnBvbGF0ZUxpbmVhcjpScyxJbnRlcnBvbGF0ZVNtb290aDpXYSxJbnZlcnRTdGVuY2lsT3A6U18sS2VlcFN0ZW5jaWxPcDpWaSxLZXlmcmFtZVRyYWNrOk9uLExPRDpMcCxMYXRoZUdlb21ldHJ5OnJhLExheWVyczppbyxMZXNzQ29tcGFyZTpfZCxMZXNzRGVwdGg6SGYsTGVzc0VxdWFsQ29tcGFyZTpLYyxMZXNzRXF1YWxEZXB0aDpNcyxMZXNzRXF1YWxTdGVuY2lsRnVuYzpBXyxMZXNzU3RlbmNpbEZ1bmM6d18sTGlnaHQ6TmksTGlnaHRQcm9iZTpWbSxMaW5lOlVpLExpbmUzOmkxLExpbmVCYXNpY01hdGVyaWFsOkt0LExpbmVDdXJ2ZTpaaCxMaW5lQ3VydmUzOnJtLExpbmVEYXNoZWRNYXRlcmlhbDpFbSxMaW5lTG9vcDpKcCxMaW5lU2VnbWVudHM6V24sTGluZWFyRGlzcGxheVAzQ29sb3JTcGFjZTpMcyxMaW5lYXJFbmNvZGluZzpaYyxMaW5lYXJGaWx0ZXI6d3QsTGluZWFySW50ZXJwb2xhbnQ6c3UsTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyOmZfLExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXI6dV8sTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOnZpLExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6bWMsTGluZWFyU1JHQkNvbG9yU3BhY2U6Vm4sTGluZWFyVG9uZU1hcHBpbmc6SmYsTGluZWFyVHJhbnNmZXI6SXMsTG9hZGVyOnVuLExvYWRlclV0aWxzOnV1LExvYWRpbmdNYW5hZ2VyOm91LExvb3BPbmNlOmhkLExvb3BQaW5nUG9uZzpmZCxMb29wUmVwZWF0OnVkLEx1bWluYW5jZUFscGhhRm9ybWF0OmFkLEx1bWluYW5jZUZvcm1hdDpzZCxNT1VTRTpSdCxNYXRlcmlhbDpIdCxNYXRlcmlhbExvYWRlcjphbCxNYXRoVXRpbHM6al8sTWF0cml4MzpaZSxNYXRyaXg0OkllLE1heEVxdWF0aW9uOmRjLE1lc2g6THQsTWVzaEJhc2ljTWF0ZXJpYWw6UGksTWVzaERlcHRoTWF0ZXJpYWw6TGgsTWVzaERpc3RhbmNlTWF0ZXJpYWw6SWgsTWVzaExhbWJlcnRNYXRlcmlhbDpibSxNZXNoTWF0Y2FwTWF0ZXJpYWw6d20sTWVzaE5vcm1hbE1hdGVyaWFsOlNtLE1lc2hQaG9uZ01hdGVyaWFsOnZtLE1lc2hQaHlzaWNhbE1hdGVyaWFsOnltLE1lc2hTdGFuZGFyZE1hdGVyaWFsOm51LE1lc2hUb29uTWF0ZXJpYWw6TW0sTWluRXF1YXRpb246ZmMsTWlycm9yZWRSZXBlYXRXcmFwcGluZzpBcyxNaXhPcGVyYXRpb246WWYsTXVsdGlwbHlCbGVuZGluZzp1YyxNdWx0aXBseU9wZXJhdGlvbjpTcyxOZWFyZXN0RmlsdGVyOmJ0LE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI6aF8sTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXI6Y18sTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjpUcyxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcjpPYSxOZXZlckNvbXBhcmU6Z2QsTmV2ZXJEZXB0aDpHZixOZXZlclN0ZW5jaWxGdW5jOmJfLE5vQmxlbmRpbmc6Wm4sTm9Db2xvclNwYWNlOmduLE5vVG9uZU1hcHBpbmc6Sm4sTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlOlhhLE5vcm1hbEJsZW5kaW5nOkJpLE5vdEVxdWFsQ29tcGFyZTp2ZCxOb3RFcXVhbERlcHRoOiRmLE5vdEVxdWFsU3RlbmNpbEZ1bmM6Q18sTnVtYmVyS2V5ZnJhbWVUcmFjazp1YSxPYmplY3QzRDpydCxPYmplY3RMb2FkZXI6VGIsT2JqZWN0U3BhY2VOb3JtYWxNYXA6bWQsT2N0YWhlZHJvbkdlb21ldHJ5OmxhLE9uZUZhY3RvcjpSZixPbmVNaW51c0NvbnN0YW50QWxwaGFGYWN0b3I6a2YsT25lTWludXNDb25zdGFudENvbG9yRmFjdG9yOkJmLE9uZU1pbnVzRHN0QWxwaGFGYWN0b3I6VWYsT25lTWludXNEc3RDb2xvckZhY3RvcjpOZixPbmVNaW51c1NyY0FscGhhRmFjdG9yOk5hLE9uZU1pbnVzU3JjQ29sb3JGYWN0b3I6TGYsT3J0aG9ncmFwaGljQ2FtZXJhOnZvLFAzUHJpbWFyaWVzOkRzLFBDRlNoYWRvd01hcDpDbixQQ0ZTb2Z0U2hhZG93TWFwOlNyLFBNUkVNR2VuZXJhdG9yOkFoLFBhdGg6aWEsUGVyc3BlY3RpdmVDYW1lcmE6QnQsUGxhbmU6TGksUGxhbmVHZW9tZXRyeTokcyxQbGFuZUhlbHBlcjptMSxQb2ludExpZ2h0Ok9tLFBvaW50TGlnaHRIZWxwZXI6YTEsUG9pbnRzOlFwLFBvaW50c01hdGVyaWFsOlZoLFBvbGFyR3JpZEhlbHBlcjpoMSxQb2x5aGVkcm9uR2VvbWV0cnk6RGksUG9zaXRpb25hbEF1ZGlvOk5iLFByb3BlcnR5QmluZGluZzpudCxQcm9wZXJ0eU1peGVyOmVnLFF1YWRyYXRpY0JlemllckN1cnZlOkpoLFF1YWRyYXRpY0JlemllckN1cnZlMzpLaCxRdWF0ZXJuaW9uOmxuLFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrOnJzLFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudDpQbSxSRURfR1JFRU5fUkdUQzJfRm9ybWF0OnFjLFJFRF9SR1RDMV9Gb3JtYXQ6Y2QsUkVWSVNJT046ZnQsUkdCQURlcHRoUGFja2luZzpwZCxSR0JBRm9ybWF0OmFuLFJHQkFJbnRlZ2VyRm9ybWF0Ok1jLFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ6a2MsUkdCQV9BU1RDXzEweDVfRm9ybWF0Ok9jLFJHQkFfQVNUQ18xMHg2X0Zvcm1hdDpCYyxSR0JBX0FTVENfMTB4OF9Gb3JtYXQ6emMsUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdDpHYyxSR0JBX0FTVENfMTJ4MTJfRm9ybWF0OlZjLFJHQkFfQVNUQ180eDRfRm9ybWF0OlJjLFJHQkFfQVNUQ181eDRfRm9ybWF0OlBjLFJHQkFfQVNUQ181eDVfRm9ybWF0OkxjLFJHQkFfQVNUQ182eDVfRm9ybWF0OkljLFJHQkFfQVNUQ182eDZfRm9ybWF0OlVjLFJHQkFfQVNUQ184eDVfRm9ybWF0OkRjLFJHQkFfQVNUQ184eDZfRm9ybWF0Ok5jLFJHQkFfQVNUQ184eDhfRm9ybWF0OkZjLFJHQkFfQlBUQ19Gb3JtYXQ6SGEsUkdCQV9FVEMyX0VBQ19Gb3JtYXQ6Q2MsUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0OkVjLFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdDp3YyxSR0JBX1MzVENfRFhUMV9Gb3JtYXQ6a2EsUkdCQV9TM1RDX0RYVDNfRm9ybWF0OkdhLFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdDpWYSxSR0JfQlBUQ19TSUdORURfRm9ybWF0OkhjLFJHQl9CUFRDX1VOU0lHTkVEX0Zvcm1hdDpXYyxSR0JfRVRDMV9Gb3JtYXQ6QWMsUkdCX0VUQzJfRm9ybWF0OlRjLFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0OmJjLFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0OlNjLFJHQl9TM1RDX0RYVDFfRm9ybWF0OnphLFJHRm9ybWF0OmxkLFJHSW50ZWdlckZvcm1hdDp2YyxSYXdTaGFkZXJNYXRlcmlhbDp4bSxSYXk6VXIsUmF5Y2FzdGVyOmpiLFJlYzcwOVByaW1hcmllczpVcyxSZWN0QXJlYUxpZ2h0OmttLFJlZEZvcm1hdDpvZCxSZWRJbnRlZ2VyRm9ybWF0OnljLFJlaW5oYXJkVG9uZU1hcHBpbmc6S2YsUmVuZGVyVGFyZ2V0OlJkLFJlcGVhdFdyYXBwaW5nOkVzLFJlcGxhY2VTdGVuY2lsT3A6X18sUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb246VGYsUmluZ0dlb21ldHJ5OmVsLFNJR05FRF9SRURfR1JFRU5fUkdUQzJfRm9ybWF0OiRjLFNJR05FRF9SRURfUkdUQzFfRm9ybWF0OlhjLFNSR0JDb2xvclNwYWNlOlB0LFNSR0JUcmFuc2ZlcjpjdCxTY2VuZTpFcCxTaGFkZXJDaHVuazokZSxTaGFkZXJMaWI6Tm4sU2hhZGVyTWF0ZXJpYWw6SG4sU2hhZG93TWF0ZXJpYWw6X20sU2hhcGU6b2ksU2hhcGVHZW9tZXRyeTp0bCxTaGFwZVBhdGg6eDEsU2hhcGVVdGlsczp2bixTaG9ydFR5cGU6aWQsU2tlbGV0b246SW8sU2tlbGV0b25IZWxwZXI6czEsU2tpbm5lZE1lc2g6T3AsU291cmNlOldpLFNwaGVyZTpHdCxTcGhlcmVHZW9tZXRyeTpjYSxTcGhlcmljYWw6ZTEsU3BoZXJpY2FsSGFybW9uaWNzMzpHbSxTcGxpbmVDdXJ2ZTpRaCxTcG90TGlnaHQ6Tm0sU3BvdExpZ2h0SGVscGVyOnIxLFNwcml0ZTpScCxTcHJpdGVNYXRlcmlhbDpEaCxTcmNBbHBoYUZhY3RvcjpEYSxTcmNBbHBoYVNhdHVyYXRlRmFjdG9yOkZmLFNyY0NvbG9yRmFjdG9yOlBmLFN0YXRpY0NvcHlVc2FnZTpOXyxTdGF0aWNEcmF3VXNhZ2U6TnMsU3RhdGljUmVhZFVzYWdlOklfLFN0ZXJlb0NhbWVyYTpMYixTdHJlYW1Db3B5VXNhZ2U6T18sU3RyZWFtRHJhd1VzYWdlOkxfLFN0cmVhbVJlYWRVc2FnZTpEXyxTdHJpbmdLZXlmcmFtZVRyYWNrOnJyLFN1YnRyYWN0RXF1YXRpb246QWYsU3VidHJhY3RpdmVCbGVuZGluZzpoYyxUT1VDSDpTdCxUYW5nZW50U3BhY2VOb3JtYWxNYXA6d2ksVGV0cmFoZWRyb25HZW9tZXRyeTpubCxUZXh0dXJlOkV0LFRleHR1cmVMb2FkZXI6YmIsVG9ydXNHZW9tZXRyeTppbCxUb3J1c0tub3RHZW9tZXRyeTpybCxUcmlhbmdsZTpjbixUcmlhbmdsZUZhbkRyYXdNb2RlOm1fLFRyaWFuZ2xlU3RyaXBEcmF3TW9kZTpwXyxUcmlhbmdsZXNEcmF3TW9kZTpkXyxUdWJlR2VvbWV0cnk6c2wsVHdvUGFzc0RvdWJsZVNpZGU6bF8sVVZNYXBwaW5nOkZhLFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZTpfaCxVaW50MzJCdWZmZXJBdHRyaWJ1dGU6eGgsVWludDhCdWZmZXJBdHRyaWJ1dGU6eXgsVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlOnZ4LFVuaWZvcm06bXUsVW5pZm9ybXNHcm91cDpKYixVbmlmb3Jtc0xpYjpfZSxVbmlmb3Jtc1V0aWxzOlhkLFVuc2lnbmVkQnl0ZVR5cGU6UW4sVW5zaWduZWRJbnQyNDhUeXBlOk1pLFVuc2lnbmVkSW50VHlwZTpqbixVbnNpZ25lZFNob3J0NDQ0NFR5cGU6X2MsVW5zaWduZWRTaG9ydDU1NTFUeXBlOnhjLFVuc2lnbmVkU2hvcnRUeXBlOkJhLFZTTVNoYWRvd01hcDprbixWZWN0b3IyOnEsVmVjdG9yMzpQLFZlY3RvcjQ6bHQsVmVjdG9yS2V5ZnJhbWVUcmFjazpmYSxWaWRlb1RleHR1cmU6TlMsV2ViR0wxUmVuZGVyZXI6d3AsV2ViR0wzRFJlbmRlclRhcmdldDpzeCxXZWJHTEFycmF5UmVuZGVyVGFyZ2V0OnJ4LFdlYkdMQ29vcmRpbmF0ZVN5c3RlbTpQbixXZWJHTEN1YmVSZW5kZXJUYXJnZXQ6JGQsV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM6YXgsV2ViR0xSZW5kZXJUYXJnZXQ6TG4sV2ViR0xSZW5kZXJlcjpicCxXZWJHTFV0aWxzOk1wLFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW06RXIsV2lyZWZyYW1lR2VvbWV0cnk6cG0sV3JhcEFyb3VuZEVuZGluZzpQcyxaZXJvQ3VydmF0dXJlRW5kaW5nOmtpLFplcm9GYWN0b3I6Q2YsWmVyb1Nsb3BlRW5kaW5nOkdpLFplcm9TdGVuY2lsT3A6Z18sX1NSR0JBRm9ybWF0OiRhLGNyZWF0ZUNhbnZhc0VsZW1lbnQ6RWQsc1JHQkVuY29kaW5nOmJpfSk7Y29uc3QgdXI9bmV3IE1hcCx2MT0ocj17fSk9Pih7Z2VuZXJhdGVUb3BVVihlLHQsbixpLHMpe2NvbnN0IGE9dFtuKjNdLG89dFtuKjMrMV0sbD10W2kqM10sYz10W2kqMysxXSxoPXRbcyozXSx1PXRbcyozKzFdO2xldCBmO2lmKHVyLmhhcyhlKSlmPXVyLmdldChlKTtlbHNle2xldCBnPXIuYm94MztpZighZyl7Zz1uZXcgRHQ7Y29uc3QgeD1lLnBhcmFtZXRlcnMuc2hhcGVzLmdldFBvaW50cygpLm1hcCh2PT5bdi54LHYueSwwXSkuZmxhdCgpO2cuc2V0RnJvbUFycmF5KHgpfWNvbnN0IG09Zy5nZXRTaXplKG5ldyBQKTtyLnNwbGl0JiYobS55Lz1yLnNwbGl0KSxmPXtib3g6ZyxzaXplOm19LHVyLnNldChlLGYpfWNvbnN0e2JveDpkLHNpemU6cH09ZixfPXIuc3BsaXQ/MS1yLnNwbGl0OjA7cmV0dXJuW25ldyBxKChhLWQubWluLngpL3AueCwoby1kLm1pbi55KS9wLnkrXyksbmV3IHEoKGwtZC5taW4ueCkvcC54LChjLWQubWluLnkpL3AueStfKSxuZXcgcSgoaC1kLm1pbi54KS9wLngsKHUtZC5taW4ueSkvcC55K18pXX0sZ2VuZXJhdGVTaWRlV2FsbFVWKGUsdCxuLGkscyxhKXtjb25zdCBvPXRbbiozXSxsPXRbbiozKzFdLGM9dFtuKjMrMl0saD10W2kqM10sdT10W2kqMysxXSxmPXRbaSozKzJdLGQ9dFtzKjNdLHA9dFtzKjMrMV0sXz10W3MqMysyXSxnPXRbYSozXSxtPXRbYSozKzFdLHk9dFthKjMrMl07bGV0IHg7aWYodXIuaGFzKHQpKXg9dXIuZ2V0KHQpO2Vsc2V7Y29uc3QgYj1uZXcgRHQ7Yi5zZXRGcm9tQXJyYXkodCk7Y29uc3QgQT1iLmdldFNpemUobmV3IFApO3Iuc3BsaXQmJihBLnovPTEtci5zcGxpdCkseD17Ym94OmIsc2l6ZTpBfSx1ci5zZXQodCx4KX1jb25zdHtib3g6dixzaXplOlN9PXg7cmV0dXJuIE1hdGguYWJzKGwtdSk8TWF0aC5hYnMoby1oKT9bbmV3IHEoKG8tdi5taW4ueCkvUy54LChjLXYubWluLnopL1MueiksbmV3IHEoKGgtdi5taW4ueCkvUy54LChmLXYubWluLnopL1MueiksbmV3IHEoKGQtdi5taW4ueCkvUy54LChfLXYubWluLnopL1MueiksbmV3IHEoKGctdi5taW4ueCkvUy54LCh5LXYubWluLnopL1MueildOltuZXcgcSgobC12Lm1pbi55KS9TLnksKGMtdi5taW4ueikvUy56KSxuZXcgcSgodS12Lm1pbi55KS9TLnksKGYtdi5taW4ueikvUy56KSxuZXcgcSgocC12Lm1pbi55KS9TLnksKF8tdi5taW4ueikvUy56KSxuZXcgcSgobS12Lm1pbi55KS9TLnksKHktdi5taW4ueikvUy56KV19fSksTTE9KCk9Pnt1ci5jbGVhcigpfTtjbGFzcyB5dSBleHRlbmRzIGtle2NvbnN0cnVjdG9yKGU9bmV3IG9pKFtuZXcgcSguNSwuNSksbmV3IHEoLS41LC41KSxuZXcgcSgtLjUsLS41KSxuZXcgcSguNSwtLjUpXSksdD17fSl7c3VwZXIoKSx0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6ZSxvcHRpb25zOnR9LGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtjb25zdCBuPXRoaXMsaT1bXSxzPVtdO2ZvcihsZXQgbz0wLGw9ZS5sZW5ndGg7bzxsO28rKyl7Y29uc3QgYz1lW29dO2EoYyl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoaSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU2UocywyKSksdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO2Z1bmN0aW9uIGEobyl7dmFyIHVlLHJlLENlO2NvbnN0IGw9W10sYz10LmN1cnZlU2VnbWVudHMhPT12b2lkIDA/dC5jdXJ2ZVNlZ21lbnRzOjEyLGg9dC5zdGVwcyE9PXZvaWQgMD90LnN0ZXBzOjEsdT10LmRlcHRoIT09dm9pZCAwP3QuZGVwdGg6MTtsZXQgZj10LmJldmVsRW5hYmxlZCE9PXZvaWQgMD90LmJldmVsRW5hYmxlZDohMCxkPXQuYmV2ZWxUaGlja25lc3MhPT12b2lkIDA/dC5iZXZlbFRoaWNrbmVzczouMixwPXQuYmV2ZWxTaXplIT09dm9pZCAwP3QuYmV2ZWxTaXplOmQtLjEsXz10LmJldmVsT2Zmc2V0IT09dm9pZCAwP3QuYmV2ZWxPZmZzZXQ6MCxnPXQuYmV2ZWxTZWdtZW50cyE9PXZvaWQgMD90LmJldmVsU2VnbWVudHM6Mztjb25zdCBtPXQuZXh0cnVkZVBhdGgseT10LlVWR2VuZXJhdG9yIT09dm9pZCAwP3QuVVZHZW5lcmF0b3I6UzEseD0odWU9dC5oYXNUb3ApIT1udWxsP3VlOiEwLHY9KHJlPXQuaGFzQm90dG9tKSE9bnVsbD9yZTohMCxTPShDZT10Lmhhc1NpZGUpIT1udWxsP0NlOiEwO2xldCBiLEE9ITEsTCxNLHcsUjttJiYoYj1tLmdldFNwYWNlZFBvaW50cyhoKSxBPSEwLGY9ITEsTD1tLmNvbXB1dGVGcmVuZXRGcmFtZXMoaCwhMSksTT1uZXcgUCx3PW5ldyBQLFI9bmV3IFApLGZ8fChnPTAsZD0wLHA9MCxfPTApO2NvbnN0IE49by5leHRyYWN0UG9pbnRzKGMpO2xldCBCPU4uc2hhcGU7Y29uc3QgST1OLmhvbGVzO2lmKCF2bi5pc0Nsb2NrV2lzZShCKSl7Qj1CLnJldmVyc2UoKTtmb3IobGV0IFc9MCxKPUkubGVuZ3RoO1c8SjtXKyspe2NvbnN0IGllPUlbV107dm4uaXNDbG9ja1dpc2UoaWUpJiYoSVtXXT1pZS5yZXZlcnNlKCkpfX1jb25zdCB6PXZuLnRyaWFuZ3VsYXRlU2hhcGUoQixJKSxGPUI7Zm9yKGxldCBXPTAsSj1JLmxlbmd0aDtXPEo7VysrKXtjb25zdCBpZT1JW1ddO0I9Qi5jb25jYXQoaWUpfWZ1bmN0aW9uIFooVyxKLGllKXtyZXR1cm4gSnx8Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QiKSxXLmNsb25lKCkuYWRkU2NhbGVkVmVjdG9yKEosaWUpfWNvbnN0IFY9Qi5sZW5ndGgsUT16Lmxlbmd0aDtmdW5jdGlvbiBuZShXLEosaWUpe2xldCBtZSxwZSxDO2NvbnN0IEU9Vy54LUoueCxrPVcueS1KLnksc2U9aWUueC1XLngsdGU9aWUueS1XLnksYWU9RSpFK2sqayxBZT1FKnRlLWsqc2U7aWYoTWF0aC5hYnMoQWUpPk51bWJlci5FUFNJTE9OKXtjb25zdCBvZT1NYXRoLnNxcnQoYWUpLHhlPU1hdGguc3FydChzZSpzZSt0ZSp0ZSksRGU9Si54LWsvb2UsdHQ9Si55K0Uvb2UsY2U9aWUueC10ZS94ZSxhdD1pZS55K3NlL3hlLFZlPSgoY2UtRGUpKnRlLShhdC10dCkqc2UpLyhFKnRlLWsqc2UpO21lPURlK0UqVmUtVy54LHBlPXR0K2sqVmUtVy55O2NvbnN0IE5lPW1lKm1lK3BlKnBlO2lmKE5lPD0yKXJldHVybiBuZXcgcShtZSxwZSk7Qz1NYXRoLnNxcnQoTmUvMil9ZWxzZXtsZXQgb2U9ITE7RT5OdW1iZXIuRVBTSUxPTj9zZT5OdW1iZXIuRVBTSUxPTiYmKG9lPSEwKTpFPC1OdW1iZXIuRVBTSUxPTj9zZTwtTnVtYmVyLkVQU0lMT04mJihvZT0hMCk6TWF0aC5zaWduKGspPT09TWF0aC5zaWduKHRlKSYmKG9lPSEwKSxvZT8obWU9LWsscGU9RSxDPU1hdGguc3FydChhZSkpOihtZT1FLHBlPWssQz1NYXRoLnNxcnQoYWUvMikpfXJldHVybiBuZXcgcShtZS9DLHBlL0MpfWNvbnN0IGZlPVtdO2ZvcihsZXQgVz0wLEo9Ri5sZW5ndGgsaWU9Si0xLG1lPVcrMTtXPEo7VysrLGllKyssbWUrKylpZT09PUomJihpZT0wKSxtZT09PUomJihtZT0wKSxmZVtXXT1uZShGW1ddLEZbaWVdLEZbbWVdKTtjb25zdCAkPVtdO2xldCBlZSxkZT1mZS5jb25jYXQoKTtmb3IobGV0IFc9MCxKPUkubGVuZ3RoO1c8SjtXKyspe2NvbnN0IGllPUlbV107ZWU9W107Zm9yKGxldCBtZT0wLHBlPWllLmxlbmd0aCxDPXBlLTEsRT1tZSsxO21lPHBlO21lKyssQysrLEUrKylDPT09cGUmJihDPTApLEU9PT1wZSYmKEU9MCksZWVbbWVdPW5lKGllW21lXSxpZVtDXSxpZVtFXSk7JC5wdXNoKGVlKSxkZT1kZS5jb25jYXQoZWUpfWZvcihsZXQgVz0wO1c8ZztXKyspe2NvbnN0IEo9Vy9nLGllPWQqTWF0aC5jb3MoSipNYXRoLlBJLzIpLG1lPXAqTWF0aC5zaW4oSipNYXRoLlBJLzIpK187Zm9yKGxldCBwZT0wLEM9Ri5sZW5ndGg7cGU8QztwZSsrKXtjb25zdCBFPVooRltwZV0sZmVbcGVdLG1lKTt3ZShFLngsRS55LC1pZSl9Zm9yKGxldCBwZT0wLEM9SS5sZW5ndGg7cGU8QztwZSsrKXtjb25zdCBFPUlbcGVdO2VlPSRbcGVdO2ZvcihsZXQgaz0wLHNlPUUubGVuZ3RoO2s8c2U7aysrKXtjb25zdCB0ZT1aKEVba10sZWVba10sbWUpO3dlKHRlLngsdGUueSwtaWUpfX19Y29uc3QgVGU9cCtfO2ZvcihsZXQgVz0wO1c8VjtXKyspe2NvbnN0IEo9Zj9aKEJbV10sZGVbV10sVGUpOkJbV107QT8ody5jb3B5KEwubm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoSi54KSxNLmNvcHkoTC5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKEoueSksUi5jb3B5KGJbMF0pLmFkZCh3KS5hZGQoTSksd2UoUi54LFIueSxSLnopKTp3ZShKLngsSi55LDApfWZvcihsZXQgVz0xO1c8PWg7VysrKWZvcihsZXQgSj0wO0o8VjtKKyspe2NvbnN0IGllPWY/WihCW0pdLGRlW0pdLFRlKTpCW0pdO0E/KHcuY29weShMLm5vcm1hbHNbV10pLm11bHRpcGx5U2NhbGFyKGllLngpLE0uY29weShMLmJpbm9ybWFsc1tXXSkubXVsdGlwbHlTY2FsYXIoaWUueSksUi5jb3B5KGJbV10pLmFkZCh3KS5hZGQoTSksd2UoUi54LFIueSxSLnopKTp3ZShpZS54LGllLnksdS9oKlcpfWZvcihsZXQgVz1nLTE7Vz49MDtXLS0pe2NvbnN0IEo9Vy9nLGllPWQqTWF0aC5jb3MoSipNYXRoLlBJLzIpLG1lPXAqTWF0aC5zaW4oSipNYXRoLlBJLzIpK187Zm9yKGxldCBwZT0wLEM9Ri5sZW5ndGg7cGU8QztwZSsrKXtjb25zdCBFPVooRltwZV0sZmVbcGVdLG1lKTt3ZShFLngsRS55LHUraWUpfWZvcihsZXQgcGU9MCxDPUkubGVuZ3RoO3BlPEM7cGUrKyl7Y29uc3QgRT1JW3BlXTtlZT0kW3BlXTtmb3IobGV0IGs9MCxzZT1FLmxlbmd0aDtrPHNlO2srKyl7Y29uc3QgdGU9WihFW2tdLGVlW2tdLG1lKTtBP3dlKHRlLngsdGUueStiW2gtMV0ueSxiW2gtMV0ueCtpZSk6d2UodGUueCx0ZS55LHUraWUpfX19YmUoKSxTJiZPZSgpO2Z1bmN0aW9uIGJlKCl7Y29uc3QgVz1pLmxlbmd0aC8zO2lmKGYpe2xldCBKPTAsaWU9VipKO2lmKHYpZm9yKGxldCBtZT0wO21lPFE7bWUrKyl7Y29uc3QgcGU9elttZV07UGUocGVbMl0raWUscGVbMV0raWUscGVbMF0raWUpfWlmKEo9aCtnKjIsaWU9VipKLHgpZm9yKGxldCBtZT0wO21lPFE7bWUrKyl7Y29uc3QgcGU9elttZV07UGUocGVbMF0raWUscGVbMV0raWUscGVbMl0raWUpfX1lbHNle2lmKHYpZm9yKGxldCBKPTA7SjxRO0orKyl7Y29uc3QgaWU9eltKXTtQZShpZVsyXSxpZVsxXSxpZVswXSl9aWYoeClmb3IobGV0IEo9MDtKPFE7SisrKXtjb25zdCBpZT16W0pdO1BlKGllWzBdK1YqaCxpZVsxXStWKmgsaWVbMl0rVipoKX19bi5hZGRHcm91cChXLGkubGVuZ3RoLzMtVywwKX1mdW5jdGlvbiBPZSgpe2NvbnN0IFc9aS5sZW5ndGgvMztsZXQgSj0wO0JlKEYsSiksSis9Ri5sZW5ndGg7Zm9yKGxldCBpZT0wLG1lPUkubGVuZ3RoO2llPG1lO2llKyspe2NvbnN0IHBlPUlbaWVdO0JlKHBlLEopLEorPXBlLmxlbmd0aH1uLmFkZEdyb3VwKFcsaS5sZW5ndGgvMy1XLDEpfWZ1bmN0aW9uIEJlKFcsSil7bGV0IGllPVcubGVuZ3RoO2Zvcig7LS1pZT49MDspe2NvbnN0IG1lPWllO2xldCBwZT1pZS0xO3BlPDAmJihwZT1XLmxlbmd0aC0xKTtmb3IobGV0IEM9MCxFPWgrZyoyO0M8RTtDKyspe2NvbnN0IGs9VipDLHNlPVYqKEMrMSksdGU9SittZStrLGFlPUorcGUrayxBZT1KK3BlK3NlLG9lPUorbWUrc2U7RCh0ZSxhZSxBZSxvZSl9fX1mdW5jdGlvbiB3ZShXLEosaWUpe2wucHVzaChXKSxsLnB1c2goSiksbC5wdXNoKGllKX1mdW5jdGlvbiBQZShXLEosaWUpe2xlKFcpLGxlKEopLGxlKGllKTtjb25zdCBtZT1pLmxlbmd0aC8zLHBlPXkuZ2VuZXJhdGVUb3BVVihuLGksbWUtMyxtZS0yLG1lLTEpO0socGVbMF0pLEsocGVbMV0pLEsocGVbMl0pfWZ1bmN0aW9uIEQoVyxKLGllLG1lKXtsZShXKSxsZShKKSxsZShtZSksbGUoSiksbGUoaWUpLGxlKG1lKTtjb25zdCBwZT1pLmxlbmd0aC8zLEM9eS5nZW5lcmF0ZVNpZGVXYWxsVVYobixpLHBlLTYscGUtMyxwZS0yLHBlLTEpO0soQ1swXSksSyhDWzFdKSxLKENbM10pLEsoQ1sxXSksSyhDWzJdKSxLKENbM10pfWZ1bmN0aW9uIGxlKFcpe2kucHVzaChsW1cqMyswXSksaS5wdXNoKGxbVyozKzFdKSxpLnB1c2gobFtXKjMrMl0pfWZ1bmN0aW9uIEsoVyl7cy5wdXNoKFcueCkscy5wdXNoKFcueSl9fX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LGUucGFyYW1ldGVycyksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpLHQ9dGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxuPXRoaXMucGFyYW1ldGVycy5vcHRpb25zO3JldHVybiBiMSh0LG4sZSl9c3RhdGljIGZyb21KU09OKGUsdCl7Y29uc3Qgbj1bXTtmb3IobGV0IHM9MCxhPWUuc2hhcGVzLmxlbmd0aDtzPGE7cysrKXtjb25zdCBvPXRbZS5zaGFwZXNbc11dO24ucHVzaChvKX1jb25zdCBpPWUub3B0aW9ucy5leHRydWRlUGF0aDtyZXR1cm4gY29uc29sZS5sb2coaS50eXBlKSxpIT09dm9pZCAwJiYoZS5vcHRpb25zLmV4dHJ1ZGVQYXRoPW5ldyB5MVtgJHtpLnR5cGV9Q3VydmVgXSgpLmZyb21KU09OKGkpKSxuZXcgeXUobixlLm9wdGlvbnMpfX1jb25zdCBTMT17Z2VuZXJhdGVUb3BVVjpmdW5jdGlvbihyLGUsdCxuLGkpe2NvbnN0IHM9ZVt0KjNdLGE9ZVt0KjMrMV0sbz1lW24qM10sbD1lW24qMysxXSxjPWVbaSozXSxoPWVbaSozKzFdO3JldHVybltuZXcgcShzLGEpLG5ldyBxKG8sbCksbmV3IHEoYyxoKV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihyLGUsdCxuLGkscyl7Y29uc3QgYT1lW3QqM10sbz1lW3QqMysxXSxsPWVbdCozKzJdLGM9ZVtuKjNdLGg9ZVtuKjMrMV0sdT1lW24qMysyXSxmPWVbaSozXSxkPWVbaSozKzFdLHA9ZVtpKjMrMl0sXz1lW3MqM10sZz1lW3MqMysxXSxtPWVbcyozKzJdO3JldHVybiBNYXRoLmFicyhvLWgpPE1hdGguYWJzKGEtYyk/W25ldyBxKGEsMS1sKSxuZXcgcShjLDEtdSksbmV3IHEoZiwxLXApLG5ldyBxKF8sMS1tKV06W25ldyBxKG8sMS1sKSxuZXcgcShoLDEtdSksbmV3IHEoZCwxLXApLG5ldyBxKGcsMS1tKV19fTtmdW5jdGlvbiBiMShyLGUsdCl7aWYodC5zaGFwZXM9W10sQXJyYXkuaXNBcnJheShyKSlmb3IobGV0IG49MCxpPXIubGVuZ3RoO248aTtuKyspe2NvbnN0IHM9cltuXTt0LnNoYXBlcy5wdXNoKHMudXVpZCl9ZWxzZSB0LnNoYXBlcy5wdXNoKHIudXVpZCk7cmV0dXJuIHQub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LGUpLGUuZXh0cnVkZVBhdGghPT12b2lkIDAmJih0Lm9wdGlvbnMuZXh0cnVkZVBhdGg9ZS5leHRydWRlUGF0aC50b0pTT04oKSksdH12YXIgdzE9cj0+e2NvbnN0e3NwbGl0OmUsZGVwdGg6dCxwb2ludHM6bixib3gzOmksaGFzVG9wOnMsaGFzQm90dG9tOmEsaGFzU2lkZTpvfT1yLGw9bmV3IHl1KG5ldyBvaShuKSx7ZGVwdGg6dCxiZXZlbEVuYWJsZWQ6ITEsVVZHZW5lcmF0b3I6djEoe3NwbGl0OmUsYm94MzppfSksaGFzVG9wOnMsaGFzQm90dG9tOmEsaGFzU2lkZTpvfSk7cmV0dXJuIE0xKCksbH07ZnVuY3Rpb24gRTEocixlLHQ9MCl7Y29uc3Qgbj0oOTAtZSkqTWF0aC5QSS8xODAsaT0oOTAtcikqTWF0aC5QSS8xODA7cmV0dXJuW3QqTWF0aC5zaW4obikqTWF0aC5jb3MoaSksdCpNYXRoLmNvcyhuKSx0Kk1hdGguc2luKG4pKk1hdGguc2luKGkpXX12YXIgQTE9KHIsZSx0KT0+bmV3IFByb21pc2UoKG4saSk9Pnt2YXIgcz1sPT57dHJ5e28odC5uZXh0KGwpKX1jYXRjaChjKXtpKGMpfX0sYT1sPT57dHJ5e28odC50aHJvdyhsKSl9Y2F0Y2goYyl7aShjKX19LG89bD0+bC5kb25lP24obC52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGwudmFsdWUpLnRoZW4ocyxhKTtvKCh0PXQuYXBwbHkocixlKSkubmV4dCgpKX0pO2Z1bmN0aW9uIHZ1KHIpe3RoaXMubWVzc2FnZT1yfHwicHJvbWlzZSBjYW5jZWxsZWQiLHRoaXMuc3RhY2s9bmV3IEVycm9yKCkuc3RhY2t9dnUucHJvdG90eXBlPW5ldyBFcnJvcix2dS5wcm90b3R5cGUuY29uc3RydWN0b3I9RXJyb3IsdnUucHJvdG90eXBlLm5hbWU9IkNhbmNlbGxhdGlvbkVycm9yIjtmdW5jdGlvbiBNdShyKXt0aGlzLm1lc3NhZ2U9cnx8InRpbWVvdXQgZXhjZWVkZWQiLHRoaXMuc3RhY2s9bmV3IEVycm9yKCkuc3RhY2t9TXUucHJvdG90eXBlPW5ldyBFcnJvcixNdS5wcm90b3R5cGUuY29uc3RydWN0b3I9RXJyb3IsTXUucHJvdG90eXBlLm5hbWU9IlRpbWVvdXRFcnJvciI7ZnVuY3Rpb24gZmcocil7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHIpLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyW3RdLGVudW1lcmFibGU6ITB9KX0se30pfWxldCBTdT1udWxsO2NvbnN0IFQxPXI9Pntjb25zdCBlPXtydW4odCxuKXtjb25zdCBpPW5ldyBGdW5jdGlvbigicmV0dXJuICgiK3QrIikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsiKTtyZXR1cm4gaS5hcHBseShpLG4pfSxtZXRob2RzKCl7cmV0dXJuIE9iamVjdC5rZXlzKGUpfX07YWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdD0+QTEodm9pZCAwLFt0XSxmdW5jdGlvbiooe2RhdGE6bn0pe3RyeXtjb25zdCBpPWVbbi5tZXRob2RdO2lmKGkpe1N1PW4uaWQ7dHJ5e2NvbnN0IHM9eWllbGQgaS5hcHBseShpLG4ucGFyYW1zKTtzLnRyYW5zZmVyJiZzLm1lc3NhZ2U/cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0OnMubWVzc2FnZSxlcnJvcjpudWxsfSxzLnRyYW5zZmVyKTpwb3N0TWVzc2FnZSh7aWQ6bi5pZCxyZXN1bHQ6cyxlcnJvcjpudWxsfSksU3U9bnVsbH1jYXRjaChzKXtwb3N0TWVzc2FnZSh7aWQ6bi5pZCxyZXN1bHQ6bnVsbCxlcnJvcjpmZyhzKX0pLFN1PW51bGx9fWVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1ldGhvZCAiJytuLm1ldGhvZCsnIicpfWNhdGNoKGkpe3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpudWxsLGVycm9yOmZnKGkpfSl9fSkpLE9iamVjdC5rZXlzKHIpLmZvckVhY2godD0+e2VbdF09clt0XX0pLHBvc3RNZXNzYWdlKCJyZWFkeSIpfTtmdW5jdGlvbiBwbChyLGUpe3JldHVybiByPT1udWxsfHxlPT1udWxsP05hTjpyPGU/LTE6cj5lPzE6cj49ZT8wOk5hTn1mdW5jdGlvbiBDMShyLGUpe3JldHVybiByPT1udWxsfHxlPT1udWxsP05hTjplPHI/LTE6ZT5yPzE6ZT49cj8wOk5hTn1mdW5jdGlvbiBkZyhyKXtsZXQgZSx0LG47ci5sZW5ndGghPT0yPyhlPXBsLHQ9KG8sbCk9PnBsKHIobyksbCksbj0obyxsKT0+cihvKS1sKTooZT1yPT09cGx8fHI9PT1DMT9yOlIxLHQ9cixuPXIpO2Z1bmN0aW9uIGkobyxsLGM9MCxoPW8ubGVuZ3RoKXtpZihjPGgpe2lmKGUobCxsKSE9PTApcmV0dXJuIGg7ZG97Y29uc3QgdT1jK2g+Pj4xO3Qob1t1XSxsKTwwP2M9dSsxOmg9dX13aGlsZShjPGgpfXJldHVybiBjfWZ1bmN0aW9uIHMobyxsLGM9MCxoPW8ubGVuZ3RoKXtpZihjPGgpe2lmKGUobCxsKSE9PTApcmV0dXJuIGg7ZG97Y29uc3QgdT1jK2g+Pj4xO3Qob1t1XSxsKTw9MD9jPXUrMTpoPXV9d2hpbGUoYzxoKX1yZXR1cm4gY31mdW5jdGlvbiBhKG8sbCxjPTAsaD1vLmxlbmd0aCl7Y29uc3QgdT1pKG8sbCxjLGgtMSk7cmV0dXJuIHU+YyYmbihvW3UtMV0sbCk+LW4ob1t1XSxsKT91LTE6dX1yZXR1cm57bGVmdDppLGNlbnRlcjphLHJpZ2h0OnN9fWZ1bmN0aW9uIFIxKCl7cmV0dXJuIDB9ZnVuY3Rpb24gUDEocil7cmV0dXJuIHI9PT1udWxsP05hTjorcn1jb25zdCBMMT1kZyhwbCkucmlnaHQ7ZGcoUDEpLmNlbnRlcjt2YXIgSTE9TDE7ZnVuY3Rpb24gbWwocixlKXtsZXQgdCxuO2lmKGU9PT12b2lkIDApZm9yKGNvbnN0IGkgb2YgcilpIT1udWxsJiYodD09PXZvaWQgMD9pPj1pJiYodD1uPWkpOih0PmkmJih0PWkpLG48aSYmKG49aSkpKTtlbHNle2xldCBpPS0xO2ZvcihsZXQgcyBvZiByKShzPWUocywrK2kscikpIT1udWxsJiYodD09PXZvaWQgMD9zPj1zJiYodD1uPXMpOih0PnMmJih0PXMpLG48cyYmKG49cykpKX1yZXR1cm5bdCxuXX1jbGFzcyBoaXtjb25zdHJ1Y3Rvcigpe3RoaXMuX3BhcnRpYWxzPW5ldyBGbG9hdDY0QXJyYXkoMzIpLHRoaXMuX249MH1hZGQoZSl7Y29uc3QgdD10aGlzLl9wYXJ0aWFscztsZXQgbj0wO2ZvcihsZXQgaT0wO2k8dGhpcy5fbiYmaTwzMjtpKyspe2NvbnN0IHM9dFtpXSxhPWUrcyxvPU1hdGguYWJzKGUpPE1hdGguYWJzKHMpP2UtKGEtcyk6cy0oYS1lKTtvJiYodFtuKytdPW8pLGU9YX1yZXR1cm4gdFtuXT1lLHRoaXMuX249bisxLHRoaXN9dmFsdWVPZigpe2NvbnN0IGU9dGhpcy5fcGFydGlhbHM7bGV0IHQ9dGhpcy5fbixuLGkscyxhPTA7aWYodD4wKXtmb3IoYT1lWy0tdF07dD4wJiYobj1hLGk9ZVstLXRdLGE9bitpLHM9aS0oYS1uKSwhcyk7KTt0PjAmJihzPDAmJmVbdC0xXTwwfHxzPjAmJmVbdC0xXT4wKSYmKGk9cyoyLG49YStpLGk9PW4tYSYmKGE9bikpfXJldHVybiBhfX1jb25zdCBVMT1NYXRoLnNxcnQoNTApLEQxPU1hdGguc3FydCgxMCksTjE9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIGdsKHIsZSx0KXtjb25zdCBuPShlLXIpL01hdGgubWF4KDAsdCksaT1NYXRoLmZsb29yKE1hdGgubG9nMTAobikpLHM9bi9NYXRoLnBvdygxMCxpKSxhPXM+PVUxPzEwOnM+PUQxPzU6cz49TjE/MjoxO2xldCBvLGwsYztyZXR1cm4gaTwwPyhjPU1hdGgucG93KDEwLC1pKS9hLG89TWF0aC5yb3VuZChyKmMpLGw9TWF0aC5yb3VuZChlKmMpLG8vYzxyJiYrK28sbC9jPmUmJi0tbCxjPS1jKTooYz1NYXRoLnBvdygxMCxpKSphLG89TWF0aC5yb3VuZChyL2MpLGw9TWF0aC5yb3VuZChlL2MpLG8qYzxyJiYrK28sbCpjPmUmJi0tbCksbDxvJiYuNTw9dCYmdDwyP2dsKHIsZSx0KjIpOltvLGwsY119ZnVuY3Rpb24gRjEocixlLHQpe2lmKGU9K2Uscj0rcix0PSt0LCEodD4wKSlyZXR1cm5bXTtpZihyPT09ZSlyZXR1cm5bcl07Y29uc3Qgbj1lPHIsW2kscyxhXT1uP2dsKGUscix0KTpnbChyLGUsdCk7aWYoIShzPj1pKSlyZXR1cm5bXTtjb25zdCBvPXMtaSsxLGw9bmV3IEFycmF5KG8pO2lmKG4paWYoYTwwKWZvcihsZXQgYz0wO2M8bzsrK2MpbFtjXT0ocy1jKS8tYTtlbHNlIGZvcihsZXQgYz0wO2M8bzsrK2MpbFtjXT0ocy1jKSphO2Vsc2UgaWYoYTwwKWZvcihsZXQgYz0wO2M8bzsrK2MpbFtjXT0oaStjKS8tYTtlbHNlIGZvcihsZXQgYz0wO2M8bzsrK2MpbFtjXT0oaStjKSphO3JldHVybiBsfWZ1bmN0aW9uIGJ1KHIsZSx0KXtyZXR1cm4gZT0rZSxyPStyLHQ9K3QsZ2wocixlLHQpWzJdfWZ1bmN0aW9uIE8xKHIsZSx0KXtlPStlLHI9K3IsdD0rdDtjb25zdCBuPWU8cixpPW4/YnUoZSxyLHQpOmJ1KHIsZSx0KTtyZXR1cm4obj8tMToxKSooaTwwPzEvLWk6aSl9ZnVuY3Rpb24gQjEocixlKXtsZXQgdD0wLG49MDtpZihlPT09dm9pZCAwKWZvcihsZXQgaSBvZiByKWkhPW51bGwmJihpPStpKT49aSYmKCsrdCxuKz1pKTtlbHNle2xldCBpPS0xO2ZvcihsZXQgcyBvZiByKShzPWUocywrK2kscikpIT1udWxsJiYocz0rcyk+PXMmJigrK3Qsbis9cyl9aWYodClyZXR1cm4gbi90fWZ1bmN0aW9uKnoxKHIpe2Zvcihjb25zdCBlIG9mIHIpeWllbGQqZX1mdW5jdGlvbiBnYShyKXtyZXR1cm4gQXJyYXkuZnJvbSh6MShyKSl9dmFyIHN0PTFlLTYsX2w9MWUtMTIsZXQ9TWF0aC5QSSxmbj1ldC8yLHhsPWV0LzQsZG49ZXQqMix5dD0xODAvZXQsR2U9ZXQvMTgwLGh0PU1hdGguYWJzLHd1PU1hdGguYXRhbixBbj1NYXRoLmF0YW4yLFdlPU1hdGguY29zLGsxPU1hdGguZXhwLEV1PU1hdGguaHlwb3QsRzE9TWF0aC5sb2csVWU9TWF0aC5zaW4sVjE9TWF0aC5zaWdufHxmdW5jdGlvbihyKXtyZXR1cm4gcj4wPzE6cjwwPy0xOjB9LHVpPU1hdGguc3FydCxIMT1NYXRoLnRhbjtmdW5jdGlvbiBXMShyKXtyZXR1cm4gcj4xPzA6cjwtMT9ldDpNYXRoLmFjb3Mocil9ZnVuY3Rpb24gZmkocil7cmV0dXJuIHI+MT9mbjpyPC0xPy1mbjpNYXRoLmFzaW4ocil9ZnVuY3Rpb24gcGcocil7cmV0dXJuKHI9VWUoci8yKSkqcn1mdW5jdGlvbiBYdCgpe31mdW5jdGlvbiB5bChyLGUpe3ImJmdnLmhhc093blByb3BlcnR5KHIudHlwZSkmJmdnW3IudHlwZV0ocixlKX12YXIgbWc9e0ZlYXR1cmU6ZnVuY3Rpb24ocixlKXt5bChyLmdlb21ldHJ5LGUpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihyLGUpe2Zvcih2YXIgdD1yLmZlYXR1cmVzLG49LTEsaT10Lmxlbmd0aDsrK248aTspeWwodFtuXS5nZW9tZXRyeSxlKX19LGdnPXtTcGhlcmU6ZnVuY3Rpb24ocixlKXtlLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbihyLGUpe3I9ci5jb29yZGluYXRlcyxlLnBvaW50KHJbMF0sclsxXSxyWzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbihyLGUpe2Zvcih2YXIgdD1yLmNvb3JkaW5hdGVzLG49LTEsaT10Lmxlbmd0aDsrK248aTspcj10W25dLGUucG9pbnQoclswXSxyWzFdLHJbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHIsZSl7QXUoci5jb29yZGluYXRlcyxlLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24ocixlKXtmb3IodmFyIHQ9ci5jb29yZGluYXRlcyxuPS0xLGk9dC5sZW5ndGg7KytuPGk7KUF1KHRbbl0sZSwwKX0sUG9seWdvbjpmdW5jdGlvbihyLGUpe19nKHIuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihyLGUpe2Zvcih2YXIgdD1yLmNvb3JkaW5hdGVzLG49LTEsaT10Lmxlbmd0aDsrK248aTspX2codFtuXSxlKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHIsZSl7Zm9yKHZhciB0PXIuZ2VvbWV0cmllcyxuPS0xLGk9dC5sZW5ndGg7KytuPGk7KXlsKHRbbl0sZSl9fTtmdW5jdGlvbiBBdShyLGUsdCl7dmFyIG49LTEsaT1yLmxlbmd0aC10LHM7Zm9yKGUubGluZVN0YXJ0KCk7KytuPGk7KXM9cltuXSxlLnBvaW50KHNbMF0sc1sxXSxzWzJdKTtlLmxpbmVFbmQoKX1mdW5jdGlvbiBfZyhyLGUpe3ZhciB0PS0xLG49ci5sZW5ndGg7Zm9yKGUucG9seWdvblN0YXJ0KCk7Kyt0PG47KUF1KHJbdF0sZSwxKTtlLnBvbHlnb25FbmQoKX1mdW5jdGlvbiB2bChyLGUpe3ImJm1nLmhhc093blByb3BlcnR5KHIudHlwZSk/bWdbci50eXBlXShyLGUpOnlsKHIsZSl9dmFyIE1sPW5ldyBoaSx4Zz1uZXcgaGkseWcsdmcsVHUsQ3UsUnUsZGk9e3BvaW50Olh0LGxpbmVTdGFydDpYdCxsaW5lRW5kOlh0LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe01sPW5ldyBoaSxkaS5saW5lU3RhcnQ9WDEsZGkubGluZUVuZD1xMX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciByPStNbDt4Zy5hZGQocjwwP2RuK3I6ciksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9WHR9LHNwaGVyZTpmdW5jdGlvbigpe3hnLmFkZChkbil9fTtmdW5jdGlvbiBYMSgpe2RpLnBvaW50PSQxfWZ1bmN0aW9uIHExKCl7TWcoeWcsdmcpfWZ1bmN0aW9uICQxKHIsZSl7ZGkucG9pbnQ9TWcseWc9cix2Zz1lLHIqPUdlLGUqPUdlLFR1PXIsQ3U9V2UoZT1lLzIreGwpLFJ1PVVlKGUpfWZ1bmN0aW9uIE1nKHIsZSl7cio9R2UsZSo9R2UsZT1lLzIreGw7dmFyIHQ9ci1UdSxuPXQ+PTA/MTotMSxpPW4qdCxzPVdlKGUpLGE9VWUoZSksbz1SdSphLGw9Q3UqcytvKldlKGkpLGM9bypuKlVlKGkpO01sLmFkZChBbihjLGwpKSxUdT1yLEN1PXMsUnU9YX1mdW5jdGlvbiBTbChyKXtyZXR1cm5bQW4oclsxXSxyWzBdKSxmaShyWzJdKV19ZnVuY3Rpb24gZnIocil7dmFyIGU9clswXSx0PXJbMV0sbj1XZSh0KTtyZXR1cm5bbipXZShlKSxuKlVlKGUpLFVlKHQpXX1mdW5jdGlvbiBibChyLGUpe3JldHVybiByWzBdKmVbMF0rclsxXSplWzFdK3JbMl0qZVsyXX1mdW5jdGlvbiBzcyhyLGUpe3JldHVybltyWzFdKmVbMl0tclsyXSplWzFdLHJbMl0qZVswXS1yWzBdKmVbMl0sclswXSplWzFdLXJbMV0qZVswXV19ZnVuY3Rpb24gUHUocixlKXtyWzBdKz1lWzBdLHJbMV0rPWVbMV0sclsyXSs9ZVsyXX1mdW5jdGlvbiB3bChyLGUpe3JldHVybltyWzBdKmUsclsxXSplLHJbMl0qZV19ZnVuY3Rpb24gRWwocil7dmFyIGU9dWkoclswXSpyWzBdK3JbMV0qclsxXStyWzJdKnJbMl0pO3JbMF0vPWUsclsxXS89ZSxyWzJdLz1lfXZhciBwdCxwbix2dCxNbixkcixTZyxiZyxhcyxfYSxPaSxwaSxtaT17cG9pbnQ6THUsbGluZVN0YXJ0OkVnLGxpbmVFbmQ6QWcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bWkucG9pbnQ9VGcsbWkubGluZVN0YXJ0PVkxLG1pLmxpbmVFbmQ9WjEsX2E9bmV3IGhpLGRpLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7ZGkucG9seWdvbkVuZCgpLG1pLnBvaW50PUx1LG1pLmxpbmVTdGFydD1FZyxtaS5saW5lRW5kPUFnLE1sPDA/KHB0PS0odnQ9MTgwKSxwbj0tKE1uPTkwKSk6X2E+c3Q/TW49OTA6X2E8LXN0JiYocG49LTkwKSxwaVswXT1wdCxwaVsxXT12dH0sc3BoZXJlOmZ1bmN0aW9uKCl7cHQ9LSh2dD0xODApLHBuPS0oTW49OTApfX07ZnVuY3Rpb24gTHUocixlKXtPaS5wdXNoKHBpPVtwdD1yLHZ0PXJdKSxlPHBuJiYocG49ZSksZT5NbiYmKE1uPWUpfWZ1bmN0aW9uIHdnKHIsZSl7dmFyIHQ9ZnIoW3IqR2UsZSpHZV0pO2lmKGFzKXt2YXIgbj1zcyhhcyx0KSxpPVtuWzFdLC1uWzBdLDBdLHM9c3MoaSxuKTtFbChzKSxzPVNsKHMpO3ZhciBhPXItZHIsbz1hPjA/MTotMSxsPXNbMF0qeXQqbyxjLGg9aHQoYSk+MTgwO2heKG8qZHI8bCYmbDxvKnIpPyhjPXNbMV0qeXQsYz5NbiYmKE1uPWMpKToobD0obCszNjApJTM2MC0xODAsaF4obypkcjxsJiZsPG8qcik/KGM9LXNbMV0qeXQsYzxwbiYmKHBuPWMpKTooZTxwbiYmKHBuPWUpLGU+TW4mJihNbj1lKSkpLGg/cjxkcj9TbihwdCxyKT5TbihwdCx2dCkmJih2dD1yKTpTbihyLHZ0KT5TbihwdCx2dCkmJihwdD1yKTp2dD49cHQ/KHI8cHQmJihwdD1yKSxyPnZ0JiYodnQ9cikpOnI+ZHI/U24ocHQscik+U24ocHQsdnQpJiYodnQ9cik6U24ocix2dCk+U24ocHQsdnQpJiYocHQ9cil9ZWxzZSBPaS5wdXNoKHBpPVtwdD1yLHZ0PXJdKTtlPHBuJiYocG49ZSksZT5NbiYmKE1uPWUpLGFzPXQsZHI9cn1mdW5jdGlvbiBFZygpe21pLnBvaW50PXdnfWZ1bmN0aW9uIEFnKCl7cGlbMF09cHQscGlbMV09dnQsbWkucG9pbnQ9THUsYXM9bnVsbH1mdW5jdGlvbiBUZyhyLGUpe2lmKGFzKXt2YXIgdD1yLWRyO19hLmFkZChodCh0KT4xODA/dCsodD4wPzM2MDotMzYwKTp0KX1lbHNlIFNnPXIsYmc9ZTtkaS5wb2ludChyLGUpLHdnKHIsZSl9ZnVuY3Rpb24gWTEoKXtkaS5saW5lU3RhcnQoKX1mdW5jdGlvbiBaMSgpe1RnKFNnLGJnKSxkaS5saW5lRW5kKCksaHQoX2EpPnN0JiYocHQ9LSh2dD0xODApKSxwaVswXT1wdCxwaVsxXT12dCxhcz1udWxsfWZ1bmN0aW9uIFNuKHIsZSl7cmV0dXJuKGUtPXIpPDA/ZSszNjA6ZX1mdW5jdGlvbiBKMShyLGUpe3JldHVybiByWzBdLWVbMF19ZnVuY3Rpb24gQ2cocixlKXtyZXR1cm4gclswXTw9clsxXT9yWzBdPD1lJiZlPD1yWzFdOmU8clswXXx8clsxXTxlfWZ1bmN0aW9uIFJnKHIpe3ZhciBlLHQsbixpLHMsYSxvO2lmKE1uPXZ0PS0ocHQ9cG49MS8wKSxPaT1bXSx2bChyLG1pKSx0PU9pLmxlbmd0aCl7Zm9yKE9pLnNvcnQoSjEpLGU9MSxuPU9pWzBdLHM9W25dO2U8dDsrK2UpaT1PaVtlXSxDZyhuLGlbMF0pfHxDZyhuLGlbMV0pPyhTbihuWzBdLGlbMV0pPlNuKG5bMF0sblsxXSkmJihuWzFdPWlbMV0pLFNuKGlbMF0sblsxXSk+U24oblswXSxuWzFdKSYmKG5bMF09aVswXSkpOnMucHVzaChuPWkpO2ZvcihhPS0xLzAsdD1zLmxlbmd0aC0xLGU9MCxuPXNbdF07ZTw9dDtuPWksKytlKWk9c1tlXSwobz1TbihuWzFdLGlbMF0pKT5hJiYoYT1vLHB0PWlbMF0sdnQ9blsxXSl9cmV0dXJuIE9pPXBpPW51bGwscHQ9PT0xLzB8fHBuPT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW3B0LHBuXSxbdnQsTW5dXX12YXIgeGEsQWwsVGwsQ2wsUmwsUGwsTGwsSWwsSXUsVXUsRHUsUGcsTGcsUXQsanQsZW4sQm49e3NwaGVyZTpYdCxwb2ludDpOdSxsaW5lU3RhcnQ6SWcsbGluZUVuZDpVZyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtCbi5saW5lU3RhcnQ9ajEsQm4ubGluZUVuZD1ld30scG9seWdvbkVuZDpmdW5jdGlvbigpe0JuLmxpbmVTdGFydD1JZyxCbi5saW5lRW5kPVVnfX07ZnVuY3Rpb24gTnUocixlKXtyKj1HZSxlKj1HZTt2YXIgdD1XZShlKTt5YSh0KldlKHIpLHQqVWUociksVWUoZSkpfWZ1bmN0aW9uIHlhKHIsZSx0KXsrK3hhLFRsKz0oci1UbCkveGEsQ2wrPShlLUNsKS94YSxSbCs9KHQtUmwpL3hhfWZ1bmN0aW9uIElnKCl7Qm4ucG9pbnQ9SzF9ZnVuY3Rpb24gSzEocixlKXtyKj1HZSxlKj1HZTt2YXIgdD1XZShlKTtRdD10KldlKHIpLGp0PXQqVWUociksZW49VWUoZSksQm4ucG9pbnQ9UTEseWEoUXQsanQsZW4pfWZ1bmN0aW9uIFExKHIsZSl7cio9R2UsZSo9R2U7dmFyIHQ9V2UoZSksbj10KldlKHIpLGk9dCpVZShyKSxzPVVlKGUpLGE9QW4odWkoKGE9anQqcy1lbippKSphKyhhPWVuKm4tUXQqcykqYSsoYT1RdCppLWp0Km4pKmEpLFF0Km4ranQqaStlbipzKTtBbCs9YSxQbCs9YSooUXQrKFF0PW4pKSxMbCs9YSooanQrKGp0PWkpKSxJbCs9YSooZW4rKGVuPXMpKSx5YShRdCxqdCxlbil9ZnVuY3Rpb24gVWcoKXtCbi5wb2ludD1OdX1mdW5jdGlvbiBqMSgpe0JuLnBvaW50PXR3fWZ1bmN0aW9uIGV3KCl7RGcoUGcsTGcpLEJuLnBvaW50PU51fWZ1bmN0aW9uIHR3KHIsZSl7UGc9cixMZz1lLHIqPUdlLGUqPUdlLEJuLnBvaW50PURnO3ZhciB0PVdlKGUpO1F0PXQqV2UociksanQ9dCpVZShyKSxlbj1VZShlKSx5YShRdCxqdCxlbil9ZnVuY3Rpb24gRGcocixlKXtyKj1HZSxlKj1HZTt2YXIgdD1XZShlKSxuPXQqV2UociksaT10KlVlKHIpLHM9VWUoZSksYT1qdCpzLWVuKmksbz1lbipuLVF0KnMsbD1RdCppLWp0Km4sYz1FdShhLG8sbCksaD1maShjKSx1PWMmJi1oL2M7SXUuYWRkKHUqYSksVXUuYWRkKHUqbyksRHUuYWRkKHUqbCksQWwrPWgsUGwrPWgqKFF0KyhRdD1uKSksTGwrPWgqKGp0KyhqdD1pKSksSWwrPWgqKGVuKyhlbj1zKSkseWEoUXQsanQsZW4pfWZ1bmN0aW9uIE5nKHIpe3hhPUFsPVRsPUNsPVJsPVBsPUxsPUlsPTAsSXU9bmV3IGhpLFV1PW5ldyBoaSxEdT1uZXcgaGksdmwocixCbik7dmFyIGU9K0l1LHQ9K1V1LG49K0R1LGk9RXUoZSx0LG4pO3JldHVybiBpPF9sJiYoZT1QbCx0PUxsLG49SWwsQWw8c3QmJihlPVRsLHQ9Q2wsbj1SbCksaT1FdShlLHQsbiksaTxfbCk/W05hTixOYU5dOltBbih0LGUpKnl0LGZpKG4vaSkqeXRdfWZ1bmN0aW9uIEZ1KHIsZSl7ZnVuY3Rpb24gdChuLGkpe3JldHVybiBuPXIobixpKSxlKG5bMF0sblsxXSl9cmV0dXJuIHIuaW52ZXJ0JiZlLmludmVydCYmKHQuaW52ZXJ0PWZ1bmN0aW9uKG4saSl7cmV0dXJuIG49ZS5pbnZlcnQobixpKSxuJiZyLmludmVydChuWzBdLG5bMV0pfSksdH1mdW5jdGlvbiBPdShyLGUpe3JldHVybiBodChyKT5ldCYmKHItPU1hdGgucm91bmQoci9kbikqZG4pLFtyLGVdfU91LmludmVydD1PdTtmdW5jdGlvbiBGZyhyLGUsdCl7cmV0dXJuKHIlPWRuKT9lfHx0P0Z1KEJnKHIpLHpnKGUsdCkpOkJnKHIpOmV8fHQ/emcoZSx0KTpPdX1mdW5jdGlvbiBPZyhyKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSs9cixodChlKT5ldCYmKGUtPU1hdGgucm91bmQoZS9kbikqZG4pLFtlLHRdfX1mdW5jdGlvbiBCZyhyKXt2YXIgZT1PZyhyKTtyZXR1cm4gZS5pbnZlcnQ9T2coLXIpLGV9ZnVuY3Rpb24gemcocixlKXt2YXIgdD1XZShyKSxuPVVlKHIpLGk9V2UoZSkscz1VZShlKTtmdW5jdGlvbiBhKG8sbCl7dmFyIGM9V2UobCksaD1XZShvKSpjLHU9VWUobykqYyxmPVVlKGwpLGQ9Zip0K2gqbjtyZXR1cm5bQW4odSppLWQqcyxoKnQtZipuKSxmaShkKmkrdSpzKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKG8sbCl7dmFyIGM9V2UobCksaD1XZShvKSpjLHU9VWUobykqYyxmPVVlKGwpLGQ9ZippLXUqcztyZXR1cm5bQW4odSppK2YqcyxoKnQrZCpuKSxmaShkKnQtaCpuKV19LGF9ZnVuY3Rpb24ga2cocil7cj1GZyhyWzBdKkdlLHJbMV0qR2Usci5sZW5ndGg+Mj9yWzJdKkdlOjApO2Z1bmN0aW9uIGUodCl7cmV0dXJuIHQ9cih0WzBdKkdlLHRbMV0qR2UpLHRbMF0qPXl0LHRbMV0qPXl0LHR9cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0PXIuaW52ZXJ0KHRbMF0qR2UsdFsxXSpHZSksdFswXSo9eXQsdFsxXSo9eXQsdH0sZX1mdW5jdGlvbiBudyhyLGUsdCxuLGkscyl7aWYodCl7dmFyIGE9V2UoZSksbz1VZShlKSxsPW4qdDtpPT1udWxsPyhpPWUrbipkbixzPWUtbC8yKTooaT1HZyhhLGkpLHM9R2coYSxzKSwobj4wP2k8czppPnMpJiYoaSs9bipkbikpO2Zvcih2YXIgYyxoPWk7bj4wP2g+czpoPHM7aC09bCljPVNsKFthLC1vKldlKGgpLC1vKlVlKGgpXSksci5wb2ludChjWzBdLGNbMV0pfX1mdW5jdGlvbiBHZyhyLGUpe2U9ZnIoZSksZVswXS09cixFbChlKTt2YXIgdD1XMSgtZVsxXSk7cmV0dXJuKCgtZVsyXTwwPy10OnQpK2RuLXN0KSVkbn1mdW5jdGlvbiBWZygpe3ZhciByPVtdLGU7cmV0dXJue3BvaW50OmZ1bmN0aW9uKHQsbixpKXtlLnB1c2goW3QsbixpXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3IucHVzaChlPVtdKX0sbGluZUVuZDpYdCxyZWpvaW46ZnVuY3Rpb24oKXtyLmxlbmd0aD4xJiZyLnB1c2goci5wb3AoKS5jb25jYXQoci5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PXI7cmV0dXJuIHI9W10sZT1udWxsLHR9fX1mdW5jdGlvbiBVbChyLGUpe3JldHVybiBodChyWzBdLWVbMF0pPHN0JiZodChyWzFdLWVbMV0pPHN0fWZ1bmN0aW9uIERsKHIsZSx0LG4pe3RoaXMueD1yLHRoaXMuej1lLHRoaXMubz10LHRoaXMuZT1uLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gSGcocixlLHQsbixpKXt2YXIgcz1bXSxhPVtdLG8sbDtpZihyLmZvckVhY2goZnVuY3Rpb24ocCl7aWYoISgoXz1wLmxlbmd0aC0xKTw9MCkpe3ZhciBfLGc9cFswXSxtPXBbX10seTtpZihVbChnLG0pKXtpZighZ1syXSYmIW1bMl0pe2ZvcihpLmxpbmVTdGFydCgpLG89MDtvPF87KytvKWkucG9pbnQoKGc9cFtvXSlbMF0sZ1sxXSk7aS5saW5lRW5kKCk7cmV0dXJufW1bMF0rPTIqc3R9cy5wdXNoKHk9bmV3IERsKGcscCxudWxsLCEwKSksYS5wdXNoKHkubz1uZXcgRGwoZyxudWxsLHksITEpKSxzLnB1c2goeT1uZXcgRGwobSxwLG51bGwsITEpKSxhLnB1c2goeS5vPW5ldyBEbChtLG51bGwseSwhMCkpfX0pLCEhcy5sZW5ndGgpe2ZvcihhLnNvcnQoZSksV2cocyksV2coYSksbz0wLGw9YS5sZW5ndGg7bzxsOysrbylhW29dLmU9dD0hdDtmb3IodmFyIGM9c1swXSxoLHU7Oyl7Zm9yKHZhciBmPWMsZD0hMDtmLnY7KWlmKChmPWYubik9PT1jKXJldHVybjtoPWYueixpLmxpbmVTdGFydCgpO2Rve2lmKGYudj1mLm8udj0hMCxmLmUpe2lmKGQpZm9yKG89MCxsPWgubGVuZ3RoO288bDsrK28paS5wb2ludCgodT1oW29dKVswXSx1WzFdKTtlbHNlIG4oZi54LGYubi54LDEsaSk7Zj1mLm59ZWxzZXtpZihkKWZvcihoPWYucC56LG89aC5sZW5ndGgtMTtvPj0wOy0tbylpLnBvaW50KCh1PWhbb10pWzBdLHVbMV0pO2Vsc2UgbihmLngsZi5wLngsLTEsaSk7Zj1mLnB9Zj1mLm8saD1mLnosZD0hZH13aGlsZSghZi52KTtpLmxpbmVFbmQoKX19fWZ1bmN0aW9uIFdnKHIpe2lmKGU9ci5sZW5ndGgpe2Zvcih2YXIgZSx0PTAsbj1yWzBdLGk7Kyt0PGU7KW4ubj1pPXJbdF0saS5wPW4sbj1pO24ubj1pPXJbMF0saS5wPW59fWZ1bmN0aW9uIEJ1KHIpe3JldHVybiBodChyWzBdKTw9ZXQ/clswXTpWMShyWzBdKSooKGh0KHJbMF0pK2V0KSVkbi1ldCl9ZnVuY3Rpb24gWGcocixlKXt2YXIgdD1CdShlKSxuPWVbMV0saT1VZShuKSxzPVtVZSh0KSwtV2UodCksMF0sYT0wLG89MCxsPW5ldyBoaTtpPT09MT9uPWZuK3N0Omk9PT0tMSYmKG49LWZuLXN0KTtmb3IodmFyIGM9MCxoPXIubGVuZ3RoO2M8aDsrK2MpaWYoZj0odT1yW2NdKS5sZW5ndGgpZm9yKHZhciB1LGYsZD11W2YtMV0scD1CdShkKSxfPWRbMV0vMit4bCxnPVVlKF8pLG09V2UoXykseT0wO3k8ZjsrK3kscD12LGc9YixtPUEsZD14KXt2YXIgeD11W3ldLHY9QnUoeCksUz14WzFdLzIreGwsYj1VZShTKSxBPVdlKFMpLEw9di1wLE09TD49MD8xOi0xLHc9TSpMLFI9dz5ldCxOPWcqYjtpZihsLmFkZChBbihOKk0qVWUodyksbSpBK04qV2UodykpKSxhKz1SP0wrTSpkbjpMLFJecD49dF52Pj10KXt2YXIgQj1zcyhmcihkKSxmcih4KSk7RWwoQik7dmFyIEk9c3MocyxCKTtFbChJKTt2YXIgVT0oUl5MPj0wPy0xOjEpKmZpKElbMl0pOyhuPlV8fG49PT1VJiYoQlswXXx8QlsxXSkpJiYobys9Ul5MPj0wPzE6LTEpfX1yZXR1cm4oYTwtc3R8fGE8c3QmJmw8LV9sKV5vJjF9ZnVuY3Rpb24gcWcocixlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciBzPWUoaSksYT1WZygpLG89ZShhKSxsPSExLGMsaCx1LGY9e3BvaW50OmQsbGluZVN0YXJ0Ol8sbGluZUVuZDpnLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2YucG9pbnQ9bSxmLmxpbmVTdGFydD15LGYubGluZUVuZD14LGg9W10sYz1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2YucG9pbnQ9ZCxmLmxpbmVTdGFydD1fLGYubGluZUVuZD1nLGg9Z2EoaCk7dmFyIHY9WGcoYyxuKTtoLmxlbmd0aD8obHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksSGcoaCxydyx2LHQsaSkpOnYmJihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLHQobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGwmJihpLnBvbHlnb25FbmQoKSxsPSExKSxoPWM9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLHQobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKHYsUyl7cih2LFMpJiZpLnBvaW50KHYsUyl9ZnVuY3Rpb24gcCh2LFMpe3MucG9pbnQodixTKX1mdW5jdGlvbiBfKCl7Zi5wb2ludD1wLHMubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2YucG9pbnQ9ZCxzLmxpbmVFbmQoKX1mdW5jdGlvbiBtKHYsUyl7dS5wdXNoKFt2LFNdKSxvLnBvaW50KHYsUyl9ZnVuY3Rpb24geSgpe28ubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiB4KCl7bSh1WzBdWzBdLHVbMF1bMV0pLG8ubGluZUVuZCgpO3ZhciB2PW8uY2xlYW4oKSxTPWEucmVzdWx0KCksYixBPVMubGVuZ3RoLEwsTSx3O2lmKHUucG9wKCksYy5wdXNoKHUpLHU9bnVsbCwhIUEpe2lmKHYmMSl7aWYoTT1TWzBdLChMPU0ubGVuZ3RoLTEpPjApe2ZvcihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLGI9MDtiPEw7KytiKWkucG9pbnQoKHc9TVtiXSlbMF0sd1sxXSk7aS5saW5lRW5kKCl9cmV0dXJufUE+MSYmdiYyJiZTLnB1c2goUy5wb3AoKS5jb25jYXQoUy5zaGlmdCgpKSksaC5wdXNoKFMuZmlsdGVyKGl3KSl9fXJldHVybiBmfX1mdW5jdGlvbiBpdyhyKXtyZXR1cm4gci5sZW5ndGg+MX1mdW5jdGlvbiBydyhyLGUpe3JldHVybigocj1yLngpWzBdPDA/clsxXS1mbi1zdDpmbi1yWzFdKS0oKGU9ZS54KVswXTwwP2VbMV0tZm4tc3Q6Zm4tZVsxXSl9dmFyICRnPXFnKGZ1bmN0aW9uKCl7cmV0dXJuITB9LHN3LG93LFstZXQsLWZuXSk7ZnVuY3Rpb24gc3cocil7dmFyIGU9TmFOLHQ9TmFOLG49TmFOLGk7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3IubGluZVN0YXJ0KCksaT0xfSxwb2ludDpmdW5jdGlvbihzLGEpe3ZhciBvPXM+MD9ldDotZXQsbD1odChzLWUpO2h0KGwtZXQpPHN0PyhyLnBvaW50KGUsdD0odCthKS8yPjA/Zm46LWZuKSxyLnBvaW50KG4sdCksci5saW5lRW5kKCksci5saW5lU3RhcnQoKSxyLnBvaW50KG8sdCksci5wb2ludChzLHQpLGk9MCk6biE9PW8mJmw+PWV0JiYoaHQoZS1uKTxzdCYmKGUtPW4qc3QpLGh0KHMtbyk8c3QmJihzLT1vKnN0KSx0PWF3KGUsdCxzLGEpLHIucG9pbnQobix0KSxyLmxpbmVFbmQoKSxyLmxpbmVTdGFydCgpLHIucG9pbnQobyx0KSxpPTApLHIucG9pbnQoZT1zLHQ9YSksbj1vfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ci5saW5lRW5kKCksZT10PU5hTn0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi1pfX19ZnVuY3Rpb24gYXcocixlLHQsbil7dmFyIGkscyxhPVVlKHItdCk7cmV0dXJuIGh0KGEpPnN0P3d1KChVZShlKSoocz1XZShuKSkqVWUodCktVWUobikqKGk9V2UoZSkpKlVlKHIpKS8oaSpzKmEpKTooZStuKS8yfWZ1bmN0aW9uIG93KHIsZSx0LG4pe3ZhciBpO2lmKHI9PW51bGwpaT10KmZuLG4ucG9pbnQoLWV0LGkpLG4ucG9pbnQoMCxpKSxuLnBvaW50KGV0LGkpLG4ucG9pbnQoZXQsMCksbi5wb2ludChldCwtaSksbi5wb2ludCgwLC1pKSxuLnBvaW50KC1ldCwtaSksbi5wb2ludCgtZXQsMCksbi5wb2ludCgtZXQsaSk7ZWxzZSBpZihodChyWzBdLWVbMF0pPnN0KXt2YXIgcz1yWzBdPGVbMF0/ZXQ6LWV0O2k9dCpzLzIsbi5wb2ludCgtcyxpKSxuLnBvaW50KDAsaSksbi5wb2ludChzLGkpfWVsc2Ugbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGx3KHIpe3ZhciBlPVdlKHIpLHQ9NipHZSxuPWU+MCxpPWh0KGUpPnN0O2Z1bmN0aW9uIHMoaCx1LGYsZCl7bncoZCxyLHQsZixoLHUpfWZ1bmN0aW9uIGEoaCx1KXtyZXR1cm4gV2UoaCkqV2UodSk+ZX1mdW5jdGlvbiBvKGgpe3ZhciB1LGYsZCxwLF87cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3A9ZD0hMSxfPTF9LHBvaW50OmZ1bmN0aW9uKGcsbSl7dmFyIHk9W2csbV0seCx2PWEoZyxtKSxTPW4/dj8wOmMoZyxtKTp2P2MoZysoZzwwP2V0Oi1ldCksbSk6MDtpZighdSYmKHA9ZD12KSYmaC5saW5lU3RhcnQoKSx2IT09ZCYmKHg9bCh1LHkpLCgheHx8VWwodSx4KXx8VWwoeSx4KSkmJih5WzJdPTEpKSx2IT09ZClfPTAsdj8oaC5saW5lU3RhcnQoKSx4PWwoeSx1KSxoLnBvaW50KHhbMF0seFsxXSkpOih4PWwodSx5KSxoLnBvaW50KHhbMF0seFsxXSwyKSxoLmxpbmVFbmQoKSksdT14O2Vsc2UgaWYoaSYmdSYmbl52KXt2YXIgYjshKFMmZikmJihiPWwoeSx1LCEwKSkmJihfPTAsbj8oaC5saW5lU3RhcnQoKSxoLnBvaW50KGJbMF1bMF0sYlswXVsxXSksaC5wb2ludChiWzFdWzBdLGJbMV1bMV0pLGgubGluZUVuZCgpKTooaC5wb2ludChiWzFdWzBdLGJbMV1bMV0pLGgubGluZUVuZCgpLGgubGluZVN0YXJ0KCksaC5wb2ludChiWzBdWzBdLGJbMF1bMV0sMykpKX12JiYoIXV8fCFVbCh1LHkpKSYmaC5wb2ludCh5WzBdLHlbMV0pLHU9eSxkPXYsZj1TfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZCYmaC5saW5lRW5kKCksdT1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBffChwJiZkKTw8MX19fWZ1bmN0aW9uIGwoaCx1LGYpe3ZhciBkPWZyKGgpLHA9ZnIodSksXz1bMSwwLDBdLGc9c3MoZCxwKSxtPWJsKGcsZykseT1nWzBdLHg9bS15Knk7aWYoIXgpcmV0dXJuIWYmJmg7dmFyIHY9ZSptL3gsUz0tZSp5L3gsYj1zcyhfLGcpLEE9d2woXyx2KSxMPXdsKGcsUyk7UHUoQSxMKTt2YXIgTT1iLHc9YmwoQSxNKSxSPWJsKE0sTSksTj13KnctUiooYmwoQSxBKS0xKTtpZighKE48MCkpe3ZhciBCPXVpKE4pLEk9d2woTSwoLXctQikvUik7aWYoUHUoSSxBKSxJPVNsKEkpLCFmKXJldHVybiBJO3ZhciBVPWhbMF0sej11WzBdLEY9aFsxXSxaPXVbMV0sVjt6PFUmJihWPVUsVT16LHo9Vik7dmFyIFE9ei1VLG5lPWh0KFEtZXQpPHN0LGZlPW5lfHxRPHN0O2lmKCFuZSYmWjxGJiYoVj1GLEY9WixaPVYpLGZlP25lP0YrWj4wXklbMV08KGh0KElbMF0tVSk8c3Q/RjpaKTpGPD1JWzFdJiZJWzFdPD1aOlE+ZXReKFU8PUlbMF0mJklbMF08PXopKXt2YXIgJD13bChNLCgtdytCKS9SKTtyZXR1cm4gUHUoJCxBKSxbSSxTbCgkKV19fX1mdW5jdGlvbiBjKGgsdSl7dmFyIGY9bj9yOmV0LXIsZD0wO3JldHVybiBoPC1mP2R8PTE6aD5mJiYoZHw9MiksdTwtZj9kfD00OnU+ZiYmKGR8PTgpLGR9cmV0dXJuIHFnKGEsbyxzLG4/WzAsLXJdOlstZXQsci1ldF0pfWZ1bmN0aW9uIGN3KHIsZSx0LG4saSxzKXt2YXIgYT1yWzBdLG89clsxXSxsPWVbMF0sYz1lWzFdLGg9MCx1PTEsZj1sLWEsZD1jLW8scDtpZihwPXQtYSwhKCFmJiZwPjApKXtpZihwLz1mLGY8MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWVsc2UgaWYoZj4wKXtpZihwPnUpcmV0dXJuO3A+aCYmKGg9cCl9aWYocD1pLWEsISghZiYmcDwwKSl7aWYocC89ZixmPDApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1lbHNlIGlmKGY+MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWlmKHA9bi1vLCEoIWQmJnA+MCkpe2lmKHAvPWQsZDwwKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9ZWxzZSBpZihkPjApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1pZihwPXMtbywhKCFkJiZwPDApKXtpZihwLz1kLGQ8MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWVsc2UgaWYoZD4wKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9cmV0dXJuIGg+MCYmKHJbMF09YStoKmYsclsxXT1vK2gqZCksdTwxJiYoZVswXT1hK3UqZixlWzFdPW8rdSpkKSwhMH19fX19dmFyIHZhPTFlOSxObD0tdmE7ZnVuY3Rpb24gaHcocixlLHQsbil7ZnVuY3Rpb24gaShjLGgpe3JldHVybiByPD1jJiZjPD10JiZlPD1oJiZoPD1ufWZ1bmN0aW9uIHMoYyxoLHUsZil7dmFyIGQ9MCxwPTA7aWYoYz09bnVsbHx8KGQ9YShjLHUpKSE9PShwPWEoaCx1KSl8fGwoYyxoKTwwXnU+MClkbyBmLnBvaW50KGQ9PT0wfHxkPT09Mz9yOnQsZD4xP246ZSk7d2hpbGUoKGQ9KGQrdSs0KSU0KSE9PXApO2Vsc2UgZi5wb2ludChoWzBdLGhbMV0pfWZ1bmN0aW9uIGEoYyxoKXtyZXR1cm4gaHQoY1swXS1yKTxzdD9oPjA/MDozOmh0KGNbMF0tdCk8c3Q/aD4wPzI6MTpodChjWzFdLWUpPHN0P2g+MD8xOjA6aD4wPzM6Mn1mdW5jdGlvbiBvKGMsaCl7cmV0dXJuIGwoYy54LGgueCl9ZnVuY3Rpb24gbChjLGgpe3ZhciB1PWEoYywxKSxmPWEoaCwxKTtyZXR1cm4gdSE9PWY/dS1mOnU9PT0wP2hbMV0tY1sxXTp1PT09MT9jWzBdLWhbMF06dT09PTI/Y1sxXS1oWzFdOmhbMF0tY1swXX1yZXR1cm4gZnVuY3Rpb24oYyl7dmFyIGg9Yyx1PVZnKCksZixkLHAsXyxnLG0seSx4LHYsUyxiLEE9e3BvaW50OkwsbGluZVN0YXJ0Ok4sbGluZUVuZDpCLHBvbHlnb25TdGFydDp3LHBvbHlnb25FbmQ6Un07ZnVuY3Rpb24gTChVLHope2koVSx6KSYmaC5wb2ludChVLHopfWZ1bmN0aW9uIE0oKXtmb3IodmFyIFU9MCx6PTAsRj1kLmxlbmd0aDt6PEY7Kyt6KWZvcih2YXIgWj1kW3pdLFY9MSxRPVoubGVuZ3RoLG5lPVpbMF0sZmUsJCxlZT1uZVswXSxkZT1uZVsxXTtWPFE7KytWKWZlPWVlLCQ9ZGUsbmU9WltWXSxlZT1uZVswXSxkZT1uZVsxXSwkPD1uP2RlPm4mJihlZS1mZSkqKG4tJCk+KGRlLSQpKihyLWZlKSYmKytVOmRlPD1uJiYoZWUtZmUpKihuLSQpPChkZS0kKSooci1mZSkmJi0tVTtyZXR1cm4gVX1mdW5jdGlvbiB3KCl7aD11LGY9W10sZD1bXSxiPSEwfWZ1bmN0aW9uIFIoKXt2YXIgVT1NKCksej1iJiZVLEY9KGY9Z2EoZikpLmxlbmd0aDsoenx8RikmJihjLnBvbHlnb25TdGFydCgpLHomJihjLmxpbmVTdGFydCgpLHMobnVsbCxudWxsLDEsYyksYy5saW5lRW5kKCkpLEYmJkhnKGYsbyxVLHMsYyksYy5wb2x5Z29uRW5kKCkpLGg9YyxmPWQ9cD1udWxsfWZ1bmN0aW9uIE4oKXtBLnBvaW50PUksZCYmZC5wdXNoKHA9W10pLFM9ITAsdj0hMSx5PXg9TmFOfWZ1bmN0aW9uIEIoKXtmJiYoSShfLGcpLG0mJnYmJnUucmVqb2luKCksZi5wdXNoKHUucmVzdWx0KCkpKSxBLnBvaW50PUwsdiYmaC5saW5lRW5kKCl9ZnVuY3Rpb24gSShVLHope3ZhciBGPWkoVSx6KTtpZihkJiZwLnB1c2goW1Usel0pLFMpXz1VLGc9eixtPUYsUz0hMSxGJiYoaC5saW5lU3RhcnQoKSxoLnBvaW50KFUseikpO2Vsc2UgaWYoRiYmdiloLnBvaW50KFUseik7ZWxzZXt2YXIgWj1beT1NYXRoLm1heChObCxNYXRoLm1pbih2YSx5KSkseD1NYXRoLm1heChObCxNYXRoLm1pbih2YSx4KSldLFY9W1U9TWF0aC5tYXgoTmwsTWF0aC5taW4odmEsVSkpLHo9TWF0aC5tYXgoTmwsTWF0aC5taW4odmEseikpXTtjdyhaLFYscixlLHQsbik/KHZ8fChoLmxpbmVTdGFydCgpLGgucG9pbnQoWlswXSxaWzFdKSksaC5wb2ludChWWzBdLFZbMV0pLEZ8fGgubGluZUVuZCgpLGI9ITEpOkYmJihoLmxpbmVTdGFydCgpLGgucG9pbnQoVSx6KSxiPSExKX15PVUseD16LHY9Rn1yZXR1cm4gQX19dmFyIHp1LGt1LEZsLE9sLG9zPXtzcGhlcmU6WHQscG9pbnQ6WHQsbGluZVN0YXJ0OnV3LGxpbmVFbmQ6WHQscG9seWdvblN0YXJ0Olh0LHBvbHlnb25FbmQ6WHR9O2Z1bmN0aW9uIHV3KCl7b3MucG9pbnQ9ZHcsb3MubGluZUVuZD1md31mdW5jdGlvbiBmdygpe29zLnBvaW50PW9zLmxpbmVFbmQ9WHR9ZnVuY3Rpb24gZHcocixlKXtyKj1HZSxlKj1HZSxrdT1yLEZsPVVlKGUpLE9sPVdlKGUpLG9zLnBvaW50PXB3fWZ1bmN0aW9uIHB3KHIsZSl7cio9R2UsZSo9R2U7dmFyIHQ9VWUoZSksbj1XZShlKSxpPWh0KHIta3UpLHM9V2UoaSksYT1VZShpKSxvPW4qYSxsPU9sKnQtRmwqbipzLGM9RmwqdCtPbCpuKnM7enUuYWRkKEFuKHVpKG8qbytsKmwpLGMpKSxrdT1yLEZsPXQsT2w9bn1mdW5jdGlvbiBtdyhyKXtyZXR1cm4genU9bmV3IGhpLHZsKHIsb3MpLCt6dX12YXIgR3U9W251bGwsbnVsbF0sZ3c9e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOkd1fTtmdW5jdGlvbiBscyhyLGUpe3JldHVybiBHdVswXT1yLEd1WzFdPWUsbXcoZ3cpfXZhciBZZz17RmVhdHVyZTpmdW5jdGlvbihyLGUpe3JldHVybiBCbChyLmdlb21ldHJ5LGUpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihyLGUpe2Zvcih2YXIgdD1yLmZlYXR1cmVzLG49LTEsaT10Lmxlbmd0aDsrK248aTspaWYoQmwodFtuXS5nZW9tZXRyeSxlKSlyZXR1cm4hMDtyZXR1cm4hMX19LFpnPXtTcGhlcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUG9pbnQ6ZnVuY3Rpb24ocixlKXtyZXR1cm4gSmcoci5jb29yZGluYXRlcyxlKX0sTXVsdGlQb2ludDpmdW5jdGlvbihyLGUpe2Zvcih2YXIgdD1yLmNvb3JkaW5hdGVzLG49LTEsaT10Lmxlbmd0aDsrK248aTspaWYoSmcodFtuXSxlKSlyZXR1cm4hMDtyZXR1cm4hMX0sTGluZVN0cmluZzpmdW5jdGlvbihyLGUpe3JldHVybiBLZyhyLmNvb3JkaW5hdGVzLGUpfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24ocixlKXtmb3IodmFyIHQ9ci5jb29yZGluYXRlcyxuPS0xLGk9dC5sZW5ndGg7KytuPGk7KWlmKEtnKHRbbl0sZSkpcmV0dXJuITA7cmV0dXJuITF9LFBvbHlnb246ZnVuY3Rpb24ocixlKXtyZXR1cm4gUWcoci5jb29yZGluYXRlcyxlKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHIsZSl7Zm9yKHZhciB0PXIuY29vcmRpbmF0ZXMsbj0tMSxpPXQubGVuZ3RoOysrbjxpOylpZihRZyh0W25dLGUpKXJldHVybiEwO3JldHVybiExfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24ocixlKXtmb3IodmFyIHQ9ci5nZW9tZXRyaWVzLG49LTEsaT10Lmxlbmd0aDsrK248aTspaWYoQmwodFtuXSxlKSlyZXR1cm4hMDtyZXR1cm4hMX19O2Z1bmN0aW9uIEJsKHIsZSl7cmV0dXJuIHImJlpnLmhhc093blByb3BlcnR5KHIudHlwZSk/Wmdbci50eXBlXShyLGUpOiExfWZ1bmN0aW9uIEpnKHIsZSl7cmV0dXJuIGxzKHIsZSk9PT0wfWZ1bmN0aW9uIEtnKHIsZSl7Zm9yKHZhciB0LG4saSxzPTAsYT1yLmxlbmd0aDtzPGE7cysrKXtpZihuPWxzKHJbc10sZSksbj09PTB8fHM+MCYmKGk9bHMocltzXSxyW3MtMV0pLGk+MCYmdDw9aSYmbjw9aSYmKHQrbi1pKSooMS1NYXRoLnBvdygodC1uKS9pLDIpKTxfbCppKSlyZXR1cm4hMDt0PW59cmV0dXJuITF9ZnVuY3Rpb24gUWcocixlKXtyZXR1cm4hIVhnKHIubWFwKF93KSxqZyhlKSl9ZnVuY3Rpb24gX3cocil7cmV0dXJuIHI9ci5tYXAoamcpLHIucG9wKCkscn1mdW5jdGlvbiBqZyhyKXtyZXR1cm5bclswXSpHZSxyWzFdKkdlXX1mdW5jdGlvbiB4dyhyLGUpe3JldHVybihyJiZZZy5oYXNPd25Qcm9wZXJ0eShyLnR5cGUpP1lnW3IudHlwZV06QmwpKHIsZSl9ZnVuY3Rpb24geXcocixlKXt2YXIgdD1yWzBdKkdlLG49clsxXSpHZSxpPWVbMF0qR2Uscz1lWzFdKkdlLGE9V2Uobiksbz1VZShuKSxsPVdlKHMpLGM9VWUocyksaD1hKldlKHQpLHU9YSpVZSh0KSxmPWwqV2UoaSksZD1sKlVlKGkpLHA9MipmaSh1aShwZyhzLW4pK2EqbCpwZyhpLXQpKSksXz1VZShwKSxnPXA/ZnVuY3Rpb24obSl7dmFyIHk9VWUobSo9cCkvXyx4PVVlKHAtbSkvXyx2PXgqaCt5KmYsUz14KnUreSpkLGI9eCpvK3kqYztyZXR1cm5bQW4oUyx2KSp5dCxBbihiLHVpKHYqditTKlMpKSp5dF19OmZ1bmN0aW9uKCl7cmV0dXJuW3QqeXQsbip5dF19O3JldHVybiBnLmRpc3RhbmNlPXAsZ312YXIgZTA9cj0+cixjcz0xLzAsemw9Y3MsTWE9LWNzLGtsPU1hLHZ3PXtwb2ludDpNdyxsaW5lU3RhcnQ6WHQsbGluZUVuZDpYdCxwb2x5Z29uU3RhcnQ6WHQscG9seWdvbkVuZDpYdCxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgcj1bW2NzLHpsXSxbTWEsa2xdXTtyZXR1cm4gTWE9a2w9LSh6bD1jcz0xLzApLHJ9fTtmdW5jdGlvbiBNdyhyLGUpe3I8Y3MmJihjcz1yKSxyPk1hJiYoTWE9ciksZTx6bCYmKHpsPWUpLGU+a2wmJihrbD1lKX12YXIgdDA9dnc7ZnVuY3Rpb24gVnUocil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBIdTtmb3IodmFyIG4gaW4gcil0W25dPXJbbl07cmV0dXJuIHQuc3RyZWFtPWUsdH19ZnVuY3Rpb24gSHUoKXt9SHUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpIdSxwb2ludDpmdW5jdGlvbihyLGUpe3RoaXMuc3RyZWFtLnBvaW50KHIsZSl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBXdShyLGUsdCl7dmFyIG49ci5jbGlwRXh0ZW50JiZyLmNsaXBFeHRlbnQoKTtyZXR1cm4gci5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbiE9bnVsbCYmci5jbGlwRXh0ZW50KG51bGwpLHZsKHQsci5zdHJlYW0odDApKSxlKHQwLnJlc3VsdCgpKSxuIT1udWxsJiZyLmNsaXBFeHRlbnQobikscn1mdW5jdGlvbiBuMChyLGUsdCl7cmV0dXJuIFd1KHIsZnVuY3Rpb24obil7dmFyIGk9ZVsxXVswXS1lWzBdWzBdLHM9ZVsxXVsxXS1lWzBdWzFdLGE9TWF0aC5taW4oaS8oblsxXVswXS1uWzBdWzBdKSxzLyhuWzFdWzFdLW5bMF1bMV0pKSxvPStlWzBdWzBdKyhpLWEqKG5bMV1bMF0rblswXVswXSkpLzIsbD0rZVswXVsxXSsocy1hKihuWzFdWzFdK25bMF1bMV0pKS8yO3Iuc2NhbGUoMTUwKmEpLnRyYW5zbGF0ZShbbyxsXSl9LHQpfWZ1bmN0aW9uIFN3KHIsZSx0KXtyZXR1cm4gbjAocixbWzAsMF0sZV0sdCl9ZnVuY3Rpb24gYncocixlLHQpe3JldHVybiBXdShyLGZ1bmN0aW9uKG4pe3ZhciBpPStlLHM9aS8oblsxXVswXS1uWzBdWzBdKSxhPShpLXMqKG5bMV1bMF0rblswXVswXSkpLzIsbz0tcypuWzBdWzFdO3Iuc2NhbGUoMTUwKnMpLnRyYW5zbGF0ZShbYSxvXSl9LHQpfWZ1bmN0aW9uIHd3KHIsZSx0KXtyZXR1cm4gV3UocixmdW5jdGlvbihuKXt2YXIgaT0rZSxzPWkvKG5bMV1bMV0tblswXVsxXSksYT0tcypuWzBdWzBdLG89KGktcyooblsxXVsxXStuWzBdWzFdKSkvMjtyLnNjYWxlKDE1MCpzKS50cmFuc2xhdGUoW2Esb10pfSx0KX12YXIgaTA9MTYsRXc9V2UoMzAqR2UpO2Z1bmN0aW9uIHIwKHIsZSl7cmV0dXJuK2U/VHcocixlKTpBdyhyKX1mdW5jdGlvbiBBdyhyKXtyZXR1cm4gVnUoe3BvaW50OmZ1bmN0aW9uKGUsdCl7ZT1yKGUsdCksdGhpcy5zdHJlYW0ucG9pbnQoZVswXSxlWzFdKX19KX1mdW5jdGlvbiBUdyhyLGUpe2Z1bmN0aW9uIHQobixpLHMsYSxvLGwsYyxoLHUsZixkLHAsXyxnKXt2YXIgbT1jLW4seT1oLWkseD1tKm0reSp5O2lmKHg+NCplJiZfLS0pe3ZhciB2PWErZixTPW8rZCxiPWwrcCxBPXVpKHYqditTKlMrYipiKSxMPWZpKGIvPUEpLE09aHQoaHQoYiktMSk8c3R8fGh0KHMtdSk8c3Q/KHMrdSkvMjpBbihTLHYpLHc9cihNLEwpLFI9d1swXSxOPXdbMV0sQj1SLW4sST1OLWksVT15KkItbSpJOyhVKlUveD5lfHxodCgobSpCK3kqSSkveC0uNSk+LjN8fGEqZitvKmQrbCpwPEV3KSYmKHQobixpLHMsYSxvLGwsUixOLE0sdi89QSxTLz1BLGIsXyxnKSxnLnBvaW50KFIsTiksdChSLE4sTSx2LFMsYixjLGgsdSxmLGQscCxfLGcpKX19cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpLHMsYSxvLGwsYyxoLHUsZixkLHAsXyxnPXtwb2ludDptLGxpbmVTdGFydDp5LGxpbmVFbmQ6dixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpLGcubGluZVN0YXJ0PVN9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25FbmQoKSxnLmxpbmVTdGFydD15fX07ZnVuY3Rpb24gbShMLE0pe0w9cihMLE0pLG4ucG9pbnQoTFswXSxMWzFdKX1mdW5jdGlvbiB5KCl7dT1OYU4sZy5wb2ludD14LG4ubGluZVN0YXJ0KCl9ZnVuY3Rpb24geChMLE0pe3ZhciB3PWZyKFtMLE1dKSxSPXIoTCxNKTt0KHUsZixoLGQscCxfLHU9UlswXSxmPVJbMV0saD1MLGQ9d1swXSxwPXdbMV0sXz13WzJdLGkwLG4pLG4ucG9pbnQodSxmKX1mdW5jdGlvbiB2KCl7Zy5wb2ludD1tLG4ubGluZUVuZCgpfWZ1bmN0aW9uIFMoKXt5KCksZy5wb2ludD1iLGcubGluZUVuZD1BfWZ1bmN0aW9uIGIoTCxNKXt4KGk9TCxNKSxzPXUsYT1mLG89ZCxsPXAsYz1fLGcucG9pbnQ9eH1mdW5jdGlvbiBBKCl7dCh1LGYsaCxkLHAsXyxzLGEsaSxvLGwsYyxpMCxuKSxnLmxpbmVFbmQ9dix2KCl9cmV0dXJuIGd9fXZhciBDdz1WdSh7cG9pbnQ6ZnVuY3Rpb24ocixlKXt0aGlzLnN0cmVhbS5wb2ludChyKkdlLGUqR2UpfX0pO2Z1bmN0aW9uIFJ3KHIpe3JldHVybiBWdSh7cG9pbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1yKGUsdCk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9ZnVuY3Rpb24gUHcocixlLHQsbixpKXtmdW5jdGlvbiBzKGEsbyl7cmV0dXJuIGEqPW4sbyo9aSxbZStyKmEsdC1yKm9dfXJldHVybiBzLmludmVydD1mdW5jdGlvbihhLG8pe3JldHVyblsoYS1lKS9yKm4sKHQtbykvcippXX0sc31mdW5jdGlvbiBzMChyLGUsdCxuLGkscyl7aWYoIXMpcmV0dXJuIFB3KHIsZSx0LG4saSk7dmFyIGE9V2Uocyksbz1VZShzKSxsPWEqcixjPW8qcixoPWEvcix1PW8vcixmPShvKnQtYSplKS9yLGQ9KG8qZSthKnQpL3I7ZnVuY3Rpb24gcChfLGcpe3JldHVybiBfKj1uLGcqPWksW2wqXy1jKmcrZSx0LWMqXy1sKmddfXJldHVybiBwLmludmVydD1mdW5jdGlvbihfLGcpe3JldHVybltuKihoKl8tdSpnK2YpLGkqKGQtdSpfLWgqZyldfSxwfWZ1bmN0aW9uIFh1KHIpe3JldHVybiBMdyhmdW5jdGlvbigpe3JldHVybiByfSkoKX1mdW5jdGlvbiBMdyhyKXt2YXIgZSx0PTE1MCxuPTQ4MCxpPTI1MCxzPTAsYT0wLG89MCxsPTAsYz0wLGgsdT0wLGY9MSxkPTEscD1udWxsLF89JGcsZz1udWxsLG0seSx4LHY9ZTAsUz0uNSxiLEEsTCxNLHc7ZnVuY3Rpb24gUihVKXtyZXR1cm4gTChVWzBdKkdlLFVbMV0qR2UpfWZ1bmN0aW9uIE4oVSl7cmV0dXJuIFU9TC5pbnZlcnQoVVswXSxVWzFdKSxVJiZbVVswXSp5dCxVWzFdKnl0XX1SLnN0cmVhbT1mdW5jdGlvbihVKXtyZXR1cm4gTSYmdz09PVU/TTpNPUN3KFJ3KGgpKF8oYih2KHc9VSkpKSkpfSxSLnByZWNsaXA9ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF89VSxwPXZvaWQgMCxJKCkpOl99LFIucG9zdGNsaXA9ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9VSxnPW09eT14PW51bGwsSSgpKTp2fSxSLmNsaXBBbmdsZT1mdW5jdGlvbihVKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz0rVT9sdyhwPVUqR2UpOihwPW51bGwsJGcpLEkoKSk6cCp5dH0sUi5jbGlwRXh0ZW50PWZ1bmN0aW9uKFUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PVU9PW51bGw/KGc9bT15PXg9bnVsbCxlMCk6aHcoZz0rVVswXVswXSxtPStVWzBdWzFdLHk9K1VbMV1bMF0seD0rVVsxXVsxXSksSSgpKTpnPT1udWxsP251bGw6W1tnLG1dLFt5LHhdXX0sUi5zY2FsZT1mdW5jdGlvbihVKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rVSxCKCkpOnR9LFIudHJhbnNsYXRlPWZ1bmN0aW9uKFUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStVWzBdLGk9K1VbMV0sQigpKTpbbixpXX0sUi5jZW50ZXI9ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9VVswXSUzNjAqR2UsYT1VWzFdJTM2MCpHZSxCKCkpOltzKnl0LGEqeXRdfSxSLnJvdGF0ZT1mdW5jdGlvbihVKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1VWzBdJTM2MCpHZSxsPVVbMV0lMzYwKkdlLGM9VS5sZW5ndGg+Mj9VWzJdJTM2MCpHZTowLEIoKSk6W28qeXQsbCp5dCxjKnl0XX0sUi5hbmdsZT1mdW5jdGlvbihVKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1VJTM2MCpHZSxCKCkpOnUqeXR9LFIucmVmbGVjdFg9ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9VT8tMToxLEIoKSk6ZjwwfSxSLnJlZmxlY3RZPWZ1bmN0aW9uKFUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPVU/LTE6MSxCKCkpOmQ8MH0sUi5wcmVjaXNpb249ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9cjAoQSxTPVUqVSksSSgpKTp1aShTKX0sUi5maXRFeHRlbnQ9ZnVuY3Rpb24oVSx6KXtyZXR1cm4gbjAoUixVLHopfSxSLmZpdFNpemU9ZnVuY3Rpb24oVSx6KXtyZXR1cm4gU3coUixVLHopfSxSLmZpdFdpZHRoPWZ1bmN0aW9uKFUseil7cmV0dXJuIGJ3KFIsVSx6KX0sUi5maXRIZWlnaHQ9ZnVuY3Rpb24oVSx6KXtyZXR1cm4gd3coUixVLHopfTtmdW5jdGlvbiBCKCl7dmFyIFU9czAodCwwLDAsZixkLHUpLmFwcGx5KG51bGwsZShzLGEpKSx6PXMwKHQsbi1VWzBdLGktVVsxXSxmLGQsdSk7cmV0dXJuIGg9RmcobyxsLGMpLEE9RnUoZSx6KSxMPUZ1KGgsQSksYj1yMChBLFMpLEkoKX1mdW5jdGlvbiBJKCl7cmV0dXJuIE09dz1udWxsLFJ9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGU9ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksUi5pbnZlcnQ9ZS5pbnZlcnQmJk4sQigpfX1mdW5jdGlvbiBJdyhyKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj11aShlKmUrdCp0KSxpPXIobikscz1VZShpKSxhPVdlKGkpO3JldHVybltBbihlKnMsbiphKSxmaShuJiZ0KnMvbildfX1mdW5jdGlvbiBxdShyLGUpe3JldHVybltyLEcxKEgxKChmbitlKS8yKSldfXF1LmludmVydD1mdW5jdGlvbihyLGUpe3JldHVybltyLDIqd3UoazEoZSkpLWZuXX07ZnVuY3Rpb24gVXcoKXtyZXR1cm4gRHcocXUpLnNjYWxlKDk2MS9kbil9ZnVuY3Rpb24gRHcocil7dmFyIGU9WHUociksdD1lLmNlbnRlcixuPWUuc2NhbGUsaT1lLnRyYW5zbGF0ZSxzPWUuY2xpcEV4dGVudCxhPW51bGwsbyxsLGM7ZS5zY2FsZT1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obih1KSxoKCkpOm4oKX0sZS50cmFuc2xhdGU9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkodSksaCgpKTppKCl9LGUuY2VudGVyPWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0KHUpLGgoKSk6dCgpfSxlLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9PW51bGw/YT1vPWw9Yz1udWxsOihhPSt1WzBdWzBdLG89K3VbMF1bMV0sbD0rdVsxXVswXSxjPSt1WzFdWzFdKSxoKCkpOmE9PW51bGw/bnVsbDpbW2Esb10sW2wsY11dfTtmdW5jdGlvbiBoKCl7dmFyIHU9ZXQqbigpLGY9ZShrZyhlLnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gcyhhPT1udWxsP1tbZlswXS11LGZbMV0tdV0sW2ZbMF0rdSxmWzFdK3VdXTpyPT09cXU/W1tNYXRoLm1heChmWzBdLXUsYSksb10sW01hdGgubWluKGZbMF0rdSxsKSxjXV06W1thLE1hdGgubWF4KGZbMV0tdSxvKV0sW2wsTWF0aC5taW4oZlsxXSt1LGMpXV0pfXJldHVybiBoKCl9ZnVuY3Rpb24gJHUocixlKXtyZXR1cm5bcixlXX0kdS5pbnZlcnQ9JHU7ZnVuY3Rpb24gTncoKXtyZXR1cm4gWHUoJHUpLnNjYWxlKDE1Mi42Myl9ZnVuY3Rpb24gYTAocixlKXt2YXIgdD1XZShlKSxuPTErV2UocikqdDtyZXR1cm5bdCpVZShyKS9uLFVlKGUpL25dfWEwLmludmVydD1JdyhmdW5jdGlvbihyKXtyZXR1cm4gMip3dShyKX0pO2Z1bmN0aW9uIEZ3KCl7cmV0dXJuIFh1KGEwKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfWNvbnN0IFl1PXt9LFp1PXI9Pnt2YXIgbixpO2NvbnN0IGU9SlNPTi5zdHJpbmdpZnkocik7aWYoWXVbZV0pcmV0dXJuIFl1W2VdO2NvbnN0IHQ9KHIuZXF1aXJlY3Rhbmd1bGFyP053KCk6VXcoKSkuY2VudGVyKHIuY2VudGVyKS5zY2FsZShyLnNjYWxlKS50cmFuc2xhdGUoKG49ci50cmFuc2xhdGUpIT1udWxsP246WzAsMF0pLnByZWNpc2lvbigoaT1yLnByZWNpc2lvbikhPW51bGw/aTouMSk7cmV0dXJuIHIucm90YXRlJiZ0LnJvdGF0ZShyLnJvdGF0ZSksWXVbZV09dCx0fSxKdT0ocixlKT0+e2NvbnN0IHQ9clswXVswXT09PS05OTkmJnJbMF1bMV09PT0tOTk5O2xldCBuPW51bGw7aWYodCYmKHIuc2hpZnQoKSxlKSl7Y29uc3QgaT1lLmNlbnRlcigpLHM9ZS5yb3RhdGUoKTtzWzBdJiYobj1lKFsxODAtc1swXStpWzBdLDBdKSl9cmV0dXJuIHIubWFwKChbaSxzXSk9PntsZXQgYTtpZihlKXtjb25zdFtvLGxdPWUoW2ksc10pO2E9bmV3IHEobywtbCl9ZWxzZSBhPW5ldyBxKGkscyk7cmV0dXJuIG4mJmEueDwwJiYoYS54Kz1NYXRoLmFicyhuWzBdKSoyKSxhfSl9O2Z1bmN0aW9uIE93KHIsZT0wKXtjb25zdCB0PXJbMF0uaW5kZXghPT1udWxsLG49bmV3IFNldChPYmplY3Qua2V5cyhyWzBdLmF0dHJpYnV0ZXMpKSxpPW5ldyBTZXQoT2JqZWN0LmtleXMoclswXS5tb3JwaEF0dHJpYnV0ZXMpKSxzPXt9LGE9e30sbz1yWzBdLm1vcnBoVGFyZ2V0c1JlbGF0aXZlLGw9bmV3IGtlO2xldCBjPTA7Zm9yKGxldCBoPTA7aDxyLmxlbmd0aDsrK2gpe2NvbnN0IHU9cltoXTtsZXQgZj0wO2lmKHQhPT0odS5pbmRleCE9PW51bGwpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuIEFsbCBnZW9tZXRyaWVzIG11c3QgaGF2ZSBjb21wYXRpYmxlIGF0dHJpYnV0ZXM7IG1ha2Ugc3VyZSBpbmRleCBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1LmF0dHJpYnV0ZXMpe2lmKCFuLmhhcyhkKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsnLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzOyBtYWtlIHN1cmUgIicrZCsnIiBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uJyksbnVsbDtzW2RdPT09dm9pZCAwJiYoc1tkXT1bXSksc1tkXS5wdXNoKHUuYXR0cmlidXRlc1tkXSksZisrfWlmKGYhPT1uLnNpemUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gTWFrZSBzdXJlIGFsbCBnZW9tZXRyaWVzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihvIT09dS5tb3JwaFRhcmdldHNSZWxhdGl2ZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiAubW9ycGhUYXJnZXRzUmVsYXRpdmUgbXVzdCBiZSBjb25zaXN0ZW50IHRocm91Z2hvdXQgYWxsIGdlb21ldHJpZXMuIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1Lm1vcnBoQXR0cmlidXRlcyl7aWYoIWkuaGFzKGQpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuICAubW9ycGhBdHRyaWJ1dGVzIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLG51bGw7YVtkXT09PXZvaWQgMCYmKGFbZF09W10pLGFbZF0ucHVzaCh1Lm1vcnBoQXR0cmlidXRlc1tkXSl9aWYoZSl7bGV0IGQ7aWYodClkPXUuaW5kZXguY291bnQ7ZWxzZSBpZih1LmF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDApZD11LmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQ7ZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiBUaGUgZ2VvbWV0cnkgbXVzdCBoYXZlIGVpdGhlciBhbiBpbmRleCBvciBhIHBvc2l0aW9uIGF0dHJpYnV0ZSIpLG51bGw7aWYoZT09PTEpbC5hZGRHcm91cChjLGQsaCk7ZWxzZSBpZihlPT09MiYmdS5ncm91cHMubGVuZ3RoPjApZm9yKGxldCBwIG9mIHUuZ3JvdXBzKXtsZXQgXz1wLm1hdGVyaWFsSW5kZXg7bC5hZGRHcm91cChjK3Auc3RhcnQsTWF0aC5taW4ocC5jb3VudCxkKSxfKX1jKz1kfX1pZih0KXtsZXQgaD0wO2NvbnN0IHU9W107Zm9yKGxldCBmPTA7ZjxyLmxlbmd0aDsrK2Ype2NvbnN0IGQ9cltmXS5pbmRleDtmb3IobGV0IHA9MDtwPGQuY291bnQ7KytwKXUucHVzaChkLmdldFgocCkraCk7aCs9cltmXS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWwuc2V0SW5kZXgodSl9Zm9yKGNvbnN0IGggaW4gcyl7Y29uc3QgdT1vMChzW2hdKTtpZighdSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIGF0dHJpYnV0ZS4iKSxudWxsO2wuc2V0QXR0cmlidXRlKGgsdSl9Zm9yKGNvbnN0IGggaW4gYSl7Y29uc3QgdT1hW2hdWzBdLmxlbmd0aDtpZih1PT09MClicmVhaztsLm1vcnBoQXR0cmlidXRlcz1sLm1vcnBoQXR0cmlidXRlc3x8e30sbC5tb3JwaEF0dHJpYnV0ZXNbaF09W107Zm9yKGxldCBmPTA7Zjx1OysrZil7Y29uc3QgZD1bXTtmb3IobGV0IF89MDtfPGFbaF0ubGVuZ3RoOysrXylkLnB1c2goYVtoXVtfXVtmXSk7Y29uc3QgcD1vMChkKTtpZighcClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIG1vcnBoQXR0cmlidXRlLiIpLG51bGw7bC5tb3JwaEF0dHJpYnV0ZXNbaF0ucHVzaChwKX19cmV0dXJuIGU9PT0yP0J3KGwpOmx9ZnVuY3Rpb24gbzAocil7bGV0IGUsdCxuLGk9LTEscz0wO2ZvcihsZXQgYz0wO2M8ci5sZW5ndGg7KytjKXtjb25zdCBoPXJbY107aWYoaC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIiksbnVsbDtpZihlPT09dm9pZCAwJiYoZT1oLmFycmF5LmNvbnN0cnVjdG9yKSxlIT09aC5hcnJheS5jb25zdHJ1Y3RvcilyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmFycmF5IG11c3QgYmUgb2YgY29uc2lzdGVudCBhcnJheSB0eXBlcyBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKHQ9PT12b2lkIDAmJih0PWguaXRlbVNpemUpLHQhPT1oLml0ZW1TaXplKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUuaXRlbVNpemUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYobj09PXZvaWQgMCYmKG49aC5ub3JtYWxpemVkKSxuIT09aC5ub3JtYWxpemVkKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUubm9ybWFsaXplZCBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihpPT09LTEmJihpPWguZ3B1VHlwZSksaSE9PWguZ3B1VHlwZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmdwdVR5cGUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7cys9aC5hcnJheS5sZW5ndGh9Y29uc3QgYT1uZXcgZShzKTtsZXQgbz0wO2ZvcihsZXQgYz0wO2M8ci5sZW5ndGg7KytjKWEuc2V0KHJbY10uYXJyYXksbyksbys9cltjXS5hcnJheS5sZW5ndGg7Y29uc3QgbD1uZXcgS2UoYSx0LG4pO3JldHVybiBpIT09dm9pZCAwJiYobC5ncHVUeXBlPWkpLGx9ZnVuY3Rpb24gQncocil7aWYoci5ncm91cHMubGVuZ3RoPT09MClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzLm1lcmdlR3JvdXBzKCk6IE5vIGdyb3VwcyBhcmUgZGVmaW5lZC4gTm90aGluZyB0byBtZXJnZS4iKSxyO2xldCBlPXIuZ3JvdXBzO2lmKGU9ZS5zb3J0KChhLG8pPT5hLm1hdGVyaWFsSW5kZXghPT1vLm1hdGVyaWFsSW5kZXg/YS5tYXRlcmlhbEluZGV4LW8ubWF0ZXJpYWxJbmRleDphLnN0YXJ0LW8uc3RhcnQpLHIuZ2V0SW5kZXgoKT09PW51bGwpe2NvbnN0IGE9ci5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksbz1bXTtmb3IobGV0IGw9MDtsPGEuY291bnQ7bCs9MylvLnB1c2gobCxsKzEsbCsyKTtyLnNldEluZGV4KG8pLG8ubGVuZ3RoPTB9Y29uc3QgdD1yLmdldEluZGV4KCksbj1bXTtmb3IobGV0IGE9MDthPGUubGVuZ3RoO2ErKyl7Y29uc3Qgbz1lW2FdLGw9by5zdGFydCxjPWwrby5jb3VudDtmb3IobGV0IGg9bDtoPGM7aCsrKW4ucHVzaCh0LmdldFgoaCkpfXIuZGlzcG9zZSgpLHIuc2V0SW5kZXgobiksbi5sZW5ndGg9MDtsZXQgaT0wO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKXtjb25zdCBvPWVbYV07by5zdGFydD1pLGkrPW8uY291bnR9bGV0IHM9ZVswXTtyLmdyb3Vwcz1bc107Zm9yKGxldCBhPTE7YTxlLmxlbmd0aDthKyspe2NvbnN0IG89ZVthXTtzLm1hdGVyaWFsSW5kZXg9PT1vLm1hdGVyaWFsSW5kZXg/cy5jb3VudCs9by5jb3VudDoocz1vLHIuZ3JvdXBzLnB1c2gocykpfXJldHVybiByfXZhciBHbD0ocixlKT0+e2NvbnN0IHQ9T3cocixlIT1udWxsP2U6MCksbj17fSxpPVtdLHM9T2JqZWN0LmtleXModC5hdHRyaWJ1dGVzKTtyZXR1cm4gdC5pbmRleCYmcy5wdXNoKCJpbmRleCIpLHMuZm9yRWFjaChhPT57Y29uc3Qgbz1hPT09ImluZGV4Ij90LmluZGV4OnQuYXR0cmlidXRlc1thXTtuW2FdPXthcnJheTpvLmFycmF5LGl0ZW1TaXplOm8uaXRlbVNpemV9LGkucHVzaChvLmFycmF5LmJ1ZmZlcil9KSxlJiYobi5ncm91cHM9dC5ncm91cHMpLHQuZGlzcG9zZSgpLHIuZm9yRWFjaChhPT57YS5kaXNwb3NlKCl9KSx7bWVzc2FnZTpuLHRyYW5zZmVyOml9fTtjb25zdCB6dz0oe2Nvb3JkaW5hdGVzQXJyOnIsc3BsaXQ6ZSxiYm94OnQsYmJveE9mZnNldDpuLGRlcHRoOmkscHJvamVjdGlvbjpzLHVzZUdyb3VwczphLGhhc1RvcDpvLGhhc0JvdHRvbTpsLGhhc1NpZGU6Y30pPT57Y29uc3QgaD1zJiZadShzKSx1PXIubWFwKHA9Pkp1KHAsaCkpO2xldCBmO2lmKHQpe2NvbnN0W3AsX109SnUoW1t0WzBdLHRbMV1dLFt0WzJdLHRbM11dXSxzIT1udWxsJiZzLnJvdGF0ZT9adSh3Zih2cih7fSxzKSx7cm90YXRlOnZvaWQgMH0pKTpoKTtuJiYocC54Kz1uWzBdLHAueSs9blsxXSxfLngrPW5bMl0sXy55Kz1uWzNdKSxmPW5ldyBEdChuZXcgUChwLngscC55LDApLG5ldyBQKF8ueCxfLnksMCkpfWNvbnN0IGQ9dS5tYXAoKHAsXyk9Pnt2YXIgZztyZXR1cm4gdzEoe3BvaW50czpwLHNwbGl0OmUsZGVwdGg6KGc9aVtfXSkhPW51bGw/ZzppWzBdLGhhc1RvcDpvLGhhc0JvdHRvbTpsLGhhc1NpZGU6Yyxib3gzOmZ9KX0pO3JldHVybiBHbChkLGEpfTtmdW5jdGlvbiBLdShyLGUsdCxuLGkpe2xldCBzO2lmKHI9ci5zdWJhcnJheXx8ci5zbGljZT9yOnIuYnVmZmVyLHQ9dC5zdWJhcnJheXx8dC5zbGljZT90OnQuYnVmZmVyLHI9ZT9yLnN1YmFycmF5P3Iuc3ViYXJyYXkoZSxpJiZlK2kpOnIuc2xpY2UoZSxpJiZlK2kpOnIsdC5zZXQpdC5zZXQocixuKTtlbHNlIGZvcihzPTA7czxyLmxlbmd0aDtzKyspdFtzK25dPXJbc107cmV0dXJuIHR9ZnVuY3Rpb24ga3cocil7cmV0dXJuIHIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXk/cjpyIGluc3RhbmNlb2Yga2U/ci5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikuYXJyYXk6ci5tYXAoZT0+e2NvbnN0IHQ9QXJyYXkuaXNBcnJheShlKTtyZXR1cm4gZSBpbnN0YW5jZW9mIFA/W2UueCxlLnksZS56XTplIGluc3RhbmNlb2YgcT9bZS54LGUueSwwXTp0JiZlLmxlbmd0aD09PTM/W2VbMF0sZVsxXSxlWzJdXTp0JiZlLmxlbmd0aD09PTI/W2VbMF0sZVsxXSwwXTplfSkuZmxhdCgpfWNsYXNzIEd3IGV4dGVuZHMga2V7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaExpbmUiLHRoaXMuaXNNZXNoTGluZT0hMCx0aGlzLnBvc2l0aW9ucz1bXSx0aGlzLnByZXZpb3VzPVtdLHRoaXMubmV4dD1bXSx0aGlzLnNpZGU9W10sdGhpcy53aWR0aD1bXSx0aGlzLmluZGljZXNfYXJyYXk9W10sdGhpcy51dnM9W10sdGhpcy5jb3VudGVycz1bXSx0aGlzLndpZHRoQ2FsbGJhY2s9bnVsbCx0aGlzLl9wb2ludHM9W10sdGhpcy5tYXRyaXhXb3JsZD1uZXcgSWUsT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9pbnRzOntlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiB0aGlzLl9wb2ludHN9LHNldChlKXt0aGlzLnNldFBvaW50cyhlLHRoaXMud2lkdGhDYWxsYmFjayl9fX0pfXNldE1hdHJpeFdvcmxkKGUpe3RoaXMubWF0cml4V29ybGQ9ZX1zZXRQb2ludHMoZSx0KXtpZihlPWt3KGUpLHRoaXMuX3BvaW50cz1lLHRoaXMud2lkdGhDYWxsYmFjaz10IT1udWxsP3Q6bnVsbCx0aGlzLnBvc2l0aW9ucz1bXSx0aGlzLmNvdW50ZXJzPVtdLGUubGVuZ3RoJiZlWzBdaW5zdGFuY2VvZiBQKWZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCBpPWVbbl0scz1uLyhlLmxlbmd0aC0xKTt0aGlzLnBvc2l0aW9ucy5wdXNoKGkueCxpLnksaS56KSx0aGlzLnBvc2l0aW9ucy5wdXNoKGkueCxpLnksaS56KSx0aGlzLmNvdW50ZXJzLnB1c2gocyksdGhpcy5jb3VudGVycy5wdXNoKHMpfWVsc2UgZm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKz0zKXtjb25zdCBpPW4vKGUubGVuZ3RoLTEpO3RoaXMucG9zaXRpb25zLnB1c2goZVtuXSxlW24rMV0sZVtuKzJdKSx0aGlzLnBvc2l0aW9ucy5wdXNoKGVbbl0sZVtuKzFdLGVbbisyXSksdGhpcy5jb3VudGVycy5wdXNoKGkpLHRoaXMuY291bnRlcnMucHVzaChpKX10aGlzLnByb2Nlc3MoKX1jb21wYXJlVjMoZSx0KXtjb25zdCBuPWUqNixpPXQqNjtyZXR1cm4gdGhpcy5wb3NpdGlvbnNbbl09PT10aGlzLnBvc2l0aW9uc1tpXSYmdGhpcy5wb3NpdGlvbnNbbisxXT09PXRoaXMucG9zaXRpb25zW2krMV0mJnRoaXMucG9zaXRpb25zW24rMl09PT10aGlzLnBvc2l0aW9uc1tpKzJdfWNvcHlWMyhlKXtjb25zdCB0PWUqNjtyZXR1cm5bdGhpcy5wb3NpdGlvbnNbdF0sdGhpcy5wb3NpdGlvbnNbdCsxXSx0aGlzLnBvc2l0aW9uc1t0KzJdXX1wcm9jZXNzKCl7Y29uc3QgZT10aGlzLnBvc2l0aW9ucy5sZW5ndGgvNjt0aGlzLnByZXZpb3VzPVtdLHRoaXMubmV4dD1bXSx0aGlzLnNpZGU9W10sdGhpcy53aWR0aD1bXSx0aGlzLmluZGljZXNfYXJyYXk9W10sdGhpcy51dnM9W107bGV0IHQsbjt0aGlzLmNvbXBhcmVWMygwLGUtMSk/bj10aGlzLmNvcHlWMyhlLTIpOm49dGhpcy5jb3B5VjMoMCksdGhpcy5wcmV2aW91cy5wdXNoKG5bMF0sblsxXSxuWzJdKSx0aGlzLnByZXZpb3VzLnB1c2goblswXSxuWzFdLG5bMl0pO2ZvcihsZXQgaT0wO2k8ZTtpKyspe2lmKHRoaXMuc2lkZS5wdXNoKDEpLHRoaXMuc2lkZS5wdXNoKC0xKSx0aGlzLndpZHRoQ2FsbGJhY2s/dD10aGlzLndpZHRoQ2FsbGJhY2soaS8oZS0xKSk6dD0xLHRoaXMud2lkdGgucHVzaCh0KSx0aGlzLndpZHRoLnB1c2godCksdGhpcy51dnMucHVzaChpLyhlLTEpLDApLHRoaXMudXZzLnB1c2goaS8oZS0xKSwxKSxpPGUtMSl7bj10aGlzLmNvcHlWMyhpKSx0aGlzLnByZXZpb3VzLnB1c2goblswXSxuWzFdLG5bMl0pLHRoaXMucHJldmlvdXMucHVzaChuWzBdLG5bMV0sblsyXSk7Y29uc3Qgcz1pKjI7dGhpcy5pbmRpY2VzX2FycmF5LnB1c2gocyxzKzEscysyKSx0aGlzLmluZGljZXNfYXJyYXkucHVzaChzKzIscysxLHMrMyl9aT4wJiYobj10aGlzLmNvcHlWMyhpKSx0aGlzLm5leHQucHVzaChuWzBdLG5bMV0sblsyXSksdGhpcy5uZXh0LnB1c2goblswXSxuWzFdLG5bMl0pKX10aGlzLmNvbXBhcmVWMyhlLTEsMCk/bj10aGlzLmNvcHlWMygxKTpuPXRoaXMuY29weVYzKGUtMSksdGhpcy5uZXh0LnB1c2goblswXSxuWzFdLG5bMl0pLHRoaXMubmV4dC5wdXNoKG5bMF0sblsxXSxuWzJdKSwhdGhpcy5fYXR0cmlidXRlc3x8dGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCE9PXRoaXMucG9zaXRpb25zLmxlbmd0aD90aGlzLl9hdHRyaWJ1dGVzPXtwb3NpdGlvbjpuZXcgS2UobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvc2l0aW9ucyksMykscHJldmlvdXM6bmV3IEtlKG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wcmV2aW91cyksMyksbmV4dDpuZXcgS2UobmV3IEZsb2F0MzJBcnJheSh0aGlzLm5leHQpLDMpLHNpZGU6bmV3IEtlKG5ldyBGbG9hdDMyQXJyYXkodGhpcy5zaWRlKSwxKSx3aWR0aDpuZXcgS2UobmV3IEZsb2F0MzJBcnJheSh0aGlzLndpZHRoKSwxKSx1djpuZXcgS2UobmV3IEZsb2F0MzJBcnJheSh0aGlzLnV2cyksMiksaW5kZXg6bmV3IEtlKG5ldyBVaW50MTZBcnJheSh0aGlzLmluZGljZXNfYXJyYXkpLDEpLGNvdW50ZXJzOm5ldyBLZShuZXcgRmxvYXQzMkFycmF5KHRoaXMuY291bnRlcnMpLDEpfToodGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvc2l0aW9ucykpLHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24ubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cy5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLnByZXZpb3VzKSksdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cy5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLm5leHQuY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5uZXh0KSksdGhpcy5fYXR0cmlidXRlcy5uZXh0Lm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMuc2lkZS5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLnNpZGUpKSx0aGlzLl9hdHRyaWJ1dGVzLnNpZGUubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy53aWR0aC5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLndpZHRoKSksdGhpcy5fYXR0cmlidXRlcy53aWR0aC5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLnV2LmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMudXZzKSksdGhpcy5fYXR0cmlidXRlcy51di5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLmluZGV4LmNvcHlBcnJheShuZXcgVWludDE2QXJyYXkodGhpcy5pbmRpY2VzX2FycmF5KSksdGhpcy5fYXR0cmlidXRlcy5pbmRleC5uZWVkc1VwZGF0ZT0hMCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIix0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uKSx0aGlzLnNldEF0dHJpYnV0ZSgicHJldmlvdXMiLHRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMpLHRoaXMuc2V0QXR0cmlidXRlKCJuZXh0Iix0aGlzLl9hdHRyaWJ1dGVzLm5leHQpLHRoaXMuc2V0QXR0cmlidXRlKCJzaWRlIix0aGlzLl9hdHRyaWJ1dGVzLnNpZGUpLHRoaXMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdGhpcy5fYXR0cmlidXRlcy53aWR0aCksdGhpcy5zZXRBdHRyaWJ1dGUoInV2Iix0aGlzLl9hdHRyaWJ1dGVzLnV2KSx0aGlzLnNldEF0dHJpYnV0ZSgiY291bnRlcnMiLHRoaXMuX2F0dHJpYnV0ZXMuY291bnRlcnMpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsdGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbiksdGhpcy5zZXRBdHRyaWJ1dGUoInByZXZpb3VzIix0aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzKSx0aGlzLnNldEF0dHJpYnV0ZSgibmV4dCIsdGhpcy5fYXR0cmlidXRlcy5uZXh0KSx0aGlzLnNldEF0dHJpYnV0ZSgic2lkZSIsdGhpcy5fYXR0cmlidXRlcy5zaWRlKSx0aGlzLnNldEF0dHJpYnV0ZSgid2lkdGgiLHRoaXMuX2F0dHJpYnV0ZXMud2lkdGgpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsdGhpcy5fYXR0cmlidXRlcy51diksdGhpcy5zZXRBdHRyaWJ1dGUoImNvdW50ZXJzIix0aGlzLl9hdHRyaWJ1dGVzLmNvdW50ZXJzKSx0aGlzLnNldEluZGV4KHRoaXMuX2F0dHJpYnV0ZXMuaW5kZXgpLHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKX1hZHZhbmNlKHt4OmUseTp0LHo6bn0pe2NvbnN0IGk9dGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheSxzPXRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMuYXJyYXksYT10aGlzLl9hdHRyaWJ1dGVzLm5leHQuYXJyYXksbz1pLmxlbmd0aDtLdShpLDAscywwLG8pLEt1KGksNixpLDAsby02KSxpW28tNl09ZSxpW28tNV09dCxpW28tNF09bixpW28tM109ZSxpW28tMl09dCxpW28tMV09bixLdShpLDYsYSwwLG8tNiksYVtvLTZdPWUsYVtvLTVdPXQsYVtvLTRdPW4sYVtvLTNdPWUsYVtvLTJdPXQsYVtvLTFdPW4sdGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMubmV4dC5uZWVkc1VwZGF0ZT0hMH19dmFyIGwwPXI9Pntjb25zdHtzZXRQb2ludFdpZHRoOmUsbm9kZXM6dH09cixuPW5ldyBHdztyZXR1cm4gbi5zZXRQb2ludHModCxlKSxufTtjb25zdCBWdz0oe2Nvb3JkaW5hdGVzQXJyOnIscHJvamVjdGlvbjplLGxpbmVXaWR0aDp0LHVzZUdyb3VwczpufSk9Pntjb25zdCBpPWUmJlp1KGUpLGE9ci5tYXAobz0+SnUobyxpKSkubWFwKChvLGwpPT57dmFyIGg7Y29uc3QgYz0oaD10W2xdKSE9bnVsbD9oOnRbMF07cmV0dXJuIGwwKHtub2RlczpvLHNldFBvaW50V2lkdGg6KCk9PmN9KX0pO3JldHVybiBHbChhLG4pfTt2YXIgaHM9e30sSHc9e2dldCBleHBvcnRzKCl7cmV0dXJuIGhzfSxzZXQgZXhwb3J0cyhyKXtocz1yfX07SHcuZXhwb3J0cz1WbCxocy5kZWZhdWx0PVZsO2Z1bmN0aW9uIFZsKHIsZSx0KXt0PXR8fDI7dmFyIG49ZSYmZS5sZW5ndGgsaT1uP2VbMF0qdDpyLmxlbmd0aCxzPWMwKHIsMCxpLHQsITApLGE9W107aWYoIXN8fHMubmV4dD09PXMucHJldilyZXR1cm4gYTt2YXIgbyxsLGMsaCx1LGYsZDtpZihuJiYocz1ZdyhyLGUscyx0KSksci5sZW5ndGg+ODAqdCl7bz1jPXJbMF0sbD1oPXJbMV07Zm9yKHZhciBwPXQ7cDxpO3ArPXQpdT1yW3BdLGY9cltwKzFdLHU8byYmKG89dSksZjxsJiYobD1mKSx1PmMmJihjPXUpLGY+aCYmKGg9Zik7ZD1NYXRoLm1heChjLW8saC1sKSxkPWQhPT0wPzMyNzY3L2Q6MH1yZXR1cm4gU2EocyxhLHQsbyxsLGQsMCksYX1mdW5jdGlvbiBjMChyLGUsdCxuLGkpe3ZhciBzLGE7aWYoaT09PWVmKHIsZSx0LG4pPjApZm9yKHM9ZTtzPHQ7cys9bilhPWYwKHMscltzXSxyW3MrMV0sYSk7ZWxzZSBmb3Iocz10LW47cz49ZTtzLT1uKWE9ZjAocyxyW3NdLHJbcysxXSxhKTtyZXR1cm4gYSYmSGwoYSxhLm5leHQpJiYod2EoYSksYT1hLm5leHQpLGF9ZnVuY3Rpb24gcHIocixlKXtpZighcilyZXR1cm4gcjtlfHwoZT1yKTt2YXIgdD1yLG47ZG8gaWYobj0hMSwhdC5zdGVpbmVyJiYoSGwodCx0Lm5leHQpfHxtdCh0LnByZXYsdCx0Lm5leHQpPT09MCkpe2lmKHdhKHQpLHQ9ZT10LnByZXYsdD09PXQubmV4dClicmVhaztuPSEwfWVsc2UgdD10Lm5leHQ7d2hpbGUobnx8dCE9PWUpO3JldHVybiBlfWZ1bmN0aW9uIFNhKHIsZSx0LG4saSxzLGEpe2lmKHIpeyFhJiZzJiZqdyhyLG4saSxzKTtmb3IodmFyIG89cixsLGM7ci5wcmV2IT09ci5uZXh0Oyl7aWYobD1yLnByZXYsYz1yLm5leHQscz9YdyhyLG4saSxzKTpXdyhyKSl7ZS5wdXNoKGwuaS90fDApLGUucHVzaChyLmkvdHwwKSxlLnB1c2goYy5pL3R8MCksd2Eocikscj1jLm5leHQsbz1jLm5leHQ7Y29udGludWV9aWYocj1jLHI9PT1vKXthP2E9PT0xPyhyPXF3KHByKHIpLGUsdCksU2EocixlLHQsbixpLHMsMikpOmE9PT0yJiYkdyhyLGUsdCxuLGkscyk6U2EocHIociksZSx0LG4saSxzLDEpO2JyZWFrfX19fWZ1bmN0aW9uIFd3KHIpe3ZhciBlPXIucHJldix0PXIsbj1yLm5leHQ7aWYobXQoZSx0LG4pPj0wKXJldHVybiExO2Zvcih2YXIgaT1lLngscz10LngsYT1uLngsbz1lLnksbD10LnksYz1uLnksaD1pPHM/aTxhP2k6YTpzPGE/czphLHU9bzxsP288Yz9vOmM6bDxjP2w6YyxmPWk+cz9pPmE/aTphOnM+YT9zOmEsZD1vPmw/bz5jP286YzpsPmM/bDpjLHA9bi5uZXh0O3AhPT1lOyl7aWYocC54Pj1oJiZwLng8PWYmJnAueT49dSYmcC55PD1kJiZ1cyhpLG8scyxsLGEsYyxwLngscC55KSYmbXQocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBYdyhyLGUsdCxuKXt2YXIgaT1yLnByZXYscz1yLGE9ci5uZXh0O2lmKG10KGkscyxhKT49MClyZXR1cm4hMTtmb3IodmFyIG89aS54LGw9cy54LGM9YS54LGg9aS55LHU9cy55LGY9YS55LGQ9bzxsP288Yz9vOmM6bDxjP2w6YyxwPWg8dT9oPGY/aDpmOnU8Zj91OmYsXz1vPmw/bz5jP286YzpsPmM/bDpjLGc9aD51P2g+Zj9oOmY6dT5mP3U6ZixtPVF1KGQscCxlLHQsbikseT1RdShfLGcsZSx0LG4pLHg9ci5wcmV2Wix2PXIubmV4dFo7eCYmeC56Pj1tJiZ2JiZ2Lno8PXk7KXtpZih4Lng+PWQmJngueDw9XyYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1pJiZ4IT09YSYmdXMobyxoLGwsdSxjLGYseC54LHgueSkmJm10KHgucHJldix4LHgubmV4dCk+PTB8fCh4PXgucHJldlosdi54Pj1kJiZ2Lng8PV8mJnYueT49cCYmdi55PD1nJiZ2IT09aSYmdiE9PWEmJnVzKG8saCxsLHUsYyxmLHYueCx2LnkpJiZtdCh2LnByZXYsdix2Lm5leHQpPj0wKSlyZXR1cm4hMTt2PXYubmV4dFp9Zm9yKDt4JiZ4Lno+PW07KXtpZih4Lng+PWQmJngueDw9XyYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1pJiZ4IT09YSYmdXMobyxoLGwsdSxjLGYseC54LHgueSkmJm10KHgucHJldix4LHgubmV4dCk+PTApcmV0dXJuITE7eD14LnByZXZafWZvcig7diYmdi56PD15Oyl7aWYodi54Pj1kJiZ2Lng8PV8mJnYueT49cCYmdi55PD1nJiZ2IT09aSYmdiE9PWEmJnVzKG8saCxsLHUsYyxmLHYueCx2LnkpJiZtdCh2LnByZXYsdix2Lm5leHQpPj0wKXJldHVybiExO3Y9di5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiBxdyhyLGUsdCl7dmFyIG49cjtkb3t2YXIgaT1uLnByZXYscz1uLm5leHQubmV4dDshSGwoaSxzKSYmaDAoaSxuLG4ubmV4dCxzKSYmYmEoaSxzKSYmYmEocyxpKSYmKGUucHVzaChpLmkvdHwwKSxlLnB1c2gobi5pL3R8MCksZS5wdXNoKHMuaS90fDApLHdhKG4pLHdhKG4ubmV4dCksbj1yPXMpLG49bi5uZXh0fXdoaWxlKG4hPT1yKTtyZXR1cm4gcHIobil9ZnVuY3Rpb24gJHcocixlLHQsbixpLHMpe3ZhciBhPXI7ZG97Zm9yKHZhciBvPWEubmV4dC5uZXh0O28hPT1hLnByZXY7KXtpZihhLmkhPT1vLmkmJm5FKGEsbykpe3ZhciBsPXUwKGEsbyk7YT1wcihhLGEubmV4dCksbD1wcihsLGwubmV4dCksU2EoYSxlLHQsbixpLHMsMCksU2EobCxlLHQsbixpLHMsMCk7cmV0dXJufW89by5uZXh0fWE9YS5uZXh0fXdoaWxlKGEhPT1yKX1mdW5jdGlvbiBZdyhyLGUsdCxuKXt2YXIgaT1bXSxzLGEsbyxsLGM7Zm9yKHM9MCxhPWUubGVuZ3RoO3M8YTtzKyspbz1lW3NdKm4sbD1zPGEtMT9lW3MrMV0qbjpyLmxlbmd0aCxjPWMwKHIsbyxsLG4sITEpLGM9PT1jLm5leHQmJihjLnN0ZWluZXI9ITApLGkucHVzaCh0RShjKSk7Zm9yKGkuc29ydChadykscz0wO3M8aS5sZW5ndGg7cysrKXQ9SncoaVtzXSx0KTtyZXR1cm4gdH1mdW5jdGlvbiBadyhyLGUpe3JldHVybiByLngtZS54fWZ1bmN0aW9uIEp3KHIsZSl7dmFyIHQ9S3cocixlKTtpZighdClyZXR1cm4gZTt2YXIgbj11MCh0LHIpO3JldHVybiBwcihuLG4ubmV4dCkscHIodCx0Lm5leHQpfWZ1bmN0aW9uIEt3KHIsZSl7dmFyIHQ9ZSxuPXIueCxpPXIueSxzPS0xLzAsYTtkb3tpZihpPD10LnkmJmk+PXQubmV4dC55JiZ0Lm5leHQueSE9PXQueSl7dmFyIG89dC54KyhpLXQueSkqKHQubmV4dC54LXQueCkvKHQubmV4dC55LXQueSk7aWYobzw9biYmbz5zJiYocz1vLGE9dC54PHQubmV4dC54P3Q6dC5uZXh0LG89PT1uKSlyZXR1cm4gYX10PXQubmV4dH13aGlsZSh0IT09ZSk7aWYoIWEpcmV0dXJuIG51bGw7dmFyIGw9YSxjPWEueCxoPWEueSx1PTEvMCxmO3Q9YTtkbyBuPj10LngmJnQueD49YyYmbiE9PXQueCYmdXMoaTxoP246cyxpLGMsaCxpPGg/czpuLGksdC54LHQueSkmJihmPU1hdGguYWJzKGktdC55KS8obi10LngpLGJhKHQscikmJihmPHV8fGY9PT11JiYodC54PmEueHx8dC54PT09YS54JiZRdyhhLHQpKSkmJihhPXQsdT1mKSksdD10Lm5leHQ7d2hpbGUodCE9PWwpO3JldHVybiBhfWZ1bmN0aW9uIFF3KHIsZSl7cmV0dXJuIG10KHIucHJldixyLGUucHJldik8MCYmbXQoZS5uZXh0LHIsci5uZXh0KTwwfWZ1bmN0aW9uIGp3KHIsZSx0LG4pe3ZhciBpPXI7ZG8gaS56PT09MCYmKGkuej1RdShpLngsaS55LGUsdCxuKSksaS5wcmV2Wj1pLnByZXYsaS5uZXh0Wj1pLm5leHQsaT1pLm5leHQ7d2hpbGUoaSE9PXIpO2kucHJldloubmV4dFo9bnVsbCxpLnByZXZaPW51bGwsZUUoaSl9ZnVuY3Rpb24gZUUocil7dmFyIGUsdCxuLGkscyxhLG8sbCxjPTE7ZG97Zm9yKHQ9cixyPW51bGwscz1udWxsLGE9MDt0Oyl7Zm9yKGErKyxuPXQsbz0wLGU9MDtlPGMmJihvKyssbj1uLm5leHRaLCEhbik7ZSsrKTtmb3IobD1jO28+MHx8bD4wJiZuOylvIT09MCYmKGw9PT0wfHwhbnx8dC56PD1uLnopPyhpPXQsdD10Lm5leHRaLG8tLSk6KGk9bixuPW4ubmV4dFosbC0tKSxzP3MubmV4dFo9aTpyPWksaS5wcmV2Wj1zLHM9aTt0PW59cy5uZXh0Wj1udWxsLGMqPTJ9d2hpbGUoYT4xKTtyZXR1cm4gcn1mdW5jdGlvbiBRdShyLGUsdCxuLGkpe3JldHVybiByPShyLXQpKml8MCxlPShlLW4pKml8MCxyPShyfHI8PDgpJjE2NzExOTM1LHI9KHJ8cjw8NCkmMjUyNjQ1MTM1LHI9KHJ8cjw8MikmODU4OTkzNDU5LHI9KHJ8cjw8MSkmMTQzMTY1NTc2NSxlPShlfGU8PDgpJjE2NzExOTM1LGU9KGV8ZTw8NCkmMjUyNjQ1MTM1LGU9KGV8ZTw8MikmODU4OTkzNDU5LGU9KGV8ZTw8MSkmMTQzMTY1NTc2NSxyfGU8PDF9ZnVuY3Rpb24gdEUocil7dmFyIGU9cix0PXI7ZG8oZS54PHQueHx8ZS54PT09dC54JiZlLnk8dC55KSYmKHQ9ZSksZT1lLm5leHQ7d2hpbGUoZSE9PXIpO3JldHVybiB0fWZ1bmN0aW9uIHVzKHIsZSx0LG4saSxzLGEsbyl7cmV0dXJuKGktYSkqKGUtbyk+PShyLWEpKihzLW8pJiYoci1hKSoobi1vKT49KHQtYSkqKGUtbykmJih0LWEpKihzLW8pPj0oaS1hKSoobi1vKX1mdW5jdGlvbiBuRShyLGUpe3JldHVybiByLm5leHQuaSE9PWUuaSYmci5wcmV2LmkhPT1lLmkmJiFpRShyLGUpJiYoYmEocixlKSYmYmEoZSxyKSYmckUocixlKSYmKG10KHIucHJldixyLGUucHJldil8fG10KHIsZS5wcmV2LGUpKXx8SGwocixlKSYmbXQoci5wcmV2LHIsci5uZXh0KT4wJiZtdChlLnByZXYsZSxlLm5leHQpPjApfWZ1bmN0aW9uIG10KHIsZSx0KXtyZXR1cm4oZS55LXIueSkqKHQueC1lLngpLShlLngtci54KSoodC55LWUueSl9ZnVuY3Rpb24gSGwocixlKXtyZXR1cm4gci54PT09ZS54JiZyLnk9PT1lLnl9ZnVuY3Rpb24gaDAocixlLHQsbil7dmFyIGk9WGwobXQocixlLHQpKSxzPVhsKG10KHIsZSxuKSksYT1YbChtdCh0LG4scikpLG89WGwobXQodCxuLGUpKTtyZXR1cm4hIShpIT09cyYmYSE9PW98fGk9PT0wJiZXbChyLHQsZSl8fHM9PT0wJiZXbChyLG4sZSl8fGE9PT0wJiZXbCh0LHIsbil8fG89PT0wJiZXbCh0LGUsbikpfWZ1bmN0aW9uIFdsKHIsZSx0KXtyZXR1cm4gZS54PD1NYXRoLm1heChyLngsdC54KSYmZS54Pj1NYXRoLm1pbihyLngsdC54KSYmZS55PD1NYXRoLm1heChyLnksdC55KSYmZS55Pj1NYXRoLm1pbihyLnksdC55KX1mdW5jdGlvbiBYbChyKXtyZXR1cm4gcj4wPzE6cjwwPy0xOjB9ZnVuY3Rpb24gaUUocixlKXt2YXIgdD1yO2Rve2lmKHQuaSE9PXIuaSYmdC5uZXh0LmkhPT1yLmkmJnQuaSE9PWUuaSYmdC5uZXh0LmkhPT1lLmkmJmgwKHQsdC5uZXh0LHIsZSkpcmV0dXJuITA7dD10Lm5leHR9d2hpbGUodCE9PXIpO3JldHVybiExfWZ1bmN0aW9uIGJhKHIsZSl7cmV0dXJuIG10KHIucHJldixyLHIubmV4dCk8MD9tdChyLGUsci5uZXh0KT49MCYmbXQocixyLnByZXYsZSk+PTA6bXQocixlLHIucHJldik8MHx8bXQocixyLm5leHQsZSk8MH1mdW5jdGlvbiByRShyLGUpe3ZhciB0PXIsbj0hMSxpPShyLngrZS54KS8yLHM9KHIueStlLnkpLzI7ZG8gdC55PnMhPXQubmV4dC55PnMmJnQubmV4dC55IT09dC55JiZpPCh0Lm5leHQueC10LngpKihzLXQueSkvKHQubmV4dC55LXQueSkrdC54JiYobj0hbiksdD10Lm5leHQ7d2hpbGUodCE9PXIpO3JldHVybiBufWZ1bmN0aW9uIHUwKHIsZSl7dmFyIHQ9bmV3IGp1KHIuaSxyLngsci55KSxuPW5ldyBqdShlLmksZS54LGUueSksaT1yLm5leHQscz1lLnByZXY7cmV0dXJuIHIubmV4dD1lLGUucHJldj1yLHQubmV4dD1pLGkucHJldj10LG4ubmV4dD10LHQucHJldj1uLHMubmV4dD1uLG4ucHJldj1zLG59ZnVuY3Rpb24gZjAocixlLHQsbil7dmFyIGk9bmV3IGp1KHIsZSx0KTtyZXR1cm4gbj8oaS5uZXh0PW4ubmV4dCxpLnByZXY9bixuLm5leHQucHJldj1pLG4ubmV4dD1pKTooaS5wcmV2PWksaS5uZXh0PWkpLGl9ZnVuY3Rpb24gd2Eocil7ci5uZXh0LnByZXY9ci5wcmV2LHIucHJldi5uZXh0PXIubmV4dCxyLnByZXZaJiYoci5wcmV2Wi5uZXh0Wj1yLm5leHRaKSxyLm5leHRaJiYoci5uZXh0Wi5wcmV2Wj1yLnByZXZaKX1mdW5jdGlvbiBqdShyLGUsdCl7dGhpcy5pPXIsdGhpcy54PWUsdGhpcy55PXQsdGhpcy5wcmV2PW51bGwsdGhpcy5uZXh0PW51bGwsdGhpcy56PTAsdGhpcy5wcmV2Wj1udWxsLHRoaXMubmV4dFo9bnVsbCx0aGlzLnN0ZWluZXI9ITF9VmwuZGV2aWF0aW9uPWZ1bmN0aW9uKHIsZSx0LG4pe3ZhciBpPWUmJmUubGVuZ3RoLHM9aT9lWzBdKnQ6ci5sZW5ndGgsYT1NYXRoLmFicyhlZihyLDAscyx0KSk7aWYoaSlmb3IodmFyIG89MCxsPWUubGVuZ3RoO288bDtvKyspe3ZhciBjPWVbb10qdCxoPW88bC0xP2VbbysxXSp0OnIubGVuZ3RoO2EtPU1hdGguYWJzKGVmKHIsYyxoLHQpKX12YXIgdT0wO2ZvcihvPTA7bzxuLmxlbmd0aDtvKz0zKXt2YXIgZj1uW29dKnQsZD1uW28rMV0qdCxwPW5bbysyXSp0O3UrPU1hdGguYWJzKChyW2ZdLXJbcF0pKihyW2QrMV0tcltmKzFdKS0ocltmXS1yW2RdKSoocltwKzFdLXJbZisxXSkpfXJldHVybiBhPT09MCYmdT09PTA/MDpNYXRoLmFicygodS1hKS9hKX07ZnVuY3Rpb24gZWYocixlLHQsbil7Zm9yKHZhciBpPTAscz1lLGE9dC1uO3M8dDtzKz1uKWkrPShyW2FdLXJbc10pKihyW3MrMV0rclthKzFdKSxhPXM7cmV0dXJuIGl9VmwuZmxhdHRlbj1mdW5jdGlvbihyKXtmb3IodmFyIGU9clswXVswXS5sZW5ndGgsdD17dmVydGljZXM6W10saG9sZXM6W10sZGltZW5zaW9uczplfSxuPTAsaT0wO2k8ci5sZW5ndGg7aSsrKXtmb3IodmFyIHM9MDtzPHJbaV0ubGVuZ3RoO3MrKylmb3IodmFyIGE9MDthPGU7YSsrKXQudmVydGljZXMucHVzaChyW2ldW3NdW2FdKTtpPjAmJihuKz1yW2ktMV0ubGVuZ3RoLHQuaG9sZXMucHVzaChuKSl9cmV0dXJuIHR9O2Z1bmN0aW9uIHNFKHIpe2lmKCFyKXRocm93IG5ldyBFcnJvcigiY29vcmQgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheShyKSl7aWYoci50eXBlPT09IkZlYXR1cmUiJiZyLmdlb21ldHJ5IT09bnVsbCYmci5nZW9tZXRyeS50eXBlPT09IlBvaW50IilyZXR1cm4gci5nZW9tZXRyeS5jb29yZGluYXRlcztpZihyLnR5cGU9PT0iUG9pbnQiKXJldHVybiByLmNvb3JkaW5hdGVzfWlmKEFycmF5LmlzQXJyYXkocikmJnIubGVuZ3RoPj0yJiYhQXJyYXkuaXNBcnJheShyWzBdKSYmIUFycmF5LmlzQXJyYXkoclsxXSkpcmV0dXJuIHI7dGhyb3cgbmV3IEVycm9yKCJjb29yZCBtdXN0IGJlIEdlb0pTT04gUG9pbnQgb3IgYW4gQXJyYXkgb2YgbnVtYmVycyIpfWZ1bmN0aW9uIGFFKHIpe2lmKEFycmF5LmlzQXJyYXkocikpcmV0dXJuIHI7aWYoci50eXBlPT09IkZlYXR1cmUiKXtpZihyLmdlb21ldHJ5IT09bnVsbClyZXR1cm4gci5nZW9tZXRyeS5jb29yZGluYXRlc31lbHNlIGlmKHIuY29vcmRpbmF0ZXMpcmV0dXJuIHIuY29vcmRpbmF0ZXM7dGhyb3cgbmV3IEVycm9yKCJjb29yZHMgbXVzdCBiZSBHZW9KU09OIEZlYXR1cmUsIEdlb21ldHJ5IE9iamVjdCBvciBhbiBBcnJheSIpfWZ1bmN0aW9uIG9FKHIpe3JldHVybiByLnR5cGU9PT0iRmVhdHVyZSI/ci5nZW9tZXRyeTpyfWZ1bmN0aW9uIGxFKHIpe2Zvcih2YXIgZT1hRShyKSx0PTAsbj0xLGkscztuPGUubGVuZ3RoOylpPXN8fGVbMF0scz1lW25dLHQrPShzWzBdLWlbMF0pKihzWzFdK2lbMV0pLG4rKztyZXR1cm4gdD4wfWNvbnN0IGdpPTExMTAyMjMwMjQ2MjUxNTY1ZS0zMixxdD0xMzQyMTc3MjksY0U9KDMrOCpnaSkqZ2k7ZnVuY3Rpb24gdGYocixlLHQsbixpKXtsZXQgcyxhLG8sbCxjPWVbMF0saD1uWzBdLHU9MCxmPTA7aD5jPT1oPi1jPyhzPWMsYz1lWysrdV0pOihzPWgsaD1uWysrZl0pO2xldCBkPTA7aWYodTxyJiZmPHQpZm9yKGg+Yz09aD4tYz8oYT1jK3Msbz1zLShhLWMpLGM9ZVsrK3VdKTooYT1oK3Msbz1zLShhLWgpLGg9blsrK2ZdKSxzPWEsbyE9PTAmJihpW2QrK109byk7dTxyJiZmPHQ7KWg+Yz09aD4tYz8oYT1zK2MsbD1hLXMsbz1zLShhLWwpKyhjLWwpLGM9ZVsrK3VdKTooYT1zK2gsbD1hLXMsbz1zLShhLWwpKyhoLWwpLGg9blsrK2ZdKSxzPWEsbyE9PTAmJihpW2QrK109byk7Zm9yKDt1PHI7KWE9cytjLGw9YS1zLG89cy0oYS1sKSsoYy1sKSxjPWVbKyt1XSxzPWEsbyE9PTAmJihpW2QrK109byk7Zm9yKDtmPHQ7KWE9cytoLGw9YS1zLG89cy0oYS1sKSsoaC1sKSxoPW5bKytmXSxzPWEsbyE9PTAmJihpW2QrK109byk7cmV0dXJuKHMhPT0wfHxkPT09MCkmJihpW2QrK109cyksZH1mdW5jdGlvbiBoRShyLGUpe2xldCB0PWVbMF07Zm9yKGxldCBuPTE7bjxyO24rKyl0Kz1lW25dO3JldHVybiB0fWZ1bmN0aW9uIEVhKHIpe3JldHVybiBuZXcgRmxvYXQ2NEFycmF5KHIpfWNvbnN0IHVFPSgzKzE2KmdpKSpnaSxmRT0oMisxMipnaSkqZ2ksZEU9KDkrNjQqZ2kpKmdpKmdpLGZzPUVhKDQpLGQwPUVhKDgpLHAwPUVhKDEyKSxtMD1FYSgxNiksdG49RWEoNCk7ZnVuY3Rpb24gcEUocixlLHQsbixpLHMsYSl7bGV0IG8sbCxjLGgsdSxmLGQscCxfLGcsbSx5LHgsdixTLGIsQSxMO2NvbnN0IE09ci1pLHc9dC1pLFI9ZS1zLE49bi1zO3Y9TSpOLGY9cXQqTSxkPWYtKGYtTSkscD1NLWQsZj1xdCpOLF89Zi0oZi1OKSxnPU4tXyxTPXAqZy0odi1kKl8tcCpfLWQqZyksYj1SKncsZj1xdCpSLGQ9Zi0oZi1SKSxwPVItZCxmPXF0KncsXz1mLShmLXcpLGc9dy1fLEE9cCpnLShiLWQqXy1wKl8tZCpnKSxtPVMtQSx1PVMtbSxmc1swXT1TLShtK3UpKyh1LUEpLHk9dittLHU9eS12LHg9di0oeS11KSsobS11KSxtPXgtYix1PXgtbSxmc1sxXT14LShtK3UpKyh1LWIpLEw9eSttLHU9TC15LGZzWzJdPXktKEwtdSkrKG0tdSksZnNbM109TDtsZXQgQj1oRSg0LGZzKSxJPWZFKmE7aWYoQj49SXx8LUI+PUl8fCh1PXItTSxvPXItKE0rdSkrKHUtaSksdT10LXcsYz10LSh3K3UpKyh1LWkpLHU9ZS1SLGw9ZS0oUit1KSsodS1zKSx1PW4tTixoPW4tKE4rdSkrKHUtcyksbz09PTAmJmw9PT0wJiZjPT09MCYmaD09PTApfHwoST1kRSphK2NFKk1hdGguYWJzKEIpLEIrPU0qaCtOKm8tKFIqYyt3KmwpLEI+PUl8fC1CPj1JKSlyZXR1cm4gQjt2PW8qTixmPXF0Km8sZD1mLShmLW8pLHA9by1kLGY9cXQqTixfPWYtKGYtTiksZz1OLV8sUz1wKmctKHYtZCpfLXAqXy1kKmcpLGI9bCp3LGY9cXQqbCxkPWYtKGYtbCkscD1sLWQsZj1xdCp3LF89Zi0oZi13KSxnPXctXyxBPXAqZy0oYi1kKl8tcCpfLWQqZyksbT1TLUEsdT1TLW0sdG5bMF09Uy0obSt1KSsodS1BKSx5PXYrbSx1PXktdix4PXYtKHktdSkrKG0tdSksbT14LWIsdT14LW0sdG5bMV09eC0obSt1KSsodS1iKSxMPXkrbSx1PUwteSx0blsyXT15LShMLXUpKyhtLXUpLHRuWzNdPUw7Y29uc3QgVT10Zig0LGZzLDQsdG4sZDApO3Y9TSpoLGY9cXQqTSxkPWYtKGYtTSkscD1NLWQsZj1xdCpoLF89Zi0oZi1oKSxnPWgtXyxTPXAqZy0odi1kKl8tcCpfLWQqZyksYj1SKmMsZj1xdCpSLGQ9Zi0oZi1SKSxwPVItZCxmPXF0KmMsXz1mLShmLWMpLGc9Yy1fLEE9cCpnLShiLWQqXy1wKl8tZCpnKSxtPVMtQSx1PVMtbSx0blswXT1TLShtK3UpKyh1LUEpLHk9dittLHU9eS12LHg9di0oeS11KSsobS11KSxtPXgtYix1PXgtbSx0blsxXT14LShtK3UpKyh1LWIpLEw9eSttLHU9TC15LHRuWzJdPXktKEwtdSkrKG0tdSksdG5bM109TDtjb25zdCB6PXRmKFUsZDAsNCx0bixwMCk7dj1vKmgsZj1xdCpvLGQ9Zi0oZi1vKSxwPW8tZCxmPXF0KmgsXz1mLShmLWgpLGc9aC1fLFM9cCpnLSh2LWQqXy1wKl8tZCpnKSxiPWwqYyxmPXF0KmwsZD1mLShmLWwpLHA9bC1kLGY9cXQqYyxfPWYtKGYtYyksZz1jLV8sQT1wKmctKGItZCpfLXAqXy1kKmcpLG09Uy1BLHU9Uy1tLHRuWzBdPVMtKG0rdSkrKHUtQSkseT12K20sdT15LXYseD12LSh5LXUpKyhtLXUpLG09eC1iLHU9eC1tLHRuWzFdPXgtKG0rdSkrKHUtYiksTD15K20sdT1MLXksdG5bMl09eS0oTC11KSsobS11KSx0blszXT1MO2NvbnN0IEY9dGYoeixwMCw0LHRuLG0wKTtyZXR1cm4gbTBbRi0xXX1mdW5jdGlvbiBxbChyLGUsdCxuLGkscyl7Y29uc3QgYT0oZS1zKSoodC1pKSxvPShyLWkpKihuLXMpLGw9YS1vO2lmKGE9PT0wfHxvPT09MHx8YT4wIT1vPjApcmV0dXJuIGw7Y29uc3QgYz1NYXRoLmFicyhhK28pO3JldHVybiBNYXRoLmFicyhsKT49dUUqYz9sOi1wRShyLGUsdCxuLGkscyxjKX1jb25zdCBnMD1NYXRoLnBvdygyLC01MiksJGw9bmV3IFVpbnQzMkFycmF5KDUxMik7Y2xhc3MgQWF7c3RhdGljIGZyb20oZSx0PXlFLG49dkUpe2NvbnN0IGk9ZS5sZW5ndGgscz1uZXcgRmxvYXQ2NEFycmF5KGkqMik7Zm9yKGxldCBhPTA7YTxpO2ErKyl7Y29uc3Qgbz1lW2FdO3NbMiphXT10KG8pLHNbMiphKzFdPW4obyl9cmV0dXJuIG5ldyBBYShzKX1jb25zdHJ1Y3RvcihlKXtjb25zdCB0PWUubGVuZ3RoPj4xO2lmKHQ+MCYmdHlwZW9mIGVbMF0hPSJudW1iZXIiKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgY29vcmRzIHRvIGNvbnRhaW4gbnVtYmVycy4iKTt0aGlzLmNvb3Jkcz1lO2NvbnN0IG49TWF0aC5tYXgoMip0LTUsMCk7dGhpcy5fdHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheShuKjMpLHRoaXMuX2hhbGZlZGdlcz1uZXcgSW50MzJBcnJheShuKjMpLHRoaXMuX2hhc2hTaXplPU1hdGguY2VpbChNYXRoLnNxcnQodCkpLHRoaXMuX2h1bGxQcmV2PW5ldyBVaW50MzJBcnJheSh0KSx0aGlzLl9odWxsTmV4dD1uZXcgVWludDMyQXJyYXkodCksdGhpcy5faHVsbFRyaT1uZXcgVWludDMyQXJyYXkodCksdGhpcy5faHVsbEhhc2g9bmV3IEludDMyQXJyYXkodGhpcy5faGFzaFNpemUpLmZpbGwoLTEpLHRoaXMuX2lkcz1uZXcgVWludDMyQXJyYXkodCksdGhpcy5fZGlzdHM9bmV3IEZsb2F0NjRBcnJheSh0KSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0e2Nvb3JkczplLF9odWxsUHJldjp0LF9odWxsTmV4dDpuLF9odWxsVHJpOmksX2h1bGxIYXNoOnN9PXRoaXMsYT1lLmxlbmd0aD4+MTtsZXQgbz0xLzAsbD0xLzAsYz0tMS8wLGg9LTEvMDtmb3IobGV0IHc9MDt3PGE7dysrKXtjb25zdCBSPWVbMip3XSxOPWVbMip3KzFdO1I8byYmKG89UiksTjxsJiYobD1OKSxSPmMmJihjPVIpLE4+aCYmKGg9TiksdGhpcy5faWRzW3ddPXd9Y29uc3QgdT0obytjKS8yLGY9KGwraCkvMjtsZXQgZD0xLzAscCxfLGc7Zm9yKGxldCB3PTA7dzxhO3crKyl7Y29uc3QgUj1uZih1LGYsZVsyKnddLGVbMip3KzFdKTtSPGQmJihwPXcsZD1SKX1jb25zdCBtPWVbMipwXSx5PWVbMipwKzFdO2Q9MS8wO2ZvcihsZXQgdz0wO3c8YTt3Kyspe2lmKHc9PT1wKWNvbnRpbnVlO2NvbnN0IFI9bmYobSx5LGVbMip3XSxlWzIqdysxXSk7UjxkJiZSPjAmJihfPXcsZD1SKX1sZXQgeD1lWzIqX10sdj1lWzIqXysxXSxTPTEvMDtmb3IobGV0IHc9MDt3PGE7dysrKXtpZih3PT09cHx8dz09PV8pY29udGludWU7Y29uc3QgUj1fRShtLHkseCx2LGVbMip3XSxlWzIqdysxXSk7UjxTJiYoZz13LFM9Uil9bGV0IGI9ZVsyKmddLEE9ZVsyKmcrMV07aWYoUz09PTEvMCl7Zm9yKGxldCBOPTA7TjxhO04rKyl0aGlzLl9kaXN0c1tOXT1lWzIqTl0tZVswXXx8ZVsyKk4rMV0tZVsxXTtkcyh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxhLTEpO2NvbnN0IHc9bmV3IFVpbnQzMkFycmF5KGEpO2xldCBSPTA7Zm9yKGxldCBOPTAsQj0tMS8wO048YTtOKyspe2NvbnN0IEk9dGhpcy5faWRzW05dO3RoaXMuX2Rpc3RzW0ldPkImJih3W1IrK109SSxCPXRoaXMuX2Rpc3RzW0ldKX10aGlzLmh1bGw9dy5zdWJhcnJheSgwLFIpLHRoaXMudHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheSgwKSx0aGlzLmhhbGZlZGdlcz1uZXcgVWludDMyQXJyYXkoMCk7cmV0dXJufWlmKHFsKG0seSx4LHYsYixBKTwwKXtjb25zdCB3PV8sUj14LE49djtfPWcseD1iLHY9QSxnPXcsYj1SLEE9Tn1jb25zdCBMPXhFKG0seSx4LHYsYixBKTt0aGlzLl9jeD1MLngsdGhpcy5fY3k9TC55O2ZvcihsZXQgdz0wO3c8YTt3KyspdGhpcy5fZGlzdHNbd109bmYoZVsyKnddLGVbMip3KzFdLEwueCxMLnkpO2RzKHRoaXMuX2lkcyx0aGlzLl9kaXN0cywwLGEtMSksdGhpcy5faHVsbFN0YXJ0PXA7bGV0IE09MztuW3BdPXRbZ109XyxuW19dPXRbcF09ZyxuW2ddPXRbX109cCxpW3BdPTAsaVtfXT0xLGlbZ109MixzLmZpbGwoLTEpLHNbdGhpcy5faGFzaEtleShtLHkpXT1wLHNbdGhpcy5faGFzaEtleSh4LHYpXT1fLHNbdGhpcy5faGFzaEtleShiLEEpXT1nLHRoaXMudHJpYW5nbGVzTGVuPTAsdGhpcy5fYWRkVHJpYW5nbGUocCxfLGcsLTEsLTEsLTEpO2ZvcihsZXQgdz0wLFIsTjt3PHRoaXMuX2lkcy5sZW5ndGg7dysrKXtjb25zdCBCPXRoaXMuX2lkc1t3XSxJPWVbMipCXSxVPWVbMipCKzFdO2lmKHc+MCYmTWF0aC5hYnMoSS1SKTw9ZzAmJk1hdGguYWJzKFUtTik8PWcwfHwoUj1JLE49VSxCPT09cHx8Qj09PV98fEI9PT1nKSljb250aW51ZTtsZXQgej0wO2ZvcihsZXQgbmU9MCxmZT10aGlzLl9oYXNoS2V5KEksVSk7bmU8dGhpcy5faGFzaFNpemUmJih6PXNbKGZlK25lKSV0aGlzLl9oYXNoU2l6ZV0sISh6IT09LTEmJnohPT1uW3pdKSk7bmUrKyk7ej10W3pdO2xldCBGPXosWjtmb3IoO1o9bltGXSxxbChJLFUsZVsyKkZdLGVbMipGKzFdLGVbMipaXSxlWzIqWisxXSk+PTA7KWlmKEY9WixGPT09eil7Rj0tMTticmVha31pZihGPT09LTEpY29udGludWU7bGV0IFY9dGhpcy5fYWRkVHJpYW5nbGUoRixCLG5bRl0sLTEsLTEsaVtGXSk7aVtCXT10aGlzLl9sZWdhbGl6ZShWKzIpLGlbRl09VixNKys7bGV0IFE9bltGXTtmb3IoO1o9bltRXSxxbChJLFUsZVsyKlFdLGVbMipRKzFdLGVbMipaXSxlWzIqWisxXSk8MDspVj10aGlzLl9hZGRUcmlhbmdsZShRLEIsWixpW0JdLC0xLGlbUV0pLGlbQl09dGhpcy5fbGVnYWxpemUoVisyKSxuW1FdPVEsTS0tLFE9WjtpZihGPT09eilmb3IoO1o9dFtGXSxxbChJLFUsZVsyKlpdLGVbMipaKzFdLGVbMipGXSxlWzIqRisxXSk8MDspVj10aGlzLl9hZGRUcmlhbmdsZShaLEIsRiwtMSxpW0ZdLGlbWl0pLHRoaXMuX2xlZ2FsaXplKFYrMiksaVtaXT1WLG5bRl09RixNLS0sRj1aO3RoaXMuX2h1bGxTdGFydD10W0JdPUYsbltGXT10W1FdPUIsbltCXT1RLHNbdGhpcy5faGFzaEtleShJLFUpXT1CLHNbdGhpcy5faGFzaEtleShlWzIqRl0sZVsyKkYrMV0pXT1GfXRoaXMuaHVsbD1uZXcgVWludDMyQXJyYXkoTSk7Zm9yKGxldCB3PTAsUj10aGlzLl9odWxsU3RhcnQ7dzxNO3crKyl0aGlzLmh1bGxbd109UixSPW5bUl07dGhpcy50cmlhbmdsZXM9dGhpcy5fdHJpYW5nbGVzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pLHRoaXMuaGFsZmVkZ2VzPXRoaXMuX2hhbGZlZGdlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKX1faGFzaEtleShlLHQpe3JldHVybiBNYXRoLmZsb29yKG1FKGUtdGhpcy5fY3gsdC10aGlzLl9jeSkqdGhpcy5faGFzaFNpemUpJXRoaXMuX2hhc2hTaXplfV9sZWdhbGl6ZShlKXtjb25zdHtfdHJpYW5nbGVzOnQsX2hhbGZlZGdlczpuLGNvb3JkczppfT10aGlzO2xldCBzPTAsYT0wO2Zvcig7Oyl7Y29uc3Qgbz1uW2VdLGw9ZS1lJTM7aWYoYT1sKyhlKzIpJTMsbz09PS0xKXtpZihzPT09MClicmVhaztlPSRsWy0tc107Y29udGludWV9Y29uc3QgYz1vLW8lMyxoPWwrKGUrMSklMyx1PWMrKG8rMiklMyxmPXRbYV0sZD10W2VdLHA9dFtoXSxfPXRbdV07aWYoZ0UoaVsyKmZdLGlbMipmKzFdLGlbMipkXSxpWzIqZCsxXSxpWzIqcF0saVsyKnArMV0saVsyKl9dLGlbMipfKzFdKSl7dFtlXT1fLHRbb109Zjtjb25zdCBtPW5bdV07aWYobT09PS0xKXtsZXQgeD10aGlzLl9odWxsU3RhcnQ7ZG97aWYodGhpcy5faHVsbFRyaVt4XT09PXUpe3RoaXMuX2h1bGxUcmlbeF09ZTticmVha314PXRoaXMuX2h1bGxQcmV2W3hdfXdoaWxlKHghPT10aGlzLl9odWxsU3RhcnQpfXRoaXMuX2xpbmsoZSxtKSx0aGlzLl9saW5rKG8sblthXSksdGhpcy5fbGluayhhLHUpO2NvbnN0IHk9YysobysxKSUzO3M8JGwubGVuZ3RoJiYoJGxbcysrXT15KX1lbHNle2lmKHM9PT0wKWJyZWFrO2U9JGxbLS1zXX19cmV0dXJuIGF9X2xpbmsoZSx0KXt0aGlzLl9oYWxmZWRnZXNbZV09dCx0IT09LTEmJih0aGlzLl9oYWxmZWRnZXNbdF09ZSl9X2FkZFRyaWFuZ2xlKGUsdCxuLGkscyxhKXtjb25zdCBvPXRoaXMudHJpYW5nbGVzTGVuO3JldHVybiB0aGlzLl90cmlhbmdsZXNbb109ZSx0aGlzLl90cmlhbmdsZXNbbysxXT10LHRoaXMuX3RyaWFuZ2xlc1tvKzJdPW4sdGhpcy5fbGluayhvLGkpLHRoaXMuX2xpbmsobysxLHMpLHRoaXMuX2xpbmsobysyLGEpLHRoaXMudHJpYW5nbGVzTGVuKz0zLG99fWZ1bmN0aW9uIG1FKHIsZSl7Y29uc3QgdD1yLyhNYXRoLmFicyhyKStNYXRoLmFicyhlKSk7cmV0dXJuKGU+MD8zLXQ6MSt0KS80fWZ1bmN0aW9uIG5mKHIsZSx0LG4pe2NvbnN0IGk9ci10LHM9ZS1uO3JldHVybiBpKmkrcypzfWZ1bmN0aW9uIGdFKHIsZSx0LG4saSxzLGEsbyl7Y29uc3QgbD1yLWEsYz1lLW8saD10LWEsdT1uLW8sZj1pLWEsZD1zLW8scD1sKmwrYypjLF89aCpoK3UqdSxnPWYqZitkKmQ7cmV0dXJuIGwqKHUqZy1fKmQpLWMqKGgqZy1fKmYpK3AqKGgqZC11KmYpPDB9ZnVuY3Rpb24gX0UocixlLHQsbixpLHMpe2NvbnN0IGE9dC1yLG89bi1lLGw9aS1yLGM9cy1lLGg9YSphK28qbyx1PWwqbCtjKmMsZj0uNS8oYSpjLW8qbCksZD0oYypoLW8qdSkqZixwPShhKnUtbCpoKSpmO3JldHVybiBkKmQrcCpwfWZ1bmN0aW9uIHhFKHIsZSx0LG4saSxzKXtjb25zdCBhPXQtcixvPW4tZSxsPWktcixjPXMtZSxoPWEqYStvKm8sdT1sKmwrYypjLGY9LjUvKGEqYy1vKmwpLGQ9cisoYypoLW8qdSkqZixwPWUrKGEqdS1sKmgpKmY7cmV0dXJue3g6ZCx5OnB9fWZ1bmN0aW9uIGRzKHIsZSx0LG4pe2lmKG4tdDw9MjApZm9yKGxldCBpPXQrMTtpPD1uO2krKyl7Y29uc3Qgcz1yW2ldLGE9ZVtzXTtsZXQgbz1pLTE7Zm9yKDtvPj10JiZlW3Jbb11dPmE7KXJbbysxXT1yW28tLV07cltvKzFdPXN9ZWxzZXtjb25zdCBpPXQrbj4+MTtsZXQgcz10KzEsYT1uO1RhKHIsaSxzKSxlW3JbdF1dPmVbcltuXV0mJlRhKHIsdCxuKSxlW3Jbc11dPmVbcltuXV0mJlRhKHIscyxuKSxlW3JbdF1dPmVbcltzXV0mJlRhKHIsdCxzKTtjb25zdCBvPXJbc10sbD1lW29dO2Zvcig7Oyl7ZG8gcysrO3doaWxlKGVbcltzXV08bCk7ZG8gYS0tO3doaWxlKGVbclthXV0+bCk7aWYoYTxzKWJyZWFrO1RhKHIscyxhKX1yW3QrMV09clthXSxyW2FdPW8sbi1zKzE+PWEtdD8oZHMocixlLHMsbiksZHMocixlLHQsYS0xKSk6KGRzKHIsZSx0LGEtMSksZHMocixlLHMsbikpfX1mdW5jdGlvbiBUYShyLGUsdCl7Y29uc3Qgbj1yW2VdO3JbZV09clt0XSxyW3RdPW59ZnVuY3Rpb24geUUocil7cmV0dXJuIHJbMF19ZnVuY3Rpb24gdkUocil7cmV0dXJuIHJbMV19ZnVuY3Rpb24gTUUocixlLHQpe2lmKHQ9PT12b2lkIDAmJih0PXt9KSwhcil0aHJvdyBuZXcgRXJyb3IoInBvaW50IGlzIHJlcXVpcmVkIik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJwb2x5Z29uIGlzIHJlcXVpcmVkIik7dmFyIG49c0UociksaT1vRShlKSxzPWkudHlwZSxhPWUuYmJveCxvPWkuY29vcmRpbmF0ZXM7aWYoYSYmU0UobixhKT09PSExKXJldHVybiExO3M9PT0iUG9seWdvbiImJihvPVtvXSk7Zm9yKHZhciBsPSExLGM9MDtjPG8ubGVuZ3RoJiYhbDtjKyspaWYoXzAobixvW2NdWzBdLHQuaWdub3JlQm91bmRhcnkpKXtmb3IodmFyIGg9ITEsdT0xO3U8b1tjXS5sZW5ndGgmJiFoOylfMChuLG9bY11bdV0sIXQuaWdub3JlQm91bmRhcnkpJiYoaD0hMCksdSsrO2h8fChsPSEwKX1yZXR1cm4gbH1mdW5jdGlvbiBfMChyLGUsdCl7dmFyIG49ITE7ZVswXVswXT09PWVbZS5sZW5ndGgtMV1bMF0mJmVbMF1bMV09PT1lW2UubGVuZ3RoLTFdWzFdJiYoZT1lLnNsaWNlKDAsZS5sZW5ndGgtMSkpO2Zvcih2YXIgaT0wLHM9ZS5sZW5ndGgtMTtpPGUubGVuZ3RoO3M9aSsrKXt2YXIgYT1lW2ldWzBdLG89ZVtpXVsxXSxsPWVbc11bMF0sYz1lW3NdWzFdLGg9clsxXSooYS1sKStvKihsLXJbMF0pK2MqKHJbMF0tYSk9PT0wJiYoYS1yWzBdKSoobC1yWzBdKTw9MCYmKG8tclsxXSkqKGMtclsxXSk8PTA7aWYoaClyZXR1cm4hdDt2YXIgdT1vPnJbMV0hPWM+clsxXSYmclswXTwobC1hKSooclsxXS1vKS8oYy1vKSthO3UmJihuPSFuKX1yZXR1cm4gbn1mdW5jdGlvbiBTRShyLGUpe3JldHVybiBlWzBdPD1yWzBdJiZlWzFdPD1yWzFdJiZlWzJdPj1yWzBdJiZlWzNdPj1yWzFdfWNvbnN0IHgwPTFlLTY7Y2xhc3MgbXJ7Y29uc3RydWN0b3IoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1tb3ZlVG8oZSx0KXt0aGlzLl8rPWBNJHt0aGlzLl94MD10aGlzLl94MT0rZX0sJHt0aGlzLl95MD10aGlzLl95MT0rdH1gfWNsb3NlUGF0aCgpe3RoaXMuX3gxIT09bnVsbCYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX1saW5lVG8oZSx0KXt0aGlzLl8rPWBMJHt0aGlzLl94MT0rZX0sJHt0aGlzLl95MT0rdH1gfWFyYyhlLHQsbil7ZT0rZSx0PSt0LG49K247Y29uc3QgaT1lK24scz10O2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1cyIpO3RoaXMuX3gxPT09bnVsbD90aGlzLl8rPWBNJHtpfSwke3N9YDooTWF0aC5hYnModGhpcy5feDEtaSk+eDB8fE1hdGguYWJzKHRoaXMuX3kxLXMpPngwKSYmKHRoaXMuXys9IkwiK2krIiwiK3MpLG4mJih0aGlzLl8rPWBBJHtufSwke259LDAsMSwxLCR7ZS1ufSwke3R9QSR7bn0sJHtufSwwLDEsMSwke3RoaXMuX3gxPWl9LCR7dGhpcy5feTE9c31gKX1yZWN0KGUsdCxuLGkpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPStlfSwke3RoaXMuX3kwPXRoaXMuX3kxPSt0fWgkeytufXYkeytpfWgkey1ufVpgfXZhbHVlKCl7cmV0dXJuIHRoaXMuX3x8bnVsbH19Y2xhc3MgcmZ7Y29uc3RydWN0b3IoKXt0aGlzLl89W119bW92ZVRvKGUsdCl7dGhpcy5fLnB1c2goW2UsdF0pfWNsb3NlUGF0aCgpe3RoaXMuXy5wdXNoKHRoaXMuX1swXS5zbGljZSgpKX1saW5lVG8oZSx0KXt0aGlzLl8ucHVzaChbZSx0XSl9dmFsdWUoKXtyZXR1cm4gdGhpcy5fLmxlbmd0aD90aGlzLl86bnVsbH19Y2xhc3MgYkV7Y29uc3RydWN0b3IoZSxbdCxuLGksc109WzAsMCw5NjAsNTAwXSl7aWYoISgoaT0raSk+PSh0PSt0KSl8fCEoKHM9K3MpPj0obj0rbikpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBib3VuZHMiKTt0aGlzLmRlbGF1bmF5PWUsdGhpcy5fY2lyY3VtY2VudGVycz1uZXcgRmxvYXQ2NEFycmF5KGUucG9pbnRzLmxlbmd0aCoyKSx0aGlzLnZlY3RvcnM9bmV3IEZsb2F0NjRBcnJheShlLnBvaW50cy5sZW5ndGgqMiksdGhpcy54bWF4PWksdGhpcy54bWluPXQsdGhpcy55bWF4PXMsdGhpcy55bWluPW4sdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLmRlbGF1bmF5LnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czplLGh1bGw6dCx0cmlhbmdsZXM6bn0sdmVjdG9yczppfT10aGlzLHM9dGhpcy5jaXJjdW1jZW50ZXJzPXRoaXMuX2NpcmN1bWNlbnRlcnMuc3ViYXJyYXkoMCxuLmxlbmd0aC8zKjIpO2ZvcihsZXQgZD0wLHA9MCxfPW4ubGVuZ3RoLGcsbTtkPF87ZCs9MyxwKz0yKXtjb25zdCB5PW5bZF0qMix4PW5bZCsxXSoyLHY9bltkKzJdKjIsUz1lW3ldLGI9ZVt5KzFdLEE9ZVt4XSxMPWVbeCsxXSxNPWVbdl0sdz1lW3YrMV0sUj1BLVMsTj1MLWIsQj1NLVMsST13LWIsVT0oUipJLU4qQikqMjtpZihNYXRoLmFicyhVKTwxZS05KXtsZXQgej0xZTk7Y29uc3QgRj1uWzBdKjI7eio9TWF0aC5zaWduKChlW0ZdLVMpKkktKGVbRisxXS1iKSpCKSxnPShTK00pLzIteipJLG09KGIrdykvMit6KkJ9ZWxzZXtjb25zdCB6PTEvVSxGPVIqUitOKk4sWj1CKkIrSSpJO2c9UysoSSpGLU4qWikqeixtPWIrKFIqWi1CKkYpKnp9c1twXT1nLHNbcCsxXT1tfWxldCBhPXRbdC5sZW5ndGgtMV0sbyxsPWEqNCxjLGg9ZVsyKmFdLHUsZj1lWzIqYSsxXTtpLmZpbGwoMCk7Zm9yKGxldCBkPTA7ZDx0Lmxlbmd0aDsrK2QpYT10W2RdLG89bCxjPWgsdT1mLGw9YSo0LGg9ZVsyKmFdLGY9ZVsyKmErMV0saVtvKzJdPWlbbF09dS1mLGlbbyszXT1pW2wrMV09aC1jfXJlbmRlcihlKXtjb25zdCB0PWU9PW51bGw/ZT1uZXcgbXI6dm9pZCAwLHtkZWxhdW5heTp7aGFsZmVkZ2VzOm4saW5lZGdlczppLGh1bGw6c30sY2lyY3VtY2VudGVyczphLHZlY3RvcnM6b309dGhpcztpZihzLmxlbmd0aDw9MSlyZXR1cm4gbnVsbDtmb3IobGV0IGg9MCx1PW4ubGVuZ3RoO2g8dTsrK2gpe2NvbnN0IGY9bltoXTtpZihmPGgpY29udGludWU7Y29uc3QgZD1NYXRoLmZsb29yKGgvMykqMixwPU1hdGguZmxvb3IoZi8zKSoyLF89YVtkXSxnPWFbZCsxXSxtPWFbcF0seT1hW3ArMV07dGhpcy5fcmVuZGVyU2VnbWVudChfLGcsbSx5LGUpfWxldCBsLGM9c1tzLmxlbmd0aC0xXTtmb3IobGV0IGg9MDtoPHMubGVuZ3RoOysraCl7bD1jLGM9c1toXTtjb25zdCB1PU1hdGguZmxvb3IoaVtjXS8zKSoyLGY9YVt1XSxkPWFbdSsxXSxwPWwqNCxfPXRoaXMuX3Byb2plY3QoZixkLG9bcCsyXSxvW3ArM10pO18mJnRoaXMuX3JlbmRlclNlZ21lbnQoZixkLF9bMF0sX1sxXSxlKX1yZXR1cm4gdCYmdC52YWx1ZSgpfXJlbmRlckJvdW5kcyhlKXtjb25zdCB0PWU9PW51bGw/ZT1uZXcgbXI6dm9pZCAwO3JldHVybiBlLnJlY3QodGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgtdGhpcy54bWluLHRoaXMueW1heC10aGlzLnltaW4pLHQmJnQudmFsdWUoKX1yZW5kZXJDZWxsKGUsdCl7Y29uc3Qgbj10PT1udWxsP3Q9bmV3IG1yOnZvaWQgMCxpPXRoaXMuX2NsaXAoZSk7aWYoaT09PW51bGx8fCFpLmxlbmd0aClyZXR1cm47dC5tb3ZlVG8oaVswXSxpWzFdKTtsZXQgcz1pLmxlbmd0aDtmb3IoO2lbMF09PT1pW3MtMl0mJmlbMV09PT1pW3MtMV0mJnM+MTspcy09Mjtmb3IobGV0IGE9MjthPHM7YSs9MikoaVthXSE9PWlbYS0yXXx8aVthKzFdIT09aVthLTFdKSYmdC5saW5lVG8oaVthXSxpW2ErMV0pO3JldHVybiB0LmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qY2VsbFBvbHlnb25zKCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czplfX09dGhpcztmb3IobGV0IHQ9MCxuPWUubGVuZ3RoLzI7dDxuOysrdCl7Y29uc3QgaT10aGlzLmNlbGxQb2x5Z29uKHQpO2kmJihpLmluZGV4PXQseWllbGQgaSl9fWNlbGxQb2x5Z29uKGUpe2NvbnN0IHQ9bmV3IHJmO3JldHVybiB0aGlzLnJlbmRlckNlbGwoZSx0KSx0LnZhbHVlKCl9X3JlbmRlclNlZ21lbnQoZSx0LG4saSxzKXtsZXQgYTtjb25zdCBvPXRoaXMuX3JlZ2lvbmNvZGUoZSx0KSxsPXRoaXMuX3JlZ2lvbmNvZGUobixpKTtvPT09MCYmbD09PTA/KHMubW92ZVRvKGUsdCkscy5saW5lVG8obixpKSk6KGE9dGhpcy5fY2xpcFNlZ21lbnQoZSx0LG4saSxvLGwpKSYmKHMubW92ZVRvKGFbMF0sYVsxXSkscy5saW5lVG8oYVsyXSxhWzNdKSl9Y29udGFpbnMoZSx0LG4pe3JldHVybiB0PSt0LHQhPT10fHwobj0rbixuIT09bik/ITE6dGhpcy5kZWxhdW5heS5fc3RlcChlLHQsbik9PT1lfSpuZWlnaGJvcnMoZSl7Y29uc3QgdD10aGlzLl9jbGlwKGUpO2lmKHQpZm9yKGNvbnN0IG4gb2YgdGhpcy5kZWxhdW5heS5uZWlnaGJvcnMoZSkpe2NvbnN0IGk9dGhpcy5fY2xpcChuKTtpZihpKXtlOmZvcihsZXQgcz0wLGE9dC5sZW5ndGg7czxhO3MrPTIpZm9yKGxldCBvPTAsbD1pLmxlbmd0aDtvPGw7bys9MilpZih0W3NdPT1pW29dJiZ0W3MrMV09PWlbbysxXSYmdFsocysyKSVhXT09aVsobytsLTIpJWxdJiZ0WyhzKzMpJWFdPT1pWyhvK2wtMSklbF0pe3lpZWxkIG47YnJlYWsgZX19fX1fY2VsbChlKXtjb25zdHtjaXJjdW1jZW50ZXJzOnQsZGVsYXVuYXk6e2luZWRnZXM6bixoYWxmZWRnZXM6aSx0cmlhbmdsZXM6c319PXRoaXMsYT1uW2VdO2lmKGE9PT0tMSlyZXR1cm4gbnVsbDtjb25zdCBvPVtdO2xldCBsPWE7ZG97Y29uc3QgYz1NYXRoLmZsb29yKGwvMyk7aWYoby5wdXNoKHRbYyoyXSx0W2MqMisxXSksbD1sJTM9PT0yP2wtMjpsKzEsc1tsXSE9PWUpYnJlYWs7bD1pW2xdfXdoaWxlKGwhPT1hJiZsIT09LTEpO3JldHVybiBvfV9jbGlwKGUpe2lmKGU9PT0wJiZ0aGlzLmRlbGF1bmF5Lmh1bGwubGVuZ3RoPT09MSlyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07Y29uc3QgdD10aGlzLl9jZWxsKGUpO2lmKHQ9PT1udWxsKXJldHVybiBudWxsO2NvbnN0e3ZlY3RvcnM6bn09dGhpcyxpPWUqNDtyZXR1cm4gbltpXXx8bltpKzFdP3RoaXMuX2NsaXBJbmZpbml0ZShlLHQsbltpXSxuW2krMV0sbltpKzJdLG5baSszXSk6dGhpcy5fY2xpcEZpbml0ZShlLHQpfV9jbGlwRmluaXRlKGUsdCl7Y29uc3Qgbj10Lmxlbmd0aDtsZXQgaT1udWxsLHMsYSxvPXRbbi0yXSxsPXRbbi0xXSxjLGg9dGhpcy5fcmVnaW9uY29kZShvLGwpLHUsZj0wO2ZvcihsZXQgZD0wO2Q8bjtkKz0yKWlmKHM9byxhPWwsbz10W2RdLGw9dFtkKzFdLGM9aCxoPXRoaXMuX3JlZ2lvbmNvZGUobyxsKSxjPT09MCYmaD09PTApdT1mLGY9MCxpP2kucHVzaChvLGwpOmk9W28sbF07ZWxzZXtsZXQgcCxfLGcsbSx5O2lmKGM9PT0wKXtpZigocD10aGlzLl9jbGlwU2VnbWVudChzLGEsbyxsLGMsaCkpPT09bnVsbCljb250aW51ZTtbXyxnLG0seV09cH1lbHNle2lmKChwPXRoaXMuX2NsaXBTZWdtZW50KG8sbCxzLGEsaCxjKSk9PT1udWxsKWNvbnRpbnVlO1ttLHksXyxnXT1wLHU9ZixmPXRoaXMuX2VkZ2Vjb2RlKF8sZyksdSYmZiYmdGhpcy5fZWRnZShlLHUsZixpLGkubGVuZ3RoKSxpP2kucHVzaChfLGcpOmk9W18sZ119dT1mLGY9dGhpcy5fZWRnZWNvZGUobSx5KSx1JiZmJiZ0aGlzLl9lZGdlKGUsdSxmLGksaS5sZW5ndGgpLGk/aS5wdXNoKG0seSk6aT1bbSx5XX1pZihpKXU9ZixmPXRoaXMuX2VkZ2Vjb2RlKGlbMF0saVsxXSksdSYmZiYmdGhpcy5fZWRnZShlLHUsZixpLGkubGVuZ3RoKTtlbHNlIGlmKHRoaXMuY29udGFpbnMoZSwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO3JldHVybiBpfV9jbGlwU2VnbWVudChlLHQsbixpLHMsYSl7Zm9yKDs7KXtpZihzPT09MCYmYT09PTApcmV0dXJuW2UsdCxuLGldO2lmKHMmYSlyZXR1cm4gbnVsbDtsZXQgbyxsLGM9c3x8YTtjJjg/KG89ZSsobi1lKSoodGhpcy55bWF4LXQpLyhpLXQpLGw9dGhpcy55bWF4KTpjJjQ/KG89ZSsobi1lKSoodGhpcy55bWluLXQpLyhpLXQpLGw9dGhpcy55bWluKTpjJjI/KGw9dCsoaS10KSoodGhpcy54bWF4LWUpLyhuLWUpLG89dGhpcy54bWF4KToobD10KyhpLXQpKih0aGlzLnhtaW4tZSkvKG4tZSksbz10aGlzLnhtaW4pLHM/KGU9byx0PWwscz10aGlzLl9yZWdpb25jb2RlKGUsdCkpOihuPW8saT1sLGE9dGhpcy5fcmVnaW9uY29kZShuLGkpKX19X2NsaXBJbmZpbml0ZShlLHQsbixpLHMsYSl7bGV0IG89QXJyYXkuZnJvbSh0KSxsO2lmKChsPXRoaXMuX3Byb2plY3Qob1swXSxvWzFdLG4saSkpJiZvLnVuc2hpZnQobFswXSxsWzFdKSwobD10aGlzLl9wcm9qZWN0KG9bby5sZW5ndGgtMl0sb1tvLmxlbmd0aC0xXSxzLGEpKSYmby5wdXNoKGxbMF0sbFsxXSksbz10aGlzLl9jbGlwRmluaXRlKGUsbykpZm9yKGxldCBjPTAsaD1vLmxlbmd0aCx1LGY9dGhpcy5fZWRnZWNvZGUob1toLTJdLG9baC0xXSk7YzxoO2MrPTIpdT1mLGY9dGhpcy5fZWRnZWNvZGUob1tjXSxvW2MrMV0pLHUmJmYmJihjPXRoaXMuX2VkZ2UoZSx1LGYsbyxjKSxoPW8ubGVuZ3RoKTtlbHNlIHRoaXMuY29udGFpbnMoZSwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikmJihvPVt0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4XSk7cmV0dXJuIG99X2VkZ2UoZSx0LG4saSxzKXtmb3IoO3QhPT1uOyl7bGV0IGEsbztzd2l0Y2godCl7Y2FzZSA1OnQ9NDtjb250aW51ZTtjYXNlIDQ6dD02LGE9dGhpcy54bWF4LG89dGhpcy55bWluO2JyZWFrO2Nhc2UgNjp0PTI7Y29udGludWU7Y2FzZSAyOnQ9MTAsYT10aGlzLnhtYXgsbz10aGlzLnltYXg7YnJlYWs7Y2FzZSAxMDp0PTg7Y29udGludWU7Y2FzZSA4OnQ9OSxhPXRoaXMueG1pbixvPXRoaXMueW1heDticmVhaztjYXNlIDk6dD0xO2NvbnRpbnVlO2Nhc2UgMTp0PTUsYT10aGlzLnhtaW4sbz10aGlzLnltaW47YnJlYWt9KGlbc10hPT1hfHxpW3MrMV0hPT1vKSYmdGhpcy5jb250YWlucyhlLGEsbykmJihpLnNwbGljZShzLDAsYSxvKSxzKz0yKX1pZihpLmxlbmd0aD40KWZvcihsZXQgYT0wO2E8aS5sZW5ndGg7YSs9Mil7Y29uc3Qgbz0oYSsyKSVpLmxlbmd0aCxsPShhKzQpJWkubGVuZ3RoOyhpW2FdPT09aVtvXSYmaVtvXT09PWlbbF18fGlbYSsxXT09PWlbbysxXSYmaVtvKzFdPT09aVtsKzFdKSYmKGkuc3BsaWNlKG8sMiksYS09Mil9cmV0dXJuIHN9X3Byb2plY3QoZSx0LG4saSl7bGV0IHM9MS8wLGEsbyxsO2lmKGk8MCl7aWYodDw9dGhpcy55bWluKXJldHVybiBudWxsOyhhPSh0aGlzLnltaW4tdCkvaSk8cyYmKGw9dGhpcy55bWluLG89ZSsocz1hKSpuKX1lbHNlIGlmKGk+MCl7aWYodD49dGhpcy55bWF4KXJldHVybiBudWxsOyhhPSh0aGlzLnltYXgtdCkvaSk8cyYmKGw9dGhpcy55bWF4LG89ZSsocz1hKSpuKX1pZihuPjApe2lmKGU+PXRoaXMueG1heClyZXR1cm4gbnVsbDsoYT0odGhpcy54bWF4LWUpL24pPHMmJihvPXRoaXMueG1heCxsPXQrKHM9YSkqaSl9ZWxzZSBpZihuPDApe2lmKGU8PXRoaXMueG1pbilyZXR1cm4gbnVsbDsoYT0odGhpcy54bWluLWUpL24pPHMmJihvPXRoaXMueG1pbixsPXQrKHM9YSkqaSl9cmV0dXJuW28sbF19X2VkZ2Vjb2RlKGUsdCl7cmV0dXJuKGU9PT10aGlzLnhtaW4/MTplPT09dGhpcy54bWF4PzI6MCl8KHQ9PT10aGlzLnltaW4/NDp0PT09dGhpcy55bWF4Pzg6MCl9X3JlZ2lvbmNvZGUoZSx0KXtyZXR1cm4oZTx0aGlzLnhtaW4/MTplPnRoaXMueG1heD8yOjApfCh0PHRoaXMueW1pbj80OnQ+dGhpcy55bWF4Pzg6MCl9fWNvbnN0IHdFPTIqTWF0aC5QSSxwcz1NYXRoLnBvdztmdW5jdGlvbiBFRShyKXtyZXR1cm4gclswXX1mdW5jdGlvbiBBRShyKXtyZXR1cm4gclsxXX1mdW5jdGlvbiBURShyKXtjb25zdHt0cmlhbmdsZXM6ZSxjb29yZHM6dH09cjtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rPTMpe2NvbnN0IGk9MiplW25dLHM9MiplW24rMV0sYT0yKmVbbisyXTtpZigodFthXS10W2ldKSoodFtzKzFdLXRbaSsxXSktKHRbc10tdFtpXSkqKHRbYSsxXS10W2krMV0pPjFlLTEwKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIENFKHIsZSx0KXtyZXR1cm5bcitNYXRoLnNpbihyK2UpKnQsZStNYXRoLmNvcyhyLWUpKnRdfWNsYXNzIHNme3N0YXRpYyBmcm9tKGUsdD1FRSxuPUFFLGkpe3JldHVybiBuZXcgc2YoImxlbmd0aCJpbiBlP1JFKGUsdCxuLGkpOkZsb2F0NjRBcnJheS5mcm9tKFBFKGUsdCxuLGkpKSl9Y29uc3RydWN0b3IoZSl7dGhpcy5fZGVsYXVuYXRvcj1uZXcgQWEoZSksdGhpcy5pbmVkZ2VzPW5ldyBJbnQzMkFycmF5KGUubGVuZ3RoLzIpLHRoaXMuX2h1bGxJbmRleD1uZXcgSW50MzJBcnJheShlLmxlbmd0aC8yKSx0aGlzLnBvaW50cz10aGlzLl9kZWxhdW5hdG9yLmNvb3Jkcyx0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuX2RlbGF1bmF0b3IudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdCBlPXRoaXMuX2RlbGF1bmF0b3IsdD10aGlzLnBvaW50cztpZihlLmh1bGwmJmUuaHVsbC5sZW5ndGg+MiYmVEUoZSkpe3RoaXMuY29sbGluZWFyPUludDMyQXJyYXkuZnJvbSh7bGVuZ3RoOnQubGVuZ3RoLzJ9LChmLGQpPT5kKS5zb3J0KChmLGQpPT50WzIqZl0tdFsyKmRdfHx0WzIqZisxXS10WzIqZCsxXSk7Y29uc3QgbD10aGlzLmNvbGxpbmVhclswXSxjPXRoaXMuY29sbGluZWFyW3RoaXMuY29sbGluZWFyLmxlbmd0aC0xXSxoPVt0WzIqbF0sdFsyKmwrMV0sdFsyKmNdLHRbMipjKzFdXSx1PTFlLTgqTWF0aC5oeXBvdChoWzNdLWhbMV0saFsyXS1oWzBdKTtmb3IobGV0IGY9MCxkPXQubGVuZ3RoLzI7ZjxkOysrZil7Y29uc3QgcD1DRSh0WzIqZl0sdFsyKmYrMV0sdSk7dFsyKmZdPXBbMF0sdFsyKmYrMV09cFsxXX10aGlzLl9kZWxhdW5hdG9yPW5ldyBBYSh0KX1lbHNlIGRlbGV0ZSB0aGlzLmNvbGxpbmVhcjtjb25zdCBuPXRoaXMuaGFsZmVkZ2VzPXRoaXMuX2RlbGF1bmF0b3IuaGFsZmVkZ2VzLGk9dGhpcy5odWxsPXRoaXMuX2RlbGF1bmF0b3IuaHVsbCxzPXRoaXMudHJpYW5nbGVzPXRoaXMuX2RlbGF1bmF0b3IudHJpYW5nbGVzLGE9dGhpcy5pbmVkZ2VzLmZpbGwoLTEpLG89dGhpcy5faHVsbEluZGV4LmZpbGwoLTEpO2ZvcihsZXQgbD0wLGM9bi5sZW5ndGg7bDxjOysrbCl7Y29uc3QgaD1zW2wlMz09PTI/bC0yOmwrMV07KG5bbF09PT0tMXx8YVtoXT09PS0xKSYmKGFbaF09bCl9Zm9yKGxldCBsPTAsYz1pLmxlbmd0aDtsPGM7KytsKW9baVtsXV09bDtpLmxlbmd0aDw9MiYmaS5sZW5ndGg+MCYmKHRoaXMudHJpYW5nbGVzPW5ldyBJbnQzMkFycmF5KDMpLmZpbGwoLTEpLHRoaXMuaGFsZmVkZ2VzPW5ldyBJbnQzMkFycmF5KDMpLmZpbGwoLTEpLHRoaXMudHJpYW5nbGVzWzBdPWlbMF0sYVtpWzBdXT0xLGkubGVuZ3RoPT09MiYmKGFbaVsxXV09MCx0aGlzLnRyaWFuZ2xlc1sxXT1pWzFdLHRoaXMudHJpYW5nbGVzWzJdPWlbMV0pKX12b3Jvbm9pKGUpe3JldHVybiBuZXcgYkUodGhpcyxlKX0qbmVpZ2hib3JzKGUpe2NvbnN0e2luZWRnZXM6dCxodWxsOm4sX2h1bGxJbmRleDppLGhhbGZlZGdlczpzLHRyaWFuZ2xlczphLGNvbGxpbmVhcjpvfT10aGlzO2lmKG8pe2NvbnN0IHU9by5pbmRleE9mKGUpO3U+MCYmKHlpZWxkIG9bdS0xXSksdTxvLmxlbmd0aC0xJiYoeWllbGQgb1t1KzFdKTtyZXR1cm59Y29uc3QgbD10W2VdO2lmKGw9PT0tMSlyZXR1cm47bGV0IGM9bCxoPS0xO2Rve2lmKHlpZWxkIGg9YVtjXSxjPWMlMz09PTI/Yy0yOmMrMSxhW2NdIT09ZSlyZXR1cm47aWYoYz1zW2NdLGM9PT0tMSl7Y29uc3QgdT1uWyhpW2VdKzEpJW4ubGVuZ3RoXTt1IT09aCYmKHlpZWxkIHUpO3JldHVybn19d2hpbGUoYyE9PWwpfWZpbmQoZSx0LG49MCl7aWYoZT0rZSxlIT09ZXx8KHQ9K3QsdCE9PXQpKXJldHVybi0xO2NvbnN0IGk9bjtsZXQgcztmb3IoOyhzPXRoaXMuX3N0ZXAobixlLHQpKT49MCYmcyE9PW4mJnMhPT1pOyluPXM7cmV0dXJuIHN9X3N0ZXAoZSx0LG4pe2NvbnN0e2luZWRnZXM6aSxodWxsOnMsX2h1bGxJbmRleDphLGhhbGZlZGdlczpvLHRyaWFuZ2xlczpsLHBvaW50czpjfT10aGlzO2lmKGlbZV09PT0tMXx8IWMubGVuZ3RoKXJldHVybihlKzEpJShjLmxlbmd0aD4+MSk7bGV0IGg9ZSx1PXBzKHQtY1tlKjJdLDIpK3BzKG4tY1tlKjIrMV0sMik7Y29uc3QgZj1pW2VdO2xldCBkPWY7ZG97bGV0IHA9bFtkXTtjb25zdCBfPXBzKHQtY1twKjJdLDIpK3BzKG4tY1twKjIrMV0sMik7aWYoXzx1JiYodT1fLGg9cCksZD1kJTM9PT0yP2QtMjpkKzEsbFtkXSE9PWUpYnJlYWs7aWYoZD1vW2RdLGQ9PT0tMSl7aWYoZD1zWyhhW2VdKzEpJXMubGVuZ3RoXSxkIT09cCYmcHModC1jW2QqMl0sMikrcHMobi1jW2QqMisxXSwyKTx1KXJldHVybiBkO2JyZWFrfX13aGlsZShkIT09Zik7cmV0dXJuIGh9cmVuZGVyKGUpe2NvbnN0IHQ9ZT09bnVsbD9lPW5ldyBtcjp2b2lkIDAse3BvaW50czpuLGhhbGZlZGdlczppLHRyaWFuZ2xlczpzfT10aGlzO2ZvcihsZXQgYT0wLG89aS5sZW5ndGg7YTxvOysrYSl7Y29uc3QgbD1pW2FdO2lmKGw8YSljb250aW51ZTtjb25zdCBjPXNbYV0qMixoPXNbbF0qMjtlLm1vdmVUbyhuW2NdLG5bYysxXSksZS5saW5lVG8obltoXSxuW2grMV0pfXJldHVybiB0aGlzLnJlbmRlckh1bGwoZSksdCYmdC52YWx1ZSgpfXJlbmRlclBvaW50cyhlLHQpe3Q9PT12b2lkIDAmJighZXx8dHlwZW9mIGUubW92ZVRvIT0iZnVuY3Rpb24iKSYmKHQ9ZSxlPW51bGwpLHQ9dD09bnVsbD8yOit0O2NvbnN0IG49ZT09bnVsbD9lPW5ldyBtcjp2b2lkIDAse3BvaW50czppfT10aGlzO2ZvcihsZXQgcz0wLGE9aS5sZW5ndGg7czxhO3MrPTIpe2NvbnN0IG89aVtzXSxsPWlbcysxXTtlLm1vdmVUbyhvK3QsbCksZS5hcmMobyxsLHQsMCx3RSl9cmV0dXJuIG4mJm4udmFsdWUoKX1yZW5kZXJIdWxsKGUpe2NvbnN0IHQ9ZT09bnVsbD9lPW5ldyBtcjp2b2lkIDAse2h1bGw6bixwb2ludHM6aX09dGhpcyxzPW5bMF0qMixhPW4ubGVuZ3RoO2UubW92ZVRvKGlbc10saVtzKzFdKTtmb3IobGV0IG89MTtvPGE7KytvKXtjb25zdCBsPTIqbltvXTtlLmxpbmVUbyhpW2xdLGlbbCsxXSl9cmV0dXJuIGUuY2xvc2VQYXRoKCksdCYmdC52YWx1ZSgpfWh1bGxQb2x5Z29uKCl7Y29uc3QgZT1uZXcgcmY7cmV0dXJuIHRoaXMucmVuZGVySHVsbChlKSxlLnZhbHVlKCl9cmVuZGVyVHJpYW5nbGUoZSx0KXtjb25zdCBuPXQ9PW51bGw/dD1uZXcgbXI6dm9pZCAwLHtwb2ludHM6aSx0cmlhbmdsZXM6c309dGhpcyxhPXNbZSo9M10qMixvPXNbZSsxXSoyLGw9c1tlKzJdKjI7cmV0dXJuIHQubW92ZVRvKGlbYV0saVthKzFdKSx0LmxpbmVUbyhpW29dLGlbbysxXSksdC5saW5lVG8oaVtsXSxpW2wrMV0pLHQuY2xvc2VQYXRoKCksbiYmbi52YWx1ZSgpfSp0cmlhbmdsZVBvbHlnb25zKCl7Y29uc3R7dHJpYW5nbGVzOmV9PXRoaXM7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aC8zO3Q8bjsrK3QpeWllbGQgdGhpcy50cmlhbmdsZVBvbHlnb24odCl9dHJpYW5nbGVQb2x5Z29uKGUpe2NvbnN0IHQ9bmV3IHJmO3JldHVybiB0aGlzLnJlbmRlclRyaWFuZ2xlKGUsdCksdC52YWx1ZSgpfX1mdW5jdGlvbiBSRShyLGUsdCxuKXtjb25zdCBpPXIubGVuZ3RoLHM9bmV3IEZsb2F0NjRBcnJheShpKjIpO2ZvcihsZXQgYT0wO2E8aTsrK2Epe2NvbnN0IG89clthXTtzW2EqMl09ZS5jYWxsKG4sbyxhLHIpLHNbYSoyKzFdPXQuY2FsbChuLG8sYSxyKX1yZXR1cm4gc31mdW5jdGlvbipQRShyLGUsdCxuKXtsZXQgaT0wO2Zvcihjb25zdCBzIG9mIHIpeWllbGQgZS5jYWxsKG4scyxpLHIpLHlpZWxkIHQuY2FsbChuLHMsaSxyKSwrK2l9Y29uc3QgYWY9TWF0aC5QSSx5MD1hZi8yLHYwPTE4MC9hZixNMD1hZi8xODAsTEU9TWF0aC5hdGFuMixTMD1NYXRoLmNvcyxJRT1NYXRoLm1heCxVRT1NYXRoLm1pbixiMD1NYXRoLnNpbixERT1NYXRoLnNpZ258fGZ1bmN0aW9uKHIpe3JldHVybiByPjA/MTpyPDA/LTE6MH0sdzA9TWF0aC5zcXJ0O2Z1bmN0aW9uIE5FKHIpe3JldHVybiByPjE/eTA6cjwtMT8teTA6TWF0aC5hc2luKHIpfWZ1bmN0aW9uIEUwKHIsZSl7cmV0dXJuIHJbMF0qZVswXStyWzFdKmVbMV0rclsyXSplWzJdfWZ1bmN0aW9uIGJuKHIsZSl7cmV0dXJuW3JbMV0qZVsyXS1yWzJdKmVbMV0sclsyXSplWzBdLXJbMF0qZVsyXSxyWzBdKmVbMV0tclsxXSplWzBdXX1mdW5jdGlvbiBZbChyLGUpe3JldHVybltyWzBdK2VbMF0sclsxXStlWzFdLHJbMl0rZVsyXV19ZnVuY3Rpb24gWmwocil7dmFyIGU9dzAoclswXSpyWzBdK3JbMV0qclsxXStyWzJdKnJbMl0pO3JldHVybltyWzBdL2UsclsxXS9lLHJbMl0vZV19ZnVuY3Rpb24gb2Yocil7cmV0dXJuW0xFKHJbMV0sclswXSkqdjAsTkUoSUUoLTEsVUUoMSxyWzJdKSkpKnYwXX1mdW5jdGlvbiBYbihyKXtjb25zdCBlPXJbMF0qTTAsdD1yWzFdKk0wLG49UzAodCk7cmV0dXJuW24qUzAoZSksbipiMChlKSxiMCh0KV19ZnVuY3Rpb24gbGYocil7cmV0dXJuIHI9ci5tYXAoZT0+WG4oZSkpLEUwKHJbMF0sYm4oclsyXSxyWzFdKSl9ZnVuY3Rpb24gRkUocil7Y29uc3QgZT1CRShyKSx0PWtFKGUpLG49ekUodCxyKSxpPVZFKHQsci5sZW5ndGgpLHM9T0UoaSxyKSxhPUdFKHQscikse3BvbHlnb25zOm8sY2VudGVyczpsfT1IRShhLHQsciksYz1XRShvKSxoPXFFKHQsciksdT1YRShuLHQpO3JldHVybntkZWxhdW5heTplLGVkZ2VzOm4sdHJpYW5nbGVzOnQsY2VudGVyczpsLG5laWdoYm9yczppLHBvbHlnb25zOm8sbWVzaDpjLGh1bGw6aCx1cnF1aGFydDp1LGZpbmQ6c319ZnVuY3Rpb24gT0UocixlKXtmdW5jdGlvbiB0KG4saSl7bGV0IHM9blswXS1pWzBdLGE9blsxXS1pWzFdLG89blsyXS1pWzJdO3JldHVybiBzKnMrYSphK28qb31yZXR1cm4gZnVuY3Rpb24oaSxzLGEpe2E9PT12b2lkIDAmJihhPTApO2xldCBvLGwsYz1hO2NvbnN0IGg9WG4oW2ksc10pO2RvIG89YSxhPW51bGwsbD10KGgsWG4oZVtvXSkpLHJbb10uZm9yRWFjaCh1PT57bGV0IGY9dChoLFhuKGVbdV0pKTtpZihmPGwpe2w9ZixhPXUsYz11O3JldHVybn19KTt3aGlsZShhIT09bnVsbCk7cmV0dXJuIGN9fWZ1bmN0aW9uIEJFKHIpe2lmKHIubGVuZ3RoPDIpcmV0dXJue307bGV0IGU9MDtmb3IoO2lzTmFOKHJbZV1bMF0rcltlXVsxXSkmJmUrKzxyLmxlbmd0aDspO2NvbnN0IHQ9a2cocltlXSksbj1GdygpLnRyYW5zbGF0ZShbMCwwXSkuc2NhbGUoMSkucm90YXRlKHQuaW52ZXJ0KFsxODAsMF0pKTtyPXIubWFwKG4pO2NvbnN0IGk9W107bGV0IHM9MTtmb3IobGV0IHU9MCxmPXIubGVuZ3RoO3U8Zjt1Kyspe2xldCBkPXhzKHJbdV1bMF0sMikreHMoclt1XVsxXSwyKTshaXNGaW5pdGUoZCl8fGQ+MWUzMj9pLnB1c2godSk6ZD5zJiYocz1kKX1jb25zdCBhPTFlNip3MChzKTtpLmZvckVhY2godT0+clt1XT1bYSwwXSksci5wdXNoKFswLGFdKSxyLnB1c2goWy1hLDBdKSxyLnB1c2goWzAsLWFdKTtjb25zdCBvPXNmLmZyb20ocik7by5wcm9qZWN0aW9uPW47Y29uc3R7dHJpYW5nbGVzOmwsaGFsZmVkZ2VzOmMsaW5lZGdlczpofT1vO2ZvcihsZXQgdT0wLGY9Yy5sZW5ndGg7dTxmO3UrKylpZihjW3VdPDApe2NvbnN0IGQ9dSUzPT0yP3UtMjp1KzEscD11JTM9PTA/dSsyOnUtMSxfPWNbZF0sZz1jW3BdO2NbX109ZyxjW2ddPV8sY1tkXT1jW3BdPS0xLGxbdV09bFtkXT1sW3BdPWUsaFtsW19dXT1fJTM9PTA/XysyOl8tMSxoW2xbZ11dPWclMz09MD9nKzI6Zy0xLHUrPTItdSUzfWVsc2UgbFt1XT5yLmxlbmd0aC0zLTEmJihsW3VdPWUpO3JldHVybiBvfWZ1bmN0aW9uIHpFKHIsZSl7Y29uc3QgdD1uZXcgU2V0O3JldHVybiBlLmxlbmd0aD09PTI/W1swLDFdXTooci5mb3JFYWNoKG49PntpZihuWzBdIT09blsxXSYmIShsZihuLm1hcChpPT5lW2ldKSk8MCkpZm9yKGxldCBpPTAscztpPDM7aSsrKXM9KGkrMSklMyx0LmFkZChtbChbbltpXSxuW3NdXSkuam9pbigiLSIpKX0pLEFycmF5LmZyb20odCxuPT5uLnNwbGl0KCItIikubWFwKE51bWJlcikpKX1mdW5jdGlvbiBrRShyKXtjb25zdHt0cmlhbmdsZXM6ZX09cjtpZighZSlyZXR1cm5bXTtjb25zdCB0PVtdO2ZvcihsZXQgbj0wLGk9ZS5sZW5ndGgvMztuPGk7bisrKXtjb25zdCBzPWVbMypuXSxhPWVbMypuKzFdLG89ZVszKm4rMl07cyE9PWEmJmEhPT1vJiZ0LnB1c2goW3MsbyxhXSl9cmV0dXJuIHR9ZnVuY3Rpb24gR0UocixlKXtyZXR1cm4gci5tYXAodD0+e2NvbnN0IG49dC5tYXAocz0+ZVtzXSkubWFwKFhuKSxpPVlsKFlsKGJuKG5bMV0sblswXSksYm4oblsyXSxuWzFdKSksYm4oblswXSxuWzJdKSk7cmV0dXJuIG9mKFpsKGkpKX0pfWZ1bmN0aW9uIFZFKHIsZSl7Y29uc3QgdD1bXTtyZXR1cm4gci5mb3JFYWNoKG49Pntmb3IobGV0IGk9MDtpPDM7aSsrKXtjb25zdCBzPW5baV0sYT1uWyhpKzEpJTNdO3Rbc109dFtzXXx8W10sdFtzXS5wdXNoKGEpfX0pLHIubGVuZ3RoPT09MCYmKGU9PT0yPyh0WzBdPVsxXSx0WzFdPVswXSk6ZT09PTEmJih0WzBdPVtdKSksdH1mdW5jdGlvbiBIRShyLGUsdCl7Y29uc3Qgbj1bXSxpPXIuc2xpY2UoKTtpZihlLmxlbmd0aD09PTApe2lmKHQubGVuZ3RoPDIpcmV0dXJue3BvbHlnb25zOm4sY2VudGVyczppfTtpZih0Lmxlbmd0aD09PTIpe2NvbnN0IG89WG4odFswXSksbD1Ybih0WzFdKSxjPVpsKFlsKG8sbCkpLGg9WmwoYm4obyxsKSksdT1ibihjLGgpLGY9W2MsYm4oYyx1KSxibihibihjLHUpLHUpLGJuKGJuKGJuKGMsdSksdSksdSldLm1hcChvZikubWFwKGEpO3JldHVybiBuLnB1c2goZiksbi5wdXNoKGYuc2xpY2UoKS5yZXZlcnNlKCkpLHtwb2x5Z29uczpuLGNlbnRlcnM6aX19fWUuZm9yRWFjaCgobyxsKT0+e2ZvcihsZXQgYz0wO2M8MztjKyspe2NvbnN0IGg9b1tjXSx1PW9bKGMrMSklM10sZj1vWyhjKzIpJTNdO25baF09bltoXXx8W10sbltoXS5wdXNoKFt1LGYsbCxbaCx1LGZdXSl9fSk7Y29uc3Qgcz1uLm1hcChvPT57Y29uc3QgbD1bb1swXVsyXV07bGV0IGM9b1swXVsxXTtmb3IobGV0IGg9MTtoPG8ubGVuZ3RoO2grKylmb3IobGV0IHU9MDt1PG8ubGVuZ3RoO3UrKylpZihvW3VdWzBdPT1jKXtjPW9bdV1bMV0sbC5wdXNoKG9bdV1bMl0pO2JyZWFrfWlmKGwubGVuZ3RoPjIpcmV0dXJuIGw7aWYobC5sZW5ndGg9PTIpe2NvbnN0IGg9QTAodFtvWzBdWzNdWzBdXSx0W29bMF1bM11bMV1dLGlbbFswXV0pLHU9QTAodFtvWzBdWzNdWzJdXSx0W29bMF1bM11bMF1dLGlbbFswXV0pLGY9YShoKSxkPWEodSk7cmV0dXJuW2xbMF0sZCxsWzFdLGZdfX0pO2Z1bmN0aW9uIGEobyl7bGV0IGw9LTE7cmV0dXJuIGkuc2xpY2UoZS5sZW5ndGgsMS8wKS5mb3JFYWNoKChjLGgpPT57Y1swXT09PW9bMF0mJmNbMV09PT1vWzFdJiYobD1oK2UubGVuZ3RoKX0pLGw8MCYmKGw9aS5sZW5ndGgsaS5wdXNoKG8pKSxsfXJldHVybntwb2x5Z29uczpzLGNlbnRlcnM6aX19ZnVuY3Rpb24gQTAocixlLHQpe3I9WG4ociksZT1YbihlKSx0PVhuKHQpO2NvbnN0IG49REUoRTAoYm4oZSxyKSx0KSk7cmV0dXJuIG9mKFpsKFlsKHIsZSkpLm1hcChpPT5uKmkpKX1mdW5jdGlvbiBXRShyKXtjb25zdCBlPVtdO3JldHVybiByLmZvckVhY2godD0+e2lmKCF0KXJldHVybjtsZXQgbj10W3QubGVuZ3RoLTFdO2ZvcihsZXQgaSBvZiB0KWk+biYmZS5wdXNoKFtuLGldKSxuPWl9KSxlfWZ1bmN0aW9uIFhFKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2NvbnN0IG49bmV3IE1hcCxpPW5ldyBNYXA7cmV0dXJuIHIuZm9yRWFjaCgocyxhKT0+e2NvbnN0IG89cy5qb2luKCItIik7bi5zZXQobyx0W2FdKSxpLnNldChvLCEwKX0pLGUuZm9yRWFjaChzPT57bGV0IGE9MCxvPS0xO2ZvcihsZXQgbD0wO2w8MztsKyspe2xldCBjPW1sKFtzW2xdLHNbKGwrMSklM11dKS5qb2luKCItIik7bi5nZXQoYyk+YSYmKGE9bi5nZXQoYyksbz1jKX1pLnNldChvLCExKX0pLHIubWFwKHM9PmkuZ2V0KHMuam9pbigiLSIpKSl9fWZ1bmN0aW9uIHFFKHIsZSl7Y29uc3QgdD1uZXcgU2V0LG49W107ci5tYXAobz0+e2lmKCEobGYoby5tYXAobD0+ZVtsPmUubGVuZ3RoPzA6bF0pKT4xZS0xMikpZm9yKGxldCBsPTA7bDwzO2wrKyl7bGV0IGM9W29bbF0sb1sobCsxKSUzXV0saD1gJHtjWzBdfS0ke2NbMV19YDt0LmhhcyhoKT90LmRlbGV0ZShoKTp0LmFkZChgJHtjWzFdfS0ke2NbMF19YCl9fSk7Y29uc3QgaT1uZXcgTWFwO2xldCBzO2lmKHQuZm9yRWFjaChvPT57bz1vLnNwbGl0KCItIikubWFwKE51bWJlciksaS5zZXQob1swXSxvWzFdKSxzPW9bMF19KSxzPT09dm9pZCAwKXJldHVybiBuO2xldCBhPXM7ZG97bi5wdXNoKGEpO2xldCBvPWkuZ2V0KGEpO2kuc2V0KGEsLTEpLGE9b313aGlsZShhPi0xJiZhIT09cyk7cmV0dXJuIG59ZnVuY3Rpb24gJEUocil7Y29uc3QgZT1mdW5jdGlvbih0KXtpZihlLmRlbGF1bmF5PW51bGwsZS5fZGF0YT10LHR5cGVvZiBlLl9kYXRhPT0ib2JqZWN0IiYmZS5fZGF0YS50eXBlPT09IkZlYXR1cmVDb2xsZWN0aW9uIiYmKGUuX2RhdGE9ZS5fZGF0YS5mZWF0dXJlcyksdHlwZW9mIGUuX2RhdGE9PSJvYmplY3QiKXtjb25zdCBuPWUuX2RhdGEubWFwKGk9PltlLl92eChpKSxlLl92eShpKSxpXSkuZmlsdGVyKGk9PmlzRmluaXRlKGlbMF0raVsxXSkpO2UucG9pbnRzPW4ubWFwKGk9PltpWzBdLGlbMV1dKSxlLnZhbGlkPW4ubWFwKGk9PmlbMl0pLGUuZGVsYXVuYXk9RkUoZS5wb2ludHMpfXJldHVybiBlfTtyZXR1cm4gZS5fdng9ZnVuY3Rpb24odCl7aWYodHlwZW9mIHQ9PSJvYmplY3QiJiYidHlwZSJpbiB0KXJldHVybiBOZyh0KVswXTtpZigwIGluIHQpcmV0dXJuIHRbMF19LGUuX3Z5PWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0PT0ib2JqZWN0IiYmInR5cGUiaW4gdClyZXR1cm4gTmcodClbMV07aWYoMSBpbiB0KXJldHVybiB0WzFdfSxlLng9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/KGUuX3Z4PXQsZSk6ZS5fdnh9LGUueT1mdW5jdGlvbih0KXtyZXR1cm4gdD8oZS5fdnk9dCxlKTplLl92eX0sZS5wb2x5Z29ucz1mdW5jdGlvbih0KXtpZih0IT09dm9pZCAwJiZlKHQpLCFlLmRlbGF1bmF5KXJldHVybiExO2NvbnN0IG49e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczpbXX07cmV0dXJuIGUudmFsaWQubGVuZ3RoPT09MHx8KGUuZGVsYXVuYXkucG9seWdvbnMuZm9yRWFjaCgoaSxzKT0+bi5mZWF0dXJlcy5wdXNoKHt0eXBlOiJGZWF0dXJlIixnZW9tZXRyeTppP3t0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLmksaVswXV0ubWFwKGE9PmUuZGVsYXVuYXkuY2VudGVyc1thXSldfTpudWxsLHByb3BlcnRpZXM6e3NpdGU6ZS52YWxpZFtzXSxzaXRlY29vcmRpbmF0ZXM6ZS5wb2ludHNbc10sbmVpZ2hib3VyczplLmRlbGF1bmF5Lm5laWdoYm9yc1tzXX19KSksZS52YWxpZC5sZW5ndGg9PT0xJiZuLmZlYXR1cmVzLnB1c2goe3R5cGU6IkZlYXR1cmUiLGdlb21ldHJ5Ont0eXBlOiJTcGhlcmUifSxwcm9wZXJ0aWVzOntzaXRlOmUudmFsaWRbMF0sc2l0ZWNvb3JkaW5hdGVzOmUucG9pbnRzWzBdLG5laWdoYm91cnM6W119fSkpLG59LGUudHJpYW5nbGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0IT09dm9pZCAwJiZlKHQpLGUuZGVsYXVuYXk/e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczplLmRlbGF1bmF5LnRyaWFuZ2xlcy5tYXAoKG4saSk9PihuPW4ubWFwKHM9PmUucG9pbnRzW3NdKSxuLmNlbnRlcj1lLmRlbGF1bmF5LmNlbnRlcnNbaV0sbikpLmZpbHRlcihuPT5sZihuKT4wKS5tYXAobj0+KHt0eXBlOiJGZWF0dXJlIixwcm9wZXJ0aWVzOntjaXJjdW1jZW50ZXI6bi5jZW50ZXJ9LGdlb21ldHJ5Ont0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLm4sblswXV1dfX0pKX06ITF9LGUubGlua3M9ZnVuY3Rpb24odCl7aWYodCE9PXZvaWQgMCYmZSh0KSwhZS5kZWxhdW5heSlyZXR1cm4hMTtjb25zdCBuPWUuZGVsYXVuYXkuZWRnZXMubWFwKHM9PmxzKGUucG9pbnRzW3NbMF1dLGUucG9pbnRzW3NbMV1dKSksaT1lLmRlbGF1bmF5LnVycXVoYXJ0KG4pO3JldHVybnt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6ZS5kZWxhdW5heS5lZGdlcy5tYXAoKHMsYSk9Pih7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7c291cmNlOmUudmFsaWRbc1swXV0sdGFyZ2V0OmUudmFsaWRbc1sxXV0sbGVuZ3RoOm5bYV0sdXJxdWhhcnQ6ISFpW2FdfSxnZW9tZXRyeTp7dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W2UucG9pbnRzW3NbMF1dLGUucG9pbnRzW3NbMV1dXX19KSl9fSxlLm1lc2g9ZnVuY3Rpb24odCl7cmV0dXJuIHQhPT12b2lkIDAmJmUodCksZS5kZWxhdW5heT97dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczplLmRlbGF1bmF5LmVkZ2VzLm1hcChuPT5bZS5wb2ludHNbblswXV0sZS5wb2ludHNbblsxXV1dKX06ITF9LGUuY2VsbE1lc2g9ZnVuY3Rpb24odCl7aWYodCE9PXZvaWQgMCYmZSh0KSwhZS5kZWxhdW5heSlyZXR1cm4hMTtjb25zdHtjZW50ZXJzOm4scG9seWdvbnM6aX09ZS5kZWxhdW5heSxzPVtdO2Zvcihjb25zdCBhIG9mIGkpaWYoYSlmb3IobGV0IG89YS5sZW5ndGgsbD1hW28tMV0sYz1hWzBdLGg9MDtoPG87bD1jLGM9YVsrK2hdKWM+bCYmcy5wdXNoKFtuW2xdLG5bY11dKTtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczpzfX0sZS5fZm91bmQ9dm9pZCAwLGUuZmluZD1mdW5jdGlvbih0LG4saSl7aWYoZS5fZm91bmQ9ZS5kZWxhdW5heS5maW5kKHQsbixlLl9mb3VuZCksIWl8fGxzKFt0LG5dLGUucG9pbnRzW2UuX2ZvdW5kXSk8aSlyZXR1cm4gZS5fZm91bmR9LGUuaHVsbD1mdW5jdGlvbih0KXt0IT09dm9pZCAwJiZlKHQpO2NvbnN0IG49ZS5kZWxhdW5heS5odWxsLGk9ZS5wb2ludHM7cmV0dXJuIG4ubGVuZ3RoPT09MD9udWxsOnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLm4ubWFwKHM9Pmlbc10pLGlbblswXV1dXX19LHI/ZShyKTplfWZ1bmN0aW9uIFlFKHIsZSl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpicmVhaztjYXNlIDE6dGhpcy5yYW5nZShyKTticmVhaztkZWZhdWx0OnRoaXMucmFuZ2UoZSkuZG9tYWluKHIpO2JyZWFrfXJldHVybiB0aGlzfWZ1bmN0aW9uIGNmKHIsZSx0KXtyLnByb3RvdHlwZT1lLnByb3RvdHlwZT10LHQuY29uc3RydWN0b3I9cn1mdW5jdGlvbiBUMChyLGUpe3ZhciB0PU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBDYSgpe312YXIgUmE9LjcsSmw9MS9SYSxtcz0iXFxzKihbKy1dP1xcZCspXFxzKiIsUGE9IlxccyooWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLHFuPSJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsWkU9L14jKFswLTlhLWZdezMsOH0pJC8sSkU9bmV3IFJlZ0V4cChgXnJnYlxcKCR7bXN9LCR7bXN9LCR7bXN9XFwpJGApLEtFPW5ldyBSZWdFeHAoYF5yZ2JcXCgke3FufSwke3FufSwke3FufVxcKSRgKSxRRT1uZXcgUmVnRXhwKGBecmdiYVxcKCR7bXN9LCR7bXN9LCR7bXN9LCR7UGF9XFwpJGApLGpFPW5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtxbn0sJHtxbn0sJHtxbn0sJHtQYX1cXCkkYCksZUE9bmV3IFJlZ0V4cChgXmhzbFxcKCR7UGF9LCR7cW59LCR7cW59XFwpJGApLHRBPW5ldyBSZWdFeHAoYF5oc2xhXFwoJHtQYX0sJHtxbn0sJHtxbn0sJHtQYX1cXCkkYCksQzA9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH07Y2YoQ2EsTGEse2NvcHkocil7cmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsdGhpcyxyKX0sZGlzcGxheWFibGUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6UjAsZm9ybWF0SGV4OlIwLGZvcm1hdEhleDg6bkEsZm9ybWF0SHNsOmlBLGZvcm1hdFJnYjpQMCx0b1N0cmluZzpQMH0pO2Z1bmN0aW9uIFIwKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCl9ZnVuY3Rpb24gbkEoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXg4KCl9ZnVuY3Rpb24gaUEoKXtyZXR1cm4gTjAodGhpcykuZm9ybWF0SHNsKCl9ZnVuY3Rpb24gUDAoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKX1mdW5jdGlvbiBMYShyKXt2YXIgZSx0O3JldHVybiByPShyKyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwoZT1aRS5leGVjKHIpKT8odD1lWzFdLmxlbmd0aCxlPXBhcnNlSW50KGVbMV0sMTYpLHQ9PT02P0wwKGUpOnQ9PT0zP25ldyBtbihlPj44JjE1fGU+PjQmMjQwLGU+PjQmMTV8ZSYyNDAsKGUmMTUpPDw0fGUmMTUsMSk6dD09PTg/S2woZT4+MjQmMjU1LGU+PjE2JjI1NSxlPj44JjI1NSwoZSYyNTUpLzI1NSk6dD09PTQ/S2woZT4+MTImMTV8ZT4+OCYyNDAsZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fGUmMjQwLCgoZSYxNSk8PDR8ZSYxNSkvMjU1KTpudWxsKTooZT1KRS5leGVjKHIpKT9uZXcgbW4oZVsxXSxlWzJdLGVbM10sMSk6KGU9S0UuZXhlYyhyKSk/bmV3IG1uKGVbMV0qMjU1LzEwMCxlWzJdKjI1NS8xMDAsZVszXSoyNTUvMTAwLDEpOihlPVFFLmV4ZWMocikpP0tsKGVbMV0sZVsyXSxlWzNdLGVbNF0pOihlPWpFLmV4ZWMocikpP0tsKGVbMV0qMjU1LzEwMCxlWzJdKjI1NS8xMDAsZVszXSoyNTUvMTAwLGVbNF0pOihlPWVBLmV4ZWMocikpP0QwKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsMSk6KGU9dEEuZXhlYyhyKSk/RDAoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdKTpDMC5oYXNPd25Qcm9wZXJ0eShyKT9MMChDMFtyXSk6cj09PSJ0cmFuc3BhcmVudCI/bmV3IG1uKE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gTDAocil7cmV0dXJuIG5ldyBtbihyPj4xNiYyNTUscj4+OCYyNTUsciYyNTUsMSl9ZnVuY3Rpb24gS2wocixlLHQsbil7cmV0dXJuIG48PTAmJihyPWU9dD1OYU4pLG5ldyBtbihyLGUsdCxuKX1mdW5jdGlvbiByQShyKXtyZXR1cm4gciBpbnN0YW5jZW9mIENhfHwocj1MYShyKSkscj8ocj1yLnJnYigpLG5ldyBtbihyLnIsci5nLHIuYixyLm9wYWNpdHkpKTpuZXcgbW59ZnVuY3Rpb24gaGYocixlLHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP3JBKHIpOm5ldyBtbihyLGUsdCxuPT1udWxsPzE6bil9ZnVuY3Rpb24gbW4ocixlLHQsbil7dGhpcy5yPStyLHRoaXMuZz0rZSx0aGlzLmI9K3QsdGhpcy5vcGFjaXR5PStufWNmKG1uLGhmLFQwKENhLHticmlnaHRlcihyKXtyZXR1cm4gcj1yPT1udWxsP0psOk1hdGgucG93KEpsLHIpLG5ldyBtbih0aGlzLnIqcix0aGlzLmcqcix0aGlzLmIqcix0aGlzLm9wYWNpdHkpfSxkYXJrZXIocil7cmV0dXJuIHI9cj09bnVsbD9SYTpNYXRoLnBvdyhSYSxyKSxuZXcgbW4odGhpcy5yKnIsdGhpcy5nKnIsdGhpcy5iKnIsdGhpcy5vcGFjaXR5KX0scmdiKCl7cmV0dXJuIHRoaXN9LGNsYW1wKCl7cmV0dXJuIG5ldyBtbihncih0aGlzLnIpLGdyKHRoaXMuZyksZ3IodGhpcy5iKSxRbCh0aGlzLm9wYWNpdHkpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4tLjU8PXRoaXMuciYmdGhpcy5yPDI1NS41JiYtLjU8PXRoaXMuZyYmdGhpcy5nPDI1NS41JiYtLjU8PXRoaXMuYiYmdGhpcy5iPDI1NS41JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0saGV4OkkwLGZvcm1hdEhleDpJMCxmb3JtYXRIZXg4OnNBLGZvcm1hdFJnYjpVMCx0b1N0cmluZzpVMH0pKTtmdW5jdGlvbiBJMCgpe3JldHVybmAjJHtfcih0aGlzLnIpfSR7X3IodGhpcy5nKX0ke19yKHRoaXMuYil9YH1mdW5jdGlvbiBzQSgpe3JldHVybmAjJHtfcih0aGlzLnIpfSR7X3IodGhpcy5nKX0ke19yKHRoaXMuYil9JHtfcigoaXNOYU4odGhpcy5vcGFjaXR5KT8xOnRoaXMub3BhY2l0eSkqMjU1KX1gfWZ1bmN0aW9uIFUwKCl7Y29uc3Qgcj1RbCh0aGlzLm9wYWNpdHkpO3JldHVybmAke3I9PT0xPyJyZ2IoIjoicmdiYSgifSR7Z3IodGhpcy5yKX0sICR7Z3IodGhpcy5nKX0sICR7Z3IodGhpcy5iKX0ke3I9PT0xPyIpIjpgLCAke3J9KWB9YH1mdW5jdGlvbiBRbChyKXtyZXR1cm4gaXNOYU4ocik/MTpNYXRoLm1heCgwLE1hdGgubWluKDEscikpfWZ1bmN0aW9uIGdyKHIpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHIpfHwwKSl9ZnVuY3Rpb24gX3Iocil7cmV0dXJuIHI9Z3IociksKHI8MTY/IjAiOiIiKStyLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBEMChyLGUsdCxuKXtyZXR1cm4gbjw9MD9yPWU9dD1OYU46dDw9MHx8dD49MT9yPWU9TmFOOmU8PTAmJihyPU5hTiksbmV3IHpuKHIsZSx0LG4pfWZ1bmN0aW9uIE4wKHIpe2lmKHIgaW5zdGFuY2VvZiB6bilyZXR1cm4gbmV3IHpuKHIuaCxyLnMsci5sLHIub3BhY2l0eSk7aWYociBpbnN0YW5jZW9mIENhfHwocj1MYShyKSksIXIpcmV0dXJuIG5ldyB6bjtpZihyIGluc3RhbmNlb2Ygem4pcmV0dXJuIHI7cj1yLnJnYigpO3ZhciBlPXIuci8yNTUsdD1yLmcvMjU1LG49ci5iLzI1NSxpPU1hdGgubWluKGUsdCxuKSxzPU1hdGgubWF4KGUsdCxuKSxhPU5hTixvPXMtaSxsPShzK2kpLzI7cmV0dXJuIG8/KGU9PT1zP2E9KHQtbikvbysodDxuKSo2OnQ9PT1zP2E9KG4tZSkvbysyOmE9KGUtdCkvbys0LG8vPWw8LjU/cytpOjItcy1pLGEqPTYwKTpvPWw+MCYmbDwxPzA6YSxuZXcgem4oYSxvLGwsci5vcGFjaXR5KX1mdW5jdGlvbiBhQShyLGUsdCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/TjAocik6bmV3IHpuKHIsZSx0LG49PW51bGw/MTpuKX1mdW5jdGlvbiB6bihyLGUsdCxuKXt0aGlzLmg9K3IsdGhpcy5zPStlLHRoaXMubD0rdCx0aGlzLm9wYWNpdHk9K259Y2Yoem4sYUEsVDAoQ2Ese2JyaWdodGVyKHIpe3JldHVybiByPXI9PW51bGw/Smw6TWF0aC5wb3coSmwsciksbmV3IHpuKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnIsdGhpcy5vcGFjaXR5KX0sZGFya2VyKHIpe3JldHVybiByPXI9PW51bGw/UmE6TWF0aC5wb3coUmEsciksbmV3IHpuKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnIsdGhpcy5vcGFjaXR5KX0scmdiKCl7dmFyIHI9dGhpcy5oJTM2MCsodGhpcy5oPDApKjM2MCxlPWlzTmFOKHIpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLHQ9dGhpcy5sLG49dCsodDwuNT90OjEtdCkqZSxpPTIqdC1uO3JldHVybiBuZXcgbW4odWYocj49MjQwP3ItMjQwOnIrMTIwLGksbiksdWYocixpLG4pLHVmKHI8MTIwP3IrMjQwOnItMTIwLGksbiksdGhpcy5vcGFjaXR5KX0sY2xhbXAoKXtyZXR1cm4gbmV3IHpuKEYwKHRoaXMuaCksamwodGhpcy5zKSxqbCh0aGlzLmwpLFFsKHRoaXMub3BhY2l0eSkpfSxkaXNwbGF5YWJsZSgpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsKCl7Y29uc3Qgcj1RbCh0aGlzLm9wYWNpdHkpO3JldHVybmAke3I9PT0xPyJoc2woIjoiaHNsYSgifSR7RjAodGhpcy5oKX0sICR7amwodGhpcy5zKSoxMDB9JSwgJHtqbCh0aGlzLmwpKjEwMH0lJHtyPT09MT8iKSI6YCwgJHtyfSlgfWB9fSkpO2Z1bmN0aW9uIEYwKHIpe3JldHVybiByPShyfHwwKSUzNjAscjwwP3IrMzYwOnJ9ZnVuY3Rpb24gamwocil7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMSxyfHwwKSl9ZnVuY3Rpb24gdWYocixlLHQpe3JldHVybihyPDYwP2UrKHQtZSkqci82MDpyPDE4MD90OnI8MjQwP2UrKHQtZSkqKDI0MC1yKS82MDplKSoyNTV9dmFyIGZmPXI9PigpPT5yO2Z1bmN0aW9uIG9BKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByK3QqZX19ZnVuY3Rpb24gbEEocixlLHQpe3JldHVybiByPU1hdGgucG93KHIsdCksZT1NYXRoLnBvdyhlLHQpLXIsdD0xL3QsZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KHIrbiplLHQpfX1mdW5jdGlvbiBjQShyKXtyZXR1cm4ocj0rcik9PTE/TzA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC1lP2xBKGUsdCxyKTpmZihpc05hTihlKT90OmUpfX1mdW5jdGlvbiBPMChyLGUpe3ZhciB0PWUtcjtyZXR1cm4gdD9vQShyLHQpOmZmKGlzTmFOKHIpP2U6cil9dmFyIEIwPWZ1bmN0aW9uIHIoZSl7dmFyIHQ9Y0EoZSk7ZnVuY3Rpb24gbihpLHMpe3ZhciBhPXQoKGk9aGYoaSkpLnIsKHM9aGYocykpLnIpLG89dChpLmcscy5nKSxsPXQoaS5iLHMuYiksYz1PMChpLm9wYWNpdHkscy5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oaCl7cmV0dXJuIGkucj1hKGgpLGkuZz1vKGgpLGkuYj1sKGgpLGkub3BhY2l0eT1jKGgpLGkrIiJ9fXJldHVybiBuLmdhbW1hPXIsbn0oMSk7ZnVuY3Rpb24gaEEocixlKXtlfHwoZT1bXSk7dmFyIHQ9cj9NYXRoLm1pbihlLmxlbmd0aCxyLmxlbmd0aCk6MCxuPWUuc2xpY2UoKSxpO3JldHVybiBmdW5jdGlvbihzKXtmb3IoaT0wO2k8dDsrK2kpbltpXT1yW2ldKigxLXMpK2VbaV0qcztyZXR1cm4gbn19ZnVuY3Rpb24gdUEocil7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhyKSYmIShyIGluc3RhbmNlb2YgRGF0YVZpZXcpfWZ1bmN0aW9uIGZBKHIsZSl7dmFyIHQ9ZT9lLmxlbmd0aDowLG49cj9NYXRoLm1pbih0LHIubGVuZ3RoKTowLGk9bmV3IEFycmF5KG4pLHM9bmV3IEFycmF5KHQpLGE7Zm9yKGE9MDthPG47KythKWlbYV09bWYoclthXSxlW2FdKTtmb3IoO2E8dDsrK2Epc1thXT1lW2FdO3JldHVybiBmdW5jdGlvbihvKXtmb3IoYT0wO2E8bjsrK2Epc1thXT1pW2FdKG8pO3JldHVybiBzfX1mdW5jdGlvbiBkQShyLGUpe3ZhciB0PW5ldyBEYXRlO3JldHVybiByPStyLGU9K2UsZnVuY3Rpb24obil7cmV0dXJuIHQuc2V0VGltZShyKigxLW4pK2UqbiksdH19ZnVuY3Rpb24gZWMocixlKXtyZXR1cm4gcj0rcixlPStlLGZ1bmN0aW9uKHQpe3JldHVybiByKigxLXQpK2UqdH19ZnVuY3Rpb24gcEEocixlKXt2YXIgdD17fSxuPXt9LGk7KHI9PT1udWxsfHx0eXBlb2YgciE9Im9iamVjdCIpJiYocj17fSksKGU9PT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpJiYoZT17fSk7Zm9yKGkgaW4gZSlpIGluIHI/dFtpXT1tZihyW2ldLGVbaV0pOm5baV09ZVtpXTtyZXR1cm4gZnVuY3Rpb24ocyl7Zm9yKGkgaW4gdCluW2ldPXRbaV0ocyk7cmV0dXJuIG59fXZhciBkZj0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2cscGY9bmV3IFJlZ0V4cChkZi5zb3VyY2UsImciKTtmdW5jdGlvbiBtQShyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcn19ZnVuY3Rpb24gZ0Eocil7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiByKGUpKyIifX1mdW5jdGlvbiBfQShyLGUpe3ZhciB0PWRmLmxhc3RJbmRleD1wZi5sYXN0SW5kZXg9MCxuLGkscyxhPS0xLG89W10sbD1bXTtmb3Iocj1yKyIiLGU9ZSsiIjsobj1kZi5leGVjKHIpKSYmKGk9cGYuZXhlYyhlKSk7KShzPWkuaW5kZXgpPnQmJihzPWUuc2xpY2UodCxzKSxvW2FdP29bYV0rPXM6b1srK2FdPXMpLChuPW5bMF0pPT09KGk9aVswXSk/b1thXT9vW2FdKz1pOm9bKythXT1pOihvWysrYV09bnVsbCxsLnB1c2goe2k6YSx4OmVjKG4saSl9KSksdD1wZi5sYXN0SW5kZXg7cmV0dXJuIHQ8ZS5sZW5ndGgmJihzPWUuc2xpY2UodCksb1thXT9vW2FdKz1zOm9bKythXT1zKSxvLmxlbmd0aDwyP2xbMF0/Z0EobFswXS54KTptQShlKTooZT1sLmxlbmd0aCxmdW5jdGlvbihjKXtmb3IodmFyIGg9MCx1O2g8ZTsrK2gpb1sodT1sW2hdKS5pXT11LngoYyk7cmV0dXJuIG8uam9pbigiIil9KX1mdW5jdGlvbiBtZihyLGUpe3ZhciB0PXR5cGVvZiBlLG47cmV0dXJuIGU9PW51bGx8fHQ9PT0iYm9vbGVhbiI/ZmYoZSk6KHQ9PT0ibnVtYmVyIj9lYzp0PT09InN0cmluZyI/KG49TGEoZSkpPyhlPW4sQjApOl9BOmUgaW5zdGFuY2VvZiBMYT9CMDplIGluc3RhbmNlb2YgRGF0ZT9kQTp1QShlKT9oQTpBcnJheS5pc0FycmF5KGUpP2ZBOnR5cGVvZiBlLnZhbHVlT2YhPSJmdW5jdGlvbiImJnR5cGVvZiBlLnRvU3RyaW5nIT0iZnVuY3Rpb24ifHxpc05hTihlKT9wQTplYykocixlKX1mdW5jdGlvbiB4QShyLGUpe3JldHVybiByPStyLGU9K2UsZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQociooMS10KStlKnQpfX1mdW5jdGlvbiB5QShyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcn19ZnVuY3Rpb24gdkEocil7cmV0dXJuK3J9dmFyIHowPVswLDFdO2Z1bmN0aW9uIGdzKHIpe3JldHVybiByfWZ1bmN0aW9uIGdmKHIsZSl7cmV0dXJuKGUtPXI9K3IpP2Z1bmN0aW9uKHQpe3JldHVybih0LXIpL2V9OnlBKGlzTmFOKGUpP05hTjouNSl9ZnVuY3Rpb24gTUEocixlKXt2YXIgdDtyZXR1cm4gcj5lJiYodD1yLHI9ZSxlPXQpLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLm1heChyLE1hdGgubWluKGUsbikpfX1mdW5jdGlvbiBTQShyLGUsdCl7dmFyIG49clswXSxpPXJbMV0scz1lWzBdLGE9ZVsxXTtyZXR1cm4gaTxuPyhuPWdmKGksbikscz10KGEscykpOihuPWdmKG4saSkscz10KHMsYSkpLGZ1bmN0aW9uKG8pe3JldHVybiBzKG4obykpfX1mdW5jdGlvbiBiQShyLGUsdCl7dmFyIG49TWF0aC5taW4oci5sZW5ndGgsZS5sZW5ndGgpLTEsaT1uZXcgQXJyYXkobikscz1uZXcgQXJyYXkobiksYT0tMTtmb3IocltuXTxyWzBdJiYocj1yLnNsaWNlKCkucmV2ZXJzZSgpLGU9ZS5zbGljZSgpLnJldmVyc2UoKSk7KythPG47KWlbYV09Z2YoclthXSxyW2ErMV0pLHNbYV09dChlW2FdLGVbYSsxXSk7cmV0dXJuIGZ1bmN0aW9uKG8pe3ZhciBsPUkxKHIsbywxLG4pLTE7cmV0dXJuIHNbbF0oaVtsXShvKSl9fWZ1bmN0aW9uIHdBKHIsZSl7cmV0dXJuIGUuZG9tYWluKHIuZG9tYWluKCkpLnJhbmdlKHIucmFuZ2UoKSkuaW50ZXJwb2xhdGUoci5pbnRlcnBvbGF0ZSgpKS5jbGFtcChyLmNsYW1wKCkpLnVua25vd24oci51bmtub3duKCkpfWZ1bmN0aW9uIEVBKCl7dmFyIHI9ejAsZT16MCx0PW1mLG4saSxzLGE9Z3MsbyxsLGM7ZnVuY3Rpb24gaCgpe3ZhciBmPU1hdGgubWluKHIubGVuZ3RoLGUubGVuZ3RoKTtyZXR1cm4gYSE9PWdzJiYoYT1NQShyWzBdLHJbZi0xXSkpLG89Zj4yP2JBOlNBLGw9Yz1udWxsLHV9ZnVuY3Rpb24gdShmKXtyZXR1cm4gZj09bnVsbHx8aXNOYU4oZj0rZik/czoobHx8KGw9byhyLm1hcChuKSxlLHQpKSkobihhKGYpKSl9cmV0dXJuIHUuaW52ZXJ0PWZ1bmN0aW9uKGYpe3JldHVybiBhKGkoKGN8fChjPW8oZSxyLm1hcChuKSxlYykpKShmKSkpfSx1LmRvbWFpbj1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1BcnJheS5mcm9tKGYsdkEpLGgoKSk6ci5zbGljZSgpfSx1LnJhbmdlPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUFycmF5LmZyb20oZiksaCgpKTplLnNsaWNlKCl9LHUucmFuZ2VSb3VuZD1mdW5jdGlvbihmKXtyZXR1cm4gZT1BcnJheS5mcm9tKGYpLHQ9eEEsaCgpfSx1LmNsYW1wPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWY/ITA6Z3MsaCgpKTphIT09Z3N9LHUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZixoKCkpOnR9LHUudW5rbm93bj1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1mLHUpOnN9LGZ1bmN0aW9uKGYsZCl7cmV0dXJuIG49ZixpPWQsaCgpfX1mdW5jdGlvbiBBQSgpe3JldHVybiBFQSgpKGdzLGdzKX1mdW5jdGlvbiBUQShyKXtyZXR1cm4gTWF0aC5hYnMocj1NYXRoLnJvdW5kKHIpKT49MWUyMT9yLnRvTG9jYWxlU3RyaW5nKCJlbiIpLnJlcGxhY2UoLywvZywiIik6ci50b1N0cmluZygxMCl9ZnVuY3Rpb24gdGMocixlKXtpZigodD0ocj1lP3IudG9FeHBvbmVudGlhbChlLTEpOnIudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKCJlIikpPDApcmV0dXJuIG51bGw7dmFyIHQsbj1yLnNsaWNlKDAsdCk7cmV0dXJuW24ubGVuZ3RoPjE/blswXStuLnNsaWNlKDIpOm4sK3Iuc2xpY2UodCsxKV19ZnVuY3Rpb24gX3Mocil7cmV0dXJuIHI9dGMoTWF0aC5hYnMocikpLHI/clsxXTpOYU59ZnVuY3Rpb24gQ0EocixlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXtmb3IodmFyIGk9dC5sZW5ndGgscz1bXSxhPTAsbz1yWzBdLGw9MDtpPjAmJm8+MCYmKGwrbysxPm4mJihvPU1hdGgubWF4KDEsbi1sKSkscy5wdXNoKHQuc3Vic3RyaW5nKGktPW8saStvKSksISgobCs9bysxKT5uKSk7KW89clthPShhKzEpJXIubGVuZ3RoXTtyZXR1cm4gcy5yZXZlcnNlKCkuam9pbihlKX19ZnVuY3Rpb24gUkEocil7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1swLTldL2csZnVuY3Rpb24odCl7cmV0dXJuIHJbK3RdfSl9fXZhciBQQT0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiBuYyhyKXtpZighKGU9UEEuZXhlYyhyKSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIityKTt2YXIgZTtyZXR1cm4gbmV3IF9mKHtmaWxsOmVbMV0sYWxpZ246ZVsyXSxzaWduOmVbM10sc3ltYm9sOmVbNF0semVybzplWzVdLHdpZHRoOmVbNl0sY29tbWE6ZVs3XSxwcmVjaXNpb246ZVs4XSYmZVs4XS5zbGljZSgxKSx0cmltOmVbOV0sdHlwZTplWzEwXX0pfW5jLnByb3RvdHlwZT1fZi5wcm90b3R5cGU7ZnVuY3Rpb24gX2Yocil7dGhpcy5maWxsPXIuZmlsbD09PXZvaWQgMD8iICI6ci5maWxsKyIiLHRoaXMuYWxpZ249ci5hbGlnbj09PXZvaWQgMD8iPiI6ci5hbGlnbisiIix0aGlzLnNpZ249ci5zaWduPT09dm9pZCAwPyItIjpyLnNpZ24rIiIsdGhpcy5zeW1ib2w9ci5zeW1ib2w9PT12b2lkIDA/IiI6ci5zeW1ib2wrIiIsdGhpcy56ZXJvPSEhci56ZXJvLHRoaXMud2lkdGg9ci53aWR0aD09PXZvaWQgMD92b2lkIDA6K3Iud2lkdGgsdGhpcy5jb21tYT0hIXIuY29tbWEsdGhpcy5wcmVjaXNpb249ci5wcmVjaXNpb249PT12b2lkIDA/dm9pZCAwOityLnByZWNpc2lvbix0aGlzLnRyaW09ISFyLnRyaW0sdGhpcy50eXBlPXIudHlwZT09PXZvaWQgMD8iIjpyLnR5cGUrIiJ9X2YucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKHRoaXMud2lkdGg9PT12b2lkIDA/IiI6TWF0aC5tYXgoMSx0aGlzLndpZHRofDApKSsodGhpcy5jb21tYT8iLCI6IiIpKyh0aGlzLnByZWNpc2lvbj09PXZvaWQgMD8iIjoiLiIrTWF0aC5tYXgoMCx0aGlzLnByZWNpc2lvbnwwKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07ZnVuY3Rpb24gTEEocil7ZTpmb3IodmFyIGU9ci5sZW5ndGgsdD0xLG49LTEsaTt0PGU7Kyt0KXN3aXRjaChyW3RdKXtjYXNlIi4iOm49aT10O2JyZWFrO2Nhc2UiMCI6bj09PTAmJihuPXQpLGk9dDticmVhaztkZWZhdWx0OmlmKCErclt0XSlicmVhayBlO24+MCYmKG49MCk7YnJlYWt9cmV0dXJuIG4+MD9yLnNsaWNlKDAsbikrci5zbGljZShpKzEpOnJ9dmFyIGswO2Z1bmN0aW9uIElBKHIsZSl7dmFyIHQ9dGMocixlKTtpZighdClyZXR1cm4gcisiIjt2YXIgbj10WzBdLGk9dFsxXSxzPWktKGswPU1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihpLzMpKSkqMykrMSxhPW4ubGVuZ3RoO3JldHVybiBzPT09YT9uOnM+YT9uK25ldyBBcnJheShzLWErMSkuam9pbigiMCIpOnM+MD9uLnNsaWNlKDAscykrIi4iK24uc2xpY2Uocyk6IjAuIituZXcgQXJyYXkoMS1zKS5qb2luKCIwIikrdGMocixNYXRoLm1heCgwLGUrcy0xKSlbMF19ZnVuY3Rpb24gRzAocixlKXt2YXIgdD10YyhyLGUpO2lmKCF0KXJldHVybiByKyIiO3ZhciBuPXRbMF0saT10WzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStuOm4ubGVuZ3RoPmkrMT9uLnNsaWNlKDAsaSsxKSsiLiIrbi5zbGljZShpKzEpOm4rbmV3IEFycmF5KGktbi5sZW5ndGgrMikuam9pbigiMCIpfXZhciBWMD17IiUiOihyLGUpPT4ocioxMDApLnRvRml4ZWQoZSksYjpyPT5NYXRoLnJvdW5kKHIpLnRvU3RyaW5nKDIpLGM6cj0+cisiIixkOlRBLGU6KHIsZSk9PnIudG9FeHBvbmVudGlhbChlKSxmOihyLGUpPT5yLnRvRml4ZWQoZSksZzoocixlKT0+ci50b1ByZWNpc2lvbihlKSxvOnI9Pk1hdGgucm91bmQocikudG9TdHJpbmcoOCkscDoocixlKT0+RzAocioxMDAsZSkscjpHMCxzOklBLFg6cj0+TWF0aC5yb3VuZChyKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSx4OnI9Pk1hdGgucm91bmQocikudG9TdHJpbmcoMTYpfTtmdW5jdGlvbiBIMChyKXtyZXR1cm4gcn12YXIgVzA9QXJyYXkucHJvdG90eXBlLm1hcCxYMD1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl07ZnVuY3Rpb24gVUEocil7dmFyIGU9ci5ncm91cGluZz09PXZvaWQgMHx8ci50aG91c2FuZHM9PT12b2lkIDA/SDA6Q0EoVzAuY2FsbChyLmdyb3VwaW5nLE51bWJlciksci50aG91c2FuZHMrIiIpLHQ9ci5jdXJyZW5jeT09PXZvaWQgMD8iIjpyLmN1cnJlbmN5WzBdKyIiLG49ci5jdXJyZW5jeT09PXZvaWQgMD8iIjpyLmN1cnJlbmN5WzFdKyIiLGk9ci5kZWNpbWFsPT09dm9pZCAwPyIuIjpyLmRlY2ltYWwrIiIscz1yLm51bWVyYWxzPT09dm9pZCAwP0gwOlJBKFcwLmNhbGwoci5udW1lcmFscyxTdHJpbmcpKSxhPXIucGVyY2VudD09PXZvaWQgMD8iJSI6ci5wZXJjZW50KyIiLG89ci5taW51cz09PXZvaWQgMD8i4oiSIjpyLm1pbnVzKyIiLGw9ci5uYW49PT12b2lkIDA/Ik5hTiI6ci5uYW4rIiI7ZnVuY3Rpb24gYyh1KXt1PW5jKHUpO3ZhciBmPXUuZmlsbCxkPXUuYWxpZ24scD11LnNpZ24sXz11LnN5bWJvbCxnPXUuemVybyxtPXUud2lkdGgseT11LmNvbW1hLHg9dS5wcmVjaXNpb24sdj11LnRyaW0sUz11LnR5cGU7Uz09PSJuIj8oeT0hMCxTPSJnIik6VjBbU118fCh4PT09dm9pZCAwJiYoeD0xMiksdj0hMCxTPSJnIiksKGd8fGY9PT0iMCImJmQ9PT0iPSIpJiYoZz0hMCxmPSIwIixkPSI9Iik7dmFyIGI9Xz09PSIkIj90Ol89PT0iIyImJi9bYm94WF0vLnRlc3QoUyk/IjAiK1MudG9Mb3dlckNhc2UoKToiIixBPV89PT0iJCI/bjovWyVwXS8udGVzdChTKT9hOiIiLEw9VjBbU10sTT0vW2RlZmdwcnMlXS8udGVzdChTKTt4PXg9PT12b2lkIDA/NjovW2dwcnNdLy50ZXN0KFMpP01hdGgubWF4KDEsTWF0aC5taW4oMjEseCkpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAseCkpO2Z1bmN0aW9uIHcoUil7dmFyIE49YixCPUEsSSxVLHo7aWYoUz09PSJjIilCPUwoUikrQixSPSIiO2Vsc2V7Uj0rUjt2YXIgRj1SPDB8fDEvUjwwO2lmKFI9aXNOYU4oUik/bDpMKE1hdGguYWJzKFIpLHgpLHYmJihSPUxBKFIpKSxGJiYrUj09MCYmcCE9PSIrIiYmKEY9ITEpLE49KEY/cD09PSIoIj9wOm86cD09PSItInx8cD09PSIoIj8iIjpwKStOLEI9KFM9PT0icyI/WDBbOCtrMC8zXToiIikrQisoRiYmcD09PSIoIj8iKSI6IiIpLE0pe2ZvcihJPS0xLFU9Ui5sZW5ndGg7KytJPFU7KWlmKHo9Ui5jaGFyQ29kZUF0KEkpLDQ4Pnp8fHo+NTcpe0I9KHo9PT00Nj9pK1Iuc2xpY2UoSSsxKTpSLnNsaWNlKEkpKStCLFI9Ui5zbGljZSgwLEkpO2JyZWFrfX19eSYmIWcmJihSPWUoUiwxLzApKTt2YXIgWj1OLmxlbmd0aCtSLmxlbmd0aCtCLmxlbmd0aCxWPVo8bT9uZXcgQXJyYXkobS1aKzEpLmpvaW4oZik6IiI7c3dpdGNoKHkmJmcmJihSPWUoVitSLFYubGVuZ3RoP20tQi5sZW5ndGg6MS8wKSxWPSIiKSxkKXtjYXNlIjwiOlI9TitSK0IrVjticmVhaztjYXNlIj0iOlI9TitWK1IrQjticmVhaztjYXNlIl4iOlI9Vi5zbGljZSgwLFo9Vi5sZW5ndGg+PjEpK04rUitCK1Yuc2xpY2UoWik7YnJlYWs7ZGVmYXVsdDpSPVYrTitSK0I7YnJlYWt9cmV0dXJuIHMoUil9cmV0dXJuIHcudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdSsiIn0sd31mdW5jdGlvbiBoKHUsZil7dmFyIGQ9YygodT1uYyh1KSx1LnR5cGU9ImYiLHUpKSxwPU1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihfcyhmKS8zKSkpKjMsXz1NYXRoLnBvdygxMCwtcCksZz1YMFs4K3AvM107cmV0dXJuIGZ1bmN0aW9uKG0pe3JldHVybiBkKF8qbSkrZ319cmV0dXJue2Zvcm1hdDpjLGZvcm1hdFByZWZpeDpofX12YXIgaWMscTAsJDA7REEoe3Rob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdfSk7ZnVuY3Rpb24gREEocil7cmV0dXJuIGljPVVBKHIpLHEwPWljLmZvcm1hdCwkMD1pYy5mb3JtYXRQcmVmaXgsaWN9ZnVuY3Rpb24gTkEocil7cmV0dXJuIE1hdGgubWF4KDAsLV9zKE1hdGguYWJzKHIpKSl9ZnVuY3Rpb24gRkEocixlKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoX3MoZSkvMykpKSozLV9zKE1hdGguYWJzKHIpKSl9ZnVuY3Rpb24gT0EocixlKXtyZXR1cm4gcj1NYXRoLmFicyhyKSxlPU1hdGguYWJzKGUpLXIsTWF0aC5tYXgoMCxfcyhlKS1fcyhyKSkrMX1mdW5jdGlvbiBCQShyLGUsdCxuKXt2YXIgaT1PMShyLGUsdCkscztzd2l0Y2gobj1uYyhuPT1udWxsPyIsZiI6biksbi50eXBlKXtjYXNlInMiOnt2YXIgYT1NYXRoLm1heChNYXRoLmFicyhyKSxNYXRoLmFicyhlKSk7cmV0dXJuIG4ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocz1GQShpLGEpKSYmKG4ucHJlY2lzaW9uPXMpLCQwKG4sYSl9Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6e24ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocz1PQShpLE1hdGgubWF4KE1hdGguYWJzKHIpLE1hdGguYWJzKGUpKSkpJiYobi5wcmVjaXNpb249cy0obi50eXBlPT09ImUiKSk7YnJlYWt9Y2FzZSJmIjpjYXNlIiUiOntuLnByZWNpc2lvbj09bnVsbCYmIWlzTmFOKHM9TkEoaSkpJiYobi5wcmVjaXNpb249cy0obi50eXBlPT09IiUiKSoyKTticmVha319cmV0dXJuIHEwKG4pfWZ1bmN0aW9uIHpBKHIpe3ZhciBlPXIuZG9tYWluO3JldHVybiByLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuPWUoKTtyZXR1cm4gRjEoblswXSxuW24ubGVuZ3RoLTFdLHQ9PW51bGw/MTA6dCl9LHIudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3ZhciBpPWUoKTtyZXR1cm4gQkEoaVswXSxpW2kubGVuZ3RoLTFdLHQ9PW51bGw/MTA6dCxuKX0sci5uaWNlPWZ1bmN0aW9uKHQpe3Q9PW51bGwmJih0PTEwKTt2YXIgbj1lKCksaT0wLHM9bi5sZW5ndGgtMSxhPW5baV0sbz1uW3NdLGwsYyxoPTEwO2ZvcihvPGEmJihjPWEsYT1vLG89YyxjPWksaT1zLHM9Yyk7aC0tID4wOyl7aWYoYz1idShhLG8sdCksYz09PWwpcmV0dXJuIG5baV09YSxuW3NdPW8sZShuKTtpZihjPjApYT1NYXRoLmZsb29yKGEvYykqYyxvPU1hdGguY2VpbChvL2MpKmM7ZWxzZSBpZihjPDApYT1NYXRoLmNlaWwoYSpjKS9jLG89TWF0aC5mbG9vcihvKmMpL2M7ZWxzZSBicmVhaztsPWN9cmV0dXJuIHJ9LHJ9ZnVuY3Rpb24geGYoKXt2YXIgcj1BQSgpO3JldHVybiByLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gd0Eocix4ZigpKX0sWUUuYXBwbHkocixhcmd1bWVudHMpLHpBKHIpfWZ1bmN0aW9uIGtBKHIsZSl7cmV0dXJuIHIubWFwKHQ9Pntjb25zdCBuPVtdO2xldCBpO3JldHVybiB0LmZvckVhY2gocz0+e2lmKGkpe2NvbnN0IGE9bHMocyxpKSoxODAvTWF0aC5QSTtpZihhPmUpe2NvbnN0IG89eXcoaSxzKSxsPTEvTWF0aC5jZWlsKGEvZSk7bGV0IGM9bDtmb3IoO2M8MTspbi5wdXNoKG8oYykpLGMrPWx9fW4ucHVzaChpPXMpfSksbn0pfWZ1bmN0aW9uIEdBKHIse21pbkxuZzplLG1heExuZzp0LG1pbkxhdDpuLG1heExhdDppfT17fSl7Y29uc3Qgcz1NYXRoLnJvdW5kKHhzKDM2MC9yLDIpL01hdGguUEkpLGE9KDErTWF0aC5zcXJ0KDUpKS8yLG89ZD0+ZC9hKjM2MCUzNjAtMTgwLGw9ZD0+TWF0aC5hY29zKDIqZC9zLTEpL01hdGguUEkqMTgwLTkwLGM9ZD0+cyooTWF0aC5jb3MoKGQrOTApKk1hdGguUEkvMTgwKSsxKS8yLGg9W2khPT12b2lkIDA/TWF0aC5jZWlsKGMoaSkpOjAsbiE9PXZvaWQgMD9NYXRoLmZsb29yKGMobikpOnMtMV0sdT1lPT09dm9pZCAwJiZ0PT09dm9pZCAwPygpPT4hMDplPT09dm9pZCAwP2Q9PmQ8PXQ6dD09PXZvaWQgMD9kPT5kPj1lOnQ+PWU/ZD0+ZD49ZSYmZDw9dDpkPT5kPj1lfHxkPD10LGY9W107Zm9yKGxldCBkPWhbMF07ZDw9aFsxXTtkKyspe2NvbnN0IHA9byhkKTt1KHApJiZmLnB1c2goW3AsbChkKV0pfXJldHVybiBmfWZ1bmN0aW9uIHlmKHIsZSx0PSExKXtyZXR1cm4gdD94dyhlLHIpOk1FKHIsZSl9ZnVuY3Rpb24gVkEocixlKXtjb25zdCB0PXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpyfSxbW24saV0sW3MsYV1dPVJnKHQpO2lmKE1hdGgubWluKE1hdGguYWJzKHMtbiksTWF0aC5hYnMoYS1pKSk8ZSlyZXR1cm5bXTtjb25zdCBvPW4+c3x8YT49ODl8fGk8PS04OTtyZXR1cm4gR0EoZSx7bWluTG5nOm4sbWF4TG5nOnMsbWluTGF0OmksbWF4TGF0OmF9KS5maWx0ZXIobD0+eWYobCx0LG8pKX1mdW5jdGlvbiBIQShyLHtyZXNvbHV0aW9uOmU9MS8wfT17fSl7Y29uc3QgdD1rQShyLGUpLG49Z2EodCksaT1WQShyLGUpLHM9Wy4uLm4sLi4uaV0sYT17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6cn0sW1tvLGxdLFtjLGhdXT1SZyhhKSx1PW8+Y3x8aD49ODl8fGw8PS04OTtsZXQgZj1bXTtpZih1KXtjb25zdCBtPSRFKHMpLnRyaWFuZ2xlcygpLHk9bmV3IE1hcChzLm1hcCgoW3gsdl0sUyk9PltgJHt4fS0ke3Z9YCxTXSkpO20uZmVhdHVyZXMuZm9yRWFjaCh4PT57Y29uc3Qgdj14Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLnNsaWNlKDAsMykucmV2ZXJzZSgpLFM9W107aWYodi5mb3JFYWNoKChbYixBXSk9Pntjb25zdCBMPWAke2J9LSR7QX1gO3kuaGFzKEwpJiZTLnB1c2goeS5nZXQoTCkpfSksUy5sZW5ndGg9PT0zKXtpZihTLnNvbWUoYj0+YjxuLmxlbmd0aCkpe2NvbnN0IGI9eC5wcm9wZXJ0aWVzLmNpcmN1bWNlbnRlcjtpZigheWYoYixhLHUpKXJldHVybn1mLnB1c2goLi4uUyl9fSl9ZWxzZSBpZihpLmxlbmd0aCl7Y29uc3QgbT1BYS5mcm9tKHMpO2ZvcihsZXQgeT0wLHg9bS50cmlhbmdsZXMubGVuZ3RoO3k8eDt5Kz0zKXtjb25zdCB2PVsyLDEsMF0ubWFwKGI9Pm0udHJpYW5nbGVzW3krYl0pLFM9di5tYXAoYj0+c1tiXSk7aWYodi5zb21lKGI9PmI8bi5sZW5ndGgpKXtjb25zdCBiPVswLDFdLm1hcChBPT5CMShTLEw9PkxbQV0pKTtpZigheWYoYixhLHUpKWNvbnRpbnVlfWYucHVzaCguLi52KX19ZWxzZXtjb25zdHt2ZXJ0aWNlczptLGhvbGVzOnk9W119PWhzLmZsYXR0ZW4odCk7Zj1ocyhtLHksMil9Y29uc3QgZD14ZihtbChzLG09Pm1bMF0pLFswLDFdKSxwPXhmKG1sKHMsbT0+bVsxXSksWzAsMV0pLF89cy5tYXAoKFttLHldKT0+W2QobSkscCh5KV0pO3JldHVybntjb250b3VyOnQsdHJpYW5nbGVzOntwb2ludHM6cyxpbmRpY2VzOmYsdXZzOl99fX1jb25zdCBZMD1uZXcga2UoKS5zZXRBdHRyaWJ1dGU/InNldEF0dHJpYnV0ZSI6ImFkZEF0dHJpYnV0ZSI7ZnVuY3Rpb24gcmMocixlLHQ9ITApe2NvbnN0IG49ci5tYXAoaT0+aS5tYXAoKFtzLGFdKT0+dD9FMShzLGEsZSk6W3MsYSxlXSkpO3JldHVybiBocy5mbGF0dGVuKG4pfWZ1bmN0aW9uIFdBKHIsZSx0LG49ITApe2NvbnN0e3ZlcnRpY2VzOmksaG9sZXM6c309cmMocixlLG4pLHt2ZXJ0aWNlczphfT1yYyhyLHQsbiksbz1nYShbYSxpXSksbD1NYXRoLnJvdW5kKGEubGVuZ3RoLzMpLGM9bmV3IFNldChzKTtsZXQgaD0wO2NvbnN0IHU9W107Zm9yKGxldCBkPTA7ZDxsO2QrKyl7bGV0IHA9ZCsxO2lmKHA9PT1sKXA9aDtlbHNlIGlmKGMuaGFzKHApKXtjb25zdCBfPXA7cD1oLGg9X311LnB1c2goZCxkK2wscCtsKSx1LnB1c2gocCtsLHAsZCl9Y29uc3QgZj1bXTtmb3IobGV0IGQ9MTtkPj0wO2QtLSlmb3IobGV0IHA9MDtwPGw7cCs9MSlmLnB1c2gocC8obC0xKSxkKTtyZXR1cm57aW5kaWNlczp1LHZlcnRpY2VzOm8sdXZzOmYsdG9wVmVydHM6YX19ZnVuY3Rpb24gWjAocixlLHQsbj0hMCxpPSEwKXtyZXR1cm57aW5kaWNlczpuP3IuaW5kaWNlczpyLmluZGljZXMuc2xpY2UoKS5yZXZlcnNlKCksdmVydGljZXM6cmMoW3IucG9pbnRzXSxlLGkpLnZlcnRpY2VzLHV2czp0fX1jb25zdCBKMD0oe3BvbHlnb25HZW9Kc29uOnIsc3RhcnRIZWlnaHQ6ZSxlbmRIZWlnaHQ6dCxjdXJ2YXR1cmVSZXNvbHV0aW9uOm49MSxjYXJ0ZXNpYW46aT0hMCxoYXNTaWRlOnM9ITAsaGFzQm90dG9tOmE9ITEsaGFzVG9wOm89ITF9KT0+e3IuZm9yRWFjaChfPT57bEUoXyl8fF8ucmV2ZXJzZSgpfSk7Y29uc3R7Y29udG91cjpsLHRyaWFuZ2xlczpjfT1IQShyLHtyZXNvbHV0aW9uOm59KTtsZXQgaD17fSx1O3MmJihoPVdBKGwsZSE9bnVsbD9lOnQsdCE9bnVsbD90OmUsaSksdT1oLnRvcFZlcnRzKTtsZXQgZj1bXTsoYXx8bykmJihmPWdhKGMudXZzKSk7bGV0IGQ9e307YSYmKGQ9WjAoYyxlLGYsITEsaSkpO2xldCBwPXt9O3JldHVybiBvJiYocD1aMChjLHQsZiwhMCxpKSkse2NvbnRvdXI6bCx0cmlhbmdsZXM6YyxzaWRlVG9yc286aCxib3R0b21DYXA6ZCx0b3BDYXA6cCx0b3BWZXJ0czp1fX07Y2xhc3MgWEEgZXh0ZW5kcyBrZXtjb25zdHJ1Y3RvcihlLHQ9e30pe3N1cGVyKCksdGhpcy50eXBlPSJQb2x5Z29uQnVmZmVyR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz12cih7cG9seWdvbkdlb0pzb246ZSxzdGFydEhlaWdodDowLGVuZEhlaWdodDoxLGhhc1RvcDohMCxoYXNCb3R0b206ITAsaGFzU2lkZTohMCxjdXJ2YXR1cmVSZXNvbHV0aW9uOjEsY2FydGVzaWFuOiEwLHVzZXJEYXRhUnNvT2Zmc2V0OjB9LHQpO2NvbnN0e2VuZEhlaWdodDpuLGhhc1RvcDppLGhhc0JvdHRvbTpzLGhhc1NpZGU6YSxjYXJ0ZXNpYW46byx1c2VyRGF0YVJzb09mZnNldDpsfT10aGlzLnBhcmFtZXRlcnMse2NvbnRvdXI6YyxzaWRlVG9yc286aCx0b3BWZXJ0czp1LGJvdHRvbUNhcDpmLHRvcENhcDpkfT1KMCh2cih7fSx0aGlzLnBhcmFtZXRlcnMpKTtsZXQgcD1bXSxfPVtdLGc9W10sbT0wO2NvbnN0IHk9eD0+e2NvbnN0IHY9TWF0aC5yb3VuZChwLmxlbmd0aC8zKSxTPWcubGVuZ3RoO3A9cC5jb25jYXQoeC52ZXJ0aWNlcyksXz1fLmNvbmNhdCh4LnV2cyksZz1nLmNvbmNhdCh2P3guaW5kaWNlcy5tYXAoYj0+Yit2KTp4LmluZGljZXMpLHRoaXMuYWRkR3JvdXAoUyxnLmxlbmd0aC1TLG0rKyl9O2EmJih5KGgpLHRoaXMudXNlckRhdGEudG9wVmVydHM9bD9yYyhjLG4rbCxvKS52ZXJ0aWNlczp1KSxzJiZ5KGYpLGkmJnkoZCksdGhpcy5zZXRJbmRleChnKSx0aGlzW1kwXSgicG9zaXRpb24iLG5ldyBTZShwLDMpKSx0aGlzW1kwXSgidXYiLG5ldyBTZShfLDIpKSx0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl9fXZhciBxQT1yPT57Y29uc3Qgbz1yLHtjb29yZGluYXRlOmUsc3RhcnRIZWlnaHQ6dCxoZWlnaHQ6bn09byxpPWFfKG8sWyJjb29yZGluYXRlIiwic3RhcnRIZWlnaHQiLCJoZWlnaHQiXSk7bGV0IHM9dHx8MDtyZXR1cm4gdHlwZW9mIHQhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbiE9InVuZGVmaW5lZCImJihzPXQrbiksbmV3IFhBKFtlXSx3Zih2cih7fSxpKSx7c3RhcnRIZWlnaHQ6dCxlbmRIZWlnaHQ6c30pKX07VDEoe2V4dHJ1ZGVQb2x5Z29uOnp3LGxpbmU6VncsY29uaWNQb2x5Z29uOih7Y29vcmRpbmF0ZXNBcnI6cixzdGFydDplLGhlaWdodDp0LHVzZUdyb3VwczpuLGhhc1RvcDppLGhhc0JvdHRvbTpzLGhhc1NpZGU6YX0pPT57Y29uc3Qgbz1yLm1hcCgobCxjKT0+e3ZhciBoLHU7cmV0dXJuIHFBKHtjb29yZGluYXRlOmwsc3RhcnRIZWlnaHQ6KGg9ZVtjXSkhPW51bGw/aDplWzBdLGhlaWdodDoodT10W2NdKSE9bnVsbD91OnRbMF0saGFzVG9wOmkhPW51bGw/aTohMCxoYXNCb3R0b206cyE9bnVsbD9zOiEwLGhhc1NpZGU6YSE9bnVsbD9hOiEwfSl9KTtyZXR1cm4gR2wobyxuKX0sY29uaWNMaW5lOih7Y29vcmRpbmF0ZXNBcnI6cixsaW5lV2lkdGg6ZSxzdGFydDp0LHVzZUdyb3VwczpufSk9Pntjb25zdCBzPXIubWFwKChhLG8pPT57dmFyIGw7cmV0dXJuIEowKHtwb2x5Z29uR2VvSnNvbjpbYV0sc3RhcnRIZWlnaHQ6KGw9dFtvXSkhPW51bGw/bDp0WzBdfSkudG9wVmVydHN9KS5tYXAoKGEsbyk9Pnt2YXIgYztjb25zdCBsPShjPWVbb10pIT1udWxsP2M6ZVswXTtyZXR1cm4gbDAoe25vZGVzOmEsc2V0UG9pbnRXaWR0aDooKT0+bH0pfSk7cmV0dXJuIEdsKHMsbil9fSl9KSgpOwo=",B=typeof window!="undefined"&&window.Blob&&new Blob([atob(t)],{type:"text/javascript;charset=utf-8"});function dl(){const X=B&&(window.URL||window.webkitURL).createObjectURL(B);try{return X?new Worker(X):new Worker("data:application/javascript;base64,"+t)}finally{X&&(window.URL||window.webkitURL).revokeObjectURL(X)}}const Q=X=>{const l=new h.BufferGeometry;return Object.keys(X).forEach(Z=>{Z==="groups"?X[Z].forEach(b=>{l.addGroup(b.start,b.count,b.materialIndex)}):Z==="index"?l.setIndex(new h.BufferAttribute(X[Z].array,X[Z].itemSize)):l.setAttribute(Z,new h.BufferAttribute(X[Z].array,X[Z].itemSize))}),l},Gl=(X,l)=>{const Z=X[0][0]===-999&&X[0][1]===-999;let b=null;if(Z&&(X.shift(),l)){const G=l.center(),d=l.rotate();d[0]&&(b=l([180-d[0]+G[0],0]))}return X.map(([G,d])=>{let W;if(l){const[m,c]=l([G,d]);W=new h.Vector2(m,-c)}else W=new h.Vector2(G,d);return b&&W.x<0&&(W.x+=Math.abs(b[0])*2),W})};function Xl(X,l,Z){let b=X==null?0:X.length;if(!b)return[];l=l==null?0:l,Z=Z===void 0?b:Z,l<0&&(l=-l>b?0:b+l),Z=Z>b?b:Z,Z<0&&(Z+=b),b=l>Z?0:Z-l>>>0,l>>>=0;let G=-1;const d=new Array(b);for(;++G<b;)d[G]=X[G+l];return d}function Wl(X,l){const Z=X==null?0:X.length,b=Math.ceil(Z/l);if(!Z)return[];let G=0,d=0;const W=new Array(l);for(;G<Z;)W[d++]=Xl(X,G,G+=b);return W}class ml{constructor(l){this.bufferGeometryLoader=new h.BufferGeometryLoader,this.options=L({cacheVersion:"1"},l)}install(l){this.pencil=l;const Z=new K.WorkerPool(dl,{maxWorkers:this.options.maxWorkers});this.pool=Z}geoGeometry(l,Z){return Y(this,null,function*(){const{mesaage:b,cacheKey:G,cacheVersion:d,maxWorkers:W,json:m,cb:c,center:V}=L(L({},this.options),Z),{coordinatesArr:p,depth:a,start:R,lineWidth:x,height:S}=b,C=yield this.getCachedGeometry({cacheKey:G,cacheVersion:d,cb:c});if(C)return C;const u=yield this.getFileGeometry({json:m,cb:c});if(u)return u;const y=this.pool,o=p.map((N,s)=>({coordinatesArr:N,depth:a&&(a[s]||a[0]),start:R&&(R[s]||R[0]),lineWidth:x&&(x[s]||x[0]),height:S&&(S[s]||S[0])})),z=W||y.maxWorkers,w=z===1||o.length<z?[o]:Wl(o,z).filter(N=>N.length),U=[],J={x:0,y:0,z:0};if(b.projection&&V){const N=f.getProjection(L({},b.projection)),[s]=Gl([V],N);J.x=s.x,J.y=s.y}const j=yield Promise.all(w.map((N,s)=>Y(this,null,function*(){const n=yield y.exec(l,[L(L(L({},b),b.projection&&V?{projection:k(L({},b.projection),{center:V})}:{}),N)]);U.push(n);const H=Q(n);return H.userData.position=J,c&&(yield c(H)),H})));return G&&I.set(G,{[d]:{attributesArr:U,position:J}}),j})}getCachedGeometry(l){return Y(this,null,function*(){const{cacheKey:Z,cb:b,cacheVersion:G}=l;if(Z){const d=yield I.get(Z),W=G||this.options.cacheVersion;if(d!=null&&d[W]){const{attributesArr:m,position:c}=d[W];return yield Promise.all(m.map(V=>Y(this,null,function*(){const p=Q(V);return p.userData.position=c,b&&(yield b(p)),p})))}else return!1}else return!1})}getFileGeometry(l){return Y(this,null,function*(){const{json:Z,cb:b}=l;if(Z){const G=this.bufferGeometryLoader.parse(Z.bufferGeometry);return G.userData.position=Z.position,b&&(yield b(G)),[G]}else return!1})}dispose(){this.pool.dispose()}}class cl{constructor(){this.chunks=[]}install(l){this.pencil=l,this.canvas=l.renderer.domElement}init({frameRequestRate:l=60}={}){const Z=this.canvas.captureStream(l),b=new MediaRecorder(Z,{mimeType:"video/webm; codecs=vp9"});this.mediaRecorder=b,b.ondataavailable=G=>{this.chunks.push(G.data)},b.onstop=()=>{this.handleStop()}}handleStop(){const l=new Blob(this.chunks,{type:"video/webm"}),Z=URL.createObjectURL(l),b=document.createElement("a");b.style.display="none",b.href=Z,b.download="video.webm",document.body.appendChild(b),b.click(),setTimeout(()=>{URL.revokeObjectURL(Z),document.body.removeChild(b)},0)}start(l){this.mediaRecorder.start(l)}stop(){this.mediaRecorder.stop()}dispose(){this.chunks=[]}}class Vl extends h.Loader{constructor(l){super(l)}load(l,Z,b,G){const d=document.createElement("video");d.preload="auto",d.autoplay=!1,d.loop=!1,d.muted=!0,d.setAttribute("webkit-playsinline","webkit-playsinline"),d.setAttribute("playsinline","");const W=new h.VideoTexture(d),m=new h.FileLoader(this.manager);return m.setCrossOrigin(this.crossOrigin),m.setPath(this.path),m.setResponseType("blob"),m.load(l,c=>{const V=window.URL.createObjectURL(c);d.src=V,W.needsUpdate=!0,Z!==void 0&&Z(W)},b,G),W}loadAsync(l,Z){return new Promise((b,G)=>{this.load(l,b,Z,G)})}}class hl extends h.Loader{constructor(l){super(l)}load(l,Z,b,G){const d=new h.Texture,W=document.createElement("img"),m=new h.FileLoader(this.manager);return m.setCrossOrigin(this.crossOrigin),m.setPath(this.path),m.setResponseType("blob"),m.load(l,c=>{const V=window.URL.createObjectURL(c);W.src=V,d.image=W,d.needsUpdate=!0,Z!==void 0&&Z(d)},b,G),d}loadAsync(l,Z){return new Promise((b,G)=>{this.load(l,b,Z,G)})}}class pl extends h.Loader{constructor(l){super(l),this.saveObject=[]}load(l,Z,b,G){let d=[];const W=l;return W.forEach(m=>{this.path!==void 0&&(m.src=this.path+m.src),m.src=this.manager.resolveURL(m.src)}),I.getMany(W.map(m=>m.src)).then(m=>{d=m.map((c,V)=>{const p=W[V].cacheVersion||"1";return c&&c[p]}),Z!==void 0&&Z(d)}),d}loadAsync(l,Z){const b=l;return new Promise((G,d)=>{this.load(b,G,Z,d)})}save(){if(this.saveObject.length===0)return;this.saveObject.forEach(Z=>{this.path!==void 0&&(Z.src=this.path+Z.src),Z.src=this.manager.resolveURL(Z.src)});const l=this.saveObject.map((Z,b)=>[Z.src,{[Z.cacheVersion||"1"]:Z.data}]);I.setMany(l)}dispose(){this.saveObject=[]}}const ul={images:["png","jpg","jpeg","ico","webp","avif"],media:["mp4","webm","ogg"],gltf:["gltf","glb"],json:["json","geojson"],exr:["exr"]};class Yl{constructor(){this.itemsLoaded=0,this.itemsTotal=0,this.loadObjOrigin={images:[],media:[],gltf:[],json:[],exr:[]},this.loadObj={images:[],media:[],gltf:[],json:[],exr:[]},this.delLoadObj={},this.assets={images:new Map,media:new Map,gltf:new Map,json:new Map,exr:new Map},this.event=new r.eventsExports.EventEmitter,this.end=!1}get allStarted(){return this.assetsLength&&Object.values(this.loadObj).flat().every(l=>l.progress.loaded)}get lengthComputable(){return Object.values(this.loadObj).flat().every(l=>l.progress.lengthComputable)}get loaded(){return this.lengthComputable?Object.values(this.loadObj).flat().reduce((l,Z)=>l+Z.progress.loaded,0):this.itemsLoaded}get total(){return this.lengthComputable?Object.values(this.loadObj).flat().reduce((l,Z)=>l+Z.progress.total,0):this.itemsTotal}get assetsLength(){return Object.values(this.loadObj).flat().length}emit(l,...Z){this.event.emit(l,...Z)}on(l,Z){this.event.on(l,Z)}getAsset(l){this.prefix&&(l=this.prefix+l);const Z=this.getAssetType(l);if(!Z)return;const b=this.assets[Z].get(l);return!b&&(Z==="images"||Z==="media")?new h.Texture:b}getAssetType(l){var b;const Z=(b=l.split(".").pop())==null?void 0:b.toLowerCase();if(Z){for(const[G,d]of Object.entries(ul))if(d.includes(Z))return G}}install(l){this.pencil=l,this.colorCorrection(),this.setAnisotropy("max")}initLoadingManager(){var l,Z,b,G,d;this.loadingManager=new h.LoadingManager,this.cacheLoader=new pl(this.loadingManager),this.fileLoader=new h.FileLoader(this.loadingManager),this.fileLoader.setResponseType("blob"),((l=this.loadObj.images)==null?void 0:l.length)>0&&(this.textureLoader=new hl(this.loadingManager)),((Z=this.loadObj.media)==null?void 0:Z.length)>0&&(this.videoTextureLoader=new Vl(this.loadingManager)),((b=this.loadObj.gltf)==null?void 0:b.length)>0&&(this.gltfLoader=new M.GLTFLoader(this.loadingManager)),((G=this.loadObj.json)==null?void 0:G.length)>0&&(this.jsonLoader=new h.FileLoader(this.loadingManager),this.jsonLoader.setResponseType("json")),this.dracoPath&&(this.dracoGltfLoader=new M.GLTFLoader(this.loadingManager),this.dracoLoader=new q.DRACOLoader,this.dracoLoader.setDecoderPath(this.dracoPath),this.dracoGltfLoader.setDRACOLoader(this.dracoLoader)),((d=this.loadObj.exr)==null?void 0:d.length)>0&&(this.EXRLoader=new $.EXRLoader(this.loadingManager)),this.loadingManager.onProgress=(W,m,c)=>{this.itemsLoaded=m,this.itemsTotal=c,m===c&&this.onprogress()},this.loadingManager.onError=W=>{console.log("There was an error loading "+W),this.pm.reject(W)}}add(l,Z){typeof l=="string"&&(l=[l]);const{dracoPath:b}=Z||{};b&&(this.dracoPath=b),l.forEach(G=>{const d={src:G,progress:{loaded:0,total:0,lengthComputable:!1},cacheVersion:Z==null?void 0:Z.cacheVersion,draco:!!(Z!=null&&Z.dracoPath)},W=this.getAssetType(G);W&&(this.loadObjOrigin[W]||(this.loadObjOrigin[W]=[]),this.loadObjOrigin[W].push(d))})}setDel(l,Z){this.delLoadObj[l]=Z}getSrcByAsset(l){let Z;return Object.values(this.assets).some(b=>(b.forEach((G,d)=>{G===l&&(Z=d,this.prefix&&(Z=Z==null?void 0:Z.replace(this.prefix,"")))}),!!Z)),Z}colorCorrection(){(+h.REVISION<152&&this.pencil.options.renderer.outputEncoding===F.TextureEncoding.sRGB||+h.REVISION>=152&&this.pencil.options.renderer.outputColorSpace===F.ColorSpace.sRGB)&&(this.assets.images.forEach(l=>{F.colorCorrection({texture:l})}),this.assets.media.forEach(l=>{F.colorCorrection({texture:l})}),this.assets.exr.forEach(l=>{F.colorCorrection({texture:l})}))}setAnisotropy(l){l==="max"&&(l=this.pencil.renderer.capabilities.getMaxAnisotropy()),this.assets.images.forEach(Z=>{Z.anisotropy=l}),this.assets.media.forEach(Z=>{Z.anisotropy=l}),this.assets.exr.forEach(Z=>{Z.anisotropy=l})}onprogress(){this.allStarted&&!this.end&&(this.emit("progress",this.loaded,this.total),this.loaded===this.total&&(this.cacheLoader.save(),this.pm.resolve(),this.end=!0))}load(){return Y(this,arguments,function*({prefix:l}={}){var Z,b;return this.loadObj=JSON.parse(JSON.stringify(this.loadObjOrigin)),Object.keys(this.delLoadObj).forEach(G=>{if(this.delLoadObj[G]){const d=this.getAssetType(G);d&&(this.loadObj[d]=this.loadObj[d].filter(W=>W.src!==G))}}),l&&(this.prefix=l,Object.values(this.loadObj).flat().forEach(G=>{G.src=l+G.src})),this.pm=K.makePromiseCreator(!0),this.assetsLength===0?(this.emit("progress",0,0),this.pm.resolve(),this.pm.promise):(this.initLoadingManager(),yield this.checkCache(),this.loadAssets(this.loadObj.json,this.assets.json,this.jsonLoader),this.loadAssets(this.loadObj.images,this.assets.images,this.textureLoader),this.loadAssets(this.loadObj.media,this.assets.media,this.videoTextureLoader),this.loadAssets(this.loadObj.exr,this.assets.exr,this.EXRLoader),this.loadAssets((Z=this.loadObj.gltf)==null?void 0:Z.filter(G=>!G.draco),this.assets.gltf,this.gltfLoader),this.loadAssets((b=this.loadObj.gltf)==null?void 0:b.filter(G=>G.draco),this.assets.gltf,this.dracoGltfLoader),this.pm.promise)})}checkCache(){return Y(this,null,function*(){const l=Object.values(this.loadObj).flat().filter(Z=>Z.cacheVersion);l.length>0&&this.cacheLoader&&(yield this.cacheLoader.loadAsync(l)).forEach((b,G)=>{b&&(l[G].cacheData=b)})})}loadAssets(l,Z,b){if(!b||!l)return;const G=b instanceof h.FileLoader&&b.responseType==="json";l.forEach(d=>Y(this,null,function*(){const W=V=>{const p=V.loadedR||.95;d.progress.loaded=V.loaded?V.loaded*p:V.loaded,d.progress.total=V.total,d.progress.lengthComputable=V.lengthComputable},m=()=>{d.progress.total?d.progress.loaded=d.progress.total:W({loaded:1,total:1,loadedR:1,lengthComputable:!1}),this.onprogress()};if(d.cacheData)if(G){W({loaded:1,total:1,lengthComputable:!0}),Z.set(d.src,d.cacheData),m();return}else{const V=window.URL.createObjectURL(d.cacheData),p=yield b.loadAsync(V,W);Z.set(d.src,p),window.URL.revokeObjectURL(V),m();return}if(d.cacheVersion&&!G){const V=yield this.fileLoader.loadAsync(d.src,W),p=window.URL.createObjectURL(V),a=yield b.loadAsync(p);Z.set(d.src,a),this.cacheLoader.saveObject.push({src:d.src,data:V,cacheVersion:d.cacheVersion}),window.URL.revokeObjectURL(p),m();return}const c=yield b.loadAsync(d.src,W);Z.set(d.src,c),d.cacheVersion&&this.cacheLoader.saveObject.push({src:d.src,data:c,cacheVersion:d.cacheVersion}),m()}))}clearLoadObj(){Object.values(this.loadObjOrigin).forEach(l=>{l.length=0})}dispose(){var l,Z,b;Object.values(this.assets).forEach(G=>{G.clear()}),(l=this.dracoLoader)==null||l.dispose(),(Z=this.cacheLoader)==null||Z.dispose(),this.event.removeAllListeners(),this.delLoadObj={},(b=this.pm)==null||b.reject(),this.end=!1}}exports.Cache=ll;exports.CanvasStream=cl;exports.Data=bl;exports.Draw=Zl;exports.Loader=Yl;exports.Wk=ml;
1
+ "use strict";var j=Object.defineProperty,P=Object.defineProperties;var v=Object.getOwnPropertyDescriptors;var n=Object.getOwnPropertySymbols;var E=Object.prototype.hasOwnProperty,e=Object.prototype.propertyIsEnumerable;var g=(X,l,Z)=>l in X?j(X,l,{enumerable:!0,configurable:!0,writable:!0,value:Z}):X[l]=Z,L=(X,l)=>{for(var Z in l||(l={}))E.call(l,Z)&&g(X,Z,l[Z]);if(n)for(var Z of n(l))e.call(l,Z)&&g(X,Z,l[Z]);return X},H=(X,l)=>P(X,v(l));var R=(X,l,Z)=>new Promise((b,G)=>{var d=c=>{try{m(Z.next(c))}catch(V){G(V)}},W=c=>{try{m(Z.throw(c))}catch(V){G(V)}},m=c=>c.done?b(c.value):Promise.resolve(c.value).then(d,W);m((Z=Z.apply(X,l)).next())});Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const K=require("esus-lite"),T=require("../BaseObject.js"),D=require("../index2.js"),I=require("idb-keyval"),A=require("three"),O=require("../getProjection.js"),f=require("../events.js"),i=require("three/examples/jsm/loaders/GLTFLoader"),r=require("three/examples/jsm/loaders/DRACOLoader"),q=require("three/examples/jsm/loaders/EXRLoader"),F=require("../colorCorrection.js");require("three/examples/jsm/renderers/CSS2DRenderer");require("three/examples/jsm/renderers/CSS3DRenderer");require("../disposeMesh.js");require("d3-geo");function $(X){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(X){for(const Z in X)if(Z!=="default"){const b=Object.getOwnPropertyDescriptor(X,Z);Object.defineProperty(l,Z,b.get?b:{enumerable:!0,get:()=>X[Z]})}}return l.default=X,Object.freeze(l)}const h=$(A);class _{constructor(){this.cache=new Map}install(){}init(l){const Z=K.makePromiseCreator();this.cache.set(l,Z)}get(l,Z){return R(this,null,function*(){if(!this.cache.get(l)&&Z){this.init(l);const b=yield Z();this.set(l,b)}if(this.cache.get(l))return yield this.cache.get(l).promise})}set(l,Z){const b=this.cache.get(l);b?b.resolve(Z):console.warn("init cache first")}dispose(){this.cache.forEach((l,Z)=>{l.reject(`stop set cache:${Z}`)}),this.cache.clear()}}class ll{constructor(l){this.nodeGroupVisible=!0,this.objectNamesToFactories=new Map,this.objects=new Map,this.objects_=l}get objectsPromise(){const l=[];return this.objects.forEach(Z=>{l.push(Z.pm.promise)}),l}install(l){this.pencil=l,this.initObjectFactories()}initObjectFactories(){const{objects_:l}=this;Object.keys(l).forEach(Z=>{const b=class{create(d={}){return new l[Z](d)}};this.objectNamesToFactories.set(Z,b)}),this.objectNamesToFactories.set("@Group",class{create(){return new D.Group}})}getObject(l,Z){l.includes("#")&&console.warn("getObject:err:不支持 #",l);const{key:b}=Z||{},G=`${l}${b?`#${b}`:""}`;return this.objects.get(G)}getAllObject(l,Z){l.includes("#")&&console.warn("getAllObject:err:不支持 #",l);const{key:b}=Z||{},G=`${l}${b?`#${b}`:""}`,d=[];return this.objects.forEach((W,m)=>{(m.startsWith(`${G}#`)||m===G)&&d.push(W)}),d}instantiate(b){return R(this,arguments,function*(l,{create:Z}={}){const{objectType:G,objectOptions:d}=l,[,W]=G.split("#"),m=yield this.draw(W,H(L({},d||{}),{create:Z,prefab:!1}));return m.setMaterialList("instantiate","clone"),m.useMaterial("instantiate"),m})}initGroup(){return R(this,null,function*(){this.group||(this.group=yield this.draw("@Group",{target:this.pencil.scene})),this.prefabGroup||(this.prefabGroup=yield this.draw("@Group",{key:"Prefab",target:this.pencil.scene}),this.prefabGroup.hide())})}draw(l,Z,b){return R(this,null,function*(){var d,W,m,c,V;const G=this.objectNamesToFactories.get(l);if(G){Z||(Z={}),Z.target=(d=Z.target)!=null?d:b;const{key:p}=Z;let a=`${l}${p?`#${p}`:""}`;this.objects.has(a)&&(a+=`#${K.generateUUID()}`);const Y=Z.target,C=(W=Z.onTop)!=null?W:0,S=(m=Z.prefab)!=null?m:!1,N=(c=Z.create)!=null?c:!0,u=new G().create(Z);let y;return Y===null?y=null:typeof Y=="string"?y=this.objects.get(Y):(V=Y==null?void 0:Y.objectType)!=null&&V.startsWith("BaseObject")||Y?y=Y:S&&this.prefabGroup?y=this.prefabGroup:!S&&this.group?y=this.group:y=this.pencil.scene,N===!1?u.create=()=>{}:N!==!0&&(u.create=()=>{N(u)}),u.pencil=this.pencil,u.drawController=this,u.key=a,u.prefab=S,u.objectType=`BaseObject#${l}`,u.objectOptions=Z,this.objects.set(a,u),yield this.addBaseObject(u,y,C),u}throw new Error(`Unrecognized:${l}`)})}addBaseObject(l,Z,b){return R(this,null,function*(){yield l.create();const G=l.objectType==="BaseObject#Node";l.object3d&&(T.objMap.set(l.object3d,l),b&&l.setTop(b),Z!==null&&Z.add(l.object3d)),G&&(l.drawGroupShow=this.nodeGroupVisible),l.render(),l.pm.resolve()})}erase(...l){[...l].forEach(Z=>{const b=[];if(typeof Z=="string"){const[G,d]=Z.split("#");b.push(...this.getAllObject(G,{key:d}))}else b.push(Z);b.forEach(G=>{this.removeBaseObject(G)})})}removeBaseObject(l){const{parent:Z}=l;l.object3d&&Z&&Z.remove(l.object3d),l.traverse(b=>{b.dispose(),this.objects.delete(b.key),b.object3d&&T.objMap.delete(b.object3d)})}update(l,Z){this.objects.forEach(b=>{b.update(l,Z)})}setSize(l,Z){this.objects.forEach(b=>{b.resize(l,Z)})}setNodeGroupVisible(l){this.nodeGroupVisible!==l&&(this.nodeGroupVisible=l,this.objects.forEach(Z=>{if(Z.key.startsWith("Node")){const b=Z;b.drawGroupShow=l,b.checkVisible()}}))}show(){var l;(l=this.group)==null||l.show(),this.setNodeGroupVisible(!0)}hide(){var l;(l=this.group)==null||l.hide(),this.setNodeGroupVisible(!1)}showPrefab(l){var Z;this.hide(),(Z=this.prefabGroup)==null||Z.show(),this.objects.forEach(b=>{b.prefab&&(b.key===l?b.show():b.hide())})}hidePrefab(){var l;this.show(),(l=this.prefabGroup)==null||l.hide(),this.objects.forEach(Z=>{Z.prefab&&Z.show()})}eraseAll(){this.group&&(this.objects.forEach(l=>{l.key.startsWith("Node")&&this.erase(l)}),this.erase(this.group))}dispose(){this.objects.forEach((l,Z)=>{l.dispose(),l.pm.reject(`stop draw:${Z}`)}),this.objects.clear(),this.objectNamesToFactories.clear(),this.group=void 0,this.prefabGroup=void 0}}class Zl{constructor(){this.data={}}install(){}setData(l,Z){var b;this.data[l]=Z,(b=this.cb)==null||b.call(this,l)}runAll(){Object.keys(this.data).forEach(l=>{var Z;(Z=this.cb)==null||Z.call(this,l)})}runType(l){var Z;this.data[l]!==void 0&&((Z=this.cb)==null||Z.call(this,l))}dispose(){this.data={},this.cb=void 0}}const Q="dmFyIFFBPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxqQT1PYmplY3QuZGVmaW5lUHJvcGVydGllczt2YXIgZVQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7dmFyIG9jPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7dmFyIHJfPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksc189T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt2YXIgeHM9TWF0aC5wb3csaV89KGZ0LFJ0LFN0KT0+UnQgaW4gZnQ/UUEoZnQsUnQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlN0fSk6ZnRbUnRdPVN0LHZyPShmdCxSdCk9Pntmb3IodmFyIFN0IGluIFJ0fHwoUnQ9e30pKXJfLmNhbGwoUnQsU3QpJiZpXyhmdCxTdCxSdFtTdF0pO2lmKG9jKWZvcih2YXIgU3Qgb2Ygb2MoUnQpKXNfLmNhbGwoUnQsU3QpJiZpXyhmdCxTdCxSdFtTdF0pO3JldHVybiBmdH0sd2Y9KGZ0LFJ0KT0+akEoZnQsZVQoUnQpKTt2YXIgYV89KGZ0LFJ0KT0+e3ZhciBTdD17fTtmb3IodmFyIHNuIGluIGZ0KXJfLmNhbGwoZnQsc24pJiZSdC5pbmRleE9mKHNuKTwwJiYoU3Rbc25dPWZ0W3NuXSk7aWYoZnQhPW51bGwmJm9jKWZvcih2YXIgc24gb2Ygb2MoZnQpKVJ0LmluZGV4T2Yoc24pPDAmJnNfLmNhbGwoZnQsc24pJiYoU3Rbc25dPWZ0W3NuXSk7cmV0dXJuIFN0fTt2YXIgeXM9KGZ0LFJ0LFN0KT0+bmV3IFByb21pc2UoKHNuLE1yKT0+e3ZhciBVYT1Dbj0+e3RyeXt2cyhTdC5uZXh0KENuKSl9Y2F0Y2goU3Ipe01yKFNyKX19LGxjPUNuPT57dHJ5e3ZzKFN0LnRocm93KENuKSl9Y2F0Y2goU3Ipe01yKFNyKX19LHZzPUNuPT5Dbi5kb25lP3NuKENuLnZhbHVlKTpQcm9taXNlLnJlc29sdmUoQ24udmFsdWUpLnRoZW4oVWEsbGMpO3ZzKChTdD1TdC5hcHBseShmdCxSdCkpLm5leHQoKSl9KTsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7LyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCAyMDEwLTIwMjMgVGhyZWUuanMgQXV0aG9ycwogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAqL2NvbnN0IGZ0PSIxNTkiLFJ0PXtMRUZUOjAsTUlERExFOjEsUklHSFQ6MixST1RBVEU6MCxET0xMWToxLFBBTjoyfSxTdD17Uk9UQVRFOjAsUEFOOjEsRE9MTFlfUEFOOjIsRE9MTFlfUk9UQVRFOjN9LHNuPTAsTXI9MSxVYT0yLGxjPTMsdnM9MCxDbj0xLFNyPTIsa249MyxZbj0wLFl0PTEsR249MixsXz0yLFpuPTAsQmk9MSxjYz0yLGhjPTMsdWM9NCxFZj01LHhpPTEwMCxBZj0xMDEsVGY9MTAyLGZjPTEwMyxkYz0xMDQsQ2Y9MjAwLFJmPTIwMSxQZj0yMDIsTGY9MjAzLERhPTIwNCxOYT0yMDUsSWY9MjA2LFVmPTIwNyxEZj0yMDgsTmY9MjA5LEZmPTIxMCxPZj0yMTEsQmY9MjEyLHpmPTIxMyxrZj0yMTQsR2Y9MCxWZj0xLEhmPTIsTXM9MyxXZj00LFhmPTUscWY9NiwkZj03LFNzPTAsWWY9MSxaZj0yLEpuPTAsSmY9MSxLZj0yLFFmPTMsamY9NCxlZD01LHBjPSJhdHRhY2hlZCIsdGQ9ImRldGFjaGVkIixGYT0zMDAsS249MzAxLHlpPTMwMixicz0zMDMsd3M9MzA0LGJyPTMwNixFcz0xZTMsenQ9MTAwMSxBcz0xMDAyLGJ0PTEwMDMsT2E9MTAwNCxjXz0xMDA0LFRzPTEwMDUsaF89MTAwNSx3dD0xMDA2LG1jPTEwMDcsdV89MTAwNyx2aT0xMDA4LGZfPTEwMDgsUW49MTAwOSxuZD0xMDEwLGlkPTEwMTEsQmE9MTAxMixnYz0xMDEzLGpuPTEwMTQsUm49MTAxNSx3cj0xMDE2LF9jPTEwMTcseGM9MTAxOCxNaT0xMDIwLHJkPTEwMjEsYW49MTAyMyxzZD0xMDI0LGFkPTEwMjUsU2k9MTAyNix6aT0xMDI3LG9kPTEwMjgseWM9MTAyOSxsZD0xMDMwLHZjPTEwMzEsTWM9MTAzMyx6YT0zMzc3NixrYT0zMzc3NyxHYT0zMzc3OCxWYT0zMzc3OSxTYz0zNTg0MCxiYz0zNTg0MSx3Yz0zNTg0MixFYz0zNTg0MyxBYz0zNjE5NixUYz0zNzQ5MixDYz0zNzQ5NixSYz0zNzgwOCxQYz0zNzgwOSxMYz0zNzgxMCxJYz0zNzgxMSxVYz0zNzgxMixEYz0zNzgxMyxOYz0zNzgxNCxGYz0zNzgxNSxPYz0zNzgxNixCYz0zNzgxNyx6Yz0zNzgxOCxrYz0zNzgxOSxHYz0zNzgyMCxWYz0zNzgyMSxIYT0zNjQ5MixIYz0zNjQ5NCxXYz0zNjQ5NSxjZD0zNjI4MyxYYz0zNjI4NCxxYz0zNjI4NSwkYz0zNjI4NixoZD0yMjAwLHVkPTIyMDEsZmQ9MjIwMixDcz0yMzAwLFJzPTIzMDEsV2E9MjMwMixraT0yNDAwLEdpPTI0MDEsUHM9MjQwMixYYT0yNTAwLFljPTI1MDEsZF89MCxwXz0xLG1fPTIsWmM9M2UzLGJpPTMwMDEsZGQ9MzIwMCxwZD0zMjAxLHdpPTAsbWQ9MSxnbj0iIixQdD0ic3JnYiIsVm49InNyZ2ItbGluZWFyIixxYT0iZGlzcGxheS1wMyIsTHM9ImRpc3BsYXktcDMtbGluZWFyIixJcz0ibGluZWFyIixjdD0ic3JnYiIsVXM9InJlYzcwOSIsRHM9InAzIixnXz0wLFZpPTc2ODAsX189NzY4MSx4Xz03NjgyLHlfPTc2ODMsdl89MzQwNTUsTV89MzQwNTYsU189NTM4NixiXz01MTIsd189NTEzLEVfPTUxNCxBXz01MTUsVF89NTE2LENfPTUxNyxSXz01MTgsSmM9NTE5LGdkPTUxMixfZD01MTMseGQ9NTE0LEtjPTUxNSx5ZD01MTYsdmQ9NTE3LE1kPTUxOCxTZD01MTksTnM9MzUwNDQsUF89MzUwNDgsTF89MzUwNDAsSV89MzUwNDUsVV89MzUwNDksRF89MzUwNDEsTl89MzUwNDYsRl89MzUwNTAsT189MzUwNDIsQl89IjEwMCIsUWM9IjMwMCBlcyIsJGE9MTAzNSxQbj0yZTMsRXI9MjAwMTtjbGFzcyBlaXthZGRFdmVudExpc3RlbmVyKGUsdCl7dGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBuPXRoaXMuX2xpc3RlbmVycztuW2VdPT09dm9pZCAwJiYobltlXT1bXSksbltlXS5pbmRleE9mKHQpPT09LTEmJm5bZV0ucHVzaCh0KX1oYXNFdmVudExpc3RlbmVyKGUsdCl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybiExO2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiBuW2VdIT09dm9pZCAwJiZuW2VdLmluZGV4T2YodCkhPT0tMX1yZW1vdmVFdmVudExpc3RlbmVyKGUsdCl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybjtjb25zdCBpPXRoaXMuX2xpc3RlbmVyc1tlXTtpZihpIT09dm9pZCAwKXtjb25zdCBzPWkuaW5kZXhPZih0KTtzIT09LTEmJmkuc3BsaWNlKHMsMSl9fWRpc3BhdGNoRXZlbnQoZSl7aWYodGhpcy5fbGlzdGVuZXJzPT09dm9pZCAwKXJldHVybjtjb25zdCBuPXRoaXMuX2xpc3RlbmVyc1tlLnR5cGVdO2lmKG4hPT12b2lkIDApe2UudGFyZ2V0PXRoaXM7Y29uc3QgaT1uLnNsaWNlKDApO2ZvcihsZXQgcz0wLGE9aS5sZW5ndGg7czxhO3MrKylpW3NdLmNhbGwodGhpcyxlKTtlLnRhcmdldD1udWxsfX19Y29uc3Qga3Q9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2xldCBiZD0xMjM0NTY3O2NvbnN0IEhpPU1hdGguUEkvMTgwLEFyPTE4MC9NYXRoLlBJO2Z1bmN0aW9uIF9uKCl7Y29uc3Qgcj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MCxlPU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NXwwLHQ9TWF0aC5yYW5kb20oKSo0Mjk0OTY3Mjk1fDAsbj1NYXRoLnJhbmRvbSgpKjQyOTQ5NjcyOTV8MDtyZXR1cm4oa3RbciYyNTVdK2t0W3I+PjgmMjU1XStrdFtyPj4xNiYyNTVdK2t0W3I+PjI0JjI1NV0rIi0iK2t0W2UmMjU1XStrdFtlPj44JjI1NV0rIi0iK2t0W2U+PjE2JjE1fDY0XStrdFtlPj4yNCYyNTVdKyItIitrdFt0JjYzfDEyOF0ra3RbdD4+OCYyNTVdKyItIitrdFt0Pj4xNiYyNTVdK2t0W3Q+PjI0JjI1NV0ra3RbbiYyNTVdK2t0W24+PjgmMjU1XStrdFtuPj4xNiYyNTVdK2t0W24+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gX3QocixlLHQpe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKHQscikpfWZ1bmN0aW9uIGpjKHIsZSl7cmV0dXJuKHIlZStlKSVlfWZ1bmN0aW9uIHpfKHIsZSx0LG4saSl7cmV0dXJuIG4rKHItZSkqKGktbikvKHQtZSl9ZnVuY3Rpb24ga18ocixlLHQpe3JldHVybiByIT09ZT8odC1yKS8oZS1yKTowfWZ1bmN0aW9uIEZzKHIsZSx0KXtyZXR1cm4oMS10KSpyK3QqZX1mdW5jdGlvbiBHXyhyLGUsdCxuKXtyZXR1cm4gRnMocixlLDEtTWF0aC5leHAoLXQqbikpfWZ1bmN0aW9uIFZfKHIsZT0xKXtyZXR1cm4gZS1NYXRoLmFicyhqYyhyLGUqMiktZSl9ZnVuY3Rpb24gSF8ocixlLHQpe3JldHVybiByPD1lPzA6cj49dD8xOihyPShyLWUpLyh0LWUpLHIqciooMy0yKnIpKX1mdW5jdGlvbiBXXyhyLGUsdCl7cmV0dXJuIHI8PWU/MDpyPj10PzE6KHI9KHItZSkvKHQtZSkscipyKnIqKHIqKHIqNi0xNSkrMTApKX1mdW5jdGlvbiBYXyhyLGUpe3JldHVybiByK01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSooZS1yKzEpKX1mdW5jdGlvbiBxXyhyLGUpe3JldHVybiByK01hdGgucmFuZG9tKCkqKGUtcil9ZnVuY3Rpb24gJF8ocil7cmV0dXJuIHIqKC41LU1hdGgucmFuZG9tKCkpfWZ1bmN0aW9uIFlfKHIpe3IhPT12b2lkIDAmJihiZD1yKTtsZXQgZT1iZCs9MTgzMTU2NTgxMztyZXR1cm4gZT1NYXRoLmltdWwoZV5lPj4+MTUsZXwxKSxlXj1lK01hdGguaW11bChlXmU+Pj43LGV8NjEpLCgoZV5lPj4+MTQpPj4+MCkvNDI5NDk2NzI5Nn1mdW5jdGlvbiBaXyhyKXtyZXR1cm4gcipIaX1mdW5jdGlvbiBKXyhyKXtyZXR1cm4gcipBcn1mdW5jdGlvbiBlaChyKXtyZXR1cm4ociZyLTEpPT09MCYmciE9PTB9ZnVuY3Rpb24gS18ocil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5jZWlsKE1hdGgubG9nKHIpL01hdGguTE4yKSl9ZnVuY3Rpb24gWWEocil7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMikpfWZ1bmN0aW9uIFFfKHIsZSx0LG4saSl7Y29uc3Qgcz1NYXRoLmNvcyxhPU1hdGguc2luLG89cyh0LzIpLGw9YSh0LzIpLGM9cygoZStuKS8yKSxoPWEoKGUrbikvMiksdT1zKChlLW4pLzIpLGY9YSgoZS1uKS8yKSxkPXMoKG4tZSkvMikscD1hKChuLWUpLzIpO3N3aXRjaChpKXtjYXNlIlhZWCI6ci5zZXQobypoLGwqdSxsKmYsbypjKTticmVhaztjYXNlIllaWSI6ci5zZXQobCpmLG8qaCxsKnUsbypjKTticmVhaztjYXNlIlpYWiI6ci5zZXQobCp1LGwqZixvKmgsbypjKTticmVhaztjYXNlIlhaWCI6ci5zZXQobypoLGwqcCxsKmQsbypjKTticmVhaztjYXNlIllYWSI6ci5zZXQobCpkLG8qaCxsKnAsbypjKTticmVhaztjYXNlIlpZWiI6ci5zZXQobCpwLGwqZCxvKmgsbypjKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuTWF0aFV0aWxzOiAuc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIraSl9fWZ1bmN0aW9uIG9uKHIsZSl7c3dpdGNoKGUuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiByO2Nhc2UgVWludDMyQXJyYXk6cmV0dXJuIHIvNDI5NDk2NzI5NTtjYXNlIFVpbnQxNkFycmF5OnJldHVybiByLzY1NTM1O2Nhc2UgVWludDhBcnJheTpyZXR1cm4gci8yNTU7Y2FzZSBJbnQzMkFycmF5OnJldHVybiBNYXRoLm1heChyLzIxNDc0ODM2NDcsLTEpO2Nhc2UgSW50MTZBcnJheTpyZXR1cm4gTWF0aC5tYXgoci8zMjc2NywtMSk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgubWF4KHIvMTI3LC0xKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb21wb25lbnQgdHlwZS4iKX19ZnVuY3Rpb24gcWUocixlKXtzd2l0Y2goZS5jb25zdHJ1Y3Rvcil7Y2FzZSBGbG9hdDMyQXJyYXk6cmV0dXJuIHI7Y2FzZSBVaW50MzJBcnJheTpyZXR1cm4gTWF0aC5yb3VuZChyKjQyOTQ5NjcyOTUpO2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQocio2NTUzNSk7Y2FzZSBVaW50OEFycmF5OnJldHVybiBNYXRoLnJvdW5kKHIqMjU1KTtjYXNlIEludDMyQXJyYXk6cmV0dXJuIE1hdGgucm91bmQocioyMTQ3NDgzNjQ3KTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQociozMjc2Nyk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQocioxMjcpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX1jb25zdCBqXz17REVHMlJBRDpIaSxSQUQyREVHOkFyLGdlbmVyYXRlVVVJRDpfbixjbGFtcDpfdCxldWNsaWRlYW5Nb2R1bG86amMsbWFwTGluZWFyOnpfLGludmVyc2VMZXJwOmtfLGxlcnA6RnMsZGFtcDpHXyxwaW5ncG9uZzpWXyxzbW9vdGhzdGVwOkhfLHNtb290aGVyc3RlcDpXXyxyYW5kSW50OlhfLHJhbmRGbG9hdDpxXyxyYW5kRmxvYXRTcHJlYWQ6JF8sc2VlZGVkUmFuZG9tOllfLGRlZ1RvUmFkOlpfLHJhZFRvRGVnOkpfLGlzUG93ZXJPZlR3bzplaCxjZWlsUG93ZXJPZlR3bzpLXyxmbG9vclBvd2VyT2ZUd286WWEsc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcjpRXyxub3JtYWxpemU6cWUsZGVub3JtYWxpemU6b259O2NsYXNzIHF7Y29uc3RydWN0b3IoZT0wLHQ9MCl7cS5wcm90b3R5cGUuaXNWZWN0b3IyPSEwLHRoaXMueD1lLHRoaXMueT10fWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnh9c2V0IHdpZHRoKGUpe3RoaXMueD1lfWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy55fXNldCBoZWlnaHQoZSl7dGhpcy55PWV9c2V0KGUsdCl7cmV0dXJuIHRoaXMueD1lLHRoaXMueT10LHRoaXN9c2V0U2NhbGFyKGUpe3JldHVybiB0aGlzLng9ZSx0aGlzLnk9ZSx0aGlzfXNldFgoZSl7cmV0dXJuIHRoaXMueD1lLHRoaXN9c2V0WShlKXtyZXR1cm4gdGhpcy55PWUsdGhpc31zZXRDb21wb25lbnQoZSx0KXtzd2l0Y2goZSl7Y2FzZSAwOnRoaXMueD10O2JyZWFrO2Nhc2UgMTp0aGlzLnk9dDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2UpfXJldHVybiB0aGlzfWdldENvbXBvbmVudChlKXtzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIitlKX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSl9Y29weShlKXtyZXR1cm4gdGhpcy54PWUueCx0aGlzLnk9ZS55LHRoaXN9YWRkKGUpe3JldHVybiB0aGlzLngrPWUueCx0aGlzLnkrPWUueSx0aGlzfWFkZFNjYWxhcihlKXtyZXR1cm4gdGhpcy54Kz1lLHRoaXMueSs9ZSx0aGlzfWFkZFZlY3RvcnMoZSx0KXtyZXR1cm4gdGhpcy54PWUueCt0LngsdGhpcy55PWUueSt0LnksdGhpc31hZGRTY2FsZWRWZWN0b3IoZSx0KXtyZXR1cm4gdGhpcy54Kz1lLngqdCx0aGlzLnkrPWUueSp0LHRoaXN9c3ViKGUpe3JldHVybiB0aGlzLngtPWUueCx0aGlzLnktPWUueSx0aGlzfXN1YlNjYWxhcihlKXtyZXR1cm4gdGhpcy54LT1lLHRoaXMueS09ZSx0aGlzfXN1YlZlY3RvcnMoZSx0KXtyZXR1cm4gdGhpcy54PWUueC10LngsdGhpcy55PWUueS10LnksdGhpc31tdWx0aXBseShlKXtyZXR1cm4gdGhpcy54Kj1lLngsdGhpcy55Kj1lLnksdGhpc31tdWx0aXBseVNjYWxhcihlKXtyZXR1cm4gdGhpcy54Kj1lLHRoaXMueSo9ZSx0aGlzfWRpdmlkZShlKXtyZXR1cm4gdGhpcy54Lz1lLngsdGhpcy55Lz1lLnksdGhpc31kaXZpZGVTY2FsYXIoZSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS9lKX1hcHBseU1hdHJpeDMoZSl7Y29uc3QgdD10aGlzLngsbj10aGlzLnksaT1lLmVsZW1lbnRzO3JldHVybiB0aGlzLng9aVswXSp0K2lbM10qbitpWzZdLHRoaXMueT1pWzFdKnQraVs0XSpuK2lbN10sdGhpc31taW4oZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsZS54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LGUueSksdGhpc31tYXgoZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsZS54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LGUueSksdGhpc31jbGFtcChlLHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgoZS54LE1hdGgubWluKHQueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgoZS55LE1hdGgubWluKHQueSx0aGlzLnkpKSx0aGlzfWNsYW1wU2NhbGFyKGUsdCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heChlLE1hdGgubWluKHQsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KGUsTWF0aC5taW4odCx0aGlzLnkpKSx0aGlzfWNsYW1wTGVuZ3RoKGUsdCl7Y29uc3Qgbj10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihufHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heChlLE1hdGgubWluKHQsbikpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QoZSl7cmV0dXJuIHRoaXMueCplLngrdGhpcy55KmUueX1jcm9zcyhlKXtyZXR1cm4gdGhpcy54KmUueS10aGlzLnkqZS54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9YW5nbGVUbyhlKXtjb25zdCB0PU1hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqZS5sZW5ndGhTcSgpKTtpZih0PT09MClyZXR1cm4gTWF0aC5QSS8yO2NvbnN0IG49dGhpcy5kb3QoZSkvdDtyZXR1cm4gTWF0aC5hY29zKF90KG4sLTEsMSkpfWRpc3RhbmNlVG8oZSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGUpKX1kaXN0YW5jZVRvU3F1YXJlZChlKXtjb25zdCB0PXRoaXMueC1lLngsbj10aGlzLnktZS55O3JldHVybiB0KnQrbipufW1hbmhhdHRhbkRpc3RhbmNlVG8oZSl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1lLngpK01hdGguYWJzKHRoaXMueS1lLnkpfXNldExlbmd0aChlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcihlKX1sZXJwKGUsdCl7cmV0dXJuIHRoaXMueCs9KGUueC10aGlzLngpKnQsdGhpcy55Kz0oZS55LXRoaXMueSkqdCx0aGlzfWxlcnBWZWN0b3JzKGUsdCxuKXtyZXR1cm4gdGhpcy54PWUueCsodC54LWUueCkqbix0aGlzLnk9ZS55Kyh0LnktZS55KSpuLHRoaXN9ZXF1YWxzKGUpe3JldHVybiBlLng9PT10aGlzLngmJmUueT09PXRoaXMueX1mcm9tQXJyYXkoZSx0PTApe3JldHVybiB0aGlzLng9ZVt0XSx0aGlzLnk9ZVt0KzFdLHRoaXN9dG9BcnJheShlPVtdLHQ9MCl7cmV0dXJuIGVbdF09dGhpcy54LGVbdCsxXT10aGlzLnksZX1mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCl7cmV0dXJuIHRoaXMueD1lLmdldFgodCksdGhpcy55PWUuZ2V0WSh0KSx0aGlzfXJvdGF0ZUFyb3VuZChlLHQpe2NvbnN0IG49TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KSxzPXRoaXMueC1lLngsYT10aGlzLnktZS55O3JldHVybiB0aGlzLng9cypuLWEqaStlLngsdGhpcy55PXMqaSthKm4rZS55LHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueX19Y2xhc3MgWmV7Y29uc3RydWN0b3IoZSx0LG4saSxzLGEsbyxsLGMpe1plLnByb3RvdHlwZS5pc01hdHJpeDM9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdLGUhPT12b2lkIDAmJnRoaXMuc2V0KGUsdCxuLGkscyxhLG8sbCxjKX1zZXQoZSx0LG4saSxzLGEsbyxsLGMpe2NvbnN0IGg9dGhpcy5lbGVtZW50cztyZXR1cm4gaFswXT1lLGhbMV09aSxoWzJdPW8saFszXT10LGhbNF09cyxoWzVdPWwsaFs2XT1uLGhbN109YSxoWzhdPWMsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSksdGhpc31jb3B5KGUpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxuPWUuZWxlbWVudHM7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHRbM109blszXSx0WzRdPW5bNF0sdFs1XT1uWzVdLHRbNl09bls2XSx0WzddPW5bN10sdFs4XT1uWzhdLHRoaXN9ZXh0cmFjdEJhc2lzKGUsdCxuKXtyZXR1cm4gZS5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDApLHQuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMiksdGhpc31zZXRGcm9tTWF0cml4NChlKXtjb25zdCB0PWUuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KHRbMF0sdFs0XSx0WzhdLHRbMV0sdFs1XSx0WzldLHRbMl0sdFs2XSx0WzEwXSksdGhpc31tdWx0aXBseShlKXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsZSl9cHJlbXVsdGlwbHkoZSl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyhlLHRoaXMpfW11bHRpcGx5TWF0cmljZXMoZSx0KXtjb25zdCBuPWUuZWxlbWVudHMsaT10LmVsZW1lbnRzLHM9dGhpcy5lbGVtZW50cyxhPW5bMF0sbz1uWzNdLGw9bls2XSxjPW5bMV0saD1uWzRdLHU9bls3XSxmPW5bMl0sZD1uWzVdLHA9bls4XSxfPWlbMF0sZz1pWzNdLG09aVs2XSx5PWlbMV0seD1pWzRdLHY9aVs3XSxTPWlbMl0sYj1pWzVdLEE9aVs4XTtyZXR1cm4gc1swXT1hKl8rbyp5K2wqUyxzWzNdPWEqZytvKngrbCpiLHNbNl09YSptK28qditsKkEsc1sxXT1jKl8raCp5K3UqUyxzWzRdPWMqZytoKngrdSpiLHNbN109YyptK2gqdit1KkEsc1syXT1mKl8rZCp5K3AqUyxzWzVdPWYqZytkKngrcCpiLHNbOF09ZiptK2QqditwKkEsdGhpc31tdWx0aXBseVNjYWxhcihlKXtjb25zdCB0PXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbMF0qPWUsdFszXSo9ZSx0WzZdKj1lLHRbMV0qPWUsdFs0XSo9ZSx0WzddKj1lLHRbMl0qPWUsdFs1XSo9ZSx0WzhdKj1lLHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCBlPXRoaXMuZWxlbWVudHMsdD1lWzBdLG49ZVsxXSxpPWVbMl0scz1lWzNdLGE9ZVs0XSxvPWVbNV0sbD1lWzZdLGM9ZVs3XSxoPWVbOF07cmV0dXJuIHQqYSpoLXQqbypjLW4qcypoK24qbypsK2kqcypjLWkqYSpsfWludmVydCgpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyx0PWVbMF0sbj1lWzFdLGk9ZVsyXSxzPWVbM10sYT1lWzRdLG89ZVs1XSxsPWVbNl0sYz1lWzddLGg9ZVs4XSx1PWgqYS1vKmMsZj1vKmwtaCpzLGQ9YypzLWEqbCxwPXQqdStuKmYraSpkO2lmKHA9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgXz0xL3A7cmV0dXJuIGVbMF09dSpfLGVbMV09KGkqYy1oKm4pKl8sZVsyXT0obypuLWkqYSkqXyxlWzNdPWYqXyxlWzRdPShoKnQtaSpsKSpfLGVbNV09KGkqcy1vKnQpKl8sZVs2XT1kKl8sZVs3XT0obipsLWMqdCkqXyxlWzhdPShhKnQtbipzKSpfLHRoaXN9dHJhbnNwb3NlKCl7bGV0IGU7Y29uc3QgdD10aGlzLmVsZW1lbnRzO3JldHVybiBlPXRbMV0sdFsxXT10WzNdLHRbM109ZSxlPXRbMl0sdFsyXT10WzZdLHRbNl09ZSxlPXRbNV0sdFs1XT10WzddLHRbN109ZSx0aGlzfWdldE5vcm1hbE1hdHJpeChlKXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NChlKS5pbnZlcnQoKS50cmFuc3Bvc2UoKX10cmFuc3Bvc2VJbnRvQXJyYXkoZSl7Y29uc3QgdD10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdPXRbMF0sZVsxXT10WzNdLGVbMl09dFs2XSxlWzNdPXRbMV0sZVs0XT10WzRdLGVbNV09dFs3XSxlWzZdPXRbMl0sZVs3XT10WzVdLGVbOF09dFs4XSx0aGlzfXNldFV2VHJhbnNmb3JtKGUsdCxuLGkscyxhLG8pe2NvbnN0IGw9TWF0aC5jb3MocyksYz1NYXRoLnNpbihzKTtyZXR1cm4gdGhpcy5zZXQobipsLG4qYywtbioobCphK2MqbykrYStlLC1pKmMsaSpsLC1pKigtYyphK2wqbykrbyt0LDAsMCwxKSx0aGlzfXNjYWxlKGUsdCl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkodGgubWFrZVNjYWxlKGUsdCkpLHRoaXN9cm90YXRlKGUpe3JldHVybiB0aGlzLnByZW11bHRpcGx5KHRoLm1ha2VSb3RhdGlvbigtZSkpLHRoaXN9dHJhbnNsYXRlKGUsdCl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkodGgubWFrZVRyYW5zbGF0aW9uKGUsdCkpLHRoaXN9bWFrZVRyYW5zbGF0aW9uKGUsdCl7cmV0dXJuIGUuaXNWZWN0b3IyP3RoaXMuc2V0KDEsMCxlLngsMCwxLGUueSwwLDAsMSk6dGhpcy5zZXQoMSwwLGUsMCwxLHQsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uKGUpe2NvbnN0IHQ9TWF0aC5jb3MoZSksbj1NYXRoLnNpbihlKTtyZXR1cm4gdGhpcy5zZXQodCwtbiwwLG4sdCwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZShlLHQpe3JldHVybiB0aGlzLnNldChlLDAsMCwwLHQsMCwwLDAsMSksdGhpc31lcXVhbHMoZSl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLG49ZS5lbGVtZW50cztmb3IobGV0IGk9MDtpPDk7aSsrKWlmKHRbaV0hPT1uW2ldKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheShlLHQ9MCl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmVsZW1lbnRzW25dPWVbbit0XTtyZXR1cm4gdGhpc310b0FycmF5KGU9W10sdD0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbdF09blswXSxlW3QrMV09blsxXSxlW3QrMl09blsyXSxlW3QrM109blszXSxlW3QrNF09bls0XSxlW3QrNV09bls1XSxlW3QrNl09bls2XSxlW3QrN109bls3XSxlW3QrOF09bls4XSxlfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KHRoaXMuZWxlbWVudHMpfX1jb25zdCB0aD1uZXcgWmU7ZnVuY3Rpb24gd2Qocil7Zm9yKGxldCBlPXIubGVuZ3RoLTE7ZT49MDstLWUpaWYocltlXT49NjU1MzUpcmV0dXJuITA7cmV0dXJuITF9Y29uc3QgZXg9e0ludDhBcnJheSxVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5fTtmdW5jdGlvbiBUcihyLGUpe3JldHVybiBuZXcgZXhbcl0oZSl9ZnVuY3Rpb24gT3Mocil7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIscil9ZnVuY3Rpb24gRWQoKXtjb25zdCByPU9zKCJjYW52YXMiKTtyZXR1cm4gci5zdHlsZS5kaXNwbGF5PSJibG9jayIscn1jb25zdCBBZD17fTtmdW5jdGlvbiBCcyhyKXtyIGluIEFkfHwoQWRbcl09ITAsY29uc29sZS53YXJuKHIpKX1jb25zdCBUZD1uZXcgWmUoKS5zZXQoLjgyMjQ2MjEsLjE3NzUzOCwwLC4wMzMxOTQxLC45NjY4MDU4LDAsLjAxNzA4MjcsLjA3MjM5NzQsLjkxMDUxOTkpLENkPW5ldyBaZSgpLnNldCgxLjIyNDk0MDEsLS4yMjQ5NDA0LDAsLS4wNDIwNTY5LDEuMDQyMDU3MSwwLC0uMDE5NjM3NiwtLjA3ODYzNjEsMS4wOTgyNzM1KSxaYT17W1ZuXTp7dHJhbnNmZXI6SXMscHJpbWFyaWVzOlVzLHRvUmVmZXJlbmNlOnI9PnIsZnJvbVJlZmVyZW5jZTpyPT5yfSxbUHRdOnt0cmFuc2ZlcjpjdCxwcmltYXJpZXM6VXMsdG9SZWZlcmVuY2U6cj0+ci5jb252ZXJ0U1JHQlRvTGluZWFyKCksZnJvbVJlZmVyZW5jZTpyPT5yLmNvbnZlcnRMaW5lYXJUb1NSR0IoKX0sW0xzXTp7dHJhbnNmZXI6SXMscHJpbWFyaWVzOkRzLHRvUmVmZXJlbmNlOnI9PnIuYXBwbHlNYXRyaXgzKENkKSxmcm9tUmVmZXJlbmNlOnI9PnIuYXBwbHlNYXRyaXgzKFRkKX0sW3FhXTp7dHJhbnNmZXI6Y3QscHJpbWFyaWVzOkRzLHRvUmVmZXJlbmNlOnI9PnIuY29udmVydFNSR0JUb0xpbmVhcigpLmFwcGx5TWF0cml4MyhDZCksZnJvbVJlZmVyZW5jZTpyPT5yLmFwcGx5TWF0cml4MyhUZCkuY29udmVydExpbmVhclRvU1JHQigpfX0sdHg9bmV3IFNldChbVm4sTHNdKSxvdD17ZW5hYmxlZDohMCxfd29ya2luZ0NvbG9yU3BhY2U6Vm4sZ2V0IGxlZ2FjeU1vZGUoKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Db2xvck1hbmFnZW1lbnQ6IC5sZWdhY3lNb2RlPWZhbHNlIHJlbmFtZWQgdG8gLmVuYWJsZWQ9dHJ1ZSBpbiByMTUwLiIpLCF0aGlzLmVuYWJsZWR9LHNldCBsZWdhY3lNb2RlKHIpe2NvbnNvbGUud2FybigiVEhSRUUuQ29sb3JNYW5hZ2VtZW50OiAubGVnYWN5TW9kZT1mYWxzZSByZW5hbWVkIHRvIC5lbmFibGVkPXRydWUgaW4gcjE1MC4iKSx0aGlzLmVuYWJsZWQ9IXJ9LGdldCB3b3JraW5nQ29sb3JTcGFjZSgpe3JldHVybiB0aGlzLl93b3JraW5nQ29sb3JTcGFjZX0sc2V0IHdvcmtpbmdDb2xvclNwYWNlKHIpe2lmKCF0eC5oYXMocikpdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB3b3JraW5nIGNvbG9yIHNwYWNlLCAiJHtyfSIuYCk7dGhpcy5fd29ya2luZ0NvbG9yU3BhY2U9cn0sY29udmVydDpmdW5jdGlvbihyLGUsdCl7aWYodGhpcy5lbmFibGVkPT09ITF8fGU9PT10fHwhZXx8IXQpcmV0dXJuIHI7Y29uc3Qgbj1aYVtlXS50b1JlZmVyZW5jZSxpPVphW3RdLmZyb21SZWZlcmVuY2U7cmV0dXJuIGkobihyKSl9LGZyb21Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbihyLGUpe3JldHVybiB0aGlzLmNvbnZlcnQocix0aGlzLl93b3JraW5nQ29sb3JTcGFjZSxlKX0sdG9Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbihyLGUpe3JldHVybiB0aGlzLmNvbnZlcnQocixlLHRoaXMuX3dvcmtpbmdDb2xvclNwYWNlKX0sZ2V0UHJpbWFyaWVzOmZ1bmN0aW9uKHIpe3JldHVybiBaYVtyXS5wcmltYXJpZXN9LGdldFRyYW5zZmVyOmZ1bmN0aW9uKHIpe3JldHVybiByPT09Z24/SXM6WmFbcl0udHJhbnNmZXJ9fTtmdW5jdGlvbiBDcihyKXtyZXR1cm4gcjwuMDQwNDU/ciouMDc3Mzk5MzgwODpNYXRoLnBvdyhyKi45NDc4NjcyOTg2Ky4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gbmgocil7cmV0dXJuIHI8LjAwMzEzMDg/cioxMi45MjoxLjA1NSpNYXRoLnBvdyhyLC40MTY2NiktLjA1NX1sZXQgUnI7Y2xhc3MgaWh7c3RhdGljIGdldERhdGFVUkwoZSl7aWYoL15kYXRhOi9pLnRlc3QoZS5zcmMpfHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQ9PSJ1bmRlZmluZWQiKXJldHVybiBlLnNyYztsZXQgdDtpZihlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpdD1lO2Vsc2V7UnI9PT12b2lkIDAmJihScj1PcygiY2FudmFzIikpLFJyLndpZHRoPWUud2lkdGgsUnIuaGVpZ2h0PWUuaGVpZ2h0O2NvbnN0IG49UnIuZ2V0Q29udGV4dCgiMmQiKTtlIGluc3RhbmNlb2YgSW1hZ2VEYXRhP24ucHV0SW1hZ2VEYXRhKGUsMCwwKTpuLmRyYXdJbWFnZShlLDAsMCxlLndpZHRoLGUuaGVpZ2h0KSx0PVJyfXJldHVybiB0LndpZHRoPjIwNDh8fHQuaGVpZ2h0PjIwNDg/KGNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5nZXREYXRhVVJMOiBJbWFnZSBjb252ZXJ0ZWQgdG8ganBnIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIixlKSx0LnRvRGF0YVVSTCgiaW1hZ2UvanBlZyIsLjYpKTp0LnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9c3RhdGljIHNSR0JUb0xpbmVhcihlKXtpZih0eXBlb2YgSFRNTEltYWdlRWxlbWVudCE9InVuZGVmaW5lZCImJmUgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHx0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQhPSJ1bmRlZmluZWQiJiZlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fHR5cGVvZiBJbWFnZUJpdG1hcCE9InVuZGVmaW5lZCImJmUgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCl7Y29uc3QgdD1PcygiY2FudmFzIik7dC53aWR0aD1lLndpZHRoLHQuaGVpZ2h0PWUuaGVpZ2h0O2NvbnN0IG49dC5nZXRDb250ZXh0KCIyZCIpO24uZHJhd0ltYWdlKGUsMCwwLGUud2lkdGgsZS5oZWlnaHQpO2NvbnN0IGk9bi5nZXRJbWFnZURhdGEoMCwwLGUud2lkdGgsZS5oZWlnaHQpLHM9aS5kYXRhO2ZvcihsZXQgYT0wO2E8cy5sZW5ndGg7YSsrKXNbYV09Q3Ioc1thXS8yNTUpKjI1NTtyZXR1cm4gbi5wdXRJbWFnZURhdGEoaSwwLDApLHR9ZWxzZSBpZihlLmRhdGEpe2NvbnN0IHQ9ZS5kYXRhLnNsaWNlKDApO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXQgaW5zdGFuY2VvZiBVaW50OEFycmF5fHx0IGluc3RhbmNlb2YgVWludDhDbGFtcGVkQXJyYXk/dFtuXT1NYXRoLmZsb29yKENyKHRbbl0vMjU1KSoyNTUpOnRbbl09Q3IodFtuXSk7cmV0dXJue2RhdGE6dCx3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodH19ZWxzZSByZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuIiksZX19bGV0IG54PTA7Y2xhc3MgV2l7Y29uc3RydWN0b3IoZT1udWxsKXt0aGlzLmlzU291cmNlPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOm54Kyt9KSx0aGlzLnV1aWQ9X24oKSx0aGlzLmRhdGE9ZSx0aGlzLnZlcnNpb249MH1zZXQgbmVlZHNVcGRhdGUoZSl7ZT09PSEwJiZ0aGlzLnZlcnNpb24rK310b0pTT04oZSl7Y29uc3QgdD1lPT09dm9pZCAwfHx0eXBlb2YgZT09InN0cmluZyI7aWYoIXQmJmUuaW1hZ2VzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIGUuaW1hZ2VzW3RoaXMudXVpZF07Y29uc3Qgbj17dXVpZDp0aGlzLnV1aWQsdXJsOiIifSxpPXRoaXMuZGF0YTtpZihpIT09bnVsbCl7bGV0IHM7aWYoQXJyYXkuaXNBcnJheShpKSl7cz1bXTtmb3IobGV0IGE9MCxvPWkubGVuZ3RoO2E8bzthKyspaVthXS5pc0RhdGFUZXh0dXJlP3MucHVzaChyaChpW2FdLmltYWdlKSk6cy5wdXNoKHJoKGlbYV0pKX1lbHNlIHM9cmgoaSk7bi51cmw9c31yZXR1cm4gdHx8KGUuaW1hZ2VzW3RoaXMudXVpZF09biksbn19ZnVuY3Rpb24gcmgocil7cmV0dXJuIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IT0idW5kZWZpbmVkIiYmciBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCE9InVuZGVmaW5lZCImJnIgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmciBpbnN0YW5jZW9mIEltYWdlQml0bWFwP2loLmdldERhdGFVUkwocik6ci5kYXRhP3tkYXRhOkFycmF5LmZyb20oci5kYXRhKSx3aWR0aDpyLndpZHRoLGhlaWdodDpyLmhlaWdodCx0eXBlOnIuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lfTooY29uc29sZS53YXJuKCJUSFJFRS5UZXh0dXJlOiBVbmFibGUgdG8gc2VyaWFsaXplIFRleHR1cmUuIikse30pfWxldCBpeD0wO2NsYXNzIEV0IGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoZT1FdC5ERUZBVUxUX0lNQUdFLHQ9RXQuREVGQVVMVF9NQVBQSU5HLG49enQsaT16dCxzPXd0LGE9dmksbz1hbixsPVFuLGM9RXQuREVGQVVMVF9BTklTT1RST1BZLGg9Z24pe3N1cGVyKCksdGhpcy5pc1RleHR1cmU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6aXgrK30pLHRoaXMudXVpZD1fbigpLHRoaXMubmFtZT0iIix0aGlzLnNvdXJjZT1uZXcgV2koZSksdGhpcy5taXBtYXBzPVtdLHRoaXMubWFwcGluZz10LHRoaXMuY2hhbm5lbD0wLHRoaXMud3JhcFM9bix0aGlzLndyYXBUPWksdGhpcy5tYWdGaWx0ZXI9cyx0aGlzLm1pbkZpbHRlcj1hLHRoaXMuYW5pc290cm9weT1jLHRoaXMuZm9ybWF0PW8sdGhpcy5pbnRlcm5hbEZvcm1hdD1udWxsLHRoaXMudHlwZT1sLHRoaXMub2Zmc2V0PW5ldyBxKDAsMCksdGhpcy5yZXBlYXQ9bmV3IHEoMSwxKSx0aGlzLmNlbnRlcj1uZXcgcSgwLDApLHRoaXMucm90YXRpb249MCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITAsdGhpcy5tYXRyaXg9bmV3IFplLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwLHRoaXMucHJlbXVsdGlwbHlBbHBoYT0hMSx0aGlzLmZsaXBZPSEwLHRoaXMudW5wYWNrQWxpZ25tZW50PTQsdHlwZW9mIGg9PSJzdHJpbmciP3RoaXMuY29sb3JTcGFjZT1oOihCcygiVEhSRUUuVGV4dHVyZTogUHJvcGVydHkgLmVuY29kaW5nIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IC5jb2xvclNwYWNlLiIpLHRoaXMuY29sb3JTcGFjZT1oPT09Ymk/UHQ6Z24pLHRoaXMudXNlckRhdGE9e30sdGhpcy52ZXJzaW9uPTAsdGhpcy5vblVwZGF0ZT1udWxsLHRoaXMuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSExLHRoaXMubmVlZHNQTVJFTVVwZGF0ZT0hMX1nZXQgaW1hZ2UoKXtyZXR1cm4gdGhpcy5zb3VyY2UuZGF0YX1zZXQgaW1hZ2UoZT1udWxsKXt0aGlzLnNvdXJjZS5kYXRhPWV9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0odGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkoZSl7cmV0dXJuIHRoaXMubmFtZT1lLm5hbWUsdGhpcy5zb3VyY2U9ZS5zb3VyY2UsdGhpcy5taXBtYXBzPWUubWlwbWFwcy5zbGljZSgwKSx0aGlzLm1hcHBpbmc9ZS5tYXBwaW5nLHRoaXMuY2hhbm5lbD1lLmNoYW5uZWwsdGhpcy53cmFwUz1lLndyYXBTLHRoaXMud3JhcFQ9ZS53cmFwVCx0aGlzLm1hZ0ZpbHRlcj1lLm1hZ0ZpbHRlcix0aGlzLm1pbkZpbHRlcj1lLm1pbkZpbHRlcix0aGlzLmFuaXNvdHJvcHk9ZS5hbmlzb3Ryb3B5LHRoaXMuZm9ybWF0PWUuZm9ybWF0LHRoaXMuaW50ZXJuYWxGb3JtYXQ9ZS5pbnRlcm5hbEZvcm1hdCx0aGlzLnR5cGU9ZS50eXBlLHRoaXMub2Zmc2V0LmNvcHkoZS5vZmZzZXQpLHRoaXMucmVwZWF0LmNvcHkoZS5yZXBlYXQpLHRoaXMuY2VudGVyLmNvcHkoZS5jZW50ZXIpLHRoaXMucm90YXRpb249ZS5yb3RhdGlvbix0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ZS5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4LmNvcHkoZS5tYXRyaXgpLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPWUuZ2VuZXJhdGVNaXBtYXBzLHRoaXMucHJlbXVsdGlwbHlBbHBoYT1lLnByZW11bHRpcGx5QWxwaGEsdGhpcy5mbGlwWT1lLmZsaXBZLHRoaXMudW5wYWNrQWxpZ25tZW50PWUudW5wYWNrQWxpZ25tZW50LHRoaXMuY29sb3JTcGFjZT1lLmNvbG9yU3BhY2UsdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGUudXNlckRhdGEpKSx0aGlzLm5lZWRzVXBkYXRlPSEwLHRoaXN9dG9KU09OKGUpe2NvbnN0IHQ9ZT09PXZvaWQgMHx8dHlwZW9mIGU9PSJzdHJpbmciO2lmKCF0JiZlLnRleHR1cmVzW3RoaXMudXVpZF0hPT12b2lkIDApcmV0dXJuIGUudGV4dHVyZXNbdGhpcy51dWlkXTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiVGV4dHVyZSIsZ2VuZXJhdG9yOiJUZXh0dXJlLnRvSlNPTiJ9LHV1aWQ6dGhpcy51dWlkLG5hbWU6dGhpcy5uYW1lLGltYWdlOnRoaXMuc291cmNlLnRvSlNPTihlKS51dWlkLG1hcHBpbmc6dGhpcy5tYXBwaW5nLGNoYW5uZWw6dGhpcy5jaGFubmVsLHJlcGVhdDpbdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55XSxvZmZzZXQ6W3RoaXMub2Zmc2V0LngsdGhpcy5vZmZzZXQueV0sY2VudGVyOlt0aGlzLmNlbnRlci54LHRoaXMuY2VudGVyLnldLHJvdGF0aW9uOnRoaXMucm90YXRpb24sd3JhcDpbdGhpcy53cmFwUyx0aGlzLndyYXBUXSxmb3JtYXQ6dGhpcy5mb3JtYXQsaW50ZXJuYWxGb3JtYXQ6dGhpcy5pbnRlcm5hbEZvcm1hdCx0eXBlOnRoaXMudHlwZSxjb2xvclNwYWNlOnRoaXMuY29sb3JTcGFjZSxtaW5GaWx0ZXI6dGhpcy5taW5GaWx0ZXIsbWFnRmlsdGVyOnRoaXMubWFnRmlsdGVyLGFuaXNvdHJvcHk6dGhpcy5hbmlzb3Ryb3B5LGZsaXBZOnRoaXMuZmxpcFksZ2VuZXJhdGVNaXBtYXBzOnRoaXMuZ2VuZXJhdGVNaXBtYXBzLHByZW11bHRpcGx5QWxwaGE6dGhpcy5wcmVtdWx0aXBseUFscGhhLHVucGFja0FsaWdubWVudDp0aGlzLnVucGFja0FsaWdubWVudH07cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYobi51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSx0fHwoZS50ZXh0dXJlc1t0aGlzLnV1aWRdPW4pLG59ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX10cmFuc2Zvcm1VdihlKXtpZih0aGlzLm1hcHBpbmchPT1GYSlyZXR1cm4gZTtpZihlLmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCksZS54PDB8fGUueD4xKXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIEVzOmUueD1lLngtTWF0aC5mbG9vcihlLngpO2JyZWFrO2Nhc2UgenQ6ZS54PWUueDwwPzA6MTticmVhaztjYXNlIEFzOk1hdGguYWJzKE1hdGguZmxvb3IoZS54KSUyKT09PTE/ZS54PU1hdGguY2VpbChlLngpLWUueDplLng9ZS54LU1hdGguZmxvb3IoZS54KTticmVha31pZihlLnk8MHx8ZS55PjEpc3dpdGNoKHRoaXMud3JhcFQpe2Nhc2UgRXM6ZS55PWUueS1NYXRoLmZsb29yKGUueSk7YnJlYWs7Y2FzZSB6dDplLnk9ZS55PDA/MDoxO2JyZWFrO2Nhc2UgQXM6TWF0aC5hYnMoTWF0aC5mbG9vcihlLnkpJTIpPT09MT9lLnk9TWF0aC5jZWlsKGUueSktZS55OmUueT1lLnktTWF0aC5mbG9vcihlLnkpO2JyZWFrfXJldHVybiB0aGlzLmZsaXBZJiYoZS55PTEtZS55KSxlfXNldCBuZWVkc1VwZGF0ZShlKXtlPT09ITAmJih0aGlzLnZlcnNpb24rKyx0aGlzLnNvdXJjZS5uZWVkc1VwZGF0ZT0hMCl9Z2V0IGVuY29kaW5nKCl7cmV0dXJuIEJzKCJUSFJFRS5UZXh0dXJlOiBQcm9wZXJ0eSAuZW5jb2RpbmcgaGFzIGJlZW4gcmVwbGFjZWQgYnkgLmNvbG9yU3BhY2UuIiksdGhpcy5jb2xvclNwYWNlPT09UHQ/Ymk6WmN9c2V0IGVuY29kaW5nKGUpe0JzKCJUSFJFRS5UZXh0dXJlOiBQcm9wZXJ0eSAuZW5jb2RpbmcgaGFzIGJlZW4gcmVwbGFjZWQgYnkgLmNvbG9yU3BhY2UuIiksdGhpcy5jb2xvclNwYWNlPWU9PT1iaT9QdDpnbn19RXQuREVGQVVMVF9JTUFHRT1udWxsLEV0LkRFRkFVTFRfTUFQUElORz1GYSxFdC5ERUZBVUxUX0FOSVNPVFJPUFk9MTtjbGFzcyBsdHtjb25zdHJ1Y3RvcihlPTAsdD0wLG49MCxpPTEpe2x0LnByb3RvdHlwZS5pc1ZlY3RvcjQ9ITAsdGhpcy54PWUsdGhpcy55PXQsdGhpcy56PW4sdGhpcy53PWl9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMuen1zZXQgd2lkdGgoZSl7dGhpcy56PWV9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnd9c2V0IGhlaWdodChlKXt0aGlzLnc9ZX1zZXQoZSx0LG4saSl7cmV0dXJuIHRoaXMueD1lLHRoaXMueT10LHRoaXMuej1uLHRoaXMudz1pLHRoaXN9c2V0U2NhbGFyKGUpe3JldHVybiB0aGlzLng9ZSx0aGlzLnk9ZSx0aGlzLno9ZSx0aGlzLnc9ZSx0aGlzfXNldFgoZSl7cmV0dXJuIHRoaXMueD1lLHRoaXN9c2V0WShlKXtyZXR1cm4gdGhpcy55PWUsdGhpc31zZXRaKGUpe3JldHVybiB0aGlzLno9ZSx0aGlzfXNldFcoZSl7cmV0dXJuIHRoaXMudz1lLHRoaXN9c2V0Q29tcG9uZW50KGUsdCl7c3dpdGNoKGUpe2Nhc2UgMDp0aGlzLng9dDticmVhaztjYXNlIDE6dGhpcy55PXQ7YnJlYWs7Y2FzZSAyOnRoaXMuej10O2JyZWFrO2Nhc2UgMzp0aGlzLnc9dDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2UpfXJldHVybiB0aGlzfWdldENvbXBvbmVudChlKXtzd2l0Y2goZSl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7Y2FzZSAzOnJldHVybiB0aGlzLnc7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIitlKX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnosdGhpcy53KX1jb3B5KGUpe3JldHVybiB0aGlzLng9ZS54LHRoaXMueT1lLnksdGhpcy56PWUueix0aGlzLnc9ZS53IT09dm9pZCAwP2UudzoxLHRoaXN9YWRkKGUpe3JldHVybiB0aGlzLngrPWUueCx0aGlzLnkrPWUueSx0aGlzLnorPWUueix0aGlzLncrPWUudyx0aGlzfWFkZFNjYWxhcihlKXtyZXR1cm4gdGhpcy54Kz1lLHRoaXMueSs9ZSx0aGlzLnorPWUsdGhpcy53Kz1lLHRoaXN9YWRkVmVjdG9ycyhlLHQpe3JldHVybiB0aGlzLng9ZS54K3QueCx0aGlzLnk9ZS55K3QueSx0aGlzLno9ZS56K3Queix0aGlzLnc9ZS53K3Qudyx0aGlzfWFkZFNjYWxlZFZlY3RvcihlLHQpe3JldHVybiB0aGlzLngrPWUueCp0LHRoaXMueSs9ZS55KnQsdGhpcy56Kz1lLnoqdCx0aGlzLncrPWUudyp0LHRoaXN9c3ViKGUpe3JldHVybiB0aGlzLngtPWUueCx0aGlzLnktPWUueSx0aGlzLnotPWUueix0aGlzLnctPWUudyx0aGlzfXN1YlNjYWxhcihlKXtyZXR1cm4gdGhpcy54LT1lLHRoaXMueS09ZSx0aGlzLnotPWUsdGhpcy53LT1lLHRoaXN9c3ViVmVjdG9ycyhlLHQpe3JldHVybiB0aGlzLng9ZS54LXQueCx0aGlzLnk9ZS55LXQueSx0aGlzLno9ZS56LXQueix0aGlzLnc9ZS53LXQudyx0aGlzfW11bHRpcGx5KGUpe3JldHVybiB0aGlzLngqPWUueCx0aGlzLnkqPWUueSx0aGlzLnoqPWUueix0aGlzLncqPWUudyx0aGlzfW11bHRpcGx5U2NhbGFyKGUpe3JldHVybiB0aGlzLngqPWUsdGhpcy55Kj1lLHRoaXMueio9ZSx0aGlzLncqPWUsdGhpc31hcHBseU1hdHJpeDQoZSl7Y29uc3QgdD10aGlzLngsbj10aGlzLnksaT10aGlzLnoscz10aGlzLncsYT1lLmVsZW1lbnRzO3JldHVybiB0aGlzLng9YVswXSp0K2FbNF0qbithWzhdKmkrYVsxMl0qcyx0aGlzLnk9YVsxXSp0K2FbNV0qbithWzldKmkrYVsxM10qcyx0aGlzLno9YVsyXSp0K2FbNl0qbithWzEwXSppK2FbMTRdKnMsdGhpcy53PWFbM10qdCthWzddKm4rYVsxMV0qaSthWzE1XSpzLHRoaXN9ZGl2aWRlU2NhbGFyKGUpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvZSl9c2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb24oZSl7dGhpcy53PTIqTWF0aC5hY29zKGUudyk7Y29uc3QgdD1NYXRoLnNxcnQoMS1lLncqZS53KTtyZXR1cm4gdDwxZS00Pyh0aGlzLng9MSx0aGlzLnk9MCx0aGlzLno9MCk6KHRoaXMueD1lLngvdCx0aGlzLnk9ZS55L3QsdGhpcy56PWUuei90KSx0aGlzfXNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeChlKXtsZXQgdCxuLGkscztjb25zdCBsPWUuZWxlbWVudHMsYz1sWzBdLGg9bFs0XSx1PWxbOF0sZj1sWzFdLGQ9bFs1XSxwPWxbOV0sXz1sWzJdLGc9bFs2XSxtPWxbMTBdO2lmKE1hdGguYWJzKGgtZik8LjAxJiZNYXRoLmFicyh1LV8pPC4wMSYmTWF0aC5hYnMocC1nKTwuMDEpe2lmKE1hdGguYWJzKGgrZik8LjEmJk1hdGguYWJzKHUrXyk8LjEmJk1hdGguYWJzKHArZyk8LjEmJk1hdGguYWJzKGMrZCttLTMpPC4xKXJldHVybiB0aGlzLnNldCgxLDAsMCwwKSx0aGlzO3Q9TWF0aC5QSTtjb25zdCB4PShjKzEpLzIsdj0oZCsxKS8yLFM9KG0rMSkvMixiPShoK2YpLzQsQT0odStfKS80LEw9KHArZykvNDtyZXR1cm4geD52JiZ4PlM/eDwuMDE/KG49MCxpPS43MDcxMDY3ODEscz0uNzA3MTA2NzgxKToobj1NYXRoLnNxcnQoeCksaT1iL24scz1BL24pOnY+Uz92PC4wMT8obj0uNzA3MTA2NzgxLGk9MCxzPS43MDcxMDY3ODEpOihpPU1hdGguc3FydCh2KSxuPWIvaSxzPUwvaSk6UzwuMDE/KG49LjcwNzEwNjc4MSxpPS43MDcxMDY3ODEscz0wKToocz1NYXRoLnNxcnQoUyksbj1BL3MsaT1ML3MpLHRoaXMuc2V0KG4saSxzLHQpLHRoaXN9bGV0IHk9TWF0aC5zcXJ0KChnLXApKihnLXApKyh1LV8pKih1LV8pKyhmLWgpKihmLWgpKTtyZXR1cm4gTWF0aC5hYnMoeSk8LjAwMSYmKHk9MSksdGhpcy54PShnLXApL3ksdGhpcy55PSh1LV8pL3ksdGhpcy56PShmLWgpL3ksdGhpcy53PU1hdGguYWNvcygoYytkK20tMSkvMiksdGhpc31taW4oZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsZS54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LGUueSksdGhpcy56PU1hdGgubWluKHRoaXMueixlLnopLHRoaXMudz1NYXRoLm1pbih0aGlzLncsZS53KSx0aGlzfW1heChlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCxlLngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksZS55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LGUueiksdGhpcy53PU1hdGgubWF4KHRoaXMudyxlLncpLHRoaXN9Y2xhbXAoZSx0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KGUueCxNYXRoLm1pbih0LngsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KGUueSxNYXRoLm1pbih0LnksdGhpcy55KSksdGhpcy56PU1hdGgubWF4KGUueixNYXRoLm1pbih0LnosdGhpcy56KSksdGhpcy53PU1hdGgubWF4KGUudyxNYXRoLm1pbih0LncsdGhpcy53KSksdGhpc31jbGFtcFNjYWxhcihlLHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgoZSxNYXRoLm1pbih0LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heChlLE1hdGgubWluKHQsdGhpcy55KSksdGhpcy56PU1hdGgubWF4KGUsTWF0aC5taW4odCx0aGlzLnopKSx0aGlzLnc9TWF0aC5tYXgoZSxNYXRoLm1pbih0LHRoaXMudykpLHRoaXN9Y2xhbXBMZW5ndGgoZSx0KXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KGUsTWF0aC5taW4odCxuKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXMudz1NYXRoLmZsb29yKHRoaXMudyksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpcy56PU1hdGguY2VpbCh0aGlzLnopLHRoaXMudz1NYXRoLmNlaWwodGhpcy53KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXMudz1NYXRoLnJvdW5kKHRoaXMudyksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9TWF0aC50cnVuYyh0aGlzLngpLHRoaXMueT1NYXRoLnRydW5jKHRoaXMueSksdGhpcy56PU1hdGgudHJ1bmModGhpcy56KSx0aGlzLnc9TWF0aC50cnVuYyh0aGlzLncpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXMuej0tdGhpcy56LHRoaXMudz0tdGhpcy53LHRoaXN9ZG90KGUpe3JldHVybiB0aGlzLngqZS54K3RoaXMueSplLnkrdGhpcy56KmUueit0aGlzLncqZS53fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLnd9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53KX1tYW5oYXR0YW5MZW5ndGgoKXtyZXR1cm4gTWF0aC5hYnModGhpcy54KStNYXRoLmFicyh0aGlzLnkpK01hdGguYWJzKHRoaXMueikrTWF0aC5hYnModGhpcy53KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGUpfWxlcnAoZSx0KXtyZXR1cm4gdGhpcy54Kz0oZS54LXRoaXMueCkqdCx0aGlzLnkrPShlLnktdGhpcy55KSp0LHRoaXMueis9KGUuei10aGlzLnopKnQsdGhpcy53Kz0oZS53LXRoaXMudykqdCx0aGlzfWxlcnBWZWN0b3JzKGUsdCxuKXtyZXR1cm4gdGhpcy54PWUueCsodC54LWUueCkqbix0aGlzLnk9ZS55Kyh0LnktZS55KSpuLHRoaXMuej1lLnorKHQuei1lLnopKm4sdGhpcy53PWUudysodC53LWUudykqbix0aGlzfWVxdWFscyhlKXtyZXR1cm4gZS54PT09dGhpcy54JiZlLnk9PT10aGlzLnkmJmUuej09PXRoaXMueiYmZS53PT09dGhpcy53fWZyb21BcnJheShlLHQ9MCl7cmV0dXJuIHRoaXMueD1lW3RdLHRoaXMueT1lW3QrMV0sdGhpcy56PWVbdCsyXSx0aGlzLnc9ZVt0KzNdLHRoaXN9dG9BcnJheShlPVtdLHQ9MCl7cmV0dXJuIGVbdF09dGhpcy54LGVbdCsxXT10aGlzLnksZVt0KzJdPXRoaXMueixlW3QrM109dGhpcy53LGV9ZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQpe3JldHVybiB0aGlzLng9ZS5nZXRYKHQpLHRoaXMueT1lLmdldFkodCksdGhpcy56PWUuZ2V0Wih0KSx0aGlzLnc9ZS5nZXRXKHQpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXMudz1NYXRoLnJhbmRvbSgpLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnoseWllbGQgdGhpcy53fX1jbGFzcyBSZCBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKGU9MSx0PTEsbj17fSl7c3VwZXIoKSx0aGlzLmlzUmVuZGVyVGFyZ2V0PSEwLHRoaXMud2lkdGg9ZSx0aGlzLmhlaWdodD10LHRoaXMuZGVwdGg9MSx0aGlzLnNjaXNzb3I9bmV3IGx0KDAsMCxlLHQpLHRoaXMuc2Npc3NvclRlc3Q9ITEsdGhpcy52aWV3cG9ydD1uZXcgbHQoMCwwLGUsdCk7Y29uc3QgaT17d2lkdGg6ZSxoZWlnaHQ6dCxkZXB0aDoxfTtuLmVuY29kaW5nIT09dm9pZCAwJiYoQnMoIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiBvcHRpb24uZW5jb2RpbmcgaGFzIGJlZW4gcmVwbGFjZWQgYnkgb3B0aW9uLmNvbG9yU3BhY2UuIiksbi5jb2xvclNwYWNlPW4uZW5jb2Rpbmc9PT1iaT9QdDpnbiksbj1PYmplY3QuYXNzaWduKHtnZW5lcmF0ZU1pcG1hcHM6ITEsaW50ZXJuYWxGb3JtYXQ6bnVsbCxtaW5GaWx0ZXI6d3QsZGVwdGhCdWZmZXI6ITAsc3RlbmNpbEJ1ZmZlcjohMSxkZXB0aFRleHR1cmU6bnVsbCxzYW1wbGVzOjB9LG4pLHRoaXMudGV4dHVyZT1uZXcgRXQoaSxuLm1hcHBpbmcsbi53cmFwUyxuLndyYXBULG4ubWFnRmlsdGVyLG4ubWluRmlsdGVyLG4uZm9ybWF0LG4udHlwZSxuLmFuaXNvdHJvcHksbi5jb2xvclNwYWNlKSx0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwLHRoaXMudGV4dHVyZS5mbGlwWT0hMSx0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPW4uZ2VuZXJhdGVNaXBtYXBzLHRoaXMudGV4dHVyZS5pbnRlcm5hbEZvcm1hdD1uLmludGVybmFsRm9ybWF0LHRoaXMuZGVwdGhCdWZmZXI9bi5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9bi5zdGVuY2lsQnVmZmVyLHRoaXMuZGVwdGhUZXh0dXJlPW4uZGVwdGhUZXh0dXJlLHRoaXMuc2FtcGxlcz1uLnNhbXBsZXN9c2V0U2l6ZShlLHQsbj0xKXsodGhpcy53aWR0aCE9PWV8fHRoaXMuaGVpZ2h0IT09dHx8dGhpcy5kZXB0aCE9PW4pJiYodGhpcy53aWR0aD1lLHRoaXMuaGVpZ2h0PXQsdGhpcy5kZXB0aD1uLHRoaXMudGV4dHVyZS5pbWFnZS53aWR0aD1lLHRoaXMudGV4dHVyZS5pbWFnZS5oZWlnaHQ9dCx0aGlzLnRleHR1cmUuaW1hZ2UuZGVwdGg9bix0aGlzLmRpc3Bvc2UoKSksdGhpcy52aWV3cG9ydC5zZXQoMCwwLGUsdCksdGhpcy5zY2lzc29yLnNldCgwLDAsZSx0KX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weShlKXt0aGlzLndpZHRoPWUud2lkdGgsdGhpcy5oZWlnaHQ9ZS5oZWlnaHQsdGhpcy5kZXB0aD1lLmRlcHRoLHRoaXMuc2Npc3Nvci5jb3B5KGUuc2Npc3NvciksdGhpcy5zY2lzc29yVGVzdD1lLnNjaXNzb3JUZXN0LHRoaXMudmlld3BvcnQuY29weShlLnZpZXdwb3J0KSx0aGlzLnRleHR1cmU9ZS50ZXh0dXJlLmNsb25lKCksdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMDtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZS50ZXh0dXJlLmltYWdlKTtyZXR1cm4gdGhpcy50ZXh0dXJlLnNvdXJjZT1uZXcgV2kodCksdGhpcy5kZXB0aEJ1ZmZlcj1lLmRlcHRoQnVmZmVyLHRoaXMuc3RlbmNpbEJ1ZmZlcj1lLnN0ZW5jaWxCdWZmZXIsZS5kZXB0aFRleHR1cmUhPT1udWxsJiYodGhpcy5kZXB0aFRleHR1cmU9ZS5kZXB0aFRleHR1cmUuY2xvbmUoKSksdGhpcy5zYW1wbGVzPWUuc2FtcGxlcyx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNsYXNzIExuIGV4dGVuZHMgUmR7Y29uc3RydWN0b3IoZT0xLHQ9MSxuPXt9KXtzdXBlcihlLHQsbiksdGhpcy5pc1dlYkdMUmVuZGVyVGFyZ2V0PSEwfX1jbGFzcyBKYSBleHRlbmRzIEV0e2NvbnN0cnVjdG9yKGU9bnVsbCx0PTEsbj0xLGk9MSl7c3VwZXIobnVsbCksdGhpcy5pc0RhdGFBcnJheVRleHR1cmU9ITAsdGhpcy5pbWFnZT17ZGF0YTplLHdpZHRoOnQsaGVpZ2h0Om4sZGVwdGg6aX0sdGhpcy5tYWdGaWx0ZXI9YnQsdGhpcy5taW5GaWx0ZXI9YnQsdGhpcy53cmFwUj16dCx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLmZsaXBZPSExLHRoaXMudW5wYWNrQWxpZ25tZW50PTF9fWNsYXNzIHJ4IGV4dGVuZHMgTG57Y29uc3RydWN0b3IoZT0xLHQ9MSxuPTEsaT17fSl7c3VwZXIoZSx0LGkpLHRoaXMuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0PSEwLHRoaXMuZGVwdGg9bix0aGlzLnRleHR1cmU9bmV3IEphKG51bGwsZSx0LG4pLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITB9fWNsYXNzIHNoIGV4dGVuZHMgRXR7Y29uc3RydWN0b3IoZT1udWxsLHQ9MSxuPTEsaT0xKXtzdXBlcihudWxsKSx0aGlzLmlzRGF0YTNEVGV4dHVyZT0hMCx0aGlzLmltYWdlPXtkYXRhOmUsd2lkdGg6dCxoZWlnaHQ6bixkZXB0aDppfSx0aGlzLm1hZ0ZpbHRlcj1idCx0aGlzLm1pbkZpbHRlcj1idCx0aGlzLndyYXBSPXp0LHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MX19Y2xhc3Mgc3ggZXh0ZW5kcyBMbntjb25zdHJ1Y3RvcihlPTEsdD0xLG49MSxpPXt9KXtzdXBlcihlLHQsaSksdGhpcy5pc1dlYkdMM0RSZW5kZXJUYXJnZXQ9ITAsdGhpcy5kZXB0aD1uLHRoaXMudGV4dHVyZT1uZXcgc2gobnVsbCxlLHQsbiksdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMH19Y2xhc3MgYXggZXh0ZW5kcyBMbntjb25zdHJ1Y3RvcihlPTEsdD0xLG49MSxpPXt9KXtzdXBlcihlLHQsaSksdGhpcy5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzPSEwO2NvbnN0IHM9dGhpcy50ZXh0dXJlO3RoaXMudGV4dHVyZT1bXTtmb3IobGV0IGE9MDthPG47YSsrKXRoaXMudGV4dHVyZVthXT1zLmNsb25lKCksdGhpcy50ZXh0dXJlW2FdLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMH1zZXRTaXplKGUsdCxuPTEpe2lmKHRoaXMud2lkdGghPT1lfHx0aGlzLmhlaWdodCE9PXR8fHRoaXMuZGVwdGghPT1uKXt0aGlzLndpZHRoPWUsdGhpcy5oZWlnaHQ9dCx0aGlzLmRlcHRoPW47Zm9yKGxldCBpPTAscz10aGlzLnRleHR1cmUubGVuZ3RoO2k8cztpKyspdGhpcy50ZXh0dXJlW2ldLmltYWdlLndpZHRoPWUsdGhpcy50ZXh0dXJlW2ldLmltYWdlLmhlaWdodD10LHRoaXMudGV4dHVyZVtpXS5pbWFnZS5kZXB0aD1uO3RoaXMuZGlzcG9zZSgpfXRoaXMudmlld3BvcnQuc2V0KDAsMCxlLHQpLHRoaXMuc2Npc3Nvci5zZXQoMCwwLGUsdCl9Y29weShlKXt0aGlzLmRpc3Bvc2UoKSx0aGlzLndpZHRoPWUud2lkdGgsdGhpcy5oZWlnaHQ9ZS5oZWlnaHQsdGhpcy5kZXB0aD1lLmRlcHRoLHRoaXMuc2Npc3Nvci5jb3B5KGUuc2Npc3NvciksdGhpcy5zY2lzc29yVGVzdD1lLnNjaXNzb3JUZXN0LHRoaXMudmlld3BvcnQuY29weShlLnZpZXdwb3J0KSx0aGlzLmRlcHRoQnVmZmVyPWUuZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPWUuc3RlbmNpbEJ1ZmZlcixlLmRlcHRoVGV4dHVyZSE9PW51bGwmJih0aGlzLmRlcHRoVGV4dHVyZT1lLmRlcHRoVGV4dHVyZS5jbG9uZSgpKSx0aGlzLnRleHR1cmUubGVuZ3RoPTA7Zm9yKGxldCB0PTAsbj1lLnRleHR1cmUubGVuZ3RoO3Q8bjt0KyspdGhpcy50ZXh0dXJlW3RdPWUudGV4dHVyZVt0XS5jbG9uZSgpLHRoaXMudGV4dHVyZVt0XS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITA7cmV0dXJuIHRoaXN9fWNsYXNzIGxue2NvbnN0cnVjdG9yKGU9MCx0PTAsbj0wLGk9MSl7dGhpcy5pc1F1YXRlcm5pb249ITAsdGhpcy5feD1lLHRoaXMuX3k9dCx0aGlzLl96PW4sdGhpcy5fdz1pfXN0YXRpYyBzbGVycEZsYXQoZSx0LG4saSxzLGEsbyl7bGV0IGw9bltpKzBdLGM9bltpKzFdLGg9bltpKzJdLHU9bltpKzNdO2NvbnN0IGY9c1thKzBdLGQ9c1thKzFdLHA9c1thKzJdLF89c1thKzNdO2lmKG89PT0wKXtlW3QrMF09bCxlW3QrMV09YyxlW3QrMl09aCxlW3QrM109dTtyZXR1cm59aWYobz09PTEpe2VbdCswXT1mLGVbdCsxXT1kLGVbdCsyXT1wLGVbdCszXT1fO3JldHVybn1pZih1IT09X3x8bCE9PWZ8fGMhPT1kfHxoIT09cCl7bGV0IGc9MS1vO2NvbnN0IG09bCpmK2MqZCtoKnArdSpfLHk9bT49MD8xOi0xLHg9MS1tKm07aWYoeD5OdW1iZXIuRVBTSUxPTil7Y29uc3QgUz1NYXRoLnNxcnQoeCksYj1NYXRoLmF0YW4yKFMsbSp5KTtnPU1hdGguc2luKGcqYikvUyxvPU1hdGguc2luKG8qYikvU31jb25zdCB2PW8qeTtpZihsPWwqZytmKnYsYz1jKmcrZCp2LGg9aCpnK3Aqdix1PXUqZytfKnYsZz09PTEtbyl7Y29uc3QgUz0xL01hdGguc3FydChsKmwrYypjK2gqaCt1KnUpO2wqPVMsYyo9UyxoKj1TLHUqPVN9fWVbdF09bCxlW3QrMV09YyxlW3QrMl09aCxlW3QrM109dX1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQoZSx0LG4saSxzLGEpe2NvbnN0IG89bltpXSxsPW5baSsxXSxjPW5baSsyXSxoPW5baSszXSx1PXNbYV0sZj1zW2ErMV0sZD1zW2ErMl0scD1zW2ErM107cmV0dXJuIGVbdF09bypwK2gqdStsKmQtYypmLGVbdCsxXT1sKnAraCpmK2MqdS1vKmQsZVt0KzJdPWMqcCtoKmQrbypmLWwqdSxlW3QrM109aCpwLW8qdS1sKmYtYypkLGV9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeChlKXt0aGlzLl94PWUsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkoZSl7dGhpcy5feT1lLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KGUpe3RoaXMuX3o9ZSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyhlKXt0aGlzLl93PWUsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldChlLHQsbixpKXtyZXR1cm4gdGhpcy5feD1lLHRoaXMuX3k9dCx0aGlzLl96PW4sdGhpcy5fdz1pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkoZSl7cmV0dXJuIHRoaXMuX3g9ZS54LHRoaXMuX3k9ZS55LHRoaXMuX3o9ZS56LHRoaXMuX3c9ZS53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcihlLHQpe2NvbnN0IG49ZS5feCxpPWUuX3kscz1lLl96LGE9ZS5fb3JkZXIsbz1NYXRoLmNvcyxsPU1hdGguc2luLGM9byhuLzIpLGg9byhpLzIpLHU9byhzLzIpLGY9bChuLzIpLGQ9bChpLzIpLHA9bChzLzIpO3N3aXRjaChhKXtjYXNlIlhZWiI6dGhpcy5feD1mKmgqdStjKmQqcCx0aGlzLl95PWMqZCp1LWYqaCpwLHRoaXMuX3o9YypoKnArZipkKnUsdGhpcy5fdz1jKmgqdS1mKmQqcDticmVhaztjYXNlIllYWiI6dGhpcy5feD1mKmgqdStjKmQqcCx0aGlzLl95PWMqZCp1LWYqaCpwLHRoaXMuX3o9YypoKnAtZipkKnUsdGhpcy5fdz1jKmgqdStmKmQqcDticmVhaztjYXNlIlpYWSI6dGhpcy5feD1mKmgqdS1jKmQqcCx0aGlzLl95PWMqZCp1K2YqaCpwLHRoaXMuX3o9YypoKnArZipkKnUsdGhpcy5fdz1jKmgqdS1mKmQqcDticmVhaztjYXNlIlpZWCI6dGhpcy5feD1mKmgqdS1jKmQqcCx0aGlzLl95PWMqZCp1K2YqaCpwLHRoaXMuX3o9YypoKnAtZipkKnUsdGhpcy5fdz1jKmgqdStmKmQqcDticmVhaztjYXNlIllaWCI6dGhpcy5feD1mKmgqdStjKmQqcCx0aGlzLl95PWMqZCp1K2YqaCpwLHRoaXMuX3o9YypoKnAtZipkKnUsdGhpcy5fdz1jKmgqdS1mKmQqcDticmVhaztjYXNlIlhaWSI6dGhpcy5feD1mKmgqdS1jKmQqcCx0aGlzLl95PWMqZCp1LWYqaCpwLHRoaXMuX3o9YypoKnArZipkKnUsdGhpcy5fdz1jKmgqdStmKmQqcDticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrYSl9cmV0dXJuIHQhPT0hMSYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbUF4aXNBbmdsZShlLHQpe2NvbnN0IG49dC8yLGk9TWF0aC5zaW4obik7cmV0dXJuIHRoaXMuX3g9ZS54KmksdGhpcy5feT1lLnkqaSx0aGlzLl96PWUueippLHRoaXMuX3c9TWF0aC5jb3MobiksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KGUpe2NvbnN0IHQ9ZS5lbGVtZW50cyxuPXRbMF0saT10WzRdLHM9dFs4XSxhPXRbMV0sbz10WzVdLGw9dFs5XSxjPXRbMl0saD10WzZdLHU9dFsxMF0sZj1uK28rdTtpZihmPjApe2NvbnN0IGQ9LjUvTWF0aC5zcXJ0KGYrMSk7dGhpcy5fdz0uMjUvZCx0aGlzLl94PShoLWwpKmQsdGhpcy5feT0ocy1jKSpkLHRoaXMuX3o9KGEtaSkqZH1lbHNlIGlmKG4+byYmbj51KXtjb25zdCBkPTIqTWF0aC5zcXJ0KDErbi1vLXUpO3RoaXMuX3c9KGgtbCkvZCx0aGlzLl94PS4yNSpkLHRoaXMuX3k9KGkrYSkvZCx0aGlzLl96PShzK2MpL2R9ZWxzZSBpZihvPnUpe2NvbnN0IGQ9MipNYXRoLnNxcnQoMStvLW4tdSk7dGhpcy5fdz0ocy1jKS9kLHRoaXMuX3g9KGkrYSkvZCx0aGlzLl95PS4yNSpkLHRoaXMuX3o9KGwraCkvZH1lbHNle2NvbnN0IGQ9MipNYXRoLnNxcnQoMSt1LW4tbyk7dGhpcy5fdz0oYS1pKS9kLHRoaXMuX3g9KHMrYykvZCx0aGlzLl95PShsK2gpL2QsdGhpcy5fej0uMjUqZH1yZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVVuaXRWZWN0b3JzKGUsdCl7bGV0IG49ZS5kb3QodCkrMTtyZXR1cm4gbjxOdW1iZXIuRVBTSUxPTj8obj0wLE1hdGguYWJzKGUueCk+TWF0aC5hYnMoZS56KT8odGhpcy5feD0tZS55LHRoaXMuX3k9ZS54LHRoaXMuX3o9MCx0aGlzLl93PW4pOih0aGlzLl94PTAsdGhpcy5feT0tZS56LHRoaXMuX3o9ZS55LHRoaXMuX3c9bikpOih0aGlzLl94PWUueSp0LnotZS56KnQueSx0aGlzLl95PWUueip0LngtZS54KnQueix0aGlzLl96PWUueCp0LnktZS55KnQueCx0aGlzLl93PW4pLHRoaXMubm9ybWFsaXplKCl9YW5nbGVUbyhlKXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoX3QodGhpcy5kb3QoZSksLTEsMSkpKX1yb3RhdGVUb3dhcmRzKGUsdCl7Y29uc3Qgbj10aGlzLmFuZ2xlVG8oZSk7aWYobj09PTApcmV0dXJuIHRoaXM7Y29uc3QgaT1NYXRoLm1pbigxLHQvbik7cmV0dXJuIHRoaXMuc2xlcnAoZSxpKSx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDAsMCwwLDEpfWludmVydCgpe3JldHVybiB0aGlzLmNvbmp1Z2F0ZSgpfWNvbmp1Z2F0ZSgpe3JldHVybiB0aGlzLl94Kj0tMSx0aGlzLl95Kj0tMSx0aGlzLl96Kj0tMSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31kb3QoZSl7cmV0dXJuIHRoaXMuX3gqZS5feCt0aGlzLl95KmUuX3krdGhpcy5feiplLl96K3RoaXMuX3cqZS5fd31sZW5ndGhTcSgpe3JldHVybiB0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3d9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfW5vcm1hbGl6ZSgpe2xldCBlPXRoaXMubGVuZ3RoKCk7cmV0dXJuIGU9PT0wPyh0aGlzLl94PTAsdGhpcy5feT0wLHRoaXMuX3o9MCx0aGlzLl93PTEpOihlPTEvZSx0aGlzLl94PXRoaXMuX3gqZSx0aGlzLl95PXRoaXMuX3kqZSx0aGlzLl96PXRoaXMuX3oqZSx0aGlzLl93PXRoaXMuX3cqZSksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9bXVsdGlwbHkoZSl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0aGlzLGUpfXByZW11bHRpcGx5KGUpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoZSx0aGlzKX1tdWx0aXBseVF1YXRlcm5pb25zKGUsdCl7Y29uc3Qgbj1lLl94LGk9ZS5feSxzPWUuX3osYT1lLl93LG89dC5feCxsPXQuX3ksYz10Ll96LGg9dC5fdztyZXR1cm4gdGhpcy5feD1uKmgrYSpvK2kqYy1zKmwsdGhpcy5feT1pKmgrYSpsK3Mqby1uKmMsdGhpcy5fej1zKmgrYSpjK24qbC1pKm8sdGhpcy5fdz1hKmgtbipvLWkqbC1zKmMsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2xlcnAoZSx0KXtpZih0PT09MClyZXR1cm4gdGhpcztpZih0PT09MSlyZXR1cm4gdGhpcy5jb3B5KGUpO2NvbnN0IG49dGhpcy5feCxpPXRoaXMuX3kscz10aGlzLl96LGE9dGhpcy5fdztsZXQgbz1hKmUuX3crbiplLl94K2kqZS5feStzKmUuX3o7aWYobzwwPyh0aGlzLl93PS1lLl93LHRoaXMuX3g9LWUuX3gsdGhpcy5feT0tZS5feSx0aGlzLl96PS1lLl96LG89LW8pOnRoaXMuY29weShlKSxvPj0xKXJldHVybiB0aGlzLl93PWEsdGhpcy5feD1uLHRoaXMuX3k9aSx0aGlzLl96PXMsdGhpcztjb25zdCBsPTEtbypvO2lmKGw8PU51bWJlci5FUFNJTE9OKXtjb25zdCBkPTEtdDtyZXR1cm4gdGhpcy5fdz1kKmErdCp0aGlzLl93LHRoaXMuX3g9ZCpuK3QqdGhpcy5feCx0aGlzLl95PWQqaSt0KnRoaXMuX3ksdGhpcy5fej1kKnMrdCp0aGlzLl96LHRoaXMubm9ybWFsaXplKCksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y29uc3QgYz1NYXRoLnNxcnQobCksaD1NYXRoLmF0YW4yKGMsbyksdT1NYXRoLnNpbigoMS10KSpoKS9jLGY9TWF0aC5zaW4odCpoKS9jO3JldHVybiB0aGlzLl93PWEqdSt0aGlzLl93KmYsdGhpcy5feD1uKnUrdGhpcy5feCpmLHRoaXMuX3k9aSp1K3RoaXMuX3kqZix0aGlzLl96PXMqdSt0aGlzLl96KmYsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2xlcnBRdWF0ZXJuaW9ucyhlLHQsbil7cmV0dXJuIHRoaXMuY29weShlKS5zbGVycCh0LG4pfXJhbmRvbSgpe2NvbnN0IGU9TWF0aC5yYW5kb20oKSx0PU1hdGguc3FydCgxLWUpLG49TWF0aC5zcXJ0KGUpLGk9MipNYXRoLlBJKk1hdGgucmFuZG9tKCkscz0yKk1hdGguUEkqTWF0aC5yYW5kb20oKTtyZXR1cm4gdGhpcy5zZXQodCpNYXRoLmNvcyhpKSxuKk1hdGguc2luKHMpLG4qTWF0aC5jb3MocyksdCpNYXRoLnNpbihpKSl9ZXF1YWxzKGUpe3JldHVybiBlLl94PT09dGhpcy5feCYmZS5feT09PXRoaXMuX3kmJmUuX3o9PT10aGlzLl96JiZlLl93PT09dGhpcy5fd31mcm9tQXJyYXkoZSx0PTApe3JldHVybiB0aGlzLl94PWVbdF0sdGhpcy5feT1lW3QrMV0sdGhpcy5fej1lW3QrMl0sdGhpcy5fdz1lW3QrM10sdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9dG9BcnJheShlPVtdLHQ9MCl7cmV0dXJuIGVbdF09dGhpcy5feCxlW3QrMV09dGhpcy5feSxlW3QrMl09dGhpcy5feixlW3QrM109dGhpcy5fdyxlfWZyb21CdWZmZXJBdHRyaWJ1dGUoZSx0KXtyZXR1cm4gdGhpcy5feD1lLmdldFgodCksdGhpcy5feT1lLmdldFkodCksdGhpcy5fej1lLmdldFoodCksdGhpcy5fdz1lLmdldFcodCksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy50b0FycmF5KCl9X29uQ2hhbmdlKGUpe3JldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPWUsdGhpc31fb25DaGFuZ2VDYWxsYmFjaygpe30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLl94LHlpZWxkIHRoaXMuX3kseWllbGQgdGhpcy5feix5aWVsZCB0aGlzLl93fX1jbGFzcyBQe2NvbnN0cnVjdG9yKGU9MCx0PTAsbj0wKXtQLnByb3RvdHlwZS5pc1ZlY3RvcjM9ITAsdGhpcy54PWUsdGhpcy55PXQsdGhpcy56PW59c2V0KGUsdCxuKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49dGhpcy56KSx0aGlzLng9ZSx0aGlzLnk9dCx0aGlzLno9bix0aGlzfXNldFNjYWxhcihlKXtyZXR1cm4gdGhpcy54PWUsdGhpcy55PWUsdGhpcy56PWUsdGhpc31zZXRYKGUpe3JldHVybiB0aGlzLng9ZSx0aGlzfXNldFkoZSl7cmV0dXJuIHRoaXMueT1lLHRoaXN9c2V0WihlKXtyZXR1cm4gdGhpcy56PWUsdGhpc31zZXRDb21wb25lbnQoZSx0KXtzd2l0Y2goZSl7Y2FzZSAwOnRoaXMueD10O2JyZWFrO2Nhc2UgMTp0aGlzLnk9dDticmVhaztjYXNlIDI6dGhpcy56PXQ7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIitlKX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQoZSl7c3dpdGNoKGUpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrZSl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KGUpe3JldHVybiB0aGlzLng9ZS54LHRoaXMueT1lLnksdGhpcy56PWUueix0aGlzfWFkZChlKXtyZXR1cm4gdGhpcy54Kz1lLngsdGhpcy55Kz1lLnksdGhpcy56Kz1lLnosdGhpc31hZGRTY2FsYXIoZSl7cmV0dXJuIHRoaXMueCs9ZSx0aGlzLnkrPWUsdGhpcy56Kz1lLHRoaXN9YWRkVmVjdG9ycyhlLHQpe3JldHVybiB0aGlzLng9ZS54K3QueCx0aGlzLnk9ZS55K3QueSx0aGlzLno9ZS56K3Queix0aGlzfWFkZFNjYWxlZFZlY3RvcihlLHQpe3JldHVybiB0aGlzLngrPWUueCp0LHRoaXMueSs9ZS55KnQsdGhpcy56Kz1lLnoqdCx0aGlzfXN1YihlKXtyZXR1cm4gdGhpcy54LT1lLngsdGhpcy55LT1lLnksdGhpcy56LT1lLnosdGhpc31zdWJTY2FsYXIoZSl7cmV0dXJuIHRoaXMueC09ZSx0aGlzLnktPWUsdGhpcy56LT1lLHRoaXN9c3ViVmVjdG9ycyhlLHQpe3JldHVybiB0aGlzLng9ZS54LXQueCx0aGlzLnk9ZS55LXQueSx0aGlzLno9ZS56LXQueix0aGlzfW11bHRpcGx5KGUpe3JldHVybiB0aGlzLngqPWUueCx0aGlzLnkqPWUueSx0aGlzLnoqPWUueix0aGlzfW11bHRpcGx5U2NhbGFyKGUpe3JldHVybiB0aGlzLngqPWUsdGhpcy55Kj1lLHRoaXMueio9ZSx0aGlzfW11bHRpcGx5VmVjdG9ycyhlLHQpe3JldHVybiB0aGlzLng9ZS54KnQueCx0aGlzLnk9ZS55KnQueSx0aGlzLno9ZS56KnQueix0aGlzfWFwcGx5RXVsZXIoZSl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKFBkLnNldEZyb21FdWxlcihlKSl9YXBwbHlBeGlzQW5nbGUoZSx0KXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oUGQuc2V0RnJvbUF4aXNBbmdsZShlLHQpKX1hcHBseU1hdHJpeDMoZSl7Y29uc3QgdD10aGlzLngsbj10aGlzLnksaT10aGlzLnoscz1lLmVsZW1lbnRzO3JldHVybiB0aGlzLng9c1swXSp0K3NbM10qbitzWzZdKmksdGhpcy55PXNbMV0qdCtzWzRdKm4rc1s3XSppLHRoaXMuej1zWzJdKnQrc1s1XSpuK3NbOF0qaSx0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KGUpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4MyhlKS5ub3JtYWxpemUoKX1hcHBseU1hdHJpeDQoZSl7Y29uc3QgdD10aGlzLngsbj10aGlzLnksaT10aGlzLnoscz1lLmVsZW1lbnRzLGE9MS8oc1szXSp0K3NbN10qbitzWzExXSppK3NbMTVdKTtyZXR1cm4gdGhpcy54PShzWzBdKnQrc1s0XSpuK3NbOF0qaStzWzEyXSkqYSx0aGlzLnk9KHNbMV0qdCtzWzVdKm4rc1s5XSppK3NbMTNdKSphLHRoaXMuej0oc1syXSp0K3NbNl0qbitzWzEwXSppK3NbMTRdKSphLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKGUpe2NvbnN0IHQ9dGhpcy54LG49dGhpcy55LGk9dGhpcy56LHM9ZS54LGE9ZS55LG89ZS56LGw9ZS53LGM9MiooYSppLW8qbiksaD0yKihvKnQtcyppKSx1PTIqKHMqbi1hKnQpO3JldHVybiB0aGlzLng9dCtsKmMrYSp1LW8qaCx0aGlzLnk9bitsKmgrbypjLXMqdSx0aGlzLno9aStsKnUrcypoLWEqYyx0aGlzfXByb2plY3QoZSl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGUubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQoZS5wcm9qZWN0aW9uTWF0cml4KX11bnByb2plY3QoZSl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGUucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NChlLm1hdHJpeFdvcmxkKX10cmFuc2Zvcm1EaXJlY3Rpb24oZSl7Y29uc3QgdD10aGlzLngsbj10aGlzLnksaT10aGlzLnoscz1lLmVsZW1lbnRzO3JldHVybiB0aGlzLng9c1swXSp0K3NbNF0qbitzWzhdKmksdGhpcy55PXNbMV0qdCtzWzVdKm4rc1s5XSppLHRoaXMuej1zWzJdKnQrc1s2XSpuK3NbMTBdKmksdGhpcy5ub3JtYWxpemUoKX1kaXZpZGUoZSl7cmV0dXJuIHRoaXMueC89ZS54LHRoaXMueS89ZS55LHRoaXMuei89ZS56LHRoaXN9ZGl2aWRlU2NhbGFyKGUpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvZSl9bWluKGUpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LGUueCksdGhpcy55PU1hdGgubWluKHRoaXMueSxlLnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosZS56KSx0aGlzfW1heChlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCxlLngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksZS55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LGUueiksdGhpc31jbGFtcChlLHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgoZS54LE1hdGgubWluKHQueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgoZS55LE1hdGgubWluKHQueSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgoZS56LE1hdGgubWluKHQueix0aGlzLnopKSx0aGlzfWNsYW1wU2NhbGFyKGUsdCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heChlLE1hdGgubWluKHQsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KGUsTWF0aC5taW4odCx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgoZSxNYXRoLm1pbih0LHRoaXMueikpLHRoaXN9Y2xhbXBMZW5ndGgoZSx0KXtjb25zdCBuPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKG58fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KGUsTWF0aC5taW4odCxuKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PU1hdGgudHJ1bmModGhpcy54KSx0aGlzLnk9TWF0aC50cnVuYyh0aGlzLnkpLHRoaXMuej1NYXRoLnRydW5jKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QoZSl7cmV0dXJuIHRoaXMueCplLngrdGhpcy55KmUueSt0aGlzLnoqZS56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGUpfWxlcnAoZSx0KXtyZXR1cm4gdGhpcy54Kz0oZS54LXRoaXMueCkqdCx0aGlzLnkrPShlLnktdGhpcy55KSp0LHRoaXMueis9KGUuei10aGlzLnopKnQsdGhpc31sZXJwVmVjdG9ycyhlLHQsbil7cmV0dXJuIHRoaXMueD1lLngrKHQueC1lLngpKm4sdGhpcy55PWUueSsodC55LWUueSkqbix0aGlzLno9ZS56Kyh0LnotZS56KSpuLHRoaXN9Y3Jvc3MoZSl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsZSl9Y3Jvc3NWZWN0b3JzKGUsdCl7Y29uc3Qgbj1lLngsaT1lLnkscz1lLnosYT10Lngsbz10LnksbD10Lno7cmV0dXJuIHRoaXMueD1pKmwtcypvLHRoaXMueT1zKmEtbipsLHRoaXMuej1uKm8taSphLHRoaXN9cHJvamVjdE9uVmVjdG9yKGUpe2NvbnN0IHQ9ZS5sZW5ndGhTcSgpO2lmKHQ9PT0wKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3Qgbj1lLmRvdCh0aGlzKS90O3JldHVybiB0aGlzLmNvcHkoZSkubXVsdGlwbHlTY2FsYXIobil9cHJvamVjdE9uUGxhbmUoZSl7cmV0dXJuIGFoLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKGUpLHRoaXMuc3ViKGFoKX1yZWZsZWN0KGUpe3JldHVybiB0aGlzLnN1YihhaC5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QoZSkpKX1hbmdsZVRvKGUpe2NvbnN0IHQ9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSplLmxlbmd0aFNxKCkpO2lmKHQ9PT0wKXJldHVybiBNYXRoLlBJLzI7Y29uc3Qgbj10aGlzLmRvdChlKS90O3JldHVybiBNYXRoLmFjb3MoX3QobiwtMSwxKSl9ZGlzdGFuY2VUbyhlKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoZSkpfWRpc3RhbmNlVG9TcXVhcmVkKGUpe2NvbnN0IHQ9dGhpcy54LWUueCxuPXRoaXMueS1lLnksaT10aGlzLnotZS56O3JldHVybiB0KnQrbipuK2kqaX1tYW5oYXR0YW5EaXN0YW5jZVRvKGUpe3JldHVybiBNYXRoLmFicyh0aGlzLngtZS54KStNYXRoLmFicyh0aGlzLnktZS55KStNYXRoLmFicyh0aGlzLnotZS56KX1zZXRGcm9tU3BoZXJpY2FsKGUpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHMoZS5yYWRpdXMsZS5waGksZS50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3JkcyhlLHQsbil7Y29uc3QgaT1NYXRoLnNpbih0KSplO3JldHVybiB0aGlzLng9aSpNYXRoLnNpbihuKSx0aGlzLnk9TWF0aC5jb3ModCkqZSx0aGlzLno9aSpNYXRoLmNvcyhuKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbChlKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoZS5yYWRpdXMsZS50aGV0YSxlLnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3JkcyhlLHQsbil7cmV0dXJuIHRoaXMueD1lKk1hdGguc2luKHQpLHRoaXMueT1uLHRoaXMuej1lKk1hdGguY29zKHQpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUpe2NvbnN0IHQ9ZS5lbGVtZW50cztyZXR1cm4gdGhpcy54PXRbMTJdLHRoaXMueT10WzEzXSx0aGlzLno9dFsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUoZSl7Y29uc3QgdD10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oZSwwKS5sZW5ndGgoKSxuPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihlLDEpLmxlbmd0aCgpLGk9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGUsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD10LHRoaXMueT1uLHRoaXMuej1pLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbihlLHQpe3JldHVybiB0aGlzLmZyb21BcnJheShlLmVsZW1lbnRzLHQqNCl9c2V0RnJvbU1hdHJpeDNDb2x1bW4oZSx0KXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkoZS5lbGVtZW50cyx0KjMpfXNldEZyb21FdWxlcihlKXtyZXR1cm4gdGhpcy54PWUuX3gsdGhpcy55PWUuX3ksdGhpcy56PWUuX3osdGhpc31zZXRGcm9tQ29sb3IoZSl7cmV0dXJuIHRoaXMueD1lLnIsdGhpcy55PWUuZyx0aGlzLno9ZS5iLHRoaXN9ZXF1YWxzKGUpe3JldHVybiBlLng9PT10aGlzLngmJmUueT09PXRoaXMueSYmZS56PT09dGhpcy56fWZyb21BcnJheShlLHQ9MCl7cmV0dXJuIHRoaXMueD1lW3RdLHRoaXMueT1lW3QrMV0sdGhpcy56PWVbdCsyXSx0aGlzfXRvQXJyYXkoZT1bXSx0PTApe3JldHVybiBlW3RdPXRoaXMueCxlW3QrMV09dGhpcy55LGVbdCsyXT10aGlzLnosZX1mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCl7cmV0dXJuIHRoaXMueD1lLmdldFgodCksdGhpcy55PWUuZ2V0WSh0KSx0aGlzLno9ZS5nZXRaKHQpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9cmFuZG9tRGlyZWN0aW9uKCl7Y29uc3QgZT0oTWF0aC5yYW5kb20oKS0uNSkqMix0PU1hdGgucmFuZG9tKCkqTWF0aC5QSSoyLG49TWF0aC5zcXJ0KDEteHMoZSwyKSk7cmV0dXJuIHRoaXMueD1uKk1hdGguY29zKHQpLHRoaXMueT1uKk1hdGguc2luKHQpLHRoaXMuej1lLHRoaXN9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy54LHlpZWxkIHRoaXMueSx5aWVsZCB0aGlzLnp9fWNvbnN0IGFoPW5ldyBQLFBkPW5ldyBsbjtjbGFzcyBEdHtjb25zdHJ1Y3RvcihlPW5ldyBQKDEvMCwxLzAsMS8wKSx0PW5ldyBQKC0xLzAsLTEvMCwtMS8wKSl7dGhpcy5pc0JveDM9ITAsdGhpcy5taW49ZSx0aGlzLm1heD10fXNldChlLHQpe3JldHVybiB0aGlzLm1pbi5jb3B5KGUpLHRoaXMubWF4LmNvcHkodCksdGhpc31zZXRGcm9tQXJyYXkoZSl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IHQ9MCxuPWUubGVuZ3RoO3Q8bjt0Kz0zKXRoaXMuZXhwYW5kQnlQb2ludChJbi5mcm9tQXJyYXkoZSx0KSk7cmV0dXJuIHRoaXN9c2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShlKXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgdD0wLG49ZS5jb3VudDt0PG47dCsrKXRoaXMuZXhwYW5kQnlQb2ludChJbi5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCkpO3JldHVybiB0aGlzfXNldEZyb21Qb2ludHMoZSl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspdGhpcy5leHBhbmRCeVBvaW50KGVbdF0pO3JldHVybiB0aGlzfXNldEZyb21DZW50ZXJBbmRTaXplKGUsdCl7Y29uc3Qgbj1Jbi5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKC41KTtyZXR1cm4gdGhpcy5taW4uY29weShlKS5zdWIobiksdGhpcy5tYXguY29weShlKS5hZGQobiksdGhpc31zZXRGcm9tT2JqZWN0KGUsdD0hMSl7cmV0dXJuIHRoaXMubWFrZUVtcHR5KCksdGhpcy5leHBhbmRCeU9iamVjdChlLHQpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KGUubWluKSx0aGlzLm1heC5jb3B5KGUubWF4KSx0aGlzfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLm1pbi54PXRoaXMubWluLnk9dGhpcy5taW4uej0xLzAsdGhpcy5tYXgueD10aGlzLm1heC55PXRoaXMubWF4Lno9LTEvMCx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl8fHRoaXMubWF4Lno8dGhpcy5taW4uen1nZXRDZW50ZXIoZSl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Uuc2V0KDAsMCwwKTplLmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX1nZXRTaXplKGUpe3JldHVybiB0aGlzLmlzRW1wdHkoKT9lLnNldCgwLDAsMCk6ZS5zdWJWZWN0b3JzKHRoaXMubWF4LHRoaXMubWluKX1leHBhbmRCeVBvaW50KGUpe3JldHVybiB0aGlzLm1pbi5taW4oZSksdGhpcy5tYXgubWF4KGUpLHRoaXN9ZXhwYW5kQnlWZWN0b3IoZSl7cmV0dXJuIHRoaXMubWluLnN1YihlKSx0aGlzLm1heC5hZGQoZSksdGhpc31leHBhbmRCeVNjYWxhcihlKXtyZXR1cm4gdGhpcy5taW4uYWRkU2NhbGFyKC1lKSx0aGlzLm1heC5hZGRTY2FsYXIoZSksdGhpc31leHBhbmRCeU9iamVjdChlLHQ9ITEpe2UudXBkYXRlV29ybGRNYXRyaXgoITEsITEpO2NvbnN0IG49ZS5nZW9tZXRyeTtpZihuIT09dm9pZCAwKXtjb25zdCBzPW4uZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKHQ9PT0hMCYmcyE9PXZvaWQgMCYmZS5pc0luc3RhbmNlZE1lc2ghPT0hMClmb3IobGV0IGE9MCxvPXMuY291bnQ7YTxvO2ErKyllLmlzTWVzaD09PSEwP2UuZ2V0VmVydGV4UG9zaXRpb24oYSxJbik6SW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGEpLEluLmFwcGx5TWF0cml4NChlLm1hdHJpeFdvcmxkKSx0aGlzLmV4cGFuZEJ5UG9pbnQoSW4pO2Vsc2UgZS5ib3VuZGluZ0JveCE9PXZvaWQgMD8oZS5ib3VuZGluZ0JveD09PW51bGwmJmUuY29tcHV0ZUJvdW5kaW5nQm94KCksS2EuY29weShlLmJvdW5kaW5nQm94KSk6KG4uYm91bmRpbmdCb3g9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ0JveCgpLEthLmNvcHkobi5ib3VuZGluZ0JveCkpLEthLmFwcGx5TWF0cml4NChlLm1hdHJpeFdvcmxkKSx0aGlzLnVuaW9uKEthKX1jb25zdCBpPWUuY2hpbGRyZW47Zm9yKGxldCBzPTAsYT1pLmxlbmd0aDtzPGE7cysrKXRoaXMuZXhwYW5kQnlPYmplY3QoaVtzXSx0KTtyZXR1cm4gdGhpc31jb250YWluc1BvaW50KGUpe3JldHVybiEoZS54PHRoaXMubWluLnh8fGUueD50aGlzLm1heC54fHxlLnk8dGhpcy5taW4ueXx8ZS55PnRoaXMubWF4Lnl8fGUuejx0aGlzLm1pbi56fHxlLno+dGhpcy5tYXgueil9Y29udGFpbnNCb3goZSl7cmV0dXJuIHRoaXMubWluLng8PWUubWluLngmJmUubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PWUubWluLnkmJmUubWF4Lnk8PXRoaXMubWF4LnkmJnRoaXMubWluLno8PWUubWluLnomJmUubWF4Lno8PXRoaXMubWF4Lnp9Z2V0UGFyYW1ldGVyKGUsdCl7cmV0dXJuIHQuc2V0KChlLngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKGUueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSwoZS56LXRoaXMubWluLnopLyh0aGlzLm1heC56LXRoaXMubWluLnopKX1pbnRlcnNlY3RzQm94KGUpe3JldHVybiEoZS5tYXgueDx0aGlzLm1pbi54fHxlLm1pbi54PnRoaXMubWF4Lnh8fGUubWF4Lnk8dGhpcy5taW4ueXx8ZS5taW4ueT50aGlzLm1heC55fHxlLm1heC56PHRoaXMubWluLnp8fGUubWluLno+dGhpcy5tYXgueil9aW50ZXJzZWN0c1NwaGVyZShlKXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KGUuY2VudGVyLEluKSxJbi5kaXN0YW5jZVRvU3F1YXJlZChlLmNlbnRlcik8PWUucmFkaXVzKmUucmFkaXVzfWludGVyc2VjdHNQbGFuZShlKXtsZXQgdCxuO3JldHVybiBlLm5vcm1hbC54PjA/KHQ9ZS5ub3JtYWwueCp0aGlzLm1pbi54LG49ZS5ub3JtYWwueCp0aGlzLm1heC54KToodD1lLm5vcm1hbC54KnRoaXMubWF4Lngsbj1lLm5vcm1hbC54KnRoaXMubWluLngpLGUubm9ybWFsLnk+MD8odCs9ZS5ub3JtYWwueSp0aGlzLm1pbi55LG4rPWUubm9ybWFsLnkqdGhpcy5tYXgueSk6KHQrPWUubm9ybWFsLnkqdGhpcy5tYXgueSxuKz1lLm5vcm1hbC55KnRoaXMubWluLnkpLGUubm9ybWFsLno+MD8odCs9ZS5ub3JtYWwueip0aGlzLm1pbi56LG4rPWUubm9ybWFsLnoqdGhpcy5tYXgueik6KHQrPWUubm9ybWFsLnoqdGhpcy5tYXgueixuKz1lLm5vcm1hbC56KnRoaXMubWluLnopLHQ8PS1lLmNvbnN0YW50JiZuPj0tZS5jb25zdGFudH1pbnRlcnNlY3RzVHJpYW5nbGUoZSl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuITE7dGhpcy5nZXRDZW50ZXIoenMpLFFhLnN1YlZlY3RvcnModGhpcy5tYXgsenMpLFByLnN1YlZlY3RvcnMoZS5hLHpzKSxMci5zdWJWZWN0b3JzKGUuYix6cyksSXIuc3ViVmVjdG9ycyhlLmMsenMpLEVpLnN1YlZlY3RvcnMoTHIsUHIpLEFpLnN1YlZlY3RvcnMoSXIsTHIpLFhpLnN1YlZlY3RvcnMoUHIsSXIpO2xldCB0PVswLC1FaS56LEVpLnksMCwtQWkueixBaS55LDAsLVhpLnosWGkueSxFaS56LDAsLUVpLngsQWkueiwwLC1BaS54LFhpLnosMCwtWGkueCwtRWkueSxFaS54LDAsLUFpLnksQWkueCwwLC1YaS55LFhpLngsMF07cmV0dXJuIW9oKHQsUHIsTHIsSXIsUWEpfHwodD1bMSwwLDAsMCwxLDAsMCwwLDFdLCFvaCh0LFByLExyLElyLFFhKSk/ITE6KGphLmNyb3NzVmVjdG9ycyhFaSxBaSksdD1bamEueCxqYS55LGphLnpdLG9oKHQsUHIsTHIsSXIsUWEpKX1jbGFtcFBvaW50KGUsdCl7cmV0dXJuIHQuY29weShlKS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9ZGlzdGFuY2VUb1BvaW50KGUpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQoZSxJbikuZGlzdGFuY2VUbyhlKX1nZXRCb3VuZGluZ1NwaGVyZShlKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/ZS5tYWtlRW1wdHkoKToodGhpcy5nZXRDZW50ZXIoZS5jZW50ZXIpLGUucmFkaXVzPXRoaXMuZ2V0U2l6ZShJbikubGVuZ3RoKCkqLjUpLGV9aW50ZXJzZWN0KGUpe3JldHVybiB0aGlzLm1pbi5tYXgoZS5taW4pLHRoaXMubWF4Lm1pbihlLm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbihlKXtyZXR1cm4gdGhpcy5taW4ubWluKGUubWluKSx0aGlzLm1heC5tYXgoZS5tYXgpLHRoaXN9YXBwbHlNYXRyaXg0KGUpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90aGlzOih0aVswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChlKSx0aVsxXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChlKSx0aVsyXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChlKSx0aVszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChlKSx0aVs0XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChlKSx0aVs1XS5zZXQodGhpcy5tYXgueCx0aGlzLm1pbi55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChlKSx0aVs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NChlKSx0aVs3XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NChlKSx0aGlzLnNldEZyb21Qb2ludHModGkpLHRoaXMpfXRyYW5zbGF0ZShlKXtyZXR1cm4gdGhpcy5taW4uYWRkKGUpLHRoaXMubWF4LmFkZChlKSx0aGlzfWVxdWFscyhlKXtyZXR1cm4gZS5taW4uZXF1YWxzKHRoaXMubWluKSYmZS5tYXguZXF1YWxzKHRoaXMubWF4KX19Y29uc3QgdGk9W25ldyBQLG5ldyBQLG5ldyBQLG5ldyBQLG5ldyBQLG5ldyBQLG5ldyBQLG5ldyBQXSxJbj1uZXcgUCxLYT1uZXcgRHQsUHI9bmV3IFAsTHI9bmV3IFAsSXI9bmV3IFAsRWk9bmV3IFAsQWk9bmV3IFAsWGk9bmV3IFAsenM9bmV3IFAsUWE9bmV3IFAsamE9bmV3IFAscWk9bmV3IFA7ZnVuY3Rpb24gb2gocixlLHQsbixpKXtmb3IobGV0IHM9MCxhPXIubGVuZ3RoLTM7czw9YTtzKz0zKXtxaS5mcm9tQXJyYXkocixzKTtjb25zdCBvPWkueCpNYXRoLmFicyhxaS54KStpLnkqTWF0aC5hYnMocWkueSkraS56Kk1hdGguYWJzKHFpLnopLGw9ZS5kb3QocWkpLGM9dC5kb3QocWkpLGg9bi5kb3QocWkpO2lmKE1hdGgubWF4KC1NYXRoLm1heChsLGMsaCksTWF0aC5taW4obCxjLGgpKT5vKXJldHVybiExfXJldHVybiEwfWNvbnN0IG94PW5ldyBEdCxrcz1uZXcgUCxsaD1uZXcgUDtjbGFzcyBHdHtjb25zdHJ1Y3RvcihlPW5ldyBQLHQ9LTEpe3RoaXMuY2VudGVyPWUsdGhpcy5yYWRpdXM9dH1zZXQoZSx0KXtyZXR1cm4gdGhpcy5jZW50ZXIuY29weShlKSx0aGlzLnJhZGl1cz10LHRoaXN9c2V0RnJvbVBvaW50cyhlLHQpe2NvbnN0IG49dGhpcy5jZW50ZXI7dCE9PXZvaWQgMD9uLmNvcHkodCk6b3guc2V0RnJvbVBvaW50cyhlKS5nZXRDZW50ZXIobik7bGV0IGk9MDtmb3IobGV0IHM9MCxhPWUubGVuZ3RoO3M8YTtzKyspaT1NYXRoLm1heChpLG4uZGlzdGFuY2VUb1NxdWFyZWQoZVtzXSkpO3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQoaSksdGhpc31jb3B5KGUpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KGUuY2VudGVyKSx0aGlzLnJhZGl1cz1lLnJhZGl1cyx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5yYWRpdXM8MH1tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5jZW50ZXIuc2V0KDAsMCwwKSx0aGlzLnJhZGl1cz0tMSx0aGlzfWNvbnRhaW5zUG9pbnQoZSl7cmV0dXJuIGUuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c31kaXN0YW5jZVRvUG9pbnQoZSl7cmV0dXJuIGUuZGlzdGFuY2VUbyh0aGlzLmNlbnRlciktdGhpcy5yYWRpdXN9aW50ZXJzZWN0c1NwaGVyZShlKXtjb25zdCB0PXRoaXMucmFkaXVzK2UucmFkaXVzO3JldHVybiBlLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PXQqdH1pbnRlcnNlY3RzQm94KGUpe3JldHVybiBlLmludGVyc2VjdHNTcGhlcmUodGhpcyl9aW50ZXJzZWN0c1BsYW5lKGUpe3JldHVybiBNYXRoLmFicyhlLmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c31jbGFtcFBvaW50KGUsdCl7Y29uc3Qgbj10aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZChlKTtyZXR1cm4gdC5jb3B5KGUpLG4+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJih0LnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksdC5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSksdH1nZXRCb3VuZGluZ0JveChlKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/KGUubWFrZUVtcHR5KCksZSk6KGUuc2V0KHRoaXMuY2VudGVyLHRoaXMuY2VudGVyKSxlLmV4cGFuZEJ5U2NhbGFyKHRoaXMucmFkaXVzKSxlKX1hcHBseU1hdHJpeDQoZSl7cmV0dXJuIHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NChlKSx0aGlzLnJhZGl1cz10aGlzLnJhZGl1cyplLmdldE1heFNjYWxlT25BeGlzKCksdGhpc310cmFuc2xhdGUoZSl7cmV0dXJuIHRoaXMuY2VudGVyLmFkZChlKSx0aGlzfWV4cGFuZEJ5UG9pbnQoZSl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXMuY2VudGVyLmNvcHkoZSksdGhpcy5yYWRpdXM9MCx0aGlzO2tzLnN1YlZlY3RvcnMoZSx0aGlzLmNlbnRlcik7Y29uc3QgdD1rcy5sZW5ndGhTcSgpO2lmKHQ+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IG49TWF0aC5zcXJ0KHQpLGk9KG4tdGhpcy5yYWRpdXMpKi41O3RoaXMuY2VudGVyLmFkZFNjYWxlZFZlY3RvcihrcyxpL24pLHRoaXMucmFkaXVzKz1pfXJldHVybiB0aGlzfXVuaW9uKGUpe3JldHVybiBlLmlzRW1wdHkoKT90aGlzOnRoaXMuaXNFbXB0eSgpPyh0aGlzLmNvcHkoZSksdGhpcyk6KHRoaXMuY2VudGVyLmVxdWFscyhlLmNlbnRlcik9PT0hMD90aGlzLnJhZGl1cz1NYXRoLm1heCh0aGlzLnJhZGl1cyxlLnJhZGl1cyk6KGxoLnN1YlZlY3RvcnMoZS5jZW50ZXIsdGhpcy5jZW50ZXIpLnNldExlbmd0aChlLnJhZGl1cyksdGhpcy5leHBhbmRCeVBvaW50KGtzLmNvcHkoZS5jZW50ZXIpLmFkZChsaCkpLHRoaXMuZXhwYW5kQnlQb2ludChrcy5jb3B5KGUuY2VudGVyKS5zdWIobGgpKSksdGhpcyl9ZXF1YWxzKGUpe3JldHVybiBlLmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZlLnJhZGl1cz09PXRoaXMucmFkaXVzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y29uc3Qgbmk9bmV3IFAsY2g9bmV3IFAsZW89bmV3IFAsVGk9bmV3IFAsaGg9bmV3IFAsdG89bmV3IFAsdWg9bmV3IFA7Y2xhc3MgVXJ7Y29uc3RydWN0b3IoZT1uZXcgUCx0PW5ldyBQKDAsMCwtMSkpe3RoaXMub3JpZ2luPWUsdGhpcy5kaXJlY3Rpb249dH1zZXQoZSx0KXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weShlKSx0aGlzLmRpcmVjdGlvbi5jb3B5KHQpLHRoaXN9Y29weShlKXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weShlLm9yaWdpbiksdGhpcy5kaXJlY3Rpb24uY29weShlLmRpcmVjdGlvbiksdGhpc31hdChlLHQpe3JldHVybiB0LmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbixlKX1sb29rQXQoZSl7cmV0dXJuIHRoaXMuZGlyZWN0aW9uLmNvcHkoZSkuc3ViKHRoaXMub3JpZ2luKS5ub3JtYWxpemUoKSx0aGlzfXJlY2FzdChlKXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KGUsbmkpKSx0aGlzfWNsb3Nlc3RQb2ludFRvUG9pbnQoZSx0KXt0LnN1YlZlY3RvcnMoZSx0aGlzLm9yaWdpbik7Y29uc3Qgbj10LmRvdCh0aGlzLmRpcmVjdGlvbik7cmV0dXJuIG48MD90LmNvcHkodGhpcy5vcmlnaW4pOnQuY29weSh0aGlzLm9yaWdpbikuYWRkU2NhbGVkVmVjdG9yKHRoaXMuZGlyZWN0aW9uLG4pfWRpc3RhbmNlVG9Qb2ludChlKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoZSkpfWRpc3RhbmNlU3FUb1BvaW50KGUpe2NvbnN0IHQ9bmkuc3ViVmVjdG9ycyhlLHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiB0PDA/dGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoZSk6KG5pLmNvcHkodGhpcy5vcmlnaW4pLmFkZFNjYWxlZFZlY3Rvcih0aGlzLmRpcmVjdGlvbix0KSxuaS5kaXN0YW5jZVRvU3F1YXJlZChlKSl9ZGlzdGFuY2VTcVRvU2VnbWVudChlLHQsbixpKXtjaC5jb3B5KGUpLmFkZCh0KS5tdWx0aXBseVNjYWxhciguNSksZW8uY29weSh0KS5zdWIoZSkubm9ybWFsaXplKCksVGkuY29weSh0aGlzLm9yaWdpbikuc3ViKGNoKTtjb25zdCBzPWUuZGlzdGFuY2VUbyh0KSouNSxhPS10aGlzLmRpcmVjdGlvbi5kb3QoZW8pLG89VGkuZG90KHRoaXMuZGlyZWN0aW9uKSxsPS1UaS5kb3QoZW8pLGM9VGkubGVuZ3RoU3EoKSxoPU1hdGguYWJzKDEtYSphKTtsZXQgdSxmLGQscDtpZihoPjApaWYodT1hKmwtbyxmPWEqby1sLHA9cypoLHU+PTApaWYoZj49LXApaWYoZjw9cCl7Y29uc3QgXz0xL2g7dSo9XyxmKj1fLGQ9dSoodSthKmYrMipvKStmKihhKnUrZisyKmwpK2N9ZWxzZSBmPXMsdT1NYXRoLm1heCgwLC0oYSpmK28pKSxkPS11KnUrZiooZisyKmwpK2M7ZWxzZSBmPS1zLHU9TWF0aC5tYXgoMCwtKGEqZitvKSksZD0tdSp1K2YqKGYrMipsKStjO2Vsc2UgZjw9LXA/KHU9TWF0aC5tYXgoMCwtKC1hKnMrbykpLGY9dT4wPy1zOk1hdGgubWluKE1hdGgubWF4KC1zLC1sKSxzKSxkPS11KnUrZiooZisyKmwpK2MpOmY8PXA/KHU9MCxmPU1hdGgubWluKE1hdGgubWF4KC1zLC1sKSxzKSxkPWYqKGYrMipsKStjKToodT1NYXRoLm1heCgwLC0oYSpzK28pKSxmPXU+MD9zOk1hdGgubWluKE1hdGgubWF4KC1zLC1sKSxzKSxkPS11KnUrZiooZisyKmwpK2MpO2Vsc2UgZj1hPjA/LXM6cyx1PU1hdGgubWF4KDAsLShhKmYrbykpLGQ9LXUqdStmKihmKzIqbCkrYztyZXR1cm4gbiYmbi5jb3B5KHRoaXMub3JpZ2luKS5hZGRTY2FsZWRWZWN0b3IodGhpcy5kaXJlY3Rpb24sdSksaSYmaS5jb3B5KGNoKS5hZGRTY2FsZWRWZWN0b3IoZW8sZiksZH1pbnRlcnNlY3RTcGhlcmUoZSx0KXtuaS5zdWJWZWN0b3JzKGUuY2VudGVyLHRoaXMub3JpZ2luKTtjb25zdCBuPW5pLmRvdCh0aGlzLmRpcmVjdGlvbiksaT1uaS5kb3QobmkpLW4qbixzPWUucmFkaXVzKmUucmFkaXVzO2lmKGk+cylyZXR1cm4gbnVsbDtjb25zdCBhPU1hdGguc3FydChzLWkpLG89bi1hLGw9bithO3JldHVybiBsPDA/bnVsbDpvPDA/dGhpcy5hdChsLHQpOnRoaXMuYXQobyx0KX1pbnRlcnNlY3RzU3BoZXJlKGUpe3JldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGUuY2VudGVyKTw9ZS5yYWRpdXMqZS5yYWRpdXN9ZGlzdGFuY2VUb1BsYW5lKGUpe2NvbnN0IHQ9ZS5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKTtpZih0PT09MClyZXR1cm4gZS5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPT09MD8wOm51bGw7Y29uc3Qgbj0tKHRoaXMub3JpZ2luLmRvdChlLm5vcm1hbCkrZS5jb25zdGFudCkvdDtyZXR1cm4gbj49MD9uOm51bGx9aW50ZXJzZWN0UGxhbmUoZSx0KXtjb25zdCBuPXRoaXMuZGlzdGFuY2VUb1BsYW5lKGUpO3JldHVybiBuPT09bnVsbD9udWxsOnRoaXMuYXQobix0KX1pbnRlcnNlY3RzUGxhbmUoZSl7Y29uc3QgdD1lLmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik7cmV0dXJuIHQ9PT0wfHxlLm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pKnQ8MH1pbnRlcnNlY3RCb3goZSx0KXtsZXQgbixpLHMsYSxvLGw7Y29uc3QgYz0xL3RoaXMuZGlyZWN0aW9uLngsaD0xL3RoaXMuZGlyZWN0aW9uLnksdT0xL3RoaXMuZGlyZWN0aW9uLnosZj10aGlzLm9yaWdpbjtyZXR1cm4gYz49MD8obj0oZS5taW4ueC1mLngpKmMsaT0oZS5tYXgueC1mLngpKmMpOihuPShlLm1heC54LWYueCkqYyxpPShlLm1pbi54LWYueCkqYyksaD49MD8ocz0oZS5taW4ueS1mLnkpKmgsYT0oZS5tYXgueS1mLnkpKmgpOihzPShlLm1heC55LWYueSkqaCxhPShlLm1pbi55LWYueSkqaCksbj5hfHxzPml8fCgocz5ufHxpc05hTihuKSkmJihuPXMpLChhPGl8fGlzTmFOKGkpKSYmKGk9YSksdT49MD8obz0oZS5taW4uei1mLnopKnUsbD0oZS5tYXguei1mLnopKnUpOihvPShlLm1heC56LWYueikqdSxsPShlLm1pbi56LWYueikqdSksbj5sfHxvPmkpfHwoKG8+bnx8biE9PW4pJiYobj1vKSwobDxpfHxpIT09aSkmJihpPWwpLGk8MCk/bnVsbDp0aGlzLmF0KG4+PTA/bjppLHQpfWludGVyc2VjdHNCb3goZSl7cmV0dXJuIHRoaXMuaW50ZXJzZWN0Qm94KGUsbmkpIT09bnVsbH1pbnRlcnNlY3RUcmlhbmdsZShlLHQsbixpLHMpe2hoLnN1YlZlY3RvcnModCxlKSx0by5zdWJWZWN0b3JzKG4sZSksdWguY3Jvc3NWZWN0b3JzKGhoLHRvKTtsZXQgYT10aGlzLmRpcmVjdGlvbi5kb3QodWgpLG87aWYoYT4wKXtpZihpKXJldHVybiBudWxsO289MX1lbHNlIGlmKGE8MClvPS0xLGE9LWE7ZWxzZSByZXR1cm4gbnVsbDtUaS5zdWJWZWN0b3JzKHRoaXMub3JpZ2luLGUpO2NvbnN0IGw9byp0aGlzLmRpcmVjdGlvbi5kb3QodG8uY3Jvc3NWZWN0b3JzKFRpLHRvKSk7aWYobDwwKXJldHVybiBudWxsO2NvbnN0IGM9byp0aGlzLmRpcmVjdGlvbi5kb3QoaGguY3Jvc3MoVGkpKTtpZihjPDB8fGwrYz5hKXJldHVybiBudWxsO2NvbnN0IGg9LW8qVGkuZG90KHVoKTtyZXR1cm4gaDwwP251bGw6dGhpcy5hdChoL2Escyl9YXBwbHlNYXRyaXg0KGUpe3JldHVybiB0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQoZSksdGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKGUpLHRoaXN9ZXF1YWxzKGUpe3JldHVybiBlLm9yaWdpbi5lcXVhbHModGhpcy5vcmlnaW4pJiZlLmRpcmVjdGlvbi5lcXVhbHModGhpcy5kaXJlY3Rpb24pfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y2xhc3MgSWV7Y29uc3RydWN0b3IoZSx0LG4saSxzLGEsbyxsLGMsaCx1LGYsZCxwLF8sZyl7SWUucHJvdG90eXBlLmlzTWF0cml4ND0hMCx0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSxlIT09dm9pZCAwJiZ0aGlzLnNldChlLHQsbixpLHMsYSxvLGwsYyxoLHUsZixkLHAsXyxnKX1zZXQoZSx0LG4saSxzLGEsbyxsLGMsaCx1LGYsZCxwLF8sZyl7Y29uc3QgbT10aGlzLmVsZW1lbnRzO3JldHVybiBtWzBdPWUsbVs0XT10LG1bOF09bixtWzEyXT1pLG1bMV09cyxtWzVdPWEsbVs5XT1vLG1bMTNdPWwsbVsyXT1jLG1bNl09aCxtWzEwXT11LG1bMTRdPWYsbVszXT1kLG1bN109cCxtWzExXT1fLG1bMTVdPWcsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyBJZSgpLmZyb21BcnJheSh0aGlzLmVsZW1lbnRzKX1jb3B5KGUpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxuPWUuZWxlbWVudHM7cmV0dXJuIHRbMF09blswXSx0WzFdPW5bMV0sdFsyXT1uWzJdLHRbM109blszXSx0WzRdPW5bNF0sdFs1XT1uWzVdLHRbNl09bls2XSx0WzddPW5bN10sdFs4XT1uWzhdLHRbOV09bls5XSx0WzEwXT1uWzEwXSx0WzExXT1uWzExXSx0WzEyXT1uWzEyXSx0WzEzXT1uWzEzXSx0WzE0XT1uWzE0XSx0WzE1XT1uWzE1XSx0aGlzfWNvcHlQb3NpdGlvbihlKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsbj1lLmVsZW1lbnRzO3JldHVybiB0WzEyXT1uWzEyXSx0WzEzXT1uWzEzXSx0WzE0XT1uWzE0XSx0aGlzfXNldEZyb21NYXRyaXgzKGUpe2NvbnN0IHQ9ZS5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQodFswXSx0WzNdLHRbNl0sMCx0WzFdLHRbNF0sdFs3XSwwLHRbMl0sdFs1XSx0WzhdLDAsMCwwLDAsMSksdGhpc31leHRyYWN0QmFzaXMoZSx0LG4pe3JldHVybiBlLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywwKSx0LnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXhDb2x1bW4odGhpcywyKSx0aGlzfW1ha2VCYXNpcyhlLHQsbil7cmV0dXJuIHRoaXMuc2V0KGUueCx0Lngsbi54LDAsZS55LHQueSxuLnksMCxlLnosdC56LG4ueiwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdFJvdGF0aW9uKGUpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxuPWUuZWxlbWVudHMsaT0xL0RyLnNldEZyb21NYXRyaXhDb2x1bW4oZSwwKS5sZW5ndGgoKSxzPTEvRHIuc2V0RnJvbU1hdHJpeENvbHVtbihlLDEpLmxlbmd0aCgpLGE9MS9Eci5zZXRGcm9tTWF0cml4Q29sdW1uKGUsMikubGVuZ3RoKCk7cmV0dXJuIHRbMF09blswXSppLHRbMV09blsxXSppLHRbMl09blsyXSppLHRbM109MCx0WzRdPW5bNF0qcyx0WzVdPW5bNV0qcyx0WzZdPW5bNl0qcyx0WzddPTAsdFs4XT1uWzhdKmEsdFs5XT1uWzldKmEsdFsxMF09blsxMF0qYSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tRXVsZXIoZSl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLG49ZS54LGk9ZS55LHM9ZS56LGE9TWF0aC5jb3Mobiksbz1NYXRoLnNpbihuKSxsPU1hdGguY29zKGkpLGM9TWF0aC5zaW4oaSksaD1NYXRoLmNvcyhzKSx1PU1hdGguc2luKHMpO2lmKGUub3JkZXI9PT0iWFlaIil7Y29uc3QgZj1hKmgsZD1hKnUscD1vKmgsXz1vKnU7dFswXT1sKmgsdFs0XT0tbCp1LHRbOF09Yyx0WzFdPWQrcCpjLHRbNV09Zi1fKmMsdFs5XT0tbypsLHRbMl09Xy1mKmMsdFs2XT1wK2QqYyx0WzEwXT1hKmx9ZWxzZSBpZihlLm9yZGVyPT09IllYWiIpe2NvbnN0IGY9bCpoLGQ9bCp1LHA9YypoLF89Yyp1O3RbMF09ZitfKm8sdFs0XT1wKm8tZCx0WzhdPWEqYyx0WzFdPWEqdSx0WzVdPWEqaCx0WzldPS1vLHRbMl09ZCpvLXAsdFs2XT1fK2Yqbyx0WzEwXT1hKmx9ZWxzZSBpZihlLm9yZGVyPT09IlpYWSIpe2NvbnN0IGY9bCpoLGQ9bCp1LHA9YypoLF89Yyp1O3RbMF09Zi1fKm8sdFs0XT0tYSp1LHRbOF09cCtkKm8sdFsxXT1kK3Aqbyx0WzVdPWEqaCx0WzldPV8tZipvLHRbMl09LWEqYyx0WzZdPW8sdFsxMF09YSpsfWVsc2UgaWYoZS5vcmRlcj09PSJaWVgiKXtjb25zdCBmPWEqaCxkPWEqdSxwPW8qaCxfPW8qdTt0WzBdPWwqaCx0WzRdPXAqYy1kLHRbOF09ZipjK18sdFsxXT1sKnUsdFs1XT1fKmMrZix0WzldPWQqYy1wLHRbMl09LWMsdFs2XT1vKmwsdFsxMF09YSpsfWVsc2UgaWYoZS5vcmRlcj09PSJZWlgiKXtjb25zdCBmPWEqbCxkPWEqYyxwPW8qbCxfPW8qYzt0WzBdPWwqaCx0WzRdPV8tZip1LHRbOF09cCp1K2QsdFsxXT11LHRbNV09YSpoLHRbOV09LW8qaCx0WzJdPS1jKmgsdFs2XT1kKnUrcCx0WzEwXT1mLV8qdX1lbHNlIGlmKGUub3JkZXI9PT0iWFpZIil7Y29uc3QgZj1hKmwsZD1hKmMscD1vKmwsXz1vKmM7dFswXT1sKmgsdFs0XT0tdSx0WzhdPWMqaCx0WzFdPWYqdStfLHRbNV09YSpoLHRbOV09ZCp1LXAsdFsyXT1wKnUtZCx0WzZdPW8qaCx0WzEwXT1fKnUrZn1yZXR1cm4gdFszXT0wLHRbN109MCx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdGhpc31tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihlKXtyZXR1cm4gdGhpcy5jb21wb3NlKGx4LGUsY3gpfWxvb2tBdChlLHQsbil7Y29uc3QgaT10aGlzLmVsZW1lbnRzO3JldHVybiB4bi5zdWJWZWN0b3JzKGUsdCkseG4ubGVuZ3RoU3EoKT09PTAmJih4bi56PTEpLHhuLm5vcm1hbGl6ZSgpLENpLmNyb3NzVmVjdG9ycyhuLHhuKSxDaS5sZW5ndGhTcSgpPT09MCYmKE1hdGguYWJzKG4ueik9PT0xP3huLngrPTFlLTQ6eG4ueis9MWUtNCx4bi5ub3JtYWxpemUoKSxDaS5jcm9zc1ZlY3RvcnMobix4bikpLENpLm5vcm1hbGl6ZSgpLG5vLmNyb3NzVmVjdG9ycyh4bixDaSksaVswXT1DaS54LGlbNF09bm8ueCxpWzhdPXhuLngsaVsxXT1DaS55LGlbNV09bm8ueSxpWzldPXhuLnksaVsyXT1DaS56LGlbNl09bm8ueixpWzEwXT14bi56LHRoaXN9bXVsdGlwbHkoZSl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0aGlzLGUpfXByZW11bHRpcGx5KGUpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoZSx0aGlzKX1tdWx0aXBseU1hdHJpY2VzKGUsdCl7Y29uc3Qgbj1lLmVsZW1lbnRzLGk9dC5lbGVtZW50cyxzPXRoaXMuZWxlbWVudHMsYT1uWzBdLG89bls0XSxsPW5bOF0sYz1uWzEyXSxoPW5bMV0sdT1uWzVdLGY9bls5XSxkPW5bMTNdLHA9blsyXSxfPW5bNl0sZz1uWzEwXSxtPW5bMTRdLHk9blszXSx4PW5bN10sdj1uWzExXSxTPW5bMTVdLGI9aVswXSxBPWlbNF0sTD1pWzhdLE09aVsxMl0sdz1pWzFdLFI9aVs1XSxOPWlbOV0sQj1pWzEzXSxJPWlbMl0sVT1pWzZdLHo9aVsxMF0sRj1pWzE0XSxaPWlbM10sVj1pWzddLFE9aVsxMV0sbmU9aVsxNV07cmV0dXJuIHNbMF09YSpiK28qdytsKkkrYypaLHNbNF09YSpBK28qUitsKlUrYypWLHNbOF09YSpMK28qTitsKnorYypRLHNbMTJdPWEqTStvKkIrbCpGK2MqbmUsc1sxXT1oKmIrdSp3K2YqSStkKlosc1s1XT1oKkErdSpSK2YqVStkKlYsc1s5XT1oKkwrdSpOK2YqeitkKlEsc1sxM109aCpNK3UqQitmKkYrZCpuZSxzWzJdPXAqYitfKncrZypJK20qWixzWzZdPXAqQStfKlIrZypVK20qVixzWzEwXT1wKkwrXypOK2cqeittKlEsc1sxNF09cCpNK18qQitnKkYrbSpuZSxzWzNdPXkqYit4KncrdipJK1MqWixzWzddPXkqQSt4KlIrdipVK1MqVixzWzExXT15KkwreCpOK3YqeitTKlEsc1sxNV09eSpNK3gqQit2KkYrUypuZSx0aGlzfW11bHRpcGx5U2NhbGFyKGUpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztyZXR1cm4gdFswXSo9ZSx0WzRdKj1lLHRbOF0qPWUsdFsxMl0qPWUsdFsxXSo9ZSx0WzVdKj1lLHRbOV0qPWUsdFsxM10qPWUsdFsyXSo9ZSx0WzZdKj1lLHRbMTBdKj1lLHRbMTRdKj1lLHRbM10qPWUsdFs3XSo9ZSx0WzExXSo9ZSx0WzE1XSo9ZSx0aGlzfWRldGVybWluYW50KCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHQ9ZVswXSxuPWVbNF0saT1lWzhdLHM9ZVsxMl0sYT1lWzFdLG89ZVs1XSxsPWVbOV0sYz1lWzEzXSxoPWVbMl0sdT1lWzZdLGY9ZVsxMF0sZD1lWzE0XSxwPWVbM10sXz1lWzddLGc9ZVsxMV0sbT1lWzE1XTtyZXR1cm4gcCooK3MqbCp1LWkqYyp1LXMqbypmK24qYypmK2kqbypkLW4qbCpkKStfKigrdCpsKmQtdCpjKmYrcyphKmYtaSphKmQraSpjKmgtcypsKmgpK2cqKCt0KmMqdS10Km8qZC1zKmEqdStuKmEqZCtzKm8qaC1uKmMqaCkrbSooLWkqbypoLXQqbCp1K3QqbypmK2kqYSp1LW4qYSpmK24qbCpoKX10cmFuc3Bvc2UoKXtjb25zdCBlPXRoaXMuZWxlbWVudHM7bGV0IHQ7cmV0dXJuIHQ9ZVsxXSxlWzFdPWVbNF0sZVs0XT10LHQ9ZVsyXSxlWzJdPWVbOF0sZVs4XT10LHQ9ZVs2XSxlWzZdPWVbOV0sZVs5XT10LHQ9ZVszXSxlWzNdPWVbMTJdLGVbMTJdPXQsdD1lWzddLGVbN109ZVsxM10sZVsxM109dCx0PWVbMTFdLGVbMTFdPWVbMTRdLGVbMTRdPXQsdGhpc31zZXRQb3NpdGlvbihlLHQsbil7Y29uc3QgaT10aGlzLmVsZW1lbnRzO3JldHVybiBlLmlzVmVjdG9yMz8oaVsxMl09ZS54LGlbMTNdPWUueSxpWzE0XT1lLnopOihpWzEyXT1lLGlbMTNdPXQsaVsxNF09biksdGhpc31pbnZlcnQoKXtjb25zdCBlPXRoaXMuZWxlbWVudHMsdD1lWzBdLG49ZVsxXSxpPWVbMl0scz1lWzNdLGE9ZVs0XSxvPWVbNV0sbD1lWzZdLGM9ZVs3XSxoPWVbOF0sdT1lWzldLGY9ZVsxMF0sZD1lWzExXSxwPWVbMTJdLF89ZVsxM10sZz1lWzE0XSxtPWVbMTVdLHk9dSpnKmMtXypmKmMrXypsKmQtbypnKmQtdSpsKm0rbypmKm0seD1wKmYqYy1oKmcqYy1wKmwqZCthKmcqZCtoKmwqbS1hKmYqbSx2PWgqXypjLXAqdSpjK3AqbypkLWEqXypkLWgqbyptK2EqdSptLFM9cCp1KmwtaCpfKmwtcCpvKmYrYSpfKmYraCpvKmctYSp1KmcsYj10Knkrbip4K2kqditzKlM7aWYoYj09PTApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApO2NvbnN0IEE9MS9iO3JldHVybiBlWzBdPXkqQSxlWzFdPShfKmYqcy11Kmcqcy1fKmkqZCtuKmcqZCt1KmkqbS1uKmYqbSkqQSxlWzJdPShvKmcqcy1fKmwqcytfKmkqYy1uKmcqYy1vKmkqbStuKmwqbSkqQSxlWzNdPSh1Kmwqcy1vKmYqcy11KmkqYytuKmYqYytvKmkqZC1uKmwqZCkqQSxlWzRdPXgqQSxlWzVdPShoKmcqcy1wKmYqcytwKmkqZC10KmcqZC1oKmkqbSt0KmYqbSkqQSxlWzZdPShwKmwqcy1hKmcqcy1wKmkqYyt0KmcqYythKmkqbS10KmwqbSkqQSxlWzddPShhKmYqcy1oKmwqcytoKmkqYy10KmYqYy1hKmkqZCt0KmwqZCkqQSxlWzhdPXYqQSxlWzldPShwKnUqcy1oKl8qcy1wKm4qZCt0Kl8qZCtoKm4qbS10KnUqbSkqQSxlWzEwXT0oYSpfKnMtcCpvKnMrcCpuKmMtdCpfKmMtYSpuKm0rdCpvKm0pKkEsZVsxMV09KGgqbypzLWEqdSpzLWgqbipjK3QqdSpjK2EqbipkLXQqbypkKSpBLGVbMTJdPVMqQSxlWzEzXT0oaCpfKmktcCp1KmkrcCpuKmYtdCpfKmYtaCpuKmcrdCp1KmcpKkEsZVsxNF09KHAqbyppLWEqXyppLXAqbipsK3QqXypsK2EqbipnLXQqbypnKSpBLGVbMTVdPShhKnUqaS1oKm8qaStoKm4qbC10KnUqbC1hKm4qZit0Km8qZikqQSx0aGlzfXNjYWxlKGUpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxuPWUueCxpPWUueSxzPWUuejtyZXR1cm4gdFswXSo9bix0WzRdKj1pLHRbOF0qPXMsdFsxXSo9bix0WzVdKj1pLHRbOV0qPXMsdFsyXSo9bix0WzZdKj1pLHRbMTBdKj1zLHRbM10qPW4sdFs3XSo9aSx0WzExXSo9cyx0aGlzfWdldE1heFNjYWxlT25BeGlzKCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLHQ9ZVswXSplWzBdK2VbMV0qZVsxXStlWzJdKmVbMl0sbj1lWzRdKmVbNF0rZVs1XSplWzVdK2VbNl0qZVs2XSxpPWVbOF0qZVs4XStlWzldKmVbOV0rZVsxMF0qZVsxMF07cmV0dXJuIE1hdGguc3FydChNYXRoLm1heCh0LG4saSkpfW1ha2VUcmFuc2xhdGlvbihlLHQsbil7cmV0dXJuIGUuaXNWZWN0b3IzP3RoaXMuc2V0KDEsMCwwLGUueCwwLDEsMCxlLnksMCwwLDEsZS56LDAsMCwwLDEpOnRoaXMuc2V0KDEsMCwwLGUsMCwxLDAsdCwwLDAsMSxuLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWChlKXtjb25zdCB0PU1hdGguY29zKGUpLG49TWF0aC5zaW4oZSk7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCx0LC1uLDAsMCxuLHQsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblkoZSl7Y29uc3QgdD1NYXRoLmNvcyhlKSxuPU1hdGguc2luKGUpO3JldHVybiB0aGlzLnNldCh0LDAsbiwwLDAsMSwwLDAsLW4sMCx0LDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25aKGUpe2NvbnN0IHQ9TWF0aC5jb3MoZSksbj1NYXRoLnNpbihlKTtyZXR1cm4gdGhpcy5zZXQodCwtbiwwLDAsbix0LDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uQXhpcyhlLHQpe2NvbnN0IG49TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KSxzPTEtbixhPWUueCxvPWUueSxsPWUueixjPXMqYSxoPXMqbztyZXR1cm4gdGhpcy5zZXQoYyphK24sYypvLWkqbCxjKmwraSpvLDAsYypvK2kqbCxoKm8rbixoKmwtaSphLDAsYypsLWkqbyxoKmwraSphLHMqbCpsK24sMCwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZShlLHQsbil7cmV0dXJuIHRoaXMuc2V0KGUsMCwwLDAsMCx0LDAsMCwwLDAsbiwwLDAsMCwwLDEpLHRoaXN9bWFrZVNoZWFyKGUsdCxuLGkscyxhKXtyZXR1cm4gdGhpcy5zZXQoMSxuLHMsMCxlLDEsYSwwLHQsaSwxLDAsMCwwLDAsMSksdGhpc31jb21wb3NlKGUsdCxuKXtjb25zdCBpPXRoaXMuZWxlbWVudHMscz10Ll94LGE9dC5feSxvPXQuX3osbD10Ll93LGM9cytzLGg9YSthLHU9bytvLGY9cypjLGQ9cypoLHA9cyp1LF89YSpoLGc9YSp1LG09byp1LHk9bCpjLHg9bCpoLHY9bCp1LFM9bi54LGI9bi55LEE9bi56O3JldHVybiBpWzBdPSgxLShfK20pKSpTLGlbMV09KGQrdikqUyxpWzJdPShwLXgpKlMsaVszXT0wLGlbNF09KGQtdikqYixpWzVdPSgxLShmK20pKSpiLGlbNl09KGcreSkqYixpWzddPTAsaVs4XT0ocCt4KSpBLGlbOV09KGcteSkqQSxpWzEwXT0oMS0oZitfKSkqQSxpWzExXT0wLGlbMTJdPWUueCxpWzEzXT1lLnksaVsxNF09ZS56LGlbMTVdPTEsdGhpc31kZWNvbXBvc2UoZSx0LG4pe2NvbnN0IGk9dGhpcy5lbGVtZW50cztsZXQgcz1Eci5zZXQoaVswXSxpWzFdLGlbMl0pLmxlbmd0aCgpO2NvbnN0IGE9RHIuc2V0KGlbNF0saVs1XSxpWzZdKS5sZW5ndGgoKSxvPURyLnNldChpWzhdLGlbOV0saVsxMF0pLmxlbmd0aCgpO3RoaXMuZGV0ZXJtaW5hbnQoKTwwJiYocz0tcyksZS54PWlbMTJdLGUueT1pWzEzXSxlLno9aVsxNF0sVW4uY29weSh0aGlzKTtjb25zdCBjPTEvcyxoPTEvYSx1PTEvbztyZXR1cm4gVW4uZWxlbWVudHNbMF0qPWMsVW4uZWxlbWVudHNbMV0qPWMsVW4uZWxlbWVudHNbMl0qPWMsVW4uZWxlbWVudHNbNF0qPWgsVW4uZWxlbWVudHNbNV0qPWgsVW4uZWxlbWVudHNbNl0qPWgsVW4uZWxlbWVudHNbOF0qPXUsVW4uZWxlbWVudHNbOV0qPXUsVW4uZWxlbWVudHNbMTBdKj11LHQuc2V0RnJvbVJvdGF0aW9uTWF0cml4KFVuKSxuLng9cyxuLnk9YSxuLno9byx0aGlzfW1ha2VQZXJzcGVjdGl2ZShlLHQsbixpLHMsYSxvPVBuKXtjb25zdCBsPXRoaXMuZWxlbWVudHMsYz0yKnMvKHQtZSksaD0yKnMvKG4taSksdT0odCtlKS8odC1lKSxmPShuK2kpLyhuLWkpO2xldCBkLHA7aWYobz09PVBuKWQ9LShhK3MpLyhhLXMpLHA9LTIqYSpzLyhhLXMpO2Vsc2UgaWYobz09PUVyKWQ9LWEvKGEtcykscD0tYSpzLyhhLXMpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5NYXRyaXg0Lm1ha2VQZXJzcGVjdGl2ZSgpOiBJbnZhbGlkIGNvb3JkaW5hdGUgc3lzdGVtOiAiK28pO3JldHVybiBsWzBdPWMsbFs0XT0wLGxbOF09dSxsWzEyXT0wLGxbMV09MCxsWzVdPWgsbFs5XT1mLGxbMTNdPTAsbFsyXT0wLGxbNl09MCxsWzEwXT1kLGxbMTRdPXAsbFszXT0wLGxbN109MCxsWzExXT0tMSxsWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyhlLHQsbixpLHMsYSxvPVBuKXtjb25zdCBsPXRoaXMuZWxlbWVudHMsYz0xLyh0LWUpLGg9MS8obi1pKSx1PTEvKGEtcyksZj0odCtlKSpjLGQ9KG4raSkqaDtsZXQgcCxfO2lmKG89PT1QbilwPShhK3MpKnUsXz0tMip1O2Vsc2UgaWYobz09PUVyKXA9cyp1LF89LTEqdTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuTWF0cml4NC5tYWtlT3J0aG9ncmFwaGljKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrbyk7cmV0dXJuIGxbMF09MipjLGxbNF09MCxsWzhdPTAsbFsxMl09LWYsbFsxXT0wLGxbNV09MipoLGxbOV09MCxsWzEzXT0tZCxsWzJdPTAsbFs2XT0wLGxbMTBdPV8sbFsxNF09LXAsbFszXT0wLGxbN109MCxsWzExXT0wLGxbMTVdPTEsdGhpc31lcXVhbHMoZSl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLG49ZS5lbGVtZW50cztmb3IobGV0IGk9MDtpPDE2O2krKylpZih0W2ldIT09bltpXSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkoZSx0PTApe2ZvcihsZXQgbj0wO248MTY7bisrKXRoaXMuZWxlbWVudHNbbl09ZVtuK3RdO3JldHVybiB0aGlzfXRvQXJyYXkoZT1bXSx0PTApe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gZVt0XT1uWzBdLGVbdCsxXT1uWzFdLGVbdCsyXT1uWzJdLGVbdCszXT1uWzNdLGVbdCs0XT1uWzRdLGVbdCs1XT1uWzVdLGVbdCs2XT1uWzZdLGVbdCs3XT1uWzddLGVbdCs4XT1uWzhdLGVbdCs5XT1uWzldLGVbdCsxMF09blsxMF0sZVt0KzExXT1uWzExXSxlW3QrMTJdPW5bMTJdLGVbdCsxM109blsxM10sZVt0KzE0XT1uWzE0XSxlW3QrMTVdPW5bMTVdLGV9fWNvbnN0IERyPW5ldyBQLFVuPW5ldyBJZSxseD1uZXcgUCgwLDAsMCksY3g9bmV3IFAoMSwxLDEpLENpPW5ldyBQLG5vPW5ldyBQLHhuPW5ldyBQLExkPW5ldyBJZSxJZD1uZXcgbG47Y2xhc3MgR3N7Y29uc3RydWN0b3IoZT0wLHQ9MCxuPTAsaT1Hcy5ERUZBVUxUX09SREVSKXt0aGlzLmlzRXVsZXI9ITAsdGhpcy5feD1lLHRoaXMuX3k9dCx0aGlzLl96PW4sdGhpcy5fb3JkZXI9aX1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KGUpe3RoaXMuX3g9ZSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeShlKXt0aGlzLl95PWUsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHooZSl7dGhpcy5fej1lLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgb3JkZXIoKXtyZXR1cm4gdGhpcy5fb3JkZXJ9c2V0IG9yZGVyKGUpe3RoaXMuX29yZGVyPWUsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldChlLHQsbixpPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5feD1lLHRoaXMuX3k9dCx0aGlzLl96PW4sdGhpcy5fb3JkZXI9aSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9Y29weShlKXtyZXR1cm4gdGhpcy5feD1lLl94LHRoaXMuX3k9ZS5feSx0aGlzLl96PWUuX3osdGhpcy5fb3JkZXI9ZS5fb3JkZXIsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KGUsdD10aGlzLl9vcmRlcixuPSEwKXtjb25zdCBpPWUuZWxlbWVudHMscz1pWzBdLGE9aVs0XSxvPWlbOF0sbD1pWzFdLGM9aVs1XSxoPWlbOV0sdT1pWzJdLGY9aVs2XSxkPWlbMTBdO3N3aXRjaCh0KXtjYXNlIlhZWiI6dGhpcy5feT1NYXRoLmFzaW4oX3QobywtMSwxKSksTWF0aC5hYnMobyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMigtaCxkKSx0aGlzLl96PU1hdGguYXRhbjIoLWEscykpOih0aGlzLl94PU1hdGguYXRhbjIoZixjKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PU1hdGguYXNpbigtX3QoaCwtMSwxKSksTWF0aC5hYnMoaCk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihvLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihsLGMpKToodGhpcy5feT1NYXRoLmF0YW4yKC11LHMpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKF90KGYsLTEsMSkpLE1hdGguYWJzKGYpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIoLXUsZCksdGhpcy5fej1NYXRoLmF0YW4yKC1hLGMpKToodGhpcy5feT0wLHRoaXMuX3o9TWF0aC5hdGFuMihsLHMpKTticmVhaztjYXNlIlpZWCI6dGhpcy5feT1NYXRoLmFzaW4oLV90KHUsLTEsMSkpLE1hdGguYWJzKHUpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIoZixkKSx0aGlzLl96PU1hdGguYXRhbjIobCxzKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLWEsYykpO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl96PU1hdGguYXNpbihfdChsLC0xLDEpKSxNYXRoLmFicyhsKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1oLGMpLHRoaXMuX3k9TWF0aC5hdGFuMigtdSxzKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIobyxkKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC1fdChhLC0xLDEpKSxNYXRoLmFicyhhKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKGYsYyksdGhpcy5feT1NYXRoLmF0YW4yKG8scykpOih0aGlzLl94PU1hdGguYXRhbjIoLWgsZCksdGhpcy5feT0wKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK3QpfXJldHVybiB0aGlzLl9vcmRlcj10LG49PT0hMCYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVF1YXRlcm5pb24oZSx0LG4pe3JldHVybiBMZC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihlKSx0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeChMZCx0LG4pfXNldEZyb21WZWN0b3IzKGUsdD10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuc2V0KGUueCxlLnksZS56LHQpfXJlb3JkZXIoZSl7cmV0dXJuIElkLnNldEZyb21FdWxlcih0aGlzKSx0aGlzLnNldEZyb21RdWF0ZXJuaW9uKElkLGUpfWVxdWFscyhlKXtyZXR1cm4gZS5feD09PXRoaXMuX3gmJmUuX3k9PT10aGlzLl95JiZlLl96PT09dGhpcy5feiYmZS5fb3JkZXI9PT10aGlzLl9vcmRlcn1mcm9tQXJyYXkoZSl7cmV0dXJuIHRoaXMuX3g9ZVswXSx0aGlzLl95PWVbMV0sdGhpcy5fej1lWzJdLGVbM10hPT12b2lkIDAmJih0aGlzLl9vcmRlcj1lWzNdKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KGU9W10sdD0wKXtyZXR1cm4gZVt0XT10aGlzLl94LGVbdCsxXT10aGlzLl95LGVbdCsyXT10aGlzLl96LGVbdCszXT10aGlzLl9vcmRlcixlfV9vbkNoYW5nZShlKXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz1lLHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fb3JkZXJ9fUdzLkRFRkFVTFRfT1JERVI9IlhZWiI7Y2xhc3MgaW97Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQoZSl7dGhpcy5tYXNrPSgxPDxlfDApPj4+MH1lbmFibGUoZSl7dGhpcy5tYXNrfD0xPDxlfDB9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZShlKXt0aGlzLm1hc2tePTE8PGV8MH1kaXNhYmxlKGUpe3RoaXMubWFzayY9figxPDxlfDApfWRpc2FibGVBbGwoKXt0aGlzLm1hc2s9MH10ZXN0KGUpe3JldHVybih0aGlzLm1hc2smZS5tYXNrKSE9PTB9aXNFbmFibGVkKGUpe3JldHVybih0aGlzLm1hc2smKDE8PGV8MCkpIT09MH19bGV0IGh4PTA7Y29uc3QgVWQ9bmV3IFAsTnI9bmV3IGxuLGlpPW5ldyBJZSxybz1uZXcgUCxWcz1uZXcgUCx1eD1uZXcgUCxmeD1uZXcgbG4sRGQ9bmV3IFAoMSwwLDApLE5kPW5ldyBQKDAsMSwwKSxGZD1uZXcgUCgwLDAsMSksZHg9e3R5cGU6ImFkZGVkIn0scHg9e3R5cGU6InJlbW92ZWQifTtjbGFzcyBydCBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzT2JqZWN0M0Q9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6aHgrK30pLHRoaXMudXVpZD1fbigpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik9iamVjdDNEIix0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49W10sdGhpcy51cD1ydC5ERUZBVUxUX1VQLmNsb25lKCk7Y29uc3QgZT1uZXcgUCx0PW5ldyBHcyxuPW5ldyBsbixpPW5ldyBQKDEsMSwxKTtmdW5jdGlvbiBzKCl7bi5zZXRGcm9tRXVsZXIodCwhMSl9ZnVuY3Rpb24gYSgpe3Quc2V0RnJvbVF1YXRlcm5pb24obix2b2lkIDAsITEpfXQuX29uQ2hhbmdlKHMpLG4uX29uQ2hhbmdlKGEpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTplfSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dH0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bn0sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOml9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IEllfSxub3JtYWxNYXRyaXg6e3ZhbHVlOm5ldyBaZX19KSx0aGlzLm1hdHJpeD1uZXcgSWUsdGhpcy5tYXRyaXhXb3JsZD1uZXcgSWUsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXJ0LkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPXJ0LkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0aGlzLmxheWVycz1uZXcgaW8sdGhpcy52aXNpYmxlPSEwLHRoaXMuY2FzdFNoYWRvdz0hMSx0aGlzLnJlY2VpdmVTaGFkb3c9ITEsdGhpcy5mcnVzdHVtQ3VsbGVkPSEwLHRoaXMucmVuZGVyT3JkZXI9MCx0aGlzLmFuaW1hdGlvbnM9W10sdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVNoYWRvdygpe31vbkFmdGVyU2hhZG93KCl7fW9uQmVmb3JlUmVuZGVyKCl7fW9uQWZ0ZXJSZW5kZXIoKXt9YXBwbHlNYXRyaXg0KGUpe3RoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLm1hdHJpeC5wcmVtdWx0aXBseShlKSx0aGlzLm1hdHJpeC5kZWNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSl9YXBwbHlRdWF0ZXJuaW9uKGUpe3JldHVybiB0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoZSksdGhpc31zZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUoZSx0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZShlLHQpfXNldFJvdGF0aW9uRnJvbUV1bGVyKGUpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoZSwhMCl9c2V0Um90YXRpb25Gcm9tTWF0cml4KGUpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoZSl9c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbihlKXt0aGlzLnF1YXRlcm5pb24uY29weShlKX1yb3RhdGVPbkF4aXMoZSx0KXtyZXR1cm4gTnIuc2V0RnJvbUF4aXNBbmdsZShlLHQpLHRoaXMucXVhdGVybmlvbi5tdWx0aXBseShOciksdGhpc31yb3RhdGVPbldvcmxkQXhpcyhlLHQpe3JldHVybiBOci5zZXRGcm9tQXhpc0FuZ2xlKGUsdCksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KE5yKSx0aGlzfXJvdGF0ZVgoZSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKERkLGUpfXJvdGF0ZVkoZSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKE5kLGUpfXJvdGF0ZVooZSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKEZkLGUpfXRyYW5zbGF0ZU9uQXhpcyhlLHQpe3JldHVybiBVZC5jb3B5KGUpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKFVkLm11bHRpcGx5U2NhbGFyKHQpKSx0aGlzfXRyYW5zbGF0ZVgoZSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKERkLGUpfXRyYW5zbGF0ZVkoZSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKE5kLGUpfXRyYW5zbGF0ZVooZSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKEZkLGUpfWxvY2FsVG9Xb3JsZChlKXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksZS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCl9d29ybGRUb0xvY2FsKGUpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxlLmFwcGx5TWF0cml4NChpaS5jb3B5KHRoaXMubWF0cml4V29ybGQpLmludmVydCgpKX1sb29rQXQoZSx0LG4pe2UuaXNWZWN0b3IzP3JvLmNvcHkoZSk6cm8uc2V0KGUsdCxuKTtjb25zdCBpPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLFZzLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKSx0aGlzLmlzQ2FtZXJhfHx0aGlzLmlzTGlnaHQ/aWkubG9va0F0KFZzLHJvLHRoaXMudXApOmlpLmxvb2tBdChybyxWcyx0aGlzLnVwKSx0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KGlpKSxpJiYoaWkuZXh0cmFjdFJvdGF0aW9uKGkubWF0cml4V29ybGQpLE5yLnNldEZyb21Sb3RhdGlvbk1hdHJpeChpaSksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KE5yLmludmVydCgpKSl9YWRkKGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg+MSl7Zm9yKGxldCB0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl0aGlzLmFkZChhcmd1bWVudHNbdF0pO3JldHVybiB0aGlzfXJldHVybiBlPT09dGhpcz8oY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuIixlKSx0aGlzKTooZSYmZS5pc09iamVjdDNEPyhlLnBhcmVudCE9PW51bGwmJmUucGFyZW50LnJlbW92ZShlKSxlLnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW4ucHVzaChlKSxlLmRpc3BhdGNoRXZlbnQoZHgpKTpjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIixlKSx0aGlzKX1yZW1vdmUoZSl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IG49MDtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRoaXMucmVtb3ZlKGFyZ3VtZW50c1tuXSk7cmV0dXJuIHRoaXN9Y29uc3QgdD10aGlzLmNoaWxkcmVuLmluZGV4T2YoZSk7cmV0dXJuIHQhPT0tMSYmKGUucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbi5zcGxpY2UodCwxKSxlLmRpc3BhdGNoRXZlbnQocHgpKSx0aGlzfXJlbW92ZUZyb21QYXJlbnQoKXtjb25zdCBlPXRoaXMucGFyZW50O3JldHVybiBlIT09bnVsbCYmZS5yZW1vdmUodGhpcyksdGhpc31jbGVhcigpe3JldHVybiB0aGlzLnJlbW92ZSguLi50aGlzLmNoaWxkcmVuKX1hdHRhY2goZSl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGlpLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksZS5wYXJlbnQhPT1udWxsJiYoZS5wYXJlbnQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLGlpLm11bHRpcGx5KGUucGFyZW50Lm1hdHJpeFdvcmxkKSksZS5hcHBseU1hdHJpeDQoaWkpLHRoaXMuYWRkKGUpLGUudXBkYXRlV29ybGRNYXRyaXgoITEsITApLHRoaXN9Z2V0T2JqZWN0QnlJZChlKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsZSl9Z2V0T2JqZWN0QnlOYW1lKGUpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoIm5hbWUiLGUpfWdldE9iamVjdEJ5UHJvcGVydHkoZSx0KXtpZih0aGlzW2VdPT09dClyZXR1cm4gdGhpcztmb3IobGV0IG49MCxpPXRoaXMuY2hpbGRyZW4ubGVuZ3RoO248aTtuKyspe2NvbnN0IGE9dGhpcy5jaGlsZHJlbltuXS5nZXRPYmplY3RCeVByb3BlcnR5KGUsdCk7aWYoYSE9PXZvaWQgMClyZXR1cm4gYX19Z2V0T2JqZWN0c0J5UHJvcGVydHkoZSx0LG49W10pe3RoaXNbZV09PT10JiZuLnB1c2godGhpcyk7Y29uc3QgaT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgcz0wLGE9aS5sZW5ndGg7czxhO3MrKylpW3NdLmdldE9iamVjdHNCeVByb3BlcnR5KGUsdCxuKTtyZXR1cm4gbn1nZXRXb3JsZFBvc2l0aW9uKGUpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxlLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKX1nZXRXb3JsZFF1YXRlcm5pb24oZSl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKFZzLGUsdXgpLGV9Z2V0V29ybGRTY2FsZShlKXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoVnMsZngsZSksZX1nZXRXb3JsZERpcmVjdGlvbihlKXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtjb25zdCB0PXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIGUuc2V0KHRbOF0sdFs5XSx0WzEwXSkubm9ybWFsaXplKCl9cmF5Y2FzdCgpe310cmF2ZXJzZShlKXtlKHRoaXMpO2NvbnN0IHQ9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxpPXQubGVuZ3RoO248aTtuKyspdFtuXS50cmF2ZXJzZShlKX10cmF2ZXJzZVZpc2libGUoZSl7aWYodGhpcy52aXNpYmxlPT09ITEpcmV0dXJuO2UodGhpcyk7Y29uc3QgdD10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKyl0W25dLnRyYXZlcnNlVmlzaWJsZShlKX10cmF2ZXJzZUFuY2VzdG9ycyhlKXtjb25zdCB0PXRoaXMucGFyZW50O3QhPT1udWxsJiYoZSh0KSx0LnRyYXZlcnNlQW5jZXN0b3JzKGUpKX11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH11cGRhdGVNYXRyaXhXb3JsZChlKXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8ZSkmJih0aGlzLnBhcmVudD09PW51bGw/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSxlPSEwKTtjb25zdCB0PXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKXtjb25zdCBzPXRbbl07KHMubWF0cml4V29ybGRBdXRvVXBkYXRlPT09ITB8fGU9PT0hMCkmJnMudXBkYXRlTWF0cml4V29ybGQoZSl9fXVwZGF0ZVdvcmxkTWF0cml4KGUsdCl7Y29uc3Qgbj10aGlzLnBhcmVudDtpZihlPT09ITAmJm4hPT1udWxsJiZuLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiZuLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5wYXJlbnQ9PT1udWxsP3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSx0PT09ITApe2NvbnN0IGk9dGhpcy5jaGlsZHJlbjtmb3IobGV0IHM9MCxhPWkubGVuZ3RoO3M8YTtzKyspe2NvbnN0IG89aVtzXTtvLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiZvLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19fXRvSlNPTihlKXtjb25zdCB0PWU9PT12b2lkIDB8fHR5cGVvZiBlPT0ic3RyaW5nIixuPXt9O3QmJihlPXtnZW9tZXRyaWVzOnt9LG1hdGVyaWFsczp7fSx0ZXh0dXJlczp7fSxpbWFnZXM6e30sc2hhcGVzOnt9LHNrZWxldG9uczp7fSxhbmltYXRpb25zOnt9LG5vZGVzOnt9fSxuLm1ldGFkYXRhPXt2ZXJzaW9uOjQuNix0eXBlOiJPYmplY3QiLGdlbmVyYXRvcjoiT2JqZWN0M0QudG9KU09OIn0pO2NvbnN0IGk9e307aS51dWlkPXRoaXMudXVpZCxpLnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYoaS5uYW1lPXRoaXMubmFtZSksdGhpcy5jYXN0U2hhZG93PT09ITAmJihpLmNhc3RTaGFkb3c9ITApLHRoaXMucmVjZWl2ZVNoYWRvdz09PSEwJiYoaS5yZWNlaXZlU2hhZG93PSEwKSx0aGlzLnZpc2libGU9PT0hMSYmKGkudmlzaWJsZT0hMSksdGhpcy5mcnVzdHVtQ3VsbGVkPT09ITEmJihpLmZydXN0dW1DdWxsZWQ9ITEpLHRoaXMucmVuZGVyT3JkZXIhPT0wJiYoaS5yZW5kZXJPcmRlcj10aGlzLnJlbmRlck9yZGVyKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKGkudXNlckRhdGE9dGhpcy51c2VyRGF0YSksaS5sYXllcnM9dGhpcy5sYXllcnMubWFzayxpLm1hdHJpeD10aGlzLm1hdHJpeC50b0FycmF5KCksaS51cD10aGlzLnVwLnRvQXJyYXkoKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9PT0hMSYmKGkubWF0cml4QXV0b1VwZGF0ZT0hMSksdGhpcy5pc0luc3RhbmNlZE1lc2gmJihpLnR5cGU9Ikluc3RhbmNlZE1lc2giLGkuY291bnQ9dGhpcy5jb3VudCxpLmluc3RhbmNlTWF0cml4PXRoaXMuaW5zdGFuY2VNYXRyaXgudG9KU09OKCksdGhpcy5pbnN0YW5jZUNvbG9yIT09bnVsbCYmKGkuaW5zdGFuY2VDb2xvcj10aGlzLmluc3RhbmNlQ29sb3IudG9KU09OKCkpKSx0aGlzLmlzQmF0Y2hlZE1lc2gmJihpLnR5cGU9IkJhdGNoZWRNZXNoIixpLnBlck9iamVjdEZydXN0dW1DdWxsZWQ9dGhpcy5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkLGkuc29ydE9iamVjdHM9dGhpcy5zb3J0T2JqZWN0cyxpLmRyYXdSYW5nZXM9dGhpcy5fZHJhd1JhbmdlcyxpLnJlc2VydmVkUmFuZ2VzPXRoaXMuX3Jlc2VydmVkUmFuZ2VzLGkudmlzaWJpbGl0eT10aGlzLl92aXNpYmlsaXR5LGkuYWN0aXZlPXRoaXMuX2FjdGl2ZSxpLmJvdW5kcz10aGlzLl9ib3VuZHMubWFwKG89Pih7Ym94SW5pdGlhbGl6ZWQ6by5ib3hJbml0aWFsaXplZCxib3hNaW46by5ib3gubWluLnRvQXJyYXkoKSxib3hNYXg6by5ib3gubWF4LnRvQXJyYXkoKSxzcGhlcmVJbml0aWFsaXplZDpvLnNwaGVyZUluaXRpYWxpemVkLHNwaGVyZVJhZGl1czpvLnNwaGVyZS5yYWRpdXMsc3BoZXJlQ2VudGVyOm8uc3BoZXJlLmNlbnRlci50b0FycmF5KCl9KSksaS5tYXhHZW9tZXRyeUNvdW50PXRoaXMuX21heEdlb21ldHJ5Q291bnQsaS5tYXhWZXJ0ZXhDb3VudD10aGlzLl9tYXhWZXJ0ZXhDb3VudCxpLm1heEluZGV4Q291bnQ9dGhpcy5fbWF4SW5kZXhDb3VudCxpLmdlb21ldHJ5SW5pdGlhbGl6ZWQ9dGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZCxpLmdlb21ldHJ5Q291bnQ9dGhpcy5fZ2VvbWV0cnlDb3VudCxpLm1hdHJpY2VzVGV4dHVyZT10aGlzLl9tYXRyaWNlc1RleHR1cmUudG9KU09OKGUpLHRoaXMuYm91bmRpbmdTcGhlcmUhPT1udWxsJiYoaS5ib3VuZGluZ1NwaGVyZT17Y2VudGVyOmkuYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSxyYWRpdXM6aS5ib3VuZGluZ1NwaGVyZS5yYWRpdXN9KSx0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmKGkuYm91bmRpbmdCb3g9e21pbjppLmJvdW5kaW5nQm94Lm1pbi50b0FycmF5KCksbWF4OmkuYm91bmRpbmdCb3gubWF4LnRvQXJyYXkoKX0pKTtmdW5jdGlvbiBzKG8sbCl7cmV0dXJuIG9bbC51dWlkXT09PXZvaWQgMCYmKG9bbC51dWlkXT1sLnRvSlNPTihlKSksbC51dWlkfWlmKHRoaXMuaXNTY2VuZSl0aGlzLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQuaXNDb2xvcj9pLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTigpOnRoaXMuYmFja2dyb3VuZC5pc1RleHR1cmUmJihpLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTihlKS51dWlkKSksdGhpcy5lbnZpcm9ubWVudCYmdGhpcy5lbnZpcm9ubWVudC5pc1RleHR1cmUmJnRoaXMuZW52aXJvbm1lbnQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlIT09ITAmJihpLmVudmlyb25tZW50PXRoaXMuZW52aXJvbm1lbnQudG9KU09OKGUpLnV1aWQpO2Vsc2UgaWYodGhpcy5pc01lc2h8fHRoaXMuaXNMaW5lfHx0aGlzLmlzUG9pbnRzKXtpLmdlb21ldHJ5PXMoZS5nZW9tZXRyaWVzLHRoaXMuZ2VvbWV0cnkpO2NvbnN0IG89dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKG8hPT12b2lkIDAmJm8uc2hhcGVzIT09dm9pZCAwKXtjb25zdCBsPW8uc2hhcGVzO2lmKEFycmF5LmlzQXJyYXkobCkpZm9yKGxldCBjPTAsaD1sLmxlbmd0aDtjPGg7YysrKXtjb25zdCB1PWxbY107cyhlLnNoYXBlcyx1KX1lbHNlIHMoZS5zaGFwZXMsbCl9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKGkuYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxpLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx0aGlzLnNrZWxldG9uIT09dm9pZCAwJiYocyhlLnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxpLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHRoaXMubWF0ZXJpYWwhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3Qgbz1bXTtmb3IobGV0IGw9MCxjPXRoaXMubWF0ZXJpYWwubGVuZ3RoO2w8YztsKyspby5wdXNoKHMoZS5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtsXSkpO2kubWF0ZXJpYWw9b31lbHNlIGkubWF0ZXJpYWw9cyhlLm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtpLmNoaWxkcmVuPVtdO2ZvcihsZXQgbz0wO288dGhpcy5jaGlsZHJlbi5sZW5ndGg7bysrKWkuY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW29dLnRvSlNPTihlKS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7aS5hbmltYXRpb25zPVtdO2ZvcihsZXQgbz0wO288dGhpcy5hbmltYXRpb25zLmxlbmd0aDtvKyspe2NvbnN0IGw9dGhpcy5hbmltYXRpb25zW29dO2kuYW5pbWF0aW9ucy5wdXNoKHMoZS5hbmltYXRpb25zLGwpKX19aWYodCl7Y29uc3Qgbz1hKGUuZ2VvbWV0cmllcyksbD1hKGUubWF0ZXJpYWxzKSxjPWEoZS50ZXh0dXJlcyksaD1hKGUuaW1hZ2VzKSx1PWEoZS5zaGFwZXMpLGY9YShlLnNrZWxldG9ucyksZD1hKGUuYW5pbWF0aW9ucykscD1hKGUubm9kZXMpO28ubGVuZ3RoPjAmJihuLmdlb21ldHJpZXM9byksbC5sZW5ndGg+MCYmKG4ubWF0ZXJpYWxzPWwpLGMubGVuZ3RoPjAmJihuLnRleHR1cmVzPWMpLGgubGVuZ3RoPjAmJihuLmltYWdlcz1oKSx1Lmxlbmd0aD4wJiYobi5zaGFwZXM9dSksZi5sZW5ndGg+MCYmKG4uc2tlbGV0b25zPWYpLGQubGVuZ3RoPjAmJihuLmFuaW1hdGlvbnM9ZCkscC5sZW5ndGg+MCYmKG4ubm9kZXM9cCl9cmV0dXJuIG4ub2JqZWN0PWksbjtmdW5jdGlvbiBhKG8pe2NvbnN0IGw9W107Zm9yKGNvbnN0IGMgaW4gbyl7Y29uc3QgaD1vW2NdO2RlbGV0ZSBoLm1ldGFkYXRhLGwucHVzaChoKX1yZXR1cm4gbH19Y2xvbmUoZSl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzLGUpfWNvcHkoZSx0PSEwKXtpZih0aGlzLm5hbWU9ZS5uYW1lLHRoaXMudXAuY29weShlLnVwKSx0aGlzLnBvc2l0aW9uLmNvcHkoZS5wb3NpdGlvbiksdGhpcy5yb3RhdGlvbi5vcmRlcj1lLnJvdGF0aW9uLm9yZGVyLHRoaXMucXVhdGVybmlvbi5jb3B5KGUucXVhdGVybmlvbiksdGhpcy5zY2FsZS5jb3B5KGUuc2NhbGUpLHRoaXMubWF0cml4LmNvcHkoZS5tYXRyaXgpLHRoaXMubWF0cml4V29ybGQuY29weShlLm1hdHJpeFdvcmxkKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ZS5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlPWUubWF0cml4V29ybGRBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT1lLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsdGhpcy5sYXllcnMubWFzaz1lLmxheWVycy5tYXNrLHRoaXMudmlzaWJsZT1lLnZpc2libGUsdGhpcy5jYXN0U2hhZG93PWUuY2FzdFNoYWRvdyx0aGlzLnJlY2VpdmVTaGFkb3c9ZS5yZWNlaXZlU2hhZG93LHRoaXMuZnJ1c3R1bUN1bGxlZD1lLmZydXN0dW1DdWxsZWQsdGhpcy5yZW5kZXJPcmRlcj1lLnJlbmRlck9yZGVyLHRoaXMuYW5pbWF0aW9ucz1lLmFuaW1hdGlvbnMuc2xpY2UoKSx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZS51c2VyRGF0YSkpLHQ9PT0hMClmb3IobGV0IG49MDtuPGUuY2hpbGRyZW4ubGVuZ3RoO24rKyl7Y29uc3QgaT1lLmNoaWxkcmVuW25dO3RoaXMuYWRkKGkuY2xvbmUoKSl9cmV0dXJuIHRoaXN9fXJ0LkRFRkFVTFRfVVA9bmV3IFAoMCwxLDApLHJ0LkRFRkFVTFRfTUFUUklYX0FVVE9fVVBEQVRFPSEwLHJ0LkRFRkFVTFRfTUFUUklYX1dPUkxEX0FVVE9fVVBEQVRFPSEwO2NvbnN0IERuPW5ldyBQLHJpPW5ldyBQLGZoPW5ldyBQLHNpPW5ldyBQLEZyPW5ldyBQLE9yPW5ldyBQLE9kPW5ldyBQLGRoPW5ldyBQLHBoPW5ldyBQLG1oPW5ldyBQO2xldCBzbz0hMTtjbGFzcyBjbntjb25zdHJ1Y3RvcihlPW5ldyBQLHQ9bmV3IFAsbj1uZXcgUCl7dGhpcy5hPWUsdGhpcy5iPXQsdGhpcy5jPW59c3RhdGljIGdldE5vcm1hbChlLHQsbixpKXtpLnN1YlZlY3RvcnMobix0KSxEbi5zdWJWZWN0b3JzKGUsdCksaS5jcm9zcyhEbik7Y29uc3Qgcz1pLmxlbmd0aFNxKCk7cmV0dXJuIHM+MD9pLm11bHRpcGx5U2NhbGFyKDEvTWF0aC5zcXJ0KHMpKTppLnNldCgwLDAsMCl9c3RhdGljIGdldEJhcnljb29yZChlLHQsbixpLHMpe0RuLnN1YlZlY3RvcnMoaSx0KSxyaS5zdWJWZWN0b3JzKG4sdCksZmguc3ViVmVjdG9ycyhlLHQpO2NvbnN0IGE9RG4uZG90KERuKSxvPURuLmRvdChyaSksbD1Ebi5kb3QoZmgpLGM9cmkuZG90KHJpKSxoPXJpLmRvdChmaCksdT1hKmMtbypvO2lmKHU9PT0wKXJldHVybiBzLnNldCgtMiwtMSwtMSk7Y29uc3QgZj0xL3UsZD0oYypsLW8qaCkqZixwPShhKmgtbypsKSpmO3JldHVybiBzLnNldCgxLWQtcCxwLGQpfXN0YXRpYyBjb250YWluc1BvaW50KGUsdCxuLGkpe3JldHVybiB0aGlzLmdldEJhcnljb29yZChlLHQsbixpLHNpKSxzaS54Pj0wJiZzaS55Pj0wJiZzaS54K3NpLnk8PTF9c3RhdGljIGdldFVWKGUsdCxuLGkscyxhLG8sbCl7cmV0dXJuIHNvPT09ITEmJihjb25zb2xlLndhcm4oIlRIUkVFLlRyaWFuZ2xlLmdldFVWKCkgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5UcmlhbmdsZS5nZXRJbnRlcnBvbGF0aW9uKCkuIiksc289ITApLHRoaXMuZ2V0SW50ZXJwb2xhdGlvbihlLHQsbixpLHMsYSxvLGwpfXN0YXRpYyBnZXRJbnRlcnBvbGF0aW9uKGUsdCxuLGkscyxhLG8sbCl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKGUsdCxuLGksc2kpLGwuc2V0U2NhbGFyKDApLGwuYWRkU2NhbGVkVmVjdG9yKHMsc2kueCksbC5hZGRTY2FsZWRWZWN0b3IoYSxzaS55KSxsLmFkZFNjYWxlZFZlY3RvcihvLHNpLnopLGx9c3RhdGljIGlzRnJvbnRGYWNpbmcoZSx0LG4saSl7cmV0dXJuIERuLnN1YlZlY3RvcnMobix0KSxyaS5zdWJWZWN0b3JzKGUsdCksRG4uY3Jvc3MocmkpLmRvdChpKTwwfXNldChlLHQsbil7cmV0dXJuIHRoaXMuYS5jb3B5KGUpLHRoaXMuYi5jb3B5KHQpLHRoaXMuYy5jb3B5KG4pLHRoaXN9c2V0RnJvbVBvaW50c0FuZEluZGljZXMoZSx0LG4saSl7cmV0dXJuIHRoaXMuYS5jb3B5KGVbdF0pLHRoaXMuYi5jb3B5KGVbbl0pLHRoaXMuYy5jb3B5KGVbaV0pLHRoaXN9c2V0RnJvbUF0dHJpYnV0ZUFuZEluZGljZXMoZSx0LG4saSl7cmV0dXJuIHRoaXMuYS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCksdGhpcy5iLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxuKSx0aGlzLmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGkpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkoZSl7cmV0dXJuIHRoaXMuYS5jb3B5KGUuYSksdGhpcy5iLmNvcHkoZS5iKSx0aGlzLmMuY29weShlLmMpLHRoaXN9Z2V0QXJlYSgpe3JldHVybiBEbi5zdWJWZWN0b3JzKHRoaXMuYyx0aGlzLmIpLHJpLnN1YlZlY3RvcnModGhpcy5hLHRoaXMuYiksRG4uY3Jvc3MocmkpLmxlbmd0aCgpKi41fWdldE1pZHBvaW50KGUpe3JldHVybiBlLmFkZFZlY3RvcnModGhpcy5hLHRoaXMuYikuYWRkKHRoaXMuYykubXVsdGlwbHlTY2FsYXIoMS8zKX1nZXROb3JtYWwoZSl7cmV0dXJuIGNuLmdldE5vcm1hbCh0aGlzLmEsdGhpcy5iLHRoaXMuYyxlKX1nZXRQbGFuZShlKXtyZXR1cm4gZS5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfWdldEJhcnljb29yZChlLHQpe3JldHVybiBjbi5nZXRCYXJ5Y29vcmQoZSx0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1nZXRVVihlLHQsbixpLHMpe3JldHVybiBzbz09PSExJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZS5nZXRVVigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuVHJpYW5nbGUuZ2V0SW50ZXJwb2xhdGlvbigpLiIpLHNvPSEwKSxjbi5nZXRJbnRlcnBvbGF0aW9uKGUsdGhpcy5hLHRoaXMuYix0aGlzLmMsdCxuLGkscyl9Z2V0SW50ZXJwb2xhdGlvbihlLHQsbixpLHMpe3JldHVybiBjbi5nZXRJbnRlcnBvbGF0aW9uKGUsdGhpcy5hLHRoaXMuYix0aGlzLmMsdCxuLGkscyl9Y29udGFpbnNQb2ludChlKXtyZXR1cm4gY24uY29udGFpbnNQb2ludChlLHRoaXMuYSx0aGlzLmIsdGhpcy5jKX1pc0Zyb250RmFjaW5nKGUpe3JldHVybiBjbi5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLGUpfWludGVyc2VjdHNCb3goZSl7cmV0dXJuIGUuaW50ZXJzZWN0c1RyaWFuZ2xlKHRoaXMpfWNsb3Nlc3RQb2ludFRvUG9pbnQoZSx0KXtjb25zdCBuPXRoaXMuYSxpPXRoaXMuYixzPXRoaXMuYztsZXQgYSxvO0ZyLnN1YlZlY3RvcnMoaSxuKSxPci5zdWJWZWN0b3JzKHMsbiksZGguc3ViVmVjdG9ycyhlLG4pO2NvbnN0IGw9RnIuZG90KGRoKSxjPU9yLmRvdChkaCk7aWYobDw9MCYmYzw9MClyZXR1cm4gdC5jb3B5KG4pO3BoLnN1YlZlY3RvcnMoZSxpKTtjb25zdCBoPUZyLmRvdChwaCksdT1Pci5kb3QocGgpO2lmKGg+PTAmJnU8PWgpcmV0dXJuIHQuY29weShpKTtjb25zdCBmPWwqdS1oKmM7aWYoZjw9MCYmbD49MCYmaDw9MClyZXR1cm4gYT1sLyhsLWgpLHQuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoRnIsYSk7bWguc3ViVmVjdG9ycyhlLHMpO2NvbnN0IGQ9RnIuZG90KG1oKSxwPU9yLmRvdChtaCk7aWYocD49MCYmZDw9cClyZXR1cm4gdC5jb3B5KHMpO2NvbnN0IF89ZCpjLWwqcDtpZihfPD0wJiZjPj0wJiZwPD0wKXJldHVybiBvPWMvKGMtcCksdC5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihPcixvKTtjb25zdCBnPWgqcC1kKnU7aWYoZzw9MCYmdS1oPj0wJiZkLXA+PTApcmV0dXJuIE9kLnN1YlZlY3RvcnMocyxpKSxvPSh1LWgpLyh1LWgrKGQtcCkpLHQuY29weShpKS5hZGRTY2FsZWRWZWN0b3IoT2Qsbyk7Y29uc3QgbT0xLyhnK18rZik7cmV0dXJuIGE9XyptLG89ZiptLHQuY29weShuKS5hZGRTY2FsZWRWZWN0b3IoRnIsYSkuYWRkU2NhbGVkVmVjdG9yKE9yLG8pfWVxdWFscyhlKXtyZXR1cm4gZS5hLmVxdWFscyh0aGlzLmEpJiZlLmIuZXF1YWxzKHRoaXMuYikmJmUuYy5lcXVhbHModGhpcy5jKX19Y29uc3QgQmQ9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0sUmk9e2g6MCxzOjAsbDowfSxhbz17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIGdoKHIsZSx0KXtyZXR1cm4gdDwwJiYodCs9MSksdD4xJiYodC09MSksdDwxLzY/cisoZS1yKSo2KnQ6dDwxLzI/ZTp0PDIvMz9yKyhlLXIpKjYqKDIvMy10KTpyfWxldCB5ZT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7cmV0dXJuIHRoaXMuaXNDb2xvcj0hMCx0aGlzLnI9MSx0aGlzLmc9MSx0aGlzLmI9MSx0aGlzLnNldChlLHQsbil9c2V0KGUsdCxuKXtpZih0PT09dm9pZCAwJiZuPT09dm9pZCAwKXtjb25zdCBpPWU7aSYmaS5pc0NvbG9yP3RoaXMuY29weShpKTp0eXBlb2YgaT09Im51bWJlciI/dGhpcy5zZXRIZXgoaSk6dHlwZW9mIGk9PSJzdHJpbmciJiZ0aGlzLnNldFN0eWxlKGkpfWVsc2UgdGhpcy5zZXRSR0IoZSx0LG4pO3JldHVybiB0aGlzfXNldFNjYWxhcihlKXtyZXR1cm4gdGhpcy5yPWUsdGhpcy5nPWUsdGhpcy5iPWUsdGhpc31zZXRIZXgoZSx0PVB0KXtyZXR1cm4gZT1NYXRoLmZsb29yKGUpLHRoaXMucj0oZT4+MTYmMjU1KS8yNTUsdGhpcy5nPShlPj44JjI1NSkvMjU1LHRoaXMuYj0oZSYyNTUpLzI1NSxvdC50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsdCksdGhpc31zZXRSR0IoZSx0LG4saT1vdC53b3JraW5nQ29sb3JTcGFjZSl7cmV0dXJuIHRoaXMucj1lLHRoaXMuZz10LHRoaXMuYj1uLG90LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxpKSx0aGlzfXNldEhTTChlLHQsbixpPW90LndvcmtpbmdDb2xvclNwYWNlKXtpZihlPWpjKGUsMSksdD1fdCh0LDAsMSksbj1fdChuLDAsMSksdD09PTApdGhpcy5yPXRoaXMuZz10aGlzLmI9bjtlbHNle2NvbnN0IHM9bjw9LjU/biooMSt0KTpuK3Qtbip0LGE9MipuLXM7dGhpcy5yPWdoKGEscyxlKzEvMyksdGhpcy5nPWdoKGEscyxlKSx0aGlzLmI9Z2goYSxzLGUtMS8zKX1yZXR1cm4gb3QudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLGkpLHRoaXN9c2V0U3R5bGUoZSx0PVB0KXtmdW5jdGlvbiBuKHMpe3MhPT12b2lkIDAmJnBhcnNlRmxvYXQocyk8MSYmY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrZSsiIHdpbGwgYmUgaWdub3JlZC4iKX1sZXQgaTtpZihpPS9eKFx3KylcKChbXlwpXSopXCkvLmV4ZWMoZSkpe2xldCBzO2NvbnN0IGE9aVsxXSxvPWlbMl07c3dpdGNoKGEpe2Nhc2UicmdiIjpjYXNlInJnYmEiOmlmKHM9L15ccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhvKSlyZXR1cm4gbihzWzRdKSx0aGlzLnNldFJHQihNYXRoLm1pbigyNTUscGFyc2VJbnQoc1sxXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoc1syXSwxMCkpLzI1NSxNYXRoLm1pbigyNTUscGFyc2VJbnQoc1szXSwxMCkpLzI1NSx0KTtpZihzPS9eXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMobykpcmV0dXJuIG4oc1s0XSksdGhpcy5zZXRSR0IoTWF0aC5taW4oMTAwLHBhcnNlSW50KHNbMV0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHNbMl0sMTApKS8xMDAsTWF0aC5taW4oMTAwLHBhcnNlSW50KHNbM10sMTApKS8xMDAsdCk7YnJlYWs7Y2FzZSJoc2wiOmNhc2UiaHNsYSI6aWYocz0vXlxzKihcZCpcLj9cZCspXHMqLFxzKihcZCpcLj9cZCspXCVccyosXHMqKFxkKlwuP1xkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhvKSlyZXR1cm4gbihzWzRdKSx0aGlzLnNldEhTTChwYXJzZUZsb2F0KHNbMV0pLzM2MCxwYXJzZUZsb2F0KHNbMl0pLzEwMCxwYXJzZUZsb2F0KHNbM10pLzEwMCx0KTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgbW9kZWwgIitlKX19ZWxzZSBpZihpPS9eXCMoW0EtRmEtZlxkXSspJC8uZXhlYyhlKSl7Y29uc3Qgcz1pWzFdLGE9cy5sZW5ndGg7aWYoYT09PTMpcmV0dXJuIHRoaXMuc2V0UkdCKHBhcnNlSW50KHMuY2hhckF0KDApLDE2KS8xNSxwYXJzZUludChzLmNoYXJBdCgxKSwxNikvMTUscGFyc2VJbnQocy5jaGFyQXQoMiksMTYpLzE1LHQpO2lmKGE9PT02KXJldHVybiB0aGlzLnNldEhleChwYXJzZUludChzLDE2KSx0KTtjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBJbnZhbGlkIGhleCBjb2xvciAiK2UpfWVsc2UgaWYoZSYmZS5sZW5ndGg+MClyZXR1cm4gdGhpcy5zZXRDb2xvck5hbWUoZSx0KTtyZXR1cm4gdGhpc31zZXRDb2xvck5hbWUoZSx0PVB0KXtjb25zdCBuPUJkW2UudG9Mb3dlckNhc2UoKV07cmV0dXJuIG4hPT12b2lkIDA/dGhpcy5zZXRIZXgobix0KTpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICIrZSksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsdGhpcy5nLHRoaXMuYil9Y29weShlKXtyZXR1cm4gdGhpcy5yPWUucix0aGlzLmc9ZS5nLHRoaXMuYj1lLmIsdGhpc31jb3B5U1JHQlRvTGluZWFyKGUpe3JldHVybiB0aGlzLnI9Q3IoZS5yKSx0aGlzLmc9Q3IoZS5nKSx0aGlzLmI9Q3IoZS5iKSx0aGlzfWNvcHlMaW5lYXJUb1NSR0IoZSl7cmV0dXJuIHRoaXMucj1uaChlLnIpLHRoaXMuZz1uaChlLmcpLHRoaXMuYj1uaChlLmIpLHRoaXN9Y29udmVydFNSR0JUb0xpbmVhcigpe3JldHVybiB0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyksdGhpc31jb252ZXJ0TGluZWFyVG9TUkdCKCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvU1JHQih0aGlzKSx0aGlzfWdldEhleChlPVB0KXtyZXR1cm4gb3QuZnJvbVdvcmtpbmdDb2xvclNwYWNlKFZ0LmNvcHkodGhpcyksZSksTWF0aC5yb3VuZChfdChWdC5yKjI1NSwwLDI1NSkpKjY1NTM2K01hdGgucm91bmQoX3QoVnQuZyoyNTUsMCwyNTUpKSoyNTYrTWF0aC5yb3VuZChfdChWdC5iKjI1NSwwLDI1NSkpfWdldEhleFN0cmluZyhlPVB0KXtyZXR1cm4oIjAwMDAwMCIrdGhpcy5nZXRIZXgoZSkudG9TdHJpbmcoMTYpKS5zbGljZSgtNil9Z2V0SFNMKGUsdD1vdC53b3JraW5nQ29sb3JTcGFjZSl7b3QuZnJvbVdvcmtpbmdDb2xvclNwYWNlKFZ0LmNvcHkodGhpcyksdCk7Y29uc3Qgbj1WdC5yLGk9VnQuZyxzPVZ0LmIsYT1NYXRoLm1heChuLGkscyksbz1NYXRoLm1pbihuLGkscyk7bGV0IGwsYztjb25zdCBoPShvK2EpLzI7aWYobz09PWEpbD0wLGM9MDtlbHNle2NvbnN0IHU9YS1vO3N3aXRjaChjPWg8PS41P3UvKGErbyk6dS8oMi1hLW8pLGEpe2Nhc2UgbjpsPShpLXMpL3UrKGk8cz82OjApO2JyZWFrO2Nhc2UgaTpsPShzLW4pL3UrMjticmVhaztjYXNlIHM6bD0obi1pKS91KzQ7YnJlYWt9bC89Nn1yZXR1cm4gZS5oPWwsZS5zPWMsZS5sPWgsZX1nZXRSR0IoZSx0PW90LndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gb3QuZnJvbVdvcmtpbmdDb2xvclNwYWNlKFZ0LmNvcHkodGhpcyksdCksZS5yPVZ0LnIsZS5nPVZ0LmcsZS5iPVZ0LmIsZX1nZXRTdHlsZShlPVB0KXtvdC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoVnQuY29weSh0aGlzKSxlKTtjb25zdCB0PVZ0LnIsbj1WdC5nLGk9VnQuYjtyZXR1cm4gZSE9PVB0P2Bjb2xvcigke2V9ICR7dC50b0ZpeGVkKDMpfSAke24udG9GaXhlZCgzKX0gJHtpLnRvRml4ZWQoMyl9KWA6YHJnYigke01hdGgucm91bmQodCoyNTUpfSwke01hdGgucm91bmQobioyNTUpfSwke01hdGgucm91bmQoaSoyNTUpfSlgfW9mZnNldEhTTChlLHQsbil7cmV0dXJuIHRoaXMuZ2V0SFNMKFJpKSx0aGlzLnNldEhTTChSaS5oK2UsUmkucyt0LFJpLmwrbil9YWRkKGUpe3JldHVybiB0aGlzLnIrPWUucix0aGlzLmcrPWUuZyx0aGlzLmIrPWUuYix0aGlzfWFkZENvbG9ycyhlLHQpe3JldHVybiB0aGlzLnI9ZS5yK3Qucix0aGlzLmc9ZS5nK3QuZyx0aGlzLmI9ZS5iK3QuYix0aGlzfWFkZFNjYWxhcihlKXtyZXR1cm4gdGhpcy5yKz1lLHRoaXMuZys9ZSx0aGlzLmIrPWUsdGhpc31zdWIoZSl7cmV0dXJuIHRoaXMucj1NYXRoLm1heCgwLHRoaXMuci1lLnIpLHRoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy1lLmcpLHRoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi1lLmIpLHRoaXN9bXVsdGlwbHkoZSl7cmV0dXJuIHRoaXMucio9ZS5yLHRoaXMuZyo9ZS5nLHRoaXMuYio9ZS5iLHRoaXN9bXVsdGlwbHlTY2FsYXIoZSl7cmV0dXJuIHRoaXMucio9ZSx0aGlzLmcqPWUsdGhpcy5iKj1lLHRoaXN9bGVycChlLHQpe3JldHVybiB0aGlzLnIrPShlLnItdGhpcy5yKSp0LHRoaXMuZys9KGUuZy10aGlzLmcpKnQsdGhpcy5iKz0oZS5iLXRoaXMuYikqdCx0aGlzfWxlcnBDb2xvcnMoZSx0LG4pe3JldHVybiB0aGlzLnI9ZS5yKyh0LnItZS5yKSpuLHRoaXMuZz1lLmcrKHQuZy1lLmcpKm4sdGhpcy5iPWUuYisodC5iLWUuYikqbix0aGlzfWxlcnBIU0woZSx0KXt0aGlzLmdldEhTTChSaSksZS5nZXRIU0woYW8pO2NvbnN0IG49RnMoUmkuaCxhby5oLHQpLGk9RnMoUmkucyxhby5zLHQpLHM9RnMoUmkubCxhby5sLHQpO3JldHVybiB0aGlzLnNldEhTTChuLGkscyksdGhpc31zZXRGcm9tVmVjdG9yMyhlKXtyZXR1cm4gdGhpcy5yPWUueCx0aGlzLmc9ZS55LHRoaXMuYj1lLnosdGhpc31hcHBseU1hdHJpeDMoZSl7Y29uc3QgdD10aGlzLnIsbj10aGlzLmcsaT10aGlzLmIscz1lLmVsZW1lbnRzO3JldHVybiB0aGlzLnI9c1swXSp0K3NbM10qbitzWzZdKmksdGhpcy5nPXNbMV0qdCtzWzRdKm4rc1s3XSppLHRoaXMuYj1zWzJdKnQrc1s1XSpuK3NbOF0qaSx0aGlzfWVxdWFscyhlKXtyZXR1cm4gZS5yPT09dGhpcy5yJiZlLmc9PT10aGlzLmcmJmUuYj09PXRoaXMuYn1mcm9tQXJyYXkoZSx0PTApe3JldHVybiB0aGlzLnI9ZVt0XSx0aGlzLmc9ZVt0KzFdLHRoaXMuYj1lW3QrMl0sdGhpc310b0FycmF5KGU9W10sdD0wKXtyZXR1cm4gZVt0XT10aGlzLnIsZVt0KzFdPXRoaXMuZyxlW3QrMl09dGhpcy5iLGV9ZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQpe3JldHVybiB0aGlzLnI9ZS5nZXRYKHQpLHRoaXMuZz1lLmdldFkodCksdGhpcy5iPWUuZ2V0Wih0KSx0aGlzfXRvSlNPTigpe3JldHVybiB0aGlzLmdldEhleCgpfSpbU3ltYm9sLml0ZXJhdG9yXSgpe3lpZWxkIHRoaXMucix5aWVsZCB0aGlzLmcseWllbGQgdGhpcy5ifX07Y29uc3QgVnQ9bmV3IHllO3llLk5BTUVTPUJkO2xldCBteD0wO2NsYXNzIEh0IGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNNYXRlcmlhbD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpteCsrfSksdGhpcy51dWlkPV9uKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iTWF0ZXJpYWwiLHRoaXMuYmxlbmRpbmc9QmksdGhpcy5zaWRlPVluLHRoaXMudmVydGV4Q29sb3JzPSExLHRoaXMub3BhY2l0eT0xLHRoaXMudHJhbnNwYXJlbnQ9ITEsdGhpcy5hbHBoYUhhc2g9ITEsdGhpcy5ibGVuZFNyYz1EYSx0aGlzLmJsZW5kRHN0PU5hLHRoaXMuYmxlbmRFcXVhdGlvbj14aSx0aGlzLmJsZW5kU3JjQWxwaGE9bnVsbCx0aGlzLmJsZW5kRHN0QWxwaGE9bnVsbCx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1udWxsLHRoaXMuYmxlbmRDb2xvcj1uZXcgeWUoMCwwLDApLHRoaXMuYmxlbmRBbHBoYT0wLHRoaXMuZGVwdGhGdW5jPU1zLHRoaXMuZGVwdGhUZXN0PSEwLHRoaXMuZGVwdGhXcml0ZT0hMCx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9MjU1LHRoaXMuc3RlbmNpbEZ1bmM9SmMsdGhpcy5zdGVuY2lsUmVmPTAsdGhpcy5zdGVuY2lsRnVuY01hc2s9MjU1LHRoaXMuc3RlbmNpbEZhaWw9VmksdGhpcy5zdGVuY2lsWkZhaWw9VmksdGhpcy5zdGVuY2lsWlBhc3M9VmksdGhpcy5zdGVuY2lsV3JpdGU9ITEsdGhpcy5jbGlwcGluZ1BsYW5lcz1udWxsLHRoaXMuY2xpcEludGVyc2VjdGlvbj0hMSx0aGlzLmNsaXBTaGFkb3dzPSExLHRoaXMuc2hhZG93U2lkZT1udWxsLHRoaXMuY29sb3JXcml0ZT0hMCx0aGlzLnByZWNpc2lvbj1udWxsLHRoaXMucG9seWdvbk9mZnNldD0hMSx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9MCx0aGlzLnBvbHlnb25PZmZzZXRVbml0cz0wLHRoaXMuZGl0aGVyaW5nPSExLHRoaXMuYWxwaGFUb0NvdmVyYWdlPSExLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPSExLHRoaXMuZm9yY2VTaW5nbGVQYXNzPSExLHRoaXMudmlzaWJsZT0hMCx0aGlzLnRvbmVNYXBwZWQ9ITAsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLl9hbHBoYVRlc3Q9MH1nZXQgYWxwaGFUZXN0KCl7cmV0dXJuIHRoaXMuX2FscGhhVGVzdH1zZXQgYWxwaGFUZXN0KGUpe3RoaXMuX2FscGhhVGVzdD4wIT1lPjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX2FscGhhVGVzdD1lfW9uQnVpbGQoKXt9b25CZWZvcmVSZW5kZXIoKXt9b25CZWZvcmVDb21waWxlKCl7fWN1c3RvbVByb2dyYW1DYWNoZUtleSgpe3JldHVybiB0aGlzLm9uQmVmb3JlQ29tcGlsZS50b1N0cmluZygpfXNldFZhbHVlcyhlKXtpZihlIT09dm9pZCAwKWZvcihjb25zdCB0IGluIGUpe2NvbnN0IG49ZVt0XTtpZihuPT09dm9pZCAwKXtjb25zb2xlLndhcm4oYFRIUkVFLk1hdGVyaWFsOiBwYXJhbWV0ZXIgJyR7dH0nIGhhcyB2YWx1ZSBvZiB1bmRlZmluZWQuYCk7Y29udGludWV9Y29uc3QgaT10aGlzW3RdO2lmKGk9PT12b2lkIDApe2NvbnNvbGUud2FybihgVEhSRUUuTWF0ZXJpYWw6ICcke3R9JyBpcyBub3QgYSBwcm9wZXJ0eSBvZiBUSFJFRS4ke3RoaXMudHlwZX0uYCk7Y29udGludWV9aSYmaS5pc0NvbG9yP2kuc2V0KG4pOmkmJmkuaXNWZWN0b3IzJiZuJiZuLmlzVmVjdG9yMz9pLmNvcHkobik6dGhpc1t0XT1ufX10b0pTT04oZSl7Y29uc3QgdD1lPT09dm9pZCAwfHx0eXBlb2YgZT09InN0cmluZyI7dCYmKGU9e3RleHR1cmVzOnt9LGltYWdlczp7fX0pO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNix0eXBlOiJNYXRlcmlhbCIsZ2VuZXJhdG9yOiJNYXRlcmlhbC50b0pTT04ifX07bi51dWlkPXRoaXMudXVpZCxuLnR5cGU9dGhpcy50eXBlLHRoaXMubmFtZSE9PSIiJiYobi5uYW1lPXRoaXMubmFtZSksdGhpcy5jb2xvciYmdGhpcy5jb2xvci5pc0NvbG9yJiYobi5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpKSx0aGlzLnJvdWdobmVzcyE9PXZvaWQgMCYmKG4ucm91Z2huZXNzPXRoaXMucm91Z2huZXNzKSx0aGlzLm1ldGFsbmVzcyE9PXZvaWQgMCYmKG4ubWV0YWxuZXNzPXRoaXMubWV0YWxuZXNzKSx0aGlzLnNoZWVuIT09dm9pZCAwJiYobi5zaGVlbj10aGlzLnNoZWVuKSx0aGlzLnNoZWVuQ29sb3ImJnRoaXMuc2hlZW5Db2xvci5pc0NvbG9yJiYobi5zaGVlbkNvbG9yPXRoaXMuc2hlZW5Db2xvci5nZXRIZXgoKSksdGhpcy5zaGVlblJvdWdobmVzcyE9PXZvaWQgMCYmKG4uc2hlZW5Sb3VnaG5lc3M9dGhpcy5zaGVlblJvdWdobmVzcyksdGhpcy5lbWlzc2l2ZSYmdGhpcy5lbWlzc2l2ZS5pc0NvbG9yJiYobi5lbWlzc2l2ZT10aGlzLmVtaXNzaXZlLmdldEhleCgpKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5JiZ0aGlzLmVtaXNzaXZlSW50ZW5zaXR5IT09MSYmKG4uZW1pc3NpdmVJbnRlbnNpdHk9dGhpcy5lbWlzc2l2ZUludGVuc2l0eSksdGhpcy5zcGVjdWxhciYmdGhpcy5zcGVjdWxhci5pc0NvbG9yJiYobi5zcGVjdWxhcj10aGlzLnNwZWN1bGFyLmdldEhleCgpKSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5IT09dm9pZCAwJiYobi5zcGVjdWxhckludGVuc2l0eT10aGlzLnNwZWN1bGFySW50ZW5zaXR5KSx0aGlzLnNwZWN1bGFyQ29sb3ImJnRoaXMuc3BlY3VsYXJDb2xvci5pc0NvbG9yJiYobi5zcGVjdWxhckNvbG9yPXRoaXMuc3BlY3VsYXJDb2xvci5nZXRIZXgoKSksdGhpcy5zaGluaW5lc3MhPT12b2lkIDAmJihuLnNoaW5pbmVzcz10aGlzLnNoaW5pbmVzcyksdGhpcy5jbGVhcmNvYXQhPT12b2lkIDAmJihuLmNsZWFyY29hdD10aGlzLmNsZWFyY29hdCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MhPT12b2lkIDAmJihuLmNsZWFyY29hdFJvdWdobmVzcz10aGlzLmNsZWFyY29hdFJvdWdobmVzcyksdGhpcy5jbGVhcmNvYXRNYXAmJnRoaXMuY2xlYXJjb2F0TWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0TWFwPXRoaXMuY2xlYXJjb2F0TWFwLnRvSlNPTihlKS51dWlkKSx0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCYmdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwJiZ0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE5vcm1hbE1hcD10aGlzLmNsZWFyY29hdE5vcm1hbE1hcC50b0pTT04oZSkudXVpZCxuLmNsZWFyY29hdE5vcm1hbFNjYWxlPXRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudG9BcnJheSgpKSx0aGlzLmlyaWRlc2NlbmNlIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZT10aGlzLmlyaWRlc2NlbmNlKSx0aGlzLmlyaWRlc2NlbmNlSU9SIT09dm9pZCAwJiYobi5pcmlkZXNjZW5jZUlPUj10aGlzLmlyaWRlc2NlbmNlSU9SKSx0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UhPT12b2lkIDAmJihuLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2U9dGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlKSx0aGlzLmlyaWRlc2NlbmNlTWFwJiZ0aGlzLmlyaWRlc2NlbmNlTWFwLmlzVGV4dHVyZSYmKG4uaXJpZGVzY2VuY2VNYXA9dGhpcy5pcmlkZXNjZW5jZU1hcC50b0pTT04oZSkudXVpZCksdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCYmdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcC5pc1RleHR1cmUmJihuLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMuYW5pc290cm9weSE9PXZvaWQgMCYmKG4uYW5pc290cm9weT10aGlzLmFuaXNvdHJvcHkpLHRoaXMuYW5pc290cm9weVJvdGF0aW9uIT09dm9pZCAwJiYobi5hbmlzb3Ryb3B5Um90YXRpb249dGhpcy5hbmlzb3Ryb3B5Um90YXRpb24pLHRoaXMuYW5pc290cm9weU1hcCYmdGhpcy5hbmlzb3Ryb3B5TWFwLmlzVGV4dHVyZSYmKG4uYW5pc290cm9weU1hcD10aGlzLmFuaXNvdHJvcHlNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMubWFwJiZ0aGlzLm1hcC5pc1RleHR1cmUmJihuLm1hcD10aGlzLm1hcC50b0pTT04oZSkudXVpZCksdGhpcy5tYXRjYXAmJnRoaXMubWF0Y2FwLmlzVGV4dHVyZSYmKG4ubWF0Y2FwPXRoaXMubWF0Y2FwLnRvSlNPTihlKS51dWlkKSx0aGlzLmFscGhhTWFwJiZ0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSYmKG4uYWxwaGFNYXA9dGhpcy5hbHBoYU1hcC50b0pTT04oZSkudXVpZCksdGhpcy5saWdodE1hcCYmdGhpcy5saWdodE1hcC5pc1RleHR1cmUmJihuLmxpZ2h0TWFwPXRoaXMubGlnaHRNYXAudG9KU09OKGUpLnV1aWQsbi5saWdodE1hcEludGVuc2l0eT10aGlzLmxpZ2h0TWFwSW50ZW5zaXR5KSx0aGlzLmFvTWFwJiZ0aGlzLmFvTWFwLmlzVGV4dHVyZSYmKG4uYW9NYXA9dGhpcy5hb01hcC50b0pTT04oZSkudXVpZCxuLmFvTWFwSW50ZW5zaXR5PXRoaXMuYW9NYXBJbnRlbnNpdHkpLHRoaXMuYnVtcE1hcCYmdGhpcy5idW1wTWFwLmlzVGV4dHVyZSYmKG4uYnVtcE1hcD10aGlzLmJ1bXBNYXAudG9KU09OKGUpLnV1aWQsbi5idW1wU2NhbGU9dGhpcy5idW1wU2NhbGUpLHRoaXMubm9ybWFsTWFwJiZ0aGlzLm5vcm1hbE1hcC5pc1RleHR1cmUmJihuLm5vcm1hbE1hcD10aGlzLm5vcm1hbE1hcC50b0pTT04oZSkudXVpZCxuLm5vcm1hbE1hcFR5cGU9dGhpcy5ub3JtYWxNYXBUeXBlLG4ubm9ybWFsU2NhbGU9dGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCkpLHRoaXMuZGlzcGxhY2VtZW50TWFwJiZ0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUmJihuLmRpc3BsYWNlbWVudE1hcD10aGlzLmRpc3BsYWNlbWVudE1hcC50b0pTT04oZSkudXVpZCxuLmRpc3BsYWNlbWVudFNjYWxlPXRoaXMuZGlzcGxhY2VtZW50U2NhbGUsbi5kaXNwbGFjZW1lbnRCaWFzPXRoaXMuZGlzcGxhY2VtZW50QmlhcyksdGhpcy5yb3VnaG5lc3NNYXAmJnRoaXMucm91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4ucm91Z2huZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwLnRvSlNPTihlKS51dWlkKSx0aGlzLm1ldGFsbmVzc01hcCYmdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlJiYobi5tZXRhbG5lc3NNYXA9dGhpcy5tZXRhbG5lc3NNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMuZW1pc3NpdmVNYXAmJnRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlJiYobi5lbWlzc2l2ZU1hcD10aGlzLmVtaXNzaXZlTWFwLnRvSlNPTihlKS51dWlkKSx0aGlzLnNwZWN1bGFyTWFwJiZ0aGlzLnNwZWN1bGFyTWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJNYXA9dGhpcy5zcGVjdWxhck1hcC50b0pTT04oZSkudXVpZCksdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcCYmdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcC5pc1RleHR1cmUmJihuLnNwZWN1bGFySW50ZW5zaXR5TWFwPXRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMuc3BlY3VsYXJDb2xvck1hcCYmdGhpcy5zcGVjdWxhckNvbG9yTWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJDb2xvck1hcD10aGlzLnNwZWN1bGFyQ29sb3JNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMuZW52TWFwJiZ0aGlzLmVudk1hcC5pc1RleHR1cmUmJihuLmVudk1hcD10aGlzLmVudk1hcC50b0pTT04oZSkudXVpZCx0aGlzLmNvbWJpbmUhPT12b2lkIDAmJihuLmNvbWJpbmU9dGhpcy5jb21iaW5lKSksdGhpcy5lbnZNYXBJbnRlbnNpdHkhPT12b2lkIDAmJihuLmVudk1hcEludGVuc2l0eT10aGlzLmVudk1hcEludGVuc2l0eSksdGhpcy5yZWZsZWN0aXZpdHkhPT12b2lkIDAmJihuLnJlZmxlY3Rpdml0eT10aGlzLnJlZmxlY3Rpdml0eSksdGhpcy5yZWZyYWN0aW9uUmF0aW8hPT12b2lkIDAmJihuLnJlZnJhY3Rpb25SYXRpbz10aGlzLnJlZnJhY3Rpb25SYXRpbyksdGhpcy5ncmFkaWVudE1hcCYmdGhpcy5ncmFkaWVudE1hcC5pc1RleHR1cmUmJihuLmdyYWRpZW50TWFwPXRoaXMuZ3JhZGllbnRNYXAudG9KU09OKGUpLnV1aWQpLHRoaXMudHJhbnNtaXNzaW9uIT09dm9pZCAwJiYobi50cmFuc21pc3Npb249dGhpcy50cmFuc21pc3Npb24pLHRoaXMudHJhbnNtaXNzaW9uTWFwJiZ0aGlzLnRyYW5zbWlzc2lvbk1hcC5pc1RleHR1cmUmJihuLnRyYW5zbWlzc2lvbk1hcD10aGlzLnRyYW5zbWlzc2lvbk1hcC50b0pTT04oZSkudXVpZCksdGhpcy50aGlja25lc3MhPT12b2lkIDAmJihuLnRoaWNrbmVzcz10aGlzLnRoaWNrbmVzcyksdGhpcy50aGlja25lc3NNYXAmJnRoaXMudGhpY2tuZXNzTWFwLmlzVGV4dHVyZSYmKG4udGhpY2tuZXNzTWFwPXRoaXMudGhpY2tuZXNzTWFwLnRvSlNPTihlKS51dWlkKSx0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UhPT12b2lkIDAmJnRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSE9PTEvMCYmKG4uYXR0ZW51YXRpb25EaXN0YW5jZT10aGlzLmF0dGVudWF0aW9uRGlzdGFuY2UpLHRoaXMuYXR0ZW51YXRpb25Db2xvciE9PXZvaWQgMCYmKG4uYXR0ZW51YXRpb25Db2xvcj10aGlzLmF0dGVudWF0aW9uQ29sb3IuZ2V0SGV4KCkpLHRoaXMuc2l6ZSE9PXZvaWQgMCYmKG4uc2l6ZT10aGlzLnNpemUpLHRoaXMuc2hhZG93U2lkZSE9PW51bGwmJihuLnNoYWRvd1NpZGU9dGhpcy5zaGFkb3dTaWRlKSx0aGlzLnNpemVBdHRlbnVhdGlvbiE9PXZvaWQgMCYmKG4uc2l6ZUF0dGVudWF0aW9uPXRoaXMuc2l6ZUF0dGVudWF0aW9uKSx0aGlzLmJsZW5kaW5nIT09QmkmJihuLmJsZW5kaW5nPXRoaXMuYmxlbmRpbmcpLHRoaXMuc2lkZSE9PVluJiYobi5zaWRlPXRoaXMuc2lkZSksdGhpcy52ZXJ0ZXhDb2xvcnM9PT0hMCYmKG4udmVydGV4Q29sb3JzPSEwKSx0aGlzLm9wYWNpdHk8MSYmKG4ub3BhY2l0eT10aGlzLm9wYWNpdHkpLHRoaXMudHJhbnNwYXJlbnQ9PT0hMCYmKG4udHJhbnNwYXJlbnQ9ITApLHRoaXMuYmxlbmRTcmMhPT1EYSYmKG4uYmxlbmRTcmM9dGhpcy5ibGVuZFNyYyksdGhpcy5ibGVuZERzdCE9PU5hJiYobi5ibGVuZERzdD10aGlzLmJsZW5kRHN0KSx0aGlzLmJsZW5kRXF1YXRpb24hPT14aSYmKG4uYmxlbmRFcXVhdGlvbj10aGlzLmJsZW5kRXF1YXRpb24pLHRoaXMuYmxlbmRTcmNBbHBoYSE9PW51bGwmJihuLmJsZW5kU3JjQWxwaGE9dGhpcy5ibGVuZFNyY0FscGhhKSx0aGlzLmJsZW5kRHN0QWxwaGEhPT1udWxsJiYobi5ibGVuZERzdEFscGhhPXRoaXMuYmxlbmREc3RBbHBoYSksdGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEhPT1udWxsJiYobi5ibGVuZEVxdWF0aW9uQWxwaGE9dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEpLHRoaXMuYmxlbmRDb2xvciYmdGhpcy5ibGVuZENvbG9yLmlzQ29sb3ImJihuLmJsZW5kQ29sb3I9dGhpcy5ibGVuZENvbG9yLmdldEhleCgpKSx0aGlzLmJsZW5kQWxwaGEhPT0wJiYobi5ibGVuZEFscGhhPXRoaXMuYmxlbmRBbHBoYSksdGhpcy5kZXB0aEZ1bmMhPT1NcyYmKG4uZGVwdGhGdW5jPXRoaXMuZGVwdGhGdW5jKSx0aGlzLmRlcHRoVGVzdD09PSExJiYobi5kZXB0aFRlc3Q9dGhpcy5kZXB0aFRlc3QpLHRoaXMuZGVwdGhXcml0ZT09PSExJiYobi5kZXB0aFdyaXRlPXRoaXMuZGVwdGhXcml0ZSksdGhpcy5jb2xvcldyaXRlPT09ITEmJihuLmNvbG9yV3JpdGU9dGhpcy5jb2xvcldyaXRlKSx0aGlzLnN0ZW5jaWxXcml0ZU1hc2shPT0yNTUmJihuLnN0ZW5jaWxXcml0ZU1hc2s9dGhpcy5zdGVuY2lsV3JpdGVNYXNrKSx0aGlzLnN0ZW5jaWxGdW5jIT09SmMmJihuLnN0ZW5jaWxGdW5jPXRoaXMuc3RlbmNpbEZ1bmMpLHRoaXMuc3RlbmNpbFJlZiE9PTAmJihuLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmKSx0aGlzLnN0ZW5jaWxGdW5jTWFzayE9PTI1NSYmKG4uc3RlbmNpbEZ1bmNNYXNrPXRoaXMuc3RlbmNpbEZ1bmNNYXNrKSx0aGlzLnN0ZW5jaWxGYWlsIT09VmkmJihuLnN0ZW5jaWxGYWlsPXRoaXMuc3RlbmNpbEZhaWwpLHRoaXMuc3RlbmNpbFpGYWlsIT09VmkmJihuLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbCksdGhpcy5zdGVuY2lsWlBhc3MhPT1WaSYmKG4uc3RlbmNpbFpQYXNzPXRoaXMuc3RlbmNpbFpQYXNzKSx0aGlzLnN0ZW5jaWxXcml0ZT09PSEwJiYobi5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGUpLHRoaXMucm90YXRpb24hPT12b2lkIDAmJnRoaXMucm90YXRpb24hPT0wJiYobi5yb3RhdGlvbj10aGlzLnJvdGF0aW9uKSx0aGlzLnBvbHlnb25PZmZzZXQ9PT0hMCYmKG4ucG9seWdvbk9mZnNldD0hMCksdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yIT09MCYmKG4ucG9seWdvbk9mZnNldEZhY3Rvcj10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IpLHRoaXMucG9seWdvbk9mZnNldFVuaXRzIT09MCYmKG4ucG9seWdvbk9mZnNldFVuaXRzPXRoaXMucG9seWdvbk9mZnNldFVuaXRzKSx0aGlzLmxpbmV3aWR0aCE9PXZvaWQgMCYmdGhpcy5saW5ld2lkdGghPT0xJiYobi5saW5ld2lkdGg9dGhpcy5saW5ld2lkdGgpLHRoaXMuZGFzaFNpemUhPT12b2lkIDAmJihuLmRhc2hTaXplPXRoaXMuZGFzaFNpemUpLHRoaXMuZ2FwU2l6ZSE9PXZvaWQgMCYmKG4uZ2FwU2l6ZT10aGlzLmdhcFNpemUpLHRoaXMuc2NhbGUhPT12b2lkIDAmJihuLnNjYWxlPXRoaXMuc2NhbGUpLHRoaXMuZGl0aGVyaW5nPT09ITAmJihuLmRpdGhlcmluZz0hMCksdGhpcy5hbHBoYVRlc3Q+MCYmKG4uYWxwaGFUZXN0PXRoaXMuYWxwaGFUZXN0KSx0aGlzLmFscGhhSGFzaD09PSEwJiYobi5hbHBoYUhhc2g9ITApLHRoaXMuYWxwaGFUb0NvdmVyYWdlPT09ITAmJihuLmFscGhhVG9Db3ZlcmFnZT0hMCksdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9PT0hMCYmKG4ucHJlbXVsdGlwbGllZEFscGhhPSEwKSx0aGlzLmZvcmNlU2luZ2xlUGFzcz09PSEwJiYobi5mb3JjZVNpbmdsZVBhc3M9ITApLHRoaXMud2lyZWZyYW1lPT09ITAmJihuLndpcmVmcmFtZT0hMCksdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg+MSYmKG4ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKSx0aGlzLndpcmVmcmFtZUxpbmVjYXAhPT0icm91bmQiJiYobi53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCksdGhpcy53aXJlZnJhbWVMaW5lam9pbiE9PSJyb3VuZCImJihuLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pLHRoaXMuZmxhdFNoYWRpbmc9PT0hMCYmKG4uZmxhdFNoYWRpbmc9ITApLHRoaXMudmlzaWJsZT09PSExJiYobi52aXNpYmxlPSExKSx0aGlzLnRvbmVNYXBwZWQ9PT0hMSYmKG4udG9uZU1hcHBlZD0hMSksdGhpcy5mb2c9PT0hMSYmKG4uZm9nPSExKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKG4udXNlckRhdGE9dGhpcy51c2VyRGF0YSk7ZnVuY3Rpb24gaShzKXtjb25zdCBhPVtdO2Zvcihjb25zdCBvIGluIHMpe2NvbnN0IGw9c1tvXTtkZWxldGUgbC5tZXRhZGF0YSxhLnB1c2gobCl9cmV0dXJuIGF9aWYodCl7Y29uc3Qgcz1pKGUudGV4dHVyZXMpLGE9aShlLmltYWdlcyk7cy5sZW5ndGg+MCYmKG4udGV4dHVyZXM9cyksYS5sZW5ndGg+MCYmKG4uaW1hZ2VzPWEpfXJldHVybiBufWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KGUpe3RoaXMubmFtZT1lLm5hbWUsdGhpcy5ibGVuZGluZz1lLmJsZW5kaW5nLHRoaXMuc2lkZT1lLnNpZGUsdGhpcy52ZXJ0ZXhDb2xvcnM9ZS52ZXJ0ZXhDb2xvcnMsdGhpcy5vcGFjaXR5PWUub3BhY2l0eSx0aGlzLnRyYW5zcGFyZW50PWUudHJhbnNwYXJlbnQsdGhpcy5ibGVuZFNyYz1lLmJsZW5kU3JjLHRoaXMuYmxlbmREc3Q9ZS5ibGVuZERzdCx0aGlzLmJsZW5kRXF1YXRpb249ZS5ibGVuZEVxdWF0aW9uLHRoaXMuYmxlbmRTcmNBbHBoYT1lLmJsZW5kU3JjQWxwaGEsdGhpcy5ibGVuZERzdEFscGhhPWUuYmxlbmREc3RBbHBoYSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1lLmJsZW5kRXF1YXRpb25BbHBoYSx0aGlzLmJsZW5kQ29sb3IuY29weShlLmJsZW5kQ29sb3IpLHRoaXMuYmxlbmRBbHBoYT1lLmJsZW5kQWxwaGEsdGhpcy5kZXB0aEZ1bmM9ZS5kZXB0aEZ1bmMsdGhpcy5kZXB0aFRlc3Q9ZS5kZXB0aFRlc3QsdGhpcy5kZXB0aFdyaXRlPWUuZGVwdGhXcml0ZSx0aGlzLnN0ZW5jaWxXcml0ZU1hc2s9ZS5zdGVuY2lsV3JpdGVNYXNrLHRoaXMuc3RlbmNpbEZ1bmM9ZS5zdGVuY2lsRnVuYyx0aGlzLnN0ZW5jaWxSZWY9ZS5zdGVuY2lsUmVmLHRoaXMuc3RlbmNpbEZ1bmNNYXNrPWUuc3RlbmNpbEZ1bmNNYXNrLHRoaXMuc3RlbmNpbEZhaWw9ZS5zdGVuY2lsRmFpbCx0aGlzLnN0ZW5jaWxaRmFpbD1lLnN0ZW5jaWxaRmFpbCx0aGlzLnN0ZW5jaWxaUGFzcz1lLnN0ZW5jaWxaUGFzcyx0aGlzLnN0ZW5jaWxXcml0ZT1lLnN0ZW5jaWxXcml0ZTtjb25zdCB0PWUuY2xpcHBpbmdQbGFuZXM7bGV0IG49bnVsbDtpZih0IT09bnVsbCl7Y29uc3QgaT10Lmxlbmd0aDtuPW5ldyBBcnJheShpKTtmb3IobGV0IHM9MDtzIT09aTsrK3MpbltzXT10W3NdLmNsb25lKCl9cmV0dXJuIHRoaXMuY2xpcHBpbmdQbGFuZXM9bix0aGlzLmNsaXBJbnRlcnNlY3Rpb249ZS5jbGlwSW50ZXJzZWN0aW9uLHRoaXMuY2xpcFNoYWRvd3M9ZS5jbGlwU2hhZG93cyx0aGlzLnNoYWRvd1NpZGU9ZS5zaGFkb3dTaWRlLHRoaXMuY29sb3JXcml0ZT1lLmNvbG9yV3JpdGUsdGhpcy5wcmVjaXNpb249ZS5wcmVjaXNpb24sdGhpcy5wb2x5Z29uT2Zmc2V0PWUucG9seWdvbk9mZnNldCx0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9ZS5wb2x5Z29uT2Zmc2V0RmFjdG9yLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPWUucG9seWdvbk9mZnNldFVuaXRzLHRoaXMuZGl0aGVyaW5nPWUuZGl0aGVyaW5nLHRoaXMuYWxwaGFUZXN0PWUuYWxwaGFUZXN0LHRoaXMuYWxwaGFIYXNoPWUuYWxwaGFIYXNoLHRoaXMuYWxwaGFUb0NvdmVyYWdlPWUuYWxwaGFUb0NvdmVyYWdlLHRoaXMucHJlbXVsdGlwbGllZEFscGhhPWUucHJlbXVsdGlwbGllZEFscGhhLHRoaXMuZm9yY2VTaW5nbGVQYXNzPWUuZm9yY2VTaW5nbGVQYXNzLHRoaXMudmlzaWJsZT1lLnZpc2libGUsdGhpcy50b25lTWFwcGVkPWUudG9uZU1hcHBlZCx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZS51c2VyRGF0YSkpLHRoaXN9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX1zZXQgbmVlZHNVcGRhdGUoZSl7ZT09PSEwJiZ0aGlzLnZlcnNpb24rK319Y2xhc3MgUGkgZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNNZXNoQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5ZSgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuY29tYmluZT1Tcyx0aGlzLnJlZmxlY3Rpdml0eT0xLHRoaXMucmVmcmFjdGlvblJhdGlvPS45OCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuY29sb3IuY29weShlLmNvbG9yKSx0aGlzLm1hcD1lLm1hcCx0aGlzLmxpZ2h0TWFwPWUubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT1lLmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9ZS5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PWUuYW9NYXBJbnRlbnNpdHksdGhpcy5zcGVjdWxhck1hcD1lLnNwZWN1bGFyTWFwLHRoaXMuYWxwaGFNYXA9ZS5hbHBoYU1hcCx0aGlzLmVudk1hcD1lLmVudk1hcCx0aGlzLmNvbWJpbmU9ZS5jb21iaW5lLHRoaXMucmVmbGVjdGl2aXR5PWUucmVmbGVjdGl2aXR5LHRoaXMucmVmcmFjdGlvblJhdGlvPWUucmVmcmFjdGlvblJhdGlvLHRoaXMud2lyZWZyYW1lPWUud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPWUud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD1lLndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj1lLndpcmVmcmFtZUxpbmVqb2luLHRoaXMuZm9nPWUuZm9nLHRoaXN9fWNvbnN0IGFpPWd4KCk7ZnVuY3Rpb24gZ3goKXtjb25zdCByPW5ldyBBcnJheUJ1ZmZlcig0KSxlPW5ldyBGbG9hdDMyQXJyYXkociksdD1uZXcgVWludDMyQXJyYXkociksbj1uZXcgVWludDMyQXJyYXkoNTEyKSxpPW5ldyBVaW50MzJBcnJheSg1MTIpO2ZvcihsZXQgbD0wO2w8MjU2OysrbCl7Y29uc3QgYz1sLTEyNztjPC0yNz8obltsXT0wLG5bbHwyNTZdPTMyNzY4LGlbbF09MjQsaVtsfDI1Nl09MjQpOmM8LTE0PyhuW2xdPTEwMjQ+Pi1jLTE0LG5bbHwyNTZdPTEwMjQ+Pi1jLTE0fDMyNzY4LGlbbF09LWMtMSxpW2x8MjU2XT0tYy0xKTpjPD0xNT8obltsXT1jKzE1PDwxMCxuW2x8MjU2XT1jKzE1PDwxMHwzMjc2OCxpW2xdPTEzLGlbbHwyNTZdPTEzKTpjPDEyOD8obltsXT0zMTc0NCxuW2x8MjU2XT02NDUxMixpW2xdPTI0LGlbbHwyNTZdPTI0KToobltsXT0zMTc0NCxuW2x8MjU2XT02NDUxMixpW2xdPTEzLGlbbHwyNTZdPTEzKX1jb25zdCBzPW5ldyBVaW50MzJBcnJheSgyMDQ4KSxhPW5ldyBVaW50MzJBcnJheSg2NCksbz1uZXcgVWludDMyQXJyYXkoNjQpO2ZvcihsZXQgbD0xO2w8MTAyNDsrK2wpe2xldCBjPWw8PDEzLGg9MDtmb3IoOyEoYyY4Mzg4NjA4KTspYzw8PTEsaC09ODM4ODYwODtjJj0tODM4ODYwOSxoKz05NDc5MTI3MDQsc1tsXT1jfGh9Zm9yKGxldCBsPTEwMjQ7bDwyMDQ4OysrbClzW2xdPTkzOTUyNDA5NisobC0xMDI0PDwxMyk7Zm9yKGxldCBsPTE7bDwzMTsrK2wpYVtsXT1sPDwyMzthWzMxXT0xMTk5NTcwOTQ0LGFbMzJdPTIxNDc0ODM2NDg7Zm9yKGxldCBsPTMzO2w8NjM7KytsKWFbbF09MjE0NzQ4MzY0OCsobC0zMjw8MjMpO2FbNjNdPTMzNDcwNTQ1OTI7Zm9yKGxldCBsPTE7bDw2NDsrK2wpbCE9PTMyJiYob1tsXT0xMDI0KTtyZXR1cm57ZmxvYXRWaWV3OmUsdWludDMyVmlldzp0LGJhc2VUYWJsZTpuLHNoaWZ0VGFibGU6aSxtYW50aXNzYVRhYmxlOnMsZXhwb25lbnRUYWJsZTphLG9mZnNldFRhYmxlOm99fWZ1bmN0aW9uIGhuKHIpe01hdGguYWJzKHIpPjY1NTA0JiZjb25zb2xlLndhcm4oIlRIUkVFLkRhdGFVdGlscy50b0hhbGZGbG9hdCgpOiBWYWx1ZSBvdXQgb2YgcmFuZ2UuIikscj1fdChyLC02NTUwNCw2NTUwNCksYWkuZmxvYXRWaWV3WzBdPXI7Y29uc3QgZT1haS51aW50MzJWaWV3WzBdLHQ9ZT4+MjMmNTExO3JldHVybiBhaS5iYXNlVGFibGVbdF0rKChlJjgzODg2MDcpPj5haS5zaGlmdFRhYmxlW3RdKX1mdW5jdGlvbiBIcyhyKXtjb25zdCBlPXI+PjEwO3JldHVybiBhaS51aW50MzJWaWV3WzBdPWFpLm1hbnRpc3NhVGFibGVbYWkub2Zmc2V0VGFibGVbZV0rKHImMTAyMyldK2FpLmV4cG9uZW50VGFibGVbZV0sYWkuZmxvYXRWaWV3WzBdfWNvbnN0IF94PXt0b0hhbGZGbG9hdDpobixmcm9tSGFsZkZsb2F0OkhzfSxDdD1uZXcgUCxvbz1uZXcgcTtjbGFzcyBLZXtjb25zdHJ1Y3RvcihlLHQsbj0hMSl7aWYoQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LiIpO3RoaXMuaXNCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5uYW1lPSIiLHRoaXMuYXJyYXk9ZSx0aGlzLml0ZW1TaXplPXQsdGhpcy5jb3VudD1lIT09dm9pZCAwP2UubGVuZ3RoL3Q6MCx0aGlzLm5vcm1hbGl6ZWQ9bix0aGlzLnVzYWdlPU5zLHRoaXMuX3VwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX0sdGhpcy51cGRhdGVSYW5nZXM9W10sdGhpcy5ncHVUeXBlPVJuLHRoaXMudmVyc2lvbj0wfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKGUpe2U9PT0hMCYmdGhpcy52ZXJzaW9uKyt9Z2V0IHVwZGF0ZVJhbmdlKCl7cmV0dXJuIGNvbnNvbGUud2FybignVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAidXBkYXRlUmFuZ2UiIGlzIGRlcHJlY2F0ZWQgYW5kIHJlbW92ZWQgaW4gcjE2OS4gVXNlICJhZGRVcGRhdGVSYW5nZSgpIiBpbnN0ZWFkLicpLHRoaXMuX3VwZGF0ZVJhbmdlfXNldFVzYWdlKGUpe3JldHVybiB0aGlzLnVzYWdlPWUsdGhpc31hZGRVcGRhdGVSYW5nZShlLHQpe3RoaXMudXBkYXRlUmFuZ2VzLnB1c2goe3N0YXJ0OmUsY291bnQ6dH0pfWNsZWFyVXBkYXRlUmFuZ2VzKCl7dGhpcy51cGRhdGVSYW5nZXMubGVuZ3RoPTB9Y29weShlKXtyZXR1cm4gdGhpcy5uYW1lPWUubmFtZSx0aGlzLmFycmF5PW5ldyBlLmFycmF5LmNvbnN0cnVjdG9yKGUuYXJyYXkpLHRoaXMuaXRlbVNpemU9ZS5pdGVtU2l6ZSx0aGlzLmNvdW50PWUuY291bnQsdGhpcy5ub3JtYWxpemVkPWUubm9ybWFsaXplZCx0aGlzLnVzYWdlPWUudXNhZ2UsdGhpcy5ncHVUeXBlPWUuZ3B1VHlwZSx0aGlzfWNvcHlBdChlLHQsbil7ZSo9dGhpcy5pdGVtU2l6ZSxuKj10Lml0ZW1TaXplO2ZvcihsZXQgaT0wLHM9dGhpcy5pdGVtU2l6ZTtpPHM7aSsrKXRoaXMuYXJyYXlbZStpXT10LmFycmF5W24raV07cmV0dXJuIHRoaXN9Y29weUFycmF5KGUpe3JldHVybiB0aGlzLmFycmF5LnNldChlKSx0aGlzfWFwcGx5TWF0cml4MyhlKXtpZih0aGlzLml0ZW1TaXplPT09Milmb3IobGV0IHQ9MCxuPXRoaXMuY291bnQ7dDxuO3QrKylvby5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsdCksb28uYXBwbHlNYXRyaXgzKGUpLHRoaXMuc2V0WFkodCxvby54LG9vLnkpO2Vsc2UgaWYodGhpcy5pdGVtU2l6ZT09PTMpZm9yKGxldCB0PTAsbj10aGlzLmNvdW50O3Q8bjt0KyspQ3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLHQpLEN0LmFwcGx5TWF0cml4MyhlKSx0aGlzLnNldFhZWih0LEN0LngsQ3QueSxDdC56KTtyZXR1cm4gdGhpc31hcHBseU1hdHJpeDQoZSl7Zm9yKGxldCB0PTAsbj10aGlzLmNvdW50O3Q8bjt0KyspQ3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLHQpLEN0LmFwcGx5TWF0cml4NChlKSx0aGlzLnNldFhZWih0LEN0LngsQ3QueSxDdC56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeChlKXtmb3IobGV0IHQ9MCxuPXRoaXMuY291bnQ7dDxuO3QrKylDdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsdCksQ3QuYXBwbHlOb3JtYWxNYXRyaXgoZSksdGhpcy5zZXRYWVoodCxDdC54LEN0LnksQ3Queik7cmV0dXJuIHRoaXN9dHJhbnNmb3JtRGlyZWN0aW9uKGUpe2ZvcihsZXQgdD0wLG49dGhpcy5jb3VudDt0PG47dCsrKUN0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyx0KSxDdC50cmFuc2Zvcm1EaXJlY3Rpb24oZSksdGhpcy5zZXRYWVoodCxDdC54LEN0LnksQ3Queik7cmV0dXJuIHRoaXN9c2V0KGUsdD0wKXtyZXR1cm4gdGhpcy5hcnJheS5zZXQoZSx0KSx0aGlzfWdldENvbXBvbmVudChlLHQpe2xldCBuPXRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplK3RdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihuPW9uKG4sdGhpcy5hcnJheSkpLG59c2V0Q29tcG9uZW50KGUsdCxuKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYobj1xZShuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W2UqdGhpcy5pdGVtU2l6ZSt0XT1uLHRoaXN9Z2V0WChlKXtsZXQgdD10aGlzLmFycmF5W2UqdGhpcy5pdGVtU2l6ZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHQ9b24odCx0aGlzLmFycmF5KSksdH1zZXRYKGUsdCl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHQ9cWUodCx0aGlzLmFycmF5KSksdGhpcy5hcnJheVtlKnRoaXMuaXRlbVNpemVdPXQsdGhpc31nZXRZKGUpe2xldCB0PXRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzFdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9c2V0WShlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzFdPXQsdGhpc31nZXRaKGUpe2xldCB0PXRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzJdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9c2V0WihlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzJdPXQsdGhpc31nZXRXKGUpe2xldCB0PXRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzNdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9c2V0VyhlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzNdPXQsdGhpc31zZXRYWShlLHQsbil7cmV0dXJuIGUqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYodD1xZSh0LHRoaXMuYXJyYXkpLG49cWUobix0aGlzLmFycmF5KSksdGhpcy5hcnJheVtlKzBdPXQsdGhpcy5hcnJheVtlKzFdPW4sdGhpc31zZXRYWVooZSx0LG4saSl7cmV0dXJuIGUqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYodD1xZSh0LHRoaXMuYXJyYXkpLG49cWUobix0aGlzLmFycmF5KSxpPXFlKGksdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSswXT10LHRoaXMuYXJyYXlbZSsxXT1uLHRoaXMuYXJyYXlbZSsyXT1pLHRoaXN9c2V0WFlaVyhlLHQsbixpLHMpe3JldHVybiBlKj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKHQ9cWUodCx0aGlzLmFycmF5KSxuPXFlKG4sdGhpcy5hcnJheSksaT1xZShpLHRoaXMuYXJyYXkpLHM9cWUocyx0aGlzLmFycmF5KSksdGhpcy5hcnJheVtlKzBdPXQsdGhpcy5hcnJheVtlKzFdPW4sdGhpcy5hcnJheVtlKzJdPWksdGhpcy5hcnJheVtlKzNdPXMsdGhpc31vblVwbG9hZChlKXtyZXR1cm4gdGhpcy5vblVwbG9hZENhbGxiYWNrPWUsdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LHRoaXMuaXRlbVNpemUpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgZT17aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5mcm9tKHRoaXMuYXJyYXkpLG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfTtyZXR1cm4gdGhpcy5uYW1lIT09IiImJihlLm5hbWU9dGhpcy5uYW1lKSx0aGlzLnVzYWdlIT09TnMmJihlLnVzYWdlPXRoaXMudXNhZ2UpLGV9fWNsYXNzIHh4IGV4dGVuZHMgS2V7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKG5ldyBJbnQ4QXJyYXkoZSksdCxuKX19Y2xhc3MgeXggZXh0ZW5kcyBLZXtjb25zdHJ1Y3RvcihlLHQsbil7c3VwZXIobmV3IFVpbnQ4QXJyYXkoZSksdCxuKX19Y2xhc3MgdnggZXh0ZW5kcyBLZXtjb25zdHJ1Y3RvcihlLHQsbil7c3VwZXIobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGUpLHQsbil9fWNsYXNzIE14IGV4dGVuZHMgS2V7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKG5ldyBJbnQxNkFycmF5KGUpLHQsbil9fWNsYXNzIF9oIGV4dGVuZHMgS2V7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKG5ldyBVaW50MTZBcnJheShlKSx0LG4pfX1jbGFzcyBTeCBleHRlbmRzIEtle2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihuZXcgSW50MzJBcnJheShlKSx0LG4pfX1jbGFzcyB4aCBleHRlbmRzIEtle2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihuZXcgVWludDMyQXJyYXkoZSksdCxuKX19Y2xhc3MgYnggZXh0ZW5kcyBLZXtjb25zdHJ1Y3RvcihlLHQsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KGUpLHQsbiksdGhpcy5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGU9ITB9Z2V0WChlKXtsZXQgdD1Icyh0aGlzLmFycmF5W2UqdGhpcy5pdGVtU2l6ZV0pO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9c2V0WChlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplXT1obih0KSx0aGlzfWdldFkoZSl7bGV0IHQ9SHModGhpcy5hcnJheVtlKnRoaXMuaXRlbVNpemUrMV0pO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9c2V0WShlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzFdPWhuKHQpLHRoaXN9Z2V0WihlKXtsZXQgdD1Icyh0aGlzLmFycmF5W2UqdGhpcy5pdGVtU2l6ZSsyXSk7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHQ9b24odCx0aGlzLmFycmF5KSksdH1zZXRaKGUsdCl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHQ9cWUodCx0aGlzLmFycmF5KSksdGhpcy5hcnJheVtlKnRoaXMuaXRlbVNpemUrMl09aG4odCksdGhpc31nZXRXKGUpe2xldCB0PUhzKHRoaXMuYXJyYXlbZSp0aGlzLml0ZW1TaXplKzNdKTtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYodD1vbih0LHRoaXMuYXJyYXkpKSx0fXNldFcoZSx0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYodD1xZSh0LHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W2UqdGhpcy5pdGVtU2l6ZSszXT1obih0KSx0aGlzfXNldFhZKGUsdCxuKXtyZXR1cm4gZSo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSksbj1xZShuLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W2UrMF09aG4odCksdGhpcy5hcnJheVtlKzFdPWhuKG4pLHRoaXN9c2V0WFlaKGUsdCxuLGkpe3JldHVybiBlKj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKHQ9cWUodCx0aGlzLmFycmF5KSxuPXFlKG4sdGhpcy5hcnJheSksaT1xZShpLHRoaXMuYXJyYXkpKSx0aGlzLmFycmF5W2UrMF09aG4odCksdGhpcy5hcnJheVtlKzFdPWhuKG4pLHRoaXMuYXJyYXlbZSsyXT1obihpKSx0aGlzfXNldFhZWlcoZSx0LG4saSxzKXtyZXR1cm4gZSo9dGhpcy5pdGVtU2l6ZSx0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSksbj1xZShuLHRoaXMuYXJyYXkpLGk9cWUoaSx0aGlzLmFycmF5KSxzPXFlKHMsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbZSswXT1obih0KSx0aGlzLmFycmF5W2UrMV09aG4obiksdGhpcy5hcnJheVtlKzJdPWhuKGkpLHRoaXMuYXJyYXlbZSszXT1obihzKSx0aGlzfX1jbGFzcyBTZSBleHRlbmRzIEtle2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihuZXcgRmxvYXQzMkFycmF5KGUpLHQsbil9fWNsYXNzIHd4IGV4dGVuZHMgS2V7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKG5ldyBGbG9hdDY0QXJyYXkoZSksdCxuKX19bGV0IEV4PTA7Y29uc3QgRW49bmV3IEllLHloPW5ldyBydCxCcj1uZXcgUCx5bj1uZXcgRHQsV3M9bmV3IER0LE50PW5ldyBQO2NsYXNzIGtlIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNCdWZmZXJHZW9tZXRyeT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpFeCsrfSksdGhpcy51dWlkPV9uKCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iQnVmZmVyR2VvbWV0cnkiLHRoaXMuaW5kZXg9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT0hMSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsLHRoaXMuZHJhd1JhbmdlPXtzdGFydDowLGNvdW50OjEvMH0sdGhpcy51c2VyRGF0YT17fX1nZXRJbmRleCgpe3JldHVybiB0aGlzLmluZGV4fXNldEluZGV4KGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP3RoaXMuaW5kZXg9bmV3KHdkKGUpP3hoOl9oKShlLDEpOnRoaXMuaW5kZXg9ZSx0aGlzfWdldEF0dHJpYnV0ZShlKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2VdfXNldEF0dHJpYnV0ZShlLHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbZV09dCx0aGlzfWRlbGV0ZUF0dHJpYnV0ZShlKXtyZXR1cm4gZGVsZXRlIHRoaXMuYXR0cmlidXRlc1tlXSx0aGlzfWhhc0F0dHJpYnV0ZShlKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW2VdIT09dm9pZCAwfWFkZEdyb3VwKGUsdCxuPTApe3RoaXMuZ3JvdXBzLnB1c2goe3N0YXJ0OmUsY291bnQ6dCxtYXRlcmlhbEluZGV4Om59KX1jbGVhckdyb3Vwcygpe3RoaXMuZ3JvdXBzPVtdfXNldERyYXdSYW5nZShlLHQpe3RoaXMuZHJhd1JhbmdlLnN0YXJ0PWUsdGhpcy5kcmF3UmFuZ2UuY291bnQ9dH1hcHBseU1hdHJpeDQoZSl7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247dCE9PXZvaWQgMCYmKHQuYXBwbHlNYXRyaXg0KGUpLHQubmVlZHNVcGRhdGU9ITApO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtpZihuIT09dm9pZCAwKXtjb25zdCBzPW5ldyBaZSgpLmdldE5vcm1hbE1hdHJpeChlKTtuLmFwcGx5Tm9ybWFsTWF0cml4KHMpLG4ubmVlZHNVcGRhdGU9ITB9Y29uc3QgaT10aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDtyZXR1cm4gaSE9PXZvaWQgMCYmKGkudHJhbnNmb3JtRGlyZWN0aW9uKGUpLGkubmVlZHNVcGRhdGU9ITApLHRoaXMuYm91bmRpbmdCb3ghPT1udWxsJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpLHRoaXMuYm91bmRpbmdTcGhlcmUhPT1udWxsJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKGUpe3JldHVybiBFbi5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihlKSx0aGlzLmFwcGx5TWF0cml4NChFbiksdGhpc31yb3RhdGVYKGUpe3JldHVybiBFbi5tYWtlUm90YXRpb25YKGUpLHRoaXMuYXBwbHlNYXRyaXg0KEVuKSx0aGlzfXJvdGF0ZVkoZSl7cmV0dXJuIEVuLm1ha2VSb3RhdGlvblkoZSksdGhpcy5hcHBseU1hdHJpeDQoRW4pLHRoaXN9cm90YXRlWihlKXtyZXR1cm4gRW4ubWFrZVJvdGF0aW9uWihlKSx0aGlzLmFwcGx5TWF0cml4NChFbiksdGhpc310cmFuc2xhdGUoZSx0LG4pe3JldHVybiBFbi5tYWtlVHJhbnNsYXRpb24oZSx0LG4pLHRoaXMuYXBwbHlNYXRyaXg0KEVuKSx0aGlzfXNjYWxlKGUsdCxuKXtyZXR1cm4gRW4ubWFrZVNjYWxlKGUsdCxuKSx0aGlzLmFwcGx5TWF0cml4NChFbiksdGhpc31sb29rQXQoZSl7cmV0dXJuIHloLmxvb2tBdChlKSx5aC51cGRhdGVNYXRyaXgoKSx0aGlzLmFwcGx5TWF0cml4NCh5aC5tYXRyaXgpLHRoaXN9Y2VudGVyKCl7cmV0dXJuIHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksdGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoQnIpLm5lZ2F0ZSgpLHRoaXMudHJhbnNsYXRlKEJyLngsQnIueSxCci56KSx0aGlzfXNldEZyb21Qb2ludHMoZSl7Y29uc3QgdD1bXTtmb3IobGV0IG49MCxpPWUubGVuZ3RoO248aTtuKyspe2NvbnN0IHM9ZVtuXTt0LnB1c2gocy54LHMueSxzLnp8fDApfXJldHVybiB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZSh0LDMpKSx0aGlzfWNvbXB1dGVCb3VuZGluZ0JveCgpe3RoaXMuYm91bmRpbmdCb3g9PT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1uZXcgRHQpO2NvbnN0IGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLHQ9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYoZSYmZS5pc0dMQnVmZmVyQXR0cmlidXRlKXtjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgYm94LiBBbHRlcm5hdGl2ZWx5IHNldCAibWVzaC5mcnVzdHVtQ3VsbGVkIiB0byAiZmFsc2UiLicsdGhpcyksdGhpcy5ib3VuZGluZ0JveC5zZXQobmV3IFAoLTEvMCwtMS8wLC0xLzApLG5ldyBQKDEvMCwxLzAsMS8wKSk7cmV0dXJufWlmKGUhPT12b2lkIDApe2lmKHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShlKSx0KWZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKyl7Y29uc3Qgcz10W25dO3luLnNldEZyb21CdWZmZXJBdHRyaWJ1dGUocyksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oTnQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1pbix5bi5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChOdCksTnQuYWRkVmVjdG9ycyh0aGlzLmJvdW5kaW5nQm94Lm1heCx5bi5tYXgpLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChOdCkpOih0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoeW4ubWluKSx0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoeW4ubWF4KSl9fWVsc2UgdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsoaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX1jb21wdXRlQm91bmRpbmdTcGhlcmUoKXt0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IEd0KTtjb25zdCBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbix0PXRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKGUmJmUuaXNHTEJ1ZmZlckF0dHJpYnV0ZSl7Y29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIHNwaGVyZS4gQWx0ZXJuYXRpdmVseSBzZXQgIm1lc2guZnJ1c3R1bUN1bGxlZCIgdG8gImZhbHNlIi4nLHRoaXMpLHRoaXMuYm91bmRpbmdTcGhlcmUuc2V0KG5ldyBQLDEvMCk7cmV0dXJufWlmKGUpe2NvbnN0IG49dGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7aWYoeW4uc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShlKSx0KWZvcihsZXQgcz0wLGE9dC5sZW5ndGg7czxhO3MrKyl7Y29uc3Qgbz10W3NdO1dzLnNldEZyb21CdWZmZXJBdHRyaWJ1dGUobyksdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT8oTnQuYWRkVmVjdG9ycyh5bi5taW4sV3MubWluKSx5bi5leHBhbmRCeVBvaW50KE50KSxOdC5hZGRWZWN0b3JzKHluLm1heCxXcy5tYXgpLHluLmV4cGFuZEJ5UG9pbnQoTnQpKTooeW4uZXhwYW5kQnlQb2ludChXcy5taW4pLHluLmV4cGFuZEJ5UG9pbnQoV3MubWF4KSl9eW4uZ2V0Q2VudGVyKG4pO2xldCBpPTA7Zm9yKGxldCBzPTAsYT1lLmNvdW50O3M8YTtzKyspTnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHMpLGk9TWF0aC5tYXgoaSxuLmRpc3RhbmNlVG9TcXVhcmVkKE50KSk7aWYodClmb3IobGV0IHM9MCxhPXQubGVuZ3RoO3M8YTtzKyspe2NvbnN0IG89dFtzXSxsPXRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7Zm9yKGxldCBjPTAsaD1vLmNvdW50O2M8aDtjKyspTnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLGMpLGwmJihCci5mcm9tQnVmZmVyQXR0cmlidXRlKGUsYyksTnQuYWRkKEJyKSksaT1NYXRoLm1heChpLG4uZGlzdGFuY2VUb1NxdWFyZWQoTnQpKX10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cz1NYXRoLnNxcnQoaSksaXNOYU4odGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX19Y29tcHV0ZVRhbmdlbnRzKCl7Y29uc3QgZT10aGlzLmluZGV4LHQ9dGhpcy5hdHRyaWJ1dGVzO2lmKGU9PT1udWxsfHx0LnBvc2l0aW9uPT09dm9pZCAwfHx0Lm5vcm1hbD09PXZvaWQgMHx8dC51dj09PXZvaWQgMCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBmYWlsZWQuIE1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyAoaW5kZXgsIHBvc2l0aW9uLCBub3JtYWwgb3IgdXYpIik7cmV0dXJufWNvbnN0IG49ZS5hcnJheSxpPXQucG9zaXRpb24uYXJyYXkscz10Lm5vcm1hbC5hcnJheSxhPXQudXYuYXJyYXksbz1pLmxlbmd0aC8zO3RoaXMuaGFzQXR0cmlidXRlKCJ0YW5nZW50Iik9PT0hMSYmdGhpcy5zZXRBdHRyaWJ1dGUoInRhbmdlbnQiLG5ldyBLZShuZXcgRmxvYXQzMkFycmF5KDQqbyksNCkpO2NvbnN0IGw9dGhpcy5nZXRBdHRyaWJ1dGUoInRhbmdlbnQiKS5hcnJheSxjPVtdLGg9W107Zm9yKGxldCB3PTA7dzxvO3crKyljW3ddPW5ldyBQLGhbd109bmV3IFA7Y29uc3QgdT1uZXcgUCxmPW5ldyBQLGQ9bmV3IFAscD1uZXcgcSxfPW5ldyBxLGc9bmV3IHEsbT1uZXcgUCx5PW5ldyBQO2Z1bmN0aW9uIHgodyxSLE4pe3UuZnJvbUFycmF5KGksdyozKSxmLmZyb21BcnJheShpLFIqMyksZC5mcm9tQXJyYXkoaSxOKjMpLHAuZnJvbUFycmF5KGEsdyoyKSxfLmZyb21BcnJheShhLFIqMiksZy5mcm9tQXJyYXkoYSxOKjIpLGYuc3ViKHUpLGQuc3ViKHUpLF8uc3ViKHApLGcuc3ViKHApO2NvbnN0IEI9MS8oXy54KmcueS1nLngqXy55KTtpc0Zpbml0ZShCKSYmKG0uY29weShmKS5tdWx0aXBseVNjYWxhcihnLnkpLmFkZFNjYWxlZFZlY3RvcihkLC1fLnkpLm11bHRpcGx5U2NhbGFyKEIpLHkuY29weShkKS5tdWx0aXBseVNjYWxhcihfLngpLmFkZFNjYWxlZFZlY3RvcihmLC1nLngpLm11bHRpcGx5U2NhbGFyKEIpLGNbd10uYWRkKG0pLGNbUl0uYWRkKG0pLGNbTl0uYWRkKG0pLGhbd10uYWRkKHkpLGhbUl0uYWRkKHkpLGhbTl0uYWRkKHkpKX1sZXQgdj10aGlzLmdyb3Vwczt2Lmxlbmd0aD09PTAmJih2PVt7c3RhcnQ6MCxjb3VudDpuLmxlbmd0aH1dKTtmb3IobGV0IHc9MCxSPXYubGVuZ3RoO3c8UjsrK3cpe2NvbnN0IE49dlt3XSxCPU4uc3RhcnQsST1OLmNvdW50O2ZvcihsZXQgVT1CLHo9QitJO1U8ejtVKz0zKXgobltVKzBdLG5bVSsxXSxuW1UrMl0pfWNvbnN0IFM9bmV3IFAsYj1uZXcgUCxBPW5ldyBQLEw9bmV3IFA7ZnVuY3Rpb24gTSh3KXtBLmZyb21BcnJheShzLHcqMyksTC5jb3B5KEEpO2NvbnN0IFI9Y1t3XTtTLmNvcHkoUiksUy5zdWIoQS5tdWx0aXBseVNjYWxhcihBLmRvdChSKSkpLm5vcm1hbGl6ZSgpLGIuY3Jvc3NWZWN0b3JzKEwsUik7Y29uc3QgQj1iLmRvdChoW3ddKTwwPy0xOjE7bFt3KjRdPVMueCxsW3cqNCsxXT1TLnksbFt3KjQrMl09Uy56LGxbdyo0KzNdPUJ9Zm9yKGxldCB3PTAsUj12Lmxlbmd0aDt3PFI7Kyt3KXtjb25zdCBOPXZbd10sQj1OLnN0YXJ0LEk9Ti5jb3VudDtmb3IobGV0IFU9Qix6PUIrSTtVPHo7VSs9MylNKG5bVSswXSksTShuW1UrMV0pLE0obltVKzJdKX19Y29tcHV0ZVZlcnRleE5vcm1hbHMoKXtjb25zdCBlPXRoaXMuaW5kZXgsdD10aGlzLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtpZih0IT09dm9pZCAwKXtsZXQgbj10aGlzLmdldEF0dHJpYnV0ZSgibm9ybWFsIik7aWYobj09PXZvaWQgMCluPW5ldyBLZShuZXcgRmxvYXQzMkFycmF5KHQuY291bnQqMyksMyksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbik7ZWxzZSBmb3IobGV0IGY9MCxkPW4uY291bnQ7ZjxkO2YrKyluLnNldFhZWihmLDAsMCwwKTtjb25zdCBpPW5ldyBQLHM9bmV3IFAsYT1uZXcgUCxvPW5ldyBQLGw9bmV3IFAsYz1uZXcgUCxoPW5ldyBQLHU9bmV3IFA7aWYoZSlmb3IobGV0IGY9MCxkPWUuY291bnQ7ZjxkO2YrPTMpe2NvbnN0IHA9ZS5nZXRYKGYrMCksXz1lLmdldFgoZisxKSxnPWUuZ2V0WChmKzIpO2kuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LHApLHMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LF8pLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGcpLGguc3ViVmVjdG9ycyhhLHMpLHUuc3ViVmVjdG9ycyhpLHMpLGguY3Jvc3ModSksby5mcm9tQnVmZmVyQXR0cmlidXRlKG4scCksbC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sXyksYy5mcm9tQnVmZmVyQXR0cmlidXRlKG4sZyksby5hZGQoaCksbC5hZGQoaCksYy5hZGQoaCksbi5zZXRYWVoocCxvLngsby55LG8ueiksbi5zZXRYWVooXyxsLngsbC55LGwueiksbi5zZXRYWVooZyxjLngsYy55LGMueil9ZWxzZSBmb3IobGV0IGY9MCxkPXQuY291bnQ7ZjxkO2YrPTMpaS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZiswKSxzLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxmKzEpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGYrMiksaC5zdWJWZWN0b3JzKGEscyksdS5zdWJWZWN0b3JzKGkscyksaC5jcm9zcyh1KSxuLnNldFhZWihmKzAsaC54LGgueSxoLnopLG4uc2V0WFlaKGYrMSxoLngsaC55LGgueiksbi5zZXRYWVooZisyLGgueCxoLnksaC56KTt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKSxuLm5lZWRzVXBkYXRlPSEwfX1ub3JtYWxpemVOb3JtYWxzKCl7Y29uc3QgZT10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2ZvcihsZXQgdD0wLG49ZS5jb3VudDt0PG47dCsrKU50LmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx0KSxOdC5ub3JtYWxpemUoKSxlLnNldFhZWih0LE50LngsTnQueSxOdC56KX10b05vbkluZGV4ZWQoKXtmdW5jdGlvbiBlKG8sbCl7Y29uc3QgYz1vLmFycmF5LGg9by5pdGVtU2l6ZSx1PW8ubm9ybWFsaXplZCxmPW5ldyBjLmNvbnN0cnVjdG9yKGwubGVuZ3RoKmgpO2xldCBkPTAscD0wO2ZvcihsZXQgXz0wLGc9bC5sZW5ndGg7XzxnO18rKyl7by5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2Q9bFtfXSpvLmRhdGEuc3RyaWRlK28ub2Zmc2V0OmQ9bFtfXSpoO2ZvcihsZXQgbT0wO208aDttKyspZltwKytdPWNbZCsrXX1yZXR1cm4gbmV3IEtlKGYsaCx1KX1pZih0aGlzLmluZGV4PT09bnVsbClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogQnVmZmVyR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO2NvbnN0IHQ9bmV3IGtlLG49dGhpcy5pbmRleC5hcnJheSxpPXRoaXMuYXR0cmlidXRlcztmb3IoY29uc3QgbyBpbiBpKXtjb25zdCBsPWlbb10sYz1lKGwsbik7dC5zZXRBdHRyaWJ1dGUobyxjKX1jb25zdCBzPXRoaXMubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBvIGluIHMpe2NvbnN0IGw9W10sYz1zW29dO2ZvcihsZXQgaD0wLHU9Yy5sZW5ndGg7aDx1O2grKyl7Y29uc3QgZj1jW2hdLGQ9ZShmLG4pO2wucHVzaChkKX10Lm1vcnBoQXR0cmlidXRlc1tvXT1sfXQubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBhPXRoaXMuZ3JvdXBzO2ZvcihsZXQgbz0wLGw9YS5sZW5ndGg7bzxsO28rKyl7Y29uc3QgYz1hW29dO3QuYWRkR3JvdXAoYy5zdGFydCxjLmNvdW50LGMubWF0ZXJpYWxJbmRleCl9cmV0dXJuIHR9dG9KU09OKCl7Y29uc3QgZT17bWV0YWRhdGE6e3ZlcnNpb246NC42LHR5cGU6IkJ1ZmZlckdlb21ldHJ5IixnZW5lcmF0b3I6IkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiJ9fTtpZihlLnV1aWQ9dGhpcy51dWlkLGUudHlwZT10aGlzLnR5cGUsdGhpcy5uYW1lIT09IiImJihlLm5hbWU9dGhpcy5uYW1lKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKGUudXNlckRhdGE9dGhpcy51c2VyRGF0YSksdGhpcy5wYXJhbWV0ZXJzIT09dm9pZCAwKXtjb25zdCBsPXRoaXMucGFyYW1ldGVycztmb3IoY29uc3QgYyBpbiBsKWxbY10hPT12b2lkIDAmJihlW2NdPWxbY10pO3JldHVybiBlfWUuZGF0YT17YXR0cmlidXRlczp7fX07Y29uc3QgdD10aGlzLmluZGV4O3QhPT1udWxsJiYoZS5kYXRhLmluZGV4PXt0eXBlOnQuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LmFycmF5KX0pO2NvbnN0IG49dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBsIGluIG4pe2NvbnN0IGM9bltsXTtlLmRhdGEuYXR0cmlidXRlc1tsXT1jLnRvSlNPTihlLmRhdGEpfWNvbnN0IGk9e307bGV0IHM9ITE7Zm9yKGNvbnN0IGwgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IGM9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbbF0saD1bXTtmb3IobGV0IHU9MCxmPWMubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9Y1t1XTtoLnB1c2goZC50b0pTT04oZS5kYXRhKSl9aC5sZW5ndGg+MCYmKGlbbF09aCxzPSEwKX1zJiYoZS5kYXRhLm1vcnBoQXR0cmlidXRlcz1pLGUuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBhPXRoaXMuZ3JvdXBzO2EubGVuZ3RoPjAmJihlLmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYSkpKTtjb25zdCBvPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIG8hPT1udWxsJiYoZS5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6by5jZW50ZXIudG9BcnJheSgpLHJhZGl1czpvLnJhZGl1c30pLGV9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWNvcHkoZSl7dGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsO2NvbnN0IHQ9e307dGhpcy5uYW1lPWUubmFtZTtjb25zdCBuPWUuaW5kZXg7biE9PW51bGwmJnRoaXMuc2V0SW5kZXgobi5jbG9uZSh0KSk7Y29uc3QgaT1lLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGMgaW4gaSl7Y29uc3QgaD1pW2NdO3RoaXMuc2V0QXR0cmlidXRlKGMsaC5jbG9uZSh0KSl9Y29uc3Qgcz1lLm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgYyBpbiBzKXtjb25zdCBoPVtdLHU9c1tjXTtmb3IobGV0IGY9MCxkPXUubGVuZ3RoO2Y8ZDtmKyspaC5wdXNoKHVbZl0uY2xvbmUodCkpO3RoaXMubW9ycGhBdHRyaWJ1dGVzW2NdPWh9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT1lLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2NvbnN0IGE9ZS5ncm91cHM7Zm9yKGxldCBjPTAsaD1hLmxlbmd0aDtjPGg7YysrKXtjb25zdCB1PWFbY107dGhpcy5hZGRHcm91cCh1LnN0YXJ0LHUuY291bnQsdS5tYXRlcmlhbEluZGV4KX1jb25zdCBvPWUuYm91bmRpbmdCb3g7byE9PW51bGwmJih0aGlzLmJvdW5kaW5nQm94PW8uY2xvbmUoKSk7Y29uc3QgbD1lLmJvdW5kaW5nU3BoZXJlO3JldHVybiBsIT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bC5jbG9uZSgpKSx0aGlzLmRyYXdSYW5nZS5zdGFydD1lLmRyYXdSYW5nZS5zdGFydCx0aGlzLmRyYXdSYW5nZS5jb3VudD1lLmRyYXdSYW5nZS5jb3VudCx0aGlzLnVzZXJEYXRhPWUudXNlckRhdGEsdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX1jb25zdCB6ZD1uZXcgSWUsJGk9bmV3IFVyLGxvPW5ldyBHdCxrZD1uZXcgUCx6cj1uZXcgUCxrcj1uZXcgUCxHcj1uZXcgUCx2aD1uZXcgUCxjbz1uZXcgUCxobz1uZXcgcSx1bz1uZXcgcSxmbz1uZXcgcSxHZD1uZXcgUCxWZD1uZXcgUCxIZD1uZXcgUCxwbz1uZXcgUCxtbz1uZXcgUDtjbGFzcyBMdCBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKGU9bmV3IGtlLHQ9bmV3IFBpKXtzdXBlcigpLHRoaXMuaXNNZXNoPSEwLHRoaXMudHlwZT0iTWVzaCIsdGhpcy5nZW9tZXRyeT1lLHRoaXMubWF0ZXJpYWw9dCx0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpfWNvcHkoZSx0KXtyZXR1cm4gc3VwZXIuY29weShlLHQpLGUubW9ycGhUYXJnZXRJbmZsdWVuY2VzIT09dm9pZCAwJiYodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9ZS5tb3JwaFRhcmdldEluZmx1ZW5jZXMuc2xpY2UoKSksZS5tb3JwaFRhcmdldERpY3Rpb25hcnkhPT12b2lkIDAmJih0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT1PYmplY3QuYXNzaWduKHt9LGUubW9ycGhUYXJnZXREaWN0aW9uYXJ5KSksdGhpcy5tYXRlcmlhbD1BcnJheS5pc0FycmF5KGUubWF0ZXJpYWwpP2UubWF0ZXJpYWwuc2xpY2UoKTplLm1hdGVyaWFsLHRoaXMuZ2VvbWV0cnk9ZS5nZW9tZXRyeSx0aGlzfXVwZGF0ZU1vcnBoVGFyZ2V0cygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMsbj1PYmplY3Qua2V5cyh0KTtpZihuLmxlbmd0aD4wKXtjb25zdCBpPXRbblswXV07aWYoaSE9PXZvaWQgMCl7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e307Zm9yKGxldCBzPTAsYT1pLmxlbmd0aDtzPGE7cysrKXtjb25zdCBvPWlbc10ubmFtZXx8U3RyaW5nKHMpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCksdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbb109c319fX1nZXRWZXJ0ZXhQb3NpdGlvbihlLHQpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxpPW4uYXR0cmlidXRlcy5wb3NpdGlvbixzPW4ubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLGE9bi5tb3JwaFRhcmdldHNSZWxhdGl2ZTt0LmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxlKTtjb25zdCBvPXRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzO2lmKHMmJm8pe2NvLnNldCgwLDAsMCk7Zm9yKGxldCBsPTAsYz1zLmxlbmd0aDtsPGM7bCsrKXtjb25zdCBoPW9bbF0sdT1zW2xdO2ghPT0wJiYodmguZnJvbUJ1ZmZlckF0dHJpYnV0ZSh1LGUpLGE/Y28uYWRkU2NhbGVkVmVjdG9yKHZoLGgpOmNvLmFkZFNjYWxlZFZlY3Rvcih2aC5zdWIodCksaCkpfXQuYWRkKGNvKX1yZXR1cm4gdH1yYXljYXN0KGUsdCl7Y29uc3Qgbj10aGlzLmdlb21ldHJ5LGk9dGhpcy5tYXRlcmlhbCxzPXRoaXMubWF0cml4V29ybGQ7aSE9PXZvaWQgMCYmKG4uYm91bmRpbmdTcGhlcmU9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLGxvLmNvcHkobi5ib3VuZGluZ1NwaGVyZSksbG8uYXBwbHlNYXRyaXg0KHMpLCRpLmNvcHkoZS5yYXkpLnJlY2FzdChlLm5lYXIpLCEobG8uY29udGFpbnNQb2ludCgkaS5vcmlnaW4pPT09ITEmJigkaS5pbnRlcnNlY3RTcGhlcmUobG8sa2QpPT09bnVsbHx8JGkub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKGtkKT54cyhlLmZhci1lLm5lYXIsMikpKSYmKHpkLmNvcHkocykuaW52ZXJ0KCksJGkuY29weShlLnJheSkuYXBwbHlNYXRyaXg0KHpkKSwhKG4uYm91bmRpbmdCb3ghPT1udWxsJiYkaS5pbnRlcnNlY3RzQm94KG4uYm91bmRpbmdCb3gpPT09ITEpJiZ0aGlzLl9jb21wdXRlSW50ZXJzZWN0aW9ucyhlLHQsJGkpKSl9X2NvbXB1dGVJbnRlcnNlY3Rpb25zKGUsdCxuKXtsZXQgaTtjb25zdCBzPXRoaXMuZ2VvbWV0cnksYT10aGlzLm1hdGVyaWFsLG89cy5pbmRleCxsPXMuYXR0cmlidXRlcy5wb3NpdGlvbixjPXMuYXR0cmlidXRlcy51dixoPXMuYXR0cmlidXRlcy51djEsdT1zLmF0dHJpYnV0ZXMubm9ybWFsLGY9cy5ncm91cHMsZD1zLmRyYXdSYW5nZTtpZihvIT09bnVsbClpZihBcnJheS5pc0FycmF5KGEpKWZvcihsZXQgcD0wLF89Zi5sZW5ndGg7cDxfO3ArKyl7Y29uc3QgZz1mW3BdLG09YVtnLm1hdGVyaWFsSW5kZXhdLHk9TWF0aC5tYXgoZy5zdGFydCxkLnN0YXJ0KSx4PU1hdGgubWluKG8uY291bnQsTWF0aC5taW4oZy5zdGFydCtnLmNvdW50LGQuc3RhcnQrZC5jb3VudCkpO2ZvcihsZXQgdj15LFM9eDt2PFM7dis9Myl7Y29uc3QgYj1vLmdldFgodiksQT1vLmdldFgodisxKSxMPW8uZ2V0WCh2KzIpO2k9Z28odGhpcyxtLGUsbixjLGgsdSxiLEEsTCksaSYmKGkuZmFjZUluZGV4PU1hdGguZmxvb3Iodi8zKSxpLmZhY2UubWF0ZXJpYWxJbmRleD1nLm1hdGVyaWFsSW5kZXgsdC5wdXNoKGkpKX19ZWxzZXtjb25zdCBwPU1hdGgubWF4KDAsZC5zdGFydCksXz1NYXRoLm1pbihvLmNvdW50LGQuc3RhcnQrZC5jb3VudCk7Zm9yKGxldCBnPXAsbT1fO2c8bTtnKz0zKXtjb25zdCB5PW8uZ2V0WChnKSx4PW8uZ2V0WChnKzEpLHY9by5nZXRYKGcrMik7aT1nbyh0aGlzLGEsZSxuLGMsaCx1LHkseCx2KSxpJiYoaS5mYWNlSW5kZXg9TWF0aC5mbG9vcihnLzMpLHQucHVzaChpKSl9fWVsc2UgaWYobCE9PXZvaWQgMClpZihBcnJheS5pc0FycmF5KGEpKWZvcihsZXQgcD0wLF89Zi5sZW5ndGg7cDxfO3ArKyl7Y29uc3QgZz1mW3BdLG09YVtnLm1hdGVyaWFsSW5kZXhdLHk9TWF0aC5tYXgoZy5zdGFydCxkLnN0YXJ0KSx4PU1hdGgubWluKGwuY291bnQsTWF0aC5taW4oZy5zdGFydCtnLmNvdW50LGQuc3RhcnQrZC5jb3VudCkpO2ZvcihsZXQgdj15LFM9eDt2PFM7dis9Myl7Y29uc3QgYj12LEE9disxLEw9disyO2k9Z28odGhpcyxtLGUsbixjLGgsdSxiLEEsTCksaSYmKGkuZmFjZUluZGV4PU1hdGguZmxvb3Iodi8zKSxpLmZhY2UubWF0ZXJpYWxJbmRleD1nLm1hdGVyaWFsSW5kZXgsdC5wdXNoKGkpKX19ZWxzZXtjb25zdCBwPU1hdGgubWF4KDAsZC5zdGFydCksXz1NYXRoLm1pbihsLmNvdW50LGQuc3RhcnQrZC5jb3VudCk7Zm9yKGxldCBnPXAsbT1fO2c8bTtnKz0zKXtjb25zdCB5PWcseD1nKzEsdj1nKzI7aT1nbyh0aGlzLGEsZSxuLGMsaCx1LHkseCx2KSxpJiYoaS5mYWNlSW5kZXg9TWF0aC5mbG9vcihnLzMpLHQucHVzaChpKSl9fX19ZnVuY3Rpb24gQXgocixlLHQsbixpLHMsYSxvKXtsZXQgbDtpZihlLnNpZGU9PT1ZdD9sPW4uaW50ZXJzZWN0VHJpYW5nbGUoYSxzLGksITAsbyk6bD1uLmludGVyc2VjdFRyaWFuZ2xlKGkscyxhLGUuc2lkZT09PVluLG8pLGw9PT1udWxsKXJldHVybiBudWxsO21vLmNvcHkobyksbW8uYXBwbHlNYXRyaXg0KHIubWF0cml4V29ybGQpO2NvbnN0IGM9dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8obW8pO3JldHVybiBjPHQubmVhcnx8Yz50LmZhcj9udWxsOntkaXN0YW5jZTpjLHBvaW50Om1vLmNsb25lKCksb2JqZWN0OnJ9fWZ1bmN0aW9uIGdvKHIsZSx0LG4saSxzLGEsbyxsLGMpe3IuZ2V0VmVydGV4UG9zaXRpb24obyx6ciksci5nZXRWZXJ0ZXhQb3NpdGlvbihsLGtyKSxyLmdldFZlcnRleFBvc2l0aW9uKGMsR3IpO2NvbnN0IGg9QXgocixlLHQsbix6cixrcixHcixwbyk7aWYoaCl7aSYmKGhvLmZyb21CdWZmZXJBdHRyaWJ1dGUoaSxvKSx1by5mcm9tQnVmZmVyQXR0cmlidXRlKGksbCksZm8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLGMpLGgudXY9Y24uZ2V0SW50ZXJwb2xhdGlvbihwbyx6cixrcixHcixobyx1byxmbyxuZXcgcSkpLHMmJihoby5mcm9tQnVmZmVyQXR0cmlidXRlKHMsbyksdW8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGwpLGZvLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxjKSxoLnV2MT1jbi5nZXRJbnRlcnBvbGF0aW9uKHBvLHpyLGtyLEdyLGhvLHVvLGZvLG5ldyBxKSxoLnV2Mj1oLnV2MSksYSYmKEdkLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxvKSxWZC5mcm9tQnVmZmVyQXR0cmlidXRlKGEsbCksSGQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGMpLGgubm9ybWFsPWNuLmdldEludGVycG9sYXRpb24ocG8senIsa3IsR3IsR2QsVmQsSGQsbmV3IFApLGgubm9ybWFsLmRvdChuLmRpcmVjdGlvbik+MCYmaC5ub3JtYWwubXVsdGlwbHlTY2FsYXIoLTEpKTtjb25zdCB1PXthOm8sYjpsLGMsbm9ybWFsOm5ldyBQLG1hdGVyaWFsSW5kZXg6MH07Y24uZ2V0Tm9ybWFsKHpyLGtyLEdyLHUubm9ybWFsKSxoLmZhY2U9dX1yZXR1cm4gaH1jbGFzcyBZaSBleHRlbmRzIGtle2NvbnN0cnVjdG9yKGU9MSx0PTEsbj0xLGk9MSxzPTEsYT0xKXtzdXBlcigpLHRoaXMudHlwZT0iQm94R2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17d2lkdGg6ZSxoZWlnaHQ6dCxkZXB0aDpuLHdpZHRoU2VnbWVudHM6aSxoZWlnaHRTZWdtZW50czpzLGRlcHRoU2VnbWVudHM6YX07Y29uc3Qgbz10aGlzO2k9TWF0aC5mbG9vcihpKSxzPU1hdGguZmxvb3IocyksYT1NYXRoLmZsb29yKGEpO2NvbnN0IGw9W10sYz1bXSxoPVtdLHU9W107bGV0IGY9MCxkPTA7cCgieiIsInkiLCJ4IiwtMSwtMSxuLHQsZSxhLHMsMCkscCgieiIsInkiLCJ4IiwxLC0xLG4sdCwtZSxhLHMsMSkscCgieCIsInoiLCJ5IiwxLDEsZSxuLHQsaSxhLDIpLHAoIngiLCJ6IiwieSIsMSwtMSxlLG4sLXQsaSxhLDMpLHAoIngiLCJ5IiwieiIsMSwtMSxlLHQsbixpLHMsNCkscCgieCIsInkiLCJ6IiwtMSwtMSxlLHQsLW4saSxzLDUpLHRoaXMuc2V0SW5kZXgobCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoYywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKGgsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKHUsMikpO2Z1bmN0aW9uIHAoXyxnLG0seSx4LHYsUyxiLEEsTCxNKXtjb25zdCB3PXYvQSxSPVMvTCxOPXYvMixCPVMvMixJPWIvMixVPUErMSx6PUwrMTtsZXQgRj0wLFo9MDtjb25zdCBWPW5ldyBQO2ZvcihsZXQgUT0wO1E8ejtRKyspe2NvbnN0IG5lPVEqUi1CO2ZvcihsZXQgZmU9MDtmZTxVO2ZlKyspe2NvbnN0ICQ9ZmUqdy1OO1ZbX109JCp5LFZbZ109bmUqeCxWW21dPUksYy5wdXNoKFYueCxWLnksVi56KSxWW19dPTAsVltnXT0wLFZbbV09Yj4wPzE6LTEsaC5wdXNoKFYueCxWLnksVi56KSx1LnB1c2goZmUvQSksdS5wdXNoKDEtUS9MKSxGKz0xfX1mb3IobGV0IFE9MDtRPEw7USsrKWZvcihsZXQgbmU9MDtuZTxBO25lKyspe2NvbnN0IGZlPWYrbmUrVSpRLCQ9ZituZStVKihRKzEpLGVlPWYrKG5lKzEpK1UqKFErMSksZGU9ZisobmUrMSkrVSpRO2wucHVzaChmZSwkLGRlKSxsLnB1c2goJCxlZSxkZSksWis9Nn1vLmFkZEdyb3VwKGQsWixNKSxkKz1aLGYrPUZ9fWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IFlpKGUud2lkdGgsZS5oZWlnaHQsZS5kZXB0aCxlLndpZHRoU2VnbWVudHMsZS5oZWlnaHRTZWdtZW50cyxlLmRlcHRoU2VnbWVudHMpfX1mdW5jdGlvbiBWcihyKXtjb25zdCBlPXt9O2Zvcihjb25zdCB0IGluIHIpe2VbdF09e307Zm9yKGNvbnN0IG4gaW4gclt0XSl7Y29uc3QgaT1yW3RdW25dO2kmJihpLmlzQ29sb3J8fGkuaXNNYXRyaXgzfHxpLmlzTWF0cml4NHx8aS5pc1ZlY3RvcjJ8fGkuaXNWZWN0b3IzfHxpLmlzVmVjdG9yNHx8aS5pc1RleHR1cmV8fGkuaXNRdWF0ZXJuaW9uKT9pLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT8oY29uc29sZS53YXJuKCJVbmlmb3Jtc1V0aWxzOiBUZXh0dXJlcyBvZiByZW5kZXIgdGFyZ2V0cyBjYW5ub3QgYmUgY2xvbmVkIHZpYSBjbG9uZVVuaWZvcm1zKCkgb3IgbWVyZ2VVbmlmb3JtcygpLiIpLGVbdF1bbl09bnVsbCk6ZVt0XVtuXT1pLmNsb25lKCk6QXJyYXkuaXNBcnJheShpKT9lW3RdW25dPWkuc2xpY2UoKTplW3RdW25dPWl9fXJldHVybiBlfWZ1bmN0aW9uIFp0KHIpe2NvbnN0IGU9e307Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0Kyspe2NvbnN0IG49VnIoclt0XSk7Zm9yKGNvbnN0IGkgaW4gbillW2ldPW5baV19cmV0dXJuIGV9ZnVuY3Rpb24gVHgocil7Y29uc3QgZT1bXTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKyllLnB1c2goclt0XS5jbG9uZSgpKTtyZXR1cm4gZX1mdW5jdGlvbiBXZChyKXtyZXR1cm4gci5nZXRSZW5kZXJUYXJnZXQoKT09PW51bGw/ci5vdXRwdXRDb2xvclNwYWNlOm90LndvcmtpbmdDb2xvclNwYWNlfWNvbnN0IFhkPXtjbG9uZTpWcixtZXJnZTpadH07dmFyIEN4PWB2b2lkIG1haW4oKSB7CglnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7Cn1gLFJ4PWB2b2lkIG1haW4oKSB7CglnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTsKfWA7Y2xhc3MgSG4gZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNTaGFkZXJNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlNoYWRlck1hdGVyaWFsIix0aGlzLmRlZmluZXM9e30sdGhpcy51bmlmb3Jtcz17fSx0aGlzLnVuaWZvcm1zR3JvdXBzPVtdLHRoaXMudmVydGV4U2hhZGVyPUN4LHRoaXMuZnJhZ21lbnRTaGFkZXI9UngsdGhpcy5saW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuZm9nPSExLHRoaXMubGlnaHRzPSExLHRoaXMuY2xpcHBpbmc9ITEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9ITAsdGhpcy5leHRlbnNpb25zPXtkZXJpdmF0aXZlczohMSxmcmFnRGVwdGg6ITEsZHJhd0J1ZmZlcnM6ITEsc2hhZGVyVGV4dHVyZUxPRDohMX0sdGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzPXtjb2xvcjpbMSwxLDFdLHV2OlswLDBdLHV2MTpbMCwwXX0sdGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lPXZvaWQgMCx0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMSx0aGlzLmdsc2xWZXJzaW9uPW51bGwsZSE9PXZvaWQgMCYmdGhpcy5zZXRWYWx1ZXMoZSl9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLmZyYWdtZW50U2hhZGVyPWUuZnJhZ21lbnRTaGFkZXIsdGhpcy52ZXJ0ZXhTaGFkZXI9ZS52ZXJ0ZXhTaGFkZXIsdGhpcy51bmlmb3Jtcz1WcihlLnVuaWZvcm1zKSx0aGlzLnVuaWZvcm1zR3JvdXBzPVR4KGUudW5pZm9ybXNHcm91cHMpLHRoaXMuZGVmaW5lcz1PYmplY3QuYXNzaWduKHt9LGUuZGVmaW5lcyksdGhpcy53aXJlZnJhbWU9ZS53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9ZS53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy5mb2c9ZS5mb2csdGhpcy5saWdodHM9ZS5saWdodHMsdGhpcy5jbGlwcGluZz1lLmNsaXBwaW5nLHRoaXMuZXh0ZW5zaW9ucz1PYmplY3QuYXNzaWduKHt9LGUuZXh0ZW5zaW9ucyksdGhpcy5nbHNsVmVyc2lvbj1lLmdsc2xWZXJzaW9uLHRoaXN9dG9KU09OKGUpe2NvbnN0IHQ9c3VwZXIudG9KU09OKGUpO3QuZ2xzbFZlcnNpb249dGhpcy5nbHNsVmVyc2lvbix0LnVuaWZvcm1zPXt9O2Zvcihjb25zdCBpIGluIHRoaXMudW5pZm9ybXMpe2NvbnN0IGE9dGhpcy51bmlmb3Jtc1tpXS52YWx1ZTthJiZhLmlzVGV4dHVyZT90LnVuaWZvcm1zW2ldPXt0eXBlOiJ0Iix2YWx1ZTphLnRvSlNPTihlKS51dWlkfTphJiZhLmlzQ29sb3I/dC51bmlmb3Jtc1tpXT17dHlwZToiYyIsdmFsdWU6YS5nZXRIZXgoKX06YSYmYS5pc1ZlY3RvcjI/dC51bmlmb3Jtc1tpXT17dHlwZToidjIiLHZhbHVlOmEudG9BcnJheSgpfTphJiZhLmlzVmVjdG9yMz90LnVuaWZvcm1zW2ldPXt0eXBlOiJ2MyIsdmFsdWU6YS50b0FycmF5KCl9OmEmJmEuaXNWZWN0b3I0P3QudW5pZm9ybXNbaV09e3R5cGU6InY0Iix2YWx1ZTphLnRvQXJyYXkoKX06YSYmYS5pc01hdHJpeDM/dC51bmlmb3Jtc1tpXT17dHlwZToibTMiLHZhbHVlOmEudG9BcnJheSgpfTphJiZhLmlzTWF0cml4ND90LnVuaWZvcm1zW2ldPXt0eXBlOiJtNCIsdmFsdWU6YS50b0FycmF5KCl9OnQudW5pZm9ybXNbaV09e3ZhbHVlOmF9fU9iamVjdC5rZXlzKHRoaXMuZGVmaW5lcykubGVuZ3RoPjAmJih0LmRlZmluZXM9dGhpcy5kZWZpbmVzKSx0LnZlcnRleFNoYWRlcj10aGlzLnZlcnRleFNoYWRlcix0LmZyYWdtZW50U2hhZGVyPXRoaXMuZnJhZ21lbnRTaGFkZXIsdC5saWdodHM9dGhpcy5saWdodHMsdC5jbGlwcGluZz10aGlzLmNsaXBwaW5nO2NvbnN0IG49e307Zm9yKGNvbnN0IGkgaW4gdGhpcy5leHRlbnNpb25zKXRoaXMuZXh0ZW5zaW9uc1tpXT09PSEwJiYobltpXT0hMCk7cmV0dXJuIE9iamVjdC5rZXlzKG4pLmxlbmd0aD4wJiYodC5leHRlbnNpb25zPW4pLHR9fWNsYXNzIF9vIGV4dGVuZHMgcnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNDYW1lcmE9ITAsdGhpcy50eXBlPSJDYW1lcmEiLHRoaXMubWF0cml4V29ybGRJbnZlcnNlPW5ldyBJZSx0aGlzLnByb2plY3Rpb25NYXRyaXg9bmV3IEllLHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2U9bmV3IEllLHRoaXMuY29vcmRpbmF0ZVN5c3RlbT1Qbn1jb3B5KGUsdCl7cmV0dXJuIHN1cGVyLmNvcHkoZSx0KSx0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KGUubWF0cml4V29ybGRJbnZlcnNlKSx0aGlzLnByb2plY3Rpb25NYXRyaXguY29weShlLnByb2plY3Rpb25NYXRyaXgpLHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShlLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKSx0aGlzLmNvb3JkaW5hdGVTeXN0ZW09ZS5jb29yZGluYXRlU3lzdGVtLHRoaXN9Z2V0V29ybGREaXJlY3Rpb24oZSl7cmV0dXJuIHN1cGVyLmdldFdvcmxkRGlyZWN0aW9uKGUpLm5lZ2F0ZSgpfXVwZGF0ZU1hdHJpeFdvcmxkKGUpe3N1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKGUpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9dXBkYXRlV29ybGRNYXRyaXgoZSx0KXtzdXBlci51cGRhdGVXb3JsZE1hdHJpeChlLHQpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfX1jbGFzcyBCdCBleHRlbmRzIF9ve2NvbnN0cnVjdG9yKGU9NTAsdD0xLG49LjEsaT0yZTMpe3N1cGVyKCksdGhpcy5pc1BlcnNwZWN0aXZlQ2FtZXJhPSEwLHRoaXMudHlwZT0iUGVyc3BlY3RpdmVDYW1lcmEiLHRoaXMuZm92PWUsdGhpcy56b29tPTEsdGhpcy5uZWFyPW4sdGhpcy5mYXI9aSx0aGlzLmZvY3VzPTEwLHRoaXMuYXNwZWN0PXQsdGhpcy52aWV3PW51bGwsdGhpcy5maWxtR2F1Z2U9MzUsdGhpcy5maWxtT2Zmc2V0PTAsdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y29weShlLHQpe3JldHVybiBzdXBlci5jb3B5KGUsdCksdGhpcy5mb3Y9ZS5mb3YsdGhpcy56b29tPWUuem9vbSx0aGlzLm5lYXI9ZS5uZWFyLHRoaXMuZmFyPWUuZmFyLHRoaXMuZm9jdXM9ZS5mb2N1cyx0aGlzLmFzcGVjdD1lLmFzcGVjdCx0aGlzLnZpZXc9ZS52aWV3PT09bnVsbD9udWxsOk9iamVjdC5hc3NpZ24oe30sZS52aWV3KSx0aGlzLmZpbG1HYXVnZT1lLmZpbG1HYXVnZSx0aGlzLmZpbG1PZmZzZXQ9ZS5maWxtT2Zmc2V0LHRoaXN9c2V0Rm9jYWxMZW5ndGgoZSl7Y29uc3QgdD0uNSp0aGlzLmdldEZpbG1IZWlnaHQoKS9lO3RoaXMuZm92PUFyKjIqTWF0aC5hdGFuKHQpLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWdldEZvY2FsTGVuZ3RoKCl7Y29uc3QgZT1NYXRoLnRhbihIaSouNSp0aGlzLmZvdik7cmV0dXJuIC41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL2V9Z2V0RWZmZWN0aXZlRk9WKCl7cmV0dXJuIEFyKjIqTWF0aC5hdGFuKE1hdGgudGFuKEhpKi41KnRoaXMuZm92KS90aGlzLnpvb20pfWdldEZpbG1XaWR0aCgpe3JldHVybiB0aGlzLmZpbG1HYXVnZSpNYXRoLm1pbih0aGlzLmFzcGVjdCwxKX1nZXRGaWxtSGVpZ2h0KCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlL01hdGgubWF4KHRoaXMuYXNwZWN0LDEpfXNldFZpZXdPZmZzZXQoZSx0LG4saSxzLGEpe3RoaXMuYXNwZWN0PWUvdCx0aGlzLnZpZXc9PT1udWxsJiYodGhpcy52aWV3PXtlbmFibGVkOiEwLGZ1bGxXaWR0aDoxLGZ1bGxIZWlnaHQ6MSxvZmZzZXRYOjAsb2Zmc2V0WTowLHdpZHRoOjEsaGVpZ2h0OjF9KSx0aGlzLnZpZXcuZW5hYmxlZD0hMCx0aGlzLnZpZXcuZnVsbFdpZHRoPWUsdGhpcy52aWV3LmZ1bGxIZWlnaHQ9dCx0aGlzLnZpZXcub2Zmc2V0WD1uLHRoaXMudmlldy5vZmZzZXRZPWksdGhpcy52aWV3LndpZHRoPXMsdGhpcy52aWV3LmhlaWdodD1hLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWNsZWFyVmlld09mZnNldCgpe3RoaXMudmlldyE9PW51bGwmJih0aGlzLnZpZXcuZW5hYmxlZD0hMSksdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9dXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpe2NvbnN0IGU9dGhpcy5uZWFyO2xldCB0PWUqTWF0aC50YW4oSGkqLjUqdGhpcy5mb3YpL3RoaXMuem9vbSxuPTIqdCxpPXRoaXMuYXNwZWN0Km4scz0tLjUqaTtjb25zdCBhPXRoaXMudmlldztpZih0aGlzLnZpZXchPT1udWxsJiZ0aGlzLnZpZXcuZW5hYmxlZCl7Y29uc3QgbD1hLmZ1bGxXaWR0aCxjPWEuZnVsbEhlaWdodDtzKz1hLm9mZnNldFgqaS9sLHQtPWEub2Zmc2V0WSpuL2MsaSo9YS53aWR0aC9sLG4qPWEuaGVpZ2h0L2N9Y29uc3Qgbz10aGlzLmZpbG1PZmZzZXQ7byE9PTAmJihzKz1lKm8vdGhpcy5nZXRGaWxtV2lkdGgoKSksdGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZShzLHMraSx0LHQtbixlLHRoaXMuZmFyLHRoaXMuY29vcmRpbmF0ZVN5c3RlbSksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMucHJvamVjdGlvbk1hdHJpeCkuaW52ZXJ0KCl9dG9KU09OKGUpe2NvbnN0IHQ9c3VwZXIudG9KU09OKGUpO3JldHVybiB0Lm9iamVjdC5mb3Y9dGhpcy5mb3YsdC5vYmplY3Quem9vbT10aGlzLnpvb20sdC5vYmplY3QubmVhcj10aGlzLm5lYXIsdC5vYmplY3QuZmFyPXRoaXMuZmFyLHQub2JqZWN0LmZvY3VzPXRoaXMuZm9jdXMsdC5vYmplY3QuYXNwZWN0PXRoaXMuYXNwZWN0LHRoaXMudmlldyE9PW51bGwmJih0Lm9iamVjdC52aWV3PU9iamVjdC5hc3NpZ24oe30sdGhpcy52aWV3KSksdC5vYmplY3QuZmlsbUdhdWdlPXRoaXMuZmlsbUdhdWdlLHQub2JqZWN0LmZpbG1PZmZzZXQ9dGhpcy5maWxtT2Zmc2V0LHR9fWNvbnN0IEhyPS05MCxXcj0xO2NsYXNzIHFkIGV4dGVuZHMgcnR7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKCksdGhpcy50eXBlPSJDdWJlQ2FtZXJhIix0aGlzLnJlbmRlclRhcmdldD1uLHRoaXMuY29vcmRpbmF0ZVN5c3RlbT1udWxsLHRoaXMuYWN0aXZlTWlwbWFwTGV2ZWw9MDtjb25zdCBpPW5ldyBCdChIcixXcixlLHQpO2kubGF5ZXJzPXRoaXMubGF5ZXJzLHRoaXMuYWRkKGkpO2NvbnN0IHM9bmV3IEJ0KEhyLFdyLGUsdCk7cy5sYXllcnM9dGhpcy5sYXllcnMsdGhpcy5hZGQocyk7Y29uc3QgYT1uZXcgQnQoSHIsV3IsZSx0KTthLmxheWVycz10aGlzLmxheWVycyx0aGlzLmFkZChhKTtjb25zdCBvPW5ldyBCdChIcixXcixlLHQpO28ubGF5ZXJzPXRoaXMubGF5ZXJzLHRoaXMuYWRkKG8pO2NvbnN0IGw9bmV3IEJ0KEhyLFdyLGUsdCk7bC5sYXllcnM9dGhpcy5sYXllcnMsdGhpcy5hZGQobCk7Y29uc3QgYz1uZXcgQnQoSHIsV3IsZSx0KTtjLmxheWVycz10aGlzLmxheWVycyx0aGlzLmFkZChjKX11cGRhdGVDb29yZGluYXRlU3lzdGVtKCl7Y29uc3QgZT10aGlzLmNvb3JkaW5hdGVTeXN0ZW0sdD10aGlzLmNoaWxkcmVuLmNvbmNhdCgpLFtuLGkscyxhLG8sbF09dDtmb3IoY29uc3QgYyBvZiB0KXRoaXMucmVtb3ZlKGMpO2lmKGU9PT1QbiluLnVwLnNldCgwLDEsMCksbi5sb29rQXQoMSwwLDApLGkudXAuc2V0KDAsMSwwKSxpLmxvb2tBdCgtMSwwLDApLHMudXAuc2V0KDAsMCwtMSkscy5sb29rQXQoMCwxLDApLGEudXAuc2V0KDAsMCwxKSxhLmxvb2tBdCgwLC0xLDApLG8udXAuc2V0KDAsMSwwKSxvLmxvb2tBdCgwLDAsMSksbC51cC5zZXQoMCwxLDApLGwubG9va0F0KDAsMCwtMSk7ZWxzZSBpZihlPT09RXIpbi51cC5zZXQoMCwtMSwwKSxuLmxvb2tBdCgtMSwwLDApLGkudXAuc2V0KDAsLTEsMCksaS5sb29rQXQoMSwwLDApLHMudXAuc2V0KDAsMCwxKSxzLmxvb2tBdCgwLDEsMCksYS51cC5zZXQoMCwwLC0xKSxhLmxvb2tBdCgwLC0xLDApLG8udXAuc2V0KDAsLTEsMCksby5sb29rQXQoMCwwLDEpLGwudXAuc2V0KDAsLTEsMCksbC5sb29rQXQoMCwwLC0xKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuQ3ViZUNhbWVyYS51cGRhdGVDb29yZGluYXRlU3lzdGVtKCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrZSk7Zm9yKGNvbnN0IGMgb2YgdCl0aGlzLmFkZChjKSxjLnVwZGF0ZU1hdHJpeFdvcmxkKCl9dXBkYXRlKGUsdCl7dGhpcy5wYXJlbnQ9PT1udWxsJiZ0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Y29uc3R7cmVuZGVyVGFyZ2V0Om4sYWN0aXZlTWlwbWFwTGV2ZWw6aX09dGhpczt0aGlzLmNvb3JkaW5hdGVTeXN0ZW0hPT1lLmNvb3JkaW5hdGVTeXN0ZW0mJih0aGlzLmNvb3JkaW5hdGVTeXN0ZW09ZS5jb29yZGluYXRlU3lzdGVtLHRoaXMudXBkYXRlQ29vcmRpbmF0ZVN5c3RlbSgpKTtjb25zdFtzLGEsbyxsLGMsaF09dGhpcy5jaGlsZHJlbix1PWUuZ2V0UmVuZGVyVGFyZ2V0KCksZj1lLmdldEFjdGl2ZUN1YmVGYWNlKCksZD1lLmdldEFjdGl2ZU1pcG1hcExldmVsKCkscD1lLnhyLmVuYWJsZWQ7ZS54ci5lbmFibGVkPSExO2NvbnN0IF89bi50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztuLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPSExLGUuc2V0UmVuZGVyVGFyZ2V0KG4sMCxpKSxlLnJlbmRlcih0LHMpLGUuc2V0UmVuZGVyVGFyZ2V0KG4sMSxpKSxlLnJlbmRlcih0LGEpLGUuc2V0UmVuZGVyVGFyZ2V0KG4sMixpKSxlLnJlbmRlcih0LG8pLGUuc2V0UmVuZGVyVGFyZ2V0KG4sMyxpKSxlLnJlbmRlcih0LGwpLGUuc2V0UmVuZGVyVGFyZ2V0KG4sNCxpKSxlLnJlbmRlcih0LGMpLG4udGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9XyxlLnNldFJlbmRlclRhcmdldChuLDUsaSksZS5yZW5kZXIodCxoKSxlLnNldFJlbmRlclRhcmdldCh1LGYsZCksZS54ci5lbmFibGVkPXAsbi50ZXh0dXJlLm5lZWRzUE1SRU1VcGRhdGU9ITB9fWNsYXNzIFhzIGV4dGVuZHMgRXR7Y29uc3RydWN0b3IoZSx0LG4saSxzLGEsbyxsLGMsaCl7ZT1lIT09dm9pZCAwP2U6W10sdD10IT09dm9pZCAwP3Q6S24sc3VwZXIoZSx0LG4saSxzLGEsbyxsLGMsaCksdGhpcy5pc0N1YmVUZXh0dXJlPSEwLHRoaXMuZmxpcFk9ITF9Z2V0IGltYWdlcygpe3JldHVybiB0aGlzLmltYWdlfXNldCBpbWFnZXMoZSl7dGhpcy5pbWFnZT1lfX1jbGFzcyAkZCBleHRlbmRzIExue2NvbnN0cnVjdG9yKGU9MSx0PXt9KXtzdXBlcihlLGUsdCksdGhpcy5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldD0hMDtjb25zdCBuPXt3aWR0aDplLGhlaWdodDplLGRlcHRoOjF9LGk9W24sbixuLG4sbixuXTt0LmVuY29kaW5nIT09dm9pZCAwJiYoQnMoIlRIUkVFLldlYkdMQ3ViZVJlbmRlclRhcmdldDogb3B0aW9uLmVuY29kaW5nIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IG9wdGlvbi5jb2xvclNwYWNlLiIpLHQuY29sb3JTcGFjZT10LmVuY29kaW5nPT09Ymk/UHQ6Z24pLHRoaXMudGV4dHVyZT1uZXcgWHMoaSx0Lm1hcHBpbmcsdC53cmFwUyx0LndyYXBULHQubWFnRmlsdGVyLHQubWluRmlsdGVyLHQuZm9ybWF0LHQudHlwZSx0LmFuaXNvdHJvcHksdC5jb2xvclNwYWNlKSx0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwLHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9dC5nZW5lcmF0ZU1pcG1hcHMhPT12b2lkIDA/dC5nZW5lcmF0ZU1pcG1hcHM6ITEsdGhpcy50ZXh0dXJlLm1pbkZpbHRlcj10Lm1pbkZpbHRlciE9PXZvaWQgMD90Lm1pbkZpbHRlcjp3dH1mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZShlLHQpe3RoaXMudGV4dHVyZS50eXBlPXQudHlwZSx0aGlzLnRleHR1cmUuY29sb3JTcGFjZT10LmNvbG9yU3BhY2UsdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnRleHR1cmUubWluRmlsdGVyPXQubWluRmlsdGVyLHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXI7Y29uc3Qgbj17dW5pZm9ybXM6e3RFcXVpcmVjdDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpgCgoJCQkJdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKCgkJCQl2ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkgewoKCQkJCQlyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTsKCgkJCQl9CgoJCQkJdm9pZCBtYWluKCkgewoKCQkJCQl2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApOwoKCQkJCQkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJCQkJCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCgkJCQl9CgkJCWAsZnJhZ21lbnRTaGFkZXI6YAoKCQkJCXVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDsKCgkJCQl2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwoKCQkJCSNpbmNsdWRlIDxjb21tb24+CgoJCQkJdm9pZCBtYWluKCkgewoKCQkJCQl2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7CgoJCQkJCXZlYzIgc2FtcGxlVVYgPSBlcXVpcmVjdFV2KCBkaXJlY3Rpb24gKTsKCgkJCQkJZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7CgoJCQkJfQoJCQlgfSxpPW5ldyBZaSg1LDUsNSkscz1uZXcgSG4oe25hbWU6IkN1YmVtYXBGcm9tRXF1aXJlY3QiLHVuaWZvcm1zOlZyKG4udW5pZm9ybXMpLHZlcnRleFNoYWRlcjpuLnZlcnRleFNoYWRlcixmcmFnbWVudFNoYWRlcjpuLmZyYWdtZW50U2hhZGVyLHNpZGU6WXQsYmxlbmRpbmc6Wm59KTtzLnVuaWZvcm1zLnRFcXVpcmVjdC52YWx1ZT10O2NvbnN0IGE9bmV3IEx0KGkscyksbz10Lm1pbkZpbHRlcjtyZXR1cm4gdC5taW5GaWx0ZXI9PT12aSYmKHQubWluRmlsdGVyPXd0KSxuZXcgcWQoMSwxMCx0aGlzKS51cGRhdGUoZSxhKSx0Lm1pbkZpbHRlcj1vLGEuZ2VvbWV0cnkuZGlzcG9zZSgpLGEubWF0ZXJpYWwuZGlzcG9zZSgpLHRoaXN9Y2xlYXIoZSx0LG4saSl7Y29uc3Qgcz1lLmdldFJlbmRlclRhcmdldCgpO2ZvcihsZXQgYT0wO2E8NjthKyspZS5zZXRSZW5kZXJUYXJnZXQodGhpcyxhKSxlLmNsZWFyKHQsbixpKTtlLnNldFJlbmRlclRhcmdldChzKX19Y29uc3QgTWg9bmV3IFAsUHg9bmV3IFAsTHg9bmV3IFplO2NsYXNzIExpe2NvbnN0cnVjdG9yKGU9bmV3IFAoMSwwLDApLHQ9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPWUsdGhpcy5jb25zdGFudD10fXNldChlLHQpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KGUpLHRoaXMuY29uc3RhbnQ9dCx0aGlzfXNldENvbXBvbmVudHMoZSx0LG4saSl7cmV0dXJuIHRoaXMubm9ybWFsLnNldChlLHQsbiksdGhpcy5jb25zdGFudD1pLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoZSx0KXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weShlKSx0aGlzLmNvbnN0YW50PS10LmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHMoZSx0LG4pe2NvbnN0IGk9TWguc3ViVmVjdG9ycyhuLHQpLmNyb3NzKFB4LnN1YlZlY3RvcnMoZSx0KSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoaSxlKSx0aGlzfWNvcHkoZSl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkoZS5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9ZS5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IGU9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIoZSksdGhpcy5jb25zdGFudCo9ZSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludChlKXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KGUpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZShlKXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoZS5jZW50ZXIpLWUucmFkaXVzfXByb2plY3RQb2ludChlLHQpe3JldHVybiB0LmNvcHkoZSkuYWRkU2NhbGVkVmVjdG9yKHRoaXMubm9ybWFsLC10aGlzLmRpc3RhbmNlVG9Qb2ludChlKSl9aW50ZXJzZWN0TGluZShlLHQpe2NvbnN0IG49ZS5kZWx0YShNaCksaT10aGlzLm5vcm1hbC5kb3Qobik7aWYoaT09PTApcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KGUuc3RhcnQpPT09MD90LmNvcHkoZS5zdGFydCk6bnVsbDtjb25zdCBzPS0oZS5zdGFydC5kb3QodGhpcy5ub3JtYWwpK3RoaXMuY29uc3RhbnQpL2k7cmV0dXJuIHM8MHx8cz4xP251bGw6dC5jb3B5KGUuc3RhcnQpLmFkZFNjYWxlZFZlY3RvcihuLHMpfWludGVyc2VjdHNMaW5lKGUpe2NvbnN0IHQ9dGhpcy5kaXN0YW5jZVRvUG9pbnQoZS5zdGFydCksbj10aGlzLmRpc3RhbmNlVG9Qb2ludChlLmVuZCk7cmV0dXJuIHQ8MCYmbj4wfHxuPDAmJnQ+MH1pbnRlcnNlY3RzQm94KGUpe3JldHVybiBlLmludGVyc2VjdHNQbGFuZSh0aGlzKX1pbnRlcnNlY3RzU3BoZXJlKGUpe3JldHVybiBlLmludGVyc2VjdHNQbGFuZSh0aGlzKX1jb3BsYW5hclBvaW50KGUpe3JldHVybiBlLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmNvbnN0YW50KX1hcHBseU1hdHJpeDQoZSx0KXtjb25zdCBuPXR8fEx4LmdldE5vcm1hbE1hdHJpeChlKSxpPXRoaXMuY29wbGFuYXJQb2ludChNaCkuYXBwbHlNYXRyaXg0KGUpLHM9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKG4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzLmNvbnN0YW50PS1pLmRvdChzKSx0aGlzfXRyYW5zbGF0ZShlKXtyZXR1cm4gdGhpcy5jb25zdGFudC09ZS5kb3QodGhpcy5ub3JtYWwpLHRoaXN9ZXF1YWxzKGUpe3JldHVybiBlLm5vcm1hbC5lcXVhbHModGhpcy5ub3JtYWwpJiZlLmNvbnN0YW50PT09dGhpcy5jb25zdGFudH1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNvbnN0IFppPW5ldyBHdCx4bz1uZXcgUDtjbGFzcyBxc3tjb25zdHJ1Y3RvcihlPW5ldyBMaSx0PW5ldyBMaSxuPW5ldyBMaSxpPW5ldyBMaSxzPW5ldyBMaSxhPW5ldyBMaSl7dGhpcy5wbGFuZXM9W2UsdCxuLGkscyxhXX1zZXQoZSx0LG4saSxzLGEpe2NvbnN0IG89dGhpcy5wbGFuZXM7cmV0dXJuIG9bMF0uY29weShlKSxvWzFdLmNvcHkodCksb1syXS5jb3B5KG4pLG9bM10uY29weShpKSxvWzRdLmNvcHkocyksb1s1XS5jb3B5KGEpLHRoaXN9Y29weShlKXtjb25zdCB0PXRoaXMucGxhbmVzO2ZvcihsZXQgbj0wO248NjtuKyspdFtuXS5jb3B5KGUucGxhbmVzW25dKTtyZXR1cm4gdGhpc31zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChlLHQ9UG4pe2NvbnN0IG49dGhpcy5wbGFuZXMsaT1lLmVsZW1lbnRzLHM9aVswXSxhPWlbMV0sbz1pWzJdLGw9aVszXSxjPWlbNF0saD1pWzVdLHU9aVs2XSxmPWlbN10sZD1pWzhdLHA9aVs5XSxfPWlbMTBdLGc9aVsxMV0sbT1pWzEyXSx5PWlbMTNdLHg9aVsxNF0sdj1pWzE1XTtpZihuWzBdLnNldENvbXBvbmVudHMobC1zLGYtYyxnLWQsdi1tKS5ub3JtYWxpemUoKSxuWzFdLnNldENvbXBvbmVudHMobCtzLGYrYyxnK2QsdittKS5ub3JtYWxpemUoKSxuWzJdLnNldENvbXBvbmVudHMobCthLGYraCxnK3Asdit5KS5ub3JtYWxpemUoKSxuWzNdLnNldENvbXBvbmVudHMobC1hLGYtaCxnLXAsdi15KS5ub3JtYWxpemUoKSxuWzRdLnNldENvbXBvbmVudHMobC1vLGYtdSxnLV8sdi14KS5ub3JtYWxpemUoKSx0PT09UG4pbls1XS5zZXRDb21wb25lbnRzKGwrbyxmK3UsZytfLHYreCkubm9ybWFsaXplKCk7ZWxzZSBpZih0PT09RXIpbls1XS5zZXRDb21wb25lbnRzKG8sdSxfLHgpLm5vcm1hbGl6ZSgpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5GcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCk6IEludmFsaWQgY29vcmRpbmF0ZSBzeXN0ZW06ICIrdCk7cmV0dXJuIHRoaXN9aW50ZXJzZWN0c09iamVjdChlKXtpZihlLmJvdW5kaW5nU3BoZXJlIT09dm9pZCAwKWUuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZlLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLFppLmNvcHkoZS5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KGUubWF0cml4V29ybGQpO2Vsc2V7Y29uc3QgdD1lLmdlb21ldHJ5O3QuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZ0LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLFppLmNvcHkodC5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KGUubWF0cml4V29ybGQpfXJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoWmkpfWludGVyc2VjdHNTcHJpdGUoZSl7cmV0dXJuIFppLmNlbnRlci5zZXQoMCwwLDApLFppLnJhZGl1cz0uNzA3MTA2NzgxMTg2NTQ3NixaaS5hcHBseU1hdHJpeDQoZS5tYXRyaXhXb3JsZCksdGhpcy5pbnRlcnNlY3RzU3BoZXJlKFppKX1pbnRlcnNlY3RzU3BoZXJlKGUpe2NvbnN0IHQ9dGhpcy5wbGFuZXMsbj1lLmNlbnRlcixpPS1lLnJhZGl1cztmb3IobGV0IHM9MDtzPDY7cysrKWlmKHRbc10uZGlzdGFuY2VUb1BvaW50KG4pPGkpcmV0dXJuITE7cmV0dXJuITB9aW50ZXJzZWN0c0JveChlKXtjb25zdCB0PXRoaXMucGxhbmVzO2ZvcihsZXQgbj0wO248NjtuKyspe2NvbnN0IGk9dFtuXTtpZih4by54PWkubm9ybWFsLng+MD9lLm1heC54OmUubWluLngseG8ueT1pLm5vcm1hbC55PjA/ZS5tYXgueTplLm1pbi55LHhvLno9aS5ub3JtYWwuej4wP2UubWF4Lno6ZS5taW4ueixpLmRpc3RhbmNlVG9Qb2ludCh4byk8MClyZXR1cm4hMX1yZXR1cm4hMH1jb250YWluc1BvaW50KGUpe2NvbnN0IHQ9dGhpcy5wbGFuZXM7Zm9yKGxldCBuPTA7bjw2O24rKylpZih0W25dLmRpc3RhbmNlVG9Qb2ludChlKTwwKXJldHVybiExO3JldHVybiEwfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19ZnVuY3Rpb24gWWQoKXtsZXQgcj1udWxsLGU9ITEsdD1udWxsLG49bnVsbDtmdW5jdGlvbiBpKHMsYSl7dChzLGEpLG49ci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSl9cmV0dXJue3N0YXJ0OmZ1bmN0aW9uKCl7ZSE9PSEwJiZ0IT09bnVsbCYmKG49ci5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaSksZT0hMCl9LHN0b3A6ZnVuY3Rpb24oKXtyLmNhbmNlbEFuaW1hdGlvbkZyYW1lKG4pLGU9ITF9LHNldEFuaW1hdGlvbkxvb3A6ZnVuY3Rpb24ocyl7dD1zfSxzZXRDb250ZXh0OmZ1bmN0aW9uKHMpe3I9c319fWZ1bmN0aW9uIEl4KHIsZSl7Y29uc3QgdD1lLmlzV2ViR0wyLG49bmV3IFdlYWtNYXA7ZnVuY3Rpb24gaShjLGgpe2NvbnN0IHU9Yy5hcnJheSxmPWMudXNhZ2UsZD11LmJ5dGVMZW5ndGgscD1yLmNyZWF0ZUJ1ZmZlcigpO3IuYmluZEJ1ZmZlcihoLHApLHIuYnVmZmVyRGF0YShoLHUsZiksYy5vblVwbG9hZENhbGxiYWNrKCk7bGV0IF87aWYodSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSlfPXIuRkxPQVQ7ZWxzZSBpZih1IGluc3RhbmNlb2YgVWludDE2QXJyYXkpaWYoYy5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGUpaWYodClfPXIuSEFMRl9GTE9BVDtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVc2FnZSBvZiBGbG9hdDE2QnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIFdlYkdMMi4iKTtlbHNlIF89ci5VTlNJR05FRF9TSE9SVDtlbHNlIGlmKHUgaW5zdGFuY2VvZiBJbnQxNkFycmF5KV89ci5TSE9SVDtlbHNlIGlmKHUgaW5zdGFuY2VvZiBVaW50MzJBcnJheSlfPXIuVU5TSUdORURfSU5UO2Vsc2UgaWYodSBpbnN0YW5jZW9mIEludDMyQXJyYXkpXz1yLklOVDtlbHNlIGlmKHUgaW5zdGFuY2VvZiBJbnQ4QXJyYXkpXz1yLkJZVEU7ZWxzZSBpZih1IGluc3RhbmNlb2YgVWludDhBcnJheSlfPXIuVU5TSUdORURfQllURTtlbHNlIGlmKHUgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSlfPXIuVU5TSUdORURfQllURTtlbHNlIHRocm93IG5ldyBFcnJvcigiVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVbnN1cHBvcnRlZCBidWZmZXIgZGF0YSBmb3JtYXQ6ICIrdSk7cmV0dXJue2J1ZmZlcjpwLHR5cGU6XyxieXRlc1BlckVsZW1lbnQ6dS5CWVRFU19QRVJfRUxFTUVOVCx2ZXJzaW9uOmMudmVyc2lvbixzaXplOmR9fWZ1bmN0aW9uIHMoYyxoLHUpe2NvbnN0IGY9aC5hcnJheSxkPWguX3VwZGF0ZVJhbmdlLHA9aC51cGRhdGVSYW5nZXM7aWYoci5iaW5kQnVmZmVyKHUsYyksZC5jb3VudD09PS0xJiZwLmxlbmd0aD09PTAmJnIuYnVmZmVyU3ViRGF0YSh1LDAsZikscC5sZW5ndGghPT0wKXtmb3IobGV0IF89MCxnPXAubGVuZ3RoO188ZztfKyspe2NvbnN0IG09cFtfXTt0P3IuYnVmZmVyU3ViRGF0YSh1LG0uc3RhcnQqZi5CWVRFU19QRVJfRUxFTUVOVCxmLG0uc3RhcnQsbS5jb3VudCk6ci5idWZmZXJTdWJEYXRhKHUsbS5zdGFydCpmLkJZVEVTX1BFUl9FTEVNRU5ULGYuc3ViYXJyYXkobS5zdGFydCxtLnN0YXJ0K20uY291bnQpKX1oLmNsZWFyVXBkYXRlUmFuZ2VzKCl9ZC5jb3VudCE9PS0xJiYodD9yLmJ1ZmZlclN1YkRhdGEodSxkLm9mZnNldCpmLkJZVEVTX1BFUl9FTEVNRU5ULGYsZC5vZmZzZXQsZC5jb3VudCk6ci5idWZmZXJTdWJEYXRhKHUsZC5vZmZzZXQqZi5CWVRFU19QRVJfRUxFTUVOVCxmLnN1YmFycmF5KGQub2Zmc2V0LGQub2Zmc2V0K2QuY291bnQpKSxkLmNvdW50PS0xKSxoLm9uVXBsb2FkQ2FsbGJhY2soKX1mdW5jdGlvbiBhKGMpe3JldHVybiBjLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihjPWMuZGF0YSksbi5nZXQoYyl9ZnVuY3Rpb24gbyhjKXtjLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihjPWMuZGF0YSk7Y29uc3QgaD1uLmdldChjKTtoJiYoci5kZWxldGVCdWZmZXIoaC5idWZmZXIpLG4uZGVsZXRlKGMpKX1mdW5jdGlvbiBsKGMsaCl7aWYoYy5pc0dMQnVmZmVyQXR0cmlidXRlKXtjb25zdCBmPW4uZ2V0KGMpOyghZnx8Zi52ZXJzaW9uPGMudmVyc2lvbikmJm4uc2V0KGMse2J1ZmZlcjpjLmJ1ZmZlcix0eXBlOmMudHlwZSxieXRlc1BlckVsZW1lbnQ6Yy5lbGVtZW50U2l6ZSx2ZXJzaW9uOmMudmVyc2lvbn0pO3JldHVybn1jLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihjPWMuZGF0YSk7Y29uc3QgdT1uLmdldChjKTtpZih1PT09dm9pZCAwKW4uc2V0KGMsaShjLGgpKTtlbHNlIGlmKHUudmVyc2lvbjxjLnZlcnNpb24pe2lmKHUuc2l6ZSE9PWMuYXJyYXkuYnl0ZUxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLldlYkdMQXR0cmlidXRlczogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBhdHRyaWJ1dGUncyBhcnJheSBidWZmZXIgZG9lcyBub3QgbWF0Y2ggdGhlIG9yaWdpbmFsIHNpemUuIFJlc2l6aW5nIGJ1ZmZlciBhdHRyaWJ1dGVzIGlzIG5vdCBzdXBwb3J0ZWQuIik7cyh1LmJ1ZmZlcixjLGgpLHUudmVyc2lvbj1jLnZlcnNpb259fXJldHVybntnZXQ6YSxyZW1vdmU6byx1cGRhdGU6bH19Y2xhc3MgJHMgZXh0ZW5kcyBrZXtjb25zdHJ1Y3RvcihlPTEsdD0xLG49MSxpPTEpe3N1cGVyKCksdGhpcy50eXBlPSJQbGFuZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOmUsaGVpZ2h0OnQsd2lkdGhTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOml9O2NvbnN0IHM9ZS8yLGE9dC8yLG89TWF0aC5mbG9vcihuKSxsPU1hdGguZmxvb3IoaSksYz1vKzEsaD1sKzEsdT1lL28sZj10L2wsZD1bXSxwPVtdLF89W10sZz1bXTtmb3IobGV0IG09MDttPGg7bSsrKXtjb25zdCB5PW0qZi1hO2ZvcihsZXQgeD0wO3g8Yzt4Kyspe2NvbnN0IHY9eCp1LXM7cC5wdXNoKHYsLXksMCksXy5wdXNoKDAsMCwxKSxnLnB1c2goeC9vKSxnLnB1c2goMS1tL2wpfX1mb3IobGV0IG09MDttPGw7bSsrKWZvcihsZXQgeT0wO3k8bzt5Kyspe2NvbnN0IHg9eStjKm0sdj15K2MqKG0rMSksUz15KzErYyoobSsxKSxiPXkrMStjKm07ZC5wdXNoKHgsdixiKSxkLnB1c2godixTLGIpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKF8sMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGcsMikpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3ICRzKGUud2lkdGgsZS5oZWlnaHQsZS53aWR0aFNlZ21lbnRzLGUuaGVpZ2h0U2VnbWVudHMpfX12YXIgVXg9YCNpZmRlZiBVU0VfQUxQSEFIQVNICglpZiAoIGRpZmZ1c2VDb2xvci5hIDwgZ2V0QWxwaGFIYXNoVGhyZXNob2xkKCB2UG9zaXRpb24gKSApIGRpc2NhcmQ7CiNlbmRpZmAsRHg9YCNpZmRlZiBVU0VfQUxQSEFIQVNICgljb25zdCBmbG9hdCBBTFBIQV9IQVNIX1NDQUxFID0gMC4wNTsKCWZsb2F0IGhhc2gyRCggdmVjMiB2YWx1ZSApIHsKCQlyZXR1cm4gZnJhY3QoIDEuMGU0ICogc2luKCAxNy4wICogdmFsdWUueCArIDAuMSAqIHZhbHVlLnkgKSAqICggMC4xICsgYWJzKCBzaW4oIDEzLjAgKiB2YWx1ZS55ICsgdmFsdWUueCApICkgKSApOwoJfQoJZmxvYXQgaGFzaDNEKCB2ZWMzIHZhbHVlICkgewoJCXJldHVybiBoYXNoMkQoIHZlYzIoIGhhc2gyRCggdmFsdWUueHkgKSwgdmFsdWUueiApICk7Cgl9CglmbG9hdCBnZXRBbHBoYUhhc2hUaHJlc2hvbGQoIHZlYzMgcG9zaXRpb24gKSB7CgkJZmxvYXQgbWF4RGVyaXYgPSBtYXgoCgkJCWxlbmd0aCggZEZkeCggcG9zaXRpb24ueHl6ICkgKSwKCQkJbGVuZ3RoKCBkRmR5KCBwb3NpdGlvbi54eXogKSApCgkJKTsKCQlmbG9hdCBwaXhTY2FsZSA9IDEuMCAvICggQUxQSEFfSEFTSF9TQ0FMRSAqIG1heERlcml2ICk7CgkJdmVjMiBwaXhTY2FsZXMgPSB2ZWMyKAoJCQlleHAyKCBmbG9vciggbG9nMiggcGl4U2NhbGUgKSApICksCgkJCWV4cDIoIGNlaWwoIGxvZzIoIHBpeFNjYWxlICkgKSApCgkJKTsKCQl2ZWMyIGFscGhhID0gdmVjMigKCQkJaGFzaDNEKCBmbG9vciggcGl4U2NhbGVzLnggKiBwb3NpdGlvbi54eXogKSApLAoJCQloYXNoM0QoIGZsb29yKCBwaXhTY2FsZXMueSAqIHBvc2l0aW9uLnh5eiApICkKCQkpOwoJCWZsb2F0IGxlcnBGYWN0b3IgPSBmcmFjdCggbG9nMiggcGl4U2NhbGUgKSApOwoJCWZsb2F0IHggPSAoIDEuMCAtIGxlcnBGYWN0b3IgKSAqIGFscGhhLnggKyBsZXJwRmFjdG9yICogYWxwaGEueTsKCQlmbG9hdCBhID0gbWluKCBsZXJwRmFjdG9yLCAxLjAgLSBsZXJwRmFjdG9yICk7CgkJdmVjMyBjYXNlcyA9IHZlYzMoCgkJCXggKiB4IC8gKCAyLjAgKiBhICogKCAxLjAgLSBhICkgKSwKCQkJKCB4IC0gMC41ICogYSApIC8gKCAxLjAgLSBhICksCgkJCTEuMCAtICggKCAxLjAgLSB4ICkgKiAoIDEuMCAtIHggKSAvICggMi4wICogYSAqICggMS4wIC0gYSApICkgKQoJCSk7CgkJZmxvYXQgdGhyZXNob2xkID0gKCB4IDwgKCAxLjAgLSBhICkgKQoJCQk/ICggKCB4IDwgYSApID8gY2FzZXMueCA6IGNhc2VzLnkgKQoJCQk6IGNhc2VzLno7CgkJcmV0dXJuIGNsYW1wKCB0aHJlc2hvbGQgLCAxLjBlLTYsIDEuMCApOwoJfQojZW5kaWZgLE54PWAjaWZkZWYgVVNFX0FMUEhBTUFQCglkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2QWxwaGFNYXBVdiApLmc7CiNlbmRpZmAsRng9YCNpZmRlZiBVU0VfQUxQSEFNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwOwojZW5kaWZgLE94PWAjaWZkZWYgVVNFX0FMUEhBVEVTVAoJaWYgKCBkaWZmdXNlQ29sb3IuYSA8IGFscGhhVGVzdCApIGRpc2NhcmQ7CiNlbmRpZmAsQng9YCNpZmRlZiBVU0VfQUxQSEFURVNUCgl1bmlmb3JtIGZsb2F0IGFscGhhVGVzdDsKI2VuZGlmYCx6eD1gI2lmZGVmIFVTRV9BT01BUAoJZmxvYXQgYW1iaWVudE9jY2x1c2lvbiA9ICggdGV4dHVyZTJEKCBhb01hcCwgdkFvTWFwVXYgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBhbWJpZW50T2NjbHVzaW9uOwoJI2lmIGRlZmluZWQoIFVTRV9DTEVBUkNPQVQgKSAKCQljbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0ICo9IGFtYmllbnRPY2NsdXNpb247CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKSAKCQlzaGVlblNwZWN1bGFySW5kaXJlY3QgKj0gYW1iaWVudE9jY2x1c2lvbjsKCSNlbmRpZgoJI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBTVEFOREFSRCApCgkJZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyICkgKTsKCQlyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICo9IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnJvdWdobmVzcyApOwoJI2VuZGlmCiNlbmRpZmAsa3g9YCNpZmRlZiBVU0VfQU9NQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGFvTWFwOwoJdW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTsKI2VuZGlmYCxHeD1gI2lmZGVmIFVTRV9CQVRDSElORwoJYXR0cmlidXRlIGZsb2F0IGJhdGNoSWQ7Cgl1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBiYXRjaGluZ1RleHR1cmU7CgltYXQ0IGdldEJhdGNoaW5nTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJhdGNoaW5nVGV4dHVyZSwgMCApLng7CgkJaW50IGogPSBpbnQoIGkgKSAqIDQ7CgkJaW50IHggPSBqICUgc2l6ZTsKCQlpbnQgeSA9IGogLyBzaXplOwoJCXZlYzQgdjEgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4LCB5ICksIDAgKTsKCQl2ZWM0IHYyID0gdGV4ZWxGZXRjaCggYmF0Y2hpbmdUZXh0dXJlLCBpdmVjMiggeCArIDEsIHkgKSwgMCApOwoJCXZlYzQgdjMgPSB0ZXhlbEZldGNoKCBiYXRjaGluZ1RleHR1cmUsIGl2ZWMyKCB4ICsgMiwgeSApLCAwICk7CgkJdmVjNCB2NCA9IHRleGVsRmV0Y2goIGJhdGNoaW5nVGV4dHVyZSwgaXZlYzIoIHggKyAzLCB5ICksIDAgKTsKCQlyZXR1cm4gbWF0NCggdjEsIHYyLCB2MywgdjQgKTsKCX0KI2VuZGlmYCxWeD1gI2lmZGVmIFVTRV9CQVRDSElORwoJbWF0NCBiYXRjaGluZ01hdHJpeCA9IGdldEJhdGNoaW5nTWF0cml4KCBiYXRjaElkICk7CiNlbmRpZmAsSHg9YHZlYzMgdHJhbnNmb3JtZWQgPSB2ZWMzKCBwb3NpdGlvbiApOwojaWZkZWYgVVNFX0FMUEhBSEFTSAoJdlBvc2l0aW9uID0gdmVjMyggcG9zaXRpb24gKTsKI2VuZGlmYCxXeD1gdmVjMyBvYmplY3ROb3JtYWwgPSB2ZWMzKCBub3JtYWwgKTsKI2lmZGVmIFVTRV9UQU5HRU5UCgl2ZWMzIG9iamVjdFRhbmdlbnQgPSB2ZWMzKCB0YW5nZW50Lnh5eiApOwojZW5kaWZgLFh4PWBmbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkgewoJcmV0dXJuIDAuMjU7Cn0KZmxvYXQgRF9CbGlublBob25nKCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkgewoJcmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7Cn0KdmVjMyBCUkRGX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzICkgewoJdmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTsKCWZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTsKCWZsb2F0IGRvdFZIID0gc2F0dXJhdGUoIGRvdCggdmlld0RpciwgaGFsZkRpciApICk7Cgl2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIDEuMCwgZG90VkggKTsKCWZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICk7CglmbG9hdCBEID0gRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7CglyZXR1cm4gRiAqICggRyAqIEQgKTsKfSAvLyB2YWxpZGF0ZWRgLHF4PWAjaWZkZWYgVVNFX0lSSURFU0NFTkNFCgljb25zdCBtYXQzIFhZWl9UT19SRUM3MDkgPSBtYXQzKAoJCSAzLjI0MDQ1NDIsIC0wLjk2OTI2NjAsICAwLjA1NTY0MzQsCgkJLTEuNTM3MTM4NSwgIDEuODc2MDEwOCwgLTAuMjA0MDI1OSwKCQktMC40OTg1MzE0LCAgMC4wNDE1NTYwLCAgMS4wNTcyMjUyCgkpOwoJdmVjMyBGcmVzbmVsMFRvSW9yKCB2ZWMzIGZyZXNuZWwwICkgewoJCXZlYzMgc3FydEYwID0gc3FydCggZnJlc25lbDAgKTsKCQlyZXR1cm4gKCB2ZWMzKCAxLjAgKSArIHNxcnRGMCApIC8gKCB2ZWMzKCAxLjAgKSAtIHNxcnRGMCApOwoJfQoJdmVjMyBJb3JUb0ZyZXNuZWwwKCB2ZWMzIHRyYW5zbWl0dGVkSW9yLCBmbG9hdCBpbmNpZGVudElvciApIHsKCQlyZXR1cm4gcG93MiggKCB0cmFuc21pdHRlZElvciAtIHZlYzMoIGluY2lkZW50SW9yICkgKSAvICggdHJhbnNtaXR0ZWRJb3IgKyB2ZWMzKCBpbmNpZGVudElvciApICkgKTsKCX0KCWZsb2F0IElvclRvRnJlc25lbDAoIGZsb2F0IHRyYW5zbWl0dGVkSW9yLCBmbG9hdCBpbmNpZGVudElvciApIHsKCQlyZXR1cm4gcG93MiggKCB0cmFuc21pdHRlZElvciAtIGluY2lkZW50SW9yICkgLyAoIHRyYW5zbWl0dGVkSW9yICsgaW5jaWRlbnRJb3IgKSk7Cgl9Cgl2ZWMzIGV2YWxTZW5zaXRpdml0eSggZmxvYXQgT1BELCB2ZWMzIHNoaWZ0ICkgewoJCWZsb2F0IHBoYXNlID0gMi4wICogUEkgKiBPUEQgKiAxLjBlLTk7CgkJdmVjMyB2YWwgPSB2ZWMzKCA1LjQ4NTZlLTEzLCA0LjQyMDFlLTEzLCA1LjI0ODFlLTEzICk7CgkJdmVjMyBwb3MgPSB2ZWMzKCAxLjY4MTBlKzA2LCAxLjc5NTNlKzA2LCAyLjIwODRlKzA2ICk7CgkJdmVjMyB2YXIgPSB2ZWMzKCA0LjMyNzhlKzA5LCA5LjMwNDZlKzA5LCA2LjYxMjFlKzA5ICk7CgkJdmVjMyB4eXogPSB2YWwgKiBzcXJ0KCAyLjAgKiBQSSAqIHZhciApICogY29zKCBwb3MgKiBwaGFzZSArIHNoaWZ0ICkgKiBleHAoIC0gcG93MiggcGhhc2UgKSAqIHZhciApOwoJCXh5ei54ICs9IDkuNzQ3MGUtMTQgKiBzcXJ0KCAyLjAgKiBQSSAqIDQuNTI4MmUrMDkgKSAqIGNvcyggMi4yMzk5ZSswNiAqIHBoYXNlICsgc2hpZnRbIDAgXSApICogZXhwKCAtIDQuNTI4MmUrMDkgKiBwb3cyKCBwaGFzZSApICk7CgkJeHl6IC89IDEuMDY4NWUtNzsKCQl2ZWMzIHJnYiA9IFhZWl9UT19SRUM3MDkgKiB4eXo7CgkJcmV0dXJuIHJnYjsKCX0KCXZlYzMgZXZhbElyaWRlc2NlbmNlKCBmbG9hdCBvdXRzaWRlSU9SLCBmbG9hdCBldGEyLCBmbG9hdCBjb3NUaGV0YTEsIGZsb2F0IHRoaW5GaWxtVGhpY2tuZXNzLCB2ZWMzIGJhc2VGMCApIHsKCQl2ZWMzIEk7CgkJZmxvYXQgaXJpZGVzY2VuY2VJT1IgPSBtaXgoIG91dHNpZGVJT1IsIGV0YTIsIHNtb290aHN0ZXAoIDAuMCwgMC4wMywgdGhpbkZpbG1UaGlja25lc3MgKSApOwoJCWZsb2F0IHNpblRoZXRhMlNxID0gcG93Miggb3V0c2lkZUlPUiAvIGlyaWRlc2NlbmNlSU9SICkgKiAoIDEuMCAtIHBvdzIoIGNvc1RoZXRhMSApICk7CgkJZmxvYXQgY29zVGhldGEyU3EgPSAxLjAgLSBzaW5UaGV0YTJTcTsKCQlpZiAoIGNvc1RoZXRhMlNxIDwgMC4wICkgewoJCQlyZXR1cm4gdmVjMyggMS4wICk7CgkJfQoJCWZsb2F0IGNvc1RoZXRhMiA9IHNxcnQoIGNvc1RoZXRhMlNxICk7CgkJZmxvYXQgUjAgPSBJb3JUb0ZyZXNuZWwwKCBpcmlkZXNjZW5jZUlPUiwgb3V0c2lkZUlPUiApOwoJCWZsb2F0IFIxMiA9IEZfU2NobGljayggUjAsIDEuMCwgY29zVGhldGExICk7CgkJZmxvYXQgVDEyMSA9IDEuMCAtIFIxMjsKCQlmbG9hdCBwaGkxMiA9IDAuMDsKCQlpZiAoIGlyaWRlc2NlbmNlSU9SIDwgb3V0c2lkZUlPUiApIHBoaTEyID0gUEk7CgkJZmxvYXQgcGhpMjEgPSBQSSAtIHBoaTEyOwoJCXZlYzMgYmFzZUlPUiA9IEZyZXNuZWwwVG9Jb3IoIGNsYW1wKCBiYXNlRjAsIDAuMCwgMC45OTk5ICkgKTsJCXZlYzMgUjEgPSBJb3JUb0ZyZXNuZWwwKCBiYXNlSU9SLCBpcmlkZXNjZW5jZUlPUiApOwoJCXZlYzMgUjIzID0gRl9TY2hsaWNrKCBSMSwgMS4wLCBjb3NUaGV0YTIgKTsKCQl2ZWMzIHBoaTIzID0gdmVjMyggMC4wICk7CgkJaWYgKCBiYXNlSU9SWyAwIF0gPCBpcmlkZXNjZW5jZUlPUiApIHBoaTIzWyAwIF0gPSBQSTsKCQlpZiAoIGJhc2VJT1JbIDEgXSA8IGlyaWRlc2NlbmNlSU9SICkgcGhpMjNbIDEgXSA9IFBJOwoJCWlmICggYmFzZUlPUlsgMiBdIDwgaXJpZGVzY2VuY2VJT1IgKSBwaGkyM1sgMiBdID0gUEk7CgkJZmxvYXQgT1BEID0gMi4wICogaXJpZGVzY2VuY2VJT1IgKiB0aGluRmlsbVRoaWNrbmVzcyAqIGNvc1RoZXRhMjsKCQl2ZWMzIHBoaSA9IHZlYzMoIHBoaTIxICkgKyBwaGkyMzsKCQl2ZWMzIFIxMjMgPSBjbGFtcCggUjEyICogUjIzLCAxZS01LCAwLjk5OTkgKTsKCQl2ZWMzIHIxMjMgPSBzcXJ0KCBSMTIzICk7CgkJdmVjMyBScyA9IHBvdzIoIFQxMjEgKSAqIFIyMyAvICggdmVjMyggMS4wICkgLSBSMTIzICk7CgkJdmVjMyBDMCA9IFIxMiArIFJzOwoJCUkgPSBDMDsKCQl2ZWMzIENtID0gUnMgLSBUMTIxOwoJCWZvciAoIGludCBtID0gMTsgbSA8PSAyOyArKyBtICkgewoJCQlDbSAqPSByMTIzOwoJCQl2ZWMzIFNtID0gMi4wICogZXZhbFNlbnNpdGl2aXR5KCBmbG9hdCggbSApICogT1BELCBmbG9hdCggbSApICogcGhpICk7CgkJCUkgKz0gQ20gKiBTbTsKCQl9CgkJcmV0dXJuIG1heCggSSwgdmVjMyggMC4wICkgKTsKCX0KI2VuZGlmYCwkeD1gI2lmZGVmIFVTRV9CVU1QTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwOwoJdW5pZm9ybSBmbG9hdCBidW1wU2NhbGU7Cgl2ZWMyIGRIZHh5X2Z3ZCgpIHsKCQl2ZWMyIGRTVGR4ID0gZEZkeCggdkJ1bXBNYXBVdiApOwoJCXZlYzIgZFNUZHkgPSBkRmR5KCB2QnVtcE1hcFV2ICk7CgkJZmxvYXQgSGxsID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2QnVtcE1hcFV2ICkueDsKCQlmbG9hdCBkQnggPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZCdW1wTWFwVXYgKyBkU1RkeCApLnggLSBIbGw7CgkJZmxvYXQgZEJ5ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2QnVtcE1hcFV2ICsgZFNUZHkgKS54IC0gSGxsOwoJCXJldHVybiB2ZWMyKCBkQngsIGRCeSApOwoJfQoJdmVjMyBwZXJ0dXJiTm9ybWFsQXJiKCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSwgZmxvYXQgZmFjZURpcmVjdGlvbiApIHsKCQl2ZWMzIHZTaWdtYVggPSBub3JtYWxpemUoIGRGZHgoIHN1cmZfcG9zLnh5eiApICk7CgkJdmVjMyB2U2lnbWFZID0gbm9ybWFsaXplKCBkRmR5KCBzdXJmX3Bvcy54eXogKSApOwoJCXZlYzMgdk4gPSBzdXJmX25vcm07CgkJdmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApOwoJCXZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTsKCQlmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApICogZmFjZURpcmVjdGlvbjsKCQl2ZWMzIHZHcmFkID0gc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTsKCQlyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7Cgl9CiNlbmRpZmAsWXg9YCNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMAoJdmVjNCBwbGFuZTsKCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCWZvciAoIGludCBpID0gMDsgaSA8IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHsKCQlwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07CgkJaWYgKCBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApIGRpc2NhcmQ7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVMKCQlib29sIGNsaXBwZWQgPSB0cnVlOwoJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQlmb3IgKCBpbnQgaSA9IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSA8IE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7CgkJCXBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTsKCQkJY2xpcHBlZCA9ICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSAmJiBjbGlwcGVkOwoJCX0KCQkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJCWlmICggY2xpcHBlZCApIGRpc2NhcmQ7CgkjZW5kaWYKI2VuZGlmYCxaeD1gI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwCgl2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjsKCXVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdOwojZW5kaWZgLEp4PWAjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAKCXZhcnlpbmcgdmVjMyB2Q2xpcFBvc2l0aW9uOwojZW5kaWZgLEt4PWAjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAKCXZDbGlwUG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwojZW5kaWZgLFF4PWAjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCWRpZmZ1c2VDb2xvciAqPSB2Q29sb3I7CiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApCglkaWZmdXNlQ29sb3IucmdiICo9IHZDb2xvcjsKI2VuZGlmYCxqeD1gI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCgl2YXJ5aW5nIHZlYzQgdkNvbG9yOwojZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKQoJdmFyeWluZyB2ZWMzIHZDb2xvcjsKI2VuZGlmYCxleT1gI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCgl2YXJ5aW5nIHZlYzQgdkNvbG9yOwojZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApCgl2YXJ5aW5nIHZlYzMgdkNvbG9yOwojZW5kaWZgLHR5PWAjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkKCXZDb2xvciA9IHZlYzQoIDEuMCApOwojZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApCgl2Q29sb3IgPSB2ZWMzKCAxLjAgKTsKI2VuZGlmCiNpZmRlZiBVU0VfQ09MT1IKCXZDb2xvciAqPSBjb2xvcjsKI2VuZGlmCiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUgoJdkNvbG9yLnh5eiAqPSBpbnN0YW5jZUNvbG9yLnh5ejsKI2VuZGlmYCxueT1gI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5MwojZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE3OTU4NgojZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ4OTY2CiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4Mzc5MDcKI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0MzA5MTg5NTM1CiNkZWZpbmUgRVBTSUxPTiAxZS02CiNpZm5kZWYgc2F0dXJhdGUKI2RlZmluZSBzYXR1cmF0ZSggYSApIGNsYW1wKCBhLCAwLjAsIDEuMCApCiNlbmRpZgojZGVmaW5lIHdoaXRlQ29tcGxlbWVudCggYSApICggMS4wIC0gc2F0dXJhdGUoIGEgKSApCmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH0KdmVjMyBwb3cyKCBjb25zdCBpbiB2ZWMzIHggKSB7IHJldHVybiB4Kng7IH0KZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9CmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyID0geCp4OyByZXR1cm4geDIqeDI7IH0KZmxvYXQgbWF4MyggY29uc3QgaW4gdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9CmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgdiApIHsgcmV0dXJuIGRvdCggdiwgdmVjMyggMC4zMzMzMzMzICkgKTsgfQpoaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkgewoJY29uc3QgaGlnaHAgZmxvYXQgYSA9IDEyLjk4OTgsIGIgPSA3OC4yMzMsIGMgPSA0Mzc1OC41NDUzOwoJaGlnaHAgZmxvYXQgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLGIgKSApLCBzbiA9IG1vZCggZHQsIFBJICk7CglyZXR1cm4gZnJhY3QoIHNpbiggc24gKSAqIGMgKTsKfQojaWZkZWYgSElHSF9QUkVDSVNJT04KCWZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHsgcmV0dXJuIGxlbmd0aCggdiApOyB9CiNlbHNlCglmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7CgkJZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4MyggYWJzKCB2ICkgKTsKCQlyZXR1cm4gbGVuZ3RoKCB2IC8gbWF4Q29tcG9uZW50ICkgKiBtYXhDb21wb25lbnQ7Cgl9CiNlbmRpZgpzdHJ1Y3QgSW5jaWRlbnRMaWdodCB7Cgl2ZWMzIGNvbG9yOwoJdmVjMyBkaXJlY3Rpb247Cglib29sIHZpc2libGU7Cn07CnN0cnVjdCBSZWZsZWN0ZWRMaWdodCB7Cgl2ZWMzIGRpcmVjdERpZmZ1c2U7Cgl2ZWMzIGRpcmVjdFNwZWN1bGFyOwoJdmVjMyBpbmRpcmVjdERpZmZ1c2U7Cgl2ZWMzIGluZGlyZWN0U3BlY3VsYXI7Cn07CiNpZmRlZiBVU0VfQUxQSEFIQVNICgl2YXJ5aW5nIHZlYzMgdlBvc2l0aW9uOwojZW5kaWYKdmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHsKCXJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApOwp9CnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkgewoJcmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7Cn0KbWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7CgltYXQzIHRtcDsKCXRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApOwoJdG1wWyAxIF0gPSB2ZWMzKCBtWyAwIF0ueSwgbVsgMSBdLnksIG1bIDIgXS55ICk7Cgl0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTsKCXJldHVybiB0bXA7Cn0KZmxvYXQgbHVtaW5hbmNlKCBjb25zdCBpbiB2ZWMzIHJnYiApIHsKCWNvbnN0IHZlYzMgd2VpZ2h0cyA9IHZlYzMoIDAuMjEyNjcyOSwgMC43MTUxNTIyLCAwLjA3MjE3NTAgKTsKCXJldHVybiBkb3QoIHdlaWdodHMsIHJnYiApOwp9CmJvb2wgaXNQZXJzcGVjdGl2ZU1hdHJpeCggbWF0NCBtICkgewoJcmV0dXJuIG1bIDIgXVsgMyBdID09IC0gMS4wOwp9CnZlYzIgZXF1aXJlY3RVdiggaW4gdmVjMyBkaXIgKSB7CglmbG9hdCB1ID0gYXRhbiggZGlyLnosIGRpci54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTsKCWZsb2F0IHYgPSBhc2luKCBjbGFtcCggZGlyLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTsKCXJldHVybiB2ZWMyKCB1LCB2ICk7Cn0KdmVjMyBCUkRGX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkgewoJcmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBkaWZmdXNlQ29sb3I7Cn0KdmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgZjAsIGNvbnN0IGluIGZsb2F0IGY5MCwgY29uc3QgaW4gZmxvYXQgZG90VkggKSB7CglmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtIDUuNTU0NzMgKiBkb3RWSCAtIDYuOTgzMTYgKSAqIGRvdFZIICk7CglyZXR1cm4gZjAgKiAoIDEuMCAtIGZyZXNuZWwgKSArICggZjkwICogZnJlc25lbCApOwp9CmZsb2F0IEZfU2NobGljayggY29uc3QgaW4gZmxvYXQgZjAsIGNvbnN0IGluIGZsb2F0IGY5MCwgY29uc3QgaW4gZmxvYXQgZG90VkggKSB7CglmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtIDUuNTU0NzMgKiBkb3RWSCAtIDYuOTgzMTYgKSAqIGRvdFZIICk7CglyZXR1cm4gZjAgKiAoIDEuMCAtIGZyZXNuZWwgKSArICggZjkwICogZnJlc25lbCApOwp9IC8vIHZhbGlkYXRlZGAsaXk9YCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWCgkjZGVmaW5lIGN1YmVVVl9taW5NaXBMZXZlbCA0LjAKCSNkZWZpbmUgY3ViZVVWX21pblRpbGVTaXplIDE2LjAKCWZsb2F0IGdldEZhY2UoIHZlYzMgZGlyZWN0aW9uICkgewoJCXZlYzMgYWJzRGlyZWN0aW9uID0gYWJzKCBkaXJlY3Rpb24gKTsKCQlmbG9hdCBmYWNlID0gLSAxLjA7CgkJaWYgKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi56ICkgewoJCQlpZiAoIGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnkgKQoJCQkJZmFjZSA9IGRpcmVjdGlvbi54ID4gMC4wID8gMC4wIDogMy4wOwoJCQllbHNlCgkJCQlmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxLjAgOiA0LjA7CgkJfSBlbHNlIHsKCQkJaWYgKCBhYnNEaXJlY3Rpb24ueiA+IGFic0RpcmVjdGlvbi55ICkKCQkJCWZhY2UgPSBkaXJlY3Rpb24ueiA+IDAuMCA/IDIuMCA6IDUuMDsKCQkJZWxzZQoJCQkJZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wOwoJCX0KCQlyZXR1cm4gZmFjZTsKCX0KCXZlYzIgZ2V0VVYoIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBmYWNlICkgewoJCXZlYzIgdXY7CgkJaWYgKCBmYWNlID09IDAuMCApIHsKCQkJdXYgPSB2ZWMyKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnggKTsKCQl9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHsKCQkJdXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCAtIGRpcmVjdGlvbi56ICkgLyBhYnMoIGRpcmVjdGlvbi55ICk7CgkJfSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7CgkJCXV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTsKCQl9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHsKCQkJdXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApOwoJCX0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkgewoJCQl1diA9IHZlYzIoIC0gZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56ICkgLyBhYnMoIGRpcmVjdGlvbi55ICk7CgkJfSBlbHNlIHsKCQkJdXYgPSB2ZWMyKCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTsKCQl9CgkJcmV0dXJuIDAuNSAqICggdXYgKyAxLjAgKTsKCX0KCXZlYzMgYmlsaW5lYXJDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBtaXBJbnQgKSB7CgkJZmxvYXQgZmFjZSA9IGdldEZhY2UoIGRpcmVjdGlvbiApOwoJCWZsb2F0IGZpbHRlckludCA9IG1heCggY3ViZVVWX21pbk1pcExldmVsIC0gbWlwSW50LCAwLjAgKTsKCQltaXBJbnQgPSBtYXgoIG1pcEludCwgY3ViZVVWX21pbk1pcExldmVsICk7CgkJZmxvYXQgZmFjZVNpemUgPSBleHAyKCBtaXBJbnQgKTsKCQloaWdocCB2ZWMyIHV2ID0gZ2V0VVYoIGRpcmVjdGlvbiwgZmFjZSApICogKCBmYWNlU2l6ZSAtIDIuMCApICsgMS4wOwoJCWlmICggZmFjZSA+IDIuMCApIHsKCQkJdXYueSArPSBmYWNlU2l6ZTsKCQkJZmFjZSAtPSAzLjA7CgkJfQoJCXV2LnggKz0gZmFjZSAqIGZhY2VTaXplOwoJCXV2LnggKz0gZmlsdGVySW50ICogMy4wICogY3ViZVVWX21pblRpbGVTaXplOwoJCXV2LnkgKz0gNC4wICogKCBleHAyKCBDVUJFVVZfTUFYX01JUCApIC0gZmFjZVNpemUgKTsKCQl1di54ICo9IENVQkVVVl9URVhFTF9XSURUSDsKCQl1di55ICo9IENVQkVVVl9URVhFTF9IRUlHSFQ7CgkJI2lmZGVmIHRleHR1cmUyREdyYWRFWFQKCQkJcmV0dXJuIHRleHR1cmUyREdyYWRFWFQoIGVudk1hcCwgdXYsIHZlYzIoIDAuMCApLCB2ZWMyKCAwLjAgKSApLnJnYjsKCQkjZWxzZQoJCQlyZXR1cm4gdGV4dHVyZTJEKCBlbnZNYXAsIHV2ICkucmdiOwoJCSNlbmRpZgoJfQoJI2RlZmluZSBjdWJlVVZfcjAgMS4wCgkjZGVmaW5lIGN1YmVVVl92MCAwLjMzOQoJI2RlZmluZSBjdWJlVVZfbTAgLSAyLjAKCSNkZWZpbmUgY3ViZVVWX3IxIDAuOAoJI2RlZmluZSBjdWJlVVZfdjEgMC4yNzYKCSNkZWZpbmUgY3ViZVVWX20xIC0gMS4wCgkjZGVmaW5lIGN1YmVVVl9yNCAwLjQKCSNkZWZpbmUgY3ViZVVWX3Y0IDAuMDQ2CgkjZGVmaW5lIGN1YmVVVl9tNCAyLjAKCSNkZWZpbmUgY3ViZVVWX3I1IDAuMzA1CgkjZGVmaW5lIGN1YmVVVl92NSAwLjAxNgoJI2RlZmluZSBjdWJlVVZfbTUgMy4wCgkjZGVmaW5lIGN1YmVVVl9yNiAwLjIxCgkjZGVmaW5lIGN1YmVVVl92NiAwLjAwMzgKCSNkZWZpbmUgY3ViZVVWX202IDQuMAoJZmxvYXQgcm91Z2huZXNzVG9NaXAoIGZsb2F0IHJvdWdobmVzcyApIHsKCQlmbG9hdCBtaXAgPSAwLjA7CgkJaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3IxICkgewoJCQltaXAgPSAoIGN1YmVVVl9yMCAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTEgLSBjdWJlVVZfbTAgKSAvICggY3ViZVVWX3IwIC0gY3ViZVVWX3IxICkgKyBjdWJlVVZfbTA7CgkJfSBlbHNlIGlmICggcm91Z2huZXNzID49IGN1YmVVVl9yNCApIHsKCQkJbWlwID0gKCBjdWJlVVZfcjEgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX200IC0gY3ViZVVWX20xICkgLyAoIGN1YmVVVl9yMSAtIGN1YmVVVl9yNCApICsgY3ViZVVWX20xOwoJCX0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSBjdWJlVVZfcjUgKSB7CgkJCW1pcCA9ICggY3ViZVVWX3I0IC0gcm91Z2huZXNzICkgKiAoIGN1YmVVVl9tNSAtIGN1YmVVVl9tNCApIC8gKCBjdWJlVVZfcjQgLSBjdWJlVVZfcjUgKSArIGN1YmVVVl9tNDsKCQl9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3I2ICkgewoJCQltaXAgPSAoIGN1YmVVVl9yNSAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTYgLSBjdWJlVVZfbTUgKSAvICggY3ViZVVWX3I1IC0gY3ViZVVWX3I2ICkgKyBjdWJlVVZfbTU7CgkJfSBlbHNlIHsKCQkJbWlwID0gLSAyLjAgKiBsb2cyKCAxLjE2ICogcm91Z2huZXNzICk7CQl9CgkJcmV0dXJuIG1pcDsKCX0KCXZlYzQgdGV4dHVyZUN1YmVVViggc2FtcGxlcjJEIGVudk1hcCwgdmVjMyBzYW1wbGVEaXIsIGZsb2F0IHJvdWdobmVzcyApIHsKCQlmbG9hdCBtaXAgPSBjbGFtcCggcm91Z2huZXNzVG9NaXAoIHJvdWdobmVzcyApLCBjdWJlVVZfbTAsIENVQkVVVl9NQVhfTUlQICk7CgkJZmxvYXQgbWlwRiA9IGZyYWN0KCBtaXAgKTsKCQlmbG9hdCBtaXBJbnQgPSBmbG9vciggbWlwICk7CgkJdmVjMyBjb2xvcjAgPSBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXIsIG1pcEludCApOwoJCWlmICggbWlwRiA9PSAwLjAgKSB7CgkJCXJldHVybiB2ZWM0KCBjb2xvcjAsIDEuMCApOwoJCX0gZWxzZSB7CgkJCXZlYzMgY29sb3IxID0gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyLCBtaXBJbnQgKyAxLjAgKTsKCQkJcmV0dXJuIHZlYzQoIG1peCggY29sb3IwLCBjb2xvcjEsIG1pcEYgKSwgMS4wICk7CgkJfQoJfQojZW5kaWZgLHJ5PWB2ZWMzIHRyYW5zZm9ybWVkTm9ybWFsID0gb2JqZWN0Tm9ybWFsOwojaWZkZWYgVVNFX1RBTkdFTlQKCXZlYzMgdHJhbnNmb3JtZWRUYW5nZW50ID0gb2JqZWN0VGFuZ2VudDsKI2VuZGlmCiNpZmRlZiBVU0VfQkFUQ0hJTkcKCW1hdDMgYm0gPSBtYXQzKCBiYXRjaGluZ01hdHJpeCApOwoJdHJhbnNmb3JtZWROb3JtYWwgLz0gdmVjMyggZG90KCBibVsgMCBdLCBibVsgMCBdICksIGRvdCggYm1bIDEgXSwgYm1bIDEgXSApLCBkb3QoIGJtWyAyIF0sIGJtWyAyIF0gKSApOwoJdHJhbnNmb3JtZWROb3JtYWwgPSBibSAqIHRyYW5zZm9ybWVkTm9ybWFsOwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJdHJhbnNmb3JtZWRUYW5nZW50ID0gYm0gKiB0cmFuc2Zvcm1lZFRhbmdlbnQ7CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfSU5TVEFOQ0lORwoJbWF0MyBpbSA9IG1hdDMoIGluc3RhbmNlTWF0cml4ICk7Cgl0cmFuc2Zvcm1lZE5vcm1hbCAvPSB2ZWMzKCBkb3QoIGltWyAwIF0sIGltWyAwIF0gKSwgZG90KCBpbVsgMSBdLCBpbVsgMSBdICksIGRvdCggaW1bIDIgXSwgaW1bIDIgXSApICk7Cgl0cmFuc2Zvcm1lZE5vcm1hbCA9IGltICogdHJhbnNmb3JtZWROb3JtYWw7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl0cmFuc2Zvcm1lZFRhbmdlbnQgPSBpbSAqIHRyYW5zZm9ybWVkVGFuZ2VudDsKCSNlbmRpZgojZW5kaWYKdHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWxNYXRyaXggKiB0cmFuc2Zvcm1lZE5vcm1hbDsKI2lmZGVmIEZMSVBfU0lERUQKCXRyYW5zZm9ybWVkTm9ybWFsID0gLSB0cmFuc2Zvcm1lZE5vcm1hbDsKI2VuZGlmCiNpZmRlZiBVU0VfVEFOR0VOVAoJdHJhbnNmb3JtZWRUYW5nZW50ID0gKCBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZFRhbmdlbnQsIDAuMCApICkueHl6OwoJI2lmZGVmIEZMSVBfU0lERUQKCQl0cmFuc2Zvcm1lZFRhbmdlbnQgPSAtIHRyYW5zZm9ybWVkVGFuZ2VudDsKCSNlbmRpZgojZW5kaWZgLHN5PWAjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwOwoJdW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTsKCXVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50QmlhczsKI2VuZGlmYCxheT1gI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCXRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB2RGlzcGxhY2VtZW50TWFwVXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7CiNlbmRpZmAsb3k9YCNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXZlYzQgZW1pc3NpdmVDb2xvciA9IHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZFbWlzc2l2ZU1hcFV2ICk7Cgl0b3RhbEVtaXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7CiNlbmRpZmAsbHk9YCNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGVtaXNzaXZlTWFwOwojZW5kaWZgLGN5PSJnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTsiLGh5PWAKY29uc3QgbWF0MyBMSU5FQVJfU1JHQl9UT19MSU5FQVJfRElTUExBWV9QMyA9IG1hdDMoCgl2ZWMzKCAwLjgyMjQ2MjEsIDAuMTc3NTM4LCAwLjAgKSwKCXZlYzMoIDAuMDMzMTk0MSwgMC45NjY4MDU4LCAwLjAgKSwKCXZlYzMoIDAuMDE3MDgyNywgMC4wNzIzOTc0LCAwLjkxMDUxOTkgKQopOwpjb25zdCBtYXQzIExJTkVBUl9ESVNQTEFZX1AzX1RPX0xJTkVBUl9TUkdCID0gbWF0MygKCXZlYzMoIDEuMjI0OTQwMSwgLSAwLjIyNDk0MDQsIDAuMCApLAoJdmVjMyggLSAwLjA0MjA1NjksIDEuMDQyMDU3MSwgMC4wICksCgl2ZWMzKCAtIDAuMDE5NjM3NiwgLSAwLjA3ODYzNjEsIDEuMDk4MjczNSApCik7CnZlYzQgTGluZWFyU1JHQlRvTGluZWFyRGlzcGxheVAzKCBpbiB2ZWM0IHZhbHVlICkgewoJcmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIExJTkVBUl9TUkdCX1RPX0xJTkVBUl9ESVNQTEFZX1AzLCB2YWx1ZS5hICk7Cn0KdmVjNCBMaW5lYXJEaXNwbGF5UDNUb0xpbmVhclNSR0IoIGluIHZlYzQgdmFsdWUgKSB7CglyZXR1cm4gdmVjNCggdmFsdWUucmdiICogTElORUFSX0RJU1BMQVlfUDNfVE9fTElORUFSX1NSR0IsIHZhbHVlLmEgKTsKfQp2ZWM0IExpbmVhclRyYW5zZmVyT0VURiggaW4gdmVjNCB2YWx1ZSApIHsKCXJldHVybiB2YWx1ZTsKfQp2ZWM0IHNSR0JUcmFuc2Zlck9FVEYoIGluIHZlYzQgdmFsdWUgKSB7CglyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMC40MTY2NiApICkgKiAxLjA1NSAtIHZlYzMoIDAuMDU1ICksIHZhbHVlLnJnYiAqIDEyLjkyLCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDAzMTMwOCApICkgKSApLCB2YWx1ZS5hICk7Cn0KdmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHsKCXJldHVybiB2YWx1ZTsKfQp2ZWM0IExpbmVhclRvc1JHQiggaW4gdmVjNCB2YWx1ZSApIHsKCXJldHVybiBzUkdCVHJhbnNmZXJPRVRGKCB2YWx1ZSApOwp9YCx1eT1gI2lmZGVmIFVTRV9FTlZNQVAKCSNpZmRlZiBFTlZfV09STERQT1MKCQl2ZWMzIGNhbWVyYVRvRnJhZzsKCQlpZiAoIGlzT3J0aG9ncmFwaGljICkgewoJCQljYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZlYzMoIC0gdmlld01hdHJpeFsgMCBdWyAyIF0sIC0gdmlld01hdHJpeFsgMSBdWyAyIF0sIC0gdmlld01hdHJpeFsgMiBdWyAyIF0gKSApOwoJCX0gZWxzZSB7CgkJCWNhbWVyYVRvRnJhZyA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gLSBjYW1lcmFQb3NpdGlvbiApOwoJCX0KCQl2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7CgkJI2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT04KCQkJdmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggY2FtZXJhVG9GcmFnLCB3b3JsZE5vcm1hbCApOwoJCSNlbHNlCgkJCXZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIGNhbWVyYVRvRnJhZywgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApOwoJCSNlbmRpZgoJI2Vsc2UKCQl2ZWMzIHJlZmxlY3RWZWMgPSB2UmVmbGVjdDsKCSNlbmRpZgoJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkUKCQl2ZWM0IGVudkNvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7CgkjZWxzZQoJCXZlYzQgZW52Q29sb3IgPSB2ZWM0KCAwLjAgKTsKCSNlbmRpZgoJI2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWQoJCW91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTsKCSNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKQoJCW91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApOwoJI2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX0FERCApCgkJb3V0Z29pbmdMaWdodCArPSBlbnZDb2xvci54eXogKiBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5OwoJI2VuZGlmCiNlbmRpZmAsZnk9YCNpZmRlZiBVU0VfRU5WTUFQCgl1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTsKCXVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDsKCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFCgkJdW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7CgkjZWxzZQoJCXVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDsKCSNlbmRpZgoJCiNlbmRpZmAsZHk9YCNpZmRlZiBVU0VfRU5WTUFQCgl1bmlmb3JtIGZsb2F0IHJlZmxlY3Rpdml0eTsKCSNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIExBTUJFUlQgKQoJCSNkZWZpbmUgRU5WX1dPUkxEUE9TCgkjZW5kaWYKCSNpZmRlZiBFTlZfV09STERQT1MKCQl2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CgkJdW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87CgkjZWxzZQoJCXZhcnlpbmcgdmVjMyB2UmVmbGVjdDsKCSNlbmRpZgojZW5kaWZgLHB5PWAjaWZkZWYgVVNFX0VOVk1BUAoJI2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgfHwgZGVmaW5lZCggTEFNQkVSVCApCgkJI2RlZmluZSBFTlZfV09STERQT1MKCSNlbmRpZgoJI2lmZGVmIEVOVl9XT1JMRFBPUwoJCQoJCXZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjsKCSNlbHNlCgkJdmFyeWluZyB2ZWMzIHZSZWZsZWN0OwoJCXVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvOwoJI2VuZGlmCiNlbmRpZmAsbXk9YCNpZmRlZiBVU0VfRU5WTUFQCgkjaWZkZWYgRU5WX1dPUkxEUE9TCgkJdldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejsKCSNlbHNlCgkJdmVjMyBjYW1lcmFUb1ZlcnRleDsKCQlpZiAoIGlzT3J0aG9ncmFwaGljICkgewoJCQljYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggdmVjMyggLSB2aWV3TWF0cml4WyAwIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAxIF1bIDIgXSwgLSB2aWV3TWF0cml4WyAyIF1bIDIgXSApICk7CgkJfSBlbHNlIHsKCQkJY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHdvcmxkUG9zaXRpb24ueHl6IC0gY2FtZXJhUG9zaXRpb24gKTsKCQl9CgkJdmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7CgkJI2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT04KCQkJdlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTsKCQkjZWxzZQoJCQl2UmVmbGVjdCA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7CgkJI2VuZGlmCgkjZW5kaWYKI2VuZGlmYCxneT1gI2lmZGVmIFVTRV9GT0cKCXZGb2dEZXB0aCA9IC0gbXZQb3NpdGlvbi56OwojZW5kaWZgLF95PWAjaWZkZWYgVVNFX0ZPRwoJdmFyeWluZyBmbG9hdCB2Rm9nRGVwdGg7CiNlbmRpZmAseHk9YCNpZmRlZiBVU0VfRk9HCgkjaWZkZWYgRk9HX0VYUDIKCQlmbG9hdCBmb2dGYWN0b3IgPSAxLjAgLSBleHAoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiB2Rm9nRGVwdGggKiB2Rm9nRGVwdGggKTsKCSNlbHNlCgkJZmxvYXQgZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCB2Rm9nRGVwdGggKTsKCSNlbmRpZgoJZ2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApOwojZW5kaWZgLHl5PWAjaWZkZWYgVVNFX0ZPRwoJdW5pZm9ybSB2ZWMzIGZvZ0NvbG9yOwoJdmFyeWluZyBmbG9hdCB2Rm9nRGVwdGg7CgkjaWZkZWYgRk9HX0VYUDIKCQl1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7CgkjZWxzZQoJCXVuaWZvcm0gZmxvYXQgZm9nTmVhcjsKCQl1bmlmb3JtIGZsb2F0IGZvZ0ZhcjsKCSNlbmRpZgojZW5kaWZgLHZ5PWAjaWZkZWYgVVNFX0dSQURJRU5UTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDsKI2VuZGlmCnZlYzMgZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHsKCWZsb2F0IGRvdE5MID0gZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7Cgl2ZWMyIGNvb3JkID0gdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApOwoJI2lmZGVmIFVTRV9HUkFESUVOVE1BUAoJCXJldHVybiB2ZWMzKCB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnIgKTsKCSNlbHNlCgkJdmVjMiBmdyA9IGZ3aWR0aCggY29vcmQgKSAqIDAuNTsKCQlyZXR1cm4gbWl4KCB2ZWMzKCAwLjcgKSwgdmVjMyggMS4wICksIHNtb290aHN0ZXAoIDAuNyAtIGZ3LngsIDAuNyArIGZ3LngsIGNvb3JkLnggKSApOwoJI2VuZGlmCn1gLE15PWAjaWZkZWYgVVNFX0xJR0hUTUFQCgl2ZWM0IGxpZ2h0TWFwVGV4ZWwgPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2TGlnaHRNYXBVdiApOwoJdmVjMyBsaWdodE1hcElycmFkaWFuY2UgPSBsaWdodE1hcFRleGVsLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5OwoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGxpZ2h0TWFwSXJyYWRpYW5jZTsKI2VuZGlmYCxTeT1gI2lmZGVmIFVTRV9MSUdIVE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgbGlnaHRNYXA7Cgl1bmlmb3JtIGZsb2F0IGxpZ2h0TWFwSW50ZW5zaXR5OwojZW5kaWZgLGJ5PWBMYW1iZXJ0TWF0ZXJpYWwgbWF0ZXJpYWw7Cm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7Cm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoO2Asd3k9YHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwpzdHJ1Y3QgTGFtYmVydE1hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwoJZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDsKfTsKdm9pZCBSRV9EaXJlY3RfTGFtYmVydCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gTGFtYmVydE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7Cgl2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yOwoJcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQp2b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9MYW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIExhbWJlcnRNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0KI2RlZmluZSBSRV9EaXJlY3QJCQkJUkVfRGlyZWN0X0xhbWJlcnQKI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2UJCVJFX0luZGlyZWN0RGlmZnVzZV9MYW1iZXJ0YCxFeT1gdW5pZm9ybSBib29sIHJlY2VpdmVTaGFkb3c7CnVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjsKI2lmIGRlZmluZWQoIFVTRV9MSUdIVF9QUk9CRVMgKQoJdW5pZm9ybSB2ZWMzIGxpZ2h0UHJvYmVbIDkgXTsKI2VuZGlmCnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7CglmbG9hdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56OwoJdmVjMyByZXN1bHQgPSBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDEgXSAqIDIuMCAqIDAuNTExNjY0ICogeTsKCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6OwoJcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7CglyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7CglyZXR1cm4gcmVzdWx0Owp9CnZlYzMgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgbGlnaHRQcm9iZVsgOSBdLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCXZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTsKCXZlYzMgaXJyYWRpYW5jZSA9IHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgbGlnaHRQcm9iZSApOwoJcmV0dXJuIGlycmFkaWFuY2U7Cn0KdmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkgewoJdmVjMyBpcnJhZGlhbmNlID0gYW1iaWVudExpZ2h0Q29sb3I7CglyZXR1cm4gaXJyYWRpYW5jZTsKfQpmbG9hdCBnZXREaXN0YW5jZUF0dGVudWF0aW9uKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHsKCSNpZiBkZWZpbmVkICggTEVHQUNZX0xJR0hUUyApCgkJaWYgKCBjdXRvZmZEaXN0YW5jZSA+IDAuMCAmJiBkZWNheUV4cG9uZW50ID4gMC4wICkgewoJCQlyZXR1cm4gcG93KCBzYXR1cmF0ZSggLSBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCApOwoJCX0KCQlyZXR1cm4gMS4wOwoJI2Vsc2UKCQlmbG9hdCBkaXN0YW5jZUZhbGxvZmYgPSAxLjAgLyBtYXgoIHBvdyggbGlnaHREaXN0YW5jZSwgZGVjYXlFeHBvbmVudCApLCAwLjAxICk7CgkJaWYgKCBjdXRvZmZEaXN0YW5jZSA+IDAuMCApIHsKCQkJZGlzdGFuY2VGYWxsb2ZmICo9IHBvdzIoIHNhdHVyYXRlKCAxLjAgLSBwb3c0KCBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKSApICk7CgkJfQoJCXJldHVybiBkaXN0YW5jZUZhbGxvZmY7CgkjZW5kaWYKfQpmbG9hdCBnZXRTcG90QXR0ZW51YXRpb24oIGNvbnN0IGluIGZsb2F0IGNvbmVDb3NpbmUsIGNvbnN0IGluIGZsb2F0IHBlbnVtYnJhQ29zaW5lLCBjb25zdCBpbiBmbG9hdCBhbmdsZUNvc2luZSApIHsKCXJldHVybiBzbW9vdGhzdGVwKCBjb25lQ29zaW5lLCBwZW51bWJyYUNvc2luZSwgYW5nbGVDb3NpbmUgKTsKfQojaWYgTlVNX0RJUl9MSUdIVFMgPiAwCglzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7CgkJdmVjMyBkaXJlY3Rpb247CgkJdmVjMyBjb2xvcjsKCX07Cgl1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07Cgl2b2lkIGdldERpcmVjdGlvbmFsTGlnaHRJbmZvKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQsIG91dCBJbmNpZGVudExpZ2h0IGxpZ2h0ICkgewoJCWxpZ2h0LmNvbG9yID0gZGlyZWN0aW9uYWxMaWdodC5jb2xvcjsKCQlsaWdodC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbjsKCQlsaWdodC52aXNpYmxlID0gdHJ1ZTsKCX0KI2VuZGlmCiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMAoJc3RydWN0IFBvaW50TGlnaHQgewoJCXZlYzMgcG9zaXRpb247CgkJdmVjMyBjb2xvcjsKCQlmbG9hdCBkaXN0YW5jZTsKCQlmbG9hdCBkZWNheTsKCX07Cgl1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTsKCXZvaWQgZ2V0UG9pbnRMaWdodEluZm8oIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBvdXQgSW5jaWRlbnRMaWdodCBsaWdodCApIHsKCQl2ZWMzIGxWZWN0b3IgPSBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnlQb3NpdGlvbjsKCQlsaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTsKCQlmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7CgkJbGlnaHQuY29sb3IgPSBwb2ludExpZ2h0LmNvbG9yOwoJCWxpZ2h0LmNvbG9yICo9IGdldERpc3RhbmNlQXR0ZW51YXRpb24oIGxpZ2h0RGlzdGFuY2UsIHBvaW50TGlnaHQuZGlzdGFuY2UsIHBvaW50TGlnaHQuZGVjYXkgKTsKCQlsaWdodC52aXNpYmxlID0gKCBsaWdodC5jb2xvciAhPSB2ZWMzKCAwLjAgKSApOwoJfQojZW5kaWYKI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDAKCXN0cnVjdCBTcG90TGlnaHQgewoJCXZlYzMgcG9zaXRpb247CgkJdmVjMyBkaXJlY3Rpb247CgkJdmVjMyBjb2xvcjsKCQlmbG9hdCBkaXN0YW5jZTsKCQlmbG9hdCBkZWNheTsKCQlmbG9hdCBjb25lQ29zOwoJCWZsb2F0IHBlbnVtYnJhQ29zOwoJfTsKCXVuaWZvcm0gU3BvdExpZ2h0IHNwb3RMaWdodHNbIE5VTV9TUE9UX0xJR0hUUyBdOwoJdm9pZCBnZXRTcG90TGlnaHRJbmZvKCBjb25zdCBpbiBTcG90TGlnaHQgc3BvdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIG91dCBJbmNpZGVudExpZ2h0IGxpZ2h0ICkgewoJCXZlYzMgbFZlY3RvciA9IHNwb3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5UG9zaXRpb247CgkJbGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7CgkJZmxvYXQgYW5nbGVDb3MgPSBkb3QoIGxpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApOwoJCWZsb2F0IHNwb3RBdHRlbnVhdGlvbiA9IGdldFNwb3RBdHRlbnVhdGlvbiggc3BvdExpZ2h0LmNvbmVDb3MsIHNwb3RMaWdodC5wZW51bWJyYUNvcywgYW5nbGVDb3MgKTsKCQlpZiAoIHNwb3RBdHRlbnVhdGlvbiA+IDAuMCApIHsKCQkJZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApOwoJCQlsaWdodC5jb2xvciA9IHNwb3RMaWdodC5jb2xvciAqIHNwb3RBdHRlbnVhdGlvbjsKCQkJbGlnaHQuY29sb3IgKj0gZ2V0RGlzdGFuY2VBdHRlbnVhdGlvbiggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTsKCQkJbGlnaHQudmlzaWJsZSA9ICggbGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTsKCQl9IGVsc2UgewoJCQlsaWdodC5jb2xvciA9IHZlYzMoIDAuMCApOwoJCQlsaWdodC52aXNpYmxlID0gZmFsc2U7CgkJfQoJfQojZW5kaWYKI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMAoJc3RydWN0IFJlY3RBcmVhTGlnaHQgewoJCXZlYzMgY29sb3I7CgkJdmVjMyBwb3NpdGlvbjsKCQl2ZWMzIGhhbGZXaWR0aDsKCQl2ZWMzIGhhbGZIZWlnaHQ7Cgl9OwoJdW5pZm9ybSBzYW1wbGVyMkQgbHRjXzE7CXVuaWZvcm0gc2FtcGxlcjJEIGx0Y18yOwoJdW5pZm9ybSBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHRzWyBOVU1fUkVDVF9BUkVBX0xJR0hUUyBdOwojZW5kaWYKI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDAKCXN0cnVjdCBIZW1pc3BoZXJlTGlnaHQgewoJCXZlYzMgZGlyZWN0aW9uOwoJCXZlYzMgc2t5Q29sb3I7CgkJdmVjMyBncm91bmRDb2xvcjsKCX07Cgl1bmlmb3JtIEhlbWlzcGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTsKCXZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7CgkJZmxvYXQgZG90TkwgPSBkb3QoIG5vcm1hbCwgaGVtaUxpZ2h0LmRpcmVjdGlvbiApOwoJCWZsb2F0IGhlbWlEaWZmdXNlV2VpZ2h0ID0gMC41ICogZG90TkwgKyAwLjU7CgkJdmVjMyBpcnJhZGlhbmNlID0gbWl4KCBoZW1pTGlnaHQuZ3JvdW5kQ29sb3IsIGhlbWlMaWdodC5za3lDb2xvciwgaGVtaURpZmZ1c2VXZWlnaHQgKTsKCQlyZXR1cm4gaXJyYWRpYW5jZTsKCX0KI2VuZGlmYCxBeT1gI2lmZGVmIFVTRV9FTlZNQVAKCXZlYzMgZ2V0SUJMSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7CgkJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVYKCQkJdmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApOwoJCQl2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCB3b3JsZE5vcm1hbCwgMS4wICk7CgkJCXJldHVybiBQSSAqIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTsKCQkjZWxzZQoJCQlyZXR1cm4gdmVjMyggMC4wICk7CgkJI2VuZGlmCgl9Cgl2ZWMzIGdldElCTFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7CgkJI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVYKCQkJdmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggLSB2aWV3RGlyLCBub3JtYWwgKTsKCQkJcmVmbGVjdFZlYyA9IG5vcm1hbGl6ZSggbWl4KCByZWZsZWN0VmVjLCBub3JtYWwsIHJvdWdobmVzcyAqIHJvdWdobmVzcykgKTsKCQkJcmVmbGVjdFZlYyA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTsKCQkJdmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgcmVmbGVjdFZlYywgcm91Z2huZXNzICk7CgkJCXJldHVybiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7CgkJI2Vsc2UKCQkJcmV0dXJuIHZlYzMoIDAuMCApOwoJCSNlbmRpZgoJfQoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJdmVjMyBnZXRJQkxBbmlzb3Ryb3B5UmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBiaXRhbmdlbnQsIGNvbnN0IGluIGZsb2F0IGFuaXNvdHJvcHkgKSB7CgkJCSNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWCgkJCQl2ZWMzIGJlbnROb3JtYWwgPSBjcm9zcyggYml0YW5nZW50LCB2aWV3RGlyICk7CgkJCQliZW50Tm9ybWFsID0gbm9ybWFsaXplKCBjcm9zcyggYmVudE5vcm1hbCwgYml0YW5nZW50ICkgKTsKCQkJCWJlbnROb3JtYWwgPSBub3JtYWxpemUoIG1peCggYmVudE5vcm1hbCwgbm9ybWFsLCBwb3cyKCBwb3cyKCAxLjAgLSBhbmlzb3Ryb3B5ICogKCAxLjAgLSByb3VnaG5lc3MgKSApICkgKSApOwoJCQkJcmV0dXJuIGdldElCTFJhZGlhbmNlKCB2aWV3RGlyLCBiZW50Tm9ybWFsLCByb3VnaG5lc3MgKTsKCQkJI2Vsc2UKCQkJCXJldHVybiB2ZWMzKCAwLjAgKTsKCQkJI2VuZGlmCgkJfQoJI2VuZGlmCiNlbmRpZmAsVHk9YFRvb25NYXRlcmlhbCBtYXRlcmlhbDsKbWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjtgLEN5PWB2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKc3RydWN0IFRvb25NYXRlcmlhbCB7Cgl2ZWMzIGRpZmZ1c2VDb2xvcjsKfTsKdm9pZCBSRV9EaXJlY3RfVG9vbiggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXZlYzMgaXJyYWRpYW5jZSA9IGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICogZGlyZWN0TGlnaHQuY29sb3I7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwp9CnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1Rvb24oIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQojZGVmaW5lIFJFX0RpcmVjdAkJCQlSRV9EaXJlY3RfVG9vbgojZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZQkJUkVfSW5kaXJlY3REaWZmdXNlX1Rvb25gLFJ5PWBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7Cm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7Cm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjsKbWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgPSBzaGluaW5lc3M7Cm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoO2AsUHk9YHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwpzdHJ1Y3QgQmxpbm5QaG9uZ01hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwoJdmVjMyBzcGVjdWxhckNvbG9yOwoJZmxvYXQgc3BlY3VsYXJTaGluaW5lc3M7CglmbG9hdCBzcGVjdWxhclN0cmVuZ3RoOwp9Owp2b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkgewoJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeU5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7CglyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApOwoJcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDsKfQp2b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlQb3NpdGlvbiwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeU5vcm1hbCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVZpZXdEaXIsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7Cn0KI2RlZmluZSBSRV9EaXJlY3QJCQkJUkVfRGlyZWN0X0JsaW5uUGhvbmcKI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2UJCVJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nYCxMeT1gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDsKbWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7CnZlYzMgZHh5ID0gbWF4KCBhYnMoIGRGZHgoIG5vblBlcnR1cmJlZE5vcm1hbCApICksIGFicyggZEZkeSggbm9uUGVydHVyYmVkTm9ybWFsICkgKSApOwpmbG9hdCBnZW9tZXRyeVJvdWdobmVzcyA9IG1heCggbWF4KCBkeHkueCwgZHh5LnkgKSwgZHh5LnogKTsKbWF0ZXJpYWwucm91Z2huZXNzID0gbWF4KCByb3VnaG5lc3NGYWN0b3IsIDAuMDUyNSApO21hdGVyaWFsLnJvdWdobmVzcyArPSBnZW9tZXRyeVJvdWdobmVzczsKbWF0ZXJpYWwucm91Z2huZXNzID0gbWluKCBtYXRlcmlhbC5yb3VnaG5lc3MsIDEuMCApOwojaWZkZWYgSU9SCgltYXRlcmlhbC5pb3IgPSBpb3I7CgkjaWZkZWYgVVNFX1NQRUNVTEFSCgkJZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgPSBzcGVjdWxhckludGVuc2l0eTsKCQl2ZWMzIHNwZWN1bGFyQ29sb3JGYWN0b3IgPSBzcGVjdWxhckNvbG9yOwoJCSNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCQkJc3BlY3VsYXJDb2xvckZhY3RvciAqPSB0ZXh0dXJlMkQoIHNwZWN1bGFyQ29sb3JNYXAsIHZTcGVjdWxhckNvbG9yTWFwVXYgKS5yZ2I7CgkJI2VuZGlmCgkJI2lmZGVmIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAKCQkJc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgKj0gdGV4dHVyZTJEKCBzcGVjdWxhckludGVuc2l0eU1hcCwgdlNwZWN1bGFySW50ZW5zaXR5TWFwVXYgKS5hOwoJCSNlbmRpZgoJCW1hdGVyaWFsLnNwZWN1bGFyRjkwID0gbWl4KCBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgMS4wLCBtZXRhbG5lc3NGYWN0b3IgKTsKCSNlbHNlCgkJZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgPSAxLjA7CgkJdmVjMyBzcGVjdWxhckNvbG9yRmFjdG9yID0gdmVjMyggMS4wICk7CgkJbWF0ZXJpYWwuc3BlY3VsYXJGOTAgPSAxLjA7CgkjZW5kaWYKCW1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIG1pbiggcG93MiggKCBtYXRlcmlhbC5pb3IgLSAxLjAgKSAvICggbWF0ZXJpYWwuaW9yICsgMS4wICkgKSAqIHNwZWN1bGFyQ29sb3JGYWN0b3IsIHZlYzMoIDEuMCApICkgKiBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7CiNlbHNlCgltYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCAwLjA0ICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApOwoJbWF0ZXJpYWwuc3BlY3VsYXJGOTAgPSAxLjA7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJbWF0ZXJpYWwuY2xlYXJjb2F0ID0gY2xlYXJjb2F0OwoJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gY2xlYXJjb2F0Um91Z2huZXNzOwoJbWF0ZXJpYWwuY2xlYXJjb2F0RjAgPSB2ZWMzKCAwLjA0ICk7CgltYXRlcmlhbC5jbGVhcmNvYXRGOTAgPSAxLjA7CgkjaWZkZWYgVVNFX0NMRUFSQ09BVE1BUAoJCW1hdGVyaWFsLmNsZWFyY29hdCAqPSB0ZXh0dXJlMkQoIGNsZWFyY29hdE1hcCwgdkNsZWFyY29hdE1hcFV2ICkueDsKCSNlbmRpZgoJI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQCgkJbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICo9IHRleHR1cmUyRCggY2xlYXJjb2F0Um91Z2huZXNzTWFwLCB2Q2xlYXJjb2F0Um91Z2huZXNzTWFwVXYgKS55OwoJI2VuZGlmCgltYXRlcmlhbC5jbGVhcmNvYXQgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuY2xlYXJjb2F0ICk7CW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1heCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAwLjA1MjUgKTsKCW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyArPSBnZW9tZXRyeVJvdWdobmVzczsKCW1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAxLjAgKTsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCW1hdGVyaWFsLmlyaWRlc2NlbmNlID0gaXJpZGVzY2VuY2U7CgltYXRlcmlhbC5pcmlkZXNjZW5jZUlPUiA9IGlyaWRlc2NlbmNlSU9SOwoJI2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUAoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlICo9IHRleHR1cmUyRCggaXJpZGVzY2VuY2VNYXAsIHZJcmlkZXNjZW5jZU1hcFV2ICkucjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAKCQltYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9IChpcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW0gLSBpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW0pICogdGV4dHVyZTJEKCBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcCwgdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYgKS5nICsgaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtOwoJI2Vsc2UKCQltYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTsKCSNlbmRpZgojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTgoJbWF0ZXJpYWwuc2hlZW5Db2xvciA9IHNoZWVuQ29sb3I7CgkjaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQCgkJbWF0ZXJpYWwuc2hlZW5Db2xvciAqPSB0ZXh0dXJlMkQoIHNoZWVuQ29sb3JNYXAsIHZTaGVlbkNvbG9yTWFwVXYgKS5yZ2I7CgkjZW5kaWYKCW1hdGVyaWFsLnNoZWVuUm91Z2huZXNzID0gY2xhbXAoIHNoZWVuUm91Z2huZXNzLCAwLjA3LCAxLjAgKTsKCSNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgkJbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgKj0gdGV4dHVyZTJEKCBzaGVlblJvdWdobmVzc01hcCwgdlNoZWVuUm91Z2huZXNzTWFwVXYgKS5hOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFkKCSNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUAoJCW1hdDIgYW5pc290cm9weU1hdCA9IG1hdDIoIGFuaXNvdHJvcHlWZWN0b3IueCwgYW5pc290cm9weVZlY3Rvci55LCAtIGFuaXNvdHJvcHlWZWN0b3IueSwgYW5pc290cm9weVZlY3Rvci54ICk7CgkJdmVjMyBhbmlzb3Ryb3B5UG9sYXIgPSB0ZXh0dXJlMkQoIGFuaXNvdHJvcHlNYXAsIHZBbmlzb3Ryb3B5TWFwVXYgKS5yZ2I7CgkJdmVjMiBhbmlzb3Ryb3B5ViA9IGFuaXNvdHJvcHlNYXQgKiBub3JtYWxpemUoIDIuMCAqIGFuaXNvdHJvcHlQb2xhci5yZyAtIHZlYzIoIDEuMCApICkgKiBhbmlzb3Ryb3B5UG9sYXIuYjsKCSNlbHNlCgkJdmVjMiBhbmlzb3Ryb3B5ViA9IGFuaXNvdHJvcHlWZWN0b3I7CgkjZW5kaWYKCW1hdGVyaWFsLmFuaXNvdHJvcHkgPSBsZW5ndGgoIGFuaXNvdHJvcHlWICk7CglpZiggbWF0ZXJpYWwuYW5pc290cm9weSA9PSAwLjAgKSB7CgkJYW5pc290cm9weVYgPSB2ZWMyKCAxLjAsIDAuMCApOwoJfSBlbHNlIHsKCQlhbmlzb3Ryb3B5ViAvPSBtYXRlcmlhbC5hbmlzb3Ryb3B5OwoJCW1hdGVyaWFsLmFuaXNvdHJvcHkgPSBzYXR1cmF0ZSggbWF0ZXJpYWwuYW5pc290cm9weSApOwoJfQoJbWF0ZXJpYWwuYWxwaGFUID0gbWl4KCBwb3cyKCBtYXRlcmlhbC5yb3VnaG5lc3MgKSwgMS4wLCBwb3cyKCBtYXRlcmlhbC5hbmlzb3Ryb3B5ICkgKTsKCW1hdGVyaWFsLmFuaXNvdHJvcHlUID0gdGJuWyAwIF0gKiBhbmlzb3Ryb3B5Vi54ICsgdGJuWyAxIF0gKiBhbmlzb3Ryb3B5Vi55OwoJbWF0ZXJpYWwuYW5pc290cm9weUIgPSB0Ym5bIDEgXSAqIGFuaXNvdHJvcHlWLnggLSB0Ym5bIDAgXSAqIGFuaXNvdHJvcHlWLnk7CiNlbmRpZmAsSXk9YHN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHsKCXZlYzMgZGlmZnVzZUNvbG9yOwoJZmxvYXQgcm91Z2huZXNzOwoJdmVjMyBzcGVjdWxhckNvbG9yOwoJZmxvYXQgc3BlY3VsYXJGOTA7CgkjaWZkZWYgVVNFX0NMRUFSQ09BVAoJCWZsb2F0IGNsZWFyY29hdDsKCQlmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7CgkJdmVjMyBjbGVhcmNvYXRGMDsKCQlmbG9hdCBjbGVhcmNvYXRGOTA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCQlmbG9hdCBpcmlkZXNjZW5jZTsKCQlmbG9hdCBpcmlkZXNjZW5jZUlPUjsKCQlmbG9hdCBpcmlkZXNjZW5jZVRoaWNrbmVzczsKCQl2ZWMzIGlyaWRlc2NlbmNlRnJlc25lbDsKCQl2ZWMzIGlyaWRlc2NlbmNlRjA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU4KCQl2ZWMzIHNoZWVuQ29sb3I7CgkJZmxvYXQgc2hlZW5Sb3VnaG5lc3M7CgkjZW5kaWYKCSNpZmRlZiBJT1IKCQlmbG9hdCBpb3I7CgkjZW5kaWYKCSNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgkJZmxvYXQgdHJhbnNtaXNzaW9uOwoJCWZsb2F0IHRyYW5zbWlzc2lvbkFscGhhOwoJCWZsb2F0IHRoaWNrbmVzczsKCQlmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlOwoJCXZlYzMgYXR0ZW51YXRpb25Db2xvcjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJZmxvYXQgYW5pc290cm9weTsKCQlmbG9hdCBhbHBoYVQ7CgkJdmVjMyBhbmlzb3Ryb3B5VDsKCQl2ZWMzIGFuaXNvdHJvcHlCOwoJI2VuZGlmCn07CnZlYzMgY2xlYXJjb2F0U3BlY3VsYXJEaXJlY3QgPSB2ZWMzKCAwLjAgKTsKdmVjMyBjbGVhcmNvYXRTcGVjdWxhckluZGlyZWN0ID0gdmVjMyggMC4wICk7CnZlYzMgc2hlZW5TcGVjdWxhckRpcmVjdCA9IHZlYzMoIDAuMCApOwp2ZWMzIHNoZWVuU3BlY3VsYXJJbmRpcmVjdCA9IHZlYzMoMC4wICk7CnZlYzMgU2NobGlja190b19GMCggY29uc3QgaW4gdmVjMyBmLCBjb25zdCBpbiBmbG9hdCBmOTAsIGNvbnN0IGluIGZsb2F0IGRvdFZIICkgewogICAgZmxvYXQgeCA9IGNsYW1wKCAxLjAgLSBkb3RWSCwgMC4wLCAxLjAgKTsKICAgIGZsb2F0IHgyID0geCAqIHg7CiAgICBmbG9hdCB4NSA9IGNsYW1wKCB4ICogeDIgKiB4MiwgMC4wLCAwLjk5OTkgKTsKICAgIHJldHVybiAoIGYgLSB2ZWMzKCBmOTAgKSAqIHg1ICkgLyAoIDEuMCAtIHg1ICk7Cn0KZmxvYXQgVl9HR1hfU21pdGhDb3JyZWxhdGVkKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkgewoJZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApOwoJZmxvYXQgZ3YgPSBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApOwoJZmxvYXQgZ2wgPSBkb3ROViAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApOwoJcmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApOwp9CmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7CglmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7CglmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7CglyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTsKfQojaWZkZWYgVVNFX0FOSVNPVFJPUFkKCWZsb2F0IFZfR0dYX1NtaXRoQ29ycmVsYXRlZF9Bbmlzb3Ryb3BpYyggY29uc3QgaW4gZmxvYXQgYWxwaGFULCBjb25zdCBpbiBmbG9hdCBhbHBoYUIsIGNvbnN0IGluIGZsb2F0IGRvdFRWLCBjb25zdCBpbiBmbG9hdCBkb3RCViwgY29uc3QgaW4gZmxvYXQgZG90VEwsIGNvbnN0IGluIGZsb2F0IGRvdEJMLCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7CgkJZmxvYXQgZ3YgPSBkb3ROTCAqIGxlbmd0aCggdmVjMyggYWxwaGFUICogZG90VFYsIGFscGhhQiAqIGRvdEJWLCBkb3ROViApICk7CgkJZmxvYXQgZ2wgPSBkb3ROViAqIGxlbmd0aCggdmVjMyggYWxwaGFUICogZG90VEwsIGFscGhhQiAqIGRvdEJMLCBkb3ROTCApICk7CgkJZmxvYXQgdiA9IDAuNSAvICggZ3YgKyBnbCApOwoJCXJldHVybiBzYXR1cmF0ZSh2KTsKCX0KCWZsb2F0IERfR0dYX0FuaXNvdHJvcGljKCBjb25zdCBpbiBmbG9hdCBhbHBoYVQsIGNvbnN0IGluIGZsb2F0IGFscGhhQiwgY29uc3QgaW4gZmxvYXQgZG90TkgsIGNvbnN0IGluIGZsb2F0IGRvdFRILCBjb25zdCBpbiBmbG9hdCBkb3RCSCApIHsKCQlmbG9hdCBhMiA9IGFscGhhVCAqIGFscGhhQjsKCQloaWdocCB2ZWMzIHYgPSB2ZWMzKCBhbHBoYUIgKiBkb3RUSCwgYWxwaGFUICogZG90QkgsIGEyICogZG90TkggKTsKCQloaWdocCBmbG9hdCB2MiA9IGRvdCggdiwgdiApOwoJCWZsb2F0IHcyID0gYTIgLyB2MjsKCQlyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyICogcG93MiAoIHcyICk7Cgl9CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJdmVjMyBCUkRGX0dHWF9DbGVhcmNvYXQoIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwpIHsKCQl2ZWMzIGYwID0gbWF0ZXJpYWwuY2xlYXJjb2F0RjA7CgkJZmxvYXQgZjkwID0gbWF0ZXJpYWwuY2xlYXJjb2F0RjkwOwoJCWZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzczsKCQlmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApOwoJCXZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggbGlnaHREaXIgKyB2aWV3RGlyICk7CgkJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGxpZ2h0RGlyICkgKTsKCQlmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CgkJZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApOwoJCWZsb2F0IGRvdFZIID0gc2F0dXJhdGUoIGRvdCggdmlld0RpciwgaGFsZkRpciApICk7CgkJdmVjMyBGID0gRl9TY2hsaWNrKCBmMCwgZjkwLCBkb3RWSCApOwoJCWZsb2F0IFYgPSBWX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTsKCQlmbG9hdCBEID0gRF9HR1goIGFscGhhLCBkb3ROSCApOwoJCXJldHVybiBGICogKCBWICogRCApOwoJfQojZW5kaWYKdmVjMyBCUkRGX0dHWCggY29uc3QgaW4gdmVjMyBsaWdodERpciwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCApIHsKCXZlYzMgZjAgPSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yOwoJZmxvYXQgZjkwID0gbWF0ZXJpYWwuc3BlY3VsYXJGOTA7CglmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5yb3VnaG5lc3M7CglmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApOwoJdmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBsaWdodERpciApICk7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CglmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgaGFsZkRpciApICk7CglmbG9hdCBkb3RWSCA9IHNhdHVyYXRlKCBkb3QoIHZpZXdEaXIsIGhhbGZEaXIgKSApOwoJdmVjMyBGID0gRl9TY2hsaWNrKCBmMCwgZjkwLCBkb3RWSCApOwoJI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJCUYgPSBtaXgoIEYsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UgKTsKCSNlbmRpZgoJI2lmZGVmIFVTRV9BTklTT1RST1BZCgkJZmxvYXQgZG90VEwgPSBkb3QoIG1hdGVyaWFsLmFuaXNvdHJvcHlULCBsaWdodERpciApOwoJCWZsb2F0IGRvdFRWID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5VCwgdmlld0RpciApOwoJCWZsb2F0IGRvdFRIID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5VCwgaGFsZkRpciApOwoJCWZsb2F0IGRvdEJMID0gZG90KCBtYXRlcmlhbC5hbmlzb3Ryb3B5QiwgbGlnaHREaXIgKTsKCQlmbG9hdCBkb3RCViA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weUIsIHZpZXdEaXIgKTsKCQlmbG9hdCBkb3RCSCA9IGRvdCggbWF0ZXJpYWwuYW5pc290cm9weUIsIGhhbGZEaXIgKTsKCQlmbG9hdCBWID0gVl9HR1hfU21pdGhDb3JyZWxhdGVkX0FuaXNvdHJvcGljKCBtYXRlcmlhbC5hbHBoYVQsIGFscGhhLCBkb3RUViwgZG90QlYsIGRvdFRMLCBkb3RCTCwgZG90TlYsIGRvdE5MICk7CgkJZmxvYXQgRCA9IERfR0dYX0FuaXNvdHJvcGljKCBtYXRlcmlhbC5hbHBoYVQsIGFscGhhLCBkb3ROSCwgZG90VEgsIGRvdEJIICk7CgkjZWxzZQoJCWZsb2F0IFYgPSBWX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTsKCQlmbG9hdCBEID0gRF9HR1goIGFscGhhLCBkb3ROSCApOwoJI2VuZGlmCglyZXR1cm4gRiAqICggViAqIEQgKTsKfQp2ZWMyIExUQ19VdiggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHsKCWNvbnN0IGZsb2F0IExVVF9TSVpFID0gNjQuMDsKCWNvbnN0IGZsb2F0IExVVF9TQ0FMRSA9ICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFOwoJY29uc3QgZmxvYXQgTFVUX0JJQVMgPSAwLjUgLyBMVVRfU0laRTsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggTiwgViApICk7Cgl2ZWMyIHV2ID0gdmVjMiggcm91Z2huZXNzLCBzcXJ0KCAxLjAgLSBkb3ROViApICk7Cgl1diA9IHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7CglyZXR1cm4gdXY7Cn0KZmxvYXQgTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIGYgKSB7CglmbG9hdCBsID0gbGVuZ3RoKCBmICk7CglyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7Cn0KdmVjMyBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgdjEsIGNvbnN0IGluIHZlYzMgdjIgKSB7CglmbG9hdCB4ID0gZG90KCB2MSwgdjIgKTsKCWZsb2F0IHkgPSBhYnMoIHggKTsKCWZsb2F0IGEgPSAwLjg1NDM5ODUgKyAoIDAuNDk2NTE1NSArIDAuMDE0NTIwNiAqIHkgKSAqIHk7CglmbG9hdCBiID0gMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5OwoJZmxvYXQgdiA9IGEgLyBiOwoJZmxvYXQgdGhldGFfc2ludGhldGEgPSAoIHggPiAwLjAgKSA/IHYgOiAwLjUgKiBpbnZlcnNlc3FydCggbWF4KCAxLjAgLSB4ICogeCwgMWUtNyApICkgLSB2OwoJcmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhOwp9CnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkgewoJdmVjMyB2MSA9IHJlY3RDb29yZHNbIDEgXSAtIHJlY3RDb29yZHNbIDAgXTsKCXZlYzMgdjIgPSByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07Cgl2ZWMzIGxpZ2h0Tm9ybWFsID0gY3Jvc3MoIHYxLCB2MiApOwoJaWYoIGRvdCggbGlnaHROb3JtYWwsIFAgLSByZWN0Q29vcmRzWyAwIF0gKSA8IDAuMCApIHJldHVybiB2ZWMzKCAwLjAgKTsKCXZlYzMgVDEsIFQyOwoJVDEgPSBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTsKCVQyID0gLSBjcm9zcyggTiwgVDEgKTsKCW1hdDMgbWF0ID0gbUludiAqIHRyYW5zcG9zZU1hdDMoIG1hdDMoIFQxLCBUMiwgTiApICk7Cgl2ZWMzIGNvb3Jkc1sgNCBdOwoJY29vcmRzWyAwIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDAgXSAtIFAgKTsKCWNvb3Jkc1sgMSBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7Cgljb29yZHNbIDIgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApOwoJY29vcmRzWyAzIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDMgXSAtIFAgKTsKCWNvb3Jkc1sgMCBdID0gbm9ybWFsaXplKCBjb29yZHNbIDAgXSApOwoJY29vcmRzWyAxIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7Cgljb29yZHNbIDIgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAyIF0gKTsKCWNvb3Jkc1sgMyBdID0gbm9ybWFsaXplKCBjb29yZHNbIDMgXSApOwoJdmVjMyB2ZWN0b3JGb3JtRmFjdG9yID0gdmVjMyggMC4wICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAwIF0sIGNvb3Jkc1sgMSBdICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7Cgl2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAzIF0sIGNvb3Jkc1sgMCBdICk7CglmbG9hdCByZXN1bHQgPSBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTsKCXJldHVybiB2ZWMzKCByZXN1bHQgKTsKfQojaWYgZGVmaW5lZCggVVNFX1NIRUVOICkKZmxvYXQgRF9DaGFybGllKCBmbG9hdCByb3VnaG5lc3MsIGZsb2F0IGRvdE5IICkgewoJZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTsKCWZsb2F0IGludkFscGhhID0gMS4wIC8gYWxwaGE7CglmbG9hdCBjb3MyaCA9IGRvdE5IICogZG90Tkg7CglmbG9hdCBzaW4yaCA9IG1heCggMS4wIC0gY29zMmgsIDAuMDA3ODEyNSApOwoJcmV0dXJuICggMi4wICsgaW52QWxwaGEgKSAqIHBvdyggc2luMmgsIGludkFscGhhICogMC41ICkgLyAoIDIuMCAqIFBJICk7Cn0KZmxvYXQgVl9OZXViZWx0KCBmbG9hdCBkb3ROViwgZmxvYXQgZG90TkwgKSB7CglyZXR1cm4gc2F0dXJhdGUoIDEuMCAvICggNC4wICogKCBkb3ROTCArIGRvdE5WIC0gZG90TkwgKiBkb3ROViApICkgKTsKfQp2ZWMzIEJSREZfU2hlZW4oIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIHZlYzMgc2hlZW5Db2xvciwgY29uc3QgaW4gZmxvYXQgc2hlZW5Sb3VnaG5lc3MgKSB7Cgl2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApOwoJZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGxpZ2h0RGlyICkgKTsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTsKCWZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTsKCWZsb2F0IEQgPSBEX0NoYXJsaWUoIHNoZWVuUm91Z2huZXNzLCBkb3ROSCApOwoJZmxvYXQgViA9IFZfTmV1YmVsdCggZG90TlYsIGRvdE5MICk7CglyZXR1cm4gc2hlZW5Db2xvciAqICggRCAqIFYgKTsKfQojZW5kaWYKZmxvYXQgSUJMU2hlZW5CUkRGKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7CglmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7CglmbG9hdCByMiA9IHJvdWdobmVzcyAqIHJvdWdobmVzczsKCWZsb2F0IGEgPSByb3VnaG5lc3MgPCAwLjI1ID8gLTMzOS4yICogcjIgKyAxNjEuNCAqIHJvdWdobmVzcyAtIDI1LjkgOiAtOC40OCAqIHIyICsgMTQuMyAqIHJvdWdobmVzcyAtIDkuOTU7CglmbG9hdCBiID0gcm91Z2huZXNzIDwgMC4yNSA/IDQ0LjAgKiByMiAtIDIzLjcgKiByb3VnaG5lc3MgKyAzLjI2IDogMS45NyAqIHIyIC0gMy4yNyAqIHJvdWdobmVzcyArIDAuNzI7CglmbG9hdCBERyA9IGV4cCggYSAqIGRvdE5WICsgYiApICsgKCByb3VnaG5lc3MgPCAwLjI1ID8gMC4wIDogMC4xICogKCByb3VnaG5lc3MgLSAwLjI1ICkgKTsKCXJldHVybiBzYXR1cmF0ZSggREcgKiBSRUNJUFJPQ0FMX1BJICk7Cn0KdmVjMiBERkdBcHByb3goIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHsKCWZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTsKCWNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApOwoJY29uc3QgdmVjNCBjMSA9IHZlYzQoIDEsIDAuMDQyNSwgMS4wNCwgLSAwLjA0ICk7Cgl2ZWM0IHIgPSByb3VnaG5lc3MgKiBjMCArIGMxOwoJZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7Cgl2ZWMyIGZhYiA9IHZlYzIoIC0gMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7CglyZXR1cm4gZmFiOwp9CnZlYzMgRW52aXJvbm1lbnRCUkRGKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7Cgl2ZWMyIGZhYiA9IERGR0FwcHJveCggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTsKCXJldHVybiBzcGVjdWxhckNvbG9yICogZmFiLnggKyBzcGVjdWxhckY5MCAqIGZhYi55Owp9CiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKdm9pZCBjb21wdXRlTXVsdGlzY2F0dGVyaW5nSXJpZGVzY2VuY2UoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc3BlY3VsYXJGOTAsIGNvbnN0IGluIGZsb2F0IGlyaWRlc2NlbmNlLCBjb25zdCBpbiB2ZWMzIGlyaWRlc2NlbmNlRjAsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgaW5vdXQgdmVjMyBzaW5nbGVTY2F0dGVyLCBpbm91dCB2ZWMzIG11bHRpU2NhdHRlciApIHsKI2Vsc2UKdm9pZCBjb21wdXRlTXVsdGlzY2F0dGVyaW5nKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNwZWN1bGFyRjkwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7CiNlbmRpZgoJdmVjMiBmYWIgPSBERkdBcHByb3goIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7CgkjaWZkZWYgVVNFX0lSSURFU0NFTkNFCgkJdmVjMyBGciA9IG1peCggc3BlY3VsYXJDb2xvciwgaXJpZGVzY2VuY2VGMCwgaXJpZGVzY2VuY2UgKTsKCSNlbHNlCgkJdmVjMyBGciA9IHNwZWN1bGFyQ29sb3I7CgkjZW5kaWYKCXZlYzMgRnNzRXNzID0gRnIgKiBmYWIueCArIHNwZWN1bGFyRjkwICogZmFiLnk7CglmbG9hdCBFc3MgPSBmYWIueCArIGZhYi55OwoJZmxvYXQgRW1zID0gMS4wIC0gRXNzOwoJdmVjMyBGYXZnID0gRnIgKyAoIDEuMCAtIEZyICkgKiAwLjA0NzYxOTsJdmVjMyBGbXMgPSBGc3NFc3MgKiBGYXZnIC8gKCAxLjAgLSBFbXMgKiBGYXZnICk7CglzaW5nbGVTY2F0dGVyICs9IEZzc0VzczsKCW11bHRpU2NhdHRlciArPSBGbXMgKiBFbXM7Cn0KI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMAoJdm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwoIGNvbnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7CgkJdmVjMyBub3JtYWwgPSBnZW9tZXRyeU5vcm1hbDsKCQl2ZWMzIHZpZXdEaXIgPSBnZW9tZXRyeVZpZXdEaXI7CgkJdmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5UG9zaXRpb247CgkJdmVjMyBsaWdodFBvcyA9IHJlY3RBcmVhTGlnaHQucG9zaXRpb247CgkJdmVjMyBoYWxmV2lkdGggPSByZWN0QXJlYUxpZ2h0LmhhbGZXaWR0aDsKCQl2ZWMzIGhhbGZIZWlnaHQgPSByZWN0QXJlYUxpZ2h0LmhhbGZIZWlnaHQ7CgkJdmVjMyBsaWdodENvbG9yID0gcmVjdEFyZWFMaWdodC5jb2xvcjsKCQlmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5yb3VnaG5lc3M7CgkJdmVjMyByZWN0Q29vcmRzWyA0IF07CgkJcmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0OwkJcmVjdENvb3Jkc1sgMSBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0OwoJCXJlY3RDb29yZHNbIDIgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoICsgaGFsZkhlaWdodDsKCQlyZWN0Q29vcmRzWyAzIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7CgkJdmVjMiB1diA9IExUQ19Vdiggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTsKCQl2ZWM0IHQxID0gdGV4dHVyZTJEKCBsdGNfMSwgdXYgKTsKCQl2ZWM0IHQyID0gdGV4dHVyZTJEKCBsdGNfMiwgdXYgKTsKCQltYXQzIG1JbnYgPSBtYXQzKAoJCQl2ZWMzKCB0MS54LCAwLCB0MS55ICksCgkJCXZlYzMoICAgIDAsIDEsICAgIDAgKSwKCQkJdmVjMyggdDEueiwgMCwgdDEudyApCgkJKTsKCQl2ZWMzIGZyZXNuZWwgPSAoIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKiB0Mi54ICsgKCB2ZWMzKCAxLjAgKSAtIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKSAqIHQyLnkgKTsKCQlyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBsaWdodENvbG9yICogZnJlc25lbCAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbUludiwgcmVjdENvb3JkcyApOwoJCXJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbWF0MyggMS4wICksIHJlY3RDb29yZHMgKTsKCX0KI2VuZGlmCnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCWZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlOb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7Cgl2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yOwoJI2lmZGVmIFVTRV9DTEVBUkNPQVQKCQlmbG9hdCBkb3ROTGNjID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7CgkJdmVjMyBjY0lycmFkaWFuY2UgPSBkb3ROTGNjICogZGlyZWN0TGlnaHQuY29sb3I7CgkJY2xlYXJjb2F0U3BlY3VsYXJEaXJlY3QgKz0gY2NJcnJhZGlhbmNlICogQlJERl9HR1hfQ2xlYXJjb2F0KCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsICk7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU4KCQlzaGVlblNwZWN1bGFyRGlyZWN0ICs9IGlycmFkaWFuY2UgKiBCUkRGX1NoZWVuKCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnNoZWVuQ29sb3IsIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICk7CgkjZW5kaWYKCXJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBCUkRGX0dHWCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Tm9ybWFsLCBtYXRlcmlhbCApOwoJcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQp2b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5UG9zaXRpb24sIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlOb3JtYWwsIGNvbnN0IGluIHZlYzMgZ2VvbWV0cnlWaWV3RGlyLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTsKfQp2b2lkIFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgcmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBjbGVhcmNvYXRSYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeVBvc2l0aW9uLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Tm9ybWFsLCBjb25zdCBpbiB2ZWMzIGdlb21ldHJ5Vmlld0RpciwgY29uc3QgaW4gdmVjMyBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQpIHsKCSNpZmRlZiBVU0VfQ0xFQVJDT0FUCgkJY2xlYXJjb2F0U3BlY3VsYXJJbmRpcmVjdCArPSBjbGVhcmNvYXRSYWRpYW5jZSAqIEVudmlyb25tZW50QlJERiggZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuY2xlYXJjb2F0RjAsIG1hdGVyaWFsLmNsZWFyY29hdEY5MCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7CgkjZW5kaWYKCSNpZmRlZiBVU0VfU0hFRU4KCQlzaGVlblNwZWN1bGFySW5kaXJlY3QgKz0gaXJyYWRpYW5jZSAqIG1hdGVyaWFsLnNoZWVuQ29sb3IgKiBJQkxTaGVlbkJSREYoIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICk7CgkjZW5kaWYKCXZlYzMgc2luZ2xlU2NhdHRlcmluZyA9IHZlYzMoIDAuMCApOwoJdmVjMyBtdWx0aVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlID0gaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7CgkjaWZkZWYgVVNFX0lSSURFU0NFTkNFCgkJY29tcHV0ZU11bHRpc2NhdHRlcmluZ0lyaWRlc2NlbmNlKCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwucm91Z2huZXNzLCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcgKTsKCSNlbHNlCgkJY29tcHV0ZU11bHRpc2NhdHRlcmluZyggZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsIG1hdGVyaWFsLnJvdWdobmVzcywgc2luZ2xlU2NhdHRlcmluZywgbXVsdGlTY2F0dGVyaW5nICk7CgkjZW5kaWYKCXZlYzMgdG90YWxTY2F0dGVyaW5nID0gc2luZ2xlU2NhdHRlcmluZyArIG11bHRpU2NhdHRlcmluZzsKCXZlYzMgZGlmZnVzZSA9IG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqICggMS4wIC0gbWF4KCBtYXgoIHRvdGFsU2NhdHRlcmluZy5yLCB0b3RhbFNjYXR0ZXJpbmcuZyApLCB0b3RhbFNjYXR0ZXJpbmcuYiApICk7CglyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IHJhZGlhbmNlICogc2luZ2xlU2NhdHRlcmluZzsKCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlOwoJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGRpZmZ1c2UgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7Cn0KI2RlZmluZSBSRV9EaXJlY3QJCQkJUkVfRGlyZWN0X1BoeXNpY2FsCiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhCQlSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwKI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2UJCVJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbAojZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXIJCVJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwKZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkgewoJcmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTsKfWAsVXk9YAp2ZWMzIGdlb21ldHJ5UG9zaXRpb24gPSAtIHZWaWV3UG9zaXRpb247CnZlYzMgZ2VvbWV0cnlOb3JtYWwgPSBub3JtYWw7CnZlYzMgZ2VvbWV0cnlWaWV3RGlyID0gKCBpc09ydGhvZ3JhcGhpYyApID8gdmVjMyggMCwgMCwgMSApIDogbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7CnZlYzMgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwgPSB2ZWMzKCAwLjAgKTsKI2lmZGVmIFVTRV9DTEVBUkNPQVQKCWdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsID0gY2xlYXJjb2F0Tm9ybWFsOwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRQoJZmxvYXQgZG90TlZpID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIgKSApOwoJaWYgKCBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcyA9PSAwLjAgKSB7CgkJbWF0ZXJpYWwuaXJpZGVzY2VuY2UgPSAwLjA7Cgl9IGVsc2UgewoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlID0gc2F0dXJhdGUoIG1hdGVyaWFsLmlyaWRlc2NlbmNlICk7Cgl9CglpZiAoIG1hdGVyaWFsLmlyaWRlc2NlbmNlID4gMC4wICkgewoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCA9IGV2YWxJcmlkZXNjZW5jZSggMS4wLCBtYXRlcmlhbC5pcmlkZXNjZW5jZUlPUiwgZG90TlZpLCBtYXRlcmlhbC5pcmlkZXNjZW5jZVRoaWNrbmVzcywgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciApOwoJCW1hdGVyaWFsLmlyaWRlc2NlbmNlRjAgPSBTY2hsaWNrX3RvX0YwKCBtYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwsIDEuMCwgZG90TlZpICk7Cgl9CiNlbmRpZgpJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0OwojaWYgKCBOVU1fUE9JTlRfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApCglQb2ludExpZ2h0IHBvaW50TGlnaHQ7CgkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMAoJUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93OwoJI2VuZGlmCgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkgewoJCXBvaW50TGlnaHQgPSBwb2ludExpZ2h0c1sgaSBdOwoJCWdldFBvaW50TGlnaHRJbmZvKCBwb2ludExpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBkaXJlY3RMaWdodCApOwoJCSNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgKQoJCXBvaW50TGlnaHRTaGFkb3cgPSBwb2ludExpZ2h0U2hhZG93c1sgaSBdOwoJCWRpcmVjdExpZ2h0LmNvbG9yICo9ICggZGlyZWN0TGlnaHQudmlzaWJsZSAmJiByZWNlaXZlU2hhZG93ICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7CgkJI2VuZGlmCgkJUkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApOwoJfQoJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKI2VuZGlmCiNpZiAoIE5VTV9TUE9UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKQoJU3BvdExpZ2h0IHNwb3RMaWdodDsKCXZlYzQgc3BvdENvbG9yOwoJdmVjMyBzcG90TGlnaHRDb29yZDsKCWJvb2wgaW5TcG90TGlnaHRNYXA7CgkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwCglTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93OwoJI2VuZGlmCgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7CgkJc3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdOwoJCWdldFNwb3RMaWdodEluZm8oIHNwb3RMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZGlyZWN0TGlnaHQgKTsKCQkjaWYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XU19XSVRIX01BUFMgKQoJCSNkZWZpbmUgU1BPVF9MSUdIVF9NQVBfSU5ERVggVU5ST0xMRURfTE9PUF9JTkRFWAoJCSNlbGlmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKQoJCSNkZWZpbmUgU1BPVF9MSUdIVF9NQVBfSU5ERVggTlVNX1NQT1RfTElHSFRfTUFQUwoJCSNlbHNlCgkJI2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCAoIFVOUk9MTEVEX0xPT1BfSU5ERVggLSBOVU1fU1BPVF9MSUdIVF9TSEFET1dTICsgTlVNX1NQT1RfTElHSFRfU0hBRE9XU19XSVRIX01BUFMgKQoJCSNlbmRpZgoJCSNpZiAoIFNQT1RfTElHSFRfTUFQX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfTUFQUyApCgkJCXNwb3RMaWdodENvb3JkID0gdlNwb3RMaWdodENvb3JkWyBpIF0ueHl6IC8gdlNwb3RMaWdodENvb3JkWyBpIF0udzsKCQkJaW5TcG90TGlnaHRNYXAgPSBhbGwoIGxlc3NUaGFuKCBhYnMoIHNwb3RMaWdodENvb3JkICogMi4gLSAxLiApLCB2ZWMzKCAxLjAgKSApICk7CgkJCXNwb3RDb2xvciA9IHRleHR1cmUyRCggc3BvdExpZ2h0TWFwWyBTUE9UX0xJR0hUX01BUF9JTkRFWCBdLCBzcG90TGlnaHRDb29yZC54eSApOwoJCQlkaXJlY3RMaWdodC5jb2xvciA9IGluU3BvdExpZ2h0TWFwID8gZGlyZWN0TGlnaHQuY29sb3IgKiBzcG90Q29sb3IucmdiIDogZGlyZWN0TGlnaHQuY29sb3I7CgkJI2VuZGlmCgkJI3VuZGVmIFNQT1RfTElHSFRfTUFQX0lOREVYCgkJI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTICkKCQlzcG90TGlnaHRTaGFkb3cgPSBzcG90TGlnaHRTaGFkb3dzWyBpIF07CgkJZGlyZWN0TGlnaHQuY29sb3IgKj0gKCBkaXJlY3RMaWdodC52aXNpYmxlICYmIHJlY2VpdmVTaGFkb3cgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZTcG90TGlnaHRDb29yZFsgaSBdICkgOiAxLjA7CgkJI2VuZGlmCgkJUkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApOwoJfQoJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKI2VuZGlmCiNpZiAoIE5VTV9ESVJfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApCglEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7CgkjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAKCURpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvdzsKCSNlbmRpZgoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7CgkJZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07CgkJZ2V0RGlyZWN0aW9uYWxMaWdodEluZm8oIGRpcmVjdGlvbmFsTGlnaHQsIGRpcmVjdExpZ2h0ICk7CgkJI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fRElSX0xJR0hUX1NIQURPV1MgKQoJCWRpcmVjdGlvbmFsTGlnaHRTaGFkb3cgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdOwoJCWRpcmVjdExpZ2h0LmNvbG9yICo9ICggZGlyZWN0TGlnaHQudmlzaWJsZSAmJiByZWNlaXZlU2hhZG93ICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wOwoJCSNlbmRpZgoJCVJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5UG9zaXRpb24sIGdlb21ldHJ5Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTsKCX0KCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCiNlbmRpZgojaWYgKCBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3RfUmVjdEFyZWEgKQoJUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0OwoJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JFQ1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7CgkJcmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGlnaHRzWyBpIF07CgkJUkVfRGlyZWN0X1JlY3RBcmVhKCByZWN0QXJlYUxpZ2h0LCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAojZW5kaWYKI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApCgl2ZWMzIGlibElycmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgaXJyYWRpYW5jZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7CgkjaWYgZGVmaW5lZCggVVNFX0xJR0hUX1BST0JFUyApCgkJaXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnlOb3JtYWwgKTsKCSNlbmRpZgoJI2lmICggTlVNX0hFTUlfTElHSFRTID4gMCApCgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydAoJCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHsKCQkJaXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5Tm9ybWFsICk7CgkJfQoJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyICkKCXZlYzMgcmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKCXZlYzMgY2xlYXJjb2F0UmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTsKI2VuZGlmYCxEeT1gI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApCgkjaWZkZWYgVVNFX0xJR0hUTUFQCgkJdmVjNCBsaWdodE1hcFRleGVsID0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdkxpZ2h0TWFwVXYgKTsKCQl2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IGxpZ2h0TWFwVGV4ZWwucmdiICogbGlnaHRNYXBJbnRlbnNpdHk7CgkJaXJyYWRpYW5jZSArPSBsaWdodE1hcElycmFkaWFuY2U7CgkjZW5kaWYKCSNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKSAmJiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWICkKCQlpYmxJcnJhZGlhbmNlICs9IGdldElCTElycmFkaWFuY2UoIGdlb21ldHJ5Tm9ybWFsICk7CgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApCgkjaWZkZWYgVVNFX0FOSVNPVFJPUFkKCQlyYWRpYW5jZSArPSBnZXRJQkxBbmlzb3Ryb3B5UmFkaWFuY2UoIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuYW5pc290cm9weUIsIG1hdGVyaWFsLmFuaXNvdHJvcHkgKTsKCSNlbHNlCgkJcmFkaWFuY2UgKz0gZ2V0SUJMUmFkaWFuY2UoIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlOb3JtYWwsIG1hdGVyaWFsLnJvdWdobmVzcyApOwoJI2VuZGlmCgkjaWZkZWYgVVNFX0NMRUFSQ09BVAoJCWNsZWFyY29hdFJhZGlhbmNlICs9IGdldElCTFJhZGlhbmNlKCBnZW9tZXRyeVZpZXdEaXIsIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTsKCSNlbmRpZgojZW5kaWZgLE55PWAjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlICkKCVJFX0luZGlyZWN0RGlmZnVzZSggaXJyYWRpYW5jZSwgZ2VvbWV0cnlQb3NpdGlvbiwgZ2VvbWV0cnlOb3JtYWwsIGdlb21ldHJ5Vmlld0RpciwgZ2VvbWV0cnlDbGVhcmNvYXROb3JtYWwsIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApOwojZW5kaWYKI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKQoJUkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGlibElycmFkaWFuY2UsIGNsZWFyY29hdFJhZGlhbmNlLCBnZW9tZXRyeVBvc2l0aW9uLCBnZW9tZXRyeU5vcm1hbCwgZ2VvbWV0cnlWaWV3RGlyLCBnZW9tZXRyeUNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7CiNlbmRpZmAsRnk9YCNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSAmJiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUICkKCWdsX0ZyYWdEZXB0aEVYVCA9IHZJc1BlcnNwZWN0aXZlID09IDAuMCA/IGdsX0ZyYWdDb29yZC56IDogbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTsKI2VuZGlmYCxPeT1gI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApICYmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKQoJdW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDOwoJdmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoOwoJdmFyeWluZyBmbG9hdCB2SXNQZXJzcGVjdGl2ZTsKI2VuZGlmYCxCeT1gI2lmZGVmIFVTRV9MT0dERVBUSEJVRgoJI2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFQKCQl2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7CgkJdmFyeWluZyBmbG9hdCB2SXNQZXJzcGVjdGl2ZTsKCSNlbHNlCgkJdW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDOwoJI2VuZGlmCiNlbmRpZmAsenk9YCNpZmRlZiBVU0VfTE9HREVQVEhCVUYKCSNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUCgkJdkZyYWdEZXB0aCA9IDEuMCArIGdsX1Bvc2l0aW9uLnc7CgkJdklzUGVyc3BlY3RpdmUgPSBmbG9hdCggaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApICk7CgkjZWxzZQoJCWlmICggaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApICkgewoJCQlnbF9Qb3NpdGlvbi56ID0gbG9nMiggbWF4KCBFUFNJTE9OLCBnbF9Qb3NpdGlvbi53ICsgMS4wICkgKSAqIGxvZ0RlcHRoQnVmRkMgLSAxLjA7CgkJCWdsX1Bvc2l0aW9uLnogKj0gZ2xfUG9zaXRpb24udzsKCQl9CgkjZW5kaWYKI2VuZGlmYCxreT1gI2lmZGVmIFVTRV9NQVAKCXZlYzQgc2FtcGxlZERpZmZ1c2VDb2xvciA9IHRleHR1cmUyRCggbWFwLCB2TWFwVXYgKTsKCSNpZmRlZiBERUNPREVfVklERU9fVEVYVFVSRQoJCXNhbXBsZWREaWZmdXNlQ29sb3IgPSB2ZWM0KCBtaXgoIHBvdyggc2FtcGxlZERpZmZ1c2VDb2xvci5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgc2FtcGxlZERpZmZ1c2VDb2xvci5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHNhbXBsZWREaWZmdXNlQ29sb3IucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHNhbXBsZWREaWZmdXNlQ29sb3IudyApOwoJCgkjZW5kaWYKCWRpZmZ1c2VDb2xvciAqPSBzYW1wbGVkRGlmZnVzZUNvbG9yOwojZW5kaWZgLEd5PWAjaWZkZWYgVVNFX01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgbWFwOwojZW5kaWZgLFZ5PWAjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApCgkjaWYgZGVmaW5lZCggVVNFX1BPSU5UU19VViApCgkJdmVjMiB1diA9IHZVdjsKCSNlbHNlCgkJdmVjMiB1diA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCBnbF9Qb2ludENvb3JkLngsIDEuMCAtIGdsX1BvaW50Q29vcmQueSwgMSApICkueHk7CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCglkaWZmdXNlQ29sb3IgKj0gdGV4dHVyZTJEKCBtYXAsIHV2ICk7CiNlbmRpZgojaWZkZWYgVVNFX0FMUEhBTUFQCglkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB1diApLmc7CiNlbmRpZmAsSHk9YCNpZiBkZWZpbmVkKCBVU0VfUE9JTlRTX1VWICkKCXZhcnlpbmcgdmVjMiB2VXY7CiNlbHNlCgkjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApCgkJdW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgbWFwOwojZW5kaWYKI2lmZGVmIFVTRV9BTFBIQU1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgYWxwaGFNYXA7CiNlbmRpZmAsV3k9YGZsb2F0IG1ldGFsbmVzc0ZhY3RvciA9IG1ldGFsbmVzczsKI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXZlYzQgdGV4ZWxNZXRhbG5lc3MgPSB0ZXh0dXJlMkQoIG1ldGFsbmVzc01hcCwgdk1ldGFsbmVzc01hcFV2ICk7CgltZXRhbG5lc3NGYWN0b3IgKj0gdGV4ZWxNZXRhbG5lc3MuYjsKI2VuZGlmYCxYeT1gI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIG1ldGFsbmVzc01hcDsKI2VuZGlmYCxxeT1gI2lmIGRlZmluZWQoIFVTRV9NT1JQSENPTE9SUyApICYmIGRlZmluZWQoIE1PUlBIVEFSR0VUU19URVhUVVJFICkKCXZDb2xvciAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBNT1JQSFRBUkdFVFNfQ09VTlQ7IGkgKysgKSB7CgkJI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApCgkJCWlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF0gIT0gMC4wICkgdkNvbG9yICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07CgkJI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkKCQkJaWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhPSAwLjAgKSB2Q29sb3IgKz0gZ2V0TW9ycGgoIGdsX1ZlcnRleElELCBpLCAyICkucmdiICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07CgkJI2VuZGlmCgl9CiNlbmRpZmAsJHk9YCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTCglvYmplY3ROb3JtYWwgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJI2lmZGVmIE1PUlBIVEFSR0VUU19URVhUVVJFCgkJZm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkgewoJCQlpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9IDAuMCApIG9iamVjdE5vcm1hbCArPSBnZXRNb3JwaCggZ2xfVmVydGV4SUQsIGksIDEgKS54eXogKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTsKCQl9CgkjZWxzZQoJCW9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDAgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTsKCQlvYmplY3ROb3JtYWwgKz0gbW9ycGhOb3JtYWwxICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07CgkJb2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdOwoJCW9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDMgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTsKCSNlbmRpZgojZW5kaWZgLFl5PWAjaWZkZWYgVVNFX01PUlBIVEFSR0VUUwoJdW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7CgkjaWZkZWYgTU9SUEhUQVJHRVRTX1RFWFRVUkUKCQl1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgTU9SUEhUQVJHRVRTX0NPVU5UIF07CgkJdW5pZm9ybSBzYW1wbGVyMkRBcnJheSBtb3JwaFRhcmdldHNUZXh0dXJlOwoJCXVuaWZvcm0gaXZlYzIgbW9ycGhUYXJnZXRzVGV4dHVyZVNpemU7CgkJdmVjNCBnZXRNb3JwaCggY29uc3QgaW4gaW50IHZlcnRleEluZGV4LCBjb25zdCBpbiBpbnQgbW9ycGhUYXJnZXRJbmRleCwgY29uc3QgaW4gaW50IG9mZnNldCApIHsKCQkJaW50IHRleGVsSW5kZXggPSB2ZXJ0ZXhJbmRleCAqIE1PUlBIVEFSR0VUU19URVhUVVJFX1NUUklERSArIG9mZnNldDsKCQkJaW50IHkgPSB0ZXhlbEluZGV4IC8gbW9ycGhUYXJnZXRzVGV4dHVyZVNpemUueDsKCQkJaW50IHggPSB0ZXhlbEluZGV4IC0geSAqIG1vcnBoVGFyZ2V0c1RleHR1cmVTaXplLng7CgkJCWl2ZWMzIG1vcnBoVVYgPSBpdmVjMyggeCwgeSwgbW9ycGhUYXJnZXRJbmRleCApOwoJCQlyZXR1cm4gdGV4ZWxGZXRjaCggbW9ycGhUYXJnZXRzVGV4dHVyZSwgbW9ycGhVViwgMCApOwoJCX0KCSNlbHNlCgkJI2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTCgkJCXVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA4IF07CgkJI2Vsc2UKCQkJdW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTsKCQkjZW5kaWYKCSNlbmRpZgojZW5kaWZgLFp5PWAjaWZkZWYgVVNFX01PUlBIVEFSR0VUUwoJdHJhbnNmb3JtZWQgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlOwoJI2lmZGVmIE1PUlBIVEFSR0VUU19URVhUVVJFCgkJZm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkgewoJCQlpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9IDAuMCApIHRyYW5zZm9ybWVkICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMCApLnh5eiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdOwoJCX0KCSNlbHNlCgkJdHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQwICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07CgkJdHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQxICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07CgkJdHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQyICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07CgkJdHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQzICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07CgkJI2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTCgkJCXRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdOwoJCQl0cmFuc2Zvcm1lZCArPSBtb3JwaFRhcmdldDUgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDUgXTsKCQkJdHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQ2ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA2IF07CgkJCXRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNyBdOwoJCSNlbmRpZgoJI2VuZGlmCiNlbmRpZmAsSnk9YGZsb2F0IGZhY2VEaXJlY3Rpb24gPSBnbF9Gcm9udEZhY2luZyA/IDEuMCA6IC0gMS4wOwojaWZkZWYgRkxBVF9TSEFERUQKCXZlYzMgZmR4ID0gZEZkeCggdlZpZXdQb3NpdGlvbiApOwoJdmVjMyBmZHkgPSBkRmR5KCB2Vmlld1Bvc2l0aW9uICk7Cgl2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTsKI2Vsc2UKCXZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCB2Tm9ybWFsICk7CgkjaWZkZWYgRE9VQkxFX1NJREVECgkJbm9ybWFsICo9IGZhY2VEaXJlY3Rpb247CgkjZW5kaWYKI2VuZGlmCiNpZiBkZWZpbmVkKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApIHx8IGRlZmluZWQoIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKQoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJbWF0MyB0Ym4gPSBtYXQzKCBub3JtYWxpemUoIHZUYW5nZW50ICksIG5vcm1hbGl6ZSggdkJpdGFuZ2VudCApLCBub3JtYWwgKTsKCSNlbHNlCgkJbWF0MyB0Ym4gPSBnZXRUYW5nZW50RnJhbWUoIC0gdlZpZXdQb3NpdGlvbiwgbm9ybWFsLAoJCSNpZiBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkKCQkJdk5vcm1hbE1hcFV2CgkJI2VsaWYgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKQoJCQl2Q2xlYXJjb2F0Tm9ybWFsTWFwVXYKCQkjZWxzZQoJCQl2VXYKCQkjZW5kaWYKCQkpOwoJI2VuZGlmCgkjaWYgZGVmaW5lZCggRE9VQkxFX1NJREVEICkgJiYgISBkZWZpbmVkKCBGTEFUX1NIQURFRCApCgkJdGJuWzBdICo9IGZhY2VEaXJlY3Rpb247CgkJdGJuWzFdICo9IGZhY2VEaXJlY3Rpb247CgkjZW5kaWYKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJbWF0MyB0Ym4yID0gbWF0Myggbm9ybWFsaXplKCB2VGFuZ2VudCApLCBub3JtYWxpemUoIHZCaXRhbmdlbnQgKSwgbm9ybWFsICk7CgkjZWxzZQoJCW1hdDMgdGJuMiA9IGdldFRhbmdlbnRGcmFtZSggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsIHZDbGVhcmNvYXROb3JtYWxNYXBVdiApOwoJI2VuZGlmCgkjaWYgZGVmaW5lZCggRE9VQkxFX1NJREVEICkgJiYgISBkZWZpbmVkKCBGTEFUX1NIQURFRCApCgkJdGJuMlswXSAqPSBmYWNlRGlyZWN0aW9uOwoJCXRibjJbMV0gKj0gZmFjZURpcmVjdGlvbjsKCSNlbmRpZgojZW5kaWYKdmVjMyBub25QZXJ0dXJiZWROb3JtYWwgPSBub3JtYWw7YCxLeT1gI2lmZGVmIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0UKCW5vcm1hbCA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2Tm9ybWFsTWFwVXYgKS54eXogKiAyLjAgLSAxLjA7CgkjaWZkZWYgRkxJUF9TSURFRAoJCW5vcm1hbCA9IC0gbm9ybWFsOwoJI2VuZGlmCgkjaWZkZWYgRE9VQkxFX1NJREVECgkJbm9ybWFsID0gbm9ybWFsICogZmFjZURpcmVjdGlvbjsKCSNlbmRpZgoJbm9ybWFsID0gbm9ybWFsaXplKCBub3JtYWxNYXRyaXggKiBub3JtYWwgKTsKI2VsaWYgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKQoJdmVjMyBtYXBOID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZOb3JtYWxNYXBVdiApLnh5eiAqIDIuMCAtIDEuMDsKCW1hcE4ueHkgKj0gbm9ybWFsU2NhbGU7Cglub3JtYWwgPSBub3JtYWxpemUoIHRibiAqIG1hcE4gKTsKI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKQoJbm9ybWFsID0gcGVydHVyYk5vcm1hbEFyYiggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsIGRIZHh5X2Z3ZCgpLCBmYWNlRGlyZWN0aW9uICk7CiNlbmRpZmAsUXk9YCNpZm5kZWYgRkxBVF9TSEFERUQKCXZhcnlpbmcgdmVjMyB2Tm9ybWFsOwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJdmFyeWluZyB2ZWMzIHZUYW5nZW50OwoJCXZhcnlpbmcgdmVjMyB2Qml0YW5nZW50OwoJI2VuZGlmCiNlbmRpZmAsank9YCNpZm5kZWYgRkxBVF9TSEFERUQKCXZhcnlpbmcgdmVjMyB2Tm9ybWFsOwoJI2lmZGVmIFVTRV9UQU5HRU5UCgkJdmFyeWluZyB2ZWMzIHZUYW5nZW50OwoJCXZhcnlpbmcgdmVjMyB2Qml0YW5nZW50OwoJI2VuZGlmCiNlbmRpZmAsZXY9YCNpZm5kZWYgRkxBVF9TSEFERUQKCXZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7CgkjaWZkZWYgVVNFX1RBTkdFTlQKCQl2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7CgkJdkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTsKCSNlbmRpZgojZW5kaWZgLHR2PWAjaWZkZWYgVVNFX05PUk1BTE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwOwoJdW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlOwojZW5kaWYKI2lmZGVmIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0UKCXVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7CiNlbmRpZgojaWYgISBkZWZpbmVkICggVVNFX1RBTkdFTlQgKSAmJiAoIGRlZmluZWQgKCBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSApIHx8IGRlZmluZWQgKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZICkgKQoJbWF0MyBnZXRUYW5nZW50RnJhbWUoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgdXYgKSB7CgkJdmVjMyBxMCA9IGRGZHgoIGV5ZV9wb3MueHl6ICk7CgkJdmVjMyBxMSA9IGRGZHkoIGV5ZV9wb3MueHl6ICk7CgkJdmVjMiBzdDAgPSBkRmR4KCB1di5zdCApOwoJCXZlYzIgc3QxID0gZEZkeSggdXYuc3QgKTsKCQl2ZWMzIE4gPSBzdXJmX25vcm07CgkJdmVjMyBxMXBlcnAgPSBjcm9zcyggcTEsIE4gKTsKCQl2ZWMzIHEwcGVycCA9IGNyb3NzKCBOLCBxMCApOwoJCXZlYzMgVCA9IHExcGVycCAqIHN0MC54ICsgcTBwZXJwICogc3QxLng7CgkJdmVjMyBCID0gcTFwZXJwICogc3QwLnkgKyBxMHBlcnAgKiBzdDEueTsKCQlmbG9hdCBkZXQgPSBtYXgoIGRvdCggVCwgVCApLCBkb3QoIEIsIEIgKSApOwoJCWZsb2F0IHNjYWxlID0gKCBkZXQgPT0gMC4wICkgPyAwLjAgOiBpbnZlcnNlc3FydCggZGV0ICk7CgkJcmV0dXJuIG1hdDMoIFQgKiBzY2FsZSwgQiAqIHNjYWxlLCBOICk7Cgl9CiNlbmRpZmAsbnY9YCNpZmRlZiBVU0VfQ0xFQVJDT0FUCgl2ZWMzIGNsZWFyY29hdE5vcm1hbCA9IG5vblBlcnR1cmJlZE5vcm1hbDsKI2VuZGlmYCxpdj1gI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgl2ZWMzIGNsZWFyY29hdE1hcE4gPSB0ZXh0dXJlMkQoIGNsZWFyY29hdE5vcm1hbE1hcCwgdkNsZWFyY29hdE5vcm1hbE1hcFV2ICkueHl6ICogMi4wIC0gMS4wOwoJY2xlYXJjb2F0TWFwTi54eSAqPSBjbGVhcmNvYXROb3JtYWxTY2FsZTsKCWNsZWFyY29hdE5vcm1hbCA9IG5vcm1hbGl6ZSggdGJuMiAqIGNsZWFyY29hdE1hcE4gKTsKI2VuZGlmYCxydj1gI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdE1hcDsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJdW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0Tm9ybWFsTWFwOwoJdW5pZm9ybSB2ZWMyIGNsZWFyY29hdE5vcm1hbFNjYWxlOwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXRSb3VnaG5lc3NNYXA7CiNlbmRpZmAsc3Y9YCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGlyaWRlc2NlbmNlTWFwOwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAKCXVuaWZvcm0gc2FtcGxlcjJEIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwOwojZW5kaWZgLGF2PWAjaWZkZWYgT1BBUVVFCmRpZmZ1c2VDb2xvci5hID0gMS4wOwojZW5kaWYKI2lmZGVmIFVTRV9UUkFOU01JU1NJT04KZGlmZnVzZUNvbG9yLmEgKj0gbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGE7CiNlbmRpZgpnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO2Asb3Y9YHZlYzMgcGFja05vcm1hbFRvUkdCKCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHsKCXJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41Owp9CnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkgewoJcmV0dXJuIDIuMCAqIHJnYi54eXogLSAxLjA7Cn0KY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjsKY29uc3QgdmVjMyBQYWNrRmFjdG9ycyA9IHZlYzMoIDI1Ni4gKiAyNTYuICogMjU2LiwgMjU2LiAqIDI1Ni4sIDI1Ni4gKTsKY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzID0gVW5wYWNrRG93bnNjYWxlIC8gdmVjNCggUGFja0ZhY3RvcnMsIDEuICk7CmNvbnN0IGZsb2F0IFNoaWZ0UmlnaHQ4ID0gMS4gLyAyNTYuOwp2ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHsKCXZlYzQgciA9IHZlYzQoIGZyYWN0KCB2ICogUGFja0ZhY3RvcnMgKSwgdiApOwoJci55encgLT0gci54eXogKiBTaGlmdFJpZ2h0ODsJcmV0dXJuIHIgKiBQYWNrVXBzY2FsZTsKfQpmbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkgewoJcmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApOwp9CnZlYzIgcGFja0RlcHRoVG9SRyggaW4gaGlnaHAgZmxvYXQgdiApIHsKCXJldHVybiBwYWNrRGVwdGhUb1JHQkEoIHYgKS55eDsKfQpmbG9hdCB1bnBhY2tSR1RvRGVwdGgoIGNvbnN0IGluIGhpZ2hwIHZlYzIgdiApIHsKCXJldHVybiB1bnBhY2tSR0JBVG9EZXB0aCggdmVjNCggdi54eSwgMC4wLCAwLjAgKSApOwp9CnZlYzQgcGFjazJIYWxmVG9SR0JBKCB2ZWMyIHYgKSB7Cgl2ZWM0IHIgPSB2ZWM0KCB2LngsIGZyYWN0KCB2LnggKiAyNTUuMCApLCB2LnksIGZyYWN0KCB2LnkgKiAyNTUuMCApICk7CglyZXR1cm4gdmVjNCggci54IC0gci55IC8gMjU1LjAsIHIueSwgci56IC0gci53IC8gMjU1LjAsIHIudyApOwp9CnZlYzIgdW5wYWNrUkdCQVRvMkhhbGYoIHZlYzQgdiApIHsKCXJldHVybiB2ZWMyKCB2LnggKyAoIHYueSAvIDI1NS4wICksIHYueiArICggdi53IC8gMjU1LjAgKSApOwp9CmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHsKCXJldHVybiAoIHZpZXdaICsgbmVhciApIC8gKCBuZWFyIC0gZmFyICk7Cn0KZmxvYXQgb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBkZXB0aCwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkgewoJcmV0dXJuIGRlcHRoICogKCBuZWFyIC0gZmFyICkgLSBuZWFyOwp9CmZsb2F0IHZpZXdaVG9QZXJzcGVjdGl2ZURlcHRoKCBjb25zdCBpbiBmbG9hdCB2aWV3WiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkgewoJcmV0dXJuICggKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCAoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7Cn0KZmxvYXQgcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGRlcHRoLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7CglyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogZGVwdGggLSBmYXIgKTsKfWAsbHY9YCNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBCglnbF9GcmFnQ29sb3IucmdiICo9IGdsX0ZyYWdDb2xvci5hOwojZW5kaWZgLGN2PWB2ZWM0IG12UG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7CiNpZmRlZiBVU0VfQkFUQ0hJTkcKCW12UG9zaXRpb24gPSBiYXRjaGluZ01hdHJpeCAqIG12UG9zaXRpb247CiNlbmRpZgojaWZkZWYgVVNFX0lOU1RBTkNJTkcKCW12UG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeCAqIG12UG9zaXRpb247CiNlbmRpZgptdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogbXZQb3NpdGlvbjsKZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtgLGh2PWAjaWZkZWYgRElUSEVSSU5HCglnbF9GcmFnQ29sb3IucmdiID0gZGl0aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7CiNlbmRpZmAsdXY9YCNpZmRlZiBESVRIRVJJTkcKCXZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkgewoJCWZsb2F0IGdyaWRfcG9zaXRpb24gPSByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTsKCQl2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgPSB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApOwoJCWRpdGhlcl9zaGlmdF9SR0IgPSBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7CgkJcmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjsKCX0KI2VuZGlmYCxmdj1gZmxvYXQgcm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzOwojaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdmVjNCB0ZXhlbFJvdWdobmVzcyA9IHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2Um91Z2huZXNzTWFwVXYgKTsKCXJvdWdobmVzc0ZhY3RvciAqPSB0ZXhlbFJvdWdobmVzcy5nOwojZW5kaWZgLGR2PWAjaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwOwojZW5kaWZgLHB2PWAjaWYgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMAoJdmFyeWluZyB2ZWM0IHZTcG90TGlnaHRDb29yZFsgTlVNX1NQT1RfTElHSFRfQ09PUkRTIF07CiNlbmRpZgojaWYgTlVNX1NQT1RfTElHSFRfTUFQUyA+IDAKCXVuaWZvcm0gc2FtcGxlcjJEIHNwb3RMaWdodE1hcFsgTlVNX1NQT1RfTElHSFRfTUFQUyBdOwojZW5kaWYKI2lmZGVmIFVTRV9TSEFET1dNQVAKCSNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJCXZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkJc3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQl9OwoJCXVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCSNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNwb3RTaGFkb3dNYXBbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTsKCQlzdHJ1Y3QgU3BvdExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJfTsKCQl1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCSNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCQl1bmlmb3JtIHNhbXBsZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTsKCQl2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07CgkJc3RydWN0IFBvaW50TGlnaHRTaGFkb3cgewoJCQlmbG9hdCBzaGFkb3dCaWFzOwoJCQlmbG9hdCBzaGFkb3dOb3JtYWxCaWFzOwoJCQlmbG9hdCBzaGFkb3dSYWRpdXM7CgkJCXZlYzIgc2hhZG93TWFwU2l6ZTsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjsKCQkJZmxvYXQgc2hhZG93Q2FtZXJhRmFyOwoJCX07CgkJdW5pZm9ybSBQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3dzWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCglmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkgewoJCXJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApOwoJfQoJdmVjMiB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYgKSB7CgkJcmV0dXJuIHVucGFja1JHQkFUbzJIYWxmKCB0ZXh0dXJlMkQoIHNoYWRvdywgdXYgKSApOwoJfQoJZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7CgkJZmxvYXQgb2NjbHVzaW9uID0gMS4wOwoJCXZlYzIgZGlzdHJpYnV0aW9uID0gdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7CgkJZmxvYXQgaGFyZF9zaGFkb3cgPSBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTsKCQlpZiAoaGFyZF9zaGFkb3cgIT0gMS4wICkgewoJCQlmbG9hdCBkaXN0YW5jZSA9IGNvbXBhcmUgLSBkaXN0cmlidXRpb24ueCA7CgkJCWZsb2F0IHZhcmlhbmNlID0gbWF4KCAwLjAwMDAwLCBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICk7CgkJCWZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7CQkJc29mdG5lc3NfcHJvYmFiaWxpdHkgPSBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7CQkJb2NjbHVzaW9uID0gY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7CgkJfQoJCXJldHVybiBvY2NsdXNpb247Cgl9CglmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkgewoJCWZsb2F0IHNoYWRvdyA9IDEuMDsKCQlzaGFkb3dDb29yZC54eXogLz0gc2hhZG93Q29vcmQudzsKCQlzaGFkb3dDb29yZC56ICs9IHNoYWRvd0JpYXM7CgkJYm9vbCBpbkZydXN0dW0gPSBzaGFkb3dDb29yZC54ID49IDAuMCAmJiBzaGFkb3dDb29yZC54IDw9IDEuMCAmJiBzaGFkb3dDb29yZC55ID49IDAuMCAmJiBzaGFkb3dDb29yZC55IDw9IDEuMDsKCQlib29sIGZydXN0dW1UZXN0ID0gaW5GcnVzdHVtICYmIHNoYWRvd0Nvb3JkLnogPD0gMS4wOwoJCWlmICggZnJ1c3R1bVRlc3QgKSB7CgkJI2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApCgkJCXZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplOwoJCQlmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzOwoJCQlmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzOwoJCQlmbG9hdCBkeDEgPSArIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzOwoJCQlmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzOwoJCQlmbG9hdCBkeDIgPSBkeDAgLyAyLjA7CgkJCWZsb2F0IGR5MiA9IGR5MCAvIDIuMDsKCQkJZmxvYXQgZHgzID0gZHgxIC8gMi4wOwoJCQlmbG9hdCBkeTMgPSBkeTEgLyAyLjA7CgkJCXNoYWRvdyA9ICgKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApCgkJCSkgKiAoIDEuMCAvIDE3LjAgKTsKCQkjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApCgkJCXZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplOwoJCQlmbG9hdCBkeCA9IHRleGVsU2l6ZS54OwoJCQlmbG9hdCBkeSA9IHRleGVsU2l6ZS55OwoJCQl2ZWMyIHV2ID0gc2hhZG93Q29vcmQueHk7CgkJCXZlYzIgZiA9IGZyYWN0KCB1diAqIHNoYWRvd01hcFNpemUgKyAwLjUgKTsKCQkJdXYgLT0gZiAqIHRleGVsU2l6ZTsKCQkJc2hhZG93ID0gKAoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diwgc2hhZG93Q29vcmQueiApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArCgkJCQl0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCBkeSApLCBzaGFkb3dDb29yZC56ICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHRleGVsU2l6ZSwgc2hhZG93Q29vcmQueiApICsKCQkJCW1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIC1keCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAwLjAgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSBmLnggKSArCgkJCQltaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIGYueCApICsKCQkJCW1peCggdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCSBmLnkgKSArCgkJCQltaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIGR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJIGYueSApICsKCQkJCW1peCggbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLAoJCQkJCQkgIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSwKCQkJCQkJICBmLnggKSwKCQkJCQkgbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJCSAgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksCgkJCQkJCSAgZi54ICksCgkJCQkJIGYueSApCgkJCSkgKiAoIDEuMCAvIDkuMCApOwoJCSNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApCgkJCXNoYWRvdyA9IFZTTVNoYWRvdyggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApOwoJCSNlbHNlCgkJCXNoYWRvdyA9IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTsKCQkjZW5kaWYKCQl9CgkJcmV0dXJuIHNoYWRvdzsKCX0KCXZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHsKCQl2ZWMzIGFic1YgPSBhYnMoIHYgKTsKCQlmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTsKCQlhYnNWICo9IHNjYWxlVG9DdWJlOwoJCXYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTsKCQl2ZWMyIHBsYW5hciA9IHYueHk7CgkJZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTsKCQlmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7CgkJaWYgKCBhYnNWLnogPj0gYWxtb3N0T25lICkgewoJCQlpZiAoIHYueiA+IDAuMCApCgkJCQlwbGFuYXIueCA9IDQuMCAtIHYueDsKCQl9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkgewoJCQlmbG9hdCBzaWduWCA9IHNpZ24oIHYueCApOwoJCQlwbGFuYXIueCA9IHYueiAqIHNpZ25YICsgMi4wICogc2lnblg7CgkJfSBlbHNlIGlmICggYWJzVi55ID49IGFsbW9zdE9uZSApIHsKCQkJZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTsKCQkJcGxhbmFyLnggPSB2LnggKyAyLjAgKiBzaWduWSArIDIuMDsKCQkJcGxhbmFyLnkgPSB2LnogKiBzaWduWSAtIDIuMDsKCQl9CgkJcmV0dXJuIHZlYzIoIDAuMTI1LCAwLjI1ICkgKiBwbGFuYXIgKyB2ZWMyKCAwLjM3NSwgMC43NSApOwoJfQoJZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7CgkJdmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTsKCQl2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejsKCQlmbG9hdCBkcCA9ICggbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApOwkJZHAgKz0gc2hhZG93QmlhczsKCQl2ZWMzIGJkM0QgPSBub3JtYWxpemUoIGxpZ2h0VG9Qb3NpdGlvbiApOwoJCSNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApCgkJCXZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTsKCQkJcmV0dXJuICgKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl5LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICsKCQkJCXRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHgsIHRleGVsU2l6ZS55ICksIGRwICkgKwoJCQkJdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwICkKCQkJKSAqICggMS4wIC8gOS4wICk7CgkJI2Vsc2UKCQkJcmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7CgkJI2VuZGlmCgl9CiNlbmRpZmAsbXY9YCNpZiBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwCgl1bmlmb3JtIG1hdDQgc3BvdExpZ2h0TWF0cml4WyBOVU1fU1BPVF9MSUdIVF9DT09SRFMgXTsKCXZhcnlpbmcgdmVjNCB2U3BvdExpZ2h0Q29vcmRbIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyBdOwojZW5kaWYKI2lmZGVmIFVTRV9TSEFET1dNQVAKCSNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwCgkJdW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTsKCQl2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJfTsKCQl1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdOwoJI2VuZGlmCgkjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAKCQlzdHJ1Y3QgU3BvdExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJfTsKCQl1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07CgkjZW5kaWYKCSNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDAKCQl1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07CgkJdmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdOwoJCXN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHsKCQkJZmxvYXQgc2hhZG93QmlhczsKCQkJZmxvYXQgc2hhZG93Tm9ybWFsQmlhczsKCQkJZmxvYXQgc2hhZG93UmFkaXVzOwoJCQl2ZWMyIHNoYWRvd01hcFNpemU7CgkJCWZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7CgkJCWZsb2F0IHNoYWRvd0NhbWVyYUZhcjsKCQl9OwoJCXVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTsKCSNlbmRpZgojZW5kaWZgLGd2PWAjaWYgKCBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgKCBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwIHx8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMCApICkgfHwgKCBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwICkKCXZlYzMgc2hhZG93V29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApOwoJdmVjNCBzaGFkb3dXb3JsZFBvc2l0aW9uOwojZW5kaWYKI2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKQoJI2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAKCQkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0CgkJZm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCQlzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7CgkJCXZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gPSBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjsKCQl9CgkJI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQKCSNlbmRpZgoJI2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMAoJCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCQlmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQkJc2hhZG93V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24gKyB2ZWM0KCBzaGFkb3dXb3JsZE5vcm1hbCAqIHBvaW50TGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhcywgMCApOwoJCQl2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247CgkJfQoJCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkjZW5kaWYKI2VuZGlmCiNpZiBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwCgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9DT09SRFM7IGkgKysgKSB7CgkJc2hhZG93V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb247CgkJI2lmICggZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTICkKCQkJc2hhZG93V29ybGRQb3NpdGlvbi54eXogKz0gc2hhZG93V29ybGROb3JtYWwgKiBzcG90TGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhczsKCQkjZW5kaWYKCQl2U3BvdExpZ2h0Q29vcmRbIGkgXSA9IHNwb3RMaWdodE1hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjsKCX0KCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCiNlbmRpZmAsX3Y9YGZsb2F0IGdldFNoYWRvd01hc2soKSB7CglmbG9hdCBzaGFkb3cgPSAxLjA7CgkjaWZkZWYgVVNFX1NIQURPV01BUAoJI2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAKCURpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodDsKCSNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnQKCWZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQlkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAKCVNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHQ7CgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkgewoJCXNwb3RMaWdodCA9IHNwb3RMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90TGlnaHRDb29yZFsgaSBdICkgOiAxLjA7Cgl9CgkjcHJhZ21hIHVucm9sbF9sb29wX2VuZAoJI2VuZGlmCgkjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwCglQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHQ7CgkjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0Cglmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHsKCQlwb2ludExpZ2h0ID0gcG9pbnRMaWdodFNoYWRvd3NbIGkgXTsKCQlzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93QmlhcywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDsKCX0KCSNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kCgkjZW5kaWYKCSNlbmRpZgoJcmV0dXJuIHNoYWRvdzsKfWAseHY9YCNpZmRlZiBVU0VfU0tJTk5JTkcKCW1hdDQgYm9uZU1hdFggPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApOwoJbWF0NCBib25lTWF0WSA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC55ICk7CgltYXQ0IGJvbmVNYXRaID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnogKTsKCW1hdDQgYm9uZU1hdFcgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgudyApOwojZW5kaWZgLHl2PWAjaWZkZWYgVVNFX1NLSU5OSU5HCgl1bmlmb3JtIG1hdDQgYmluZE1hdHJpeDsKCXVuaWZvcm0gbWF0NCBiaW5kTWF0cml4SW52ZXJzZTsKCXVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIGJvbmVUZXh0dXJlOwoJbWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkgewoJCWludCBzaXplID0gdGV4dHVyZVNpemUoIGJvbmVUZXh0dXJlLCAwICkueDsKCQlpbnQgaiA9IGludCggaSApICogNDsKCQlpbnQgeCA9IGogJSBzaXplOwoJCWludCB5ID0gaiAvIHNpemU7CgkJdmVjNCB2MSA9IHRleGVsRmV0Y2goIGJvbmVUZXh0dXJlLCBpdmVjMiggeCwgeSApLCAwICk7CgkJdmVjNCB2MiA9IHRleGVsRmV0Y2goIGJvbmVUZXh0dXJlLCBpdmVjMiggeCArIDEsIHkgKSwgMCApOwoJCXZlYzQgdjMgPSB0ZXhlbEZldGNoKCBib25lVGV4dHVyZSwgaXZlYzIoIHggKyAyLCB5ICksIDAgKTsKCQl2ZWM0IHY0ID0gdGV4ZWxGZXRjaCggYm9uZVRleHR1cmUsIGl2ZWMyKCB4ICsgMywgeSApLCAwICk7CgkJcmV0dXJuIG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7Cgl9CiNlbmRpZmAsdnY9YCNpZmRlZiBVU0VfU0tJTk5JTkcKCXZlYzQgc2tpblZlcnRleCA9IGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7Cgl2ZWM0IHNraW5uZWQgPSB2ZWM0KCAwLjAgKTsKCXNraW5uZWQgKz0gYm9uZU1hdFggKiBza2luVmVydGV4ICogc2tpbldlaWdodC54OwoJc2tpbm5lZCArPSBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7Cglza2lubmVkICs9IGJvbmVNYXRaICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQuejsKCXNraW5uZWQgKz0gYm9uZU1hdFcgKiBza2luVmVydGV4ICogc2tpbldlaWdodC53OwoJdHJhbnNmb3JtZWQgPSAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCApLnh5ejsKI2VuZGlmYCxNdj1gI2lmZGVmIFVTRV9TS0lOTklORwoJbWF0NCBza2luTWF0cml4ID0gbWF0NCggMC4wICk7Cglza2luTWF0cml4ICs9IHNraW5XZWlnaHQueCAqIGJvbmVNYXRYOwoJc2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnkgKiBib25lTWF0WTsKCXNraW5NYXRyaXggKz0gc2tpbldlaWdodC56ICogYm9uZU1hdFo7Cglza2luTWF0cml4ICs9IHNraW5XZWlnaHQudyAqIGJvbmVNYXRXOwoJc2tpbk1hdHJpeCA9IGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbk1hdHJpeCAqIGJpbmRNYXRyaXg7CglvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejsKCSNpZmRlZiBVU0VfVEFOR0VOVAoJCW9iamVjdFRhbmdlbnQgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7CgkjZW5kaWYKI2VuZGlmYCxTdj1gZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDsKI2lmZGVmIFVTRV9TUEVDVUxBUk1BUAoJdmVjNCB0ZXhlbFNwZWN1bGFyID0gdGV4dHVyZTJEKCBzcGVjdWxhck1hcCwgdlNwZWN1bGFyTWFwVXYgKTsKCXNwZWN1bGFyU3RyZW5ndGggPSB0ZXhlbFNwZWN1bGFyLnI7CiNlbHNlCglzcGVjdWxhclN0cmVuZ3RoID0gMS4wOwojZW5kaWZgLGJ2PWAjaWZkZWYgVVNFX1NQRUNVTEFSTUFQCgl1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDsKI2VuZGlmYCx3dj1gI2lmIGRlZmluZWQoIFRPTkVfTUFQUElORyApCglnbF9GcmFnQ29sb3IucmdiID0gdG9uZU1hcHBpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTsKI2VuZGlmYCxFdj1gI2lmbmRlZiBzYXR1cmF0ZQojZGVmaW5lIHNhdHVyYXRlKCBhICkgY2xhbXAoIGEsIDAuMCwgMS4wICkKI2VuZGlmCnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdFeHBvc3VyZTsKdmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHsKCXJldHVybiBzYXR1cmF0ZSggdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yICk7Cn0KdmVjMyBSZWluaGFyZFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgewoJY29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTsKCXJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApOwp9CnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7Cgljb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlOwoJY29sb3IgPSBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7CglyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApOwp9CnZlYzMgUlJUQW5kT0RURml0KCB2ZWMzIHYgKSB7Cgl2ZWMzIGEgPSB2ICogKCB2ICsgMC4wMjQ1Nzg2ICkgLSAwLjAwMDA5MDUzNzsKCXZlYzMgYiA9IHYgKiAoIDAuOTgzNzI5ICogdiArIDAuNDMyOTUxMCApICsgMC4yMzgwODE7CglyZXR1cm4gYSAvIGI7Cn0KdmVjMyBBQ0VTRmlsbWljVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7Cgljb25zdCBtYXQzIEFDRVNJbnB1dE1hdCA9IG1hdDMoCgkJdmVjMyggMC41OTcxOSwgMC4wNzYwMCwgMC4wMjg0MCApLAkJdmVjMyggMC4zNTQ1OCwgMC45MDgzNCwgMC4xMzM4MyApLAoJCXZlYzMoIDAuMDQ4MjMsIDAuMDE1NjYsIDAuODM3NzcgKQoJKTsKCWNvbnN0IG1hdDMgQUNFU091dHB1dE1hdCA9IG1hdDMoCgkJdmVjMyggIDEuNjA0NzUsIC0wLjEwMjA4LCAtMC4wMDMyNyApLAkJdmVjMyggLTAuNTMxMDgsICAxLjEwODEzLCAtMC4wNzI3NiApLAoJCXZlYzMoIC0wLjA3MzY3LCAtMC4wMDYwNSwgIDEuMDc2MDIgKQoJKTsKCWNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmUgLyAwLjY7Cgljb2xvciA9IEFDRVNJbnB1dE1hdCAqIGNvbG9yOwoJY29sb3IgPSBSUlRBbmRPRFRGaXQoIGNvbG9yICk7Cgljb2xvciA9IEFDRVNPdXRwdXRNYXQgKiBjb2xvcjsKCXJldHVybiBzYXR1cmF0ZSggY29sb3IgKTsKfQp2ZWMzIEN1c3RvbVRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gY29sb3I7IH1gLEF2PWAjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJbWF0ZXJpYWwudHJhbnNtaXNzaW9uID0gdHJhbnNtaXNzaW9uOwoJbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEgPSAxLjA7CgltYXRlcmlhbC50aGlja25lc3MgPSB0aGlja25lc3M7CgltYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlID0gYXR0ZW51YXRpb25EaXN0YW5jZTsKCW1hdGVyaWFsLmF0dGVudWF0aW9uQ29sb3IgPSBhdHRlbnVhdGlvbkNvbG9yOwoJI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCQltYXRlcmlhbC50cmFuc21pc3Npb24gKj0gdGV4dHVyZTJEKCB0cmFuc21pc3Npb25NYXAsIHZUcmFuc21pc3Npb25NYXBVdiApLnI7CgkjZW5kaWYKCSNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgkJbWF0ZXJpYWwudGhpY2tuZXNzICo9IHRleHR1cmUyRCggdGhpY2tuZXNzTWFwLCB2VGhpY2tuZXNzTWFwVXYgKS5nOwoJI2VuZGlmCgl2ZWMzIHBvcyA9IHZXb3JsZFBvc2l0aW9uOwoJdmVjMyB2ID0gbm9ybWFsaXplKCBjYW1lcmFQb3NpdGlvbiAtIHBvcyApOwoJdmVjMyBuID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7Cgl2ZWM0IHRyYW5zbWl0dGVkID0gZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbigKCQluLCB2LCBtYXRlcmlhbC5yb3VnaG5lc3MsIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsCgkJcG9zLCBtb2RlbE1hdHJpeCwgdmlld01hdHJpeCwgcHJvamVjdGlvbk1hdHJpeCwgbWF0ZXJpYWwuaW9yLCBtYXRlcmlhbC50aGlja25lc3MsCgkJbWF0ZXJpYWwuYXR0ZW51YXRpb25Db2xvciwgbWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZSApOwoJbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEgPSBtaXgoIG1hdGVyaWFsLnRyYW5zbWlzc2lvbkFscGhhLCB0cmFuc21pdHRlZC5hLCBtYXRlcmlhbC50cmFuc21pc3Npb24gKTsKCXRvdGFsRGlmZnVzZSA9IG1peCggdG90YWxEaWZmdXNlLCB0cmFuc21pdHRlZC5yZ2IsIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiApOwojZW5kaWZgLFR2PWAjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJdW5pZm9ybSBmbG9hdCB0cmFuc21pc3Npb247Cgl1bmlmb3JtIGZsb2F0IHRoaWNrbmVzczsKCXVuaWZvcm0gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZTsKCXVuaWZvcm0gdmVjMyBhdHRlbnVhdGlvbkNvbG9yOwoJI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25NYXA7CgkjZW5kaWYKCSNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgkJdW5pZm9ybSBzYW1wbGVyMkQgdGhpY2tuZXNzTWFwOwoJI2VuZGlmCgl1bmlmb3JtIHZlYzIgdHJhbnNtaXNzaW9uU2FtcGxlclNpemU7Cgl1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25TYW1wbGVyTWFwOwoJdW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OwoJdW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7Cgl2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CglmbG9hdCB3MCggZmxvYXQgYSApIHsKCQlyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqICggYSAqICggLSBhICsgMy4wICkgLSAzLjAgKSArIDEuMCApOwoJfQoJZmxvYXQgdzEoIGZsb2F0IGEgKSB7CgkJcmV0dXJuICggMS4wIC8gNi4wICkgKiAoIGEgKiAgYSAqICggMy4wICogYSAtIDYuMCApICsgNC4wICk7Cgl9CglmbG9hdCB3MiggZmxvYXQgYSApewoJCXJldHVybiAoIDEuMCAvIDYuMCApICogKCBhICogKCBhICogKCAtIDMuMCAqIGEgKyAzLjAgKSArIDMuMCApICsgMS4wICk7Cgl9CglmbG9hdCB3MyggZmxvYXQgYSApIHsKCQlyZXR1cm4gKCAxLjAgLyA2LjAgKSAqICggYSAqIGEgKiBhICk7Cgl9CglmbG9hdCBnMCggZmxvYXQgYSApIHsKCQlyZXR1cm4gdzAoIGEgKSArIHcxKCBhICk7Cgl9CglmbG9hdCBnMSggZmxvYXQgYSApIHsKCQlyZXR1cm4gdzIoIGEgKSArIHczKCBhICk7Cgl9CglmbG9hdCBoMCggZmxvYXQgYSApIHsKCQlyZXR1cm4gLSAxLjAgKyB3MSggYSApIC8gKCB3MCggYSApICsgdzEoIGEgKSApOwoJfQoJZmxvYXQgaDEoIGZsb2F0IGEgKSB7CgkJcmV0dXJuIDEuMCArIHczKCBhICkgLyAoIHcyKCBhICkgKyB3MyggYSApICk7Cgl9Cgl2ZWM0IGJpY3ViaWMoIHNhbXBsZXIyRCB0ZXgsIHZlYzIgdXYsIHZlYzQgdGV4ZWxTaXplLCBmbG9hdCBsb2QgKSB7CgkJdXYgPSB1diAqIHRleGVsU2l6ZS56dyArIDAuNTsKCQl2ZWMyIGl1diA9IGZsb29yKCB1diApOwoJCXZlYzIgZnV2ID0gZnJhY3QoIHV2ICk7CgkJZmxvYXQgZzB4ID0gZzAoIGZ1di54ICk7CgkJZmxvYXQgZzF4ID0gZzEoIGZ1di54ICk7CgkJZmxvYXQgaDB4ID0gaDAoIGZ1di54ICk7CgkJZmxvYXQgaDF4ID0gaDEoIGZ1di54ICk7CgkJZmxvYXQgaDB5ID0gaDAoIGZ1di55ICk7CgkJZmxvYXQgaDF5ID0gaDEoIGZ1di55ICk7CgkJdmVjMiBwMCA9ICggdmVjMiggaXV2LnggKyBoMHgsIGl1di55ICsgaDB5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTsKCQl2ZWMyIHAxID0gKCB2ZWMyKCBpdXYueCArIGgxeCwgaXV2LnkgKyBoMHkgKSAtIDAuNSApICogdGV4ZWxTaXplLnh5OwoJCXZlYzIgcDIgPSAoIHZlYzIoIGl1di54ICsgaDB4LCBpdXYueSArIGgxeSApIC0gMC41ICkgKiB0ZXhlbFNpemUueHk7CgkJdmVjMiBwMyA9ICggdmVjMiggaXV2LnggKyBoMXgsIGl1di55ICsgaDF5ICkgLSAwLjUgKSAqIHRleGVsU2l6ZS54eTsKCQlyZXR1cm4gZzAoIGZ1di55ICkgKiAoIGcweCAqIHRleHR1cmVMb2QoIHRleCwgcDAsIGxvZCApICsgZzF4ICogdGV4dHVyZUxvZCggdGV4LCBwMSwgbG9kICkgKSArCgkJCWcxKCBmdXYueSApICogKCBnMHggKiB0ZXh0dXJlTG9kKCB0ZXgsIHAyLCBsb2QgKSArIGcxeCAqIHRleHR1cmVMb2QoIHRleCwgcDMsIGxvZCApICk7Cgl9Cgl2ZWM0IHRleHR1cmVCaWN1YmljKCBzYW1wbGVyMkQgc2FtcGxlciwgdmVjMiB1diwgZmxvYXQgbG9kICkgewoJCXZlYzIgZkxvZFNpemUgPSB2ZWMyKCB0ZXh0dXJlU2l6ZSggc2FtcGxlciwgaW50KCBsb2QgKSApICk7CgkJdmVjMiBjTG9kU2l6ZSA9IHZlYzIoIHRleHR1cmVTaXplKCBzYW1wbGVyLCBpbnQoIGxvZCArIDEuMCApICkgKTsKCQl2ZWMyIGZMb2RTaXplSW52ID0gMS4wIC8gZkxvZFNpemU7CgkJdmVjMiBjTG9kU2l6ZUludiA9IDEuMCAvIGNMb2RTaXplOwoJCXZlYzQgZlNhbXBsZSA9IGJpY3ViaWMoIHNhbXBsZXIsIHV2LCB2ZWM0KCBmTG9kU2l6ZUludiwgZkxvZFNpemUgKSwgZmxvb3IoIGxvZCApICk7CgkJdmVjNCBjU2FtcGxlID0gYmljdWJpYyggc2FtcGxlciwgdXYsIHZlYzQoIGNMb2RTaXplSW52LCBjTG9kU2l6ZSApLCBjZWlsKCBsb2QgKSApOwoJCXJldHVybiBtaXgoIGZTYW1wbGUsIGNTYW1wbGUsIGZyYWN0KCBsb2QgKSApOwoJfQoJdmVjMyBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIGNvbnN0IGluIHZlYzMgbiwgY29uc3QgaW4gdmVjMyB2LCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsIGNvbnN0IGluIGZsb2F0IGlvciwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCApIHsKCQl2ZWMzIHJlZnJhY3Rpb25WZWN0b3IgPSByZWZyYWN0KCAtIHYsIG5vcm1hbGl6ZSggbiApLCAxLjAgLyBpb3IgKTsKCQl2ZWMzIG1vZGVsU2NhbGU7CgkJbW9kZWxTY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLnh5eiApICk7CgkJbW9kZWxTY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLnh5eiApICk7CgkJbW9kZWxTY2FsZS56ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMiBdLnh5eiApICk7CgkJcmV0dXJuIG5vcm1hbGl6ZSggcmVmcmFjdGlvblZlY3RvciApICogdGhpY2tuZXNzICogbW9kZWxTY2FsZTsKCX0KCWZsb2F0IGFwcGx5SW9yVG9Sb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgaW9yICkgewoJCXJldHVybiByb3VnaG5lc3MgKiBjbGFtcCggaW9yICogMi4wIC0gMi4wLCAwLjAsIDEuMCApOwoJfQoJdmVjNCBnZXRUcmFuc21pc3Npb25TYW1wbGUoIGNvbnN0IGluIHZlYzIgZnJhZ0Nvb3JkLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGlvciApIHsKCQlmbG9hdCBsb2QgPSBsb2cyKCB0cmFuc21pc3Npb25TYW1wbGVyU2l6ZS54ICkgKiBhcHBseUlvclRvUm91Z2huZXNzKCByb3VnaG5lc3MsIGlvciApOwoJCXJldHVybiB0ZXh0dXJlQmljdWJpYyggdHJhbnNtaXNzaW9uU2FtcGxlck1hcCwgZnJhZ0Nvb3JkLnh5LCBsb2QgKTsKCX0KCXZlYzMgdm9sdW1lQXR0ZW51YXRpb24oIGNvbnN0IGluIGZsb2F0IHRyYW5zbWlzc2lvbkRpc3RhbmNlLCBjb25zdCBpbiB2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGNvbnN0IGluIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UgKSB7CgkJaWYgKCBpc2luZiggYXR0ZW51YXRpb25EaXN0YW5jZSApICkgewoJCQlyZXR1cm4gdmVjMyggMS4wICk7CgkJfSBlbHNlIHsKCQkJdmVjMyBhdHRlbnVhdGlvbkNvZWZmaWNpZW50ID0gLWxvZyggYXR0ZW51YXRpb25Db2xvciApIC8gYXR0ZW51YXRpb25EaXN0YW5jZTsKCQkJdmVjMyB0cmFuc21pdHRhbmNlID0gZXhwKCAtIGF0dGVudWF0aW9uQ29lZmZpY2llbnQgKiB0cmFuc21pc3Npb25EaXN0YW5jZSApOwkJCXJldHVybiB0cmFuc21pdHRhbmNlOwoJCX0KCX0KCXZlYzQgZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbiggY29uc3QgaW4gdmVjMyBuLCBjb25zdCBpbiB2ZWMzIHYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IsCgkJY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gdmVjMyBwb3NpdGlvbiwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCwKCQljb25zdCBpbiBtYXQ0IHZpZXdNYXRyaXgsIGNvbnN0IGluIG1hdDQgcHJvak1hdHJpeCwgY29uc3QgaW4gZmxvYXQgaW9yLCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsCgkJY29uc3QgaW4gdmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBjb25zdCBpbiBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlICkgewoJCXZlYzMgdHJhbnNtaXNzaW9uUmF5ID0gZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBuLCB2LCB0aGlja25lc3MsIGlvciwgbW9kZWxNYXRyaXggKTsKCQl2ZWMzIHJlZnJhY3RlZFJheUV4aXQgPSBwb3NpdGlvbiArIHRyYW5zbWlzc2lvblJheTsKCQl2ZWM0IG5kY1BvcyA9IHByb2pNYXRyaXggKiB2aWV3TWF0cml4ICogdmVjNCggcmVmcmFjdGVkUmF5RXhpdCwgMS4wICk7CgkJdmVjMiByZWZyYWN0aW9uQ29vcmRzID0gbmRjUG9zLnh5IC8gbmRjUG9zLnc7CgkJcmVmcmFjdGlvbkNvb3JkcyArPSAxLjA7CgkJcmVmcmFjdGlvbkNvb3JkcyAvPSAyLjA7CgkJdmVjNCB0cmFuc21pdHRlZExpZ2h0ID0gZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKCByZWZyYWN0aW9uQ29vcmRzLCByb3VnaG5lc3MsIGlvciApOwoJCXZlYzMgdHJhbnNtaXR0YW5jZSA9IGRpZmZ1c2VDb2xvciAqIHZvbHVtZUF0dGVudWF0aW9uKCBsZW5ndGgoIHRyYW5zbWlzc2lvblJheSApLCBhdHRlbnVhdGlvbkNvbG9yLCBhdHRlbnVhdGlvbkRpc3RhbmNlICk7CgkJdmVjMyBhdHRlbnVhdGVkQ29sb3IgPSB0cmFuc21pdHRhbmNlICogdHJhbnNtaXR0ZWRMaWdodC5yZ2I7CgkJdmVjMyBGID0gRW52aXJvbm1lbnRCUkRGKCBuLCB2LCBzcGVjdWxhckNvbG9yLCBzcGVjdWxhckY5MCwgcm91Z2huZXNzICk7CgkJZmxvYXQgdHJhbnNtaXR0YW5jZUZhY3RvciA9ICggdHJhbnNtaXR0YW5jZS5yICsgdHJhbnNtaXR0YW5jZS5nICsgdHJhbnNtaXR0YW5jZS5iICkgLyAzLjA7CgkJcmV0dXJuIHZlYzQoICggMS4wIC0gRiApICogYXR0ZW51YXRlZENvbG9yLCAxLjAgLSAoIDEuMCAtIHRyYW5zbWl0dGVkTGlnaHQuYSApICogdHJhbnNtaXR0YW5jZUZhY3RvciApOwoJfQojZW5kaWZgLEN2PWAjaWYgZGVmaW5lZCggVVNFX1VWICkgfHwgZGVmaW5lZCggVVNFX0FOSVNPVFJPUFkgKQoJdmFyeWluZyB2ZWMyIHZVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTUFQCgl2YXJ5aW5nIHZlYzIgdk1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9BTFBIQU1BUAoJdmFyeWluZyB2ZWMyIHZBbHBoYU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9MSUdIVE1BUAoJdmFyeWluZyB2ZWMyIHZMaWdodE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9BT01BUAoJdmFyeWluZyB2ZWMyIHZBb01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9CVU1QTUFQCgl2YXJ5aW5nIHZlYzIgdkJ1bXBNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfTk9STUFMTUFQCgl2YXJ5aW5nIHZlYzIgdk5vcm1hbE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdmFyeWluZyB2ZWMyIHZFbWlzc2l2ZU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXZhcnlpbmcgdmVjMiB2TWV0YWxuZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdmFyeWluZyB2ZWMyIHZSb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQU5JU09UUk9QWU1BUAoJdmFyeWluZyB2ZWMyIHZBbmlzb3Ryb3B5TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVE1BUAoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUAoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXROb3JtYWxNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUAoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXRSb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVAKCXZhcnlpbmcgdmVjMiB2SXJpZGVzY2VuY2VNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQCgl2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQCgl2YXJ5aW5nIHZlYzIgdlNoZWVuQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU5fUk9VR0hORVNTTUFQCgl2YXJ5aW5nIHZlYzIgdlNoZWVuUm91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSTUFQCgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0NPTE9STUFQCgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyQ29sb3JNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQCgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFySW50ZW5zaXR5TWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJdW5pZm9ybSBtYXQzIHRyYW5zbWlzc2lvbk1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VHJhbnNtaXNzaW9uTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1RISUNLTkVTU01BUAoJdW5pZm9ybSBtYXQzIHRoaWNrbmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2VGhpY2tuZXNzTWFwVXY7CiNlbmRpZmAsUnY9YCNpZiBkZWZpbmVkKCBVU0VfVVYgKSB8fCBkZWZpbmVkKCBVU0VfQU5JU09UUk9QWSApCgl2YXJ5aW5nIHZlYzIgdlV2OwojZW5kaWYKI2lmZGVmIFVTRV9NQVAKCXVuaWZvcm0gbWF0MyBtYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdk1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9BTFBIQU1BUAoJdW5pZm9ybSBtYXQzIGFscGhhTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZBbHBoYU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9MSUdIVE1BUAoJdW5pZm9ybSBtYXQzIGxpZ2h0TWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZMaWdodE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9BT01BUAoJdW5pZm9ybSBtYXQzIGFvTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZBb01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9CVU1QTUFQCgl1bmlmb3JtIG1hdDMgYnVtcE1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2QnVtcE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9OT1JNQUxNQVAKCXVuaWZvcm0gbWF0MyBub3JtYWxNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdk5vcm1hbE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCXVuaWZvcm0gbWF0MyBkaXNwbGFjZW1lbnRNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkRpc3BsYWNlbWVudE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9FTUlTU0lWRU1BUAoJdW5pZm9ybSBtYXQzIGVtaXNzaXZlTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZFbWlzc2l2ZU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVAKCXVuaWZvcm0gbWF0MyBtZXRhbG5lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdk1ldGFsbmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVAKCXVuaWZvcm0gbWF0MyByb3VnaG5lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlJvdWdobmVzc01hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9BTklTT1RST1BZTUFQCgl1bmlmb3JtIG1hdDMgYW5pc290cm9weU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2QW5pc290cm9weU1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVAKCXVuaWZvcm0gbWF0MyBjbGVhcmNvYXRNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdkNsZWFyY29hdE1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgl1bmlmb3JtIG1hdDMgY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZDbGVhcmNvYXROb3JtYWxNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUAoJdW5pZm9ybSBtYXQzIGNsZWFyY29hdFJvdWdobmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2Q2xlYXJjb2F0Um91Z2huZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQCgl1bmlmb3JtIG1hdDMgc2hlZW5Db2xvck1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2U2hlZW5Db2xvck1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVAKCXVuaWZvcm0gbWF0MyBzaGVlblJvdWdobmVzc01hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2U2hlZW5Sb3VnaG5lc3NNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVAKCXVuaWZvcm0gbWF0MyBpcmlkZXNjZW5jZU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2SXJpZGVzY2VuY2VNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQCgl1bmlmb3JtIG1hdDMgaXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdklyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSTUFQCgl1bmlmb3JtIG1hdDMgc3BlY3VsYXJNYXBUcmFuc2Zvcm07Cgl2YXJ5aW5nIHZlYzIgdlNwZWN1bGFyTWFwVXY7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0NPTE9STUFQCgl1bmlmb3JtIG1hdDMgc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2U3BlY3VsYXJDb2xvck1hcFV2OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAKCXVuaWZvcm0gbWF0MyBzcGVjdWxhckludGVuc2l0eU1hcFRyYW5zZm9ybTsKCXZhcnlpbmcgdmVjMiB2U3BlY3VsYXJJbnRlbnNpdHlNYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQCgl1bmlmb3JtIG1hdDMgdHJhbnNtaXNzaW9uTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZUcmFuc21pc3Npb25NYXBVdjsKI2VuZGlmCiNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQCgl1bmlmb3JtIG1hdDMgdGhpY2tuZXNzTWFwVHJhbnNmb3JtOwoJdmFyeWluZyB2ZWMyIHZUaGlja25lc3NNYXBVdjsKI2VuZGlmYCxQdj1gI2lmIGRlZmluZWQoIFVTRV9VViApIHx8IGRlZmluZWQoIFVTRV9BTklTT1RST1BZICkKCXZVdiA9IHZlYzMoIHV2LCAxICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX01BUAoJdk1hcFV2ID0gKCBtYXBUcmFuc2Zvcm0gKiB2ZWMzKCBNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9BTFBIQU1BUAoJdkFscGhhTWFwVXYgPSAoIGFscGhhTWFwVHJhbnNmb3JtICogdmVjMyggQUxQSEFNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9MSUdIVE1BUAoJdkxpZ2h0TWFwVXYgPSAoIGxpZ2h0TWFwVHJhbnNmb3JtICogdmVjMyggTElHSFRNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9BT01BUAoJdkFvTWFwVXYgPSAoIGFvTWFwVHJhbnNmb3JtICogdmVjMyggQU9NQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9CVU1QTUFQCgl2QnVtcE1hcFV2ID0gKCBidW1wTWFwVHJhbnNmb3JtICogdmVjMyggQlVNUE1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX05PUk1BTE1BUAoJdk5vcm1hbE1hcFV2ID0gKCBub3JtYWxNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBOT1JNQUxNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCXZEaXNwbGFjZW1lbnRNYXBVdiA9ICggZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtICogdmVjMyggRElTUExBQ0VNRU5UTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfRU1JU1NJVkVNQVAKCXZFbWlzc2l2ZU1hcFV2ID0gKCBlbWlzc2l2ZU1hcFRyYW5zZm9ybSAqIHZlYzMoIEVNSVNTSVZFTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmCiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQCgl2TWV0YWxuZXNzTWFwVXYgPSAoIG1ldGFsbmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIE1FVEFMTkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1JPVUdITkVTU01BUAoJdlJvdWdobmVzc01hcFV2ID0gKCByb3VnaG5lc3NNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBST1VHSE5FU1NNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9BTklTT1RST1BZTUFQCgl2QW5pc290cm9weU1hcFV2ID0gKCBhbmlzb3Ryb3B5TWFwVHJhbnNmb3JtICogdmVjMyggQU5JU09UUk9QWU1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVE1BUAoJdkNsZWFyY29hdE1hcFV2ID0gKCBjbGVhcmNvYXRNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBDTEVBUkNPQVRNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQCgl2Q2xlYXJjb2F0Tm9ybWFsTWFwVXYgPSAoIGNsZWFyY29hdE5vcm1hbE1hcFRyYW5zZm9ybSAqIHZlYzMoIENMRUFSQ09BVF9OT1JNQUxNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQCgl2Q2xlYXJjb2F0Um91Z2huZXNzTWFwVXYgPSAoIGNsZWFyY29hdFJvdWdobmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIENMRUFSQ09BVF9ST1VHSE5FU1NNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRU1BUAoJdklyaWRlc2NlbmNlTWFwVXYgPSAoIGlyaWRlc2NlbmNlTWFwVHJhbnNmb3JtICogdmVjMyggSVJJREVTQ0VOQ0VNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAKCXZJcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2ID0gKCBpcmlkZXNjZW5jZVRoaWNrbmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIElSSURFU0NFTkNFX1RISUNLTkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1NIRUVOX0NPTE9STUFQCgl2U2hlZW5Db2xvck1hcFV2ID0gKCBzaGVlbkNvbG9yTWFwVHJhbnNmb3JtICogdmVjMyggU0hFRU5fQ09MT1JNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9TSEVFTl9ST1VHSE5FU1NNQVAKCXZTaGVlblJvdWdobmVzc01hcFV2ID0gKCBzaGVlblJvdWdobmVzc01hcFRyYW5zZm9ybSAqIHZlYzMoIFNIRUVOX1JPVUdITkVTU01BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSTUFQCgl2U3BlY3VsYXJNYXBVdiA9ICggc3BlY3VsYXJNYXBUcmFuc2Zvcm0gKiB2ZWMzKCBTUEVDVUxBUk1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1NQRUNVTEFSX0NPTE9STUFQCgl2U3BlY3VsYXJDb2xvck1hcFV2ID0gKCBzcGVjdWxhckNvbG9yTWFwVHJhbnNmb3JtICogdmVjMyggU1BFQ1VMQVJfQ09MT1JNQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9TUEVDVUxBUl9JTlRFTlNJVFlNQVAKCXZTcGVjdWxhckludGVuc2l0eU1hcFV2ID0gKCBzcGVjdWxhckludGVuc2l0eU1hcFRyYW5zZm9ybSAqIHZlYzMoIFNQRUNVTEFSX0lOVEVOU0lUWU1BUF9VViwgMSApICkueHk7CiNlbmRpZgojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUAoJdlRyYW5zbWlzc2lvbk1hcFV2ID0gKCB0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm0gKiB2ZWMzKCBUUkFOU01JU1NJT05NQVBfVVYsIDEgKSApLnh5OwojZW5kaWYKI2lmZGVmIFVTRV9USElDS05FU1NNQVAKCXZUaGlja25lc3NNYXBVdiA9ICggdGhpY2tuZXNzTWFwVHJhbnNmb3JtICogdmVjMyggVEhJQ0tORVNTTUFQX1VWLCAxICkgKS54eTsKI2VuZGlmYCxMdj1gI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkKCBESVNUQU5DRSApIHx8IGRlZmluZWQgKCBVU0VfU0hBRE9XTUFQICkgfHwgZGVmaW5lZCAoIFVTRV9UUkFOU01JU1NJT04gKSB8fCBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwCgl2ZWM0IHdvcmxkUG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7CgkjaWZkZWYgVVNFX0JBVENISU5HCgkJd29ybGRQb3NpdGlvbiA9IGJhdGNoaW5nTWF0cml4ICogd29ybGRQb3NpdGlvbjsKCSNlbmRpZgoJI2lmZGVmIFVTRV9JTlNUQU5DSU5HCgkJd29ybGRQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogd29ybGRQb3NpdGlvbjsKCSNlbmRpZgoJd29ybGRQb3NpdGlvbiA9IG1vZGVsTWF0cml4ICogd29ybGRQb3NpdGlvbjsKI2VuZGlmYDtjb25zdCAkZT17YWxwaGFoYXNoX2ZyYWdtZW50OlV4LGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50OkR4LGFscGhhbWFwX2ZyYWdtZW50Ok54LGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ6RngsYWxwaGF0ZXN0X2ZyYWdtZW50Ok94LGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50OkJ4LGFvbWFwX2ZyYWdtZW50Onp4LGFvbWFwX3BhcnNfZnJhZ21lbnQ6a3gsYmF0Y2hpbmdfcGFyc192ZXJ0ZXg6R3gsYmF0Y2hpbmdfdmVydGV4OlZ4LGJlZ2luX3ZlcnRleDpIeCxiZWdpbm5vcm1hbF92ZXJ0ZXg6V3gsYnNkZnM6WHgsaXJpZGVzY2VuY2VfZnJhZ21lbnQ6cXgsYnVtcG1hcF9wYXJzX2ZyYWdtZW50OiR4LGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudDpZeCxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudDpaeCxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg6SngsY2xpcHBpbmdfcGxhbmVzX3ZlcnRleDpLeCxjb2xvcl9mcmFnbWVudDpReCxjb2xvcl9wYXJzX2ZyYWdtZW50Omp4LGNvbG9yX3BhcnNfdmVydGV4OmV5LGNvbG9yX3ZlcnRleDp0eSxjb21tb246bnksY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50Oml5LGRlZmF1bHRub3JtYWxfdmVydGV4OnJ5LGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDpzeSxkaXNwbGFjZW1lbnRtYXBfdmVydGV4OmF5LGVtaXNzaXZlbWFwX2ZyYWdtZW50Om95LGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6bHksY29sb3JzcGFjZV9mcmFnbWVudDpjeSxjb2xvcnNwYWNlX3BhcnNfZnJhZ21lbnQ6aHksZW52bWFwX2ZyYWdtZW50OnV5LGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudDpmeSxlbnZtYXBfcGFyc19mcmFnbWVudDpkeSxlbnZtYXBfcGFyc192ZXJ0ZXg6cHksZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6QXksZW52bWFwX3ZlcnRleDpteSxmb2dfdmVydGV4Omd5LGZvZ19wYXJzX3ZlcnRleDpfeSxmb2dfZnJhZ21lbnQ6eHksZm9nX3BhcnNfZnJhZ21lbnQ6eXksZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDp2eSxsaWdodG1hcF9mcmFnbWVudDpNeSxsaWdodG1hcF9wYXJzX2ZyYWdtZW50OlN5LGxpZ2h0c19sYW1iZXJ0X2ZyYWdtZW50OmJ5LGxpZ2h0c19sYW1iZXJ0X3BhcnNfZnJhZ21lbnQ6d3ksbGlnaHRzX3BhcnNfYmVnaW46RXksbGlnaHRzX3Rvb25fZnJhZ21lbnQ6VHksbGlnaHRzX3Rvb25fcGFyc19mcmFnbWVudDpDeSxsaWdodHNfcGhvbmdfZnJhZ21lbnQ6UnksbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6UHksbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50Okx5LGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50Okl5LGxpZ2h0c19mcmFnbWVudF9iZWdpbjpVeSxsaWdodHNfZnJhZ21lbnRfbWFwczpEeSxsaWdodHNfZnJhZ21lbnRfZW5kOk55LGxvZ2RlcHRoYnVmX2ZyYWdtZW50OkZ5LGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ6T3ksbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6QnksbG9nZGVwdGhidWZfdmVydGV4Onp5LG1hcF9mcmFnbWVudDpreSxtYXBfcGFyc19mcmFnbWVudDpHeSxtYXBfcGFydGljbGVfZnJhZ21lbnQ6VnksbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ6SHksbWV0YWxuZXNzbWFwX2ZyYWdtZW50Old5LG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50Olh5LG1vcnBoY29sb3JfdmVydGV4OnF5LG1vcnBobm9ybWFsX3ZlcnRleDokeSxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleDpZeSxtb3JwaHRhcmdldF92ZXJ0ZXg6Wnksbm9ybWFsX2ZyYWdtZW50X2JlZ2luOkp5LG5vcm1hbF9mcmFnbWVudF9tYXBzOkt5LG5vcm1hbF9wYXJzX2ZyYWdtZW50OlF5LG5vcm1hbF9wYXJzX3ZlcnRleDpqeSxub3JtYWxfdmVydGV4OmV2LG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OnR2LGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW46bnYsY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzOml2LGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50OnJ2LGlyaWRlc2NlbmNlX3BhcnNfZnJhZ21lbnQ6c3Ysb3BhcXVlX2ZyYWdtZW50OmF2LHBhY2tpbmc6b3YscHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDpsdixwcm9qZWN0X3ZlcnRleDpjdixkaXRoZXJpbmdfZnJhZ21lbnQ6aHYsZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ6dXYscm91Z2huZXNzbWFwX2ZyYWdtZW50OmZ2LHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OmR2LHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50OnB2LHNoYWRvd21hcF9wYXJzX3ZlcnRleDptdixzaGFkb3dtYXBfdmVydGV4Omd2LHNoYWRvd21hc2tfcGFyc19mcmFnbWVudDpfdixza2luYmFzZV92ZXJ0ZXg6eHYsc2tpbm5pbmdfcGFyc192ZXJ0ZXg6eXYsc2tpbm5pbmdfdmVydGV4OnZ2LHNraW5ub3JtYWxfdmVydGV4Ok12LHNwZWN1bGFybWFwX2ZyYWdtZW50OlN2LHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ6YnYsdG9uZW1hcHBpbmdfZnJhZ21lbnQ6d3YsdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDpFdix0cmFuc21pc3Npb25fZnJhZ21lbnQ6QXYsdHJhbnNtaXNzaW9uX3BhcnNfZnJhZ21lbnQ6VHYsdXZfcGFyc19mcmFnbWVudDpDdix1dl9wYXJzX3ZlcnRleDpSdix1dl92ZXJ0ZXg6UHYsd29ybGRwb3NfdmVydGV4Okx2LGJhY2tncm91bmRfdmVydDpgdmFyeWluZyB2ZWMyIHZVdjsKdW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtOwp2b2lkIG1haW4oKSB7Cgl2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5OwoJZ2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbi54eSwgMS4wLCAxLjAgKTsKfWAsYmFja2dyb3VuZF9mcmFnOmB1bmlmb3JtIHNhbXBsZXIyRCB0MkQ7CnVuaWZvcm0gZmxvYXQgYmFja2dyb3VuZEludGVuc2l0eTsKdmFyeWluZyB2ZWMyIHZVdjsKdm9pZCBtYWluKCkgewoJdmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCggdDJELCB2VXYgKTsKCSNpZmRlZiBERUNPREVfVklERU9fVEVYVFVSRQoJCXRleENvbG9yID0gdmVjNCggbWl4KCBwb3coIHRleENvbG9yLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQgKSApLCB0ZXhDb2xvci5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHRleENvbG9yLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB0ZXhDb2xvci53ICk7CgkjZW5kaWYKCXRleENvbG9yLnJnYiAqPSBiYWNrZ3JvdW5kSW50ZW5zaXR5OwoJZ2xfRnJhZ0NvbG9yID0gdGV4Q29sb3I7CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KfWAsYmFja2dyb3VuZEN1YmVfdmVydDpgdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTsKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CglnbF9Qb3NpdGlvbi56ID0gZ2xfUG9zaXRpb24udzsKfWAsYmFja2dyb3VuZEN1YmVfZnJhZzpgI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkUKCXVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwOwojZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWICkKCXVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDsKI2VuZGlmCnVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDsKdW5pZm9ybSBmbG9hdCBiYWNrZ3JvdW5kQmx1cnJpbmVzczsKdW5pZm9ybSBmbG9hdCBiYWNrZ3JvdW5kSW50ZW5zaXR5Owp2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwojaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRQoJCXZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogdldvcmxkRGlyZWN0aW9uLngsIHZXb3JsZERpcmVjdGlvbi55eiApICk7CgkjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWICkKCQl2ZWM0IHRleENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCB2V29ybGREaXJlY3Rpb24sIGJhY2tncm91bmRCbHVycmluZXNzICk7CgkjZWxzZQoJCXZlYzQgdGV4Q29sb3IgPSB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsKCSNlbmRpZgoJdGV4Q29sb3IucmdiICo9IGJhY2tncm91bmRJbnRlbnNpdHk7CglnbF9GcmFnQ29sb3IgPSB0ZXhDb2xvcjsKCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50Pgp9YCxjdWJlX3ZlcnQ6YHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247CiNpbmNsdWRlIDxjb21tb24+CnZvaWQgbWFpbigpIHsKCXZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJZ2xfUG9zaXRpb24ueiA9IGdsX1Bvc2l0aW9uLnc7Cn1gLGN1YmVfZnJhZzpgdW5pZm9ybSBzYW1wbGVyQ3ViZSB0Q3ViZTsKdW5pZm9ybSBmbG9hdCB0RmxpcDsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5Owp2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uOwp2b2lkIG1haW4oKSB7Cgl2ZWM0IHRleENvbG9yID0gdGV4dHVyZUN1YmUoIHRDdWJlLCB2ZWMzKCB0RmxpcCAqIHZXb3JsZERpcmVjdGlvbi54LCB2V29ybGREaXJlY3Rpb24ueXogKSApOwoJZ2xfRnJhZ0NvbG9yID0gdGV4Q29sb3I7CglnbF9GcmFnQ29sb3IuYSAqPSBvcGFjaXR5OwoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+Cn1gLGRlcHRoX3ZlcnQ6YCNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2YXJ5aW5nIHZlYzIgdkhpZ2hQcmVjaXNpb25aVzsKdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVAKCQkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2VuZGlmCgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZIaWdoUHJlY2lzaW9uWlcgPSBnbF9Qb3NpdGlvbi56dzsKfWAsZGVwdGhfZnJhZzpgI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMAoJdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojZW5kaWYKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4KdmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApOwoJI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMAoJCWRpZmZ1c2VDb2xvci5hID0gb3BhY2l0eTsKCSNlbmRpZgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJZmxvYXQgZnJhZ0Nvb3JkWiA9IDAuNSAqIHZIaWdoUHJlY2lzaW9uWldbMF0gLyB2SGlnaFByZWNpc2lvblpXWzFdICsgMC41OwoJI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMAoJCWdsX0ZyYWdDb2xvciA9IHZlYzQoIHZlYzMoIDEuMCAtIGZyYWdDb29yZFogKSwgb3BhY2l0eSApOwoJI2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAxCgkJZ2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBmcmFnQ29vcmRaICk7CgkjZW5kaWYKfWAsZGlzdGFuY2VSR0JBX3ZlcnQ6YCNkZWZpbmUgRElTVEFOQ0UKdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD4KCSNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQCgkJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PgoJCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCSNlbmRpZgoJI2luY2x1ZGUgPGJlZ2luX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PgoJI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+Cgl2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6Owp9YCxkaXN0YW5jZVJHQkFfZnJhZzpgI2RlZmluZSBESVNUQU5DRQp1bmlmb3JtIHZlYzMgcmVmZXJlbmNlUG9zaXRpb247CnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlOwp1bmlmb3JtIGZsb2F0IGZhckRpc3RhbmNlOwp2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD4Kdm9pZCBtYWluICgpIHsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApOwoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJZmxvYXQgZGlzdCA9IGxlbmd0aCggdldvcmxkUG9zaXRpb24gLSByZWZlcmVuY2VQb3NpdGlvbiApOwoJZGlzdCA9ICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApOwoJZGlzdCA9IHNhdHVyYXRlKCBkaXN0ICk7CglnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGRpc3QgKTsKfWAsZXF1aXJlY3RfdmVydDpgdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTsKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+Cn1gLGVxdWlyZWN0X2ZyYWc6YHVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDsKdmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4Kdm9pZCBtYWluKCkgewoJdmVjMyBkaXJlY3Rpb24gPSBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApOwoJdmVjMiBzYW1wbGVVViA9IGVxdWlyZWN0VXYoIGRpcmVjdGlvbiApOwoJZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KfWAsbGluZWRhc2hlZF92ZXJ0OmB1bmlmb3JtIGZsb2F0IHNjYWxlOwphdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlOwp2YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJdkxpbmVEaXN0YW5jZSA9IHNjYWxlICogbGluZURpc3RhbmNlOwoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxsaW5lZGFzaGVkX2ZyYWc6YHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7CnVuaWZvcm0gZmxvYXQgdG90YWxTaXplOwp2YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+CglpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgPiBkYXNoU2l6ZSApIHsKCQlkaXNjYXJkOwoJfQoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CglvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjsKCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KfWAsbWVzaGJhc2ljX3ZlcnQ6YCNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxiYXRjaGluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PgoJI2luY2x1ZGUgPGJhdGNoaW5nX3ZlcnRleD4KCSNpZiBkZWZpbmVkICggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQgKCBVU0VfU0tJTk5JTkcgKQoJCSNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+CgkJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJCSNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD4KCQkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjZW5kaWYKCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4Pgp9YCxtZXNoYmFzaWNfZnJhZzpgdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2lmbmRlZiBGTEFUX1NIQURFRAoJdmFyeWluZyB2ZWMzIHZOb3JtYWw7CiNlbmRpZgojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJI2lmZGVmIFVTRV9MSUdIVE1BUAoJCXZlYzQgbGlnaHRNYXBUZXhlbCA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZMaWdodE1hcFV2ICk7CgkJcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGxpZ2h0TWFwVGV4ZWwucmdiICogbGlnaHRNYXBJbnRlbnNpdHkgKiBSRUNJUFJPQ0FMX1BJOwoJI2Vsc2UKCQlyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7CgkjZW5kaWYKCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBkaWZmdXNlQ29sb3IucmdiOwoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlOwoJI2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KCSNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+Cn1gLG1lc2hsYW1iZXJ0X3ZlcnQ6YCNkZWZpbmUgTEFNQkVSVAp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsbWVzaGxhbWJlcnRfZnJhZzpgI2RlZmluZSBMQU1CRVJUCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxic2Rmcz4KI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD4KCSNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD4KCXZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7CgkjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD4KfWAsbWVzaG1hdGNhcF92ZXJ0OmAjZGVmaW5lIE1BVENBUAp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDxmb2dfdmVydGV4PgoJdlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7Cn1gLG1lc2htYXRjYXBfZnJhZzpgI2RlZmluZSBNQVRDQVAKdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKdW5pZm9ybSBzYW1wbGVyMkQgbWF0Y2FwOwp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYWhhc2hfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPgoJdmVjMyB2aWV3RGlyID0gbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7Cgl2ZWMzIHggPSBub3JtYWxpemUoIHZlYzMoIHZpZXdEaXIueiwgMC4wLCAtIHZpZXdEaXIueCApICk7Cgl2ZWMzIHkgPSBjcm9zcyggdmlld0RpciwgeCApOwoJdmVjMiB1diA9IHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41OwoJI2lmZGVmIFVTRV9NQVRDQVAKCQl2ZWM0IG1hdGNhcENvbG9yID0gdGV4dHVyZTJEKCBtYXRjYXAsIHV2ICk7CgkjZWxzZQoJCXZlYzQgbWF0Y2FwQ29sb3IgPSB2ZWM0KCB2ZWMzKCBtaXgoIDAuMiwgMC44LCB1di55ICkgKSwgMS4wICk7CgkjZW5kaWYKCXZlYzMgb3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2IgKiBtYXRjYXBDb2xvci5yZ2I7CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Pgp9YCxtZXNobm9ybWFsX3ZlcnQ6YCNkZWZpbmUgTk9STUFMCiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKQoJdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNlbmRpZgojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgojaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFICkKCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwojZW5kaWYKfWAsbWVzaG5vcm1hbF9mcmFnOmAjZGVmaW5lIE5PUk1BTAp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUF9UQU5HRU5UU1BBQ0UgKQoJdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNlbmRpZgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCWdsX0ZyYWdDb2xvciA9IHZlYzQoIHBhY2tOb3JtYWxUb1JHQiggbm9ybWFsICksIG9wYWNpdHkgKTsKCSNpZmRlZiBPUEFRVUUKCQlnbF9GcmFnQ29sb3IuYSA9IDEuMDsKCSNlbmRpZgp9YCxtZXNocGhvbmdfdmVydDpgI2RlZmluZSBQSE9ORwp2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsbWVzaHBob25nX2ZyYWc6YCNkZWZpbmUgUEhPTkcKdW5pZm9ybSB2ZWMzIGRpZmZ1c2U7CnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTsKdW5pZm9ybSB2ZWMzIHNwZWN1bGFyOwp1bmlmb3JtIGZsb2F0IHNoaW5pbmVzczsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8cGFja2luZz4KI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCVJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7Cgl2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfcGhvbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+CgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxvcGFxdWVfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JzcGFjZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD4KCSNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+Cn1gLG1lc2hwaHlzaWNhbF92ZXJ0OmAjZGVmaW5lIFNUQU5EQVJECnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojaWZkZWYgVVNFX1RSQU5TTUlTU0lPTgoJdmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uOwojZW5kaWYKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGJhdGNoaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4Kdm9pZCBtYWluKCkgewoJI2luY2x1ZGUgPHV2X3ZlcnRleD4KCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmF0Y2hpbmdfdmVydGV4PgoJI2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCXZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6OwoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+CiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OCgl2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6OwojZW5kaWYKfWAsbWVzaHBoeXNpY2FsX2ZyYWc6YCNkZWZpbmUgU1RBTkRBUkQKI2lmZGVmIFBIWVNJQ0FMCgkjZGVmaW5lIElPUgoJI2RlZmluZSBVU0VfU1BFQ1VMQVIKI2VuZGlmCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzOwp1bmlmb3JtIGZsb2F0IG1ldGFsbmVzczsKdW5pZm9ybSBmbG9hdCBvcGFjaXR5OwojaWZkZWYgSU9SCgl1bmlmb3JtIGZsb2F0IGlvcjsKI2VuZGlmCiNpZmRlZiBVU0VfU1BFQ1VMQVIKCXVuaWZvcm0gZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHk7Cgl1bmlmb3JtIHZlYzMgc3BlY3VsYXJDb2xvcjsKCSNpZmRlZiBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhckNvbG9yTWFwOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFySW50ZW5zaXR5TWFwOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0NMRUFSQ09BVAoJdW5pZm9ybSBmbG9hdCBjbGVhcmNvYXQ7Cgl1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzczsKI2VuZGlmCiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0UKCXVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2U7Cgl1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlSU9SOwoJdW5pZm9ybSBmbG9hdCBpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW07Cgl1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTsKI2VuZGlmCiNpZmRlZiBVU0VfU0hFRU4KCXVuaWZvcm0gdmVjMyBzaGVlbkNvbG9yOwoJdW5pZm9ybSBmbG9hdCBzaGVlblJvdWdobmVzczsKCSNpZmRlZiBVU0VfU0hFRU5fQ09MT1JNQVAKCQl1bmlmb3JtIHNhbXBsZXIyRCBzaGVlbkNvbG9yTWFwOwoJI2VuZGlmCgkjaWZkZWYgVVNFX1NIRUVOX1JPVUdITkVTU01BUAoJCXVuaWZvcm0gc2FtcGxlcjJEIHNoZWVuUm91Z2huZXNzTWFwOwoJI2VuZGlmCiNlbmRpZgojaWZkZWYgVVNFX0FOSVNPVFJPUFkKCXVuaWZvcm0gdmVjMiBhbmlzb3Ryb3B5VmVjdG9yOwoJI2lmZGVmIFVTRV9BTklTT1RST1BZTUFQCgkJdW5pZm9ybSBzYW1wbGVyMkQgYW5pc290cm9weU1hcDsKCSNlbmRpZgojZW5kaWYKdmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxwYWNraW5nPgojaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGFoYXNoX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxpcmlkZXNjZW5jZV9mcmFnbWVudD4KI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj4KI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx0cmFuc21pc3Npb25fcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxjbGVhcmNvYXRfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGlyaWRlc2NlbmNlX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJdmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bWV0YWxuZXNzbWFwX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwcz4KCSNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD4KCSNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+CgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+Cgl2ZWMzIHRvdGFsRGlmZnVzZSA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7Cgl2ZWMzIHRvdGFsU3BlY3VsYXIgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXI7CgkjaW5jbHVkZSA8dHJhbnNtaXNzaW9uX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gdG90YWxEaWZmdXNlICsgdG90YWxTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTsKCSNpZmRlZiBVU0VfU0hFRU4KCQlmbG9hdCBzaGVlbkVuZXJneUNvbXAgPSAxLjAgLSAwLjE1NyAqIG1heDMoIG1hdGVyaWFsLnNoZWVuQ29sb3IgKTsKCQlvdXRnb2luZ0xpZ2h0ID0gb3V0Z29pbmdMaWdodCAqIHNoZWVuRW5lcmd5Q29tcCArIHNoZWVuU3BlY3VsYXJEaXJlY3QgKyBzaGVlblNwZWN1bGFySW5kaXJlY3Q7CgkjZW5kaWYKCSNpZmRlZiBVU0VfQ0xFQVJDT0FUCgkJZmxvYXQgZG90TlZjYyA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Q2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeVZpZXdEaXIgKSApOwoJCXZlYzMgRmNjID0gRl9TY2hsaWNrKCBtYXRlcmlhbC5jbGVhcmNvYXRGMCwgbWF0ZXJpYWwuY2xlYXJjb2F0RjkwLCBkb3ROVmNjICk7CgkJb3V0Z29pbmdMaWdodCA9IG91dGdvaW5nTGlnaHQgKiAoIDEuMCAtIG1hdGVyaWFsLmNsZWFyY29hdCAqIEZjYyApICsgKCBjbGVhcmNvYXRTcGVjdWxhckRpcmVjdCArIGNsZWFyY29hdFNwZWN1bGFySW5kaXJlY3QgKSAqIG1hdGVyaWFsLmNsZWFyY29hdDsKCSNlbmRpZgoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD4KfWAsbWVzaHRvb25fdmVydDpgI2RlZmluZSBUT09OCnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uOwojaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8dXZfdmVydGV4PgoJI2luY2x1ZGUgPGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD4KCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PgoJI2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD4KCSNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PgoJI2luY2x1ZGUgPHByb2plY3RfdmVydGV4PgoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD4KCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PgoJdlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7CgkjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PgoJI2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsbWVzaHRvb25fZnJhZzpgI2RlZmluZSBUT09OCnVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIHZlYzMgZW1pc3NpdmU7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7CglSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApOwoJdmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCSNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+CgkjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+CgkjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX3Rvb25fZnJhZ21lbnQ+CgkjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPgoJI2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+CgkjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlOwoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD4KfWAscG9pbnRzX3ZlcnQ6YHVuaWZvcm0gZmxvYXQgc2l6ZTsKdW5pZm9ybSBmbG9hdCBzY2FsZTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD4KI2lmZGVmIFVTRV9QT0lOVFNfVVYKCXZhcnlpbmcgdmVjMiB2VXY7Cgl1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07CiNlbmRpZgp2b2lkIG1haW4oKSB7CgkjaWZkZWYgVVNFX1BPSU5UU19VVgoJCXZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7CgkjZW5kaWYKCSNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4KCWdsX1BvaW50U2l6ZSA9IHNpemU7CgkjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTgoJCWJvb2wgaXNQZXJzcGVjdGl2ZSA9IGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKTsKCQlpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKj0gKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7CgkjZW5kaWYKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD4KCSNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAscG9pbnRzX2ZyYWc6YHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGFscGhhaGFzaF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+Cgl2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTsKCXZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApOwoJI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PgoJI2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD4KCSNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFoYXNoX2ZyYWdtZW50PgoJb3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7CgkjaW5jbHVkZSA8b3BhcXVlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+Cn1gLHNoYWRvd192ZXJ0OmAjaW5jbHVkZSA8Y29tbW9uPgojaW5jbHVkZSA8YmF0Y2hpbmdfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD4KI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxiYXRjaGluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD4KCSNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+CgkjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+CgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PgoJI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD4KCSNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+CgkjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD4KCSNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PgoJI2luY2x1ZGUgPGZvZ192ZXJ0ZXg+Cn1gLHNoYWRvd19mcmFnOmB1bmlmb3JtIHZlYzMgY29sb3I7CnVuaWZvcm0gZmxvYXQgb3BhY2l0eTsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHBhY2tpbmc+CiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGJzZGZzPgojaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+CiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCWdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApOwoJI2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGNvbG9yc3BhY2VfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Pgp9YCxzcHJpdGVfdmVydDpgdW5pZm9ybSBmbG9hdCByb3RhdGlvbjsKdW5pZm9ybSB2ZWMyIGNlbnRlcjsKI2luY2x1ZGUgPGNvbW1vbj4KI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PgojaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+CiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+CnZvaWQgbWFpbigpIHsKCSNpbmNsdWRlIDx1dl92ZXJ0ZXg+Cgl2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsKCXZlYzIgc2NhbGU7CglzY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLngsIG1vZGVsTWF0cml4WyAwIF0ueSwgbW9kZWxNYXRyaXhbIDAgXS56ICkgKTsKCXNjYWxlLnkgPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueCwgbW9kZWxNYXRyaXhbIDEgXS55LCBtb2RlbE1hdHJpeFsgMSBdLnogKSApOwoJI2lmbmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OCgkJYm9vbCBpc1BlcnNwZWN0aXZlID0gaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApOwoJCWlmICggaXNQZXJzcGVjdGl2ZSApIHNjYWxlICo9IC0gbXZQb3NpdGlvbi56OwoJI2VuZGlmCgl2ZWMyIGFsaWduZWRQb3NpdGlvbiA9ICggcG9zaXRpb24ueHkgLSAoIGNlbnRlciAtIHZlYzIoIDAuNSApICkgKSAqIHNjYWxlOwoJdmVjMiByb3RhdGVkUG9zaXRpb247Cglyb3RhdGVkUG9zaXRpb24ueCA9IGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54IC0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7Cglyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7CgltdlBvc2l0aW9uLnh5ICs9IHJvdGF0ZWRQb3NpdGlvbjsKCWdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247CgkjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PgoJI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+CgkjaW5jbHVkZSA8Zm9nX3ZlcnRleD4KfWAsc3ByaXRlX2ZyYWc6YHVuaWZvcm0gdmVjMyBkaWZmdXNlOwp1bmlmb3JtIGZsb2F0IG9wYWNpdHk7CiNpbmNsdWRlIDxjb21tb24+CiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+CiNpbmNsdWRlIDxhbHBoYWhhc2hfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PgojaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD4KI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Pgp2b2lkIG1haW4oKSB7CgkjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PgoJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7Cgl2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTsKCSNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD4KCSNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+CgkjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PgoJI2luY2x1ZGUgPGFscGhhaGFzaF9mcmFnbWVudD4KCW91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiOwoJI2luY2x1ZGUgPG9wYXF1ZV9mcmFnbWVudD4KCSNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD4KCSNpbmNsdWRlIDxjb2xvcnNwYWNlX2ZyYWdtZW50PgoJI2luY2x1ZGUgPGZvZ19mcmFnbWVudD4KfWB9LF9lPXtjb21tb246e2RpZmZ1c2U6e3ZhbHVlOm5ldyB5ZSgxNjc3NzIxNSl9LG9wYWNpdHk6e3ZhbHVlOjF9LG1hcDp7dmFsdWU6bnVsbH0sbWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGFscGhhTWFwOnt2YWx1ZTpudWxsfSxhbHBoYU1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfSxhbHBoYVRlc3Q6e3ZhbHVlOjB9fSxzcGVjdWxhcm1hcDp7c3BlY3VsYXJNYXA6e3ZhbHVlOm51bGx9LHNwZWN1bGFyTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9fSxlbnZtYXA6e2Vudk1hcDp7dmFsdWU6bnVsbH0sZmxpcEVudk1hcDp7dmFsdWU6LTF9LHJlZmxlY3Rpdml0eTp7dmFsdWU6MX0saW9yOnt2YWx1ZToxLjV9LHJlZnJhY3Rpb25SYXRpbzp7dmFsdWU6Ljk4fX0sYW9tYXA6e2FvTWFwOnt2YWx1ZTpudWxsfSxhb01hcEludGVuc2l0eTp7dmFsdWU6MX0sYW9NYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBaZX19LGxpZ2h0bWFwOntsaWdodE1hcDp7dmFsdWU6bnVsbH0sbGlnaHRNYXBJbnRlbnNpdHk6e3ZhbHVlOjF9LGxpZ2h0TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9fSxidW1wbWFwOntidW1wTWFwOnt2YWx1ZTpudWxsfSxidW1wTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGJ1bXBTY2FsZTp7dmFsdWU6MX19LG5vcm1hbG1hcDp7bm9ybWFsTWFwOnt2YWx1ZTpudWxsfSxub3JtYWxNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBaZX0sbm9ybWFsU2NhbGU6e3ZhbHVlOm5ldyBxKDEsMSl9fSxkaXNwbGFjZW1lbnRtYXA6e2Rpc3BsYWNlbWVudE1hcDp7dmFsdWU6bnVsbH0sZGlzcGxhY2VtZW50TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGRpc3BsYWNlbWVudFNjYWxlOnt2YWx1ZToxfSxkaXNwbGFjZW1lbnRCaWFzOnt2YWx1ZTowfX0sZW1pc3NpdmVtYXA6e2VtaXNzaXZlTWFwOnt2YWx1ZTpudWxsfSxlbWlzc2l2ZU1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfX0sbWV0YWxuZXNzbWFwOnttZXRhbG5lc3NNYXA6e3ZhbHVlOm51bGx9LG1ldGFsbmVzc01hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfX0scm91Z2huZXNzbWFwOntyb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9LHJvdWdobmVzc01hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfX0sZ3JhZGllbnRtYXA6e2dyYWRpZW50TWFwOnt2YWx1ZTpudWxsfX0sZm9nOntmb2dEZW5zaXR5Ont2YWx1ZToyNWUtNX0sZm9nTmVhcjp7dmFsdWU6MX0sZm9nRmFyOnt2YWx1ZToyZTN9LGZvZ0NvbG9yOnt2YWx1ZTpuZXcgeWUoMTY3NzcyMTUpfX0sbGlnaHRzOnthbWJpZW50TGlnaHRDb2xvcjp7dmFsdWU6W119LGxpZ2h0UHJvYmU6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LGNvbG9yOnt9fX0sZGlyZWN0aW9uYWxMaWdodFNoYWRvd3M6e3ZhbHVlOltdLHByb3BlcnRpZXM6e3NoYWRvd0JpYXM6e30sc2hhZG93Tm9ybWFsQmlhczp7fSxzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LGRpcmVjdGlvbmFsU2hhZG93TWFwOnt2YWx1ZTpbXX0sZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxzcG90TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSxkaXJlY3Rpb246e30sZGlzdGFuY2U6e30sY29uZUNvczp7fSxwZW51bWJyYUNvczp7fSxkZWNheTp7fX19LHNwb3RMaWdodFNoYWRvd3M6e3ZhbHVlOltdLHByb3BlcnRpZXM6e3NoYWRvd0JpYXM6e30sc2hhZG93Tm9ybWFsQmlhczp7fSxzaGFkb3dSYWRpdXM6e30sc2hhZG93TWFwU2l6ZTp7fX19LHNwb3RMaWdodE1hcDp7dmFsdWU6W119LHNwb3RTaGFkb3dNYXA6e3ZhbHVlOltdfSxzcG90TGlnaHRNYXRyaXg6e3ZhbHVlOltdfSxwb2ludExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sZGVjYXk6e30sZGlzdGFuY2U6e319fSxwb2ludExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9LHNoYWRvd0NhbWVyYU5lYXI6e30sc2hhZG93Q2FtZXJhRmFyOnt9fX0scG9pbnRTaGFkb3dNYXA6e3ZhbHVlOltdfSxwb2ludFNoYWRvd01hdHJpeDp7dmFsdWU6W119LGhlbWlzcGhlcmVMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2RpcmVjdGlvbjp7fSxza3lDb2xvcjp7fSxncm91bmRDb2xvcjp7fX19LHJlY3RBcmVhTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSx3aWR0aDp7fSxoZWlnaHQ6e319fSxsdGNfMTp7dmFsdWU6bnVsbH0sbHRjXzI6e3ZhbHVlOm51bGx9fSxwb2ludHM6e2RpZmZ1c2U6e3ZhbHVlOm5ldyB5ZSgxNjc3NzIxNSl9LG9wYWNpdHk6e3ZhbHVlOjF9LHNpemU6e3ZhbHVlOjF9LHNjYWxlOnt2YWx1ZToxfSxtYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwOnt2YWx1ZTpudWxsfSxhbHBoYU1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfSxhbHBoYVRlc3Q6e3ZhbHVlOjB9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9fSxzcHJpdGU6e2RpZmZ1c2U6e3ZhbHVlOm5ldyB5ZSgxNjc3NzIxNSl9LG9wYWNpdHk6e3ZhbHVlOjF9LGNlbnRlcjp7dmFsdWU6bmV3IHEoLjUsLjUpfSxyb3RhdGlvbjp7dmFsdWU6MH0sbWFwOnt2YWx1ZTpudWxsfSxtYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBaZX0sYWxwaGFNYXA6e3ZhbHVlOm51bGx9LGFscGhhTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGFscGhhVGVzdDp7dmFsdWU6MH19fSxObj17YmFzaWM6e3VuaWZvcm1zOlp0KFtfZS5jb21tb24sX2Uuc3BlY3VsYXJtYXAsX2UuZW52bWFwLF9lLmFvbWFwLF9lLmxpZ2h0bWFwLF9lLmZvZ10pLHZlcnRleFNoYWRlcjokZS5tZXNoYmFzaWNfdmVydCxmcmFnbWVudFNoYWRlcjokZS5tZXNoYmFzaWNfZnJhZ30sbGFtYmVydDp7dW5pZm9ybXM6WnQoW19lLmNvbW1vbixfZS5zcGVjdWxhcm1hcCxfZS5lbnZtYXAsX2UuYW9tYXAsX2UubGlnaHRtYXAsX2UuZW1pc3NpdmVtYXAsX2UuYnVtcG1hcCxfZS5ub3JtYWxtYXAsX2UuZGlzcGxhY2VtZW50bWFwLF9lLmZvZyxfZS5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgeWUoMCl9fV0pLHZlcnRleFNoYWRlcjokZS5tZXNobGFtYmVydF92ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLm1lc2hsYW1iZXJ0X2ZyYWd9LHBob25nOnt1bmlmb3JtczpadChbX2UuY29tbW9uLF9lLnNwZWN1bGFybWFwLF9lLmVudm1hcCxfZS5hb21hcCxfZS5saWdodG1hcCxfZS5lbWlzc2l2ZW1hcCxfZS5idW1wbWFwLF9lLm5vcm1hbG1hcCxfZS5kaXNwbGFjZW1lbnRtYXAsX2UuZm9nLF9lLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyB5ZSgwKX0sc3BlY3VsYXI6e3ZhbHVlOm5ldyB5ZSgxMTE4NDgxKX0sc2hpbmluZXNzOnt2YWx1ZTozMH19XSksdmVydGV4U2hhZGVyOiRlLm1lc2hwaG9uZ192ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLm1lc2hwaG9uZ19mcmFnfSxzdGFuZGFyZDp7dW5pZm9ybXM6WnQoW19lLmNvbW1vbixfZS5lbnZtYXAsX2UuYW9tYXAsX2UubGlnaHRtYXAsX2UuZW1pc3NpdmVtYXAsX2UuYnVtcG1hcCxfZS5ub3JtYWxtYXAsX2UuZGlzcGxhY2VtZW50bWFwLF9lLnJvdWdobmVzc21hcCxfZS5tZXRhbG5lc3NtYXAsX2UuZm9nLF9lLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyB5ZSgwKX0scm91Z2huZXNzOnt2YWx1ZToxfSxtZXRhbG5lc3M6e3ZhbHVlOjB9LGVudk1hcEludGVuc2l0eTp7dmFsdWU6MX19XSksdmVydGV4U2hhZGVyOiRlLm1lc2hwaHlzaWNhbF92ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLm1lc2hwaHlzaWNhbF9mcmFnfSx0b29uOnt1bmlmb3JtczpadChbX2UuY29tbW9uLF9lLmFvbWFwLF9lLmxpZ2h0bWFwLF9lLmVtaXNzaXZlbWFwLF9lLmJ1bXBtYXAsX2Uubm9ybWFsbWFwLF9lLmRpc3BsYWNlbWVudG1hcCxfZS5ncmFkaWVudG1hcCxfZS5mb2csX2UubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IHllKDApfX1dKSx2ZXJ0ZXhTaGFkZXI6JGUubWVzaHRvb25fdmVydCxmcmFnbWVudFNoYWRlcjokZS5tZXNodG9vbl9mcmFnfSxtYXRjYXA6e3VuaWZvcm1zOlp0KFtfZS5jb21tb24sX2UuYnVtcG1hcCxfZS5ub3JtYWxtYXAsX2UuZGlzcGxhY2VtZW50bWFwLF9lLmZvZyx7bWF0Y2FwOnt2YWx1ZTpudWxsfX1dKSx2ZXJ0ZXhTaGFkZXI6JGUubWVzaG1hdGNhcF92ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLm1lc2htYXRjYXBfZnJhZ30scG9pbnRzOnt1bmlmb3JtczpadChbX2UucG9pbnRzLF9lLmZvZ10pLHZlcnRleFNoYWRlcjokZS5wb2ludHNfdmVydCxmcmFnbWVudFNoYWRlcjokZS5wb2ludHNfZnJhZ30sZGFzaGVkOnt1bmlmb3JtczpadChbX2UuY29tbW9uLF9lLmZvZyx7c2NhbGU6e3ZhbHVlOjF9LGRhc2hTaXplOnt2YWx1ZToxfSx0b3RhbFNpemU6e3ZhbHVlOjJ9fV0pLHZlcnRleFNoYWRlcjokZS5saW5lZGFzaGVkX3ZlcnQsZnJhZ21lbnRTaGFkZXI6JGUubGluZWRhc2hlZF9mcmFnfSxkZXB0aDp7dW5pZm9ybXM6WnQoW19lLmNvbW1vbixfZS5kaXNwbGFjZW1lbnRtYXBdKSx2ZXJ0ZXhTaGFkZXI6JGUuZGVwdGhfdmVydCxmcmFnbWVudFNoYWRlcjokZS5kZXB0aF9mcmFnfSxub3JtYWw6e3VuaWZvcm1zOlp0KFtfZS5jb21tb24sX2UuYnVtcG1hcCxfZS5ub3JtYWxtYXAsX2UuZGlzcGxhY2VtZW50bWFwLHtvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6JGUubWVzaG5vcm1hbF92ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLm1lc2hub3JtYWxfZnJhZ30sc3ByaXRlOnt1bmlmb3JtczpadChbX2Uuc3ByaXRlLF9lLmZvZ10pLHZlcnRleFNoYWRlcjokZS5zcHJpdGVfdmVydCxmcmFnbWVudFNoYWRlcjokZS5zcHJpdGVfZnJhZ30sYmFja2dyb3VuZDp7dW5pZm9ybXM6e3V2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LHQyRDp7dmFsdWU6bnVsbH0sYmFja2dyb3VuZEludGVuc2l0eTp7dmFsdWU6MX19LHZlcnRleFNoYWRlcjokZS5iYWNrZ3JvdW5kX3ZlcnQsZnJhZ21lbnRTaGFkZXI6JGUuYmFja2dyb3VuZF9mcmFnfSxiYWNrZ3JvdW5kQ3ViZTp7dW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0sZmxpcEVudk1hcDp7dmFsdWU6LTF9LGJhY2tncm91bmRCbHVycmluZXNzOnt2YWx1ZTowfSxiYWNrZ3JvdW5kSW50ZW5zaXR5Ont2YWx1ZToxfX0sdmVydGV4U2hhZGVyOiRlLmJhY2tncm91bmRDdWJlX3ZlcnQsZnJhZ21lbnRTaGFkZXI6JGUuYmFja2dyb3VuZEN1YmVfZnJhZ30sY3ViZTp7dW5pZm9ybXM6e3RDdWJlOnt2YWx1ZTpudWxsfSx0RmxpcDp7dmFsdWU6LTF9LG9wYWNpdHk6e3ZhbHVlOjF9fSx2ZXJ0ZXhTaGFkZXI6JGUuY3ViZV92ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLmN1YmVfZnJhZ30sZXF1aXJlY3Q6e3VuaWZvcm1zOnt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6JGUuZXF1aXJlY3RfdmVydCxmcmFnbWVudFNoYWRlcjokZS5lcXVpcmVjdF9mcmFnfSxkaXN0YW5jZVJHQkE6e3VuaWZvcm1zOlp0KFtfZS5jb21tb24sX2UuZGlzcGxhY2VtZW50bWFwLHtyZWZlcmVuY2VQb3NpdGlvbjp7dmFsdWU6bmV3IFB9LG5lYXJEaXN0YW5jZTp7dmFsdWU6MX0sZmFyRGlzdGFuY2U6e3ZhbHVlOjFlM319XSksdmVydGV4U2hhZGVyOiRlLmRpc3RhbmNlUkdCQV92ZXJ0LGZyYWdtZW50U2hhZGVyOiRlLmRpc3RhbmNlUkdCQV9mcmFnfSxzaGFkb3c6e3VuaWZvcm1zOlp0KFtfZS5saWdodHMsX2UuZm9nLHtjb2xvcjp7dmFsdWU6bmV3IHllKDApfSxvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6JGUuc2hhZG93X3ZlcnQsZnJhZ21lbnRTaGFkZXI6JGUuc2hhZG93X2ZyYWd9fTtObi5waHlzaWNhbD17dW5pZm9ybXM6WnQoW05uLnN0YW5kYXJkLnVuaWZvcm1zLHtjbGVhcmNvYXQ6e3ZhbHVlOjB9LGNsZWFyY29hdE1hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGNsZWFyY29hdE5vcm1hbE1hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGNsZWFyY29hdE5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgcSgxLDEpfSxjbGVhcmNvYXRSb3VnaG5lc3M6e3ZhbHVlOjB9LGNsZWFyY29hdFJvdWdobmVzc01hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGlyaWRlc2NlbmNlOnt2YWx1ZTowfSxpcmlkZXNjZW5jZU1hcDp7dmFsdWU6bnVsbH0saXJpZGVzY2VuY2VNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBaZX0saXJpZGVzY2VuY2VJT1I6e3ZhbHVlOjEuM30saXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtOnt2YWx1ZToxMDB9LGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTp7dmFsdWU6NDAwfSxpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDp7dmFsdWU6bnVsbH0saXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBaZX0sc2hlZW46e3ZhbHVlOjB9LHNoZWVuQ29sb3I6e3ZhbHVlOm5ldyB5ZSgwKX0sc2hlZW5Db2xvck1hcDp7dmFsdWU6bnVsbH0sc2hlZW5Db2xvck1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfSxzaGVlblJvdWdobmVzczp7dmFsdWU6MX0sc2hlZW5Sb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9LHNoZWVuUm91Z2huZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LHRyYW5zbWlzc2lvbjp7dmFsdWU6MH0sdHJhbnNtaXNzaW9uTWFwOnt2YWx1ZTpudWxsfSx0cmFuc21pc3Npb25NYXBUcmFuc2Zvcm06e3ZhbHVlOm5ldyBaZX0sdHJhbnNtaXNzaW9uU2FtcGxlclNpemU6e3ZhbHVlOm5ldyBxfSx0cmFuc21pc3Npb25TYW1wbGVyTWFwOnt2YWx1ZTpudWxsfSx0aGlja25lc3M6e3ZhbHVlOjB9LHRoaWNrbmVzc01hcDp7dmFsdWU6bnVsbH0sdGhpY2tuZXNzTWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGF0dGVudWF0aW9uRGlzdGFuY2U6e3ZhbHVlOjB9LGF0dGVudWF0aW9uQ29sb3I6e3ZhbHVlOm5ldyB5ZSgwKX0sc3BlY3VsYXJDb2xvcjp7dmFsdWU6bmV3IHllKDEsMSwxKX0sc3BlY3VsYXJDb2xvck1hcDp7dmFsdWU6bnVsbH0sc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybTp7dmFsdWU6bmV3IFplfSxzcGVjdWxhckludGVuc2l0eTp7dmFsdWU6MX0sc3BlY3VsYXJJbnRlbnNpdHlNYXA6e3ZhbHVlOm51bGx9LHNwZWN1bGFySW50ZW5zaXR5TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9LGFuaXNvdHJvcHlWZWN0b3I6e3ZhbHVlOm5ldyBxfSxhbmlzb3Ryb3B5TWFwOnt2YWx1ZTpudWxsfSxhbmlzb3Ryb3B5TWFwVHJhbnNmb3JtOnt2YWx1ZTpuZXcgWmV9fV0pLHZlcnRleFNoYWRlcjokZS5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjokZS5tZXNocGh5c2ljYWxfZnJhZ307Y29uc3QgeW89e3I6MCxiOjAsZzowfTtmdW5jdGlvbiBJdihyLGUsdCxuLGkscyxhKXtjb25zdCBvPW5ldyB5ZSgwKTtsZXQgbD1zPT09ITA/MDoxLGMsaCx1PW51bGwsZj0wLGQ9bnVsbDtmdW5jdGlvbiBwKGcsbSl7bGV0IHk9ITEseD1tLmlzU2NlbmU9PT0hMD9tLmJhY2tncm91bmQ6bnVsbDt4JiZ4LmlzVGV4dHVyZSYmKHg9KG0uYmFja2dyb3VuZEJsdXJyaW5lc3M+MD90OmUpLmdldCh4KSkseD09PW51bGw/XyhvLGwpOngmJnguaXNDb2xvciYmKF8oeCwxKSx5PSEwKTtjb25zdCB2PXIueHIuZ2V0RW52aXJvbm1lbnRCbGVuZE1vZGUoKTt2PT09ImFkZGl0aXZlIj9uLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoMCwwLDAsMSxhKTp2PT09ImFscGhhLWJsZW5kIiYmbi5idWZmZXJzLmNvbG9yLnNldENsZWFyKDAsMCwwLDAsYSksKHIuYXV0b0NsZWFyfHx5KSYmci5jbGVhcihyLmF1dG9DbGVhckNvbG9yLHIuYXV0b0NsZWFyRGVwdGgsci5hdXRvQ2xlYXJTdGVuY2lsKSx4JiYoeC5pc0N1YmVUZXh0dXJlfHx4Lm1hcHBpbmc9PT1icik/KGg9PT12b2lkIDAmJihoPW5ldyBMdChuZXcgWWkoMSwxLDEpLG5ldyBIbih7bmFtZToiQmFja2dyb3VuZEN1YmVNYXRlcmlhbCIsdW5pZm9ybXM6VnIoTm4uYmFja2dyb3VuZEN1YmUudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpObi5iYWNrZ3JvdW5kQ3ViZS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6Tm4uYmFja2dyb3VuZEN1YmUuZnJhZ21lbnRTaGFkZXIsc2lkZTpZdCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSxmb2c6ITF9KSksaC5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoIm5vcm1hbCIpLGguZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCJ1diIpLGgub25CZWZvcmVSZW5kZXI9ZnVuY3Rpb24oUyxiLEEpe3RoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKEEubWF0cml4V29ybGQpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaC5tYXRlcmlhbCwiZW52TWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMuZW52TWFwLnZhbHVlfX0pLGkudXBkYXRlKGgpKSxoLm1hdGVyaWFsLnVuaWZvcm1zLmVudk1hcC52YWx1ZT14LGgubWF0ZXJpYWwudW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZT14LmlzQ3ViZVRleHR1cmUmJnguaXNSZW5kZXJUYXJnZXRUZXh0dXJlPT09ITE/LTE6MSxoLm1hdGVyaWFsLnVuaWZvcm1zLmJhY2tncm91bmRCbHVycmluZXNzLnZhbHVlPW0uYmFja2dyb3VuZEJsdXJyaW5lc3MsaC5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kSW50ZW5zaXR5LnZhbHVlPW0uYmFja2dyb3VuZEludGVuc2l0eSxoLm1hdGVyaWFsLnRvbmVNYXBwZWQ9b3QuZ2V0VHJhbnNmZXIoeC5jb2xvclNwYWNlKSE9PWN0LCh1IT09eHx8ZiE9PXgudmVyc2lvbnx8ZCE9PXIudG9uZU1hcHBpbmcpJiYoaC5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCx1PXgsZj14LnZlcnNpb24sZD1yLnRvbmVNYXBwaW5nKSxoLmxheWVycy5lbmFibGVBbGwoKSxnLnVuc2hpZnQoaCxoLmdlb21ldHJ5LGgubWF0ZXJpYWwsMCwwLG51bGwpKTp4JiZ4LmlzVGV4dHVyZSYmKGM9PT12b2lkIDAmJihjPW5ldyBMdChuZXcgJHMoMiwyKSxuZXcgSG4oe25hbWU6IkJhY2tncm91bmRNYXRlcmlhbCIsdW5pZm9ybXM6VnIoTm4uYmFja2dyb3VuZC51bmlmb3JtcyksdmVydGV4U2hhZGVyOk5uLmJhY2tncm91bmQudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOk5uLmJhY2tncm91bmQuZnJhZ21lbnRTaGFkZXIsc2lkZTpZbixkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSxmb2c6ITF9KSksYy5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoIm5vcm1hbCIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLm1hdGVyaWFsLCJtYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy50MkQudmFsdWV9fSksaS51cGRhdGUoYykpLGMubWF0ZXJpYWwudW5pZm9ybXMudDJELnZhbHVlPXgsYy5tYXRlcmlhbC51bmlmb3Jtcy5iYWNrZ3JvdW5kSW50ZW5zaXR5LnZhbHVlPW0uYmFja2dyb3VuZEludGVuc2l0eSxjLm1hdGVyaWFsLnRvbmVNYXBwZWQ9b3QuZ2V0VHJhbnNmZXIoeC5jb2xvclNwYWNlKSE9PWN0LHgubWF0cml4QXV0b1VwZGF0ZT09PSEwJiZ4LnVwZGF0ZU1hdHJpeCgpLGMubWF0ZXJpYWwudW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weSh4Lm1hdHJpeCksKHUhPT14fHxmIT09eC52ZXJzaW9ufHxkIT09ci50b25lTWFwcGluZykmJihjLm1hdGVyaWFsLm5lZWRzVXBkYXRlPSEwLHU9eCxmPXgudmVyc2lvbixkPXIudG9uZU1hcHBpbmcpLGMubGF5ZXJzLmVuYWJsZUFsbCgpLGcudW5zaGlmdChjLGMuZ2VvbWV0cnksYy5tYXRlcmlhbCwwLDAsbnVsbCkpfWZ1bmN0aW9uIF8oZyxtKXtnLmdldFJHQih5byxXZChyKSksbi5idWZmZXJzLmNvbG9yLnNldENsZWFyKHlvLnIseW8uZyx5by5iLG0sYSl9cmV0dXJue2dldENsZWFyQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4gb30sc2V0Q2xlYXJDb2xvcjpmdW5jdGlvbihnLG09MSl7by5zZXQoZyksbD1tLF8obyxsKX0sZ2V0Q2xlYXJBbHBoYTpmdW5jdGlvbigpe3JldHVybiBsfSxzZXRDbGVhckFscGhhOmZ1bmN0aW9uKGcpe2w9ZyxfKG8sbCl9LHJlbmRlcjpwfX1mdW5jdGlvbiBVdihyLGUsdCxuKXtjb25zdCBpPXIuZ2V0UGFyYW1ldGVyKHIuTUFYX1ZFUlRFWF9BVFRSSUJTKSxzPW4uaXNXZWJHTDI/bnVsbDplLmdldCgiT0VTX3ZlcnRleF9hcnJheV9vYmplY3QiKSxhPW4uaXNXZWJHTDJ8fHMhPT1udWxsLG89e30sbD1nKG51bGwpO2xldCBjPWwsaD0hMTtmdW5jdGlvbiB1KEksVSx6LEYsWil7bGV0IFY9ITE7aWYoYSl7Y29uc3QgUT1fKEYseixVKTtjIT09USYmKGM9USxkKGMub2JqZWN0KSksVj1tKEksRix6LFopLFYmJnkoSSxGLHosWil9ZWxzZXtjb25zdCBRPVUud2lyZWZyYW1lPT09ITA7KGMuZ2VvbWV0cnkhPT1GLmlkfHxjLnByb2dyYW0hPT16LmlkfHxjLndpcmVmcmFtZSE9PVEpJiYoYy5nZW9tZXRyeT1GLmlkLGMucHJvZ3JhbT16LmlkLGMud2lyZWZyYW1lPVEsVj0hMCl9WiE9PW51bGwmJnQudXBkYXRlKFosci5FTEVNRU5UX0FSUkFZX0JVRkZFUiksKFZ8fGgpJiYoaD0hMSxMKEksVSx6LEYpLFohPT1udWxsJiZyLmJpbmRCdWZmZXIoci5FTEVNRU5UX0FSUkFZX0JVRkZFUix0LmdldChaKS5idWZmZXIpKX1mdW5jdGlvbiBmKCl7cmV0dXJuIG4uaXNXZWJHTDI/ci5jcmVhdGVWZXJ0ZXhBcnJheSgpOnMuY3JlYXRlVmVydGV4QXJyYXlPRVMoKX1mdW5jdGlvbiBkKEkpe3JldHVybiBuLmlzV2ViR0wyP3IuYmluZFZlcnRleEFycmF5KEkpOnMuYmluZFZlcnRleEFycmF5T0VTKEkpfWZ1bmN0aW9uIHAoSSl7cmV0dXJuIG4uaXNXZWJHTDI/ci5kZWxldGVWZXJ0ZXhBcnJheShJKTpzLmRlbGV0ZVZlcnRleEFycmF5T0VTKEkpfWZ1bmN0aW9uIF8oSSxVLHope2NvbnN0IEY9ei53aXJlZnJhbWU9PT0hMDtsZXQgWj1vW0kuaWRdO1o9PT12b2lkIDAmJihaPXt9LG9bSS5pZF09Wik7bGV0IFY9WltVLmlkXTtWPT09dm9pZCAwJiYoVj17fSxaW1UuaWRdPVYpO2xldCBRPVZbRl07cmV0dXJuIFE9PT12b2lkIDAmJihRPWcoZigpKSxWW0ZdPVEpLFF9ZnVuY3Rpb24gZyhJKXtjb25zdCBVPVtdLHo9W10sRj1bXTtmb3IobGV0IFo9MDtaPGk7WisrKVVbWl09MCx6W1pdPTAsRltaXT0wO3JldHVybntnZW9tZXRyeTpudWxsLHByb2dyYW06bnVsbCx3aXJlZnJhbWU6ITEsbmV3QXR0cmlidXRlczpVLGVuYWJsZWRBdHRyaWJ1dGVzOnosYXR0cmlidXRlRGl2aXNvcnM6RixvYmplY3Q6SSxhdHRyaWJ1dGVzOnt9LGluZGV4Om51bGx9fWZ1bmN0aW9uIG0oSSxVLHosRil7Y29uc3QgWj1jLmF0dHJpYnV0ZXMsVj1VLmF0dHJpYnV0ZXM7bGV0IFE9MDtjb25zdCBuZT16LmdldEF0dHJpYnV0ZXMoKTtmb3IoY29uc3QgZmUgaW4gbmUpaWYobmVbZmVdLmxvY2F0aW9uPj0wKXtjb25zdCBlZT1aW2ZlXTtsZXQgZGU9VltmZV07aWYoZGU9PT12b2lkIDAmJihmZT09PSJpbnN0YW5jZU1hdHJpeCImJkkuaW5zdGFuY2VNYXRyaXgmJihkZT1JLmluc3RhbmNlTWF0cml4KSxmZT09PSJpbnN0YW5jZUNvbG9yIiYmSS5pbnN0YW5jZUNvbG9yJiYoZGU9SS5pbnN0YW5jZUNvbG9yKSksZWU9PT12b2lkIDB8fGVlLmF0dHJpYnV0ZSE9PWRlfHxkZSYmZWUuZGF0YSE9PWRlLmRhdGEpcmV0dXJuITA7USsrfXJldHVybiBjLmF0dHJpYnV0ZXNOdW0hPT1RfHxjLmluZGV4IT09Rn1mdW5jdGlvbiB5KEksVSx6LEYpe2NvbnN0IFo9e30sVj1VLmF0dHJpYnV0ZXM7bGV0IFE9MDtjb25zdCBuZT16LmdldEF0dHJpYnV0ZXMoKTtmb3IoY29uc3QgZmUgaW4gbmUpaWYobmVbZmVdLmxvY2F0aW9uPj0wKXtsZXQgZWU9VltmZV07ZWU9PT12b2lkIDAmJihmZT09PSJpbnN0YW5jZU1hdHJpeCImJkkuaW5zdGFuY2VNYXRyaXgmJihlZT1JLmluc3RhbmNlTWF0cml4KSxmZT09PSJpbnN0YW5jZUNvbG9yIiYmSS5pbnN0YW5jZUNvbG9yJiYoZWU9SS5pbnN0YW5jZUNvbG9yKSk7Y29uc3QgZGU9e307ZGUuYXR0cmlidXRlPWVlLGVlJiZlZS5kYXRhJiYoZGUuZGF0YT1lZS5kYXRhKSxaW2ZlXT1kZSxRKyt9Yy5hdHRyaWJ1dGVzPVosYy5hdHRyaWJ1dGVzTnVtPVEsYy5pbmRleD1GfWZ1bmN0aW9uIHgoKXtjb25zdCBJPWMubmV3QXR0cmlidXRlcztmb3IobGV0IFU9MCx6PUkubGVuZ3RoO1U8ejtVKyspSVtVXT0wfWZ1bmN0aW9uIHYoSSl7UyhJLDApfWZ1bmN0aW9uIFMoSSxVKXtjb25zdCB6PWMubmV3QXR0cmlidXRlcyxGPWMuZW5hYmxlZEF0dHJpYnV0ZXMsWj1jLmF0dHJpYnV0ZURpdmlzb3JzO3pbSV09MSxGW0ldPT09MCYmKHIuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoSSksRltJXT0xKSxaW0ldIT09VSYmKChuLmlzV2ViR0wyP3I6ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSlbbi5pc1dlYkdMMj8idmVydGV4QXR0cmliRGl2aXNvciI6InZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRSJdKEksVSksWltJXT1VKX1mdW5jdGlvbiBiKCl7Y29uc3QgST1jLm5ld0F0dHJpYnV0ZXMsVT1jLmVuYWJsZWRBdHRyaWJ1dGVzO2ZvcihsZXQgej0wLEY9VS5sZW5ndGg7ejxGO3orKylVW3pdIT09SVt6XSYmKHIuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHopLFVbel09MCl9ZnVuY3Rpb24gQShJLFUseixGLFosVixRKXtRPT09ITA/ci52ZXJ0ZXhBdHRyaWJJUG9pbnRlcihJLFUseixaLFYpOnIudmVydGV4QXR0cmliUG9pbnRlcihJLFUseixGLFosVil9ZnVuY3Rpb24gTChJLFUseixGKXtpZihuLmlzV2ViR0wyPT09ITEmJihJLmlzSW5zdGFuY2VkTWVzaHx8Ri5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5KSYmZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKT09PW51bGwpcmV0dXJuO3goKTtjb25zdCBaPUYuYXR0cmlidXRlcyxWPXouZ2V0QXR0cmlidXRlcygpLFE9VS5kZWZhdWx0QXR0cmlidXRlVmFsdWVzO2Zvcihjb25zdCBuZSBpbiBWKXtjb25zdCBmZT1WW25lXTtpZihmZS5sb2NhdGlvbj49MCl7bGV0ICQ9WltuZV07aWYoJD09PXZvaWQgMCYmKG5lPT09Imluc3RhbmNlTWF0cml4IiYmSS5pbnN0YW5jZU1hdHJpeCYmKCQ9SS5pbnN0YW5jZU1hdHJpeCksbmU9PT0iaW5zdGFuY2VDb2xvciImJkkuaW5zdGFuY2VDb2xvciYmKCQ9SS5pbnN0YW5jZUNvbG9yKSksJCE9PXZvaWQgMCl7Y29uc3QgZWU9JC5ub3JtYWxpemVkLGRlPSQuaXRlbVNpemUsVGU9dC5nZXQoJCk7aWYoVGU9PT12b2lkIDApY29udGludWU7Y29uc3QgYmU9VGUuYnVmZmVyLE9lPVRlLnR5cGUsQmU9VGUuYnl0ZXNQZXJFbGVtZW50LHdlPW4uaXNXZWJHTDI9PT0hMCYmKE9lPT09ci5JTlR8fE9lPT09ci5VTlNJR05FRF9JTlR8fCQuZ3B1VHlwZT09PWdjKTtpZigkLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IFBlPSQuZGF0YSxEPVBlLnN0cmlkZSxsZT0kLm9mZnNldDtpZihQZS5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyKXtmb3IobGV0IEs9MDtLPGZlLmxvY2F0aW9uU2l6ZTtLKyspUyhmZS5sb2NhdGlvbitLLFBlLm1lc2hQZXJBdHRyaWJ1dGUpO0kuaXNJbnN0YW5jZWRNZXNoIT09ITAmJkYuX21heEluc3RhbmNlQ291bnQ9PT12b2lkIDAmJihGLl9tYXhJbnN0YW5jZUNvdW50PVBlLm1lc2hQZXJBdHRyaWJ1dGUqUGUuY291bnQpfWVsc2UgZm9yKGxldCBLPTA7SzxmZS5sb2NhdGlvblNpemU7SysrKXYoZmUubG9jYXRpb24rSyk7ci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLGJlKTtmb3IobGV0IEs9MDtLPGZlLmxvY2F0aW9uU2l6ZTtLKyspQShmZS5sb2NhdGlvbitLLGRlL2ZlLmxvY2F0aW9uU2l6ZSxPZSxlZSxEKkJlLChsZStkZS9mZS5sb2NhdGlvblNpemUqSykqQmUsd2UpfWVsc2V7aWYoJC5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSl7Zm9yKGxldCBQZT0wO1BlPGZlLmxvY2F0aW9uU2l6ZTtQZSsrKVMoZmUubG9jYXRpb24rUGUsJC5tZXNoUGVyQXR0cmlidXRlKTtJLmlzSW5zdGFuY2VkTWVzaCE9PSEwJiZGLl9tYXhJbnN0YW5jZUNvdW50PT09dm9pZCAwJiYoRi5fbWF4SW5zdGFuY2VDb3VudD0kLm1lc2hQZXJBdHRyaWJ1dGUqJC5jb3VudCl9ZWxzZSBmb3IobGV0IFBlPTA7UGU8ZmUubG9jYXRpb25TaXplO1BlKyspdihmZS5sb2NhdGlvbitQZSk7ci5iaW5kQnVmZmVyKHIuQVJSQVlfQlVGRkVSLGJlKTtmb3IobGV0IFBlPTA7UGU8ZmUubG9jYXRpb25TaXplO1BlKyspQShmZS5sb2NhdGlvbitQZSxkZS9mZS5sb2NhdGlvblNpemUsT2UsZWUsZGUqQmUsZGUvZmUubG9jYXRpb25TaXplKlBlKkJlLHdlKX19ZWxzZSBpZihRIT09dm9pZCAwKXtjb25zdCBlZT1RW25lXTtpZihlZSE9PXZvaWQgMClzd2l0Y2goZWUubGVuZ3RoKXtjYXNlIDI6ci52ZXJ0ZXhBdHRyaWIyZnYoZmUubG9jYXRpb24sZWUpO2JyZWFrO2Nhc2UgMzpyLnZlcnRleEF0dHJpYjNmdihmZS5sb2NhdGlvbixlZSk7YnJlYWs7Y2FzZSA0OnIudmVydGV4QXR0cmliNGZ2KGZlLmxvY2F0aW9uLGVlKTticmVhaztkZWZhdWx0OnIudmVydGV4QXR0cmliMWZ2KGZlLmxvY2F0aW9uLGVlKX19fX1iKCl9ZnVuY3Rpb24gTSgpe04oKTtmb3IoY29uc3QgSSBpbiBvKXtjb25zdCBVPW9bSV07Zm9yKGNvbnN0IHogaW4gVSl7Y29uc3QgRj1VW3pdO2Zvcihjb25zdCBaIGluIEYpcChGW1pdLm9iamVjdCksZGVsZXRlIEZbWl07ZGVsZXRlIFVbel19ZGVsZXRlIG9bSV19fWZ1bmN0aW9uIHcoSSl7aWYob1tJLmlkXT09PXZvaWQgMClyZXR1cm47Y29uc3QgVT1vW0kuaWRdO2Zvcihjb25zdCB6IGluIFUpe2NvbnN0IEY9VVt6XTtmb3IoY29uc3QgWiBpbiBGKXAoRltaXS5vYmplY3QpLGRlbGV0ZSBGW1pdO2RlbGV0ZSBVW3pdfWRlbGV0ZSBvW0kuaWRdfWZ1bmN0aW9uIFIoSSl7Zm9yKGNvbnN0IFUgaW4gbyl7Y29uc3Qgej1vW1VdO2lmKHpbSS5pZF09PT12b2lkIDApY29udGludWU7Y29uc3QgRj16W0kuaWRdO2Zvcihjb25zdCBaIGluIEYpcChGW1pdLm9iamVjdCksZGVsZXRlIEZbWl07ZGVsZXRlIHpbSS5pZF19fWZ1bmN0aW9uIE4oKXtCKCksaD0hMCxjIT09bCYmKGM9bCxkKGMub2JqZWN0KSl9ZnVuY3Rpb24gQigpe2wuZ2VvbWV0cnk9bnVsbCxsLnByb2dyYW09bnVsbCxsLndpcmVmcmFtZT0hMX1yZXR1cm57c2V0dXA6dSxyZXNldDpOLHJlc2V0RGVmYXVsdFN0YXRlOkIsZGlzcG9zZTpNLHJlbGVhc2VTdGF0ZXNPZkdlb21ldHJ5OncscmVsZWFzZVN0YXRlc09mUHJvZ3JhbTpSLGluaXRBdHRyaWJ1dGVzOngsZW5hYmxlQXR0cmlidXRlOnYsZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXM6Yn19ZnVuY3Rpb24gRHYocixlLHQsbil7Y29uc3QgaT1uLmlzV2ViR0wyO2xldCBzO2Z1bmN0aW9uIGEoaCl7cz1ofWZ1bmN0aW9uIG8oaCx1KXtyLmRyYXdBcnJheXMocyxoLHUpLHQudXBkYXRlKHUscywxKX1mdW5jdGlvbiBsKGgsdSxmKXtpZihmPT09MClyZXR1cm47bGV0IGQscDtpZihpKWQ9cixwPSJkcmF3QXJyYXlzSW5zdGFuY2VkIjtlbHNlIGlmKGQ9ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSxwPSJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLGQ9PT1udWxsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4iKTtyZXR1cm59ZFtwXShzLGgsdSxmKSx0LnVwZGF0ZSh1LHMsZil9ZnVuY3Rpb24gYyhoLHUsZil7aWYoZj09PTApcmV0dXJuO2NvbnN0IGQ9ZS5nZXQoIldFQkdMX211bHRpX2RyYXciKTtpZihkPT09bnVsbClmb3IobGV0IHA9MDtwPGY7cCsrKXRoaXMucmVuZGVyKGhbcF0sdVtwXSk7ZWxzZXtkLm11bHRpRHJhd0FycmF5c1dFQkdMKHMsaCwwLHUsMCxmKTtsZXQgcD0wO2ZvcihsZXQgXz0wO188ZjtfKyspcCs9dVtfXTt0LnVwZGF0ZShwLHMsMSl9fXRoaXMuc2V0TW9kZT1hLHRoaXMucmVuZGVyPW8sdGhpcy5yZW5kZXJJbnN0YW5jZXM9bCx0aGlzLnJlbmRlck11bHRpRHJhdz1jfWZ1bmN0aW9uIE52KHIsZSx0KXtsZXQgbjtmdW5jdGlvbiBpKCl7aWYobiE9PXZvaWQgMClyZXR1cm4gbjtpZihlLmhhcygiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik9PT0hMCl7Y29uc3QgQT1lLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7bj1yLmdldFBhcmFtZXRlcihBLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCl9ZWxzZSBuPTA7cmV0dXJuIG59ZnVuY3Rpb24gcyhBKXtpZihBPT09ImhpZ2hwIil7aWYoci5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoci5WRVJURVhfU0hBREVSLHIuSElHSF9GTE9BVCkucHJlY2lzaW9uPjAmJnIuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KHIuRlJBR01FTlRfU0hBREVSLHIuSElHSF9GTE9BVCkucHJlY2lzaW9uPjApcmV0dXJuImhpZ2hwIjtBPSJtZWRpdW1wIn1yZXR1cm4gQT09PSJtZWRpdW1wIiYmci5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoci5WRVJURVhfU0hBREVSLHIuTUVESVVNX0ZMT0FUKS5wcmVjaXNpb24+MCYmci5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoci5GUkFHTUVOVF9TSEFERVIsci5NRURJVU1fRkxPQVQpLnByZWNpc2lvbj4wPyJtZWRpdW1wIjoibG93cCJ9Y29uc3QgYT10eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCE9InVuZGVmaW5lZCImJnIuY29uc3RydWN0b3IubmFtZT09PSJXZWJHTDJSZW5kZXJpbmdDb250ZXh0IjtsZXQgbz10LnByZWNpc2lvbiE9PXZvaWQgMD90LnByZWNpc2lvbjoiaGlnaHAiO2NvbnN0IGw9cyhvKTtsIT09byYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjoiLG8sIm5vdCBzdXBwb3J0ZWQsIHVzaW5nIixsLCJpbnN0ZWFkLiIpLG89bCk7Y29uc3QgYz1hfHxlLmhhcygiV0VCR0xfZHJhd19idWZmZXJzIiksaD10LmxvZ2FyaXRobWljRGVwdGhCdWZmZXI9PT0hMCx1PXIuZ2V0UGFyYW1ldGVyKHIuTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMpLGY9ci5nZXRQYXJhbWV0ZXIoci5NQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMpLGQ9ci5nZXRQYXJhbWV0ZXIoci5NQVhfVEVYVFVSRV9TSVpFKSxwPXIuZ2V0UGFyYW1ldGVyKHIuTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSksXz1yLmdldFBhcmFtZXRlcihyLk1BWF9WRVJURVhfQVRUUklCUyksZz1yLmdldFBhcmFtZXRlcihyLk1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTKSxtPXIuZ2V0UGFyYW1ldGVyKHIuTUFYX1ZBUllJTkdfVkVDVE9SUykseT1yLmdldFBhcmFtZXRlcihyLk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMpLHg9Zj4wLHY9YXx8ZS5oYXMoIk9FU190ZXh0dXJlX2Zsb2F0IiksUz14JiZ2LGI9YT9yLmdldFBhcmFtZXRlcihyLk1BWF9TQU1QTEVTKTowO3JldHVybntpc1dlYkdMMjphLGRyYXdCdWZmZXJzOmMsZ2V0TWF4QW5pc290cm9weTppLGdldE1heFByZWNpc2lvbjpzLHByZWNpc2lvbjpvLGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6aCxtYXhUZXh0dXJlczp1LG1heFZlcnRleFRleHR1cmVzOmYsbWF4VGV4dHVyZVNpemU6ZCxtYXhDdWJlbWFwU2l6ZTpwLG1heEF0dHJpYnV0ZXM6XyxtYXhWZXJ0ZXhVbmlmb3JtczpnLG1heFZhcnlpbmdzOm0sbWF4RnJhZ21lbnRVbmlmb3Jtczp5LHZlcnRleFRleHR1cmVzOngsZmxvYXRGcmFnbWVudFRleHR1cmVzOnYsZmxvYXRWZXJ0ZXhUZXh0dXJlczpTLG1heFNhbXBsZXM6Yn19ZnVuY3Rpb24gRnYocil7Y29uc3QgZT10aGlzO2xldCB0PW51bGwsbj0wLGk9ITEscz0hMTtjb25zdCBhPW5ldyBMaSxvPW5ldyBaZSxsPXt2YWx1ZTpudWxsLG5lZWRzVXBkYXRlOiExfTt0aGlzLnVuaWZvcm09bCx0aGlzLm51bVBsYW5lcz0wLHRoaXMubnVtSW50ZXJzZWN0aW9uPTAsdGhpcy5pbml0PWZ1bmN0aW9uKHUsZil7Y29uc3QgZD11Lmxlbmd0aCE9PTB8fGZ8fG4hPT0wfHxpO3JldHVybiBpPWYsbj11Lmxlbmd0aCxkfSx0aGlzLmJlZ2luU2hhZG93cz1mdW5jdGlvbigpe3M9ITAsaChudWxsKX0sdGhpcy5lbmRTaGFkb3dzPWZ1bmN0aW9uKCl7cz0hMX0sdGhpcy5zZXRHbG9iYWxTdGF0ZT1mdW5jdGlvbih1LGYpe3Q9aCh1LGYsMCl9LHRoaXMuc2V0U3RhdGU9ZnVuY3Rpb24odSxmLGQpe2NvbnN0IHA9dS5jbGlwcGluZ1BsYW5lcyxfPXUuY2xpcEludGVyc2VjdGlvbixnPXUuY2xpcFNoYWRvd3MsbT1yLmdldCh1KTtpZighaXx8cD09PW51bGx8fHAubGVuZ3RoPT09MHx8cyYmIWcpcz9oKG51bGwpOmMoKTtlbHNle2NvbnN0IHk9cz8wOm4seD15KjQ7bGV0IHY9bS5jbGlwcGluZ1N0YXRlfHxudWxsO2wudmFsdWU9dix2PWgocCxmLHgsZCk7Zm9yKGxldCBTPTA7UyE9PXg7KytTKXZbU109dFtTXTttLmNsaXBwaW5nU3RhdGU9dix0aGlzLm51bUludGVyc2VjdGlvbj1fP3RoaXMubnVtUGxhbmVzOjAsdGhpcy5udW1QbGFuZXMrPXl9fTtmdW5jdGlvbiBjKCl7bC52YWx1ZSE9PXQmJihsLnZhbHVlPXQsbC5uZWVkc1VwZGF0ZT1uPjApLGUubnVtUGxhbmVzPW4sZS5udW1JbnRlcnNlY3Rpb249MH1mdW5jdGlvbiBoKHUsZixkLHApe2NvbnN0IF89dSE9PW51bGw/dS5sZW5ndGg6MDtsZXQgZz1udWxsO2lmKF8hPT0wKXtpZihnPWwudmFsdWUscCE9PSEwfHxnPT09bnVsbCl7Y29uc3QgbT1kK18qNCx5PWYubWF0cml4V29ybGRJbnZlcnNlO28uZ2V0Tm9ybWFsTWF0cml4KHkpLChnPT09bnVsbHx8Zy5sZW5ndGg8bSkmJihnPW5ldyBGbG9hdDMyQXJyYXkobSkpO2ZvcihsZXQgeD0wLHY9ZDt4IT09XzsrK3gsdis9NClhLmNvcHkodVt4XSkuYXBwbHlNYXRyaXg0KHksbyksYS5ub3JtYWwudG9BcnJheShnLHYpLGdbdiszXT1hLmNvbnN0YW50fWwudmFsdWU9ZyxsLm5lZWRzVXBkYXRlPSEwfXJldHVybiBlLm51bVBsYW5lcz1fLGUubnVtSW50ZXJzZWN0aW9uPTAsZ319ZnVuY3Rpb24gT3Yocil7bGV0IGU9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gdChhLG8pe3JldHVybiBvPT09YnM/YS5tYXBwaW5nPUtuOm89PT13cyYmKGEubWFwcGluZz15aSksYX1mdW5jdGlvbiBuKGEpe2lmKGEmJmEuaXNUZXh0dXJlKXtjb25zdCBvPWEubWFwcGluZztpZihvPT09YnN8fG89PT13cylpZihlLmhhcyhhKSl7Y29uc3QgbD1lLmdldChhKS50ZXh0dXJlO3JldHVybiB0KGwsYS5tYXBwaW5nKX1lbHNle2NvbnN0IGw9YS5pbWFnZTtpZihsJiZsLmhlaWdodD4wKXtjb25zdCBjPW5ldyAkZChsLmhlaWdodC8yKTtyZXR1cm4gYy5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZShyLGEpLGUuc2V0KGEsYyksYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixpKSx0KGMudGV4dHVyZSxhLm1hcHBpbmcpfWVsc2UgcmV0dXJuIG51bGx9fXJldHVybiBhfWZ1bmN0aW9uIGkoYSl7Y29uc3Qgbz1hLnRhcmdldDtvLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGkpO2NvbnN0IGw9ZS5nZXQobyk7bCE9PXZvaWQgMCYmKGUuZGVsZXRlKG8pLGwuZGlzcG9zZSgpKX1mdW5jdGlvbiBzKCl7ZT1uZXcgV2Vha01hcH1yZXR1cm57Z2V0Om4sZGlzcG9zZTpzfX1jbGFzcyB2byBleHRlbmRzIF9ve2NvbnN0cnVjdG9yKGU9LTEsdD0xLG49MSxpPS0xLHM9LjEsYT0yZTMpe3N1cGVyKCksdGhpcy5pc09ydGhvZ3JhcGhpY0NhbWVyYT0hMCx0aGlzLnR5cGU9Ik9ydGhvZ3JhcGhpY0NhbWVyYSIsdGhpcy56b29tPTEsdGhpcy52aWV3PW51bGwsdGhpcy5sZWZ0PWUsdGhpcy5yaWdodD10LHRoaXMudG9wPW4sdGhpcy5ib3R0b209aSx0aGlzLm5lYXI9cyx0aGlzLmZhcj1hLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWNvcHkoZSx0KXtyZXR1cm4gc3VwZXIuY29weShlLHQpLHRoaXMubGVmdD1lLmxlZnQsdGhpcy5yaWdodD1lLnJpZ2h0LHRoaXMudG9wPWUudG9wLHRoaXMuYm90dG9tPWUuYm90dG9tLHRoaXMubmVhcj1lLm5lYXIsdGhpcy5mYXI9ZS5mYXIsdGhpcy56b29tPWUuem9vbSx0aGlzLnZpZXc9ZS52aWV3PT09bnVsbD9udWxsOk9iamVjdC5hc3NpZ24oe30sZS52aWV3KSx0aGlzfXNldFZpZXdPZmZzZXQoZSx0LG4saSxzLGEpe3RoaXMudmlldz09PW51bGwmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pLHRoaXMudmlldy5lbmFibGVkPSEwLHRoaXMudmlldy5mdWxsV2lkdGg9ZSx0aGlzLnZpZXcuZnVsbEhlaWdodD10LHRoaXMudmlldy5vZmZzZXRYPW4sdGhpcy52aWV3Lm9mZnNldFk9aSx0aGlzLnZpZXcud2lkdGg9cyx0aGlzLnZpZXcuaGVpZ2h0PWEsdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y2xlYXJWaWV3T2Zmc2V0KCl7dGhpcy52aWV3IT09bnVsbCYmKHRoaXMudmlldy5lbmFibGVkPSExKSx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX11cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl7Y29uc3QgZT0odGhpcy5yaWdodC10aGlzLmxlZnQpLygyKnRoaXMuem9vbSksdD0odGhpcy50b3AtdGhpcy5ib3R0b20pLygyKnRoaXMuem9vbSksbj0odGhpcy5yaWdodCt0aGlzLmxlZnQpLzIsaT0odGhpcy50b3ArdGhpcy5ib3R0b20pLzI7bGV0IHM9bi1lLGE9bitlLG89aSt0LGw9aS10O2lmKHRoaXMudmlldyE9PW51bGwmJnRoaXMudmlldy5lbmFibGVkKXtjb25zdCBjPSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvdGhpcy52aWV3LmZ1bGxXaWR0aC90aGlzLnpvb20saD0odGhpcy50b3AtdGhpcy5ib3R0b20pL3RoaXMudmlldy5mdWxsSGVpZ2h0L3RoaXMuem9vbTtzKz1jKnRoaXMudmlldy5vZmZzZXRYLGE9cytjKnRoaXMudmlldy53aWR0aCxvLT1oKnRoaXMudmlldy5vZmZzZXRZLGw9by1oKnRoaXMudmlldy5oZWlnaHR9dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VPcnRob2dyYXBoaWMocyxhLG8sbCx0aGlzLm5lYXIsdGhpcy5mYXIsdGhpcy5jb29yZGluYXRlU3lzdGVtKSx0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5wcm9qZWN0aW9uTWF0cml4KS5pbnZlcnQoKX10b0pTT04oZSl7Y29uc3QgdD1zdXBlci50b0pTT04oZSk7cmV0dXJuIHQub2JqZWN0Lnpvb209dGhpcy56b29tLHQub2JqZWN0LmxlZnQ9dGhpcy5sZWZ0LHQub2JqZWN0LnJpZ2h0PXRoaXMucmlnaHQsdC5vYmplY3QudG9wPXRoaXMudG9wLHQub2JqZWN0LmJvdHRvbT10aGlzLmJvdHRvbSx0Lm9iamVjdC5uZWFyPXRoaXMubmVhcix0Lm9iamVjdC5mYXI9dGhpcy5mYXIsdGhpcy52aWV3IT09bnVsbCYmKHQub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKSx0fX1jb25zdCBYcj00LFpkPVsuMTI1LC4yMTUsLjM1LC40NDYsLjUyNiwuNTgyXSxKaT0yMCxTaD1uZXcgdm8sSmQ9bmV3IHllO2xldCBiaD1udWxsLHdoPTAsRWg9MDtjb25zdCBLaT0oMStNYXRoLnNxcnQoNSkpLzIscXI9MS9LaSxLZD1bbmV3IFAoMSwxLDEpLG5ldyBQKC0xLDEsMSksbmV3IFAoMSwxLC0xKSxuZXcgUCgtMSwxLC0xKSxuZXcgUCgwLEtpLHFyKSxuZXcgUCgwLEtpLC1xciksbmV3IFAocXIsMCxLaSksbmV3IFAoLXFyLDAsS2kpLG5ldyBQKEtpLHFyLDApLG5ldyBQKC1LaSxxciwwKV07Y2xhc3MgQWh7Y29uc3RydWN0b3IoZSl7dGhpcy5fcmVuZGVyZXI9ZSx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldD1udWxsLHRoaXMuX2xvZE1heD0wLHRoaXMuX2N1YmVTaXplPTAsdGhpcy5fbG9kUGxhbmVzPVtdLHRoaXMuX3NpemVMb2RzPVtdLHRoaXMuX3NpZ21hcz1bXSx0aGlzLl9ibHVyTWF0ZXJpYWw9bnVsbCx0aGlzLl9jdWJlbWFwTWF0ZXJpYWw9bnVsbCx0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPW51bGwsdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2JsdXJNYXRlcmlhbCl9ZnJvbVNjZW5lKGUsdD0wLG49LjEsaT0xMDApe2JoPXRoaXMuX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpLHdoPXRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZUN1YmVGYWNlKCksRWg9dGhpcy5fcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKSx0aGlzLl9zZXRTaXplKDI1Nik7Y29uc3Qgcz10aGlzLl9hbGxvY2F0ZVRhcmdldHMoKTtyZXR1cm4gcy5kZXB0aEJ1ZmZlcj0hMCx0aGlzLl9zY2VuZVRvQ3ViZVVWKGUsbixpLHMpLHQ+MCYmdGhpcy5fYmx1cihzLDAsMCx0KSx0aGlzLl9hcHBseVBNUkVNKHMpLHRoaXMuX2NsZWFudXAocyksc31mcm9tRXF1aXJlY3Rhbmd1bGFyKGUsdD1udWxsKXtyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUoZSx0KX1mcm9tQ3ViZW1hcChlLHQ9bnVsbCl7cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKGUsdCl9Y29tcGlsZUN1YmVtYXBTaGFkZXIoKXt0aGlzLl9jdWJlbWFwTWF0ZXJpYWw9PT1udWxsJiYodGhpcy5fY3ViZW1hcE1hdGVyaWFsPWVwKCksdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2N1YmVtYXBNYXRlcmlhbCkpfWNvbXBpbGVFcXVpcmVjdGFuZ3VsYXJTaGFkZXIoKXt0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPT09bnVsbCYmKHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWw9amQoKSx0aGlzLl9jb21waWxlTWF0ZXJpYWwodGhpcy5fZXF1aXJlY3RNYXRlcmlhbCkpfWRpc3Bvc2UoKXt0aGlzLl9kaXNwb3NlKCksdGhpcy5fY3ViZW1hcE1hdGVyaWFsIT09bnVsbCYmdGhpcy5fY3ViZW1hcE1hdGVyaWFsLmRpc3Bvc2UoKSx0aGlzLl9lcXVpcmVjdE1hdGVyaWFsIT09bnVsbCYmdGhpcy5fZXF1aXJlY3RNYXRlcmlhbC5kaXNwb3NlKCl9X3NldFNpemUoZSl7dGhpcy5fbG9kTWF4PU1hdGguZmxvb3IoTWF0aC5sb2cyKGUpKSx0aGlzLl9jdWJlU2l6ZT1NYXRoLnBvdygyLHRoaXMuX2xvZE1heCl9X2Rpc3Bvc2UoKXt0aGlzLl9ibHVyTWF0ZXJpYWwhPT1udWxsJiZ0aGlzLl9ibHVyTWF0ZXJpYWwuZGlzcG9zZSgpLHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0IT09bnVsbCYmdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQuZGlzcG9zZSgpO2ZvcihsZXQgZT0wO2U8dGhpcy5fbG9kUGxhbmVzLmxlbmd0aDtlKyspdGhpcy5fbG9kUGxhbmVzW2VdLmRpc3Bvc2UoKX1fY2xlYW51cChlKXt0aGlzLl9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoYmgsd2gsRWgpLGUuc2Npc3NvclRlc3Q9ITEsTW8oZSwwLDAsZS53aWR0aCxlLmhlaWdodCl9X2Zyb21UZXh0dXJlKGUsdCl7ZS5tYXBwaW5nPT09S258fGUubWFwcGluZz09PXlpP3RoaXMuX3NldFNpemUoZS5pbWFnZS5sZW5ndGg9PT0wPzE2OmUuaW1hZ2VbMF0ud2lkdGh8fGUuaW1hZ2VbMF0uaW1hZ2Uud2lkdGgpOnRoaXMuX3NldFNpemUoZS5pbWFnZS53aWR0aC80KSxiaD10aGlzLl9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKSx3aD10aGlzLl9yZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpLEVoPXRoaXMuX3JlbmRlcmVyLmdldEFjdGl2ZU1pcG1hcExldmVsKCk7Y29uc3Qgbj10fHx0aGlzLl9hbGxvY2F0ZVRhcmdldHMoKTtyZXR1cm4gdGhpcy5fdGV4dHVyZVRvQ3ViZVVWKGUsbiksdGhpcy5fYXBwbHlQTVJFTShuKSx0aGlzLl9jbGVhbnVwKG4pLG59X2FsbG9jYXRlVGFyZ2V0cygpe2NvbnN0IGU9MypNYXRoLm1heCh0aGlzLl9jdWJlU2l6ZSwxMTIpLHQ9NCp0aGlzLl9jdWJlU2l6ZSxuPXttYWdGaWx0ZXI6d3QsbWluRmlsdGVyOnd0LGdlbmVyYXRlTWlwbWFwczohMSx0eXBlOndyLGZvcm1hdDphbixjb2xvclNwYWNlOlZuLGRlcHRoQnVmZmVyOiExfSxpPVFkKGUsdCxuKTtpZih0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldD09PW51bGx8fHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LndpZHRoIT09ZXx8dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQuaGVpZ2h0IT09dCl7dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQhPT1udWxsJiZ0aGlzLl9kaXNwb3NlKCksdGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ9UWQoZSx0LG4pO2NvbnN0e19sb2RNYXg6c309dGhpczsoe3NpemVMb2RzOnRoaXMuX3NpemVMb2RzLGxvZFBsYW5lczp0aGlzLl9sb2RQbGFuZXMsc2lnbWFzOnRoaXMuX3NpZ21hc309QnYocykpLHRoaXMuX2JsdXJNYXRlcmlhbD16dihzLGUsdCl9cmV0dXJuIGl9X2NvbXBpbGVNYXRlcmlhbChlKXtjb25zdCB0PW5ldyBMdCh0aGlzLl9sb2RQbGFuZXNbMF0sZSk7dGhpcy5fcmVuZGVyZXIuY29tcGlsZSh0LFNoKX1fc2NlbmVUb0N1YmVVVihlLHQsbixpKXtjb25zdCBvPW5ldyBCdCg5MCwxLHQsbiksbD1bMSwtMSwxLDEsMSwxXSxjPVsxLDEsMSwtMSwtMSwtMV0saD10aGlzLl9yZW5kZXJlcix1PWguYXV0b0NsZWFyLGY9aC50b25lTWFwcGluZztoLmdldENsZWFyQ29sb3IoSmQpLGgudG9uZU1hcHBpbmc9Sm4saC5hdXRvQ2xlYXI9ITE7Y29uc3QgZD1uZXcgUGkoe25hbWU6IlBNUkVNLkJhY2tncm91bmQiLHNpZGU6WXQsZGVwdGhXcml0ZTohMSxkZXB0aFRlc3Q6ITF9KSxwPW5ldyBMdChuZXcgWWksZCk7bGV0IF89ITE7Y29uc3QgZz1lLmJhY2tncm91bmQ7Zz9nLmlzQ29sb3ImJihkLmNvbG9yLmNvcHkoZyksZS5iYWNrZ3JvdW5kPW51bGwsXz0hMCk6KGQuY29sb3IuY29weShKZCksXz0hMCk7Zm9yKGxldCBtPTA7bTw2O20rKyl7Y29uc3QgeT1tJTM7eT09PTA/KG8udXAuc2V0KDAsbFttXSwwKSxvLmxvb2tBdChjW21dLDAsMCkpOnk9PT0xPyhvLnVwLnNldCgwLDAsbFttXSksby5sb29rQXQoMCxjW21dLDApKTooby51cC5zZXQoMCxsW21dLDApLG8ubG9va0F0KDAsMCxjW21dKSk7Y29uc3QgeD10aGlzLl9jdWJlU2l6ZTtNbyhpLHkqeCxtPjI/eDowLHgseCksaC5zZXRSZW5kZXJUYXJnZXQoaSksXyYmaC5yZW5kZXIocCxvKSxoLnJlbmRlcihlLG8pfXAuZ2VvbWV0cnkuZGlzcG9zZSgpLHAubWF0ZXJpYWwuZGlzcG9zZSgpLGgudG9uZU1hcHBpbmc9ZixoLmF1dG9DbGVhcj11LGUuYmFja2dyb3VuZD1nfV90ZXh0dXJlVG9DdWJlVVYoZSx0KXtjb25zdCBuPXRoaXMuX3JlbmRlcmVyLGk9ZS5tYXBwaW5nPT09S258fGUubWFwcGluZz09PXlpO2k/KHRoaXMuX2N1YmVtYXBNYXRlcmlhbD09PW51bGwmJih0aGlzLl9jdWJlbWFwTWF0ZXJpYWw9ZXAoKSksdGhpcy5fY3ViZW1hcE1hdGVyaWFsLnVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWU9ZS5pc1JlbmRlclRhcmdldFRleHR1cmU9PT0hMT8tMToxKTp0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPT09bnVsbCYmKHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWw9amQoKSk7Y29uc3Qgcz1pP3RoaXMuX2N1YmVtYXBNYXRlcmlhbDp0aGlzLl9lcXVpcmVjdE1hdGVyaWFsLGE9bmV3IEx0KHRoaXMuX2xvZFBsYW5lc1swXSxzKSxvPXMudW5pZm9ybXM7by5lbnZNYXAudmFsdWU9ZTtjb25zdCBsPXRoaXMuX2N1YmVTaXplO01vKHQsMCwwLDMqbCwyKmwpLG4uc2V0UmVuZGVyVGFyZ2V0KHQpLG4ucmVuZGVyKGEsU2gpfV9hcHBseVBNUkVNKGUpe2NvbnN0IHQ9dGhpcy5fcmVuZGVyZXIsbj10LmF1dG9DbGVhcjt0LmF1dG9DbGVhcj0hMTtmb3IobGV0IGk9MTtpPHRoaXMuX2xvZFBsYW5lcy5sZW5ndGg7aSsrKXtjb25zdCBzPU1hdGguc3FydCh0aGlzLl9zaWdtYXNbaV0qdGhpcy5fc2lnbWFzW2ldLXRoaXMuX3NpZ21hc1tpLTFdKnRoaXMuX3NpZ21hc1tpLTFdKSxhPUtkWyhpLTEpJUtkLmxlbmd0aF07dGhpcy5fYmx1cihlLGktMSxpLHMsYSl9dC5hdXRvQ2xlYXI9bn1fYmx1cihlLHQsbixpLHMpe2NvbnN0IGE9dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQ7dGhpcy5faGFsZkJsdXIoZSxhLHQsbixpLCJsYXRpdHVkaW5hbCIscyksdGhpcy5faGFsZkJsdXIoYSxlLG4sbixpLCJsb25naXR1ZGluYWwiLHMpfV9oYWxmQmx1cihlLHQsbixpLHMsYSxvKXtjb25zdCBsPXRoaXMuX3JlbmRlcmVyLGM9dGhpcy5fYmx1ck1hdGVyaWFsO2EhPT0ibGF0aXR1ZGluYWwiJiZhIT09ImxvbmdpdHVkaW5hbCImJmNvbnNvbGUuZXJyb3IoImJsdXIgZGlyZWN0aW9uIG11c3QgYmUgZWl0aGVyIGxhdGl0dWRpbmFsIG9yIGxvbmdpdHVkaW5hbCEiKTtjb25zdCBoPTMsdT1uZXcgTHQodGhpcy5fbG9kUGxhbmVzW2ldLGMpLGY9Yy51bmlmb3JtcyxkPXRoaXMuX3NpemVMb2RzW25dLTEscD1pc0Zpbml0ZShzKT9NYXRoLlBJLygyKmQpOjIqTWF0aC5QSS8oMipKaS0xKSxfPXMvcCxnPWlzRmluaXRlKHMpPzErTWF0aC5mbG9vcihoKl8pOkppO2c+SmkmJmNvbnNvbGUud2Fybihgc2lnbWFSYWRpYW5zLCAke3N9LCBpcyB0b28gbGFyZ2UgYW5kIHdpbGwgY2xpcCwgYXMgaXQgcmVxdWVzdGVkICR7Z30gc2FtcGxlcyB3aGVuIHRoZSBtYXhpbXVtIGlzIHNldCB0byAke0ppfWApO2NvbnN0IG09W107bGV0IHk9MDtmb3IobGV0IEE9MDtBPEppOysrQSl7Y29uc3QgTD1BL18sTT1NYXRoLmV4cCgtTCpMLzIpO20ucHVzaChNKSxBPT09MD95Kz1NOkE8ZyYmKHkrPTIqTSl9Zm9yKGxldCBBPTA7QTxtLmxlbmd0aDtBKyspbVtBXT1tW0FdL3k7Zi5lbnZNYXAudmFsdWU9ZS50ZXh0dXJlLGYuc2FtcGxlcy52YWx1ZT1nLGYud2VpZ2h0cy52YWx1ZT1tLGYubGF0aXR1ZGluYWwudmFsdWU9YT09PSJsYXRpdHVkaW5hbCIsbyYmKGYucG9sZUF4aXMudmFsdWU9byk7Y29uc3R7X2xvZE1heDp4fT10aGlzO2YuZFRoZXRhLnZhbHVlPXAsZi5taXBJbnQudmFsdWU9eC1uO2NvbnN0IHY9dGhpcy5fc2l6ZUxvZHNbaV0sUz0zKnYqKGk+eC1Ycj9pLXgrWHI6MCksYj00Kih0aGlzLl9jdWJlU2l6ZS12KTtNbyh0LFMsYiwzKnYsMip2KSxsLnNldFJlbmRlclRhcmdldCh0KSxsLnJlbmRlcih1LFNoKX19ZnVuY3Rpb24gQnYocil7Y29uc3QgZT1bXSx0PVtdLG49W107bGV0IGk9cjtjb25zdCBzPXItWHIrMStaZC5sZW5ndGg7Zm9yKGxldCBhPTA7YTxzO2ErKyl7Y29uc3Qgbz1NYXRoLnBvdygyLGkpO3QucHVzaChvKTtsZXQgbD0xL287YT5yLVhyP2w9WmRbYS1yK1hyLTFdOmE9PT0wJiYobD0wKSxuLnB1c2gobCk7Y29uc3QgYz0xLyhvLTIpLGg9LWMsdT0xK2MsZj1baCxoLHUsaCx1LHUsaCxoLHUsdSxoLHVdLGQ9NixwPTYsXz0zLGc9MixtPTEseT1uZXcgRmxvYXQzMkFycmF5KF8qcCpkKSx4PW5ldyBGbG9hdDMyQXJyYXkoZypwKmQpLHY9bmV3IEZsb2F0MzJBcnJheShtKnAqZCk7Zm9yKGxldCBiPTA7YjxkO2IrKyl7Y29uc3QgQT1iJTMqMi8zLTEsTD1iPjI/MDotMSxNPVtBLEwsMCxBKzIvMyxMLDAsQSsyLzMsTCsxLDAsQSxMLDAsQSsyLzMsTCsxLDAsQSxMKzEsMF07eS5zZXQoTSxfKnAqYikseC5zZXQoZixnKnAqYik7Y29uc3Qgdz1bYixiLGIsYixiLGJdO3Yuc2V0KHcsbSpwKmIpfWNvbnN0IFM9bmV3IGtlO1Muc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEtlKHksXykpLFMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IEtlKHgsZykpLFMuc2V0QXR0cmlidXRlKCJmYWNlSW5kZXgiLG5ldyBLZSh2LG0pKSxlLnB1c2goUyksaT5YciYmaS0tfXJldHVybntsb2RQbGFuZXM6ZSxzaXplTG9kczp0LHNpZ21hczpufX1mdW5jdGlvbiBRZChyLGUsdCl7Y29uc3Qgbj1uZXcgTG4ocixlLHQpO3JldHVybiBuLnRleHR1cmUubWFwcGluZz1icixuLnRleHR1cmUubmFtZT0iUE1SRU0uY3ViZVV2IixuLnNjaXNzb3JUZXN0PSEwLG59ZnVuY3Rpb24gTW8ocixlLHQsbixpKXtyLnZpZXdwb3J0LnNldChlLHQsbixpKSxyLnNjaXNzb3Iuc2V0KGUsdCxuLGkpfWZ1bmN0aW9uIHp2KHIsZSx0KXtjb25zdCBuPW5ldyBGbG9hdDMyQXJyYXkoSmkpLGk9bmV3IFAoMCwxLDApO3JldHVybiBuZXcgSG4oe25hbWU6IlNwaGVyaWNhbEdhdXNzaWFuQmx1ciIsZGVmaW5lczp7bjpKaSxDVUJFVVZfVEVYRUxfV0lEVEg6MS9lLENVQkVVVl9URVhFTF9IRUlHSFQ6MS90LENVQkVVVl9NQVhfTUlQOmAke3J9LjBgfSx1bmlmb3Jtczp7ZW52TWFwOnt2YWx1ZTpudWxsfSxzYW1wbGVzOnt2YWx1ZToxfSx3ZWlnaHRzOnt2YWx1ZTpufSxsYXRpdHVkaW5hbDp7dmFsdWU6ITF9LGRUaGV0YTp7dmFsdWU6MH0sbWlwSW50Ont2YWx1ZTowfSxwb2xlQXhpczp7dmFsdWU6aX19LHZlcnRleFNoYWRlcjpUaCgpLGZyYWdtZW50U2hhZGVyOmAKCgkJCXByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoJCQlwcmVjaXNpb24gbWVkaXVtcCBpbnQ7CgoJCQl2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjsKCgkJCXVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDsKCQkJdW5pZm9ybSBpbnQgc2FtcGxlczsKCQkJdW5pZm9ybSBmbG9hdCB3ZWlnaHRzWyBuIF07CgkJCXVuaWZvcm0gYm9vbCBsYXRpdHVkaW5hbDsKCQkJdW5pZm9ybSBmbG9hdCBkVGhldGE7CgkJCXVuaWZvcm0gZmxvYXQgbWlwSW50OwoJCQl1bmlmb3JtIHZlYzMgcG9sZUF4aXM7CgoJCQkjZGVmaW5lIEVOVk1BUF9UWVBFX0NVQkVfVVYKCQkJI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD4KCgkJCXZlYzMgZ2V0U2FtcGxlKCBmbG9hdCB0aGV0YSwgdmVjMyBheGlzICkgewoKCQkJCWZsb2F0IGNvc1RoZXRhID0gY29zKCB0aGV0YSApOwoJCQkJLy8gUm9kcmlndWVzJyBheGlzLWFuZ2xlIHJvdGF0aW9uCgkJCQl2ZWMzIHNhbXBsZURpcmVjdGlvbiA9IHZPdXRwdXREaXJlY3Rpb24gKiBjb3NUaGV0YQoJCQkJCSsgY3Jvc3MoIGF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKSAqIHNpbiggdGhldGEgKQoJCQkJCSsgYXhpcyAqIGRvdCggYXhpcywgdk91dHB1dERpcmVjdGlvbiApICogKCAxLjAgLSBjb3NUaGV0YSApOwoKCQkJCXJldHVybiBiaWxpbmVhckN1YmVVViggZW52TWFwLCBzYW1wbGVEaXJlY3Rpb24sIG1pcEludCApOwoKCQkJfQoKCQkJdm9pZCBtYWluKCkgewoKCQkJCXZlYzMgYXhpcyA9IGxhdGl0dWRpbmFsID8gcG9sZUF4aXMgOiBjcm9zcyggcG9sZUF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKTsKCgkJCQlpZiAoIGFsbCggZXF1YWwoIGF4aXMsIHZlYzMoIDAuMCApICkgKSApIHsKCgkJCQkJYXhpcyA9IHZlYzMoIHZPdXRwdXREaXJlY3Rpb24ueiwgMC4wLCAtIHZPdXRwdXREaXJlY3Rpb24ueCApOwoKCQkJCX0KCgkJCQlheGlzID0gbm9ybWFsaXplKCBheGlzICk7CgoJCQkJZ2xfRnJhZ0NvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7CgkJCQlnbF9GcmFnQ29sb3IucmdiICs9IHdlaWdodHNbIDAgXSAqIGdldFNhbXBsZSggMC4wLCBheGlzICk7CgoJCQkJZm9yICggaW50IGkgPSAxOyBpIDwgbjsgaSsrICkgewoKCQkJCQlpZiAoIGkgPj0gc2FtcGxlcyApIHsKCgkJCQkJCWJyZWFrOwoKCQkJCQl9CgoJCQkJCWZsb2F0IHRoZXRhID0gZFRoZXRhICogZmxvYXQoIGkgKTsKCQkJCQlnbF9GcmFnQ29sb3IucmdiICs9IHdlaWdodHNbIGkgXSAqIGdldFNhbXBsZSggLTEuMCAqIHRoZXRhLCBheGlzICk7CgkJCQkJZ2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyBpIF0gKiBnZXRTYW1wbGUoIHRoZXRhLCBheGlzICk7CgoJCQkJfQoKCQkJfQoJCWAsYmxlbmRpbmc6Wm4sZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITF9KX1mdW5jdGlvbiBqZCgpe3JldHVybiBuZXcgSG4oe25hbWU6IkVxdWlyZWN0YW5ndWxhclRvQ3ViZVVWIix1bmlmb3Jtczp7ZW52TWFwOnt2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOlRoKCksZnJhZ21lbnRTaGFkZXI6YAoKCQkJcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7CgkJCXByZWNpc2lvbiBtZWRpdW1wIGludDsKCgkJCXZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uOwoKCQkJdW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwOwoKCQkJI2luY2x1ZGUgPGNvbW1vbj4KCgkJCXZvaWQgbWFpbigpIHsKCgkJCQl2ZWMzIG91dHB1dERpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdk91dHB1dERpcmVjdGlvbiApOwoJCQkJdmVjMiB1diA9IGVxdWlyZWN0VXYoIG91dHB1dERpcmVjdGlvbiApOwoKCQkJCWdsX0ZyYWdDb2xvciA9IHZlYzQoIHRleHR1cmUyRCAoIGVudk1hcCwgdXYgKS5yZ2IsIDEuMCApOwoKCQkJfQoJCWAsYmxlbmRpbmc6Wm4sZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITF9KX1mdW5jdGlvbiBlcCgpe3JldHVybiBuZXcgSG4oe25hbWU6IkN1YmVtYXBUb0N1YmVVViIsdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0sZmxpcEVudk1hcDp7dmFsdWU6LTF9fSx2ZXJ0ZXhTaGFkZXI6VGgoKSxmcmFnbWVudFNoYWRlcjpgCgoJCQlwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsKCQkJcHJlY2lzaW9uIG1lZGl1bXAgaW50OwoKCQkJdW5pZm9ybSBmbG9hdCBmbGlwRW52TWFwOwoKCQkJdmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247CgoJCQl1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDsKCgkJCXZvaWQgbWFpbigpIHsKCgkJCQlnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCB2ZWMzKCBmbGlwRW52TWFwICogdk91dHB1dERpcmVjdGlvbi54LCB2T3V0cHV0RGlyZWN0aW9uLnl6ICkgKTsKCgkJCX0KCQlgLGJsZW5kaW5nOlpuLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExfSl9ZnVuY3Rpb24gVGgoKXtyZXR1cm5gCgoJCXByZWNpc2lvbiBtZWRpdW1wIGZsb2F0OwoJCXByZWNpc2lvbiBtZWRpdW1wIGludDsKCgkJYXR0cmlidXRlIGZsb2F0IGZhY2VJbmRleDsKCgkJdmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247CgoJCS8vIFJIIGNvb3JkaW5hdGUgc3lzdGVtOyBQTVJFTSBmYWNlLWluZGV4aW5nIGNvbnZlbnRpb24KCQl2ZWMzIGdldERpcmVjdGlvbiggdmVjMiB1diwgZmxvYXQgZmFjZSApIHsKCgkJCXV2ID0gMi4wICogdXYgLSAxLjA7CgoJCQl2ZWMzIGRpcmVjdGlvbiA9IHZlYzMoIHV2LCAxLjAgKTsKCgkJCWlmICggZmFjZSA9PSAwLjAgKSB7CgoJCQkJZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDsgLy8gKCAxLCB2LCB1ICkgcG9zIHgKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkgewoKCQkJCWRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7CgkJCQlkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtdSwgMSwgLXYgKSBwb3MgeQoKCQkJfSBlbHNlIGlmICggZmFjZSA9PSAyLjAgKSB7CgoJCQkJZGlyZWN0aW9uLnggKj0gLTEuMDsgLy8gKCAtdSwgdiwgMSApIHBvcyB6CgoJCQl9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHsKCgkJCQlkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4OwoJCQkJZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLTEsIHYsIC11ICkgbmVnIHgKCgkJCX0gZWxzZSBpZiAoIGZhY2UgPT0gNC4wICkgewoKCQkJCWRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7CgkJCQlkaXJlY3Rpb24ueHkgKj0gLTEuMDsgLy8gKCAtdSwgLTEsIHYgKSBuZWcgeQoKCQkJfSBlbHNlIGlmICggZmFjZSA9PSA1LjAgKSB7CgoJCQkJZGlyZWN0aW9uLnogKj0gLTEuMDsgLy8gKCB1LCB2LCAtMSApIG5lZyB6CgoJCQl9CgoJCQlyZXR1cm4gZGlyZWN0aW9uOwoKCQl9CgoJCXZvaWQgbWFpbigpIHsKCgkJCXZPdXRwdXREaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oIHV2LCBmYWNlSW5kZXggKTsKCQkJZ2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7CgoJCX0KCWB9ZnVuY3Rpb24ga3Yocil7bGV0IGU9bmV3IFdlYWtNYXAsdD1udWxsO2Z1bmN0aW9uIG4obyl7aWYobyYmby5pc1RleHR1cmUpe2NvbnN0IGw9by5tYXBwaW5nLGM9bD09PWJzfHxsPT09d3MsaD1sPT09S258fGw9PT15aTtpZihjfHxoKWlmKG8uaXNSZW5kZXJUYXJnZXRUZXh0dXJlJiZvLm5lZWRzUE1SRU1VcGRhdGU9PT0hMCl7by5uZWVkc1BNUkVNVXBkYXRlPSExO2xldCB1PWUuZ2V0KG8pO3JldHVybiB0PT09bnVsbCYmKHQ9bmV3IEFoKHIpKSx1PWM/dC5mcm9tRXF1aXJlY3Rhbmd1bGFyKG8sdSk6dC5mcm9tQ3ViZW1hcChvLHUpLGUuc2V0KG8sdSksdS50ZXh0dXJlfWVsc2V7aWYoZS5oYXMobykpcmV0dXJuIGUuZ2V0KG8pLnRleHR1cmU7e2NvbnN0IHU9by5pbWFnZTtpZihjJiZ1JiZ1LmhlaWdodD4wfHxoJiZ1JiZpKHUpKXt0PT09bnVsbCYmKHQ9bmV3IEFoKHIpKTtjb25zdCBmPWM/dC5mcm9tRXF1aXJlY3Rhbmd1bGFyKG8pOnQuZnJvbUN1YmVtYXAobyk7cmV0dXJuIGUuc2V0KG8sZiksby5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixzKSxmLnRleHR1cmV9ZWxzZSByZXR1cm4gbnVsbH19fXJldHVybiBvfWZ1bmN0aW9uIGkobyl7bGV0IGw9MDtjb25zdCBjPTY7Zm9yKGxldCBoPTA7aDxjO2grKylvW2hdIT09dm9pZCAwJiZsKys7cmV0dXJuIGw9PT1jfWZ1bmN0aW9uIHMobyl7Y29uc3QgbD1vLnRhcmdldDtsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHMpO2NvbnN0IGM9ZS5nZXQobCk7YyE9PXZvaWQgMCYmKGUuZGVsZXRlKGwpLGMuZGlzcG9zZSgpKX1mdW5jdGlvbiBhKCl7ZT1uZXcgV2Vha01hcCx0IT09bnVsbCYmKHQuZGlzcG9zZSgpLHQ9bnVsbCl9cmV0dXJue2dldDpuLGRpc3Bvc2U6YX19ZnVuY3Rpb24gR3Yocil7Y29uc3QgZT17fTtmdW5jdGlvbiB0KG4pe2lmKGVbbl0hPT12b2lkIDApcmV0dXJuIGVbbl07bGV0IGk7c3dpdGNoKG4pe2Nhc2UiV0VCR0xfZGVwdGhfdGV4dHVyZSI6aT1yLmdldEV4dGVuc2lvbigiV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHxyLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUiKXx8ci5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlIik7YnJlYWs7Y2FzZSJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiOmk9ci5nZXRFeHRlbnNpb24oIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpfHxyLmdldEV4dGVuc2lvbigiTU9aX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpfHxyLmdldEV4dGVuc2lvbigiV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO2JyZWFrO2Nhc2UiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiOmk9ci5nZXRFeHRlbnNpb24oIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fHIuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8ci5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpO2JyZWFrO2Nhc2UiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIjppPXIuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8ci5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKTticmVhaztkZWZhdWx0Omk9ci5nZXRFeHRlbnNpb24obil9cmV0dXJuIGVbbl09aSxpfXJldHVybntoYXM6ZnVuY3Rpb24obil7cmV0dXJuIHQobikhPT1udWxsfSxpbml0OmZ1bmN0aW9uKG4pe24uaXNXZWJHTDI/dCgiRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCIpOih0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIiksdCgiT0VTX3RleHR1cmVfZmxvYXQiKSx0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksdCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIiKSx0KCJPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMiKSx0KCJPRVNfZWxlbWVudF9pbmRleF91aW50IiksdCgiT0VTX3ZlcnRleF9hcnJheV9vYmplY3QiKSx0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpLHQoIk9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciIpLHQoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpLHQoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpfSxnZXQ6ZnVuY3Rpb24obil7Y29uc3QgaT10KG4pO3JldHVybiBpPT09bnVsbCYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK24rIiBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4iKSxpfX19ZnVuY3Rpb24gVnYocixlLHQsbil7Y29uc3QgaT17fSxzPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIGEodSl7Y29uc3QgZj11LnRhcmdldDtmLmluZGV4IT09bnVsbCYmZS5yZW1vdmUoZi5pbmRleCk7Zm9yKGNvbnN0IHAgaW4gZi5hdHRyaWJ1dGVzKWUucmVtb3ZlKGYuYXR0cmlidXRlc1twXSk7Zm9yKGNvbnN0IHAgaW4gZi5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IF89Zi5tb3JwaEF0dHJpYnV0ZXNbcF07Zm9yKGxldCBnPTAsbT1fLmxlbmd0aDtnPG07ZysrKWUucmVtb3ZlKF9bZ10pfWYucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSksZGVsZXRlIGlbZi5pZF07Y29uc3QgZD1zLmdldChmKTtkJiYoZS5yZW1vdmUoZCkscy5kZWxldGUoZikpLG4ucmVsZWFzZVN0YXRlc09mR2VvbWV0cnkoZiksZi5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PT09ITAmJmRlbGV0ZSBmLl9tYXhJbnN0YW5jZUNvdW50LHQubWVtb3J5Lmdlb21ldHJpZXMtLX1mdW5jdGlvbiBvKHUsZil7cmV0dXJuIGlbZi5pZF09PT0hMHx8KGYuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSksaVtmLmlkXT0hMCx0Lm1lbW9yeS5nZW9tZXRyaWVzKyspLGZ9ZnVuY3Rpb24gbCh1KXtjb25zdCBmPXUuYXR0cmlidXRlcztmb3IoY29uc3QgcCBpbiBmKWUudXBkYXRlKGZbcF0sci5BUlJBWV9CVUZGRVIpO2NvbnN0IGQ9dS5tb3JwaEF0dHJpYnV0ZXM7Zm9yKGNvbnN0IHAgaW4gZCl7Y29uc3QgXz1kW3BdO2ZvcihsZXQgZz0wLG09Xy5sZW5ndGg7ZzxtO2crKyllLnVwZGF0ZShfW2ddLHIuQVJSQVlfQlVGRkVSKX19ZnVuY3Rpb24gYyh1KXtjb25zdCBmPVtdLGQ9dS5pbmRleCxwPXUuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgXz0wO2lmKGQhPT1udWxsKXtjb25zdCB5PWQuYXJyYXk7Xz1kLnZlcnNpb247Zm9yKGxldCB4PTAsdj15Lmxlbmd0aDt4PHY7eCs9Myl7Y29uc3QgUz15W3grMF0sYj15W3grMV0sQT15W3grMl07Zi5wdXNoKFMsYixiLEEsQSxTKX19ZWxzZSBpZihwIT09dm9pZCAwKXtjb25zdCB5PXAuYXJyYXk7Xz1wLnZlcnNpb247Zm9yKGxldCB4PTAsdj15Lmxlbmd0aC8zLTE7eDx2O3grPTMpe2NvbnN0IFM9eCswLGI9eCsxLEE9eCsyO2YucHVzaChTLGIsYixBLEEsUyl9fWVsc2UgcmV0dXJuO2NvbnN0IGc9bmV3KHdkKGYpP3hoOl9oKShmLDEpO2cudmVyc2lvbj1fO2NvbnN0IG09cy5nZXQodSk7bSYmZS5yZW1vdmUobSkscy5zZXQodSxnKX1mdW5jdGlvbiBoKHUpe2NvbnN0IGY9cy5nZXQodSk7aWYoZil7Y29uc3QgZD11LmluZGV4O2QhPT1udWxsJiZmLnZlcnNpb248ZC52ZXJzaW9uJiZjKHUpfWVsc2UgYyh1KTtyZXR1cm4gcy5nZXQodSl9cmV0dXJue2dldDpvLHVwZGF0ZTpsLGdldFdpcmVmcmFtZUF0dHJpYnV0ZTpofX1mdW5jdGlvbiBIdihyLGUsdCxuKXtjb25zdCBpPW4uaXNXZWJHTDI7bGV0IHM7ZnVuY3Rpb24gYShkKXtzPWR9bGV0IG8sbDtmdW5jdGlvbiBjKGQpe289ZC50eXBlLGw9ZC5ieXRlc1BlckVsZW1lbnR9ZnVuY3Rpb24gaChkLHApe3IuZHJhd0VsZW1lbnRzKHMscCxvLGQqbCksdC51cGRhdGUocCxzLDEpfWZ1bmN0aW9uIHUoZCxwLF8pe2lmKF89PT0wKXJldHVybjtsZXQgZyxtO2lmKGkpZz1yLG09ImRyYXdFbGVtZW50c0luc3RhbmNlZCI7ZWxzZSBpZihnPWUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiksbT0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLGc9PT1udWxsKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7cmV0dXJufWdbbV0ocyxwLG8sZCpsLF8pLHQudXBkYXRlKHAscyxfKX1mdW5jdGlvbiBmKGQscCxfKXtpZihfPT09MClyZXR1cm47Y29uc3QgZz1lLmdldCgiV0VCR0xfbXVsdGlfZHJhdyIpO2lmKGc9PT1udWxsKWZvcihsZXQgbT0wO208XzttKyspdGhpcy5yZW5kZXIoZFttXS9sLHBbbV0pO2Vsc2V7Zy5tdWx0aURyYXdFbGVtZW50c1dFQkdMKHMscCwwLG8sZCwwLF8pO2xldCBtPTA7Zm9yKGxldCB5PTA7eTxfO3krKyltKz1wW3ldO3QudXBkYXRlKG0scywxKX19dGhpcy5zZXRNb2RlPWEsdGhpcy5zZXRJbmRleD1jLHRoaXMucmVuZGVyPWgsdGhpcy5yZW5kZXJJbnN0YW5jZXM9dSx0aGlzLnJlbmRlck11bHRpRHJhdz1mfWZ1bmN0aW9uIFd2KHIpe2NvbnN0IGU9e2dlb21ldHJpZXM6MCx0ZXh0dXJlczowfSx0PXtmcmFtZTowLGNhbGxzOjAsdHJpYW5nbGVzOjAscG9pbnRzOjAsbGluZXM6MH07ZnVuY3Rpb24gbihzLGEsbyl7c3dpdGNoKHQuY2FsbHMrKyxhKXtjYXNlIHIuVFJJQU5HTEVTOnQudHJpYW5nbGVzKz1vKihzLzMpO2JyZWFrO2Nhc2Ugci5MSU5FUzp0LmxpbmVzKz1vKihzLzIpO2JyZWFrO2Nhc2Ugci5MSU5FX1NUUklQOnQubGluZXMrPW8qKHMtMSk7YnJlYWs7Y2FzZSByLkxJTkVfTE9PUDp0LmxpbmVzKz1vKnM7YnJlYWs7Y2FzZSByLlBPSU5UUzp0LnBvaW50cys9bypzO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLGEpO2JyZWFrfX1mdW5jdGlvbiBpKCl7dC5jYWxscz0wLHQudHJpYW5nbGVzPTAsdC5wb2ludHM9MCx0LmxpbmVzPTB9cmV0dXJue21lbW9yeTplLHJlbmRlcjp0LHByb2dyYW1zOm51bGwsYXV0b1Jlc2V0OiEwLHJlc2V0OmksdXBkYXRlOm59fWZ1bmN0aW9uIFh2KHIsZSl7cmV0dXJuIHJbMF0tZVswXX1mdW5jdGlvbiBxdihyLGUpe3JldHVybiBNYXRoLmFicyhlWzFdKS1NYXRoLmFicyhyWzFdKX1mdW5jdGlvbiAkdihyLGUsdCl7Y29uc3Qgbj17fSxpPW5ldyBGbG9hdDMyQXJyYXkoOCkscz1uZXcgV2Vha01hcCxhPW5ldyBsdCxvPVtdO2ZvcihsZXQgYz0wO2M8ODtjKyspb1tjXT1bYywwXTtmdW5jdGlvbiBsKGMsaCx1KXtjb25zdCBmPWMubW9ycGhUYXJnZXRJbmZsdWVuY2VzO2lmKGUuaXNXZWJHTDI9PT0hMCl7Y29uc3QgZD1oLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbnx8aC5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsfHxoLm1vcnBoQXR0cmlidXRlcy5jb2xvcixwPWQhPT12b2lkIDA/ZC5sZW5ndGg6MDtsZXQgXz1zLmdldChoKTtpZihfPT09dm9pZCAwfHxfLmNvdW50IT09cCl7bGV0IEk9ZnVuY3Rpb24oKXtOLmRpc3Bvc2UoKSxzLmRlbGV0ZShoKSxoLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLEkpfTtfIT09dm9pZCAwJiZfLnRleHR1cmUuZGlzcG9zZSgpO2NvbnN0IHk9aC5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDAseD1oLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwhPT12b2lkIDAsdj1oLm1vcnBoQXR0cmlidXRlcy5jb2xvciE9PXZvaWQgMCxTPWgubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9ufHxbXSxiPWgubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbHx8W10sQT1oLm1vcnBoQXR0cmlidXRlcy5jb2xvcnx8W107bGV0IEw9MDt5PT09ITAmJihMPTEpLHg9PT0hMCYmKEw9Miksdj09PSEwJiYoTD0zKTtsZXQgTT1oLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQqTCx3PTE7TT5lLm1heFRleHR1cmVTaXplJiYodz1NYXRoLmNlaWwoTS9lLm1heFRleHR1cmVTaXplKSxNPWUubWF4VGV4dHVyZVNpemUpO2NvbnN0IFI9bmV3IEZsb2F0MzJBcnJheShNKncqNCpwKSxOPW5ldyBKYShSLE0sdyxwKTtOLnR5cGU9Um4sTi5uZWVkc1VwZGF0ZT0hMDtjb25zdCBCPUwqNDtmb3IobGV0IFU9MDtVPHA7VSsrKXtjb25zdCB6PVNbVV0sRj1iW1VdLFo9QVtVXSxWPU0qdyo0KlU7Zm9yKGxldCBRPTA7UTx6LmNvdW50O1ErKyl7Y29uc3QgbmU9USpCO3k9PT0hMCYmKGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh6LFEpLFJbVituZSswXT1hLngsUltWK25lKzFdPWEueSxSW1YrbmUrMl09YS56LFJbVituZSszXT0wKSx4PT09ITAmJihhLmZyb21CdWZmZXJBdHRyaWJ1dGUoRixRKSxSW1YrbmUrNF09YS54LFJbVituZSs1XT1hLnksUltWK25lKzZdPWEueixSW1YrbmUrN109MCksdj09PSEwJiYoYS5mcm9tQnVmZmVyQXR0cmlidXRlKFosUSksUltWK25lKzhdPWEueCxSW1YrbmUrOV09YS55LFJbVituZSsxMF09YS56LFJbVituZSsxMV09Wi5pdGVtU2l6ZT09PTQ/YS53OjEpfX1fPXtjb3VudDpwLHRleHR1cmU6TixzaXplOm5ldyBxKE0sdyl9LHMuc2V0KGgsXyksaC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixJKX1sZXQgZz0wO2ZvcihsZXQgeT0wO3k8Zi5sZW5ndGg7eSsrKWcrPWZbeV07Y29uc3QgbT1oLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPzE6MS1nO3UuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShyLCJtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2UiLG0pLHUuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShyLCJtb3JwaFRhcmdldEluZmx1ZW5jZXMiLGYpLHUuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZShyLCJtb3JwaFRhcmdldHNUZXh0dXJlIixfLnRleHR1cmUsdCksdS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKHIsIm1vcnBoVGFyZ2V0c1RleHR1cmVTaXplIixfLnNpemUpfWVsc2V7Y29uc3QgZD1mPT09dm9pZCAwPzA6Zi5sZW5ndGg7bGV0IHA9bltoLmlkXTtpZihwPT09dm9pZCAwfHxwLmxlbmd0aCE9PWQpe3A9W107Zm9yKGxldCB4PTA7eDxkO3grKylwW3hdPVt4LDBdO25baC5pZF09cH1mb3IobGV0IHg9MDt4PGQ7eCsrKXtjb25zdCB2PXBbeF07dlswXT14LHZbMV09Zlt4XX1wLnNvcnQocXYpO2ZvcihsZXQgeD0wO3g8ODt4KyspeDxkJiZwW3hdWzFdPyhvW3hdWzBdPXBbeF1bMF0sb1t4XVsxXT1wW3hdWzFdKToob1t4XVswXT1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUixvW3hdWzFdPTApO28uc29ydChYdik7Y29uc3QgXz1oLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixnPWgubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtsZXQgbT0wO2ZvcihsZXQgeD0wO3g8ODt4Kyspe2NvbnN0IHY9b1t4XSxTPXZbMF0sYj12WzFdO1MhPT1OdW1iZXIuTUFYX1NBRkVfSU5URUdFUiYmYj8oXyYmaC5nZXRBdHRyaWJ1dGUoIm1vcnBoVGFyZ2V0Iit4KSE9PV9bU10mJmguc2V0QXR0cmlidXRlKCJtb3JwaFRhcmdldCIreCxfW1NdKSxnJiZoLmdldEF0dHJpYnV0ZSgibW9ycGhOb3JtYWwiK3gpIT09Z1tTXSYmaC5zZXRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIit4LGdbU10pLGlbeF09YixtKz1iKTooXyYmaC5oYXNBdHRyaWJ1dGUoIm1vcnBoVGFyZ2V0Iit4KT09PSEwJiZoLmRlbGV0ZUF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK3gpLGcmJmguaGFzQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIreCk9PT0hMCYmaC5kZWxldGVBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIit4KSxpW3hdPTApfWNvbnN0IHk9aC5tb3JwaFRhcmdldHNSZWxhdGl2ZT8xOjEtbTt1LmdldFVuaWZvcm1zKCkuc2V0VmFsdWUociwibW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlIix5KSx1LmdldFVuaWZvcm1zKCkuc2V0VmFsdWUociwibW9ycGhUYXJnZXRJbmZsdWVuY2VzIixpKX19cmV0dXJue3VwZGF0ZTpsfX1mdW5jdGlvbiBZdihyLGUsdCxuKXtsZXQgaT1uZXcgV2Vha01hcDtmdW5jdGlvbiBzKGwpe2NvbnN0IGM9bi5yZW5kZXIuZnJhbWUsaD1sLmdlb21ldHJ5LHU9ZS5nZXQobCxoKTtpZihpLmdldCh1KSE9PWMmJihlLnVwZGF0ZSh1KSxpLnNldCh1LGMpKSxsLmlzSW5zdGFuY2VkTWVzaCYmKGwuaGFzRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbyk9PT0hMSYmbC5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixvKSxpLmdldChsKSE9PWMmJih0LnVwZGF0ZShsLmluc3RhbmNlTWF0cml4LHIuQVJSQVlfQlVGRkVSKSxsLmluc3RhbmNlQ29sb3IhPT1udWxsJiZ0LnVwZGF0ZShsLmluc3RhbmNlQ29sb3Isci5BUlJBWV9CVUZGRVIpLGkuc2V0KGwsYykpKSxsLmlzU2tpbm5lZE1lc2gpe2NvbnN0IGY9bC5za2VsZXRvbjtpLmdldChmKSE9PWMmJihmLnVwZGF0ZSgpLGkuc2V0KGYsYykpfXJldHVybiB1fWZ1bmN0aW9uIGEoKXtpPW5ldyBXZWFrTWFwfWZ1bmN0aW9uIG8obCl7Y29uc3QgYz1sLnRhcmdldDtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLG8pLHQucmVtb3ZlKGMuaW5zdGFuY2VNYXRyaXgpLGMuaW5zdGFuY2VDb2xvciE9PW51bGwmJnQucmVtb3ZlKGMuaW5zdGFuY2VDb2xvcil9cmV0dXJue3VwZGF0ZTpzLGRpc3Bvc2U6YX19Y2xhc3MgQ2ggZXh0ZW5kcyBFdHtjb25zdHJ1Y3RvcihlLHQsbixpLHMsYSxvLGwsYyxoKXtpZihoPWghPT12b2lkIDA/aDpTaSxoIT09U2kmJmghPT16aSl0aHJvdyBuZXcgRXJyb3IoIkRlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0Iik7bj09PXZvaWQgMCYmaD09PVNpJiYobj1qbiksbj09PXZvaWQgMCYmaD09PXppJiYobj1NaSksc3VwZXIobnVsbCxpLHMsYSxvLGwsaCxuLGMpLHRoaXMuaXNEZXB0aFRleHR1cmU9ITAsdGhpcy5pbWFnZT17d2lkdGg6ZSxoZWlnaHQ6dH0sdGhpcy5tYWdGaWx0ZXI9byE9PXZvaWQgMD9vOmJ0LHRoaXMubWluRmlsdGVyPWwhPT12b2lkIDA/bDpidCx0aGlzLmZsaXBZPSExLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuY29tcGFyZUZ1bmN0aW9uPW51bGx9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLmNvbXBhcmVGdW5jdGlvbj1lLmNvbXBhcmVGdW5jdGlvbix0aGlzfXRvSlNPTihlKXtjb25zdCB0PXN1cGVyLnRvSlNPTihlKTtyZXR1cm4gdGhpcy5jb21wYXJlRnVuY3Rpb24hPT1udWxsJiYodC5jb21wYXJlRnVuY3Rpb249dGhpcy5jb21wYXJlRnVuY3Rpb24pLHR9fWNvbnN0IHRwPW5ldyBFdCxucD1uZXcgQ2goMSwxKTtucC5jb21wYXJlRnVuY3Rpb249S2M7Y29uc3QgaXA9bmV3IEphLHJwPW5ldyBzaCxzcD1uZXcgWHMsYXA9W10sb3A9W10sbHA9bmV3IEZsb2F0MzJBcnJheSgxNiksY3A9bmV3IEZsb2F0MzJBcnJheSg5KSxocD1uZXcgRmxvYXQzMkFycmF5KDQpO2Z1bmN0aW9uICRyKHIsZSx0KXtjb25zdCBuPXJbMF07aWYobjw9MHx8bj4wKXJldHVybiByO2NvbnN0IGk9ZSp0O2xldCBzPWFwW2ldO2lmKHM9PT12b2lkIDAmJihzPW5ldyBGbG9hdDMyQXJyYXkoaSksYXBbaV09cyksZSE9PTApe24udG9BcnJheShzLDApO2ZvcihsZXQgYT0xLG89MDthIT09ZTsrK2Epbys9dCxyW2FdLnRvQXJyYXkocyxvKX1yZXR1cm4gc31mdW5jdGlvbiBJdChyLGUpe2lmKHIubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCB0PTAsbj1yLmxlbmd0aDt0PG47dCsrKWlmKHJbdF0hPT1lW3RdKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIFV0KHIsZSl7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXJbdF09ZVt0XX1mdW5jdGlvbiBTbyhyLGUpe2xldCB0PW9wW2VdO3Q9PT12b2lkIDAmJih0PW5ldyBJbnQzMkFycmF5KGUpLG9wW2VdPXQpO2ZvcihsZXQgbj0wO24hPT1lOysrbil0W25dPXIuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO3JldHVybiB0fWZ1bmN0aW9uIFp2KHIsZSl7Y29uc3QgdD10aGlzLmNhY2hlO3RbMF0hPT1lJiYoci51bmlmb3JtMWYodGhpcy5hZGRyLGUpLHRbMF09ZSl9ZnVuY3Rpb24gSnYocixlKXtjb25zdCB0PXRoaXMuY2FjaGU7aWYoZS54IT09dm9pZCAwKSh0WzBdIT09ZS54fHx0WzFdIT09ZS55KSYmKHIudW5pZm9ybTJmKHRoaXMuYWRkcixlLngsZS55KSx0WzBdPWUueCx0WzFdPWUueSk7ZWxzZXtpZihJdCh0LGUpKXJldHVybjtyLnVuaWZvcm0yZnYodGhpcy5hZGRyLGUpLFV0KHQsZSl9fWZ1bmN0aW9uIEt2KHIsZSl7Y29uc3QgdD10aGlzLmNhY2hlO2lmKGUueCE9PXZvaWQgMCkodFswXSE9PWUueHx8dFsxXSE9PWUueXx8dFsyXSE9PWUueikmJihyLnVuaWZvcm0zZih0aGlzLmFkZHIsZS54LGUueSxlLnopLHRbMF09ZS54LHRbMV09ZS55LHRbMl09ZS56KTtlbHNlIGlmKGUuciE9PXZvaWQgMCkodFswXSE9PWUucnx8dFsxXSE9PWUuZ3x8dFsyXSE9PWUuYikmJihyLnVuaWZvcm0zZih0aGlzLmFkZHIsZS5yLGUuZyxlLmIpLHRbMF09ZS5yLHRbMV09ZS5nLHRbMl09ZS5iKTtlbHNle2lmKEl0KHQsZSkpcmV0dXJuO3IudW5pZm9ybTNmdih0aGlzLmFkZHIsZSksVXQodCxlKX19ZnVuY3Rpb24gUXYocixlKXtjb25zdCB0PXRoaXMuY2FjaGU7aWYoZS54IT09dm9pZCAwKSh0WzBdIT09ZS54fHx0WzFdIT09ZS55fHx0WzJdIT09ZS56fHx0WzNdIT09ZS53KSYmKHIudW5pZm9ybTRmKHRoaXMuYWRkcixlLngsZS55LGUueixlLncpLHRbMF09ZS54LHRbMV09ZS55LHRbMl09ZS56LHRbM109ZS53KTtlbHNle2lmKEl0KHQsZSkpcmV0dXJuO3IudW5pZm9ybTRmdih0aGlzLmFkZHIsZSksVXQodCxlKX19ZnVuY3Rpb24ganYocixlKXtjb25zdCB0PXRoaXMuY2FjaGUsbj1lLmVsZW1lbnRzO2lmKG49PT12b2lkIDApe2lmKEl0KHQsZSkpcmV0dXJuO3IudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsZSksVXQodCxlKX1lbHNle2lmKEl0KHQsbikpcmV0dXJuO2hwLnNldChuKSxyLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLGhwKSxVdCh0LG4pfX1mdW5jdGlvbiBlTShyLGUpe2NvbnN0IHQ9dGhpcy5jYWNoZSxuPWUuZWxlbWVudHM7aWYobj09PXZvaWQgMCl7aWYoSXQodCxlKSlyZXR1cm47ci51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxlKSxVdCh0LGUpfWVsc2V7aWYoSXQodCxuKSlyZXR1cm47Y3Auc2V0KG4pLHIudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsY3ApLFV0KHQsbil9fWZ1bmN0aW9uIHRNKHIsZSl7Y29uc3QgdD10aGlzLmNhY2hlLG49ZS5lbGVtZW50cztpZihuPT09dm9pZCAwKXtpZihJdCh0LGUpKXJldHVybjtyLnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLGUpLFV0KHQsZSl9ZWxzZXtpZihJdCh0LG4pKXJldHVybjtscC5zZXQobiksci51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxscCksVXQodCxuKX19ZnVuY3Rpb24gbk0ocixlKXtjb25zdCB0PXRoaXMuY2FjaGU7dFswXSE9PWUmJihyLnVuaWZvcm0xaSh0aGlzLmFkZHIsZSksdFswXT1lKX1mdW5jdGlvbiBpTShyLGUpe2NvbnN0IHQ9dGhpcy5jYWNoZTtpZihlLnghPT12b2lkIDApKHRbMF0hPT1lLnh8fHRbMV0hPT1lLnkpJiYoci51bmlmb3JtMmkodGhpcy5hZGRyLGUueCxlLnkpLHRbMF09ZS54LHRbMV09ZS55KTtlbHNle2lmKEl0KHQsZSkpcmV0dXJuO3IudW5pZm9ybTJpdih0aGlzLmFkZHIsZSksVXQodCxlKX19ZnVuY3Rpb24gck0ocixlKXtjb25zdCB0PXRoaXMuY2FjaGU7aWYoZS54IT09dm9pZCAwKSh0WzBdIT09ZS54fHx0WzFdIT09ZS55fHx0WzJdIT09ZS56KSYmKHIudW5pZm9ybTNpKHRoaXMuYWRkcixlLngsZS55LGUueiksdFswXT1lLngsdFsxXT1lLnksdFsyXT1lLnopO2Vsc2V7aWYoSXQodCxlKSlyZXR1cm47ci51bmlmb3JtM2l2KHRoaXMuYWRkcixlKSxVdCh0LGUpfX1mdW5jdGlvbiBzTShyLGUpe2NvbnN0IHQ9dGhpcy5jYWNoZTtpZihlLnghPT12b2lkIDApKHRbMF0hPT1lLnh8fHRbMV0hPT1lLnl8fHRbMl0hPT1lLnp8fHRbM10hPT1lLncpJiYoci51bmlmb3JtNGkodGhpcy5hZGRyLGUueCxlLnksZS56LGUudyksdFswXT1lLngsdFsxXT1lLnksdFsyXT1lLnosdFszXT1lLncpO2Vsc2V7aWYoSXQodCxlKSlyZXR1cm47ci51bmlmb3JtNGl2KHRoaXMuYWRkcixlKSxVdCh0LGUpfX1mdW5jdGlvbiBhTShyLGUpe2NvbnN0IHQ9dGhpcy5jYWNoZTt0WzBdIT09ZSYmKHIudW5pZm9ybTF1aSh0aGlzLmFkZHIsZSksdFswXT1lKX1mdW5jdGlvbiBvTShyLGUpe2NvbnN0IHQ9dGhpcy5jYWNoZTtpZihlLnghPT12b2lkIDApKHRbMF0hPT1lLnh8fHRbMV0hPT1lLnkpJiYoci51bmlmb3JtMnVpKHRoaXMuYWRkcixlLngsZS55KSx0WzBdPWUueCx0WzFdPWUueSk7ZWxzZXtpZihJdCh0LGUpKXJldHVybjtyLnVuaWZvcm0ydWl2KHRoaXMuYWRkcixlKSxVdCh0LGUpfX1mdW5jdGlvbiBsTShyLGUpe2NvbnN0IHQ9dGhpcy5jYWNoZTtpZihlLnghPT12b2lkIDApKHRbMF0hPT1lLnh8fHRbMV0hPT1lLnl8fHRbMl0hPT1lLnopJiYoci51bmlmb3JtM3VpKHRoaXMuYWRkcixlLngsZS55LGUueiksdFswXT1lLngsdFsxXT1lLnksdFsyXT1lLnopO2Vsc2V7aWYoSXQodCxlKSlyZXR1cm47ci51bmlmb3JtM3Vpdih0aGlzLmFkZHIsZSksVXQodCxlKX19ZnVuY3Rpb24gY00ocixlKXtjb25zdCB0PXRoaXMuY2FjaGU7aWYoZS54IT09dm9pZCAwKSh0WzBdIT09ZS54fHx0WzFdIT09ZS55fHx0WzJdIT09ZS56fHx0WzNdIT09ZS53KSYmKHIudW5pZm9ybTR1aSh0aGlzLmFkZHIsZS54LGUueSxlLnosZS53KSx0WzBdPWUueCx0WzFdPWUueSx0WzJdPWUueix0WzNdPWUudyk7ZWxzZXtpZihJdCh0LGUpKXJldHVybjtyLnVuaWZvcm00dWl2KHRoaXMuYWRkcixlKSxVdCh0LGUpfX1mdW5jdGlvbiBoTShyLGUsdCl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9dC5hbGxvY2F0ZVRleHR1cmVVbml0KCk7blswXSE9PWkmJihyLnVuaWZvcm0xaSh0aGlzLmFkZHIsaSksblswXT1pKTtjb25zdCBzPXRoaXMudHlwZT09PXIuU0FNUExFUl8yRF9TSEFET1c/bnA6dHA7dC5zZXRUZXh0dXJlMkQoZXx8cyxpKX1mdW5jdGlvbiB1TShyLGUsdCl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9dC5hbGxvY2F0ZVRleHR1cmVVbml0KCk7blswXSE9PWkmJihyLnVuaWZvcm0xaSh0aGlzLmFkZHIsaSksblswXT1pKSx0LnNldFRleHR1cmUzRChlfHxycCxpKX1mdW5jdGlvbiBmTShyLGUsdCl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9dC5hbGxvY2F0ZVRleHR1cmVVbml0KCk7blswXSE9PWkmJihyLnVuaWZvcm0xaSh0aGlzLmFkZHIsaSksblswXT1pKSx0LnNldFRleHR1cmVDdWJlKGV8fHNwLGkpfWZ1bmN0aW9uIGRNKHIsZSx0KXtjb25zdCBuPXRoaXMuY2FjaGUsaT10LmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtuWzBdIT09aSYmKHIudW5pZm9ybTFpKHRoaXMuYWRkcixpKSxuWzBdPWkpLHQuc2V0VGV4dHVyZTJEQXJyYXkoZXx8aXAsaSl9ZnVuY3Rpb24gcE0ocil7c3dpdGNoKHIpe2Nhc2UgNTEyNjpyZXR1cm4gWnY7Y2FzZSAzNTY2NDpyZXR1cm4gSnY7Y2FzZSAzNTY2NTpyZXR1cm4gS3Y7Y2FzZSAzNTY2NjpyZXR1cm4gUXY7Y2FzZSAzNTY3NDpyZXR1cm4ganY7Y2FzZSAzNTY3NTpyZXR1cm4gZU07Y2FzZSAzNTY3NjpyZXR1cm4gdE07Y2FzZSA1MTI0OmNhc2UgMzU2NzA6cmV0dXJuIG5NO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gaU07Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiByTTtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIHNNO2Nhc2UgNTEyNTpyZXR1cm4gYU07Y2FzZSAzNjI5NDpyZXR1cm4gb007Y2FzZSAzNjI5NTpyZXR1cm4gbE07Y2FzZSAzNjI5NjpyZXR1cm4gY007Y2FzZSAzNTY3ODpjYXNlIDM2MTk4OmNhc2UgMzYyOTg6Y2FzZSAzNjMwNjpjYXNlIDM1NjgyOnJldHVybiBoTTtjYXNlIDM1Njc5OmNhc2UgMzYyOTk6Y2FzZSAzNjMwNzpyZXR1cm4gdU07Y2FzZSAzNTY4MDpjYXNlIDM2MzAwOmNhc2UgMzYzMDg6Y2FzZSAzNjI5MzpyZXR1cm4gZk07Y2FzZSAzNjI4OTpjYXNlIDM2MzAzOmNhc2UgMzYzMTE6Y2FzZSAzNjI5MjpyZXR1cm4gZE19fWZ1bmN0aW9uIG1NKHIsZSl7ci51bmlmb3JtMWZ2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBnTShyLGUpe2NvbnN0IHQ9JHIoZSx0aGlzLnNpemUsMik7ci51bmlmb3JtMmZ2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiBfTShyLGUpe2NvbnN0IHQ9JHIoZSx0aGlzLnNpemUsMyk7ci51bmlmb3JtM2Z2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiB4TShyLGUpe2NvbnN0IHQ9JHIoZSx0aGlzLnNpemUsNCk7ci51bmlmb3JtNGZ2KHRoaXMuYWRkcix0KX1mdW5jdGlvbiB5TShyLGUpe2NvbnN0IHQ9JHIoZSx0aGlzLnNpemUsNCk7ci51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSx0KX1mdW5jdGlvbiB2TShyLGUpe2NvbnN0IHQ9JHIoZSx0aGlzLnNpemUsOSk7ci51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSx0KX1mdW5jdGlvbiBNTShyLGUpe2NvbnN0IHQ9JHIoZSx0aGlzLnNpemUsMTYpO3IudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsdCl9ZnVuY3Rpb24gU00ocixlKXtyLnVuaWZvcm0xaXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIGJNKHIsZSl7ci51bmlmb3JtMml2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiB3TShyLGUpe3IudW5pZm9ybTNpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gRU0ocixlKXtyLnVuaWZvcm00aXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIEFNKHIsZSl7ci51bmlmb3JtMXVpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gVE0ocixlKXtyLnVuaWZvcm0ydWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBDTShyLGUpe3IudW5pZm9ybTN1aXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIFJNKHIsZSl7ci51bmlmb3JtNHVpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gUE0ocixlLHQpe2NvbnN0IG49dGhpcy5jYWNoZSxpPWUubGVuZ3RoLHM9U28odCxpKTtJdChuLHMpfHwoci51bmlmb3JtMWl2KHRoaXMuYWRkcixzKSxVdChuLHMpKTtmb3IobGV0IGE9MDthIT09aTsrK2EpdC5zZXRUZXh0dXJlMkQoZVthXXx8dHAsc1thXSl9ZnVuY3Rpb24gTE0ocixlLHQpe2NvbnN0IG49dGhpcy5jYWNoZSxpPWUubGVuZ3RoLHM9U28odCxpKTtJdChuLHMpfHwoci51bmlmb3JtMWl2KHRoaXMuYWRkcixzKSxVdChuLHMpKTtmb3IobGV0IGE9MDthIT09aTsrK2EpdC5zZXRUZXh0dXJlM0QoZVthXXx8cnAsc1thXSl9ZnVuY3Rpb24gSU0ocixlLHQpe2NvbnN0IG49dGhpcy5jYWNoZSxpPWUubGVuZ3RoLHM9U28odCxpKTtJdChuLHMpfHwoci51bmlmb3JtMWl2KHRoaXMuYWRkcixzKSxVdChuLHMpKTtmb3IobGV0IGE9MDthIT09aTsrK2EpdC5zZXRUZXh0dXJlQ3ViZShlW2FdfHxzcCxzW2FdKX1mdW5jdGlvbiBVTShyLGUsdCl7Y29uc3Qgbj10aGlzLmNhY2hlLGk9ZS5sZW5ndGgscz1Tbyh0LGkpO0l0KG4scyl8fChyLnVuaWZvcm0xaXYodGhpcy5hZGRyLHMpLFV0KG4scykpO2ZvcihsZXQgYT0wO2EhPT1pOysrYSl0LnNldFRleHR1cmUyREFycmF5KGVbYV18fGlwLHNbYV0pfWZ1bmN0aW9uIERNKHIpe3N3aXRjaChyKXtjYXNlIDUxMjY6cmV0dXJuIG1NO2Nhc2UgMzU2NjQ6cmV0dXJuIGdNO2Nhc2UgMzU2NjU6cmV0dXJuIF9NO2Nhc2UgMzU2NjY6cmV0dXJuIHhNO2Nhc2UgMzU2NzQ6cmV0dXJuIHlNO2Nhc2UgMzU2NzU6cmV0dXJuIHZNO2Nhc2UgMzU2NzY6cmV0dXJuIE1NO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBTTTtjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuIGJNO2Nhc2UgMzU2Njg6Y2FzZSAzNTY3MjpyZXR1cm4gd007Y2FzZSAzNTY2OTpjYXNlIDM1NjczOnJldHVybiBFTTtjYXNlIDUxMjU6cmV0dXJuIEFNO2Nhc2UgMzYyOTQ6cmV0dXJuIFRNO2Nhc2UgMzYyOTU6cmV0dXJuIENNO2Nhc2UgMzYyOTY6cmV0dXJuIFJNO2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpjYXNlIDM2Mjk4OmNhc2UgMzYzMDY6Y2FzZSAzNTY4MjpyZXR1cm4gUE07Y2FzZSAzNTY3OTpjYXNlIDM2Mjk5OmNhc2UgMzYzMDc6cmV0dXJuIExNO2Nhc2UgMzU2ODA6Y2FzZSAzNjMwMDpjYXNlIDM2MzA4OmNhc2UgMzYyOTM6cmV0dXJuIElNO2Nhc2UgMzYyODk6Y2FzZSAzNjMwMzpjYXNlIDM2MzExOmNhc2UgMzYyOTI6cmV0dXJuIFVNfX1jbGFzcyBOTXtjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5pZD1lLHRoaXMuYWRkcj1uLHRoaXMuY2FjaGU9W10sdGhpcy50eXBlPXQudHlwZSx0aGlzLnNldFZhbHVlPXBNKHQudHlwZSl9fWNsYXNzIEZNe2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLmlkPWUsdGhpcy5hZGRyPW4sdGhpcy5jYWNoZT1bXSx0aGlzLnR5cGU9dC50eXBlLHRoaXMuc2l6ZT10LnNpemUsdGhpcy5zZXRWYWx1ZT1ETSh0LnR5cGUpfX1jbGFzcyBPTXtjb25zdHJ1Y3RvcihlKXt0aGlzLmlkPWUsdGhpcy5zZXE9W10sdGhpcy5tYXA9e319c2V0VmFsdWUoZSx0LG4pe2NvbnN0IGk9dGhpcy5zZXE7Zm9yKGxldCBzPTAsYT1pLmxlbmd0aDtzIT09YTsrK3Mpe2NvbnN0IG89aVtzXTtvLnNldFZhbHVlKGUsdFtvLmlkXSxuKX19fWNvbnN0IFJoPS8oXHcrKShcXSk/KFxbfFwuKT8vZztmdW5jdGlvbiB1cChyLGUpe3Iuc2VxLnB1c2goZSksci5tYXBbZS5pZF09ZX1mdW5jdGlvbiBCTShyLGUsdCl7Y29uc3Qgbj1yLm5hbWUsaT1uLmxlbmd0aDtmb3IoUmgubGFzdEluZGV4PTA7Oyl7Y29uc3Qgcz1SaC5leGVjKG4pLGE9UmgubGFzdEluZGV4O2xldCBvPXNbMV07Y29uc3QgbD1zWzJdPT09Il0iLGM9c1szXTtpZihsJiYobz1vfDApLGM9PT12b2lkIDB8fGM9PT0iWyImJmErMj09PWkpe3VwKHQsYz09PXZvaWQgMD9uZXcgTk0obyxyLGUpOm5ldyBGTShvLHIsZSkpO2JyZWFrfWVsc2V7bGV0IHU9dC5tYXBbb107dT09PXZvaWQgMCYmKHU9bmV3IE9NKG8pLHVwKHQsdSkpLHQ9dX19fWNsYXNzIGJve2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5zZXE9W10sdGhpcy5tYXA9e307Y29uc3Qgbj1lLmdldFByb2dyYW1QYXJhbWV0ZXIodCxlLkFDVElWRV9VTklGT1JNUyk7Zm9yKGxldCBpPTA7aTxuOysraSl7Y29uc3Qgcz1lLmdldEFjdGl2ZVVuaWZvcm0odCxpKSxhPWUuZ2V0VW5pZm9ybUxvY2F0aW9uKHQscy5uYW1lKTtCTShzLGEsdGhpcyl9fXNldFZhbHVlKGUsdCxuLGkpe2NvbnN0IHM9dGhpcy5tYXBbdF07cyE9PXZvaWQgMCYmcy5zZXRWYWx1ZShlLG4saSl9c2V0T3B0aW9uYWwoZSx0LG4pe2NvbnN0IGk9dFtuXTtpIT09dm9pZCAwJiZ0aGlzLnNldFZhbHVlKGUsbixpKX1zdGF0aWMgdXBsb2FkKGUsdCxuLGkpe2ZvcihsZXQgcz0wLGE9dC5sZW5ndGg7cyE9PWE7KytzKXtjb25zdCBvPXRbc10sbD1uW28uaWRdO2wubmVlZHNVcGRhdGUhPT0hMSYmby5zZXRWYWx1ZShlLGwudmFsdWUsaSl9fXN0YXRpYyBzZXFXaXRoVmFsdWUoZSx0KXtjb25zdCBuPVtdO2ZvcihsZXQgaT0wLHM9ZS5sZW5ndGg7aSE9PXM7KytpKXtjb25zdCBhPWVbaV07YS5pZCBpbiB0JiZuLnB1c2goYSl9cmV0dXJuIG59fWZ1bmN0aW9uIGZwKHIsZSx0KXtjb25zdCBuPXIuY3JlYXRlU2hhZGVyKGUpO3JldHVybiByLnNoYWRlclNvdXJjZShuLHQpLHIuY29tcGlsZVNoYWRlcihuKSxufWNvbnN0IHpNPTM3Mjk3O2xldCBrTT0wO2Z1bmN0aW9uIEdNKHIsZSl7Y29uc3QgdD1yLnNwbGl0KGAKYCksbj1bXSxpPU1hdGgubWF4KGUtNiwwKSxzPU1hdGgubWluKGUrNix0Lmxlbmd0aCk7Zm9yKGxldCBhPWk7YTxzO2ErKyl7Y29uc3Qgbz1hKzE7bi5wdXNoKGAke289PT1lPyI+IjoiICJ9ICR7b306ICR7dFthXX1gKX1yZXR1cm4gbi5qb2luKGAKYCl9ZnVuY3Rpb24gVk0ocil7Y29uc3QgZT1vdC5nZXRQcmltYXJpZXMob3Qud29ya2luZ0NvbG9yU3BhY2UpLHQ9b3QuZ2V0UHJpbWFyaWVzKHIpO2xldCBuO3N3aXRjaChlPT09dD9uPSIiOmU9PT1EcyYmdD09PVVzP249IkxpbmVhckRpc3BsYXlQM1RvTGluZWFyU1JHQiI6ZT09PVVzJiZ0PT09RHMmJihuPSJMaW5lYXJTUkdCVG9MaW5lYXJEaXNwbGF5UDMiKSxyKXtjYXNlIFZuOmNhc2UgTHM6cmV0dXJuW24sIkxpbmVhclRyYW5zZmVyT0VURiJdO2Nhc2UgUHQ6Y2FzZSBxYTpyZXR1cm5bbiwic1JHQlRyYW5zZmVyT0VURiJdO2RlZmF1bHQ6cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtOiBVbnN1cHBvcnRlZCBjb2xvciBzcGFjZToiLHIpLFtuLCJMaW5lYXJUcmFuc2Zlck9FVEYiXX19ZnVuY3Rpb24gZHAocixlLHQpe2NvbnN0IG49ci5nZXRTaGFkZXJQYXJhbWV0ZXIoZSxyLkNPTVBJTEVfU1RBVFVTKSxpPXIuZ2V0U2hhZGVySW5mb0xvZyhlKS50cmltKCk7aWYobiYmaT09PSIiKXJldHVybiIiO2NvbnN0IHM9L0VSUk9SOiAwOihcZCspLy5leGVjKGkpO2lmKHMpe2NvbnN0IGE9cGFyc2VJbnQoc1sxXSk7cmV0dXJuIHQudG9VcHBlckNhc2UoKStgCgpgK2krYAoKYCtHTShyLmdldFNoYWRlclNvdXJjZShlKSxhKX1lbHNlIHJldHVybiBpfWZ1bmN0aW9uIEhNKHIsZSl7Y29uc3QgdD1WTShlKTtyZXR1cm5gdmVjNCAke3J9KCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gJHt0WzBdfSggJHt0WzFdfSggdmFsdWUgKSApOyB9YH1mdW5jdGlvbiBXTShyLGUpe2xldCB0O3N3aXRjaChlKXtjYXNlIEpmOnQ9IkxpbmVhciI7YnJlYWs7Y2FzZSBLZjp0PSJSZWluaGFyZCI7YnJlYWs7Y2FzZSBRZjp0PSJPcHRpbWl6ZWRDaW5lb24iO2JyZWFrO2Nhc2UgamY6dD0iQUNFU0ZpbG1pYyI7YnJlYWs7Y2FzZSBlZDp0PSJDdXN0b20iO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IFVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiIsZSksdD0iTGluZWFyIn1yZXR1cm4idmVjMyAiK3IrIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrdCsiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifWZ1bmN0aW9uIFhNKHIpe3JldHVybltyLmV4dGVuc2lvbkRlcml2YXRpdmVzfHxyLmVudk1hcEN1YmVVVkhlaWdodHx8ci5idW1wTWFwfHxyLm5vcm1hbE1hcFRhbmdlbnRTcGFjZXx8ci5jbGVhcmNvYXROb3JtYWxNYXB8fHIuZmxhdFNoYWRpbmd8fHIuc2hhZGVySUQ9PT0icGh5c2ljYWwiPyIjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZSI6IiIsKHIuZXh0ZW5zaW9uRnJhZ0RlcHRofHxyLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIpJiZyLnJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoPyIjZXh0ZW5zaW9uIEdMX0VYVF9mcmFnX2RlcHRoIDogZW5hYmxlIjoiIixyLmV4dGVuc2lvbkRyYXdCdWZmZXJzJiZyLnJlbmRlcmVyRXh0ZW5zaW9uRHJhd0J1ZmZlcnM/IiNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmUiOiIiLChyLmV4dGVuc2lvblNoYWRlclRleHR1cmVMT0R8fHIuZW52TWFwfHxyLnRyYW5zbWlzc2lvbikmJnIucmVuZGVyZXJFeHRlbnNpb25TaGFkZXJUZXh0dXJlTG9kPyIjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiBlbmFibGUiOiIiXS5maWx0ZXIoWXMpLmpvaW4oYApgKX1mdW5jdGlvbiBxTShyKXtjb25zdCBlPVtdO2Zvcihjb25zdCB0IGluIHIpe2NvbnN0IG49clt0XTtuIT09ITEmJmUucHVzaCgiI2RlZmluZSAiK3QrIiAiK24pfXJldHVybiBlLmpvaW4oYApgKX1mdW5jdGlvbiAkTShyLGUpe2NvbnN0IHQ9e30sbj1yLmdldFByb2dyYW1QYXJhbWV0ZXIoZSxyLkFDVElWRV9BVFRSSUJVVEVTKTtmb3IobGV0IGk9MDtpPG47aSsrKXtjb25zdCBzPXIuZ2V0QWN0aXZlQXR0cmliKGUsaSksYT1zLm5hbWU7bGV0IG89MTtzLnR5cGU9PT1yLkZMT0FUX01BVDImJihvPTIpLHMudHlwZT09PXIuRkxPQVRfTUFUMyYmKG89Mykscy50eXBlPT09ci5GTE9BVF9NQVQ0JiYobz00KSx0W2FdPXt0eXBlOnMudHlwZSxsb2NhdGlvbjpyLmdldEF0dHJpYkxvY2F0aW9uKGUsYSksbG9jYXRpb25TaXplOm99fXJldHVybiB0fWZ1bmN0aW9uIFlzKHIpe3JldHVybiByIT09IiJ9ZnVuY3Rpb24gcHAocixlKXtjb25zdCB0PWUubnVtU3BvdExpZ2h0U2hhZG93cytlLm51bVNwb3RMaWdodE1hcHMtZS5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM7cmV0dXJuIHIucmVwbGFjZSgvTlVNX0RJUl9MSUdIVFMvZyxlLm51bURpckxpZ2h0cykucmVwbGFjZSgvTlVNX1NQT1RfTElHSFRTL2csZS5udW1TcG90TGlnaHRzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9NQVBTL2csZS5udW1TcG90TGlnaHRNYXBzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9DT09SRFMvZyx0KS5yZXBsYWNlKC9OVU1fUkVDVF9BUkVBX0xJR0hUUy9nLGUubnVtUmVjdEFyZWFMaWdodHMpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVFMvZyxlLm51bVBvaW50TGlnaHRzKS5yZXBsYWNlKC9OVU1fSEVNSV9MSUdIVFMvZyxlLm51bUhlbWlMaWdodHMpLnJlcGxhY2UoL05VTV9ESVJfTElHSFRfU0hBRE9XUy9nLGUubnVtRGlyTGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUy9nLGUubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTL2csZS5udW1TcG90TGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRfU0hBRE9XUy9nLGUubnVtUG9pbnRMaWdodFNoYWRvd3MpfWZ1bmN0aW9uIG1wKHIsZSl7cmV0dXJuIHIucmVwbGFjZSgvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLGUubnVtQ2xpcHBpbmdQbGFuZXMpLnJlcGxhY2UoL1VOSU9OX0NMSVBQSU5HX1BMQU5FUy9nLGUubnVtQ2xpcHBpbmdQbGFuZXMtZS5udW1DbGlwSW50ZXJzZWN0aW9uKX1jb25zdCBZTT0vXlsgXHRdKiNpbmNsdWRlICs8KFtcd1xkLi9dKyk+L2dtO2Z1bmN0aW9uIFBoKHIpe3JldHVybiByLnJlcGxhY2UoWU0sSk0pfWNvbnN0IFpNPW5ldyBNYXAoW1siZW5jb2RpbmdzX2ZyYWdtZW50IiwiY29sb3JzcGFjZV9mcmFnbWVudCJdLFsiZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQiLCJjb2xvcnNwYWNlX3BhcnNfZnJhZ21lbnQiXSxbIm91dHB1dF9mcmFnbWVudCIsIm9wYXF1ZV9mcmFnbWVudCJdXSk7ZnVuY3Rpb24gSk0ocixlKXtsZXQgdD0kZVtlXTtpZih0PT09dm9pZCAwKXtjb25zdCBuPVpNLmdldChlKTtpZihuIT09dm9pZCAwKXQ9JGVbbl0sY29uc29sZS53YXJuKCdUSFJFRS5XZWJHTFJlbmRlcmVyOiBTaGFkZXIgY2h1bmsgIiVzIiBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgIiVzIiBpbnN0ZWFkLicsZSxuKTtlbHNlIHRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIDwiK2UrIj4iKX1yZXR1cm4gUGgodCl9Y29uc3QgS009LyNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRccytmb3JccypcKFxzKmludFxzK2lccyo9XHMqKFxkKylccyo7XHMqaVxzKjxccyooXGQrKVxzKjtccyppXHMqXCtcK1xzKlwpXHMqeyhbXHNcU10rPyl9XHMrI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQvZztmdW5jdGlvbiBncChyKXtyZXR1cm4gci5yZXBsYWNlKEtNLFFNKX1mdW5jdGlvbiBRTShyLGUsdCxuKXtsZXQgaT0iIjtmb3IobGV0IHM9cGFyc2VJbnQoZSk7czxwYXJzZUludCh0KTtzKyspaSs9bi5yZXBsYWNlKC9cW1xzKmlccypcXS9nLCJbICIrcysiIF0iKS5yZXBsYWNlKC9VTlJPTExFRF9MT09QX0lOREVYL2cscyk7cmV0dXJuIGl9ZnVuY3Rpb24gX3Aocil7bGV0IGU9InByZWNpc2lvbiAiK3IucHJlY2lzaW9uK2AgZmxvYXQ7CnByZWNpc2lvbiBgK3IucHJlY2lzaW9uKyIgaW50OyI7cmV0dXJuIHIucHJlY2lzaW9uPT09ImhpZ2hwIj9lKz1gCiNkZWZpbmUgSElHSF9QUkVDSVNJT05gOnIucHJlY2lzaW9uPT09Im1lZGl1bXAiP2UrPWAKI2RlZmluZSBNRURJVU1fUFJFQ0lTSU9OYDpyLnByZWNpc2lvbj09PSJsb3dwIiYmKGUrPWAKI2RlZmluZSBMT1dfUFJFQ0lTSU9OYCksZX1mdW5jdGlvbiBqTShyKXtsZXQgZT0iU0hBRE9XTUFQX1RZUEVfQkFTSUMiO3JldHVybiByLnNoYWRvd01hcFR5cGU9PT1Dbj9lPSJTSEFET1dNQVBfVFlQRV9QQ0YiOnIuc2hhZG93TWFwVHlwZT09PVNyP2U9IlNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIjpyLnNoYWRvd01hcFR5cGU9PT1rbiYmKGU9IlNIQURPV01BUF9UWVBFX1ZTTSIpLGV9ZnVuY3Rpb24gZVMocil7bGV0IGU9IkVOVk1BUF9UWVBFX0NVQkUiO2lmKHIuZW52TWFwKXN3aXRjaChyLmVudk1hcE1vZGUpe2Nhc2UgS246Y2FzZSB5aTplPSJFTlZNQVBfVFlQRV9DVUJFIjticmVhaztjYXNlIGJyOmU9IkVOVk1BUF9UWVBFX0NVQkVfVVYiO2JyZWFrfXJldHVybiBlfWZ1bmN0aW9uIHRTKHIpe2xldCBlPSJFTlZNQVBfTU9ERV9SRUZMRUNUSU9OIjtpZihyLmVudk1hcClzd2l0Y2goci5lbnZNYXBNb2RlKXtjYXNlIHlpOmU9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04iO2JyZWFrfXJldHVybiBlfWZ1bmN0aW9uIG5TKHIpe2xldCBlPSJFTlZNQVBfQkxFTkRJTkdfTk9ORSI7aWYoci5lbnZNYXApc3dpdGNoKHIuY29tYmluZSl7Y2FzZSBTczplPSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgWWY6ZT0iRU5WTUFQX0JMRU5ESU5HX01JWCI7YnJlYWs7Y2FzZSBaZjplPSJFTlZNQVBfQkxFTkRJTkdfQUREIjticmVha31yZXR1cm4gZX1mdW5jdGlvbiBpUyhyKXtjb25zdCBlPXIuZW52TWFwQ3ViZVVWSGVpZ2h0O2lmKGU9PT1udWxsKXJldHVybiBudWxsO2NvbnN0IHQ9TWF0aC5sb2cyKGUpLTIsbj0xL2U7cmV0dXJue3RleGVsV2lkdGg6MS8oMypNYXRoLm1heChNYXRoLnBvdygyLHQpLDcqMTYpKSx0ZXhlbEhlaWdodDpuLG1heE1pcDp0fX1mdW5jdGlvbiByUyhyLGUsdCxuKXtjb25zdCBpPXIuZ2V0Q29udGV4dCgpLHM9dC5kZWZpbmVzO2xldCBhPXQudmVydGV4U2hhZGVyLG89dC5mcmFnbWVudFNoYWRlcjtjb25zdCBsPWpNKHQpLGM9ZVModCksaD10Uyh0KSx1PW5TKHQpLGY9aVModCksZD10LmlzV2ViR0wyPyIiOlhNKHQpLHA9cU0ocyksXz1pLmNyZWF0ZVByb2dyYW0oKTtsZXQgZyxtLHk9dC5nbHNsVmVyc2lvbj8iI3ZlcnNpb24gIit0Lmdsc2xWZXJzaW9uK2AKYDoiIjt0LmlzUmF3U2hhZGVyTWF0ZXJpYWw/KGc9WyIjZGVmaW5lIFNIQURFUl9UWVBFICIrdC5zaGFkZXJUeXBlLCIjZGVmaW5lIFNIQURFUl9OQU1FICIrdC5zaGFkZXJOYW1lLHBdLmZpbHRlcihZcykuam9pbihgCmApLGcubGVuZ3RoPjAmJihnKz1gCmApLG09W2QsIiNkZWZpbmUgU0hBREVSX1RZUEUgIit0LnNoYWRlclR5cGUsIiNkZWZpbmUgU0hBREVSX05BTUUgIit0LnNoYWRlck5hbWUscF0uZmlsdGVyKFlzKS5qb2luKGAKYCksbS5sZW5ndGg+MCYmKG0rPWAKYCkpOihnPVtfcCh0KSwiI2RlZmluZSBTSEFERVJfVFlQRSAiK3Quc2hhZGVyVHlwZSwiI2RlZmluZSBTSEFERVJfTkFNRSAiK3Quc2hhZGVyTmFtZSxwLHQuYmF0Y2hpbmc/IiNkZWZpbmUgVVNFX0JBVENISU5HIjoiIix0Lmluc3RhbmNpbmc/IiNkZWZpbmUgVVNFX0lOU1RBTkNJTkciOiIiLHQuaW5zdGFuY2luZ0NvbG9yPyIjZGVmaW5lIFVTRV9JTlNUQU5DSU5HX0NPTE9SIjoiIix0LnVzZUZvZyYmdC5mb2c/IiNkZWZpbmUgVVNFX0ZPRyI6IiIsdC51c2VGb2cmJnQuZm9nRXhwMj8iI2RlZmluZSBGT0dfRVhQMiI6IiIsdC5tYXA/IiNkZWZpbmUgVVNFX01BUCI6IiIsdC5lbnZNYXA/IiNkZWZpbmUgVVNFX0VOVk1BUCI6IiIsdC5lbnZNYXA/IiNkZWZpbmUgIitoOiIiLHQubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIix0LmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsdC5idW1wTWFwPyIjZGVmaW5lIFVTRV9CVU1QTUFQIjoiIix0Lm5vcm1hbE1hcD8iI2RlZmluZSBVU0VfTk9STUFMTUFQIjoiIix0Lm5vcm1hbE1hcE9iamVjdFNwYWNlPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVBfT0JKRUNUU1BBQ0UiOiIiLHQubm9ybWFsTWFwVGFuZ2VudFNwYWNlPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVBfVEFOR0VOVFNQQUNFIjoiIix0LmRpc3BsYWNlbWVudE1hcD8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIix0LmVtaXNzaXZlTWFwPyIjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCI6IiIsdC5hbmlzb3Ryb3B5PyIjZGVmaW5lIFVTRV9BTklTT1RST1BZIjoiIix0LmFuaXNvdHJvcHlNYXA/IiNkZWZpbmUgVVNFX0FOSVNPVFJPUFlNQVAiOiIiLHQuY2xlYXJjb2F0TWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAiOiIiLHQuY2xlYXJjb2F0Um91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQIjoiIix0LmNsZWFyY29hdE5vcm1hbE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsdC5pcmlkZXNjZW5jZU1hcD8iI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0VNQVAiOiIiLHQuaXJpZGVzY2VuY2VUaGlja25lc3NNYXA/IiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFX1RISUNLTkVTU01BUCI6IiIsdC5zcGVjdWxhck1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAiOiIiLHQuc3BlY3VsYXJDb2xvck1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJfQ09MT1JNQVAiOiIiLHQuc3BlY3VsYXJJbnRlbnNpdHlNYXA/IiNkZWZpbmUgVVNFX1NQRUNVTEFSX0lOVEVOU0lUWU1BUCI6IiIsdC5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdC5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdC5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHQuYWxwaGFIYXNoPyIjZGVmaW5lIFVTRV9BTFBIQUhBU0giOiIiLHQudHJhbnNtaXNzaW9uPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT04iOiIiLHQudHJhbnNtaXNzaW9uTWFwPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT05NQVAiOiIiLHQudGhpY2tuZXNzTWFwPyIjZGVmaW5lIFVTRV9USElDS05FU1NNQVAiOiIiLHQuc2hlZW5Db2xvck1hcD8iI2RlZmluZSBVU0VfU0hFRU5fQ09MT1JNQVAiOiIiLHQuc2hlZW5Sb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1NIRUVOX1JPVUdITkVTU01BUCI6IiIsdC5tYXBVdj8iI2RlZmluZSBNQVBfVVYgIit0Lm1hcFV2OiIiLHQuYWxwaGFNYXBVdj8iI2RlZmluZSBBTFBIQU1BUF9VViAiK3QuYWxwaGFNYXBVdjoiIix0LmxpZ2h0TWFwVXY/IiNkZWZpbmUgTElHSFRNQVBfVVYgIit0LmxpZ2h0TWFwVXY6IiIsdC5hb01hcFV2PyIjZGVmaW5lIEFPTUFQX1VWICIrdC5hb01hcFV2OiIiLHQuZW1pc3NpdmVNYXBVdj8iI2RlZmluZSBFTUlTU0lWRU1BUF9VViAiK3QuZW1pc3NpdmVNYXBVdjoiIix0LmJ1bXBNYXBVdj8iI2RlZmluZSBCVU1QTUFQX1VWICIrdC5idW1wTWFwVXY6IiIsdC5ub3JtYWxNYXBVdj8iI2RlZmluZSBOT1JNQUxNQVBfVVYgIit0Lm5vcm1hbE1hcFV2OiIiLHQuZGlzcGxhY2VtZW50TWFwVXY/IiNkZWZpbmUgRElTUExBQ0VNRU5UTUFQX1VWICIrdC5kaXNwbGFjZW1lbnRNYXBVdjoiIix0Lm1ldGFsbmVzc01hcFV2PyIjZGVmaW5lIE1FVEFMTkVTU01BUF9VViAiK3QubWV0YWxuZXNzTWFwVXY6IiIsdC5yb3VnaG5lc3NNYXBVdj8iI2RlZmluZSBST1VHSE5FU1NNQVBfVVYgIit0LnJvdWdobmVzc01hcFV2OiIiLHQuYW5pc290cm9weU1hcFV2PyIjZGVmaW5lIEFOSVNPVFJPUFlNQVBfVVYgIit0LmFuaXNvdHJvcHlNYXBVdjoiIix0LmNsZWFyY29hdE1hcFV2PyIjZGVmaW5lIENMRUFSQ09BVE1BUF9VViAiK3QuY2xlYXJjb2F0TWFwVXY6IiIsdC5jbGVhcmNvYXROb3JtYWxNYXBVdj8iI2RlZmluZSBDTEVBUkNPQVRfTk9STUFMTUFQX1VWICIrdC5jbGVhcmNvYXROb3JtYWxNYXBVdjoiIix0LmNsZWFyY29hdFJvdWdobmVzc01hcFV2PyIjZGVmaW5lIENMRUFSQ09BVF9ST1VHSE5FU1NNQVBfVVYgIit0LmNsZWFyY29hdFJvdWdobmVzc01hcFV2OiIiLHQuaXJpZGVzY2VuY2VNYXBVdj8iI2RlZmluZSBJUklERVNDRU5DRU1BUF9VViAiK3QuaXJpZGVzY2VuY2VNYXBVdjoiIix0LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXY/IiNkZWZpbmUgSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQX1VWICIrdC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcFV2OiIiLHQuc2hlZW5Db2xvck1hcFV2PyIjZGVmaW5lIFNIRUVOX0NPTE9STUFQX1VWICIrdC5zaGVlbkNvbG9yTWFwVXY6IiIsdC5zaGVlblJvdWdobmVzc01hcFV2PyIjZGVmaW5lIFNIRUVOX1JPVUdITkVTU01BUF9VViAiK3Quc2hlZW5Sb3VnaG5lc3NNYXBVdjoiIix0LnNwZWN1bGFyTWFwVXY/IiNkZWZpbmUgU1BFQ1VMQVJNQVBfVVYgIit0LnNwZWN1bGFyTWFwVXY6IiIsdC5zcGVjdWxhckNvbG9yTWFwVXY/IiNkZWZpbmUgU1BFQ1VMQVJfQ09MT1JNQVBfVVYgIit0LnNwZWN1bGFyQ29sb3JNYXBVdjoiIix0LnNwZWN1bGFySW50ZW5zaXR5TWFwVXY/IiNkZWZpbmUgU1BFQ1VMQVJfSU5URU5TSVRZTUFQX1VWICIrdC5zcGVjdWxhckludGVuc2l0eU1hcFV2OiIiLHQudHJhbnNtaXNzaW9uTWFwVXY/IiNkZWZpbmUgVFJBTlNNSVNTSU9OTUFQX1VWICIrdC50cmFuc21pc3Npb25NYXBVdjoiIix0LnRoaWNrbmVzc01hcFV2PyIjZGVmaW5lIFRISUNLTkVTU01BUF9VViAiK3QudGhpY2tuZXNzTWFwVXY6IiIsdC52ZXJ0ZXhUYW5nZW50cyYmdC5mbGF0U2hhZGluZz09PSExPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoiIix0LnZlcnRleENvbG9ycz8iI2RlZmluZSBVU0VfQ09MT1IiOiIiLHQudmVydGV4QWxwaGFzPyIjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQSI6IiIsdC52ZXJ0ZXhVdjFzPyIjZGVmaW5lIFVTRV9VVjEiOiIiLHQudmVydGV4VXYycz8iI2RlZmluZSBVU0VfVVYyIjoiIix0LnZlcnRleFV2M3M/IiNkZWZpbmUgVVNFX1VWMyI6IiIsdC5wb2ludHNVdnM/IiNkZWZpbmUgVVNFX1BPSU5UU19VViI6IiIsdC5mbGF0U2hhZGluZz8iI2RlZmluZSBGTEFUX1NIQURFRCI6IiIsdC5za2lubmluZz8iI2RlZmluZSBVU0VfU0tJTk5JTkciOiIiLHQubW9ycGhUYXJnZXRzPyIjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMiOiIiLHQubW9ycGhOb3JtYWxzJiZ0LmZsYXRTaGFkaW5nPT09ITE/IiNkZWZpbmUgVVNFX01PUlBITk9STUFMUyI6IiIsdC5tb3JwaENvbG9ycyYmdC5pc1dlYkdMMj8iI2RlZmluZSBVU0VfTU9SUEhDT0xPUlMiOiIiLHQubW9ycGhUYXJnZXRzQ291bnQ+MCYmdC5pc1dlYkdMMj8iI2RlZmluZSBNT1JQSFRBUkdFVFNfVEVYVFVSRSI6IiIsdC5tb3JwaFRhcmdldHNDb3VudD4wJiZ0LmlzV2ViR0wyPyIjZGVmaW5lIE1PUlBIVEFSR0VUU19URVhUVVJFX1NUUklERSAiK3QubW9ycGhUZXh0dXJlU3RyaWRlOiIiLHQubW9ycGhUYXJnZXRzQ291bnQ+MCYmdC5pc1dlYkdMMj8iI2RlZmluZSBNT1JQSFRBUkdFVFNfQ09VTlQgIit0Lm1vcnBoVGFyZ2V0c0NvdW50OiIiLHQuZG91YmxlU2lkZWQ/IiNkZWZpbmUgRE9VQkxFX1NJREVEIjoiIix0LmZsaXBTaWRlZD8iI2RlZmluZSBGTElQX1NJREVEIjoiIix0LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgVVNFX1NIQURPV01BUCI6IiIsdC5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lICIrbDoiIix0LnNpemVBdHRlbnVhdGlvbj8iI2RlZmluZSBVU0VfU0laRUFUVEVOVUFUSU9OIjoiIix0Lm51bUxpZ2h0UHJvYmVzPjA/IiNkZWZpbmUgVVNFX0xJR0hUX1BST0JFUyI6IiIsdC51c2VMZWdhY3lMaWdodHM/IiNkZWZpbmUgTEVHQUNZX0xJR0hUUyI6IiIsdC5sb2dhcml0aG1pY0RlcHRoQnVmZmVyPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRiI6IiIsdC5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZ0LnJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7IiwidW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OyIsInVuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsiLCJ1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7IiwiI2lmZGVmIFVTRV9JTlNUQU5DSU5HIiwiCWF0dHJpYnV0ZSBtYXQ0IGluc3RhbmNlTWF0cml4OyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfSU5TVEFOQ0lOR19DT0xPUiIsIglhdHRyaWJ1dGUgdmVjMyBpbnN0YW5jZUNvbG9yOyIsIiNlbmRpZiIsImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsiLCJhdHRyaWJ1dGUgdmVjMiB1djsiLCIjaWZkZWYgVVNFX1VWMSIsIglhdHRyaWJ1dGUgdmVjMiB1djE7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9VVjIiLCIJYXR0cmlidXRlIHZlYzIgdXYyOyIsIiNlbmRpZiIsIiNpZmRlZiBVU0VfVVYzIiwiCWF0dHJpYnV0ZSB2ZWMyIHV2MzsiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1RBTkdFTlQiLCIJYXR0cmlidXRlIHZlYzQgdGFuZ2VudDsiLCIjZW5kaWYiLCIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBICkiLCIJYXR0cmlidXRlIHZlYzQgY29sb3I7IiwiI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkiLCIJYXR0cmlidXRlIHZlYzMgY29sb3I7IiwiI2VuZGlmIiwiI2lmICggZGVmaW5lZCggVVNFX01PUlBIVEFSR0VUUyApICYmICEgZGVmaW5lZCggTU9SUEhUQVJHRVRTX1RFWFRVUkUgKSApIiwiCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsiLCIJYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQxOyIsIglhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDI7IiwiCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsiLCIJI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFMiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMjsiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMzsiLCIJI2Vsc2UiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NDsiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NjsiLCIJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NzsiLCIJI2VuZGlmIiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9TS0lOTklORyIsIglhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiCWF0dHJpYnV0ZSB2ZWM0IHNraW5XZWlnaHQ7IiwiI2VuZGlmIixgCmBdLmZpbHRlcihZcykuam9pbihgCmApLG09W2QsX3AodCksIiNkZWZpbmUgU0hBREVSX1RZUEUgIit0LnNoYWRlclR5cGUsIiNkZWZpbmUgU0hBREVSX05BTUUgIit0LnNoYWRlck5hbWUscCx0LnVzZUZvZyYmdC5mb2c/IiNkZWZpbmUgVVNFX0ZPRyI6IiIsdC51c2VGb2cmJnQuZm9nRXhwMj8iI2RlZmluZSBGT0dfRVhQMiI6IiIsdC5tYXA/IiNkZWZpbmUgVVNFX01BUCI6IiIsdC5tYXRjYXA/IiNkZWZpbmUgVVNFX01BVENBUCI6IiIsdC5lbnZNYXA/IiNkZWZpbmUgVVNFX0VOVk1BUCI6IiIsdC5lbnZNYXA/IiNkZWZpbmUgIitjOiIiLHQuZW52TWFwPyIjZGVmaW5lICIraDoiIix0LmVudk1hcD8iI2RlZmluZSAiK3U6IiIsZj8iI2RlZmluZSBDVUJFVVZfVEVYRUxfV0lEVEggIitmLnRleGVsV2lkdGg6IiIsZj8iI2RlZmluZSBDVUJFVVZfVEVYRUxfSEVJR0hUICIrZi50ZXhlbEhlaWdodDoiIixmPyIjZGVmaW5lIENVQkVVVl9NQVhfTUlQICIrZi5tYXhNaXArIi4wIjoiIix0LmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsdC5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLHQuYnVtcE1hcD8iI2RlZmluZSBVU0VfQlVNUE1BUCI6IiIsdC5ub3JtYWxNYXA/IiNkZWZpbmUgVVNFX05PUk1BTE1BUCI6IiIsdC5ub3JtYWxNYXBPYmplY3RTcGFjZT8iI2RlZmluZSBVU0VfTk9STUFMTUFQX09CSkVDVFNQQUNFIjoiIix0Lm5vcm1hbE1hcFRhbmdlbnRTcGFjZT8iI2RlZmluZSBVU0VfTk9STUFMTUFQX1RBTkdFTlRTUEFDRSI6IiIsdC5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLHQuYW5pc290cm9weT8iI2RlZmluZSBVU0VfQU5JU09UUk9QWSI6IiIsdC5hbmlzb3Ryb3B5TWFwPyIjZGVmaW5lIFVTRV9BTklTT1RST1BZTUFQIjoiIix0LmNsZWFyY29hdD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUIjoiIix0LmNsZWFyY29hdE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUTUFQIjoiIix0LmNsZWFyY29hdFJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUCI6IiIsdC5jbGVhcmNvYXROb3JtYWxNYXA/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAiOiIiLHQuaXJpZGVzY2VuY2U/IiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFIjoiIix0LmlyaWRlc2NlbmNlTWFwPyIjZGVmaW5lIFVTRV9JUklERVNDRU5DRU1BUCI6IiIsdC5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD8iI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQIjoiIix0LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdC5zcGVjdWxhckNvbG9yTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUl9DT0xPUk1BUCI6IiIsdC5zcGVjdWxhckludGVuc2l0eU1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJfSU5URU5TSVRZTUFQIjoiIix0LnJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQIjoiIix0Lm1ldGFsbmVzc01hcD8iI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQIjoiIix0LmFscGhhTWFwPyIjZGVmaW5lIFVTRV9BTFBIQU1BUCI6IiIsdC5hbHBoYVRlc3Q/IiNkZWZpbmUgVVNFX0FMUEhBVEVTVCI6IiIsdC5hbHBoYUhhc2g/IiNkZWZpbmUgVVNFX0FMUEhBSEFTSCI6IiIsdC5zaGVlbj8iI2RlZmluZSBVU0VfU0hFRU4iOiIiLHQuc2hlZW5Db2xvck1hcD8iI2RlZmluZSBVU0VfU0hFRU5fQ09MT1JNQVAiOiIiLHQuc2hlZW5Sb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1NIRUVOX1JPVUdITkVTU01BUCI6IiIsdC50cmFuc21pc3Npb24/IiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTiI6IiIsdC50cmFuc21pc3Npb25NYXA/IiNkZWZpbmUgVVNFX1RSQU5TTUlTU0lPTk1BUCI6IiIsdC50aGlja25lc3NNYXA/IiNkZWZpbmUgVVNFX1RISUNLTkVTU01BUCI6IiIsdC52ZXJ0ZXhUYW5nZW50cyYmdC5mbGF0U2hhZGluZz09PSExPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoiIix0LnZlcnRleENvbG9yc3x8dC5pbnN0YW5jaW5nQ29sb3I/IiNkZWZpbmUgVVNFX0NPTE9SIjoiIix0LnZlcnRleEFscGhhcz8iI2RlZmluZSBVU0VfQ09MT1JfQUxQSEEiOiIiLHQudmVydGV4VXYxcz8iI2RlZmluZSBVU0VfVVYxIjoiIix0LnZlcnRleFV2MnM/IiNkZWZpbmUgVVNFX1VWMiI6IiIsdC52ZXJ0ZXhVdjNzPyIjZGVmaW5lIFVTRV9VVjMiOiIiLHQucG9pbnRzVXZzPyIjZGVmaW5lIFVTRV9QT0lOVFNfVVYiOiIiLHQuZ3JhZGllbnRNYXA/IiNkZWZpbmUgVVNFX0dSQURJRU5UTUFQIjoiIix0LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix0LmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsdC5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsdC5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLHQuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK2w6IiIsdC5wcmVtdWx0aXBsaWVkQWxwaGE/IiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSI6IiIsdC5udW1MaWdodFByb2Jlcz4wPyIjZGVmaW5lIFVTRV9MSUdIVF9QUk9CRVMiOiIiLHQudXNlTGVnYWN5TGlnaHRzPyIjZGVmaW5lIExFR0FDWV9MSUdIVFMiOiIiLHQuZGVjb2RlVmlkZW9UZXh0dXJlPyIjZGVmaW5lIERFQ09ERV9WSURFT19URVhUVVJFIjoiIix0LmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIix0LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJnQucmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGg/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCI6IiIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsiLCJ1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7Iix0LnRvbmVNYXBwaW5nIT09Sm4/IiNkZWZpbmUgVE9ORV9NQVBQSU5HIjoiIix0LnRvbmVNYXBwaW5nIT09Sm4/JGUudG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDoiIix0LnRvbmVNYXBwaW5nIT09Sm4/V00oInRvbmVNYXBwaW5nIix0LnRvbmVNYXBwaW5nKToiIix0LmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLHQub3BhcXVlPyIjZGVmaW5lIE9QQVFVRSI6IiIsJGUuY29sb3JzcGFjZV9wYXJzX2ZyYWdtZW50LEhNKCJsaW5lYXJUb091dHB1dFRleGVsIix0Lm91dHB1dENvbG9yU3BhY2UpLHQudXNlRGVwdGhQYWNraW5nPyIjZGVmaW5lIERFUFRIX1BBQ0tJTkcgIit0LmRlcHRoUGFja2luZzoiIixgCmBdLmZpbHRlcihZcykuam9pbihgCmApKSxhPVBoKGEpLGE9cHAoYSx0KSxhPW1wKGEsdCksbz1QaChvKSxvPXBwKG8sdCksbz1tcChvLHQpLGE9Z3AoYSksbz1ncChvKSx0LmlzV2ViR0wyJiZ0LmlzUmF3U2hhZGVyTWF0ZXJpYWwhPT0hMCYmKHk9YCN2ZXJzaW9uIDMwMCBlcwpgLGc9WyJwcmVjaXNpb24gbWVkaXVtcCBzYW1wbGVyMkRBcnJheTsiLCIjZGVmaW5lIGF0dHJpYnV0ZSBpbiIsIiNkZWZpbmUgdmFyeWluZyBvdXQiLCIjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlIl0uam9pbihgCmApK2AKYCtnLG09WyJwcmVjaXNpb24gbWVkaXVtcCBzYW1wbGVyMkRBcnJheTsiLCIjZGVmaW5lIHZhcnlpbmcgaW4iLHQuZ2xzbFZlcnNpb249PT1RYz8iIjoibGF5b3V0KGxvY2F0aW9uID0gMCkgb3V0IGhpZ2hwIHZlYzQgcGNfZnJhZ0NvbG9yOyIsdC5nbHNsVmVyc2lvbj09PVFjPyIiOiIjZGVmaW5lIGdsX0ZyYWdDb2xvciBwY19mcmFnQ29sb3IiLCIjZGVmaW5lIGdsX0ZyYWdEZXB0aEVYVCBnbF9GcmFnRGVwdGgiLCIjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlIiwiI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlIiwiI2RlZmluZSB0ZXh0dXJlMkRQcm9qIHRleHR1cmVQcm9qIiwiI2RlZmluZSB0ZXh0dXJlMkRMb2RFWFQgdGV4dHVyZUxvZCIsIiNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZCIsIiNkZWZpbmUgdGV4dHVyZUN1YmVMb2RFWFQgdGV4dHVyZUxvZCIsIiNkZWZpbmUgdGV4dHVyZTJER3JhZEVYVCB0ZXh0dXJlR3JhZCIsIiNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkIiwiI2RlZmluZSB0ZXh0dXJlQ3ViZUdyYWRFWFQgdGV4dHVyZUdyYWQiXS5qb2luKGAKYCkrYApgK20pO2NvbnN0IHg9eStnK2Esdj15K20rbyxTPWZwKGksaS5WRVJURVhfU0hBREVSLHgpLGI9ZnAoaSxpLkZSQUdNRU5UX1NIQURFUix2KTtpLmF0dGFjaFNoYWRlcihfLFMpLGkuYXR0YWNoU2hhZGVyKF8sYiksdC5pbmRleDBBdHRyaWJ1dGVOYW1lIT09dm9pZCAwP2kuYmluZEF0dHJpYkxvY2F0aW9uKF8sMCx0LmluZGV4MEF0dHJpYnV0ZU5hbWUpOnQubW9ycGhUYXJnZXRzPT09ITAmJmkuYmluZEF0dHJpYkxvY2F0aW9uKF8sMCwicG9zaXRpb24iKSxpLmxpbmtQcm9ncmFtKF8pO2Z1bmN0aW9uIEEoUil7aWYoci5kZWJ1Zy5jaGVja1NoYWRlckVycm9ycyl7Y29uc3QgTj1pLmdldFByb2dyYW1JbmZvTG9nKF8pLnRyaW0oKSxCPWkuZ2V0U2hhZGVySW5mb0xvZyhTKS50cmltKCksST1pLmdldFNoYWRlckluZm9Mb2coYikudHJpbSgpO2xldCBVPSEwLHo9ITA7aWYoaS5nZXRQcm9ncmFtUGFyYW1ldGVyKF8saS5MSU5LX1NUQVRVUyk9PT0hMSlpZihVPSExLHR5cGVvZiByLmRlYnVnLm9uU2hhZGVyRXJyb3I9PSJmdW5jdGlvbiIpci5kZWJ1Zy5vblNoYWRlckVycm9yKGksXyxTLGIpO2Vsc2V7Y29uc3QgRj1kcChpLFMsInZlcnRleCIpLFo9ZHAoaSxiLCJmcmFnbWVudCIpO2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUHJvZ3JhbTogU2hhZGVyIEVycm9yICIraS5nZXRFcnJvcigpKyIgLSBWQUxJREFURV9TVEFUVVMgIitpLmdldFByb2dyYW1QYXJhbWV0ZXIoXyxpLlZBTElEQVRFX1NUQVRVUykrYAoKUHJvZ3JhbSBJbmZvIExvZzogYCtOK2AKYCtGK2AKYCtaKX1lbHNlIE4hPT0iIj9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUHJvZ3JhbTogUHJvZ3JhbSBJbmZvIExvZzoiLE4pOihCPT09IiJ8fEk9PT0iIikmJih6PSExKTt6JiYoUi5kaWFnbm9zdGljcz17cnVubmFibGU6VSxwcm9ncmFtTG9nOk4sdmVydGV4U2hhZGVyOntsb2c6QixwcmVmaXg6Z30sZnJhZ21lbnRTaGFkZXI6e2xvZzpJLHByZWZpeDptfX0pfWkuZGVsZXRlU2hhZGVyKFMpLGkuZGVsZXRlU2hhZGVyKGIpLEw9bmV3IGJvKGksXyksTT0kTShpLF8pfWxldCBMO3RoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXtyZXR1cm4gTD09PXZvaWQgMCYmQSh0aGlzKSxMfTtsZXQgTTt0aGlzLmdldEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gTT09PXZvaWQgMCYmQSh0aGlzKSxNfTtsZXQgdz10LnJlbmRlcmVyRXh0ZW5zaW9uUGFyYWxsZWxTaGFkZXJDb21waWxlPT09ITE7cmV0dXJuIHRoaXMuaXNSZWFkeT1mdW5jdGlvbigpe3JldHVybiB3PT09ITEmJih3PWkuZ2V0UHJvZ3JhbVBhcmFtZXRlcihfLHpNKSksd30sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7bi5yZWxlYXNlU3RhdGVzT2ZQcm9ncmFtKHRoaXMpLGkuZGVsZXRlUHJvZ3JhbShfKSx0aGlzLnByb2dyYW09dm9pZCAwfSx0aGlzLnR5cGU9dC5zaGFkZXJUeXBlLHRoaXMubmFtZT10LnNoYWRlck5hbWUsdGhpcy5pZD1rTSsrLHRoaXMuY2FjaGVLZXk9ZSx0aGlzLnVzZWRUaW1lcz0xLHRoaXMucHJvZ3JhbT1fLHRoaXMudmVydGV4U2hhZGVyPVMsdGhpcy5mcmFnbWVudFNoYWRlcj1iLHRoaXN9bGV0IHNTPTA7Y2xhc3MgYVN7Y29uc3RydWN0b3IoKXt0aGlzLnNoYWRlckNhY2hlPW5ldyBNYXAsdGhpcy5tYXRlcmlhbENhY2hlPW5ldyBNYXB9dXBkYXRlKGUpe2NvbnN0IHQ9ZS52ZXJ0ZXhTaGFkZXIsbj1lLmZyYWdtZW50U2hhZGVyLGk9dGhpcy5fZ2V0U2hhZGVyU3RhZ2UodCkscz10aGlzLl9nZXRTaGFkZXJTdGFnZShuKSxhPXRoaXMuX2dldFNoYWRlckNhY2hlRm9yTWF0ZXJpYWwoZSk7cmV0dXJuIGEuaGFzKGkpPT09ITEmJihhLmFkZChpKSxpLnVzZWRUaW1lcysrKSxhLmhhcyhzKT09PSExJiYoYS5hZGQocykscy51c2VkVGltZXMrKyksdGhpc31yZW1vdmUoZSl7Y29uc3QgdD10aGlzLm1hdGVyaWFsQ2FjaGUuZ2V0KGUpO2Zvcihjb25zdCBuIG9mIHQpbi51c2VkVGltZXMtLSxuLnVzZWRUaW1lcz09PTAmJnRoaXMuc2hhZGVyQ2FjaGUuZGVsZXRlKG4uY29kZSk7cmV0dXJuIHRoaXMubWF0ZXJpYWxDYWNoZS5kZWxldGUoZSksdGhpc31nZXRWZXJ0ZXhTaGFkZXJJRChlKXtyZXR1cm4gdGhpcy5fZ2V0U2hhZGVyU3RhZ2UoZS52ZXJ0ZXhTaGFkZXIpLmlkfWdldEZyYWdtZW50U2hhZGVySUQoZSl7cmV0dXJuIHRoaXMuX2dldFNoYWRlclN0YWdlKGUuZnJhZ21lbnRTaGFkZXIpLmlkfWRpc3Bvc2UoKXt0aGlzLnNoYWRlckNhY2hlLmNsZWFyKCksdGhpcy5tYXRlcmlhbENhY2hlLmNsZWFyKCl9X2dldFNoYWRlckNhY2hlRm9yTWF0ZXJpYWwoZSl7Y29uc3QgdD10aGlzLm1hdGVyaWFsQ2FjaGU7bGV0IG49dC5nZXQoZSk7cmV0dXJuIG49PT12b2lkIDAmJihuPW5ldyBTZXQsdC5zZXQoZSxuKSksbn1fZ2V0U2hhZGVyU3RhZ2UoZSl7Y29uc3QgdD10aGlzLnNoYWRlckNhY2hlO2xldCBuPXQuZ2V0KGUpO3JldHVybiBuPT09dm9pZCAwJiYobj1uZXcgb1MoZSksdC5zZXQoZSxuKSksbn19Y2xhc3Mgb1N7Y29uc3RydWN0b3IoZSl7dGhpcy5pZD1zUysrLHRoaXMuY29kZT1lLHRoaXMudXNlZFRpbWVzPTB9fWZ1bmN0aW9uIGxTKHIsZSx0LG4saSxzLGEpe2NvbnN0IG89bmV3IGlvLGw9bmV3IGFTLGM9W10saD1pLmlzV2ViR0wyLHU9aS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyLGY9aS52ZXJ0ZXhUZXh0dXJlcztsZXQgZD1pLnByZWNpc2lvbjtjb25zdCBwPXtNZXNoRGVwdGhNYXRlcmlhbDoiZGVwdGgiLE1lc2hEaXN0YW5jZU1hdGVyaWFsOiJkaXN0YW5jZVJHQkEiLE1lc2hOb3JtYWxNYXRlcmlhbDoibm9ybWFsIixNZXNoQmFzaWNNYXRlcmlhbDoiYmFzaWMiLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ImxhbWJlcnQiLE1lc2hQaG9uZ01hdGVyaWFsOiJwaG9uZyIsTWVzaFRvb25NYXRlcmlhbDoidG9vbiIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIixMaW5lQmFzaWNNYXRlcmlhbDoiYmFzaWMiLExpbmVEYXNoZWRNYXRlcmlhbDoiZGFzaGVkIixQb2ludHNNYXRlcmlhbDoicG9pbnRzIixTaGFkb3dNYXRlcmlhbDoic2hhZG93IixTcHJpdGVNYXRlcmlhbDoic3ByaXRlIn07ZnVuY3Rpb24gXyhNKXtyZXR1cm4gTT09PTA/InV2IjpgdXYke019YH1mdW5jdGlvbiBnKE0sdyxSLE4sQil7Y29uc3QgST1OLmZvZyxVPUIuZ2VvbWV0cnksej1NLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/Ti5lbnZpcm9ubWVudDpudWxsLEY9KE0uaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD90OmUpLmdldChNLmVudk1hcHx8eiksWj1GJiZGLm1hcHBpbmc9PT1icj9GLmltYWdlLmhlaWdodDpudWxsLFY9cFtNLnR5cGVdO00ucHJlY2lzaW9uIT09bnVsbCYmKGQ9aS5nZXRNYXhQcmVjaXNpb24oTS5wcmVjaXNpb24pLGQhPT1NLnByZWNpc2lvbiYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW0uZ2V0UGFyYW1ldGVyczoiLE0ucHJlY2lzaW9uLCJub3Qgc3VwcG9ydGVkLCB1c2luZyIsZCwiaW5zdGVhZC4iKSk7Y29uc3QgUT1VLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbnx8VS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsfHxVLm1vcnBoQXR0cmlidXRlcy5jb2xvcixuZT1RIT09dm9pZCAwP1EubGVuZ3RoOjA7bGV0IGZlPTA7VS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDAmJihmZT0xKSxVLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwhPT12b2lkIDAmJihmZT0yKSxVLm1vcnBoQXR0cmlidXRlcy5jb2xvciE9PXZvaWQgMCYmKGZlPTMpO2xldCAkLGVlLGRlLFRlO2lmKFYpe2NvbnN0IG5uPU5uW1ZdOyQ9bm4udmVydGV4U2hhZGVyLGVlPW5uLmZyYWdtZW50U2hhZGVyfWVsc2UgJD1NLnZlcnRleFNoYWRlcixlZT1NLmZyYWdtZW50U2hhZGVyLGwudXBkYXRlKE0pLGRlPWwuZ2V0VmVydGV4U2hhZGVySUQoTSksVGU9bC5nZXRGcmFnbWVudFNoYWRlcklEKE0pO2NvbnN0IGJlPXIuZ2V0UmVuZGVyVGFyZ2V0KCksT2U9Qi5pc0luc3RhbmNlZE1lc2g9PT0hMCxCZT1CLmlzQmF0Y2hlZE1lc2g9PT0hMCx3ZT0hIU0ubWFwLFBlPSEhTS5tYXRjYXAsRD0hIUYsbGU9ISFNLmFvTWFwLEs9ISFNLmxpZ2h0TWFwLHVlPSEhTS5idW1wTWFwLHJlPSEhTS5ub3JtYWxNYXAsQ2U9ISFNLmRpc3BsYWNlbWVudE1hcCxXPSEhTS5lbWlzc2l2ZU1hcCxKPSEhTS5tZXRhbG5lc3NNYXAsaWU9ISFNLnJvdWdobmVzc01hcCxtZT1NLmFuaXNvdHJvcHk+MCxwZT1NLmNsZWFyY29hdD4wLEM9TS5pcmlkZXNjZW5jZT4wLEU9TS5zaGVlbj4wLGs9TS50cmFuc21pc3Npb24+MCxzZT1tZSYmISFNLmFuaXNvdHJvcHlNYXAsdGU9cGUmJiEhTS5jbGVhcmNvYXRNYXAsYWU9cGUmJiEhTS5jbGVhcmNvYXROb3JtYWxNYXAsQWU9cGUmJiEhTS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAsb2U9QyYmISFNLmlyaWRlc2NlbmNlTWFwLHhlPUMmJiEhTS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCxEZT1FJiYhIU0uc2hlZW5Db2xvck1hcCx0dD1FJiYhIU0uc2hlZW5Sb3VnaG5lc3NNYXAsY2U9ISFNLnNwZWN1bGFyTWFwLGF0PSEhTS5zcGVjdWxhckNvbG9yTWFwLFZlPSEhTS5zcGVjdWxhckludGVuc2l0eU1hcCxOZT1rJiYhIU0udHJhbnNtaXNzaW9uTWFwLExlPWsmJiEhTS50aGlja25lc3NNYXAsRWU9ISFNLmdyYWRpZW50TWFwLGplPSEhTS5hbHBoYU1hcCxPPU0uYWxwaGFUZXN0PjAsdmU9ISFNLmFscGhhSGFzaCxoZT0hIU0uZXh0ZW5zaW9ucyxqPSEhVS5hdHRyaWJ1dGVzLnV2MSxnZT0hIVUuYXR0cmlidXRlcy51djIsemU9ISFVLmF0dHJpYnV0ZXMudXYzO2xldCBpdD1KbjtyZXR1cm4gTS50b25lTWFwcGVkJiYoYmU9PT1udWxsfHxiZS5pc1hSUmVuZGVyVGFyZ2V0PT09ITApJiYoaXQ9ci50b25lTWFwcGluZykse2lzV2ViR0wyOmgsc2hhZGVySUQ6VixzaGFkZXJUeXBlOk0udHlwZSxzaGFkZXJOYW1lOk0ubmFtZSx2ZXJ0ZXhTaGFkZXI6JCxmcmFnbWVudFNoYWRlcjplZSxkZWZpbmVzOk0uZGVmaW5lcyxjdXN0b21WZXJ0ZXhTaGFkZXJJRDpkZSxjdXN0b21GcmFnbWVudFNoYWRlcklEOlRlLGlzUmF3U2hhZGVyTWF0ZXJpYWw6TS5pc1Jhd1NoYWRlck1hdGVyaWFsPT09ITAsZ2xzbFZlcnNpb246TS5nbHNsVmVyc2lvbixwcmVjaXNpb246ZCxiYXRjaGluZzpCZSxpbnN0YW5jaW5nOk9lLGluc3RhbmNpbmdDb2xvcjpPZSYmQi5pbnN0YW5jZUNvbG9yIT09bnVsbCxzdXBwb3J0c1ZlcnRleFRleHR1cmVzOmYsb3V0cHV0Q29sb3JTcGFjZTpiZT09PW51bGw/ci5vdXRwdXRDb2xvclNwYWNlOmJlLmlzWFJSZW5kZXJUYXJnZXQ9PT0hMD9iZS50ZXh0dXJlLmNvbG9yU3BhY2U6Vm4sbWFwOndlLG1hdGNhcDpQZSxlbnZNYXA6RCxlbnZNYXBNb2RlOkQmJkYubWFwcGluZyxlbnZNYXBDdWJlVVZIZWlnaHQ6Wixhb01hcDpsZSxsaWdodE1hcDpLLGJ1bXBNYXA6dWUsbm9ybWFsTWFwOnJlLGRpc3BsYWNlbWVudE1hcDpmJiZDZSxlbWlzc2l2ZU1hcDpXLG5vcm1hbE1hcE9iamVjdFNwYWNlOnJlJiZNLm5vcm1hbE1hcFR5cGU9PT1tZCxub3JtYWxNYXBUYW5nZW50U3BhY2U6cmUmJk0ubm9ybWFsTWFwVHlwZT09PXdpLG1ldGFsbmVzc01hcDpKLHJvdWdobmVzc01hcDppZSxhbmlzb3Ryb3B5Om1lLGFuaXNvdHJvcHlNYXA6c2UsY2xlYXJjb2F0OnBlLGNsZWFyY29hdE1hcDp0ZSxjbGVhcmNvYXROb3JtYWxNYXA6YWUsY2xlYXJjb2F0Um91Z2huZXNzTWFwOkFlLGlyaWRlc2NlbmNlOkMsaXJpZGVzY2VuY2VNYXA6b2UsaXJpZGVzY2VuY2VUaGlja25lc3NNYXA6eGUsc2hlZW46RSxzaGVlbkNvbG9yTWFwOkRlLHNoZWVuUm91Z2huZXNzTWFwOnR0LHNwZWN1bGFyTWFwOmNlLHNwZWN1bGFyQ29sb3JNYXA6YXQsc3BlY3VsYXJJbnRlbnNpdHlNYXA6VmUsdHJhbnNtaXNzaW9uOmssdHJhbnNtaXNzaW9uTWFwOk5lLHRoaWNrbmVzc01hcDpMZSxncmFkaWVudE1hcDpFZSxvcGFxdWU6TS50cmFuc3BhcmVudD09PSExJiZNLmJsZW5kaW5nPT09QmksYWxwaGFNYXA6amUsYWxwaGFUZXN0Ok8sYWxwaGFIYXNoOnZlLGNvbWJpbmU6TS5jb21iaW5lLG1hcFV2OndlJiZfKE0ubWFwLmNoYW5uZWwpLGFvTWFwVXY6bGUmJl8oTS5hb01hcC5jaGFubmVsKSxsaWdodE1hcFV2OksmJl8oTS5saWdodE1hcC5jaGFubmVsKSxidW1wTWFwVXY6dWUmJl8oTS5idW1wTWFwLmNoYW5uZWwpLG5vcm1hbE1hcFV2OnJlJiZfKE0ubm9ybWFsTWFwLmNoYW5uZWwpLGRpc3BsYWNlbWVudE1hcFV2OkNlJiZfKE0uZGlzcGxhY2VtZW50TWFwLmNoYW5uZWwpLGVtaXNzaXZlTWFwVXY6VyYmXyhNLmVtaXNzaXZlTWFwLmNoYW5uZWwpLG1ldGFsbmVzc01hcFV2OkomJl8oTS5tZXRhbG5lc3NNYXAuY2hhbm5lbCkscm91Z2huZXNzTWFwVXY6aWUmJl8oTS5yb3VnaG5lc3NNYXAuY2hhbm5lbCksYW5pc290cm9weU1hcFV2OnNlJiZfKE0uYW5pc290cm9weU1hcC5jaGFubmVsKSxjbGVhcmNvYXRNYXBVdjp0ZSYmXyhNLmNsZWFyY29hdE1hcC5jaGFubmVsKSxjbGVhcmNvYXROb3JtYWxNYXBVdjphZSYmXyhNLmNsZWFyY29hdE5vcm1hbE1hcC5jaGFubmVsKSxjbGVhcmNvYXRSb3VnaG5lc3NNYXBVdjpBZSYmXyhNLmNsZWFyY29hdFJvdWdobmVzc01hcC5jaGFubmVsKSxpcmlkZXNjZW5jZU1hcFV2Om9lJiZfKE0uaXJpZGVzY2VuY2VNYXAuY2hhbm5lbCksaXJpZGVzY2VuY2VUaGlja25lc3NNYXBVdjp4ZSYmXyhNLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLmNoYW5uZWwpLHNoZWVuQ29sb3JNYXBVdjpEZSYmXyhNLnNoZWVuQ29sb3JNYXAuY2hhbm5lbCksc2hlZW5Sb3VnaG5lc3NNYXBVdjp0dCYmXyhNLnNoZWVuUm91Z2huZXNzTWFwLmNoYW5uZWwpLHNwZWN1bGFyTWFwVXY6Y2UmJl8oTS5zcGVjdWxhck1hcC5jaGFubmVsKSxzcGVjdWxhckNvbG9yTWFwVXY6YXQmJl8oTS5zcGVjdWxhckNvbG9yTWFwLmNoYW5uZWwpLHNwZWN1bGFySW50ZW5zaXR5TWFwVXY6VmUmJl8oTS5zcGVjdWxhckludGVuc2l0eU1hcC5jaGFubmVsKSx0cmFuc21pc3Npb25NYXBVdjpOZSYmXyhNLnRyYW5zbWlzc2lvbk1hcC5jaGFubmVsKSx0aGlja25lc3NNYXBVdjpMZSYmXyhNLnRoaWNrbmVzc01hcC5jaGFubmVsKSxhbHBoYU1hcFV2OmplJiZfKE0uYWxwaGFNYXAuY2hhbm5lbCksdmVydGV4VGFuZ2VudHM6ISFVLmF0dHJpYnV0ZXMudGFuZ2VudCYmKHJlfHxtZSksdmVydGV4Q29sb3JzOk0udmVydGV4Q29sb3JzLHZlcnRleEFscGhhczpNLnZlcnRleENvbG9ycz09PSEwJiYhIVUuYXR0cmlidXRlcy5jb2xvciYmVS5hdHRyaWJ1dGVzLmNvbG9yLml0ZW1TaXplPT09NCx2ZXJ0ZXhVdjFzOmosdmVydGV4VXYyczpnZSx2ZXJ0ZXhVdjNzOnplLHBvaW50c1V2czpCLmlzUG9pbnRzPT09ITAmJiEhVS5hdHRyaWJ1dGVzLnV2JiYod2V8fGplKSxmb2c6ISFJLHVzZUZvZzpNLmZvZz09PSEwLGZvZ0V4cDI6SSYmSS5pc0ZvZ0V4cDIsZmxhdFNoYWRpbmc6TS5mbGF0U2hhZGluZz09PSEwLHNpemVBdHRlbnVhdGlvbjpNLnNpemVBdHRlbnVhdGlvbj09PSEwLGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6dSxza2lubmluZzpCLmlzU2tpbm5lZE1lc2g9PT0hMCxtb3JwaFRhcmdldHM6VS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDAsbW9ycGhOb3JtYWxzOlUubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCE9PXZvaWQgMCxtb3JwaENvbG9yczpVLm1vcnBoQXR0cmlidXRlcy5jb2xvciE9PXZvaWQgMCxtb3JwaFRhcmdldHNDb3VudDpuZSxtb3JwaFRleHR1cmVTdHJpZGU6ZmUsbnVtRGlyTGlnaHRzOncuZGlyZWN0aW9uYWwubGVuZ3RoLG51bVBvaW50TGlnaHRzOncucG9pbnQubGVuZ3RoLG51bVNwb3RMaWdodHM6dy5zcG90Lmxlbmd0aCxudW1TcG90TGlnaHRNYXBzOncuc3BvdExpZ2h0TWFwLmxlbmd0aCxudW1SZWN0QXJlYUxpZ2h0czp3LnJlY3RBcmVhLmxlbmd0aCxudW1IZW1pTGlnaHRzOncuaGVtaS5sZW5ndGgsbnVtRGlyTGlnaHRTaGFkb3dzOncuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoLG51bVBvaW50TGlnaHRTaGFkb3dzOncucG9pbnRTaGFkb3dNYXAubGVuZ3RoLG51bVNwb3RMaWdodFNoYWRvd3M6dy5zcG90U2hhZG93TWFwLmxlbmd0aCxudW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM6dy5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHMsbnVtTGlnaHRQcm9iZXM6dy5udW1MaWdodFByb2JlcyxudW1DbGlwcGluZ1BsYW5lczphLm51bVBsYW5lcyxudW1DbGlwSW50ZXJzZWN0aW9uOmEubnVtSW50ZXJzZWN0aW9uLGRpdGhlcmluZzpNLmRpdGhlcmluZyxzaGFkb3dNYXBFbmFibGVkOnIuc2hhZG93TWFwLmVuYWJsZWQmJlIubGVuZ3RoPjAsc2hhZG93TWFwVHlwZTpyLnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOml0LHVzZUxlZ2FjeUxpZ2h0czpyLl91c2VMZWdhY3lMaWdodHMsZGVjb2RlVmlkZW9UZXh0dXJlOndlJiZNLm1hcC5pc1ZpZGVvVGV4dHVyZT09PSEwJiZvdC5nZXRUcmFuc2ZlcihNLm1hcC5jb2xvclNwYWNlKT09PWN0LHByZW11bHRpcGxpZWRBbHBoYTpNLnByZW11bHRpcGxpZWRBbHBoYSxkb3VibGVTaWRlZDpNLnNpZGU9PT1HbixmbGlwU2lkZWQ6TS5zaWRlPT09WXQsdXNlRGVwdGhQYWNraW5nOk0uZGVwdGhQYWNraW5nPj0wLGRlcHRoUGFja2luZzpNLmRlcHRoUGFja2luZ3x8MCxpbmRleDBBdHRyaWJ1dGVOYW1lOk0uaW5kZXgwQXR0cmlidXRlTmFtZSxleHRlbnNpb25EZXJpdmF0aXZlczpoZSYmTS5leHRlbnNpb25zLmRlcml2YXRpdmVzPT09ITAsZXh0ZW5zaW9uRnJhZ0RlcHRoOmhlJiZNLmV4dGVuc2lvbnMuZnJhZ0RlcHRoPT09ITAsZXh0ZW5zaW9uRHJhd0J1ZmZlcnM6aGUmJk0uZXh0ZW5zaW9ucy5kcmF3QnVmZmVycz09PSEwLGV4dGVuc2lvblNoYWRlclRleHR1cmVMT0Q6aGUmJk0uZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EPT09ITAscmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGg6aHx8bi5oYXMoIkVYVF9mcmFnX2RlcHRoIikscmVuZGVyZXJFeHRlbnNpb25EcmF3QnVmZmVyczpofHxuLmhhcygiV0VCR0xfZHJhd19idWZmZXJzIikscmVuZGVyZXJFeHRlbnNpb25TaGFkZXJUZXh0dXJlTG9kOmh8fG4uaGFzKCJFWFRfc2hhZGVyX3RleHR1cmVfbG9kIikscmVuZGVyZXJFeHRlbnNpb25QYXJhbGxlbFNoYWRlckNvbXBpbGU6bi5oYXMoIktIUl9wYXJhbGxlbF9zaGFkZXJfY29tcGlsZSIpLGN1c3RvbVByb2dyYW1DYWNoZUtleTpNLmN1c3RvbVByb2dyYW1DYWNoZUtleSgpfX1mdW5jdGlvbiBtKE0pe2NvbnN0IHc9W107aWYoTS5zaGFkZXJJRD93LnB1c2goTS5zaGFkZXJJRCk6KHcucHVzaChNLmN1c3RvbVZlcnRleFNoYWRlcklEKSx3LnB1c2goTS5jdXN0b21GcmFnbWVudFNoYWRlcklEKSksTS5kZWZpbmVzIT09dm9pZCAwKWZvcihjb25zdCBSIGluIE0uZGVmaW5lcyl3LnB1c2goUiksdy5wdXNoKE0uZGVmaW5lc1tSXSk7cmV0dXJuIE0uaXNSYXdTaGFkZXJNYXRlcmlhbD09PSExJiYoeSh3LE0pLHgodyxNKSx3LnB1c2goci5vdXRwdXRDb2xvclNwYWNlKSksdy5wdXNoKE0uY3VzdG9tUHJvZ3JhbUNhY2hlS2V5KSx3LmpvaW4oKX1mdW5jdGlvbiB5KE0sdyl7TS5wdXNoKHcucHJlY2lzaW9uKSxNLnB1c2gody5vdXRwdXRDb2xvclNwYWNlKSxNLnB1c2gody5lbnZNYXBNb2RlKSxNLnB1c2gody5lbnZNYXBDdWJlVVZIZWlnaHQpLE0ucHVzaCh3Lm1hcFV2KSxNLnB1c2gody5hbHBoYU1hcFV2KSxNLnB1c2gody5saWdodE1hcFV2KSxNLnB1c2gody5hb01hcFV2KSxNLnB1c2gody5idW1wTWFwVXYpLE0ucHVzaCh3Lm5vcm1hbE1hcFV2KSxNLnB1c2gody5kaXNwbGFjZW1lbnRNYXBVdiksTS5wdXNoKHcuZW1pc3NpdmVNYXBVdiksTS5wdXNoKHcubWV0YWxuZXNzTWFwVXYpLE0ucHVzaCh3LnJvdWdobmVzc01hcFV2KSxNLnB1c2gody5hbmlzb3Ryb3B5TWFwVXYpLE0ucHVzaCh3LmNsZWFyY29hdE1hcFV2KSxNLnB1c2gody5jbGVhcmNvYXROb3JtYWxNYXBVdiksTS5wdXNoKHcuY2xlYXJjb2F0Um91Z2huZXNzTWFwVXYpLE0ucHVzaCh3LmlyaWRlc2NlbmNlTWFwVXYpLE0ucHVzaCh3LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwVXYpLE0ucHVzaCh3LnNoZWVuQ29sb3JNYXBVdiksTS5wdXNoKHcuc2hlZW5Sb3VnaG5lc3NNYXBVdiksTS5wdXNoKHcuc3BlY3VsYXJNYXBVdiksTS5wdXNoKHcuc3BlY3VsYXJDb2xvck1hcFV2KSxNLnB1c2gody5zcGVjdWxhckludGVuc2l0eU1hcFV2KSxNLnB1c2gody50cmFuc21pc3Npb25NYXBVdiksTS5wdXNoKHcudGhpY2tuZXNzTWFwVXYpLE0ucHVzaCh3LmNvbWJpbmUpLE0ucHVzaCh3LmZvZ0V4cDIpLE0ucHVzaCh3LnNpemVBdHRlbnVhdGlvbiksTS5wdXNoKHcubW9ycGhUYXJnZXRzQ291bnQpLE0ucHVzaCh3Lm1vcnBoQXR0cmlidXRlQ291bnQpLE0ucHVzaCh3Lm51bURpckxpZ2h0cyksTS5wdXNoKHcubnVtUG9pbnRMaWdodHMpLE0ucHVzaCh3Lm51bVNwb3RMaWdodHMpLE0ucHVzaCh3Lm51bVNwb3RMaWdodE1hcHMpLE0ucHVzaCh3Lm51bUhlbWlMaWdodHMpLE0ucHVzaCh3Lm51bVJlY3RBcmVhTGlnaHRzKSxNLnB1c2gody5udW1EaXJMaWdodFNoYWRvd3MpLE0ucHVzaCh3Lm51bVBvaW50TGlnaHRTaGFkb3dzKSxNLnB1c2gody5udW1TcG90TGlnaHRTaGFkb3dzKSxNLnB1c2gody5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHMpLE0ucHVzaCh3Lm51bUxpZ2h0UHJvYmVzKSxNLnB1c2gody5zaGFkb3dNYXBUeXBlKSxNLnB1c2gody50b25lTWFwcGluZyksTS5wdXNoKHcubnVtQ2xpcHBpbmdQbGFuZXMpLE0ucHVzaCh3Lm51bUNsaXBJbnRlcnNlY3Rpb24pLE0ucHVzaCh3LmRlcHRoUGFja2luZyl9ZnVuY3Rpb24geChNLHcpe28uZGlzYWJsZUFsbCgpLHcuaXNXZWJHTDImJm8uZW5hYmxlKDApLHcuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyYmby5lbmFibGUoMSksdy5pbnN0YW5jaW5nJiZvLmVuYWJsZSgyKSx3Lmluc3RhbmNpbmdDb2xvciYmby5lbmFibGUoMyksdy5tYXRjYXAmJm8uZW5hYmxlKDQpLHcuZW52TWFwJiZvLmVuYWJsZSg1KSx3Lm5vcm1hbE1hcE9iamVjdFNwYWNlJiZvLmVuYWJsZSg2KSx3Lm5vcm1hbE1hcFRhbmdlbnRTcGFjZSYmby5lbmFibGUoNyksdy5jbGVhcmNvYXQmJm8uZW5hYmxlKDgpLHcuaXJpZGVzY2VuY2UmJm8uZW5hYmxlKDkpLHcuYWxwaGFUZXN0JiZvLmVuYWJsZSgxMCksdy52ZXJ0ZXhDb2xvcnMmJm8uZW5hYmxlKDExKSx3LnZlcnRleEFscGhhcyYmby5lbmFibGUoMTIpLHcudmVydGV4VXYxcyYmby5lbmFibGUoMTMpLHcudmVydGV4VXYycyYmby5lbmFibGUoMTQpLHcudmVydGV4VXYzcyYmby5lbmFibGUoMTUpLHcudmVydGV4VGFuZ2VudHMmJm8uZW5hYmxlKDE2KSx3LmFuaXNvdHJvcHkmJm8uZW5hYmxlKDE3KSx3LmFscGhhSGFzaCYmby5lbmFibGUoMTgpLHcuYmF0Y2hpbmcmJm8uZW5hYmxlKDE5KSxNLnB1c2goby5tYXNrKSxvLmRpc2FibGVBbGwoKSx3LmZvZyYmby5lbmFibGUoMCksdy51c2VGb2cmJm8uZW5hYmxlKDEpLHcuZmxhdFNoYWRpbmcmJm8uZW5hYmxlKDIpLHcubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmby5lbmFibGUoMyksdy5za2lubmluZyYmby5lbmFibGUoNCksdy5tb3JwaFRhcmdldHMmJm8uZW5hYmxlKDUpLHcubW9ycGhOb3JtYWxzJiZvLmVuYWJsZSg2KSx3Lm1vcnBoQ29sb3JzJiZvLmVuYWJsZSg3KSx3LnByZW11bHRpcGxpZWRBbHBoYSYmby5lbmFibGUoOCksdy5zaGFkb3dNYXBFbmFibGVkJiZvLmVuYWJsZSg5KSx3LnVzZUxlZ2FjeUxpZ2h0cyYmby5lbmFibGUoMTApLHcuZG91YmxlU2lkZWQmJm8uZW5hYmxlKDExKSx3LmZsaXBTaWRlZCYmby5lbmFibGUoMTIpLHcudXNlRGVwdGhQYWNraW5nJiZvLmVuYWJsZSgxMyksdy5kaXRoZXJpbmcmJm8uZW5hYmxlKDE0KSx3LnRyYW5zbWlzc2lvbiYmby5lbmFibGUoMTUpLHcuc2hlZW4mJm8uZW5hYmxlKDE2KSx3Lm9wYXF1ZSYmby5lbmFibGUoMTcpLHcucG9pbnRzVXZzJiZvLmVuYWJsZSgxOCksdy5kZWNvZGVWaWRlb1RleHR1cmUmJm8uZW5hYmxlKDE5KSxNLnB1c2goby5tYXNrKX1mdW5jdGlvbiB2KE0pe2NvbnN0IHc9cFtNLnR5cGVdO2xldCBSO2lmKHcpe2NvbnN0IE49Tm5bd107Uj1YZC5jbG9uZShOLnVuaWZvcm1zKX1lbHNlIFI9TS51bmlmb3JtcztyZXR1cm4gUn1mdW5jdGlvbiBTKE0sdyl7bGV0IFI7Zm9yKGxldCBOPTAsQj1jLmxlbmd0aDtOPEI7TisrKXtjb25zdCBJPWNbTl07aWYoSS5jYWNoZUtleT09PXcpe1I9SSwrK1IudXNlZFRpbWVzO2JyZWFrfX1yZXR1cm4gUj09PXZvaWQgMCYmKFI9bmV3IHJTKHIsdyxNLHMpLGMucHVzaChSKSksUn1mdW5jdGlvbiBiKE0pe2lmKC0tTS51c2VkVGltZXM9PT0wKXtjb25zdCB3PWMuaW5kZXhPZihNKTtjW3ddPWNbYy5sZW5ndGgtMV0sYy5wb3AoKSxNLmRlc3Ryb3koKX19ZnVuY3Rpb24gQShNKXtsLnJlbW92ZShNKX1mdW5jdGlvbiBMKCl7bC5kaXNwb3NlKCl9cmV0dXJue2dldFBhcmFtZXRlcnM6ZyxnZXRQcm9ncmFtQ2FjaGVLZXk6bSxnZXRVbmlmb3Jtczp2LGFjcXVpcmVQcm9ncmFtOlMscmVsZWFzZVByb2dyYW06YixyZWxlYXNlU2hhZGVyQ2FjaGU6QSxwcm9ncmFtczpjLGRpc3Bvc2U6TH19ZnVuY3Rpb24gY1MoKXtsZXQgcj1uZXcgV2Vha01hcDtmdW5jdGlvbiBlKHMpe2xldCBhPXIuZ2V0KHMpO3JldHVybiBhPT09dm9pZCAwJiYoYT17fSxyLnNldChzLGEpKSxhfWZ1bmN0aW9uIHQocyl7ci5kZWxldGUocyl9ZnVuY3Rpb24gbihzLGEsbyl7ci5nZXQocylbYV09b31mdW5jdGlvbiBpKCl7cj1uZXcgV2Vha01hcH1yZXR1cm57Z2V0OmUscmVtb3ZlOnQsdXBkYXRlOm4sZGlzcG9zZTppfX1mdW5jdGlvbiBoUyhyLGUpe3JldHVybiByLmdyb3VwT3JkZXIhPT1lLmdyb3VwT3JkZXI/ci5ncm91cE9yZGVyLWUuZ3JvdXBPcmRlcjpyLnJlbmRlck9yZGVyIT09ZS5yZW5kZXJPcmRlcj9yLnJlbmRlck9yZGVyLWUucmVuZGVyT3JkZXI6ci5tYXRlcmlhbC5pZCE9PWUubWF0ZXJpYWwuaWQ/ci5tYXRlcmlhbC5pZC1lLm1hdGVyaWFsLmlkOnIueiE9PWUuej9yLnotZS56OnIuaWQtZS5pZH1mdW5jdGlvbiB4cChyLGUpe3JldHVybiByLmdyb3VwT3JkZXIhPT1lLmdyb3VwT3JkZXI/ci5ncm91cE9yZGVyLWUuZ3JvdXBPcmRlcjpyLnJlbmRlck9yZGVyIT09ZS5yZW5kZXJPcmRlcj9yLnJlbmRlck9yZGVyLWUucmVuZGVyT3JkZXI6ci56IT09ZS56P2Uuei1yLno6ci5pZC1lLmlkfWZ1bmN0aW9uIHlwKCl7Y29uc3Qgcj1bXTtsZXQgZT0wO2NvbnN0IHQ9W10sbj1bXSxpPVtdO2Z1bmN0aW9uIHMoKXtlPTAsdC5sZW5ndGg9MCxuLmxlbmd0aD0wLGkubGVuZ3RoPTB9ZnVuY3Rpb24gYSh1LGYsZCxwLF8sZyl7bGV0IG09cltlXTtyZXR1cm4gbT09PXZvaWQgMD8obT17aWQ6dS5pZCxvYmplY3Q6dSxnZW9tZXRyeTpmLG1hdGVyaWFsOmQsZ3JvdXBPcmRlcjpwLHJlbmRlck9yZGVyOnUucmVuZGVyT3JkZXIsejpfLGdyb3VwOmd9LHJbZV09bSk6KG0uaWQ9dS5pZCxtLm9iamVjdD11LG0uZ2VvbWV0cnk9ZixtLm1hdGVyaWFsPWQsbS5ncm91cE9yZGVyPXAsbS5yZW5kZXJPcmRlcj11LnJlbmRlck9yZGVyLG0uej1fLG0uZ3JvdXA9ZyksZSsrLG19ZnVuY3Rpb24gbyh1LGYsZCxwLF8sZyl7Y29uc3QgbT1hKHUsZixkLHAsXyxnKTtkLnRyYW5zbWlzc2lvbj4wP24ucHVzaChtKTpkLnRyYW5zcGFyZW50PT09ITA/aS5wdXNoKG0pOnQucHVzaChtKX1mdW5jdGlvbiBsKHUsZixkLHAsXyxnKXtjb25zdCBtPWEodSxmLGQscCxfLGcpO2QudHJhbnNtaXNzaW9uPjA/bi51bnNoaWZ0KG0pOmQudHJhbnNwYXJlbnQ9PT0hMD9pLnVuc2hpZnQobSk6dC51bnNoaWZ0KG0pfWZ1bmN0aW9uIGModSxmKXt0Lmxlbmd0aD4xJiZ0LnNvcnQodXx8aFMpLG4ubGVuZ3RoPjEmJm4uc29ydChmfHx4cCksaS5sZW5ndGg+MSYmaS5zb3J0KGZ8fHhwKX1mdW5jdGlvbiBoKCl7Zm9yKGxldCB1PWUsZj1yLmxlbmd0aDt1PGY7dSsrKXtjb25zdCBkPXJbdV07aWYoZC5pZD09PW51bGwpYnJlYWs7ZC5pZD1udWxsLGQub2JqZWN0PW51bGwsZC5nZW9tZXRyeT1udWxsLGQubWF0ZXJpYWw9bnVsbCxkLmdyb3VwPW51bGx9fXJldHVybntvcGFxdWU6dCx0cmFuc21pc3NpdmU6bix0cmFuc3BhcmVudDppLGluaXQ6cyxwdXNoOm8sdW5zaGlmdDpsLGZpbmlzaDpoLHNvcnQ6Y319ZnVuY3Rpb24gdVMoKXtsZXQgcj1uZXcgV2Vha01hcDtmdW5jdGlvbiBlKG4saSl7Y29uc3Qgcz1yLmdldChuKTtsZXQgYTtyZXR1cm4gcz09PXZvaWQgMD8oYT1uZXcgeXAsci5zZXQobixbYV0pKTppPj1zLmxlbmd0aD8oYT1uZXcgeXAscy5wdXNoKGEpKTphPXNbaV0sYX1mdW5jdGlvbiB0KCl7cj1uZXcgV2Vha01hcH1yZXR1cm57Z2V0OmUsZGlzcG9zZTp0fX1mdW5jdGlvbiBmUygpe2NvbnN0IHI9e307cmV0dXJue2dldDpmdW5jdGlvbihlKXtpZihyW2UuaWRdIT09dm9pZCAwKXJldHVybiByW2UuaWRdO2xldCB0O3N3aXRjaChlLnR5cGUpe2Nhc2UiRGlyZWN0aW9uYWxMaWdodCI6dD17ZGlyZWN0aW9uOm5ldyBQLGNvbG9yOm5ldyB5ZX07YnJlYWs7Y2FzZSJTcG90TGlnaHQiOnQ9e3Bvc2l0aW9uOm5ldyBQLGRpcmVjdGlvbjpuZXcgUCxjb2xvcjpuZXcgeWUsZGlzdGFuY2U6MCxjb25lQ29zOjAscGVudW1icmFDb3M6MCxkZWNheTowfTticmVhaztjYXNlIlBvaW50TGlnaHQiOnQ9e3Bvc2l0aW9uOm5ldyBQLGNvbG9yOm5ldyB5ZSxkaXN0YW5jZTowLGRlY2F5OjB9O2JyZWFrO2Nhc2UiSGVtaXNwaGVyZUxpZ2h0Ijp0PXtkaXJlY3Rpb246bmV3IFAsc2t5Q29sb3I6bmV3IHllLGdyb3VuZENvbG9yOm5ldyB5ZX07YnJlYWs7Y2FzZSJSZWN0QXJlYUxpZ2h0Ijp0PXtjb2xvcjpuZXcgeWUscG9zaXRpb246bmV3IFAsaGFsZldpZHRoOm5ldyBQLGhhbGZIZWlnaHQ6bmV3IFB9O2JyZWFrfXJldHVybiByW2UuaWRdPXQsdH19fWZ1bmN0aW9uIGRTKCl7Y29uc3Qgcj17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe2lmKHJbZS5pZF0hPT12b2lkIDApcmV0dXJuIHJbZS5pZF07bGV0IHQ7c3dpdGNoKGUudHlwZSl7Y2FzZSJEaXJlY3Rpb25hbExpZ2h0Ijp0PXtzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IHF9O2JyZWFrO2Nhc2UiU3BvdExpZ2h0Ijp0PXtzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IHF9O2JyZWFrO2Nhc2UiUG9pbnRMaWdodCI6dD17c2hhZG93QmlhczowLHNoYWRvd05vcm1hbEJpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBxLHNoYWRvd0NhbWVyYU5lYXI6MSxzaGFkb3dDYW1lcmFGYXI6MWUzfTticmVha31yZXR1cm4gcltlLmlkXT10LHR9fX1sZXQgcFM9MDtmdW5jdGlvbiBtUyhyLGUpe3JldHVybihlLmNhc3RTaGFkb3c/MjowKS0oci5jYXN0U2hhZG93PzI6MCkrKGUubWFwPzE6MCktKHIubWFwPzE6MCl9ZnVuY3Rpb24gZ1MocixlKXtjb25zdCB0PW5ldyBmUyxuPWRTKCksaT17dmVyc2lvbjowLGhhc2g6e2RpcmVjdGlvbmFsTGVuZ3RoOi0xLHBvaW50TGVuZ3RoOi0xLHNwb3RMZW5ndGg6LTEscmVjdEFyZWFMZW5ndGg6LTEsaGVtaUxlbmd0aDotMSxudW1EaXJlY3Rpb25hbFNoYWRvd3M6LTEsbnVtUG9pbnRTaGFkb3dzOi0xLG51bVNwb3RTaGFkb3dzOi0xLG51bVNwb3RNYXBzOi0xLG51bUxpZ2h0UHJvYmVzOi0xfSxhbWJpZW50OlswLDAsMF0scHJvYmU6W10sZGlyZWN0aW9uYWw6W10sZGlyZWN0aW9uYWxTaGFkb3c6W10sZGlyZWN0aW9uYWxTaGFkb3dNYXA6W10sZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6W10sc3BvdDpbXSxzcG90TGlnaHRNYXA6W10sc3BvdFNoYWRvdzpbXSxzcG90U2hhZG93TWFwOltdLHNwb3RMaWdodE1hdHJpeDpbXSxyZWN0QXJlYTpbXSxyZWN0QXJlYUxUQzE6bnVsbCxyZWN0QXJlYUxUQzI6bnVsbCxwb2ludDpbXSxwb2ludFNoYWRvdzpbXSxwb2ludFNoYWRvd01hcDpbXSxwb2ludFNoYWRvd01hdHJpeDpbXSxoZW1pOltdLG51bVNwb3RMaWdodFNoYWRvd3NXaXRoTWFwczowLG51bUxpZ2h0UHJvYmVzOjB9O2ZvcihsZXQgaD0wO2g8OTtoKyspaS5wcm9iZS5wdXNoKG5ldyBQKTtjb25zdCBzPW5ldyBQLGE9bmV3IEllLG89bmV3IEllO2Z1bmN0aW9uIGwoaCx1KXtsZXQgZj0wLGQ9MCxwPTA7Zm9yKGxldCBOPTA7Tjw5O04rKylpLnByb2JlW05dLnNldCgwLDAsMCk7bGV0IF89MCxnPTAsbT0wLHk9MCx4PTAsdj0wLFM9MCxiPTAsQT0wLEw9MCxNPTA7aC5zb3J0KG1TKTtjb25zdCB3PXU9PT0hMD9NYXRoLlBJOjE7Zm9yKGxldCBOPTAsQj1oLmxlbmd0aDtOPEI7TisrKXtjb25zdCBJPWhbTl0sVT1JLmNvbG9yLHo9SS5pbnRlbnNpdHksRj1JLmRpc3RhbmNlLFo9SS5zaGFkb3cmJkkuc2hhZG93Lm1hcD9JLnNoYWRvdy5tYXAudGV4dHVyZTpudWxsO2lmKEkuaXNBbWJpZW50TGlnaHQpZis9VS5yKnoqdyxkKz1VLmcqeip3LHArPVUuYip6Knc7ZWxzZSBpZihJLmlzTGlnaHRQcm9iZSl7Zm9yKGxldCBWPTA7Vjw5O1YrKylpLnByb2JlW1ZdLmFkZFNjYWxlZFZlY3RvcihJLnNoLmNvZWZmaWNpZW50c1tWXSx6KTtNKyt9ZWxzZSBpZihJLmlzRGlyZWN0aW9uYWxMaWdodCl7Y29uc3QgVj10LmdldChJKTtpZihWLmNvbG9yLmNvcHkoSS5jb2xvcikubXVsdGlwbHlTY2FsYXIoSS5pbnRlbnNpdHkqdyksSS5jYXN0U2hhZG93KXtjb25zdCBRPUkuc2hhZG93LG5lPW4uZ2V0KEkpO25lLnNoYWRvd0JpYXM9US5iaWFzLG5lLnNoYWRvd05vcm1hbEJpYXM9US5ub3JtYWxCaWFzLG5lLnNoYWRvd1JhZGl1cz1RLnJhZGl1cyxuZS5zaGFkb3dNYXBTaXplPVEubWFwU2l6ZSxpLmRpcmVjdGlvbmFsU2hhZG93W19dPW5lLGkuZGlyZWN0aW9uYWxTaGFkb3dNYXBbX109WixpLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4W19dPUkuc2hhZG93Lm1hdHJpeCx2Kyt9aS5kaXJlY3Rpb25hbFtfXT1WLF8rK31lbHNlIGlmKEkuaXNTcG90TGlnaHQpe2NvbnN0IFY9dC5nZXQoSSk7Vi5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oSS5tYXRyaXhXb3JsZCksVi5jb2xvci5jb3B5KFUpLm11bHRpcGx5U2NhbGFyKHoqdyksVi5kaXN0YW5jZT1GLFYuY29uZUNvcz1NYXRoLmNvcyhJLmFuZ2xlKSxWLnBlbnVtYnJhQ29zPU1hdGguY29zKEkuYW5nbGUqKDEtSS5wZW51bWJyYSkpLFYuZGVjYXk9SS5kZWNheSxpLnNwb3RbbV09Vjtjb25zdCBRPUkuc2hhZG93O2lmKEkubWFwJiYoaS5zcG90TGlnaHRNYXBbQV09SS5tYXAsQSsrLFEudXBkYXRlTWF0cmljZXMoSSksSS5jYXN0U2hhZG93JiZMKyspLGkuc3BvdExpZ2h0TWF0cml4W21dPVEubWF0cml4LEkuY2FzdFNoYWRvdyl7Y29uc3QgbmU9bi5nZXQoSSk7bmUuc2hhZG93Qmlhcz1RLmJpYXMsbmUuc2hhZG93Tm9ybWFsQmlhcz1RLm5vcm1hbEJpYXMsbmUuc2hhZG93UmFkaXVzPVEucmFkaXVzLG5lLnNoYWRvd01hcFNpemU9US5tYXBTaXplLGkuc3BvdFNoYWRvd1ttXT1uZSxpLnNwb3RTaGFkb3dNYXBbbV09WixiKyt9bSsrfWVsc2UgaWYoSS5pc1JlY3RBcmVhTGlnaHQpe2NvbnN0IFY9dC5nZXQoSSk7Vi5jb2xvci5jb3B5KFUpLm11bHRpcGx5U2NhbGFyKHopLFYuaGFsZldpZHRoLnNldChJLndpZHRoKi41LDAsMCksVi5oYWxmSGVpZ2h0LnNldCgwLEkuaGVpZ2h0Ki41LDApLGkucmVjdEFyZWFbeV09Vix5Kyt9ZWxzZSBpZihJLmlzUG9pbnRMaWdodCl7Y29uc3QgVj10LmdldChJKTtpZihWLmNvbG9yLmNvcHkoSS5jb2xvcikubXVsdGlwbHlTY2FsYXIoSS5pbnRlbnNpdHkqdyksVi5kaXN0YW5jZT1JLmRpc3RhbmNlLFYuZGVjYXk9SS5kZWNheSxJLmNhc3RTaGFkb3cpe2NvbnN0IFE9SS5zaGFkb3csbmU9bi5nZXQoSSk7bmUuc2hhZG93Qmlhcz1RLmJpYXMsbmUuc2hhZG93Tm9ybWFsQmlhcz1RLm5vcm1hbEJpYXMsbmUuc2hhZG93UmFkaXVzPVEucmFkaXVzLG5lLnNoYWRvd01hcFNpemU9US5tYXBTaXplLG5lLnNoYWRvd0NhbWVyYU5lYXI9US5jYW1lcmEubmVhcixuZS5zaGFkb3dDYW1lcmFGYXI9US5jYW1lcmEuZmFyLGkucG9pbnRTaGFkb3dbZ109bmUsaS5wb2ludFNoYWRvd01hcFtnXT1aLGkucG9pbnRTaGFkb3dNYXRyaXhbZ109SS5zaGFkb3cubWF0cml4LFMrK31pLnBvaW50W2ddPVYsZysrfWVsc2UgaWYoSS5pc0hlbWlzcGhlcmVMaWdodCl7Y29uc3QgVj10LmdldChJKTtWLnNreUNvbG9yLmNvcHkoSS5jb2xvcikubXVsdGlwbHlTY2FsYXIoeip3KSxWLmdyb3VuZENvbG9yLmNvcHkoSS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoeip3KSxpLmhlbWlbeF09Vix4Kyt9fXk+MCYmKGUuaXNXZWJHTDJ8fHIuaGFzKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKT09PSEwPyhpLnJlY3RBcmVhTFRDMT1fZS5MVENfRkxPQVRfMSxpLnJlY3RBcmVhTFRDMj1fZS5MVENfRkxPQVRfMik6ci5oYXMoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIik9PT0hMD8oaS5yZWN0QXJlYUxUQzE9X2UuTFRDX0hBTEZfMSxpLnJlY3RBcmVhTFRDMj1fZS5MVENfSEFMRl8yKTpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVbmFibGUgdG8gdXNlIFJlY3RBcmVhTGlnaHQuIE1pc3NpbmcgV2ViR0wgZXh0ZW5zaW9ucy4iKSksaS5hbWJpZW50WzBdPWYsaS5hbWJpZW50WzFdPWQsaS5hbWJpZW50WzJdPXA7Y29uc3QgUj1pLmhhc2g7KFIuZGlyZWN0aW9uYWxMZW5ndGghPT1ffHxSLnBvaW50TGVuZ3RoIT09Z3x8Ui5zcG90TGVuZ3RoIT09bXx8Ui5yZWN0QXJlYUxlbmd0aCE9PXl8fFIuaGVtaUxlbmd0aCE9PXh8fFIubnVtRGlyZWN0aW9uYWxTaGFkb3dzIT09dnx8Ui5udW1Qb2ludFNoYWRvd3MhPT1TfHxSLm51bVNwb3RTaGFkb3dzIT09Ynx8Ui5udW1TcG90TWFwcyE9PUF8fFIubnVtTGlnaHRQcm9iZXMhPT1NKSYmKGkuZGlyZWN0aW9uYWwubGVuZ3RoPV8saS5zcG90Lmxlbmd0aD1tLGkucmVjdEFyZWEubGVuZ3RoPXksaS5wb2ludC5sZW5ndGg9ZyxpLmhlbWkubGVuZ3RoPXgsaS5kaXJlY3Rpb25hbFNoYWRvdy5sZW5ndGg9dixpLmRpcmVjdGlvbmFsU2hhZG93TWFwLmxlbmd0aD12LGkucG9pbnRTaGFkb3cubGVuZ3RoPVMsaS5wb2ludFNoYWRvd01hcC5sZW5ndGg9UyxpLnNwb3RTaGFkb3cubGVuZ3RoPWIsaS5zcG90U2hhZG93TWFwLmxlbmd0aD1iLGkuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgubGVuZ3RoPXYsaS5wb2ludFNoYWRvd01hdHJpeC5sZW5ndGg9UyxpLnNwb3RMaWdodE1hdHJpeC5sZW5ndGg9YitBLUwsaS5zcG90TGlnaHRNYXAubGVuZ3RoPUEsaS5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM9TCxpLm51bUxpZ2h0UHJvYmVzPU0sUi5kaXJlY3Rpb25hbExlbmd0aD1fLFIucG9pbnRMZW5ndGg9ZyxSLnNwb3RMZW5ndGg9bSxSLnJlY3RBcmVhTGVuZ3RoPXksUi5oZW1pTGVuZ3RoPXgsUi5udW1EaXJlY3Rpb25hbFNoYWRvd3M9dixSLm51bVBvaW50U2hhZG93cz1TLFIubnVtU3BvdFNoYWRvd3M9YixSLm51bVNwb3RNYXBzPUEsUi5udW1MaWdodFByb2Jlcz1NLGkudmVyc2lvbj1wUysrKX1mdW5jdGlvbiBjKGgsdSl7bGV0IGY9MCxkPTAscD0wLF89MCxnPTA7Y29uc3QgbT11Lm1hdHJpeFdvcmxkSW52ZXJzZTtmb3IobGV0IHk9MCx4PWgubGVuZ3RoO3k8eDt5Kyspe2NvbnN0IHY9aFt5XTtpZih2LmlzRGlyZWN0aW9uYWxMaWdodCl7Y29uc3QgUz1pLmRpcmVjdGlvbmFsW2ZdO1MuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbih2Lm1hdHJpeFdvcmxkKSxzLnNldEZyb21NYXRyaXhQb3NpdGlvbih2LnRhcmdldC5tYXRyaXhXb3JsZCksUy5kaXJlY3Rpb24uc3ViKHMpLFMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihtKSxmKyt9ZWxzZSBpZih2LmlzU3BvdExpZ2h0KXtjb25zdCBTPWkuc3BvdFtwXTtTLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbih2Lm1hdHJpeFdvcmxkKSxTLnBvc2l0aW9uLmFwcGx5TWF0cml4NChtKSxTLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24odi5tYXRyaXhXb3JsZCkscy5zZXRGcm9tTWF0cml4UG9zaXRpb24odi50YXJnZXQubWF0cml4V29ybGQpLFMuZGlyZWN0aW9uLnN1YihzKSxTLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24obSkscCsrfWVsc2UgaWYodi5pc1JlY3RBcmVhTGlnaHQpe2NvbnN0IFM9aS5yZWN0QXJlYVtfXTtTLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbih2Lm1hdHJpeFdvcmxkKSxTLnBvc2l0aW9uLmFwcGx5TWF0cml4NChtKSxvLmlkZW50aXR5KCksYS5jb3B5KHYubWF0cml4V29ybGQpLGEucHJlbXVsdGlwbHkobSksby5leHRyYWN0Um90YXRpb24oYSksUy5oYWxmV2lkdGguc2V0KHYud2lkdGgqLjUsMCwwKSxTLmhhbGZIZWlnaHQuc2V0KDAsdi5oZWlnaHQqLjUsMCksUy5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KG8pLFMuaGFsZkhlaWdodC5hcHBseU1hdHJpeDQobyksXysrfWVsc2UgaWYodi5pc1BvaW50TGlnaHQpe2NvbnN0IFM9aS5wb2ludFtkXTtTLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbih2Lm1hdHJpeFdvcmxkKSxTLnBvc2l0aW9uLmFwcGx5TWF0cml4NChtKSxkKyt9ZWxzZSBpZih2LmlzSGVtaXNwaGVyZUxpZ2h0KXtjb25zdCBTPWkuaGVtaVtnXTtTLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24odi5tYXRyaXhXb3JsZCksUy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKG0pLGcrK319fXJldHVybntzZXR1cDpsLHNldHVwVmlldzpjLHN0YXRlOml9fWZ1bmN0aW9uIHZwKHIsZSl7Y29uc3QgdD1uZXcgZ1MocixlKSxuPVtdLGk9W107ZnVuY3Rpb24gcygpe24ubGVuZ3RoPTAsaS5sZW5ndGg9MH1mdW5jdGlvbiBhKHUpe24ucHVzaCh1KX1mdW5jdGlvbiBvKHUpe2kucHVzaCh1KX1mdW5jdGlvbiBsKHUpe3Quc2V0dXAobix1KX1mdW5jdGlvbiBjKHUpe3Quc2V0dXBWaWV3KG4sdSl9cmV0dXJue2luaXQ6cyxzdGF0ZTp7bGlnaHRzQXJyYXk6bixzaGFkb3dzQXJyYXk6aSxsaWdodHM6dH0sc2V0dXBMaWdodHM6bCxzZXR1cExpZ2h0c1ZpZXc6YyxwdXNoTGlnaHQ6YSxwdXNoU2hhZG93Om99fWZ1bmN0aW9uIF9TKHIsZSl7bGV0IHQ9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gbihzLGE9MCl7Y29uc3Qgbz10LmdldChzKTtsZXQgbDtyZXR1cm4gbz09PXZvaWQgMD8obD1uZXcgdnAocixlKSx0LnNldChzLFtsXSkpOmE+PW8ubGVuZ3RoPyhsPW5ldyB2cChyLGUpLG8ucHVzaChsKSk6bD1vW2FdLGx9ZnVuY3Rpb24gaSgpe3Q9bmV3IFdlYWtNYXB9cmV0dXJue2dldDpuLGRpc3Bvc2U6aX19Y2xhc3MgTGggZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNNZXNoRGVwdGhNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hEZXB0aE1hdGVyaWFsIix0aGlzLmRlcHRoUGFja2luZz1kZCx0aGlzLm1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuc2V0VmFsdWVzKGUpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5kZXB0aFBhY2tpbmc9ZS5kZXB0aFBhY2tpbmcsdGhpcy5tYXA9ZS5tYXAsdGhpcy5hbHBoYU1hcD1lLmFscGhhTWFwLHRoaXMuZGlzcGxhY2VtZW50TWFwPWUuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9ZS5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9ZS5kaXNwbGFjZW1lbnRCaWFzLHRoaXMud2lyZWZyYW1lPWUud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPWUud2lyZWZyYW1lTGluZXdpZHRoLHRoaXN9fWNsYXNzIEloIGV4dGVuZHMgSHR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJNZXNoRGlzdGFuY2VNYXRlcmlhbCIsdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5zZXRWYWx1ZXMoZSl9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLm1hcD1lLm1hcCx0aGlzLmFscGhhTWFwPWUuYWxwaGFNYXAsdGhpcy5kaXNwbGFjZW1lbnRNYXA9ZS5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1lLmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz1lLmRpc3BsYWNlbWVudEJpYXMsdGhpc319Y29uc3QgeFM9YHZvaWQgbWFpbigpIHsKCWdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24sIDEuMCApOwp9YCx5Uz1gdW5pZm9ybSBzYW1wbGVyMkQgc2hhZG93X3Bhc3M7CnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uOwp1bmlmb3JtIGZsb2F0IHJhZGl1czsKI2luY2x1ZGUgPHBhY2tpbmc+CnZvaWQgbWFpbigpIHsKCWNvbnN0IGZsb2F0IHNhbXBsZXMgPSBmbG9hdCggVlNNX1NBTVBMRVMgKTsKCWZsb2F0IG1lYW4gPSAwLjA7CglmbG9hdCBzcXVhcmVkX21lYW4gPSAwLjA7CglmbG9hdCB1dlN0cmlkZSA9IHNhbXBsZXMgPD0gMS4wID8gMC4wIDogMi4wIC8gKCBzYW1wbGVzIC0gMS4wICk7CglmbG9hdCB1dlN0YXJ0ID0gc2FtcGxlcyA8PSAxLjAgPyAwLjAgOiAtIDEuMDsKCWZvciAoIGZsb2F0IGkgPSAwLjA7IGkgPCBzYW1wbGVzOyBpICsrICkgewoJCWZsb2F0IHV2T2Zmc2V0ID0gdXZTdGFydCArIGkgKiB1dlN0cmlkZTsKCQkjaWZkZWYgSE9SSVpPTlRBTF9QQVNTCgkJCXZlYzIgZGlzdHJpYnV0aW9uID0gdW5wYWNrUkdCQVRvMkhhbGYoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggdXZPZmZzZXQsIDAuMCApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTsKCQkJbWVhbiArPSBkaXN0cmlidXRpb24ueDsKCQkJc3F1YXJlZF9tZWFuICs9IGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54OwoJCSNlbHNlCgkJCWZsb2F0IGRlcHRoID0gdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICsgdmVjMiggMC4wLCB1dk9mZnNldCApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTsKCQkJbWVhbiArPSBkZXB0aDsKCQkJc3F1YXJlZF9tZWFuICs9IGRlcHRoICogZGVwdGg7CgkJI2VuZGlmCgl9CgltZWFuID0gbWVhbiAvIHNhbXBsZXM7CglzcXVhcmVkX21lYW4gPSBzcXVhcmVkX21lYW4gLyBzYW1wbGVzOwoJZmxvYXQgc3RkX2RldiA9IHNxcnQoIHNxdWFyZWRfbWVhbiAtIG1lYW4gKiBtZWFuICk7CglnbF9GcmFnQ29sb3IgPSBwYWNrMkhhbGZUb1JHQkEoIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKSApOwp9YDtmdW5jdGlvbiB2UyhyLGUsdCl7bGV0IG49bmV3IHFzO2NvbnN0IGk9bmV3IHEscz1uZXcgcSxhPW5ldyBsdCxvPW5ldyBMaCh7ZGVwdGhQYWNraW5nOnBkfSksbD1uZXcgSWgsYz17fSxoPXQubWF4VGV4dHVyZVNpemUsdT17W1luXTpZdCxbWXRdOlluLFtHbl06R259LGY9bmV3IEhuKHtkZWZpbmVzOntWU01fU0FNUExFUzo4fSx1bmlmb3Jtczp7c2hhZG93X3Bhc3M6e3ZhbHVlOm51bGx9LHJlc29sdXRpb246e3ZhbHVlOm5ldyBxfSxyYWRpdXM6e3ZhbHVlOjR9fSx2ZXJ0ZXhTaGFkZXI6eFMsZnJhZ21lbnRTaGFkZXI6eVN9KSxkPWYuY2xvbmUoKTtkLmRlZmluZXMuSE9SSVpPTlRBTF9QQVNTPTE7Y29uc3QgcD1uZXcga2U7cC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgS2UobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO2NvbnN0IF89bmV3IEx0KHAsZiksZz10aGlzO3RoaXMuZW5hYmxlZD0hMSx0aGlzLmF1dG9VcGRhdGU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMSx0aGlzLnR5cGU9Q247bGV0IG09dGhpcy50eXBlO3RoaXMucmVuZGVyPWZ1bmN0aW9uKFMsYixBKXtpZihnLmVuYWJsZWQ9PT0hMXx8Zy5hdXRvVXBkYXRlPT09ITEmJmcubmVlZHNVcGRhdGU9PT0hMXx8Uy5sZW5ndGg9PT0wKXJldHVybjtjb25zdCBMPXIuZ2V0UmVuZGVyVGFyZ2V0KCksTT1yLmdldEFjdGl2ZUN1YmVGYWNlKCksdz1yLmdldEFjdGl2ZU1pcG1hcExldmVsKCksUj1yLnN0YXRlO1Iuc2V0QmxlbmRpbmcoWm4pLFIuYnVmZmVycy5jb2xvci5zZXRDbGVhcigxLDEsMSwxKSxSLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCksUi5zZXRTY2lzc29yVGVzdCghMSk7Y29uc3QgTj1tIT09a24mJnRoaXMudHlwZT09PWtuLEI9bT09PWtuJiZ0aGlzLnR5cGUhPT1rbjtmb3IobGV0IEk9MCxVPVMubGVuZ3RoO0k8VTtJKyspe2NvbnN0IHo9U1tJXSxGPXouc2hhZG93O2lmKEY9PT12b2lkIDApe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6Iix6LCJoYXMgbm8gc2hhZG93LiIpO2NvbnRpbnVlfWlmKEYuYXV0b1VwZGF0ZT09PSExJiZGLm5lZWRzVXBkYXRlPT09ITEpY29udGludWU7aS5jb3B5KEYubWFwU2l6ZSk7Y29uc3QgWj1GLmdldEZyYW1lRXh0ZW50cygpO2lmKGkubXVsdGlwbHkoWikscy5jb3B5KEYubWFwU2l6ZSksKGkueD5ofHxpLnk+aCkmJihpLng+aCYmKHMueD1NYXRoLmZsb29yKGgvWi54KSxpLng9cy54KloueCxGLm1hcFNpemUueD1zLngpLGkueT5oJiYocy55PU1hdGguZmxvb3IoaC9aLnkpLGkueT1zLnkqWi55LEYubWFwU2l6ZS55PXMueSkpLEYubWFwPT09bnVsbHx8Tj09PSEwfHxCPT09ITApe2NvbnN0IFE9dGhpcy50eXBlIT09a24/e21pbkZpbHRlcjpidCxtYWdGaWx0ZXI6YnR9Ont9O0YubWFwIT09bnVsbCYmRi5tYXAuZGlzcG9zZSgpLEYubWFwPW5ldyBMbihpLngsaS55LFEpLEYubWFwLnRleHR1cmUubmFtZT16Lm5hbWUrIi5zaGFkb3dNYXAiLEYuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1yLnNldFJlbmRlclRhcmdldChGLm1hcCksci5jbGVhcigpO2NvbnN0IFY9Ri5nZXRWaWV3cG9ydENvdW50KCk7Zm9yKGxldCBRPTA7UTxWO1ErKyl7Y29uc3QgbmU9Ri5nZXRWaWV3cG9ydChRKTthLnNldChzLngqbmUueCxzLnkqbmUueSxzLngqbmUueixzLnkqbmUudyksUi52aWV3cG9ydChhKSxGLnVwZGF0ZU1hdHJpY2VzKHosUSksbj1GLmdldEZydXN0dW0oKSx2KGIsQSxGLmNhbWVyYSx6LHRoaXMudHlwZSl9Ri5pc1BvaW50TGlnaHRTaGFkb3chPT0hMCYmdGhpcy50eXBlPT09a24mJnkoRixBKSxGLm5lZWRzVXBkYXRlPSExfW09dGhpcy50eXBlLGcubmVlZHNVcGRhdGU9ITEsci5zZXRSZW5kZXJUYXJnZXQoTCxNLHcpfTtmdW5jdGlvbiB5KFMsYil7Y29uc3QgQT1lLnVwZGF0ZShfKTtmLmRlZmluZXMuVlNNX1NBTVBMRVMhPT1TLmJsdXJTYW1wbGVzJiYoZi5kZWZpbmVzLlZTTV9TQU1QTEVTPVMuYmx1clNhbXBsZXMsZC5kZWZpbmVzLlZTTV9TQU1QTEVTPVMuYmx1clNhbXBsZXMsZi5uZWVkc1VwZGF0ZT0hMCxkLm5lZWRzVXBkYXRlPSEwKSxTLm1hcFBhc3M9PT1udWxsJiYoUy5tYXBQYXNzPW5ldyBMbihpLngsaS55KSksZi51bmlmb3Jtcy5zaGFkb3dfcGFzcy52YWx1ZT1TLm1hcC50ZXh0dXJlLGYudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT1TLm1hcFNpemUsZi51bmlmb3Jtcy5yYWRpdXMudmFsdWU9Uy5yYWRpdXMsci5zZXRSZW5kZXJUYXJnZXQoUy5tYXBQYXNzKSxyLmNsZWFyKCksci5yZW5kZXJCdWZmZXJEaXJlY3QoYixudWxsLEEsZixfLG51bGwpLGQudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9Uy5tYXBQYXNzLnRleHR1cmUsZC51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPVMubWFwU2l6ZSxkLnVuaWZvcm1zLnJhZGl1cy52YWx1ZT1TLnJhZGl1cyxyLnNldFJlbmRlclRhcmdldChTLm1hcCksci5jbGVhcigpLHIucmVuZGVyQnVmZmVyRGlyZWN0KGIsbnVsbCxBLGQsXyxudWxsKX1mdW5jdGlvbiB4KFMsYixBLEwpe2xldCBNPW51bGw7Y29uc3Qgdz1BLmlzUG9pbnRMaWdodD09PSEwP1MuY3VzdG9tRGlzdGFuY2VNYXRlcmlhbDpTLmN1c3RvbURlcHRoTWF0ZXJpYWw7aWYodyE9PXZvaWQgMClNPXc7ZWxzZSBpZihNPUEuaXNQb2ludExpZ2h0PT09ITA/bDpvLHIubG9jYWxDbGlwcGluZ0VuYWJsZWQmJmIuY2xpcFNoYWRvd3M9PT0hMCYmQXJyYXkuaXNBcnJheShiLmNsaXBwaW5nUGxhbmVzKSYmYi5jbGlwcGluZ1BsYW5lcy5sZW5ndGghPT0wfHxiLmRpc3BsYWNlbWVudE1hcCYmYi5kaXNwbGFjZW1lbnRTY2FsZSE9PTB8fGIuYWxwaGFNYXAmJmIuYWxwaGFUZXN0PjB8fGIubWFwJiZiLmFscGhhVGVzdD4wKXtjb25zdCBSPU0udXVpZCxOPWIudXVpZDtsZXQgQj1jW1JdO0I9PT12b2lkIDAmJihCPXt9LGNbUl09Qik7bGV0IEk9QltOXTtJPT09dm9pZCAwJiYoST1NLmNsb25lKCksQltOXT1JKSxNPUl9aWYoTS52aXNpYmxlPWIudmlzaWJsZSxNLndpcmVmcmFtZT1iLndpcmVmcmFtZSxMPT09a24/TS5zaWRlPWIuc2hhZG93U2lkZSE9PW51bGw/Yi5zaGFkb3dTaWRlOmIuc2lkZTpNLnNpZGU9Yi5zaGFkb3dTaWRlIT09bnVsbD9iLnNoYWRvd1NpZGU6dVtiLnNpZGVdLE0uYWxwaGFNYXA9Yi5hbHBoYU1hcCxNLmFscGhhVGVzdD1iLmFscGhhVGVzdCxNLm1hcD1iLm1hcCxNLmNsaXBTaGFkb3dzPWIuY2xpcFNoYWRvd3MsTS5jbGlwcGluZ1BsYW5lcz1iLmNsaXBwaW5nUGxhbmVzLE0uY2xpcEludGVyc2VjdGlvbj1iLmNsaXBJbnRlcnNlY3Rpb24sTS5kaXNwbGFjZW1lbnRNYXA9Yi5kaXNwbGFjZW1lbnRNYXAsTS5kaXNwbGFjZW1lbnRTY2FsZT1iLmRpc3BsYWNlbWVudFNjYWxlLE0uZGlzcGxhY2VtZW50Qmlhcz1iLmRpc3BsYWNlbWVudEJpYXMsTS53aXJlZnJhbWVMaW5ld2lkdGg9Yi53aXJlZnJhbWVMaW5ld2lkdGgsTS5saW5ld2lkdGg9Yi5saW5ld2lkdGgsQS5pc1BvaW50TGlnaHQ9PT0hMCYmTS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPT09ITApe2NvbnN0IFI9ci5wcm9wZXJ0aWVzLmdldChNKTtSLmxpZ2h0PUF9cmV0dXJuIE19ZnVuY3Rpb24gdihTLGIsQSxMLE0pe2lmKFMudmlzaWJsZT09PSExKXJldHVybjtpZihTLmxheWVycy50ZXN0KGIubGF5ZXJzKSYmKFMuaXNNZXNofHxTLmlzTGluZXx8Uy5pc1BvaW50cykmJihTLmNhc3RTaGFkb3d8fFMucmVjZWl2ZVNoYWRvdyYmTT09PWtuKSYmKCFTLmZydXN0dW1DdWxsZWR8fG4uaW50ZXJzZWN0c09iamVjdChTKSkpe1MubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoQS5tYXRyaXhXb3JsZEludmVyc2UsUy5tYXRyaXhXb3JsZCk7Y29uc3QgTj1lLnVwZGF0ZShTKSxCPVMubWF0ZXJpYWw7aWYoQXJyYXkuaXNBcnJheShCKSl7Y29uc3QgST1OLmdyb3Vwcztmb3IobGV0IFU9MCx6PUkubGVuZ3RoO1U8ejtVKyspe2NvbnN0IEY9SVtVXSxaPUJbRi5tYXRlcmlhbEluZGV4XTtpZihaJiZaLnZpc2libGUpe2NvbnN0IFY9eChTLFosTCxNKTtTLm9uQmVmb3JlU2hhZG93KHIsUyxiLEEsTixWLEYpLHIucmVuZGVyQnVmZmVyRGlyZWN0KEEsbnVsbCxOLFYsUyxGKSxTLm9uQWZ0ZXJTaGFkb3cocixTLGIsQSxOLFYsRil9fX1lbHNlIGlmKEIudmlzaWJsZSl7Y29uc3QgST14KFMsQixMLE0pO1Mub25CZWZvcmVTaGFkb3cocixTLGIsQSxOLEksbnVsbCksci5yZW5kZXJCdWZmZXJEaXJlY3QoQSxudWxsLE4sSSxTLG51bGwpLFMub25BZnRlclNoYWRvdyhyLFMsYixBLE4sSSxudWxsKX19Y29uc3QgUj1TLmNoaWxkcmVuO2ZvcihsZXQgTj0wLEI9Ui5sZW5ndGg7TjxCO04rKyl2KFJbTl0sYixBLEwsTSl9fWZ1bmN0aW9uIE1TKHIsZSx0KXtjb25zdCBuPXQuaXNXZWJHTDI7ZnVuY3Rpb24gaSgpe2xldCBPPSExO2NvbnN0IHZlPW5ldyBsdDtsZXQgaGU9bnVsbDtjb25zdCBqPW5ldyBsdCgwLDAsMCwwKTtyZXR1cm57c2V0TWFzazpmdW5jdGlvbihnZSl7aGUhPT1nZSYmIU8mJihyLmNvbG9yTWFzayhnZSxnZSxnZSxnZSksaGU9Z2UpfSxzZXRMb2NrZWQ6ZnVuY3Rpb24oZ2Upe089Z2V9LHNldENsZWFyOmZ1bmN0aW9uKGdlLHplLGl0LEZ0LG5uKXtubj09PSEwJiYoZ2UqPUZ0LHplKj1GdCxpdCo9RnQpLHZlLnNldChnZSx6ZSxpdCxGdCksai5lcXVhbHModmUpPT09ITEmJihyLmNsZWFyQ29sb3IoZ2UsemUsaXQsRnQpLGouY29weSh2ZSkpfSxyZXNldDpmdW5jdGlvbigpe089ITEsaGU9bnVsbCxqLnNldCgtMSwwLDAsMCl9fX1mdW5jdGlvbiBzKCl7bGV0IE89ITEsdmU9bnVsbCxoZT1udWxsLGo9bnVsbDtyZXR1cm57c2V0VGVzdDpmdW5jdGlvbihnZSl7Z2U/QmUoci5ERVBUSF9URVNUKTp3ZShyLkRFUFRIX1RFU1QpfSxzZXRNYXNrOmZ1bmN0aW9uKGdlKXt2ZSE9PWdlJiYhTyYmKHIuZGVwdGhNYXNrKGdlKSx2ZT1nZSl9LHNldEZ1bmM6ZnVuY3Rpb24oZ2Upe2lmKGhlIT09Z2Upe3N3aXRjaChnZSl7Y2FzZSBHZjpyLmRlcHRoRnVuYyhyLk5FVkVSKTticmVhaztjYXNlIFZmOnIuZGVwdGhGdW5jKHIuQUxXQVlTKTticmVhaztjYXNlIEhmOnIuZGVwdGhGdW5jKHIuTEVTUyk7YnJlYWs7Y2FzZSBNczpyLmRlcHRoRnVuYyhyLkxFUVVBTCk7YnJlYWs7Y2FzZSBXZjpyLmRlcHRoRnVuYyhyLkVRVUFMKTticmVhaztjYXNlIFhmOnIuZGVwdGhGdW5jKHIuR0VRVUFMKTticmVhaztjYXNlIHFmOnIuZGVwdGhGdW5jKHIuR1JFQVRFUik7YnJlYWs7Y2FzZSAkZjpyLmRlcHRoRnVuYyhyLk5PVEVRVUFMKTticmVhaztkZWZhdWx0OnIuZGVwdGhGdW5jKHIuTEVRVUFMKX1oZT1nZX19LHNldExvY2tlZDpmdW5jdGlvbihnZSl7Tz1nZX0sc2V0Q2xlYXI6ZnVuY3Rpb24oZ2Upe2ohPT1nZSYmKHIuY2xlYXJEZXB0aChnZSksaj1nZSl9LHJlc2V0OmZ1bmN0aW9uKCl7Tz0hMSx2ZT1udWxsLGhlPW51bGwsaj1udWxsfX19ZnVuY3Rpb24gYSgpe2xldCBPPSExLHZlPW51bGwsaGU9bnVsbCxqPW51bGwsZ2U9bnVsbCx6ZT1udWxsLGl0PW51bGwsRnQ9bnVsbCxubj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKHV0KXtPfHwodXQ/QmUoci5TVEVOQ0lMX1RFU1QpOndlKHIuU1RFTkNJTF9URVNUKSl9LHNldE1hc2s6ZnVuY3Rpb24odXQpe3ZlIT09dXQmJiFPJiYoci5zdGVuY2lsTWFzayh1dCksdmU9dXQpfSxzZXRGdW5jOmZ1bmN0aW9uKHV0LHJuLCRuKXsoaGUhPT11dHx8aiE9PXJufHxnZSE9PSRuKSYmKHIuc3RlbmNpbEZ1bmModXQscm4sJG4pLGhlPXV0LGo9cm4sZ2U9JG4pfSxzZXRPcDpmdW5jdGlvbih1dCxybiwkbil7KHplIT09dXR8fGl0IT09cm58fEZ0IT09JG4pJiYoci5zdGVuY2lsT3AodXQscm4sJG4pLHplPXV0LGl0PXJuLEZ0PSRuKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKHV0KXtPPXV0fSxzZXRDbGVhcjpmdW5jdGlvbih1dCl7bm4hPT11dCYmKHIuY2xlYXJTdGVuY2lsKHV0KSxubj11dCl9LHJlc2V0OmZ1bmN0aW9uKCl7Tz0hMSx2ZT1udWxsLGhlPW51bGwsaj1udWxsLGdlPW51bGwsemU9bnVsbCxpdD1udWxsLEZ0PW51bGwsbm49bnVsbH19fWNvbnN0IG89bmV3IGksbD1uZXcgcyxjPW5ldyBhLGg9bmV3IFdlYWtNYXAsdT1uZXcgV2Vha01hcDtsZXQgZj17fSxkPXt9LHA9bmV3IFdlYWtNYXAsXz1bXSxnPW51bGwsbT0hMSx5PW51bGwseD1udWxsLHY9bnVsbCxTPW51bGwsYj1udWxsLEE9bnVsbCxMPW51bGwsTT1uZXcgeWUoMCwwLDApLHc9MCxSPSExLE49bnVsbCxCPW51bGwsST1udWxsLFU9bnVsbCx6PW51bGw7Y29uc3QgRj1yLmdldFBhcmFtZXRlcihyLk1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTKTtsZXQgWj0hMSxWPTA7Y29uc3QgUT1yLmdldFBhcmFtZXRlcihyLlZFUlNJT04pO1EuaW5kZXhPZigiV2ViR0wiKSE9PS0xPyhWPXBhcnNlRmxvYXQoL15XZWJHTCAoXGQpLy5leGVjKFEpWzFdKSxaPVY+PTEpOlEuaW5kZXhPZigiT3BlbkdMIEVTIikhPT0tMSYmKFY9cGFyc2VGbG9hdCgvXk9wZW5HTCBFUyAoXGQpLy5leGVjKFEpWzFdKSxaPVY+PTIpO2xldCBuZT1udWxsLGZlPXt9O2NvbnN0ICQ9ci5nZXRQYXJhbWV0ZXIoci5TQ0lTU09SX0JPWCksZWU9ci5nZXRQYXJhbWV0ZXIoci5WSUVXUE9SVCksZGU9bmV3IGx0KCkuZnJvbUFycmF5KCQpLFRlPW5ldyBsdCgpLmZyb21BcnJheShlZSk7ZnVuY3Rpb24gYmUoTyx2ZSxoZSxqKXtjb25zdCBnZT1uZXcgVWludDhBcnJheSg0KSx6ZT1yLmNyZWF0ZVRleHR1cmUoKTtyLmJpbmRUZXh0dXJlKE8semUpLHIudGV4UGFyYW1ldGVyaShPLHIuVEVYVFVSRV9NSU5fRklMVEVSLHIuTkVBUkVTVCksci50ZXhQYXJhbWV0ZXJpKE8sci5URVhUVVJFX01BR19GSUxURVIsci5ORUFSRVNUKTtmb3IobGV0IGl0PTA7aXQ8aGU7aXQrKyluJiYoTz09PXIuVEVYVFVSRV8zRHx8Tz09PXIuVEVYVFVSRV8yRF9BUlJBWSk/ci50ZXhJbWFnZTNEKHZlLDAsci5SR0JBLDEsMSxqLDAsci5SR0JBLHIuVU5TSUdORURfQllURSxnZSk6ci50ZXhJbWFnZTJEKHZlK2l0LDAsci5SR0JBLDEsMSwwLHIuUkdCQSxyLlVOU0lHTkVEX0JZVEUsZ2UpO3JldHVybiB6ZX1jb25zdCBPZT17fTtPZVtyLlRFWFRVUkVfMkRdPWJlKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfMkQsMSksT2Vbci5URVhUVVJFX0NVQkVfTUFQXT1iZShyLlRFWFRVUkVfQ1VCRV9NQVAsci5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gsNiksbiYmKE9lW3IuVEVYVFVSRV8yRF9BUlJBWV09YmUoci5URVhUVVJFXzJEX0FSUkFZLHIuVEVYVFVSRV8yRF9BUlJBWSwxLDEpLE9lW3IuVEVYVFVSRV8zRF09YmUoci5URVhUVVJFXzNELHIuVEVYVFVSRV8zRCwxLDEpKSxvLnNldENsZWFyKDAsMCwwLDEpLGwuc2V0Q2xlYXIoMSksYy5zZXRDbGVhcigwKSxCZShyLkRFUFRIX1RFU1QpLGwuc2V0RnVuYyhNcyksVyghMSksSihNciksQmUoci5DVUxMX0ZBQ0UpLHJlKFpuKTtmdW5jdGlvbiBCZShPKXtmW09dIT09ITAmJihyLmVuYWJsZShPKSxmW09dPSEwKX1mdW5jdGlvbiB3ZShPKXtmW09dIT09ITEmJihyLmRpc2FibGUoTyksZltPXT0hMSl9ZnVuY3Rpb24gUGUoTyx2ZSl7cmV0dXJuIGRbT10hPT12ZT8oci5iaW5kRnJhbWVidWZmZXIoTyx2ZSksZFtPXT12ZSxuJiYoTz09PXIuRFJBV19GUkFNRUJVRkZFUiYmKGRbci5GUkFNRUJVRkZFUl09dmUpLE89PT1yLkZSQU1FQlVGRkVSJiYoZFtyLkRSQVdfRlJBTUVCVUZGRVJdPXZlKSksITApOiExfWZ1bmN0aW9uIEQoTyx2ZSl7bGV0IGhlPV8saj0hMTtpZihPKWlmKGhlPXAuZ2V0KHZlKSxoZT09PXZvaWQgMCYmKGhlPVtdLHAuc2V0KHZlLGhlKSksTy5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzKXtjb25zdCBnZT1PLnRleHR1cmU7aWYoaGUubGVuZ3RoIT09Z2UubGVuZ3RofHxoZVswXSE9PXIuQ09MT1JfQVRUQUNITUVOVDApe2ZvcihsZXQgemU9MCxpdD1nZS5sZW5ndGg7emU8aXQ7emUrKyloZVt6ZV09ci5DT0xPUl9BVFRBQ0hNRU5UMCt6ZTtoZS5sZW5ndGg9Z2UubGVuZ3RoLGo9ITB9fWVsc2UgaGVbMF0hPT1yLkNPTE9SX0FUVEFDSE1FTlQwJiYoaGVbMF09ci5DT0xPUl9BVFRBQ0hNRU5UMCxqPSEwKTtlbHNlIGhlWzBdIT09ci5CQUNLJiYoaGVbMF09ci5CQUNLLGo9ITApO2omJih0LmlzV2ViR0wyP3IuZHJhd0J1ZmZlcnMoaGUpOmUuZ2V0KCJXRUJHTF9kcmF3X2J1ZmZlcnMiKS5kcmF3QnVmZmVyc1dFQkdMKGhlKSl9ZnVuY3Rpb24gbGUoTyl7cmV0dXJuIGchPT1PPyhyLnVzZVByb2dyYW0oTyksZz1PLCEwKTohMX1jb25zdCBLPXtbeGldOnIuRlVOQ19BREQsW0FmXTpyLkZVTkNfU1VCVFJBQ1QsW1RmXTpyLkZVTkNfUkVWRVJTRV9TVUJUUkFDVH07aWYobilLW2ZjXT1yLk1JTixLW2RjXT1yLk1BWDtlbHNle2NvbnN0IE89ZS5nZXQoIkVYVF9ibGVuZF9taW5tYXgiKTtPIT09bnVsbCYmKEtbZmNdPU8uTUlOX0VYVCxLW2RjXT1PLk1BWF9FWFQpfWNvbnN0IHVlPXtbQ2ZdOnIuWkVSTyxbUmZdOnIuT05FLFtQZl06ci5TUkNfQ09MT1IsW0RhXTpyLlNSQ19BTFBIQSxbRmZdOnIuU1JDX0FMUEhBX1NBVFVSQVRFLFtEZl06ci5EU1RfQ09MT1IsW0lmXTpyLkRTVF9BTFBIQSxbTGZdOnIuT05FX01JTlVTX1NSQ19DT0xPUixbTmFdOnIuT05FX01JTlVTX1NSQ19BTFBIQSxbTmZdOnIuT05FX01JTlVTX0RTVF9DT0xPUixbVWZdOnIuT05FX01JTlVTX0RTVF9BTFBIQSxbT2ZdOnIuQ09OU1RBTlRfQ09MT1IsW0JmXTpyLk9ORV9NSU5VU19DT05TVEFOVF9DT0xPUixbemZdOnIuQ09OU1RBTlRfQUxQSEEsW2tmXTpyLk9ORV9NSU5VU19DT05TVEFOVF9BTFBIQX07ZnVuY3Rpb24gcmUoTyx2ZSxoZSxqLGdlLHplLGl0LEZ0LG5uLHV0KXtpZihPPT09Wm4pe209PT0hMCYmKHdlKHIuQkxFTkQpLG09ITEpO3JldHVybn1pZihtPT09ITEmJihCZShyLkJMRU5EKSxtPSEwKSxPIT09RWYpe2lmKE8hPT15fHx1dCE9PVIpe2lmKCh4IT09eGl8fGIhPT14aSkmJihyLmJsZW5kRXF1YXRpb24oci5GVU5DX0FERCkseD14aSxiPXhpKSx1dClzd2l0Y2goTyl7Y2FzZSBCaTpyLmJsZW5kRnVuY1NlcGFyYXRlKHIuT05FLHIuT05FX01JTlVTX1NSQ19BTFBIQSxyLk9ORSxyLk9ORV9NSU5VU19TUkNfQUxQSEEpO2JyZWFrO2Nhc2UgY2M6ci5ibGVuZEZ1bmMoci5PTkUsci5PTkUpO2JyZWFrO2Nhc2UgaGM6ci5ibGVuZEZ1bmNTZXBhcmF0ZShyLlpFUk8sci5PTkVfTUlOVVNfU1JDX0NPTE9SLHIuWkVSTyxyLk9ORSk7YnJlYWs7Y2FzZSB1YzpyLmJsZW5kRnVuY1NlcGFyYXRlKHIuWkVSTyxyLlNSQ19DT0xPUixyLlpFUk8sci5TUkNfQUxQSEEpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZTogSW52YWxpZCBibGVuZGluZzogIixPKTticmVha31lbHNlIHN3aXRjaChPKXtjYXNlIEJpOnIuYmxlbmRGdW5jU2VwYXJhdGUoci5TUkNfQUxQSEEsci5PTkVfTUlOVVNfU1JDX0FMUEhBLHIuT05FLHIuT05FX01JTlVTX1NSQ19BTFBIQSk7YnJlYWs7Y2FzZSBjYzpyLmJsZW5kRnVuYyhyLlNSQ19BTFBIQSxyLk9ORSk7YnJlYWs7Y2FzZSBoYzpyLmJsZW5kRnVuY1NlcGFyYXRlKHIuWkVSTyxyLk9ORV9NSU5VU19TUkNfQ09MT1Isci5aRVJPLHIuT05FKTticmVhaztjYXNlIHVjOnIuYmxlbmRGdW5jKHIuWkVSTyxyLlNSQ19DT0xPUik7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLE8pO2JyZWFrfXY9bnVsbCxTPW51bGwsQT1udWxsLEw9bnVsbCxNLnNldCgwLDAsMCksdz0wLHk9TyxSPXV0fXJldHVybn1nZT1nZXx8dmUsemU9emV8fGhlLGl0PWl0fHxqLCh2ZSE9PXh8fGdlIT09YikmJihyLmJsZW5kRXF1YXRpb25TZXBhcmF0ZShLW3ZlXSxLW2dlXSkseD12ZSxiPWdlKSwoaGUhPT12fHxqIT09U3x8emUhPT1BfHxpdCE9PUwpJiYoci5ibGVuZEZ1bmNTZXBhcmF0ZSh1ZVtoZV0sdWVbal0sdWVbemVdLHVlW2l0XSksdj1oZSxTPWosQT16ZSxMPWl0KSwoRnQuZXF1YWxzKE0pPT09ITF8fG5uIT09dykmJihyLmJsZW5kQ29sb3IoRnQucixGdC5nLEZ0LmIsbm4pLE0uY29weShGdCksdz1ubikseT1PLFI9ITF9ZnVuY3Rpb24gQ2UoTyx2ZSl7Ty5zaWRlPT09R24/d2Uoci5DVUxMX0ZBQ0UpOkJlKHIuQ1VMTF9GQUNFKTtsZXQgaGU9Ty5zaWRlPT09WXQ7dmUmJihoZT0haGUpLFcoaGUpLE8uYmxlbmRpbmc9PT1CaSYmTy50cmFuc3BhcmVudD09PSExP3JlKFpuKTpyZShPLmJsZW5kaW5nLE8uYmxlbmRFcXVhdGlvbixPLmJsZW5kU3JjLE8uYmxlbmREc3QsTy5ibGVuZEVxdWF0aW9uQWxwaGEsTy5ibGVuZFNyY0FscGhhLE8uYmxlbmREc3RBbHBoYSxPLmJsZW5kQ29sb3IsTy5ibGVuZEFscGhhLE8ucHJlbXVsdGlwbGllZEFscGhhKSxsLnNldEZ1bmMoTy5kZXB0aEZ1bmMpLGwuc2V0VGVzdChPLmRlcHRoVGVzdCksbC5zZXRNYXNrKE8uZGVwdGhXcml0ZSksby5zZXRNYXNrKE8uY29sb3JXcml0ZSk7Y29uc3Qgaj1PLnN0ZW5jaWxXcml0ZTtjLnNldFRlc3QoaiksaiYmKGMuc2V0TWFzayhPLnN0ZW5jaWxXcml0ZU1hc2spLGMuc2V0RnVuYyhPLnN0ZW5jaWxGdW5jLE8uc3RlbmNpbFJlZixPLnN0ZW5jaWxGdW5jTWFzayksYy5zZXRPcChPLnN0ZW5jaWxGYWlsLE8uc3RlbmNpbFpGYWlsLE8uc3RlbmNpbFpQYXNzKSksbWUoTy5wb2x5Z29uT2Zmc2V0LE8ucG9seWdvbk9mZnNldEZhY3RvcixPLnBvbHlnb25PZmZzZXRVbml0cyksTy5hbHBoYVRvQ292ZXJhZ2U9PT0hMD9CZShyLlNBTVBMRV9BTFBIQV9UT19DT1ZFUkFHRSk6d2Uoci5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpfWZ1bmN0aW9uIFcoTyl7TiE9PU8mJihPP3IuZnJvbnRGYWNlKHIuQ1cpOnIuZnJvbnRGYWNlKHIuQ0NXKSxOPU8pfWZ1bmN0aW9uIEooTyl7TyE9PXNuPyhCZShyLkNVTExfRkFDRSksTyE9PUImJihPPT09TXI/ci5jdWxsRmFjZShyLkJBQ0spOk89PT1VYT9yLmN1bGxGYWNlKHIuRlJPTlQpOnIuY3VsbEZhY2Uoci5GUk9OVF9BTkRfQkFDSykpKTp3ZShyLkNVTExfRkFDRSksQj1PfWZ1bmN0aW9uIGllKE8pe08hPT1JJiYoWiYmci5saW5lV2lkdGgoTyksST1PKX1mdW5jdGlvbiBtZShPLHZlLGhlKXtPPyhCZShyLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLChVIT09dmV8fHohPT1oZSkmJihyLnBvbHlnb25PZmZzZXQodmUsaGUpLFU9dmUsej1oZSkpOndlKHIuUE9MWUdPTl9PRkZTRVRfRklMTCl9ZnVuY3Rpb24gcGUoTyl7Tz9CZShyLlNDSVNTT1JfVEVTVCk6d2Uoci5TQ0lTU09SX1RFU1QpfWZ1bmN0aW9uIEMoTyl7Tz09PXZvaWQgMCYmKE89ci5URVhUVVJFMCtGLTEpLG5lIT09TyYmKHIuYWN0aXZlVGV4dHVyZShPKSxuZT1PKX1mdW5jdGlvbiBFKE8sdmUsaGUpe2hlPT09dm9pZCAwJiYobmU9PT1udWxsP2hlPXIuVEVYVFVSRTArRi0xOmhlPW5lKTtsZXQgaj1mZVtoZV07aj09PXZvaWQgMCYmKGo9e3R5cGU6dm9pZCAwLHRleHR1cmU6dm9pZCAwfSxmZVtoZV09aiksKGoudHlwZSE9PU98fGoudGV4dHVyZSE9PXZlKSYmKG5lIT09aGUmJihyLmFjdGl2ZVRleHR1cmUoaGUpLG5lPWhlKSxyLmJpbmRUZXh0dXJlKE8sdmV8fE9lW09dKSxqLnR5cGU9TyxqLnRleHR1cmU9dmUpfWZ1bmN0aW9uIGsoKXtjb25zdCBPPWZlW25lXTtPIT09dm9pZCAwJiZPLnR5cGUhPT12b2lkIDAmJihyLmJpbmRUZXh0dXJlKE8udHlwZSxudWxsKSxPLnR5cGU9dm9pZCAwLE8udGV4dHVyZT12b2lkIDApfWZ1bmN0aW9uIHNlKCl7dHJ5e3IuY29tcHJlc3NlZFRleEltYWdlMkQuYXBwbHkocixhcmd1bWVudHMpfWNhdGNoKE8pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixPKX19ZnVuY3Rpb24gdGUoKXt0cnl7ci5jb21wcmVzc2VkVGV4SW1hZ2UzRC5hcHBseShyLGFyZ3VtZW50cyl9Y2F0Y2goTyl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLE8pfX1mdW5jdGlvbiBhZSgpe3RyeXtyLnRleFN1YkltYWdlMkQuYXBwbHkocixhcmd1bWVudHMpfWNhdGNoKE8pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixPKX19ZnVuY3Rpb24gQWUoKXt0cnl7ci50ZXhTdWJJbWFnZTNELmFwcGx5KHIsYXJndW1lbnRzKX1jYXRjaChPKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsTyl9fWZ1bmN0aW9uIG9lKCl7dHJ5e3IuY29tcHJlc3NlZFRleFN1YkltYWdlMkQuYXBwbHkocixhcmd1bWVudHMpfWNhdGNoKE8pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixPKX19ZnVuY3Rpb24geGUoKXt0cnl7ci5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRC5hcHBseShyLGFyZ3VtZW50cyl9Y2F0Y2goTyl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLE8pfX1mdW5jdGlvbiBEZSgpe3RyeXtyLnRleFN0b3JhZ2UyRC5hcHBseShyLGFyZ3VtZW50cyl9Y2F0Y2goTyl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLE8pfX1mdW5jdGlvbiB0dCgpe3RyeXtyLnRleFN0b3JhZ2UzRC5hcHBseShyLGFyZ3VtZW50cyl9Y2F0Y2goTyl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLE8pfX1mdW5jdGlvbiBjZSgpe3RyeXtyLnRleEltYWdlMkQuYXBwbHkocixhcmd1bWVudHMpfWNhdGNoKE8pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IixPKX19ZnVuY3Rpb24gYXQoKXt0cnl7ci50ZXhJbWFnZTNELmFwcGx5KHIsYXJndW1lbnRzKX1jYXRjaChPKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsTyl9fWZ1bmN0aW9uIFZlKE8pe2RlLmVxdWFscyhPKT09PSExJiYoci5zY2lzc29yKE8ueCxPLnksTy56LE8udyksZGUuY29weShPKSl9ZnVuY3Rpb24gTmUoTyl7VGUuZXF1YWxzKE8pPT09ITEmJihyLnZpZXdwb3J0KE8ueCxPLnksTy56LE8udyksVGUuY29weShPKSl9ZnVuY3Rpb24gTGUoTyx2ZSl7bGV0IGhlPXUuZ2V0KHZlKTtoZT09PXZvaWQgMCYmKGhlPW5ldyBXZWFrTWFwLHUuc2V0KHZlLGhlKSk7bGV0IGo9aGUuZ2V0KE8pO2o9PT12b2lkIDAmJihqPXIuZ2V0VW5pZm9ybUJsb2NrSW5kZXgodmUsTy5uYW1lKSxoZS5zZXQoTyxqKSl9ZnVuY3Rpb24gRWUoTyx2ZSl7Y29uc3Qgaj11LmdldCh2ZSkuZ2V0KE8pO2guZ2V0KHZlKSE9PWomJihyLnVuaWZvcm1CbG9ja0JpbmRpbmcodmUsaixPLl9fYmluZGluZ1BvaW50SW5kZXgpLGguc2V0KHZlLGopKX1mdW5jdGlvbiBqZSgpe3IuZGlzYWJsZShyLkJMRU5EKSxyLmRpc2FibGUoci5DVUxMX0ZBQ0UpLHIuZGlzYWJsZShyLkRFUFRIX1RFU1QpLHIuZGlzYWJsZShyLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLHIuZGlzYWJsZShyLlNDSVNTT1JfVEVTVCksci5kaXNhYmxlKHIuU1RFTkNJTF9URVNUKSxyLmRpc2FibGUoci5TQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UpLHIuYmxlbmRFcXVhdGlvbihyLkZVTkNfQUREKSxyLmJsZW5kRnVuYyhyLk9ORSxyLlpFUk8pLHIuYmxlbmRGdW5jU2VwYXJhdGUoci5PTkUsci5aRVJPLHIuT05FLHIuWkVSTyksci5ibGVuZENvbG9yKDAsMCwwLDApLHIuY29sb3JNYXNrKCEwLCEwLCEwLCEwKSxyLmNsZWFyQ29sb3IoMCwwLDAsMCksci5kZXB0aE1hc2soITApLHIuZGVwdGhGdW5jKHIuTEVTUyksci5jbGVhckRlcHRoKDEpLHIuc3RlbmNpbE1hc2soNDI5NDk2NzI5NSksci5zdGVuY2lsRnVuYyhyLkFMV0FZUywwLDQyOTQ5NjcyOTUpLHIuc3RlbmNpbE9wKHIuS0VFUCxyLktFRVAsci5LRUVQKSxyLmNsZWFyU3RlbmNpbCgwKSxyLmN1bGxGYWNlKHIuQkFDSyksci5mcm9udEZhY2Uoci5DQ1cpLHIucG9seWdvbk9mZnNldCgwLDApLHIuYWN0aXZlVGV4dHVyZShyLlRFWFRVUkUwKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLG51bGwpLG49PT0hMCYmKHIuYmluZEZyYW1lYnVmZmVyKHIuRFJBV19GUkFNRUJVRkZFUixudWxsKSxyLmJpbmRGcmFtZWJ1ZmZlcihyLlJFQURfRlJBTUVCVUZGRVIsbnVsbCkpLHIudXNlUHJvZ3JhbShudWxsKSxyLmxpbmVXaWR0aCgxKSxyLnNjaXNzb3IoMCwwLHIuY2FudmFzLndpZHRoLHIuY2FudmFzLmhlaWdodCksci52aWV3cG9ydCgwLDAsci5jYW52YXMud2lkdGgsci5jYW52YXMuaGVpZ2h0KSxmPXt9LG5lPW51bGwsZmU9e30sZD17fSxwPW5ldyBXZWFrTWFwLF89W10sZz1udWxsLG09ITEseT1udWxsLHg9bnVsbCx2PW51bGwsUz1udWxsLGI9bnVsbCxBPW51bGwsTD1udWxsLE09bmV3IHllKDAsMCwwKSx3PTAsUj0hMSxOPW51bGwsQj1udWxsLEk9bnVsbCxVPW51bGwsej1udWxsLGRlLnNldCgwLDAsci5jYW52YXMud2lkdGgsci5jYW52YXMuaGVpZ2h0KSxUZS5zZXQoMCwwLHIuY2FudmFzLndpZHRoLHIuY2FudmFzLmhlaWdodCksby5yZXNldCgpLGwucmVzZXQoKSxjLnJlc2V0KCl9cmV0dXJue2J1ZmZlcnM6e2NvbG9yOm8sZGVwdGg6bCxzdGVuY2lsOmN9LGVuYWJsZTpCZSxkaXNhYmxlOndlLGJpbmRGcmFtZWJ1ZmZlcjpQZSxkcmF3QnVmZmVyczpELHVzZVByb2dyYW06bGUsc2V0QmxlbmRpbmc6cmUsc2V0TWF0ZXJpYWw6Q2Usc2V0RmxpcFNpZGVkOlcsc2V0Q3VsbEZhY2U6SixzZXRMaW5lV2lkdGg6aWUsc2V0UG9seWdvbk9mZnNldDptZSxzZXRTY2lzc29yVGVzdDpwZSxhY3RpdmVUZXh0dXJlOkMsYmluZFRleHR1cmU6RSx1bmJpbmRUZXh0dXJlOmssY29tcHJlc3NlZFRleEltYWdlMkQ6c2UsY29tcHJlc3NlZFRleEltYWdlM0Q6dGUsdGV4SW1hZ2UyRDpjZSx0ZXhJbWFnZTNEOmF0LHVwZGF0ZVVCT01hcHBpbmc6TGUsdW5pZm9ybUJsb2NrQmluZGluZzpFZSx0ZXhTdG9yYWdlMkQ6RGUsdGV4U3RvcmFnZTNEOnR0LHRleFN1YkltYWdlMkQ6YWUsdGV4U3ViSW1hZ2UzRDpBZSxjb21wcmVzc2VkVGV4U3ViSW1hZ2UyRDpvZSxjb21wcmVzc2VkVGV4U3ViSW1hZ2UzRDp4ZSxzY2lzc29yOlZlLHZpZXdwb3J0Ok5lLHJlc2V0OmplfX1mdW5jdGlvbiBTUyhyLGUsdCxuLGkscyxhKXtjb25zdCBvPWkuaXNXZWJHTDIsbD1pLm1heFRleHR1cmVzLGM9aS5tYXhDdWJlbWFwU2l6ZSxoPWkubWF4VGV4dHVyZVNpemUsdT1pLm1heFNhbXBsZXMsZj1lLmhhcygiV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIik/ZS5nZXQoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpOm51bGwsZD10eXBlb2YgbmF2aWdhdG9yPT0idW5kZWZpbmVkIj8hMTovT2N1bHVzQnJvd3Nlci9nLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkscD1uZXcgV2Vha01hcDtsZXQgXztjb25zdCBnPW5ldyBXZWFrTWFwO2xldCBtPSExO3RyeXttPXR5cGVvZiBPZmZzY3JlZW5DYW52YXMhPSJ1bmRlZmluZWQiJiZuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsMSkuZ2V0Q29udGV4dCgiMmQiKSE9PW51bGx9Y2F0Y2goQyl7fWZ1bmN0aW9uIHkoQyxFKXtyZXR1cm4gbT9uZXcgT2Zmc2NyZWVuQ2FudmFzKEMsRSk6T3MoImNhbnZhcyIpfWZ1bmN0aW9uIHgoQyxFLGssc2Upe2xldCB0ZT0xO2lmKChDLndpZHRoPnNlfHxDLmhlaWdodD5zZSkmJih0ZT1zZS9NYXRoLm1heChDLndpZHRoLEMuaGVpZ2h0KSksdGU8MXx8RT09PSEwKWlmKHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50IT0idW5kZWZpbmVkIiYmQyBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCE9InVuZGVmaW5lZCImJkMgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8dHlwZW9mIEltYWdlQml0bWFwIT0idW5kZWZpbmVkIiYmQyBpbnN0YW5jZW9mIEltYWdlQml0bWFwKXtjb25zdCBhZT1FP1lhOk1hdGguZmxvb3IsQWU9YWUodGUqQy53aWR0aCksb2U9YWUodGUqQy5oZWlnaHQpO189PT12b2lkIDAmJihfPXkoQWUsb2UpKTtjb25zdCB4ZT1rP3koQWUsb2UpOl87cmV0dXJuIHhlLndpZHRoPUFlLHhlLmhlaWdodD1vZSx4ZS5nZXRDb250ZXh0KCIyZCIpLmRyYXdJbWFnZShDLDAsMCxBZSxvZSksY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoIitDLndpZHRoKyJ4IitDLmhlaWdodCsiKSB0byAoIitBZSsieCIrb2UrIikuIikseGV9ZWxzZSByZXR1cm4iZGF0YSJpbiBDJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEltYWdlIGluIERhdGFUZXh0dXJlIGlzIHRvbyBiaWcgKCIrQy53aWR0aCsieCIrQy5oZWlnaHQrIikuIiksQztyZXR1cm4gQ31mdW5jdGlvbiB2KEMpe3JldHVybiBlaChDLndpZHRoKSYmZWgoQy5oZWlnaHQpfWZ1bmN0aW9uIFMoQyl7cmV0dXJuIG8/ITE6Qy53cmFwUyE9PXp0fHxDLndyYXBUIT09enR8fEMubWluRmlsdGVyIT09YnQmJkMubWluRmlsdGVyIT09d3R9ZnVuY3Rpb24gYihDLEUpe3JldHVybiBDLmdlbmVyYXRlTWlwbWFwcyYmRSYmQy5taW5GaWx0ZXIhPT1idCYmQy5taW5GaWx0ZXIhPT13dH1mdW5jdGlvbiBBKEMpe3IuZ2VuZXJhdGVNaXBtYXAoQyl9ZnVuY3Rpb24gTChDLEUsayxzZSx0ZT0hMSl7aWYobz09PSExKXJldHVybiBFO2lmKEMhPT1udWxsKXtpZihyW0NdIT09dm9pZCAwKXJldHVybiByW0NdO2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byB1c2Ugbm9uLWV4aXN0aW5nIFdlYkdMIGludGVybmFsIGZvcm1hdCAnIitDKyInIil9bGV0IGFlPUU7aWYoRT09PXIuUkVEJiYoaz09PXIuRkxPQVQmJihhZT1yLlIzMkYpLGs9PT1yLkhBTEZfRkxPQVQmJihhZT1yLlIxNkYpLGs9PT1yLlVOU0lHTkVEX0JZVEUmJihhZT1yLlI4KSksRT09PXIuUkVEX0lOVEVHRVImJihrPT09ci5VTlNJR05FRF9CWVRFJiYoYWU9ci5SOFVJKSxrPT09ci5VTlNJR05FRF9TSE9SVCYmKGFlPXIuUjE2VUkpLGs9PT1yLlVOU0lHTkVEX0lOVCYmKGFlPXIuUjMyVUkpLGs9PT1yLkJZVEUmJihhZT1yLlI4SSksaz09PXIuU0hPUlQmJihhZT1yLlIxNkkpLGs9PT1yLklOVCYmKGFlPXIuUjMySSkpLEU9PT1yLlJHJiYoaz09PXIuRkxPQVQmJihhZT1yLlJHMzJGKSxrPT09ci5IQUxGX0ZMT0FUJiYoYWU9ci5SRzE2Riksaz09PXIuVU5TSUdORURfQllURSYmKGFlPXIuUkc4KSksRT09PXIuUkdCQSl7Y29uc3QgQWU9dGU/SXM6b3QuZ2V0VHJhbnNmZXIoc2UpO2s9PT1yLkZMT0FUJiYoYWU9ci5SR0JBMzJGKSxrPT09ci5IQUxGX0ZMT0FUJiYoYWU9ci5SR0JBMTZGKSxrPT09ci5VTlNJR05FRF9CWVRFJiYoYWU9QWU9PT1jdD9yLlNSR0I4X0FMUEhBODpyLlJHQkE4KSxrPT09ci5VTlNJR05FRF9TSE9SVF80XzRfNF80JiYoYWU9ci5SR0JBNCksaz09PXIuVU5TSUdORURfU0hPUlRfNV81XzVfMSYmKGFlPXIuUkdCNV9BMSl9cmV0dXJuKGFlPT09ci5SMTZGfHxhZT09PXIuUjMyRnx8YWU9PT1yLlJHMTZGfHxhZT09PXIuUkczMkZ8fGFlPT09ci5SR0JBMTZGfHxhZT09PXIuUkdCQTMyRikmJmUuZ2V0KCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0IiksYWV9ZnVuY3Rpb24gTShDLEUsayl7cmV0dXJuIGIoQyxrKT09PSEwfHxDLmlzRnJhbWVidWZmZXJUZXh0dXJlJiZDLm1pbkZpbHRlciE9PWJ0JiZDLm1pbkZpbHRlciE9PXd0P01hdGgubG9nMihNYXRoLm1heChFLndpZHRoLEUuaGVpZ2h0KSkrMTpDLm1pcG1hcHMhPT12b2lkIDAmJkMubWlwbWFwcy5sZW5ndGg+MD9DLm1pcG1hcHMubGVuZ3RoOkMuaXNDb21wcmVzc2VkVGV4dHVyZSYmQXJyYXkuaXNBcnJheShDLmltYWdlKT9FLm1pcG1hcHMubGVuZ3RoOjF9ZnVuY3Rpb24gdyhDKXtyZXR1cm4gQz09PWJ0fHxDPT09T2F8fEM9PT1Ucz9yLk5FQVJFU1Q6ci5MSU5FQVJ9ZnVuY3Rpb24gUihDKXtjb25zdCBFPUMudGFyZ2V0O0UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsUiksQihFKSxFLmlzVmlkZW9UZXh0dXJlJiZwLmRlbGV0ZShFKX1mdW5jdGlvbiBOKEMpe2NvbnN0IEU9Qy50YXJnZXQ7RS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixOKSxVKEUpfWZ1bmN0aW9uIEIoQyl7Y29uc3QgRT1uLmdldChDKTtpZihFLl9fd2ViZ2xJbml0PT09dm9pZCAwKXJldHVybjtjb25zdCBrPUMuc291cmNlLHNlPWcuZ2V0KGspO2lmKHNlKXtjb25zdCB0ZT1zZVtFLl9fY2FjaGVLZXldO3RlLnVzZWRUaW1lcy0tLHRlLnVzZWRUaW1lcz09PTAmJkkoQyksT2JqZWN0LmtleXMoc2UpLmxlbmd0aD09PTAmJmcuZGVsZXRlKGspfW4ucmVtb3ZlKEMpfWZ1bmN0aW9uIEkoQyl7Y29uc3QgRT1uLmdldChDKTtyLmRlbGV0ZVRleHR1cmUoRS5fX3dlYmdsVGV4dHVyZSk7Y29uc3Qgaz1DLnNvdXJjZSxzZT1nLmdldChrKTtkZWxldGUgc2VbRS5fX2NhY2hlS2V5XSxhLm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIFUoQyl7Y29uc3QgRT1DLnRleHR1cmUsaz1uLmdldChDKSxzZT1uLmdldChFKTtpZihzZS5fX3dlYmdsVGV4dHVyZSE9PXZvaWQgMCYmKHIuZGVsZXRlVGV4dHVyZShzZS5fX3dlYmdsVGV4dHVyZSksYS5tZW1vcnkudGV4dHVyZXMtLSksQy5kZXB0aFRleHR1cmUmJkMuZGVwdGhUZXh0dXJlLmRpc3Bvc2UoKSxDLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KWZvcihsZXQgdGU9MDt0ZTw2O3RlKyspe2lmKEFycmF5LmlzQXJyYXkoay5fX3dlYmdsRnJhbWVidWZmZXJbdGVdKSlmb3IobGV0IGFlPTA7YWU8ay5fX3dlYmdsRnJhbWVidWZmZXJbdGVdLmxlbmd0aDthZSsrKXIuZGVsZXRlRnJhbWVidWZmZXIoay5fX3dlYmdsRnJhbWVidWZmZXJbdGVdW2FlXSk7ZWxzZSByLmRlbGV0ZUZyYW1lYnVmZmVyKGsuX193ZWJnbEZyYW1lYnVmZmVyW3RlXSk7ay5fX3dlYmdsRGVwdGhidWZmZXImJnIuZGVsZXRlUmVuZGVyYnVmZmVyKGsuX193ZWJnbERlcHRoYnVmZmVyW3RlXSl9ZWxzZXtpZihBcnJheS5pc0FycmF5KGsuX193ZWJnbEZyYW1lYnVmZmVyKSlmb3IobGV0IHRlPTA7dGU8ay5fX3dlYmdsRnJhbWVidWZmZXIubGVuZ3RoO3RlKyspci5kZWxldGVGcmFtZWJ1ZmZlcihrLl9fd2ViZ2xGcmFtZWJ1ZmZlclt0ZV0pO2Vsc2Ugci5kZWxldGVGcmFtZWJ1ZmZlcihrLl9fd2ViZ2xGcmFtZWJ1ZmZlcik7aWYoay5fX3dlYmdsRGVwdGhidWZmZXImJnIuZGVsZXRlUmVuZGVyYnVmZmVyKGsuX193ZWJnbERlcHRoYnVmZmVyKSxrLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciYmci5kZWxldGVGcmFtZWJ1ZmZlcihrLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksay5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpZm9yKGxldCB0ZT0wO3RlPGsuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyLmxlbmd0aDt0ZSsrKWsuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW3RlXSYmci5kZWxldGVSZW5kZXJidWZmZXIoay5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbdGVdKTtrLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlciYmci5kZWxldGVSZW5kZXJidWZmZXIoay5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIpfWlmKEMuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cylmb3IobGV0IHRlPTAsYWU9RS5sZW5ndGg7dGU8YWU7dGUrKyl7Y29uc3QgQWU9bi5nZXQoRVt0ZV0pO0FlLl9fd2ViZ2xUZXh0dXJlJiYoci5kZWxldGVUZXh0dXJlKEFlLl9fd2ViZ2xUZXh0dXJlKSxhLm1lbW9yeS50ZXh0dXJlcy0tKSxuLnJlbW92ZShFW3RlXSl9bi5yZW1vdmUoRSksbi5yZW1vdmUoQyl9bGV0IHo9MDtmdW5jdGlvbiBGKCl7ej0wfWZ1bmN0aW9uIFooKXtjb25zdCBDPXo7cmV0dXJuIEM+PWwmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK0MrIiB0ZXh0dXJlIHVuaXRzIHdoaWxlIHRoaXMgR1BVIHN1cHBvcnRzIG9ubHkgIitsKSx6Kz0xLEN9ZnVuY3Rpb24gVihDKXtjb25zdCBFPVtdO3JldHVybiBFLnB1c2goQy53cmFwUyksRS5wdXNoKEMud3JhcFQpLEUucHVzaChDLndyYXBSfHwwKSxFLnB1c2goQy5tYWdGaWx0ZXIpLEUucHVzaChDLm1pbkZpbHRlciksRS5wdXNoKEMuYW5pc290cm9weSksRS5wdXNoKEMuaW50ZXJuYWxGb3JtYXQpLEUucHVzaChDLmZvcm1hdCksRS5wdXNoKEMudHlwZSksRS5wdXNoKEMuZ2VuZXJhdGVNaXBtYXBzKSxFLnB1c2goQy5wcmVtdWx0aXBseUFscGhhKSxFLnB1c2goQy5mbGlwWSksRS5wdXNoKEMudW5wYWNrQWxpZ25tZW50KSxFLnB1c2goQy5jb2xvclNwYWNlKSxFLmpvaW4oKX1mdW5jdGlvbiBRKEMsRSl7Y29uc3Qgaz1uLmdldChDKTtpZihDLmlzVmlkZW9UZXh0dXJlJiZtZShDKSxDLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT09PSExJiZDLnZlcnNpb24+MCYmay5fX3ZlcnNpb24hPT1DLnZlcnNpb24pe2NvbnN0IHNlPUMuaW1hZ2U7aWYoc2U9PT1udWxsKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgbm8gaW1hZ2UgZGF0YSBmb3VuZC4iKTtlbHNlIGlmKHNlLmNvbXBsZXRlPT09ITEpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlIik7ZWxzZXtCZShrLEMsRSk7cmV0dXJufX10LmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8yRCxrLl9fd2ViZ2xUZXh0dXJlLHIuVEVYVFVSRTArRSl9ZnVuY3Rpb24gbmUoQyxFKXtjb25zdCBrPW4uZ2V0KEMpO2lmKEMudmVyc2lvbj4wJiZrLl9fdmVyc2lvbiE9PUMudmVyc2lvbil7QmUoayxDLEUpO3JldHVybn10LmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8yRF9BUlJBWSxrLl9fd2ViZ2xUZXh0dXJlLHIuVEVYVFVSRTArRSl9ZnVuY3Rpb24gZmUoQyxFKXtjb25zdCBrPW4uZ2V0KEMpO2lmKEMudmVyc2lvbj4wJiZrLl9fdmVyc2lvbiE9PUMudmVyc2lvbil7QmUoayxDLEUpO3JldHVybn10LmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8zRCxrLl9fd2ViZ2xUZXh0dXJlLHIuVEVYVFVSRTArRSl9ZnVuY3Rpb24gJChDLEUpe2NvbnN0IGs9bi5nZXQoQyk7aWYoQy52ZXJzaW9uPjAmJmsuX192ZXJzaW9uIT09Qy52ZXJzaW9uKXt3ZShrLEMsRSk7cmV0dXJufXQuYmluZFRleHR1cmUoci5URVhUVVJFX0NVQkVfTUFQLGsuX193ZWJnbFRleHR1cmUsci5URVhUVVJFMCtFKX1jb25zdCBlZT17W0VzXTpyLlJFUEVBVCxbenRdOnIuQ0xBTVBfVE9fRURHRSxbQXNdOnIuTUlSUk9SRURfUkVQRUFUfSxkZT17W2J0XTpyLk5FQVJFU1QsW09hXTpyLk5FQVJFU1RfTUlQTUFQX05FQVJFU1QsW1RzXTpyLk5FQVJFU1RfTUlQTUFQX0xJTkVBUixbd3RdOnIuTElORUFSLFttY106ci5MSU5FQVJfTUlQTUFQX05FQVJFU1QsW3ZpXTpyLkxJTkVBUl9NSVBNQVBfTElORUFSfSxUZT17W2dkXTpyLk5FVkVSLFtTZF06ci5BTFdBWVMsW19kXTpyLkxFU1MsW0tjXTpyLkxFUVVBTCxbeGRdOnIuRVFVQUwsW01kXTpyLkdFUVVBTCxbeWRdOnIuR1JFQVRFUixbdmRdOnIuTk9URVFVQUx9O2Z1bmN0aW9uIGJlKEMsRSxrKXtpZihrPyhyLnRleFBhcmFtZXRlcmkoQyxyLlRFWFRVUkVfV1JBUF9TLGVlW0Uud3JhcFNdKSxyLnRleFBhcmFtZXRlcmkoQyxyLlRFWFRVUkVfV1JBUF9ULGVlW0Uud3JhcFRdKSwoQz09PXIuVEVYVFVSRV8zRHx8Qz09PXIuVEVYVFVSRV8yRF9BUlJBWSkmJnIudGV4UGFyYW1ldGVyaShDLHIuVEVYVFVSRV9XUkFQX1IsZWVbRS53cmFwUl0pLHIudGV4UGFyYW1ldGVyaShDLHIuVEVYVFVSRV9NQUdfRklMVEVSLGRlW0UubWFnRmlsdGVyXSksci50ZXhQYXJhbWV0ZXJpKEMsci5URVhUVVJFX01JTl9GSUxURVIsZGVbRS5taW5GaWx0ZXJdKSk6KHIudGV4UGFyYW1ldGVyaShDLHIuVEVYVFVSRV9XUkFQX1Msci5DTEFNUF9UT19FREdFKSxyLnRleFBhcmFtZXRlcmkoQyxyLlRFWFRVUkVfV1JBUF9ULHIuQ0xBTVBfVE9fRURHRSksKEM9PT1yLlRFWFRVUkVfM0R8fEM9PT1yLlRFWFRVUkVfMkRfQVJSQVkpJiZyLnRleFBhcmFtZXRlcmkoQyxyLlRFWFRVUkVfV1JBUF9SLHIuQ0xBTVBfVE9fRURHRSksKEUud3JhcFMhPT16dHx8RS53cmFwVCE9PXp0KSYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLHIudGV4UGFyYW1ldGVyaShDLHIuVEVYVFVSRV9NQUdfRklMVEVSLHcoRS5tYWdGaWx0ZXIpKSxyLnRleFBhcmFtZXRlcmkoQyxyLlRFWFRVUkVfTUlOX0ZJTFRFUix3KEUubWluRmlsdGVyKSksRS5taW5GaWx0ZXIhPT1idCYmRS5taW5GaWx0ZXIhPT13dCYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUubWluRmlsdGVyIHNob3VsZCBiZSBzZXQgdG8gVEhSRUUuTmVhcmVzdEZpbHRlciBvciBUSFJFRS5MaW5lYXJGaWx0ZXIuIikpLEUuY29tcGFyZUZ1bmN0aW9uJiYoci50ZXhQYXJhbWV0ZXJpKEMsci5URVhUVVJFX0NPTVBBUkVfTU9ERSxyLkNPTVBBUkVfUkVGX1RPX1RFWFRVUkUpLHIudGV4UGFyYW1ldGVyaShDLHIuVEVYVFVSRV9DT01QQVJFX0ZVTkMsVGVbRS5jb21wYXJlRnVuY3Rpb25dKSksZS5oYXMoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpPT09ITApe2NvbnN0IHNlPWUuZ2V0KCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTtpZihFLm1hZ0ZpbHRlcj09PWJ0fHxFLm1pbkZpbHRlciE9PVRzJiZFLm1pbkZpbHRlciE9PXZpfHxFLnR5cGU9PT1SbiYmZS5oYXMoIk9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciIpPT09ITF8fG89PT0hMSYmRS50eXBlPT09d3ImJmUuaGFzKCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpPT09ITEpcmV0dXJuOyhFLmFuaXNvdHJvcHk+MXx8bi5nZXQoRSkuX19jdXJyZW50QW5pc290cm9weSkmJihyLnRleFBhcmFtZXRlcmYoQyxzZS5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCxNYXRoLm1pbihFLmFuaXNvdHJvcHksaS5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxuLmdldChFKS5fX2N1cnJlbnRBbmlzb3Ryb3B5PUUuYW5pc290cm9weSl9fWZ1bmN0aW9uIE9lKEMsRSl7bGV0IGs9ITE7Qy5fX3dlYmdsSW5pdD09PXZvaWQgMCYmKEMuX193ZWJnbEluaXQ9ITAsRS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixSKSk7Y29uc3Qgc2U9RS5zb3VyY2U7bGV0IHRlPWcuZ2V0KHNlKTt0ZT09PXZvaWQgMCYmKHRlPXt9LGcuc2V0KHNlLHRlKSk7Y29uc3QgYWU9VihFKTtpZihhZSE9PUMuX19jYWNoZUtleSl7dGVbYWVdPT09dm9pZCAwJiYodGVbYWVdPXt0ZXh0dXJlOnIuY3JlYXRlVGV4dHVyZSgpLHVzZWRUaW1lczowfSxhLm1lbW9yeS50ZXh0dXJlcysrLGs9ITApLHRlW2FlXS51c2VkVGltZXMrKztjb25zdCBBZT10ZVtDLl9fY2FjaGVLZXldO0FlIT09dm9pZCAwJiYodGVbQy5fX2NhY2hlS2V5XS51c2VkVGltZXMtLSxBZS51c2VkVGltZXM9PT0wJiZJKEUpKSxDLl9fY2FjaGVLZXk9YWUsQy5fX3dlYmdsVGV4dHVyZT10ZVthZV0udGV4dHVyZX1yZXR1cm4ga31mdW5jdGlvbiBCZShDLEUsayl7bGV0IHNlPXIuVEVYVFVSRV8yRDsoRS5pc0RhdGFBcnJheVRleHR1cmV8fEUuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlKSYmKHNlPXIuVEVYVFVSRV8yRF9BUlJBWSksRS5pc0RhdGEzRFRleHR1cmUmJihzZT1yLlRFWFRVUkVfM0QpO2NvbnN0IHRlPU9lKEMsRSksYWU9RS5zb3VyY2U7dC5iaW5kVGV4dHVyZShzZSxDLl9fd2ViZ2xUZXh0dXJlLHIuVEVYVFVSRTArayk7Y29uc3QgQWU9bi5nZXQoYWUpO2lmKGFlLnZlcnNpb24hPT1BZS5fX3ZlcnNpb258fHRlPT09ITApe3QuYWN0aXZlVGV4dHVyZShyLlRFWFRVUkUwK2spO2NvbnN0IG9lPW90LmdldFByaW1hcmllcyhvdC53b3JraW5nQ29sb3JTcGFjZSkseGU9RS5jb2xvclNwYWNlPT09Z24/bnVsbDpvdC5nZXRQcmltYXJpZXMoRS5jb2xvclNwYWNlKSxEZT1FLmNvbG9yU3BhY2U9PT1nbnx8b2U9PT14ZT9yLk5PTkU6ci5CUk9XU0VSX0RFRkFVTFRfV0VCR0w7ci5waXhlbFN0b3JlaShyLlVOUEFDS19GTElQX1lfV0VCR0wsRS5mbGlwWSksci5waXhlbFN0b3JlaShyLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCxFLnByZW11bHRpcGx5QWxwaGEpLHIucGl4ZWxTdG9yZWkoci5VTlBBQ0tfQUxJR05NRU5ULEUudW5wYWNrQWxpZ25tZW50KSxyLnBpeGVsU3RvcmVpKHIuVU5QQUNLX0NPTE9SU1BBQ0VfQ09OVkVSU0lPTl9XRUJHTCxEZSk7Y29uc3QgdHQ9UyhFKSYmdihFLmltYWdlKT09PSExO2xldCBjZT14KEUuaW1hZ2UsdHQsITEsaCk7Y2U9cGUoRSxjZSk7Y29uc3QgYXQ9dihjZSl8fG8sVmU9cy5jb252ZXJ0KEUuZm9ybWF0LEUuY29sb3JTcGFjZSk7bGV0IE5lPXMuY29udmVydChFLnR5cGUpLExlPUwoRS5pbnRlcm5hbEZvcm1hdCxWZSxOZSxFLmNvbG9yU3BhY2UsRS5pc1ZpZGVvVGV4dHVyZSk7YmUoc2UsRSxhdCk7bGV0IEVlO2NvbnN0IGplPUUubWlwbWFwcyxPPW8mJkUuaXNWaWRlb1RleHR1cmUhPT0hMCYmTGUhPT1BYyx2ZT1BZS5fX3ZlcnNpb249PT12b2lkIDB8fHRlPT09ITAsaGU9TShFLGNlLGF0KTtpZihFLmlzRGVwdGhUZXh0dXJlKUxlPXIuREVQVEhfQ09NUE9ORU5ULG8/RS50eXBlPT09Um4/TGU9ci5ERVBUSF9DT01QT05FTlQzMkY6RS50eXBlPT09am4/TGU9ci5ERVBUSF9DT01QT05FTlQyNDpFLnR5cGU9PT1NaT9MZT1yLkRFUFRIMjRfU1RFTkNJTDg6TGU9ci5ERVBUSF9DT01QT05FTlQxNjpFLnR5cGU9PT1SbiYmY29uc29sZS5lcnJvcigiV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgZGVwdGggdGV4dHVyZSByZXF1aXJlcyBXZWJHTDIuIiksRS5mb3JtYXQ9PT1TaSYmTGU9PT1yLkRFUFRIX0NPTVBPTkVOVCYmRS50eXBlIT09QmEmJkUudHlwZSE9PWpuJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRTaG9ydFR5cGUgb3IgVW5zaWduZWRJbnRUeXBlIGZvciBEZXB0aEZvcm1hdCBEZXB0aFRleHR1cmUuIiksRS50eXBlPWpuLE5lPXMuY29udmVydChFLnR5cGUpKSxFLmZvcm1hdD09PXppJiZMZT09PXIuREVQVEhfQ09NUE9ORU5UJiYoTGU9ci5ERVBUSF9TVEVOQ0lMLEUudHlwZSE9PU1pJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRJbnQyNDhUeXBlIGZvciBEZXB0aFN0ZW5jaWxGb3JtYXQgRGVwdGhUZXh0dXJlLiIpLEUudHlwZT1NaSxOZT1zLmNvbnZlcnQoRS50eXBlKSkpLHZlJiYoTz90LnRleFN0b3JhZ2UyRChyLlRFWFRVUkVfMkQsMSxMZSxjZS53aWR0aCxjZS5oZWlnaHQpOnQudGV4SW1hZ2UyRChyLlRFWFRVUkVfMkQsMCxMZSxjZS53aWR0aCxjZS5oZWlnaHQsMCxWZSxOZSxudWxsKSk7ZWxzZSBpZihFLmlzRGF0YVRleHR1cmUpaWYoamUubGVuZ3RoPjAmJmF0KXtPJiZ2ZSYmdC50ZXhTdG9yYWdlMkQoci5URVhUVVJFXzJELGhlLExlLGplWzBdLndpZHRoLGplWzBdLmhlaWdodCk7Zm9yKGxldCBqPTAsZ2U9amUubGVuZ3RoO2o8Z2U7aisrKUVlPWplW2pdLE8/dC50ZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV8yRCxqLDAsMCxFZS53aWR0aCxFZS5oZWlnaHQsVmUsTmUsRWUuZGF0YSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV8yRCxqLExlLEVlLndpZHRoLEVlLmhlaWdodCwwLFZlLE5lLEVlLmRhdGEpO0UuZ2VuZXJhdGVNaXBtYXBzPSExfWVsc2UgTz8odmUmJnQudGV4U3RvcmFnZTJEKHIuVEVYVFVSRV8yRCxoZSxMZSxjZS53aWR0aCxjZS5oZWlnaHQpLHQudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsMCwwLDAsY2Uud2lkdGgsY2UuaGVpZ2h0LFZlLE5lLGNlLmRhdGEpKTp0LnRleEltYWdlMkQoci5URVhUVVJFXzJELDAsTGUsY2Uud2lkdGgsY2UuaGVpZ2h0LDAsVmUsTmUsY2UuZGF0YSk7ZWxzZSBpZihFLmlzQ29tcHJlc3NlZFRleHR1cmUpaWYoRS5pc0NvbXByZXNzZWRBcnJheVRleHR1cmUpe08mJnZlJiZ0LnRleFN0b3JhZ2UzRChyLlRFWFRVUkVfMkRfQVJSQVksaGUsTGUsamVbMF0ud2lkdGgsamVbMF0uaGVpZ2h0LGNlLmRlcHRoKTtmb3IobGV0IGo9MCxnZT1qZS5sZW5ndGg7ajxnZTtqKyspRWU9amVbal0sRS5mb3JtYXQhPT1hbj9WZSE9PW51bGw/Tz90LmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKHIuVEVYVFVSRV8yRF9BUlJBWSxqLDAsMCwwLEVlLndpZHRoLEVlLmhlaWdodCxjZS5kZXB0aCxWZSxFZS5kYXRhLDAsMCk6dC5jb21wcmVzc2VkVGV4SW1hZ2UzRChyLlRFWFRVUkVfMkRfQVJSQVksaixMZSxFZS53aWR0aCxFZS5oZWlnaHQsY2UuZGVwdGgsMCxFZS5kYXRhLDAsMCk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpIik6Tz90LnRleFN1YkltYWdlM0Qoci5URVhUVVJFXzJEX0FSUkFZLGosMCwwLDAsRWUud2lkdGgsRWUuaGVpZ2h0LGNlLmRlcHRoLFZlLE5lLEVlLmRhdGEpOnQudGV4SW1hZ2UzRChyLlRFWFRVUkVfMkRfQVJSQVksaixMZSxFZS53aWR0aCxFZS5oZWlnaHQsY2UuZGVwdGgsMCxWZSxOZSxFZS5kYXRhKX1lbHNle08mJnZlJiZ0LnRleFN0b3JhZ2UyRChyLlRFWFRVUkVfMkQsaGUsTGUsamVbMF0ud2lkdGgsamVbMF0uaGVpZ2h0KTtmb3IobGV0IGo9MCxnZT1qZS5sZW5ndGg7ajxnZTtqKyspRWU9amVbal0sRS5mb3JtYXQhPT1hbj9WZSE9PW51bGw/Tz90LmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV8yRCxqLDAsMCxFZS53aWR0aCxFZS5oZWlnaHQsVmUsRWUuZGF0YSk6dC5jb21wcmVzc2VkVGV4SW1hZ2UyRChyLlRFWFRVUkVfMkQsaixMZSxFZS53aWR0aCxFZS5oZWlnaHQsMCxFZS5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTpPP3QudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfMkQsaiwwLDAsRWUud2lkdGgsRWUuaGVpZ2h0LFZlLE5lLEVlLmRhdGEpOnQudGV4SW1hZ2UyRChyLlRFWFRVUkVfMkQsaixMZSxFZS53aWR0aCxFZS5oZWlnaHQsMCxWZSxOZSxFZS5kYXRhKX1lbHNlIGlmKEUuaXNEYXRhQXJyYXlUZXh0dXJlKU8/KHZlJiZ0LnRleFN0b3JhZ2UzRChyLlRFWFRVUkVfMkRfQVJSQVksaGUsTGUsY2Uud2lkdGgsY2UuaGVpZ2h0LGNlLmRlcHRoKSx0LnRleFN1YkltYWdlM0Qoci5URVhUVVJFXzJEX0FSUkFZLDAsMCwwLDAsY2Uud2lkdGgsY2UuaGVpZ2h0LGNlLmRlcHRoLFZlLE5lLGNlLmRhdGEpKTp0LnRleEltYWdlM0Qoci5URVhUVVJFXzJEX0FSUkFZLDAsTGUsY2Uud2lkdGgsY2UuaGVpZ2h0LGNlLmRlcHRoLDAsVmUsTmUsY2UuZGF0YSk7ZWxzZSBpZihFLmlzRGF0YTNEVGV4dHVyZSlPPyh2ZSYmdC50ZXhTdG9yYWdlM0Qoci5URVhUVVJFXzNELGhlLExlLGNlLndpZHRoLGNlLmhlaWdodCxjZS5kZXB0aCksdC50ZXhTdWJJbWFnZTNEKHIuVEVYVFVSRV8zRCwwLDAsMCwwLGNlLndpZHRoLGNlLmhlaWdodCxjZS5kZXB0aCxWZSxOZSxjZS5kYXRhKSk6dC50ZXhJbWFnZTNEKHIuVEVYVFVSRV8zRCwwLExlLGNlLndpZHRoLGNlLmhlaWdodCxjZS5kZXB0aCwwLFZlLE5lLGNlLmRhdGEpO2Vsc2UgaWYoRS5pc0ZyYW1lYnVmZmVyVGV4dHVyZSl7aWYodmUpaWYoTyl0LnRleFN0b3JhZ2UyRChyLlRFWFRVUkVfMkQsaGUsTGUsY2Uud2lkdGgsY2UuaGVpZ2h0KTtlbHNle2xldCBqPWNlLndpZHRoLGdlPWNlLmhlaWdodDtmb3IobGV0IHplPTA7emU8aGU7emUrKyl0LnRleEltYWdlMkQoci5URVhUVVJFXzJELHplLExlLGosZ2UsMCxWZSxOZSxudWxsKSxqPj49MSxnZT4+PTF9fWVsc2UgaWYoamUubGVuZ3RoPjAmJmF0KXtPJiZ2ZSYmdC50ZXhTdG9yYWdlMkQoci5URVhUVVJFXzJELGhlLExlLGplWzBdLndpZHRoLGplWzBdLmhlaWdodCk7Zm9yKGxldCBqPTAsZ2U9amUubGVuZ3RoO2o8Z2U7aisrKUVlPWplW2pdLE8/dC50ZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV8yRCxqLDAsMCxWZSxOZSxFZSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV8yRCxqLExlLFZlLE5lLEVlKTtFLmdlbmVyYXRlTWlwbWFwcz0hMX1lbHNlIE8/KHZlJiZ0LnRleFN0b3JhZ2UyRChyLlRFWFRVUkVfMkQsaGUsTGUsY2Uud2lkdGgsY2UuaGVpZ2h0KSx0LnRleFN1YkltYWdlMkQoci5URVhUVVJFXzJELDAsMCwwLFZlLE5lLGNlKSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV8yRCwwLExlLFZlLE5lLGNlKTtiKEUsYXQpJiZBKHNlKSxBZS5fX3ZlcnNpb249YWUudmVyc2lvbixFLm9uVXBkYXRlJiZFLm9uVXBkYXRlKEUpfUMuX192ZXJzaW9uPUUudmVyc2lvbn1mdW5jdGlvbiB3ZShDLEUsayl7aWYoRS5pbWFnZS5sZW5ndGghPT02KXJldHVybjtjb25zdCBzZT1PZShDLEUpLHRlPUUuc291cmNlO3QuYmluZFRleHR1cmUoci5URVhUVVJFX0NVQkVfTUFQLEMuX193ZWJnbFRleHR1cmUsci5URVhUVVJFMCtrKTtjb25zdCBhZT1uLmdldCh0ZSk7aWYodGUudmVyc2lvbiE9PWFlLl9fdmVyc2lvbnx8c2U9PT0hMCl7dC5hY3RpdmVUZXh0dXJlKHIuVEVYVFVSRTArayk7Y29uc3QgQWU9b3QuZ2V0UHJpbWFyaWVzKG90LndvcmtpbmdDb2xvclNwYWNlKSxvZT1FLmNvbG9yU3BhY2U9PT1nbj9udWxsOm90LmdldFByaW1hcmllcyhFLmNvbG9yU3BhY2UpLHhlPUUuY29sb3JTcGFjZT09PWdufHxBZT09PW9lP3IuTk9ORTpyLkJST1dTRVJfREVGQVVMVF9XRUJHTDtyLnBpeGVsU3RvcmVpKHIuVU5QQUNLX0ZMSVBfWV9XRUJHTCxFLmZsaXBZKSxyLnBpeGVsU3RvcmVpKHIuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLEUucHJlbXVsdGlwbHlBbHBoYSksci5waXhlbFN0b3JlaShyLlVOUEFDS19BTElHTk1FTlQsRS51bnBhY2tBbGlnbm1lbnQpLHIucGl4ZWxTdG9yZWkoci5VTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMLHhlKTtjb25zdCBEZT1FLmlzQ29tcHJlc3NlZFRleHR1cmV8fEUuaW1hZ2VbMF0uaXNDb21wcmVzc2VkVGV4dHVyZSx0dD1FLmltYWdlWzBdJiZFLmltYWdlWzBdLmlzRGF0YVRleHR1cmUsY2U9W107Zm9yKGxldCBqPTA7ajw2O2orKykhRGUmJiF0dD9jZVtqXT14KEUuaW1hZ2Vbal0sITEsITAsYyk6Y2Vbal09dHQ/RS5pbWFnZVtqXS5pbWFnZTpFLmltYWdlW2pdLGNlW2pdPXBlKEUsY2Vbal0pO2NvbnN0IGF0PWNlWzBdLFZlPXYoYXQpfHxvLE5lPXMuY29udmVydChFLmZvcm1hdCxFLmNvbG9yU3BhY2UpLExlPXMuY29udmVydChFLnR5cGUpLEVlPUwoRS5pbnRlcm5hbEZvcm1hdCxOZSxMZSxFLmNvbG9yU3BhY2UpLGplPW8mJkUuaXNWaWRlb1RleHR1cmUhPT0hMCxPPWFlLl9fdmVyc2lvbj09PXZvaWQgMHx8c2U9PT0hMDtsZXQgdmU9TShFLGF0LFZlKTtiZShyLlRFWFRVUkVfQ1VCRV9NQVAsRSxWZSk7bGV0IGhlO2lmKERlKXtqZSYmTyYmdC50ZXhTdG9yYWdlMkQoci5URVhUVVJFX0NVQkVfTUFQLHZlLEVlLGF0LndpZHRoLGF0LmhlaWdodCk7Zm9yKGxldCBqPTA7ajw2O2orKyl7aGU9Y2Vbal0ubWlwbWFwcztmb3IobGV0IGdlPTA7Z2U8aGUubGVuZ3RoO2dlKyspe2NvbnN0IHplPWhlW2dlXTtFLmZvcm1hdCE9PWFuP05lIT09bnVsbD9qZT90LmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osZ2UsMCwwLHplLndpZHRoLHplLmhlaWdodCxOZSx6ZS5kYXRhKTp0LmNvbXByZXNzZWRUZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osZ2UsRWUsemUud2lkdGgsemUuaGVpZ2h0LDAsemUuZGF0YSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKSIpOmplP3QudGV4U3ViSW1hZ2UyRChyLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtqLGdlLDAsMCx6ZS53aWR0aCx6ZS5oZWlnaHQsTmUsTGUsemUuZGF0YSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osZ2UsRWUsemUud2lkdGgsemUuaGVpZ2h0LDAsTmUsTGUsemUuZGF0YSl9fX1lbHNle2hlPUUubWlwbWFwcyxqZSYmTyYmKGhlLmxlbmd0aD4wJiZ2ZSsrLHQudGV4U3RvcmFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUCx2ZSxFZSxjZVswXS53aWR0aCxjZVswXS5oZWlnaHQpKTtmb3IobGV0IGo9MDtqPDY7aisrKWlmKHR0KXtqZT90LnRleFN1YkltYWdlMkQoci5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1graiwwLDAsMCxjZVtqXS53aWR0aCxjZVtqXS5oZWlnaHQsTmUsTGUsY2Vbal0uZGF0YSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osMCxFZSxjZVtqXS53aWR0aCxjZVtqXS5oZWlnaHQsMCxOZSxMZSxjZVtqXS5kYXRhKTtmb3IobGV0IGdlPTA7Z2U8aGUubGVuZ3RoO2dlKyspe2NvbnN0IGl0PWhlW2dlXS5pbWFnZVtqXS5pbWFnZTtqZT90LnRleFN1YkltYWdlMkQoci5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1graixnZSsxLDAsMCxpdC53aWR0aCxpdC5oZWlnaHQsTmUsTGUsaXQuZGF0YSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osZ2UrMSxFZSxpdC53aWR0aCxpdC5oZWlnaHQsMCxOZSxMZSxpdC5kYXRhKX19ZWxzZXtqZT90LnRleFN1YkltYWdlMkQoci5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1graiwwLDAsMCxOZSxMZSxjZVtqXSk6dC50ZXhJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osMCxFZSxOZSxMZSxjZVtqXSk7Zm9yKGxldCBnZT0wO2dlPGhlLmxlbmd0aDtnZSsrKXtjb25zdCB6ZT1oZVtnZV07amU/dC50ZXhTdWJJbWFnZTJEKHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK2osZ2UrMSwwLDAsTmUsTGUsemUuaW1hZ2Vbal0pOnQudGV4SW1hZ2UyRChyLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtqLGdlKzEsRWUsTmUsTGUsemUuaW1hZ2Vbal0pfX19YihFLFZlKSYmQShyLlRFWFRVUkVfQ1VCRV9NQVApLGFlLl9fdmVyc2lvbj10ZS52ZXJzaW9uLEUub25VcGRhdGUmJkUub25VcGRhdGUoRSl9Qy5fX3ZlcnNpb249RS52ZXJzaW9ufWZ1bmN0aW9uIFBlKEMsRSxrLHNlLHRlLGFlKXtjb25zdCBBZT1zLmNvbnZlcnQoay5mb3JtYXQsay5jb2xvclNwYWNlKSxvZT1zLmNvbnZlcnQoay50eXBlKSx4ZT1MKGsuaW50ZXJuYWxGb3JtYXQsQWUsb2Usay5jb2xvclNwYWNlKTtpZighbi5nZXQoRSkuX19oYXNFeHRlcm5hbFRleHR1cmVzKXtjb25zdCB0dD1NYXRoLm1heCgxLEUud2lkdGg+PmFlKSxjZT1NYXRoLm1heCgxLEUuaGVpZ2h0Pj5hZSk7dGU9PT1yLlRFWFRVUkVfM0R8fHRlPT09ci5URVhUVVJFXzJEX0FSUkFZP3QudGV4SW1hZ2UzRCh0ZSxhZSx4ZSx0dCxjZSxFLmRlcHRoLDAsQWUsb2UsbnVsbCk6dC50ZXhJbWFnZTJEKHRlLGFlLHhlLHR0LGNlLDAsQWUsb2UsbnVsbCl9dC5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixDKSxpZShFKT9mLmZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoci5GUkFNRUJVRkZFUixzZSx0ZSxuLmdldChrKS5fX3dlYmdsVGV4dHVyZSwwLEooRSkpOih0ZT09PXIuVEVYVFVSRV8yRHx8dGU+PXIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YJiZ0ZTw9ci5URVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1opJiZyLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHIuRlJBTUVCVUZGRVIsc2UsdGUsbi5nZXQoaykuX193ZWJnbFRleHR1cmUsYWUpLHQuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsbnVsbCl9ZnVuY3Rpb24gRChDLEUsayl7aWYoci5iaW5kUmVuZGVyYnVmZmVyKHIuUkVOREVSQlVGRkVSLEMpLEUuZGVwdGhCdWZmZXImJiFFLnN0ZW5jaWxCdWZmZXIpe2xldCBzZT1vPT09ITA/ci5ERVBUSF9DT01QT05FTlQyNDpyLkRFUFRIX0NPTVBPTkVOVDE2O2lmKGt8fGllKEUpKXtjb25zdCB0ZT1FLmRlcHRoVGV4dHVyZTt0ZSYmdGUuaXNEZXB0aFRleHR1cmUmJih0ZS50eXBlPT09Um4/c2U9ci5ERVBUSF9DT01QT05FTlQzMkY6dGUudHlwZT09PWpuJiYoc2U9ci5ERVBUSF9DT01QT05FTlQyNCkpO2NvbnN0IGFlPUooRSk7aWUoRSk/Zi5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoci5SRU5ERVJCVUZGRVIsYWUsc2UsRS53aWR0aCxFLmhlaWdodCk6ci5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoci5SRU5ERVJCVUZGRVIsYWUsc2UsRS53aWR0aCxFLmhlaWdodCl9ZWxzZSByLnJlbmRlcmJ1ZmZlclN0b3JhZ2Uoci5SRU5ERVJCVUZGRVIsc2UsRS53aWR0aCxFLmhlaWdodCk7ci5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihyLkZSQU1FQlVGRkVSLHIuREVQVEhfQVRUQUNITUVOVCxyLlJFTkRFUkJVRkZFUixDKX1lbHNlIGlmKEUuZGVwdGhCdWZmZXImJkUuc3RlbmNpbEJ1ZmZlcil7Y29uc3Qgc2U9SihFKTtrJiZpZShFKT09PSExP3IucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKHIuUkVOREVSQlVGRkVSLHNlLHIuREVQVEgyNF9TVEVOQ0lMOCxFLndpZHRoLEUuaGVpZ2h0KTppZShFKT9mLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVChyLlJFTkRFUkJVRkZFUixzZSxyLkRFUFRIMjRfU1RFTkNJTDgsRS53aWR0aCxFLmhlaWdodCk6ci5yZW5kZXJidWZmZXJTdG9yYWdlKHIuUkVOREVSQlVGRkVSLHIuREVQVEhfU1RFTkNJTCxFLndpZHRoLEUuaGVpZ2h0KSxyLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHIuRlJBTUVCVUZGRVIsci5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQsci5SRU5ERVJCVUZGRVIsQyl9ZWxzZXtjb25zdCBzZT1FLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM9PT0hMD9FLnRleHR1cmU6W0UudGV4dHVyZV07Zm9yKGxldCB0ZT0wO3RlPHNlLmxlbmd0aDt0ZSsrKXtjb25zdCBhZT1zZVt0ZV0sQWU9cy5jb252ZXJ0KGFlLmZvcm1hdCxhZS5jb2xvclNwYWNlKSxvZT1zLmNvbnZlcnQoYWUudHlwZSkseGU9TChhZS5pbnRlcm5hbEZvcm1hdCxBZSxvZSxhZS5jb2xvclNwYWNlKSxEZT1KKEUpO2smJmllKEUpPT09ITE/ci5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoci5SRU5ERVJCVUZGRVIsRGUseGUsRS53aWR0aCxFLmhlaWdodCk6aWUoRSk/Zi5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoci5SRU5ERVJCVUZGRVIsRGUseGUsRS53aWR0aCxFLmhlaWdodCk6ci5yZW5kZXJidWZmZXJTdG9yYWdlKHIuUkVOREVSQlVGRkVSLHhlLEUud2lkdGgsRS5oZWlnaHQpfX1yLmJpbmRSZW5kZXJidWZmZXIoci5SRU5ERVJCVUZGRVIsbnVsbCl9ZnVuY3Rpb24gbGUoQyxFKXtpZihFJiZFLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KXRocm93IG5ldyBFcnJvcigiRGVwdGggVGV4dHVyZSB3aXRoIGN1YmUgcmVuZGVyIHRhcmdldHMgaXMgbm90IHN1cHBvcnRlZCIpO2lmKHQuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsQyksIShFLmRlcHRoVGV4dHVyZSYmRS5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUpKXRocm93IG5ldyBFcnJvcigicmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZSIpOyghbi5nZXQoRS5kZXB0aFRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlfHxFLmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCE9PUUud2lkdGh8fEUuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCE9PUUuaGVpZ2h0KSYmKEUuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPUUud2lkdGgsRS5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0PUUuaGVpZ2h0LEUuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlPSEwKSxRKEUuZGVwdGhUZXh0dXJlLDApO2NvbnN0IHNlPW4uZ2V0KEUuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSx0ZT1KKEUpO2lmKEUuZGVwdGhUZXh0dXJlLmZvcm1hdD09PVNpKWllKEUpP2YuZnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVChyLkZSQU1FQlVGRkVSLHIuREVQVEhfQVRUQUNITUVOVCxyLlRFWFRVUkVfMkQsc2UsMCx0ZSk6ci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLHIuREVQVEhfQVRUQUNITUVOVCxyLlRFWFRVUkVfMkQsc2UsMCk7ZWxzZSBpZihFLmRlcHRoVGV4dHVyZS5mb3JtYXQ9PT16aSlpZShFKT9mLmZyYW1lYnVmZmVyVGV4dHVyZTJETXVsdGlzYW1wbGVFWFQoci5GUkFNRUJVRkZFUixyLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCxyLlRFWFRVUkVfMkQsc2UsMCx0ZSk6ci5mcmFtZWJ1ZmZlclRleHR1cmUyRChyLkZSQU1FQlVGRkVSLHIuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULHIuVEVYVFVSRV8yRCxzZSwwKTtlbHNlIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0Iil9ZnVuY3Rpb24gSyhDKXtjb25zdCBFPW4uZ2V0KEMpLGs9Qy5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldD09PSEwO2lmKEMuZGVwdGhUZXh0dXJlJiYhRS5fX2F1dG9BbGxvY2F0ZURlcHRoQnVmZmVyKXtpZihrKXRocm93IG5ldyBFcnJvcigidGFyZ2V0LmRlcHRoVGV4dHVyZSBub3Qgc3VwcG9ydGVkIGluIEN1YmUgcmVuZGVyIHRhcmdldHMiKTtsZShFLl9fd2ViZ2xGcmFtZWJ1ZmZlcixDKX1lbHNlIGlmKGspe0UuX193ZWJnbERlcHRoYnVmZmVyPVtdO2ZvcihsZXQgc2U9MDtzZTw2O3NlKyspdC5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixFLl9fd2ViZ2xGcmFtZWJ1ZmZlcltzZV0pLEUuX193ZWJnbERlcHRoYnVmZmVyW3NlXT1yLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLEQoRS5fX3dlYmdsRGVwdGhidWZmZXJbc2VdLEMsITEpfWVsc2UgdC5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixFLl9fd2ViZ2xGcmFtZWJ1ZmZlciksRS5fX3dlYmdsRGVwdGhidWZmZXI9ci5jcmVhdGVSZW5kZXJidWZmZXIoKSxEKEUuX193ZWJnbERlcHRoYnVmZmVyLEMsITEpO3QuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsbnVsbCl9ZnVuY3Rpb24gdWUoQyxFLGspe2NvbnN0IHNlPW4uZ2V0KEMpO0UhPT12b2lkIDAmJlBlKHNlLl9fd2ViZ2xGcmFtZWJ1ZmZlcixDLEMudGV4dHVyZSxyLkNPTE9SX0FUVEFDSE1FTlQwLHIuVEVYVFVSRV8yRCwwKSxrIT09dm9pZCAwJiZLKEMpfWZ1bmN0aW9uIHJlKEMpe2NvbnN0IEU9Qy50ZXh0dXJlLGs9bi5nZXQoQyksc2U9bi5nZXQoRSk7Qy5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixOKSxDLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHMhPT0hMCYmKHNlLl9fd2ViZ2xUZXh0dXJlPT09dm9pZCAwJiYoc2UuX193ZWJnbFRleHR1cmU9ci5jcmVhdGVUZXh0dXJlKCkpLHNlLl9fdmVyc2lvbj1FLnZlcnNpb24sYS5tZW1vcnkudGV4dHVyZXMrKyk7Y29uc3QgdGU9Qy5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldD09PSEwLGFlPUMuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cz09PSEwLEFlPXYoQyl8fG87aWYodGUpe2suX193ZWJnbEZyYW1lYnVmZmVyPVtdO2ZvcihsZXQgb2U9MDtvZTw2O29lKyspaWYobyYmRS5taXBtYXBzJiZFLm1pcG1hcHMubGVuZ3RoPjApe2suX193ZWJnbEZyYW1lYnVmZmVyW29lXT1bXTtmb3IobGV0IHhlPTA7eGU8RS5taXBtYXBzLmxlbmd0aDt4ZSsrKWsuX193ZWJnbEZyYW1lYnVmZmVyW29lXVt4ZV09ci5jcmVhdGVGcmFtZWJ1ZmZlcigpfWVsc2Ugay5fX3dlYmdsRnJhbWVidWZmZXJbb2VdPXIuY3JlYXRlRnJhbWVidWZmZXIoKX1lbHNle2lmKG8mJkUubWlwbWFwcyYmRS5taXBtYXBzLmxlbmd0aD4wKXtrLl9fd2ViZ2xGcmFtZWJ1ZmZlcj1bXTtmb3IobGV0IG9lPTA7b2U8RS5taXBtYXBzLmxlbmd0aDtvZSsrKWsuX193ZWJnbEZyYW1lYnVmZmVyW29lXT1yLmNyZWF0ZUZyYW1lYnVmZmVyKCl9ZWxzZSBrLl9fd2ViZ2xGcmFtZWJ1ZmZlcj1yLmNyZWF0ZUZyYW1lYnVmZmVyKCk7aWYoYWUpaWYoaS5kcmF3QnVmZmVycyl7Y29uc3Qgb2U9Qy50ZXh0dXJlO2ZvcihsZXQgeGU9MCxEZT1vZS5sZW5ndGg7eGU8RGU7eGUrKyl7Y29uc3QgdHQ9bi5nZXQob2VbeGVdKTt0dC5fX3dlYmdsVGV4dHVyZT09PXZvaWQgMCYmKHR0Ll9fd2ViZ2xUZXh0dXJlPXIuY3JlYXRlVGV4dHVyZSgpLGEubWVtb3J5LnRleHR1cmVzKyspfX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMiBvciBXRUJHTF9kcmF3X2J1ZmZlcnMgZXh0ZW5zaW9uLiIpO2lmKG8mJkMuc2FtcGxlcz4wJiZpZShDKT09PSExKXtjb25zdCBvZT1hZT9FOltFXTtrLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj1yLmNyZWF0ZUZyYW1lYnVmZmVyKCksay5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXI9W10sdC5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixrLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7Zm9yKGxldCB4ZT0wO3hlPG9lLmxlbmd0aDt4ZSsrKXtjb25zdCBEZT1vZVt4ZV07ay5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbeGVdPXIuY3JlYXRlUmVuZGVyYnVmZmVyKCksci5iaW5kUmVuZGVyYnVmZmVyKHIuUkVOREVSQlVGRkVSLGsuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW3hlXSk7Y29uc3QgdHQ9cy5jb252ZXJ0KERlLmZvcm1hdCxEZS5jb2xvclNwYWNlKSxjZT1zLmNvbnZlcnQoRGUudHlwZSksYXQ9TChEZS5pbnRlcm5hbEZvcm1hdCx0dCxjZSxEZS5jb2xvclNwYWNlLEMuaXNYUlJlbmRlclRhcmdldD09PSEwKSxWZT1KKEMpO3IucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKHIuUkVOREVSQlVGRkVSLFZlLGF0LEMud2lkdGgsQy5oZWlnaHQpLHIuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoci5GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwK3hlLHIuUkVOREVSQlVGRkVSLGsuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW3hlXSl9ci5iaW5kUmVuZGVyYnVmZmVyKHIuUkVOREVSQlVGRkVSLG51bGwpLEMuZGVwdGhCdWZmZXImJihrLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj1yLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLEQoay5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIsQywhMCkpLHQuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsbnVsbCl9fWlmKHRlKXt0LmJpbmRUZXh0dXJlKHIuVEVYVFVSRV9DVUJFX01BUCxzZS5fX3dlYmdsVGV4dHVyZSksYmUoci5URVhUVVJFX0NVQkVfTUFQLEUsQWUpO2ZvcihsZXQgb2U9MDtvZTw2O29lKyspaWYobyYmRS5taXBtYXBzJiZFLm1pcG1hcHMubGVuZ3RoPjApZm9yKGxldCB4ZT0wO3hlPEUubWlwbWFwcy5sZW5ndGg7eGUrKylQZShrLl9fd2ViZ2xGcmFtZWJ1ZmZlcltvZV1beGVdLEMsRSxyLkNPTE9SX0FUVEFDSE1FTlQwLHIuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YK29lLHhlKTtlbHNlIFBlKGsuX193ZWJnbEZyYW1lYnVmZmVyW29lXSxDLEUsci5DT0xPUl9BVFRBQ0hNRU5UMCxyLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtvZSwwKTtiKEUsQWUpJiZBKHIuVEVYVFVSRV9DVUJFX01BUCksdC51bmJpbmRUZXh0dXJlKCl9ZWxzZSBpZihhZSl7Y29uc3Qgb2U9Qy50ZXh0dXJlO2ZvcihsZXQgeGU9MCxEZT1vZS5sZW5ndGg7eGU8RGU7eGUrKyl7Y29uc3QgdHQ9b2VbeGVdLGNlPW4uZ2V0KHR0KTt0LmJpbmRUZXh0dXJlKHIuVEVYVFVSRV8yRCxjZS5fX3dlYmdsVGV4dHVyZSksYmUoci5URVhUVVJFXzJELHR0LEFlKSxQZShrLl9fd2ViZ2xGcmFtZWJ1ZmZlcixDLHR0LHIuQ09MT1JfQVRUQUNITUVOVDAreGUsci5URVhUVVJFXzJELDApLGIodHQsQWUpJiZBKHIuVEVYVFVSRV8yRCl9dC51bmJpbmRUZXh0dXJlKCl9ZWxzZXtsZXQgb2U9ci5URVhUVVJFXzJEO2lmKChDLmlzV2ViR0wzRFJlbmRlclRhcmdldHx8Qy5pc1dlYkdMQXJyYXlSZW5kZXJUYXJnZXQpJiYobz9vZT1DLmlzV2ViR0wzRFJlbmRlclRhcmdldD9yLlRFWFRVUkVfM0Q6ci5URVhUVVJFXzJEX0FSUkFZOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMVGV4dHVyZXM6IFRIUkVFLkRhdGEzRFRleHR1cmUgYW5kIFRIUkVFLkRhdGFBcnJheVRleHR1cmUgb25seSBzdXBwb3J0ZWQgd2l0aCBXZWJHTDIuIikpLHQuYmluZFRleHR1cmUob2Usc2UuX193ZWJnbFRleHR1cmUpLGJlKG9lLEUsQWUpLG8mJkUubWlwbWFwcyYmRS5taXBtYXBzLmxlbmd0aD4wKWZvcihsZXQgeGU9MDt4ZTxFLm1pcG1hcHMubGVuZ3RoO3hlKyspUGUoay5fX3dlYmdsRnJhbWVidWZmZXJbeGVdLEMsRSxyLkNPTE9SX0FUVEFDSE1FTlQwLG9lLHhlKTtlbHNlIFBlKGsuX193ZWJnbEZyYW1lYnVmZmVyLEMsRSxyLkNPTE9SX0FUVEFDSE1FTlQwLG9lLDApO2IoRSxBZSkmJkEob2UpLHQudW5iaW5kVGV4dHVyZSgpfUMuZGVwdGhCdWZmZXImJksoQyl9ZnVuY3Rpb24gQ2UoQyl7Y29uc3QgRT12KEMpfHxvLGs9Qy5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzPT09ITA/Qy50ZXh0dXJlOltDLnRleHR1cmVdO2ZvcihsZXQgc2U9MCx0ZT1rLmxlbmd0aDtzZTx0ZTtzZSsrKXtjb25zdCBhZT1rW3NlXTtpZihiKGFlLEUpKXtjb25zdCBBZT1DLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0P3IuVEVYVFVSRV9DVUJFX01BUDpyLlRFWFRVUkVfMkQsb2U9bi5nZXQoYWUpLl9fd2ViZ2xUZXh0dXJlO3QuYmluZFRleHR1cmUoQWUsb2UpLEEoQWUpLHQudW5iaW5kVGV4dHVyZSgpfX19ZnVuY3Rpb24gVyhDKXtpZihvJiZDLnNhbXBsZXM+MCYmaWUoQyk9PT0hMSl7Y29uc3QgRT1DLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM/Qy50ZXh0dXJlOltDLnRleHR1cmVdLGs9Qy53aWR0aCxzZT1DLmhlaWdodDtsZXQgdGU9ci5DT0xPUl9CVUZGRVJfQklUO2NvbnN0IGFlPVtdLEFlPUMuc3RlbmNpbEJ1ZmZlcj9yLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVDpyLkRFUFRIX0FUVEFDSE1FTlQsb2U9bi5nZXQoQykseGU9Qy5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzPT09ITA7aWYoeGUpZm9yKGxldCBEZT0wO0RlPEUubGVuZ3RoO0RlKyspdC5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixvZS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLHIuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoci5GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwK0RlLHIuUkVOREVSQlVGRkVSLG51bGwpLHQuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsb2UuX193ZWJnbEZyYW1lYnVmZmVyKSxyLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHIuRFJBV19GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwK0RlLHIuVEVYVFVSRV8yRCxudWxsLDApO3QuYmluZEZyYW1lYnVmZmVyKHIuUkVBRF9GUkFNRUJVRkZFUixvZS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLHQuYmluZEZyYW1lYnVmZmVyKHIuRFJBV19GUkFNRUJVRkZFUixvZS5fX3dlYmdsRnJhbWVidWZmZXIpO2ZvcihsZXQgRGU9MDtEZTxFLmxlbmd0aDtEZSsrKXthZS5wdXNoKHIuQ09MT1JfQVRUQUNITUVOVDArRGUpLEMuZGVwdGhCdWZmZXImJmFlLnB1c2goQWUpO2NvbnN0IHR0PW9lLl9faWdub3JlRGVwdGhWYWx1ZXMhPT12b2lkIDA/b2UuX19pZ25vcmVEZXB0aFZhbHVlczohMTtpZih0dD09PSExJiYoQy5kZXB0aEJ1ZmZlciYmKHRlfD1yLkRFUFRIX0JVRkZFUl9CSVQpLEMuc3RlbmNpbEJ1ZmZlciYmKHRlfD1yLlNURU5DSUxfQlVGRkVSX0JJVCkpLHhlJiZyLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHIuUkVBRF9GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwLHIuUkVOREVSQlVGRkVSLG9lLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltEZV0pLHR0PT09ITAmJihyLmludmFsaWRhdGVGcmFtZWJ1ZmZlcihyLlJFQURfRlJBTUVCVUZGRVIsW0FlXSksci5pbnZhbGlkYXRlRnJhbWVidWZmZXIoci5EUkFXX0ZSQU1FQlVGRkVSLFtBZV0pKSx4ZSl7Y29uc3QgY2U9bi5nZXQoRVtEZV0pLl9fd2ViZ2xUZXh0dXJlO3IuZnJhbWVidWZmZXJUZXh0dXJlMkQoci5EUkFXX0ZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDAsci5URVhUVVJFXzJELGNlLDApfXIuYmxpdEZyYW1lYnVmZmVyKDAsMCxrLHNlLDAsMCxrLHNlLHRlLHIuTkVBUkVTVCksZCYmci5pbnZhbGlkYXRlRnJhbWVidWZmZXIoci5SRUFEX0ZSQU1FQlVGRkVSLGFlKX1pZih0LmJpbmRGcmFtZWJ1ZmZlcihyLlJFQURfRlJBTUVCVUZGRVIsbnVsbCksdC5iaW5kRnJhbWVidWZmZXIoci5EUkFXX0ZSQU1FQlVGRkVSLG51bGwpLHhlKWZvcihsZXQgRGU9MDtEZTxFLmxlbmd0aDtEZSsrKXt0LmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLG9lLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksci5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcihyLkZSQU1FQlVGRkVSLHIuQ09MT1JfQVRUQUNITUVOVDArRGUsci5SRU5ERVJCVUZGRVIsb2UuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW0RlXSk7Y29uc3QgdHQ9bi5nZXQoRVtEZV0pLl9fd2ViZ2xUZXh0dXJlO3QuYmluZEZyYW1lYnVmZmVyKHIuRlJBTUVCVUZGRVIsb2UuX193ZWJnbEZyYW1lYnVmZmVyKSxyLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHIuRFJBV19GUkFNRUJVRkZFUixyLkNPTE9SX0FUVEFDSE1FTlQwK0RlLHIuVEVYVFVSRV8yRCx0dCwwKX10LmJpbmRGcmFtZWJ1ZmZlcihyLkRSQVdfRlJBTUVCVUZGRVIsb2UuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKX19ZnVuY3Rpb24gSihDKXtyZXR1cm4gTWF0aC5taW4odSxDLnNhbXBsZXMpfWZ1bmN0aW9uIGllKEMpe2NvbnN0IEU9bi5nZXQoQyk7cmV0dXJuIG8mJkMuc2FtcGxlcz4wJiZlLmhhcygiV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIik9PT0hMCYmRS5fX3VzZVJlbmRlclRvVGV4dHVyZSE9PSExfWZ1bmN0aW9uIG1lKEMpe2NvbnN0IEU9YS5yZW5kZXIuZnJhbWU7cC5nZXQoQykhPT1FJiYocC5zZXQoQyxFKSxDLnVwZGF0ZSgpKX1mdW5jdGlvbiBwZShDLEUpe2NvbnN0IGs9Qy5jb2xvclNwYWNlLHNlPUMuZm9ybWF0LHRlPUMudHlwZTtyZXR1cm4gQy5pc0NvbXByZXNzZWRUZXh0dXJlPT09ITB8fEMuaXNWaWRlb1RleHR1cmU9PT0hMHx8Qy5mb3JtYXQ9PT0kYXx8ayE9PVZuJiZrIT09Z24mJihvdC5nZXRUcmFuc2ZlcihrKT09PWN0P289PT0hMT9lLmhhcygiRVhUX3NSR0IiKT09PSEwJiZzZT09PWFuPyhDLmZvcm1hdD0kYSxDLm1pbkZpbHRlcj13dCxDLmdlbmVyYXRlTWlwbWFwcz0hMSk6RT1paC5zUkdCVG9MaW5lYXIoRSk6KHNlIT09YW58fHRlIT09UW4pJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXM6IHNSR0IgZW5jb2RlZCB0ZXh0dXJlcyBoYXZlIHRvIHVzZSBSR0JBRm9ybWF0IGFuZCBVbnNpZ25lZEJ5dGVUeXBlLiIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMVGV4dHVyZXM6IFVuc3VwcG9ydGVkIHRleHR1cmUgY29sb3Igc3BhY2U6IixrKSksRX10aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQ9Wix0aGlzLnJlc2V0VGV4dHVyZVVuaXRzPUYsdGhpcy5zZXRUZXh0dXJlMkQ9USx0aGlzLnNldFRleHR1cmUyREFycmF5PW5lLHRoaXMuc2V0VGV4dHVyZTNEPWZlLHRoaXMuc2V0VGV4dHVyZUN1YmU9JCx0aGlzLnJlYmluZFRleHR1cmVzPXVlLHRoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9cmUsdGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9Q2UsdGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1XLHRoaXMuc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlcj1LLHRoaXMuc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmU9UGUsdGhpcy51c2VNdWx0aXNhbXBsZWRSVFQ9aWV9ZnVuY3Rpb24gTXAocixlLHQpe2NvbnN0IG49dC5pc1dlYkdMMjtmdW5jdGlvbiBpKHMsYT1nbil7bGV0IG87Y29uc3QgbD1vdC5nZXRUcmFuc2ZlcihhKTtpZihzPT09UW4pcmV0dXJuIHIuVU5TSUdORURfQllURTtpZihzPT09X2MpcmV0dXJuIHIuVU5TSUdORURfU0hPUlRfNF80XzRfNDtpZihzPT09eGMpcmV0dXJuIHIuVU5TSUdORURfU0hPUlRfNV81XzVfMTtpZihzPT09bmQpcmV0dXJuIHIuQllURTtpZihzPT09aWQpcmV0dXJuIHIuU0hPUlQ7aWYocz09PUJhKXJldHVybiByLlVOU0lHTkVEX1NIT1JUO2lmKHM9PT1nYylyZXR1cm4gci5JTlQ7aWYocz09PWpuKXJldHVybiByLlVOU0lHTkVEX0lOVDtpZihzPT09Um4pcmV0dXJuIHIuRkxPQVQ7aWYocz09PXdyKXJldHVybiBuP3IuSEFMRl9GTE9BVDoobz1lLmdldCgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpLG8hPT1udWxsP28uSEFMRl9GTE9BVF9PRVM6bnVsbCk7aWYocz09PXJkKXJldHVybiByLkFMUEhBO2lmKHM9PT1hbilyZXR1cm4gci5SR0JBO2lmKHM9PT1zZClyZXR1cm4gci5MVU1JTkFOQ0U7aWYocz09PWFkKXJldHVybiByLkxVTUlOQU5DRV9BTFBIQTtpZihzPT09U2kpcmV0dXJuIHIuREVQVEhfQ09NUE9ORU5UO2lmKHM9PT16aSlyZXR1cm4gci5ERVBUSF9TVEVOQ0lMO2lmKHM9PT0kYSlyZXR1cm4gbz1lLmdldCgiRVhUX3NSR0IiKSxvIT09bnVsbD9vLlNSR0JfQUxQSEFfRVhUOm51bGw7aWYocz09PW9kKXJldHVybiByLlJFRDtpZihzPT09eWMpcmV0dXJuIHIuUkVEX0lOVEVHRVI7aWYocz09PWxkKXJldHVybiByLlJHO2lmKHM9PT12YylyZXR1cm4gci5SR19JTlRFR0VSO2lmKHM9PT1NYylyZXR1cm4gci5SR0JBX0lOVEVHRVI7aWYocz09PXphfHxzPT09a2F8fHM9PT1HYXx8cz09PVZhKWlmKGw9PT1jdClpZihvPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Y19zcmdiIiksbyE9PW51bGwpe2lmKHM9PT16YSlyZXR1cm4gby5DT01QUkVTU0VEX1NSR0JfUzNUQ19EWFQxX0VYVDtpZihzPT09a2EpcmV0dXJuIG8uQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUMV9FWFQ7aWYocz09PUdhKXJldHVybiBvLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9TM1RDX0RYVDNfRVhUO2lmKHM9PT1WYSlyZXR1cm4gby5DT01QUkVTU0VEX1NSR0JfQUxQSEFfUzNUQ19EWFQ1X0VYVH1lbHNlIHJldHVybiBudWxsO2Vsc2UgaWYobz1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKSxvIT09bnVsbCl7aWYocz09PXphKXJldHVybiBvLkNPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ7aWYocz09PWthKXJldHVybiBvLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUO2lmKHM9PT1HYSlyZXR1cm4gby5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtpZihzPT09VmEpcmV0dXJuIG8uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFR9ZWxzZSByZXR1cm4gbnVsbDtpZihzPT09U2N8fHM9PT1iY3x8cz09PXdjfHxzPT09RWMpaWYobz1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIiksbyE9PW51bGwpe2lmKHM9PT1TYylyZXR1cm4gby5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO2lmKHM9PT1iYylyZXR1cm4gby5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO2lmKHM9PT13YylyZXR1cm4gby5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZihzPT09RWMpcmV0dXJuIG8uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUd9ZWxzZSByZXR1cm4gbnVsbDtpZihzPT09QWMpcmV0dXJuIG89ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxIiksbyE9PW51bGw/by5DT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMOm51bGw7aWYocz09PVRjfHxzPT09Q2MpaWYobz1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YyIpLG8hPT1udWxsKXtpZihzPT09VGMpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfRVRDMjpvLkNPTVBSRVNTRURfUkdCOF9FVEMyO2lmKHM9PT1DYylyZXR1cm4gbD09PWN0P28uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfRVRDMl9FQUM6by5DT01QUkVTU0VEX1JHQkE4X0VUQzJfRUFDfWVsc2UgcmV0dXJuIG51bGw7aWYocz09PVJjfHxzPT09UGN8fHM9PT1MY3x8cz09PUljfHxzPT09VWN8fHM9PT1EY3x8cz09PU5jfHxzPT09RmN8fHM9PT1PY3x8cz09PUJjfHxzPT09emN8fHM9PT1rY3x8cz09PUdjfHxzPT09VmMpaWYobz1lLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSxvIT09bnVsbCl7aWYocz09PVJjKXJldHVybiBsPT09Y3Q/by5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzR4NF9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfS0hSO2lmKHM9PT1QYylyZXR1cm4gbD09PWN0P28uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ181eDRfS0hSOm8uQ09NUFJFU1NFRF9SR0JBX0FTVENfNXg0X0tIUjtpZihzPT09TGMpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfNXg1X0tIUjpvLkNPTVBSRVNTRURfUkdCQV9BU1RDXzV4NV9LSFI7aWYocz09PUljKXJldHVybiBsPT09Y3Q/by5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzZ4NV9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ182eDVfS0hSO2lmKHM9PT1VYylyZXR1cm4gbD09PWN0P28uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ182eDZfS0hSOm8uQ09NUFJFU1NFRF9SR0JBX0FTVENfNng2X0tIUjtpZihzPT09RGMpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfOHg1X0tIUjpvLkNPTVBSRVNTRURfUkdCQV9BU1RDXzh4NV9LSFI7aWYocz09PU5jKXJldHVybiBsPT09Y3Q/by5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4Nl9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDZfS0hSO2lmKHM9PT1GYylyZXR1cm4gbD09PWN0P28uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ184eDhfS0hSOm8uQ09NUFJFU1NFRF9SR0JBX0FTVENfOHg4X0tIUjtpZihzPT09T2MpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4NV9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg1X0tIUjtpZihzPT09QmMpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4Nl9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg2X0tIUjtpZihzPT09emMpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4OF9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg4X0tIUjtpZihzPT09a2MpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4MTBfS0hSOm8uQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4MTBfS0hSO2lmKHM9PT1HYylyZXR1cm4gbD09PWN0P28uQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMngxMF9LSFI6by5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMngxMF9LSFI7aWYocz09PVZjKXJldHVybiBsPT09Y3Q/by5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEyeDEyX0tIUjpvLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEyeDEyX0tIUn1lbHNlIHJldHVybiBudWxsO2lmKHM9PT1IYXx8cz09PUhjfHxzPT09V2MpaWYobz1lLmdldCgiRVhUX3RleHR1cmVfY29tcHJlc3Npb25fYnB0YyIpLG8hPT1udWxsKXtpZihzPT09SGEpcmV0dXJuIGw9PT1jdD9vLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9CUFRDX1VOT1JNX0VYVDpvLkNPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNX0VYVDtpZihzPT09SGMpcmV0dXJuIG8uQ09NUFJFU1NFRF9SR0JfQlBUQ19TSUdORURfRkxPQVRfRVhUO2lmKHM9PT1XYylyZXR1cm4gby5DT01QUkVTU0VEX1JHQl9CUFRDX1VOU0lHTkVEX0ZMT0FUX0VYVH1lbHNlIHJldHVybiBudWxsO2lmKHM9PT1jZHx8cz09PVhjfHxzPT09cWN8fHM9PT0kYylpZihvPWUuZ2V0KCJFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9yZ3RjIiksbyE9PW51bGwpe2lmKHM9PT1IYSlyZXR1cm4gby5DT01QUkVTU0VEX1JFRF9SR1RDMV9FWFQ7aWYocz09PVhjKXJldHVybiBvLkNPTVBSRVNTRURfU0lHTkVEX1JFRF9SR1RDMV9FWFQ7aWYocz09PXFjKXJldHVybiBvLkNPTVBSRVNTRURfUkVEX0dSRUVOX1JHVEMyX0VYVDtpZihzPT09JGMpcmV0dXJuIG8uQ09NUFJFU1NFRF9TSUdORURfUkVEX0dSRUVOX1JHVEMyX0VYVH1lbHNlIHJldHVybiBudWxsO3JldHVybiBzPT09TWk/bj9yLlVOU0lHTkVEX0lOVF8yNF84OihvPWUuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIiksbyE9PW51bGw/by5VTlNJR05FRF9JTlRfMjRfOF9XRUJHTDpudWxsKTpyW3NdIT09dm9pZCAwP3Jbc106bnVsbH1yZXR1cm57Y29udmVydDppfX1jbGFzcyBTcCBleHRlbmRzIEJ0e2NvbnN0cnVjdG9yKGU9W10pe3N1cGVyKCksdGhpcy5pc0FycmF5Q2FtZXJhPSEwLHRoaXMuY2FtZXJhcz1lfX1jbGFzcyBZciBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzR3JvdXA9ITAsdGhpcy50eXBlPSJHcm91cCJ9fWNvbnN0IGJTPXt0eXBlOiJtb3ZlIn07Y2xhc3MgVWh7Y29uc3RydWN0b3IoKXt0aGlzLl90YXJnZXRSYXk9bnVsbCx0aGlzLl9ncmlwPW51bGwsdGhpcy5faGFuZD1udWxsfWdldEhhbmRTcGFjZSgpe3JldHVybiB0aGlzLl9oYW5kPT09bnVsbCYmKHRoaXMuX2hhbmQ9bmV3IFlyLHRoaXMuX2hhbmQubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLl9oYW5kLnZpc2libGU9ITEsdGhpcy5faGFuZC5qb2ludHM9e30sdGhpcy5faGFuZC5pbnB1dFN0YXRlPXtwaW5jaGluZzohMX0pLHRoaXMuX2hhbmR9Z2V0VGFyZ2V0UmF5U3BhY2UoKXtyZXR1cm4gdGhpcy5fdGFyZ2V0UmF5PT09bnVsbCYmKHRoaXMuX3RhcmdldFJheT1uZXcgWXIsdGhpcy5fdGFyZ2V0UmF5Lm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5fdGFyZ2V0UmF5LnZpc2libGU9ITEsdGhpcy5fdGFyZ2V0UmF5Lmhhc0xpbmVhclZlbG9jaXR5PSExLHRoaXMuX3RhcmdldFJheS5saW5lYXJWZWxvY2l0eT1uZXcgUCx0aGlzLl90YXJnZXRSYXkuaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuX3RhcmdldFJheS5hbmd1bGFyVmVsb2NpdHk9bmV3IFApLHRoaXMuX3RhcmdldFJheX1nZXRHcmlwU3BhY2UoKXtyZXR1cm4gdGhpcy5fZ3JpcD09PW51bGwmJih0aGlzLl9ncmlwPW5ldyBZcix0aGlzLl9ncmlwLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5fZ3JpcC52aXNpYmxlPSExLHRoaXMuX2dyaXAuaGFzTGluZWFyVmVsb2NpdHk9ITEsdGhpcy5fZ3JpcC5saW5lYXJWZWxvY2l0eT1uZXcgUCx0aGlzLl9ncmlwLmhhc0FuZ3VsYXJWZWxvY2l0eT0hMSx0aGlzLl9ncmlwLmFuZ3VsYXJWZWxvY2l0eT1uZXcgUCksdGhpcy5fZ3JpcH1kaXNwYXRjaEV2ZW50KGUpe3JldHVybiB0aGlzLl90YXJnZXRSYXkhPT1udWxsJiZ0aGlzLl90YXJnZXRSYXkuZGlzcGF0Y2hFdmVudChlKSx0aGlzLl9ncmlwIT09bnVsbCYmdGhpcy5fZ3JpcC5kaXNwYXRjaEV2ZW50KGUpLHRoaXMuX2hhbmQhPT1udWxsJiZ0aGlzLl9oYW5kLmRpc3BhdGNoRXZlbnQoZSksdGhpc31jb25uZWN0KGUpe2lmKGUmJmUuaGFuZCl7Y29uc3QgdD10aGlzLl9oYW5kO2lmKHQpZm9yKGNvbnN0IG4gb2YgZS5oYW5kLnZhbHVlcygpKXRoaXMuX2dldEhhbmRKb2ludCh0LG4pfXJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImNvbm5lY3RlZCIsZGF0YTplfSksdGhpc31kaXNjb25uZWN0KGUpe3JldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc2Nvbm5lY3RlZCIsZGF0YTplfSksdGhpcy5fdGFyZ2V0UmF5IT09bnVsbCYmKHRoaXMuX3RhcmdldFJheS52aXNpYmxlPSExKSx0aGlzLl9ncmlwIT09bnVsbCYmKHRoaXMuX2dyaXAudmlzaWJsZT0hMSksdGhpcy5faGFuZCE9PW51bGwmJih0aGlzLl9oYW5kLnZpc2libGU9ITEpLHRoaXN9dXBkYXRlKGUsdCxuKXtsZXQgaT1udWxsLHM9bnVsbCxhPW51bGw7Y29uc3Qgbz10aGlzLl90YXJnZXRSYXksbD10aGlzLl9ncmlwLGM9dGhpcy5faGFuZDtpZihlJiZ0LnNlc3Npb24udmlzaWJpbGl0eVN0YXRlIT09InZpc2libGUtYmx1cnJlZCIpe2lmKGMmJmUuaGFuZCl7YT0hMDtmb3IoY29uc3QgXyBvZiBlLmhhbmQudmFsdWVzKCkpe2NvbnN0IGc9dC5nZXRKb2ludFBvc2UoXyxuKSxtPXRoaXMuX2dldEhhbmRKb2ludChjLF8pO2chPT1udWxsJiYobS5tYXRyaXguZnJvbUFycmF5KGcudHJhbnNmb3JtLm1hdHJpeCksbS5tYXRyaXguZGVjb21wb3NlKG0ucG9zaXRpb24sbS5yb3RhdGlvbixtLnNjYWxlKSxtLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITAsbS5qb2ludFJhZGl1cz1nLnJhZGl1cyksbS52aXNpYmxlPWchPT1udWxsfWNvbnN0IGg9Yy5qb2ludHNbImluZGV4LWZpbmdlci10aXAiXSx1PWMuam9pbnRzWyJ0aHVtYi10aXAiXSxmPWgucG9zaXRpb24uZGlzdGFuY2VUbyh1LnBvc2l0aW9uKSxkPS4wMixwPS4wMDU7Yy5pbnB1dFN0YXRlLnBpbmNoaW5nJiZmPmQrcD8oYy5pbnB1dFN0YXRlLnBpbmNoaW5nPSExLHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToicGluY2hlbmQiLGhhbmRlZG5lc3M6ZS5oYW5kZWRuZXNzLHRhcmdldDp0aGlzfSkpOiFjLmlucHV0U3RhdGUucGluY2hpbmcmJmY8PWQtcCYmKGMuaW5wdXRTdGF0ZS5waW5jaGluZz0hMCx0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6InBpbmNoc3RhcnQiLGhhbmRlZG5lc3M6ZS5oYW5kZWRuZXNzLHRhcmdldDp0aGlzfSkpfWVsc2UgbCE9PW51bGwmJmUuZ3JpcFNwYWNlJiYocz10LmdldFBvc2UoZS5ncmlwU3BhY2UsbikscyE9PW51bGwmJihsLm1hdHJpeC5mcm9tQXJyYXkocy50cmFuc2Zvcm0ubWF0cml4KSxsLm1hdHJpeC5kZWNvbXBvc2UobC5wb3NpdGlvbixsLnJvdGF0aW9uLGwuc2NhbGUpLGwubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMCxzLmxpbmVhclZlbG9jaXR5PyhsLmhhc0xpbmVhclZlbG9jaXR5PSEwLGwubGluZWFyVmVsb2NpdHkuY29weShzLmxpbmVhclZlbG9jaXR5KSk6bC5oYXNMaW5lYXJWZWxvY2l0eT0hMSxzLmFuZ3VsYXJWZWxvY2l0eT8obC5oYXNBbmd1bGFyVmVsb2NpdHk9ITAsbC5hbmd1bGFyVmVsb2NpdHkuY29weShzLmFuZ3VsYXJWZWxvY2l0eSkpOmwuaGFzQW5ndWxhclZlbG9jaXR5PSExKSk7byE9PW51bGwmJihpPXQuZ2V0UG9zZShlLnRhcmdldFJheVNwYWNlLG4pLGk9PT1udWxsJiZzIT09bnVsbCYmKGk9cyksaSE9PW51bGwmJihvLm1hdHJpeC5mcm9tQXJyYXkoaS50cmFuc2Zvcm0ubWF0cml4KSxvLm1hdHJpeC5kZWNvbXBvc2Uoby5wb3NpdGlvbixvLnJvdGF0aW9uLG8uc2NhbGUpLG8ubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMCxpLmxpbmVhclZlbG9jaXR5PyhvLmhhc0xpbmVhclZlbG9jaXR5PSEwLG8ubGluZWFyVmVsb2NpdHkuY29weShpLmxpbmVhclZlbG9jaXR5KSk6by5oYXNMaW5lYXJWZWxvY2l0eT0hMSxpLmFuZ3VsYXJWZWxvY2l0eT8oby5oYXNBbmd1bGFyVmVsb2NpdHk9ITAsby5hbmd1bGFyVmVsb2NpdHkuY29weShpLmFuZ3VsYXJWZWxvY2l0eSkpOm8uaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuZGlzcGF0Y2hFdmVudChiUykpKX1yZXR1cm4gbyE9PW51bGwmJihvLnZpc2libGU9aSE9PW51bGwpLGwhPT1udWxsJiYobC52aXNpYmxlPXMhPT1udWxsKSxjIT09bnVsbCYmKGMudmlzaWJsZT1hIT09bnVsbCksdGhpc31fZ2V0SGFuZEpvaW50KGUsdCl7aWYoZS5qb2ludHNbdC5qb2ludE5hbWVdPT09dm9pZCAwKXtjb25zdCBuPW5ldyBZcjtuLm1hdHJpeEF1dG9VcGRhdGU9ITEsbi52aXNpYmxlPSExLGUuam9pbnRzW3Quam9pbnROYW1lXT1uLGUuYWRkKG4pfXJldHVybiBlLmpvaW50c1t0LmpvaW50TmFtZV19fWNsYXNzIHdTIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpO2NvbnN0IG49dGhpcztsZXQgaT1udWxsLHM9MSxhPW51bGwsbz0ibG9jYWwtZmxvb3IiLGw9MSxjPW51bGwsaD1udWxsLHU9bnVsbCxmPW51bGwsZD1udWxsLHA9bnVsbDtjb25zdCBfPXQuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKTtsZXQgZz1udWxsLG09bnVsbDtjb25zdCB5PVtdLHg9W10sdj1uZXcgcTtsZXQgUz1udWxsO2NvbnN0IGI9bmV3IEJ0O2IubGF5ZXJzLmVuYWJsZSgxKSxiLnZpZXdwb3J0PW5ldyBsdDtjb25zdCBBPW5ldyBCdDtBLmxheWVycy5lbmFibGUoMiksQS52aWV3cG9ydD1uZXcgbHQ7Y29uc3QgTD1bYixBXSxNPW5ldyBTcDtNLmxheWVycy5lbmFibGUoMSksTS5sYXllcnMuZW5hYmxlKDIpO2xldCB3PW51bGwsUj1udWxsO3RoaXMuY2FtZXJhQXV0b1VwZGF0ZT0hMCx0aGlzLmVuYWJsZWQ9ITEsdGhpcy5pc1ByZXNlbnRpbmc9ITEsdGhpcy5nZXRDb250cm9sbGVyPWZ1bmN0aW9uKCQpe2xldCBlZT15WyRdO3JldHVybiBlZT09PXZvaWQgMCYmKGVlPW5ldyBVaCx5WyRdPWVlKSxlZS5nZXRUYXJnZXRSYXlTcGFjZSgpfSx0aGlzLmdldENvbnRyb2xsZXJHcmlwPWZ1bmN0aW9uKCQpe2xldCBlZT15WyRdO3JldHVybiBlZT09PXZvaWQgMCYmKGVlPW5ldyBVaCx5WyRdPWVlKSxlZS5nZXRHcmlwU3BhY2UoKX0sdGhpcy5nZXRIYW5kPWZ1bmN0aW9uKCQpe2xldCBlZT15WyRdO3JldHVybiBlZT09PXZvaWQgMCYmKGVlPW5ldyBVaCx5WyRdPWVlKSxlZS5nZXRIYW5kU3BhY2UoKX07ZnVuY3Rpb24gTigkKXtjb25zdCBlZT14LmluZGV4T2YoJC5pbnB1dFNvdXJjZSk7aWYoZWU9PT0tMSlyZXR1cm47Y29uc3QgZGU9eVtlZV07ZGUhPT12b2lkIDAmJihkZS51cGRhdGUoJC5pbnB1dFNvdXJjZSwkLmZyYW1lLGN8fGEpLGRlLmRpc3BhdGNoRXZlbnQoe3R5cGU6JC50eXBlLGRhdGE6JC5pbnB1dFNvdXJjZX0pKX1mdW5jdGlvbiBCKCl7aS5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3QiLE4pLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLE4pLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixOKSxpLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNxdWVlemUiLE4pLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZXN0YXJ0IixOKSxpLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNxdWVlemVlbmQiLE4pLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kIixCKSxpLnJlbW92ZUV2ZW50TGlzdGVuZXIoImlucHV0c291cmNlc2NoYW5nZSIsSSk7Zm9yKGxldCAkPTA7JDx5Lmxlbmd0aDskKyspe2NvbnN0IGVlPXhbJF07ZWUhPT1udWxsJiYoeFskXT1udWxsLHlbJF0uZGlzY29ubmVjdChlZSkpfXc9bnVsbCxSPW51bGwsZS5zZXRSZW5kZXJUYXJnZXQoZyksZD1udWxsLGY9bnVsbCx1PW51bGwsaT1udWxsLG09bnVsbCxmZS5zdG9wKCksbi5pc1ByZXNlbnRpbmc9ITEsZS5zZXRQaXhlbFJhdGlvKFMpLGUuc2V0U2l6ZSh2LndpZHRoLHYuaGVpZ2h0LCExKSxuLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9dGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yPWZ1bmN0aW9uKCQpe3M9JCxuLmlzUHJlc2VudGluZz09PSEwJiZjb25zb2xlLndhcm4oIlRIUkVFLldlYlhSTWFuYWdlcjogQ2Fubm90IGNoYW5nZSBmcmFtZWJ1ZmZlciBzY2FsZSB3aGlsZSBwcmVzZW50aW5nLiIpfSx0aGlzLnNldFJlZmVyZW5jZVNwYWNlVHlwZT1mdW5jdGlvbigkKXtvPSQsbi5pc1ByZXNlbnRpbmc9PT0hMCYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgcmVmZXJlbmNlIHNwYWNlIHR5cGUgd2hpbGUgcHJlc2VudGluZy4iKX0sdGhpcy5nZXRSZWZlcmVuY2VTcGFjZT1mdW5jdGlvbigpe3JldHVybiBjfHxhfSx0aGlzLnNldFJlZmVyZW5jZVNwYWNlPWZ1bmN0aW9uKCQpe2M9JH0sdGhpcy5nZXRCYXNlTGF5ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gZiE9PW51bGw/ZjpkfSx0aGlzLmdldEJpbmRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdX0sdGhpcy5nZXRGcmFtZT1mdW5jdGlvbigpe3JldHVybiBwfSx0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gaX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKCQpe3JldHVybiB5cyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYoaT0kLGkhPT1udWxsKXtpZihnPWUuZ2V0UmVuZGVyVGFyZ2V0KCksaS5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLE4pLGkuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLE4pLGkuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixOKSxpLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemUiLE4pLGkuYWRkRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZXN0YXJ0IixOKSxpLmFkZEV2ZW50TGlzdGVuZXIoInNxdWVlemVlbmQiLE4pLGkuYWRkRXZlbnRMaXN0ZW5lcigiZW5kIixCKSxpLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0c291cmNlc2NoYW5nZSIsSSksXy54ckNvbXBhdGlibGUhPT0hMCYmKHlpZWxkIHQubWFrZVhSQ29tcGF0aWJsZSgpKSxTPWUuZ2V0UGl4ZWxSYXRpbygpLGUuZ2V0U2l6ZSh2KSxpLnJlbmRlclN0YXRlLmxheWVycz09PXZvaWQgMHx8ZS5jYXBhYmlsaXRpZXMuaXNXZWJHTDI9PT0hMSl7Y29uc3QgZWU9e2FudGlhbGlhczppLnJlbmRlclN0YXRlLmxheWVycz09PXZvaWQgMD9fLmFudGlhbGlhczohMCxhbHBoYTohMCxkZXB0aDpfLmRlcHRoLHN0ZW5jaWw6Xy5zdGVuY2lsLGZyYW1lYnVmZmVyU2NhbGVGYWN0b3I6c307ZD1uZXcgWFJXZWJHTExheWVyKGksdCxlZSksaS51cGRhdGVSZW5kZXJTdGF0ZSh7YmFzZUxheWVyOmR9KSxlLnNldFBpeGVsUmF0aW8oMSksZS5zZXRTaXplKGQuZnJhbWVidWZmZXJXaWR0aCxkLmZyYW1lYnVmZmVySGVpZ2h0LCExKSxtPW5ldyBMbihkLmZyYW1lYnVmZmVyV2lkdGgsZC5mcmFtZWJ1ZmZlckhlaWdodCx7Zm9ybWF0OmFuLHR5cGU6UW4sY29sb3JTcGFjZTplLm91dHB1dENvbG9yU3BhY2Usc3RlbmNpbEJ1ZmZlcjpfLnN0ZW5jaWx9KX1lbHNle2xldCBlZT1udWxsLGRlPW51bGwsVGU9bnVsbDtfLmRlcHRoJiYoVGU9Xy5zdGVuY2lsP3QuREVQVEgyNF9TVEVOQ0lMODp0LkRFUFRIX0NPTVBPTkVOVDI0LGVlPV8uc3RlbmNpbD96aTpTaSxkZT1fLnN0ZW5jaWw/TWk6am4pO2NvbnN0IGJlPXtjb2xvckZvcm1hdDp0LlJHQkE4LGRlcHRoRm9ybWF0OlRlLHNjYWxlRmFjdG9yOnN9O3U9bmV3IFhSV2ViR0xCaW5kaW5nKGksdCksZj11LmNyZWF0ZVByb2plY3Rpb25MYXllcihiZSksaS51cGRhdGVSZW5kZXJTdGF0ZSh7bGF5ZXJzOltmXX0pLGUuc2V0UGl4ZWxSYXRpbygxKSxlLnNldFNpemUoZi50ZXh0dXJlV2lkdGgsZi50ZXh0dXJlSGVpZ2h0LCExKSxtPW5ldyBMbihmLnRleHR1cmVXaWR0aCxmLnRleHR1cmVIZWlnaHQse2Zvcm1hdDphbix0eXBlOlFuLGRlcHRoVGV4dHVyZTpuZXcgQ2goZi50ZXh0dXJlV2lkdGgsZi50ZXh0dXJlSGVpZ2h0LGRlLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGVlKSxzdGVuY2lsQnVmZmVyOl8uc3RlbmNpbCxjb2xvclNwYWNlOmUub3V0cHV0Q29sb3JTcGFjZSxzYW1wbGVzOl8uYW50aWFsaWFzPzQ6MH0pO2NvbnN0IE9lPWUucHJvcGVydGllcy5nZXQobSk7T2UuX19pZ25vcmVEZXB0aFZhbHVlcz1mLmlnbm9yZURlcHRoVmFsdWVzfW0uaXNYUlJlbmRlclRhcmdldD0hMCx0aGlzLnNldEZvdmVhdGlvbihsKSxjPW51bGwsYT15aWVsZCBpLnJlcXVlc3RSZWZlcmVuY2VTcGFjZShvKSxmZS5zZXRDb250ZXh0KGkpLGZlLnN0YXJ0KCksbi5pc1ByZXNlbnRpbmc9ITAsbi5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9fSl9LHRoaXMuZ2V0RW52aXJvbm1lbnRCbGVuZE1vZGU9ZnVuY3Rpb24oKXtpZihpIT09bnVsbClyZXR1cm4gaS5lbnZpcm9ubWVudEJsZW5kTW9kZX07ZnVuY3Rpb24gSSgkKXtmb3IobGV0IGVlPTA7ZWU8JC5yZW1vdmVkLmxlbmd0aDtlZSsrKXtjb25zdCBkZT0kLnJlbW92ZWRbZWVdLFRlPXguaW5kZXhPZihkZSk7VGU+PTAmJih4W1RlXT1udWxsLHlbVGVdLmRpc2Nvbm5lY3QoZGUpKX1mb3IobGV0IGVlPTA7ZWU8JC5hZGRlZC5sZW5ndGg7ZWUrKyl7Y29uc3QgZGU9JC5hZGRlZFtlZV07bGV0IFRlPXguaW5kZXhPZihkZSk7aWYoVGU9PT0tMSl7Zm9yKGxldCBPZT0wO09lPHkubGVuZ3RoO09lKyspaWYoT2U+PXgubGVuZ3RoKXt4LnB1c2goZGUpLFRlPU9lO2JyZWFrfWVsc2UgaWYoeFtPZV09PT1udWxsKXt4W09lXT1kZSxUZT1PZTticmVha31pZihUZT09PS0xKWJyZWFrfWNvbnN0IGJlPXlbVGVdO2JlJiZiZS5jb25uZWN0KGRlKX19Y29uc3QgVT1uZXcgUCx6PW5ldyBQO2Z1bmN0aW9uIEYoJCxlZSxkZSl7VS5zZXRGcm9tTWF0cml4UG9zaXRpb24oZWUubWF0cml4V29ybGQpLHouc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGRlLm1hdHJpeFdvcmxkKTtjb25zdCBUZT1VLmRpc3RhbmNlVG8oeiksYmU9ZWUucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cyxPZT1kZS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzLEJlPWJlWzE0XS8oYmVbMTBdLTEpLHdlPWJlWzE0XS8oYmVbMTBdKzEpLFBlPShiZVs5XSsxKS9iZVs1XSxEPShiZVs5XS0xKS9iZVs1XSxsZT0oYmVbOF0tMSkvYmVbMF0sSz0oT2VbOF0rMSkvT2VbMF0sdWU9QmUqbGUscmU9QmUqSyxDZT1UZS8oLWxlK0spLFc9Q2UqLWxlO2VlLm1hdHJpeFdvcmxkLmRlY29tcG9zZSgkLnBvc2l0aW9uLCQucXVhdGVybmlvbiwkLnNjYWxlKSwkLnRyYW5zbGF0ZVgoVyksJC50cmFuc2xhdGVaKENlKSwkLm1hdHJpeFdvcmxkLmNvbXBvc2UoJC5wb3NpdGlvbiwkLnF1YXRlcm5pb24sJC5zY2FsZSksJC5tYXRyaXhXb3JsZEludmVyc2UuY29weSgkLm1hdHJpeFdvcmxkKS5pbnZlcnQoKTtjb25zdCBKPUJlK0NlLGllPXdlK0NlLG1lPXVlLVcscGU9cmUrKFRlLVcpLEM9UGUqd2UvaWUqSixFPUQqd2UvaWUqSjskLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKG1lLHBlLEMsRSxKLGllKSwkLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoJC5wcm9qZWN0aW9uTWF0cml4KS5pbnZlcnQoKX1mdW5jdGlvbiBaKCQsZWUpe2VlPT09bnVsbD8kLm1hdHJpeFdvcmxkLmNvcHkoJC5tYXRyaXgpOiQubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyhlZS5tYXRyaXhXb3JsZCwkLm1hdHJpeCksJC5tYXRyaXhXb3JsZEludmVyc2UuY29weSgkLm1hdHJpeFdvcmxkKS5pbnZlcnQoKX10aGlzLnVwZGF0ZUNhbWVyYT1mdW5jdGlvbigkKXtpZihpPT09bnVsbClyZXR1cm47TS5uZWFyPUEubmVhcj1iLm5lYXI9JC5uZWFyLE0uZmFyPUEuZmFyPWIuZmFyPSQuZmFyLCh3IT09TS5uZWFyfHxSIT09TS5mYXIpJiYoaS51cGRhdGVSZW5kZXJTdGF0ZSh7ZGVwdGhOZWFyOk0ubmVhcixkZXB0aEZhcjpNLmZhcn0pLHc9TS5uZWFyLFI9TS5mYXIpO2NvbnN0IGVlPSQucGFyZW50LGRlPU0uY2FtZXJhcztaKE0sZWUpO2ZvcihsZXQgVGU9MDtUZTxkZS5sZW5ndGg7VGUrKylaKGRlW1RlXSxlZSk7ZGUubGVuZ3RoPT09Mj9GKE0sYixBKTpNLnByb2plY3Rpb25NYXRyaXguY29weShiLnByb2plY3Rpb25NYXRyaXgpLFYoJCxNLGVlKX07ZnVuY3Rpb24gVigkLGVlLGRlKXtkZT09PW51bGw/JC5tYXRyaXguY29weShlZS5tYXRyaXhXb3JsZCk6KCQubWF0cml4LmNvcHkoZGUubWF0cml4V29ybGQpLCQubWF0cml4LmludmVydCgpLCQubWF0cml4Lm11bHRpcGx5KGVlLm1hdHJpeFdvcmxkKSksJC5tYXRyaXguZGVjb21wb3NlKCQucG9zaXRpb24sJC5xdWF0ZXJuaW9uLCQuc2NhbGUpLCQudXBkYXRlTWF0cml4V29ybGQoITApLCQucHJvamVjdGlvbk1hdHJpeC5jb3B5KGVlLnByb2plY3Rpb25NYXRyaXgpLCQucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShlZS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSksJC5pc1BlcnNwZWN0aXZlQ2FtZXJhJiYoJC5mb3Y9QXIqMipNYXRoLmF0YW4oMS8kLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbNV0pLCQuem9vbT0xKX10aGlzLmdldENhbWVyYT1mdW5jdGlvbigpe3JldHVybiBNfSx0aGlzLmdldEZvdmVhdGlvbj1mdW5jdGlvbigpe2lmKCEoZj09PW51bGwmJmQ9PT1udWxsKSlyZXR1cm4gbH0sdGhpcy5zZXRGb3ZlYXRpb249ZnVuY3Rpb24oJCl7bD0kLGYhPT1udWxsJiYoZi5maXhlZEZvdmVhdGlvbj0kKSxkIT09bnVsbCYmZC5maXhlZEZvdmVhdGlvbiE9PXZvaWQgMCYmKGQuZml4ZWRGb3ZlYXRpb249JCl9O2xldCBRPW51bGw7ZnVuY3Rpb24gbmUoJCxlZSl7aWYoaD1lZS5nZXRWaWV3ZXJQb3NlKGN8fGEpLHA9ZWUsaCE9PW51bGwpe2NvbnN0IGRlPWgudmlld3M7ZCE9PW51bGwmJihlLnNldFJlbmRlclRhcmdldEZyYW1lYnVmZmVyKG0sZC5mcmFtZWJ1ZmZlciksZS5zZXRSZW5kZXJUYXJnZXQobSkpO2xldCBUZT0hMTtkZS5sZW5ndGghPT1NLmNhbWVyYXMubGVuZ3RoJiYoTS5jYW1lcmFzLmxlbmd0aD0wLFRlPSEwKTtmb3IobGV0IGJlPTA7YmU8ZGUubGVuZ3RoO2JlKyspe2NvbnN0IE9lPWRlW2JlXTtsZXQgQmU9bnVsbDtpZihkIT09bnVsbClCZT1kLmdldFZpZXdwb3J0KE9lKTtlbHNle2NvbnN0IFBlPXUuZ2V0Vmlld1N1YkltYWdlKGYsT2UpO0JlPVBlLnZpZXdwb3J0LGJlPT09MCYmKGUuc2V0UmVuZGVyVGFyZ2V0VGV4dHVyZXMobSxQZS5jb2xvclRleHR1cmUsZi5pZ25vcmVEZXB0aFZhbHVlcz92b2lkIDA6UGUuZGVwdGhTdGVuY2lsVGV4dHVyZSksZS5zZXRSZW5kZXJUYXJnZXQobSkpfWxldCB3ZT1MW2JlXTt3ZT09PXZvaWQgMCYmKHdlPW5ldyBCdCx3ZS5sYXllcnMuZW5hYmxlKGJlKSx3ZS52aWV3cG9ydD1uZXcgbHQsTFtiZV09d2UpLHdlLm1hdHJpeC5mcm9tQXJyYXkoT2UudHJhbnNmb3JtLm1hdHJpeCksd2UubWF0cml4LmRlY29tcG9zZSh3ZS5wb3NpdGlvbix3ZS5xdWF0ZXJuaW9uLHdlLnNjYWxlKSx3ZS5wcm9qZWN0aW9uTWF0cml4LmZyb21BcnJheShPZS5wcm9qZWN0aW9uTWF0cml4KSx3ZS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHdlLnByb2plY3Rpb25NYXRyaXgpLmludmVydCgpLHdlLnZpZXdwb3J0LnNldChCZS54LEJlLnksQmUud2lkdGgsQmUuaGVpZ2h0KSxiZT09PTAmJihNLm1hdHJpeC5jb3B5KHdlLm1hdHJpeCksTS5tYXRyaXguZGVjb21wb3NlKE0ucG9zaXRpb24sTS5xdWF0ZXJuaW9uLE0uc2NhbGUpKSxUZT09PSEwJiZNLmNhbWVyYXMucHVzaCh3ZSl9fWZvcihsZXQgZGU9MDtkZTx5Lmxlbmd0aDtkZSsrKXtjb25zdCBUZT14W2RlXSxiZT15W2RlXTtUZSE9PW51bGwmJmJlIT09dm9pZCAwJiZiZS51cGRhdGUoVGUsZWUsY3x8YSl9USYmUSgkLGVlKSxlZS5kZXRlY3RlZFBsYW5lcyYmbi5kaXNwYXRjaEV2ZW50KHt0eXBlOiJwbGFuZXNkZXRlY3RlZCIsZGF0YTplZX0pLHA9bnVsbH1jb25zdCBmZT1uZXcgWWQ7ZmUuc2V0QW5pbWF0aW9uTG9vcChuZSksdGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKCQpe1E9JH0sdGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7fX19ZnVuY3Rpb24gRVMocixlKXtmdW5jdGlvbiB0KGcsbSl7Zy5tYXRyaXhBdXRvVXBkYXRlPT09ITAmJmcudXBkYXRlTWF0cml4KCksbS52YWx1ZS5jb3B5KGcubWF0cml4KX1mdW5jdGlvbiBuKGcsbSl7bS5jb2xvci5nZXRSR0IoZy5mb2dDb2xvci52YWx1ZSxXZChyKSksbS5pc0ZvZz8oZy5mb2dOZWFyLnZhbHVlPW0ubmVhcixnLmZvZ0Zhci52YWx1ZT1tLmZhcik6bS5pc0ZvZ0V4cDImJihnLmZvZ0RlbnNpdHkudmFsdWU9bS5kZW5zaXR5KX1mdW5jdGlvbiBpKGcsbSx5LHgsdil7bS5pc01lc2hCYXNpY01hdGVyaWFsfHxtLmlzTWVzaExhbWJlcnRNYXRlcmlhbD9zKGcsbSk6bS5pc01lc2hUb29uTWF0ZXJpYWw/KHMoZyxtKSx1KGcsbSkpOm0uaXNNZXNoUGhvbmdNYXRlcmlhbD8ocyhnLG0pLGgoZyxtKSk6bS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsPyhzKGcsbSksZihnLG0pLG0uaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCYmZChnLG0sdikpOm0uaXNNZXNoTWF0Y2FwTWF0ZXJpYWw/KHMoZyxtKSxwKGcsbSkpOm0uaXNNZXNoRGVwdGhNYXRlcmlhbD9zKGcsbSk6bS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPyhzKGcsbSksXyhnLG0pKTptLmlzTWVzaE5vcm1hbE1hdGVyaWFsP3MoZyxtKTptLmlzTGluZUJhc2ljTWF0ZXJpYWw/KGEoZyxtKSxtLmlzTGluZURhc2hlZE1hdGVyaWFsJiZvKGcsbSkpOm0uaXNQb2ludHNNYXRlcmlhbD9sKGcsbSx5LHgpOm0uaXNTcHJpdGVNYXRlcmlhbD9jKGcsbSk6bS5pc1NoYWRvd01hdGVyaWFsPyhnLmNvbG9yLnZhbHVlLmNvcHkobS5jb2xvciksZy5vcGFjaXR5LnZhbHVlPW0ub3BhY2l0eSk6bS5pc1NoYWRlck1hdGVyaWFsJiYobS51bmlmb3Jtc05lZWRVcGRhdGU9ITEpfWZ1bmN0aW9uIHMoZyxtKXtnLm9wYWNpdHkudmFsdWU9bS5vcGFjaXR5LG0uY29sb3ImJmcuZGlmZnVzZS52YWx1ZS5jb3B5KG0uY29sb3IpLG0uZW1pc3NpdmUmJmcuZW1pc3NpdmUudmFsdWUuY29weShtLmVtaXNzaXZlKS5tdWx0aXBseVNjYWxhcihtLmVtaXNzaXZlSW50ZW5zaXR5KSxtLm1hcCYmKGcubWFwLnZhbHVlPW0ubWFwLHQobS5tYXAsZy5tYXBUcmFuc2Zvcm0pKSxtLmFscGhhTWFwJiYoZy5hbHBoYU1hcC52YWx1ZT1tLmFscGhhTWFwLHQobS5hbHBoYU1hcCxnLmFscGhhTWFwVHJhbnNmb3JtKSksbS5idW1wTWFwJiYoZy5idW1wTWFwLnZhbHVlPW0uYnVtcE1hcCx0KG0uYnVtcE1hcCxnLmJ1bXBNYXBUcmFuc2Zvcm0pLGcuYnVtcFNjYWxlLnZhbHVlPW0uYnVtcFNjYWxlLG0uc2lkZT09PVl0JiYoZy5idW1wU2NhbGUudmFsdWUqPS0xKSksbS5ub3JtYWxNYXAmJihnLm5vcm1hbE1hcC52YWx1ZT1tLm5vcm1hbE1hcCx0KG0ubm9ybWFsTWFwLGcubm9ybWFsTWFwVHJhbnNmb3JtKSxnLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkobS5ub3JtYWxTY2FsZSksbS5zaWRlPT09WXQmJmcubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpLG0uZGlzcGxhY2VtZW50TWFwJiYoZy5kaXNwbGFjZW1lbnRNYXAudmFsdWU9bS5kaXNwbGFjZW1lbnRNYXAsdChtLmRpc3BsYWNlbWVudE1hcCxnLmRpc3BsYWNlbWVudE1hcFRyYW5zZm9ybSksZy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1tLmRpc3BsYWNlbWVudFNjYWxlLGcuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1tLmRpc3BsYWNlbWVudEJpYXMpLG0uZW1pc3NpdmVNYXAmJihnLmVtaXNzaXZlTWFwLnZhbHVlPW0uZW1pc3NpdmVNYXAsdChtLmVtaXNzaXZlTWFwLGcuZW1pc3NpdmVNYXBUcmFuc2Zvcm0pKSxtLnNwZWN1bGFyTWFwJiYoZy5zcGVjdWxhck1hcC52YWx1ZT1tLnNwZWN1bGFyTWFwLHQobS5zcGVjdWxhck1hcCxnLnNwZWN1bGFyTWFwVHJhbnNmb3JtKSksbS5hbHBoYVRlc3Q+MCYmKGcuYWxwaGFUZXN0LnZhbHVlPW0uYWxwaGFUZXN0KTtjb25zdCB5PWUuZ2V0KG0pLmVudk1hcDtpZih5JiYoZy5lbnZNYXAudmFsdWU9eSxnLmZsaXBFbnZNYXAudmFsdWU9eS5pc0N1YmVUZXh0dXJlJiZ5LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT09PSExPy0xOjEsZy5yZWZsZWN0aXZpdHkudmFsdWU9bS5yZWZsZWN0aXZpdHksZy5pb3IudmFsdWU9bS5pb3IsZy5yZWZyYWN0aW9uUmF0aW8udmFsdWU9bS5yZWZyYWN0aW9uUmF0aW8pLG0ubGlnaHRNYXApe2cubGlnaHRNYXAudmFsdWU9bS5saWdodE1hcDtjb25zdCB4PXIuX3VzZUxlZ2FjeUxpZ2h0cz09PSEwP01hdGguUEk6MTtnLmxpZ2h0TWFwSW50ZW5zaXR5LnZhbHVlPW0ubGlnaHRNYXBJbnRlbnNpdHkqeCx0KG0ubGlnaHRNYXAsZy5saWdodE1hcFRyYW5zZm9ybSl9bS5hb01hcCYmKGcuYW9NYXAudmFsdWU9bS5hb01hcCxnLmFvTWFwSW50ZW5zaXR5LnZhbHVlPW0uYW9NYXBJbnRlbnNpdHksdChtLmFvTWFwLGcuYW9NYXBUcmFuc2Zvcm0pKX1mdW5jdGlvbiBhKGcsbSl7Zy5kaWZmdXNlLnZhbHVlLmNvcHkobS5jb2xvciksZy5vcGFjaXR5LnZhbHVlPW0ub3BhY2l0eSxtLm1hcCYmKGcubWFwLnZhbHVlPW0ubWFwLHQobS5tYXAsZy5tYXBUcmFuc2Zvcm0pKX1mdW5jdGlvbiBvKGcsbSl7Zy5kYXNoU2l6ZS52YWx1ZT1tLmRhc2hTaXplLGcudG90YWxTaXplLnZhbHVlPW0uZGFzaFNpemUrbS5nYXBTaXplLGcuc2NhbGUudmFsdWU9bS5zY2FsZX1mdW5jdGlvbiBsKGcsbSx5LHgpe2cuZGlmZnVzZS52YWx1ZS5jb3B5KG0uY29sb3IpLGcub3BhY2l0eS52YWx1ZT1tLm9wYWNpdHksZy5zaXplLnZhbHVlPW0uc2l6ZSp5LGcuc2NhbGUudmFsdWU9eCouNSxtLm1hcCYmKGcubWFwLnZhbHVlPW0ubWFwLHQobS5tYXAsZy51dlRyYW5zZm9ybSkpLG0uYWxwaGFNYXAmJihnLmFscGhhTWFwLnZhbHVlPW0uYWxwaGFNYXAsdChtLmFscGhhTWFwLGcuYWxwaGFNYXBUcmFuc2Zvcm0pKSxtLmFscGhhVGVzdD4wJiYoZy5hbHBoYVRlc3QudmFsdWU9bS5hbHBoYVRlc3QpfWZ1bmN0aW9uIGMoZyxtKXtnLmRpZmZ1c2UudmFsdWUuY29weShtLmNvbG9yKSxnLm9wYWNpdHkudmFsdWU9bS5vcGFjaXR5LGcucm90YXRpb24udmFsdWU9bS5yb3RhdGlvbixtLm1hcCYmKGcubWFwLnZhbHVlPW0ubWFwLHQobS5tYXAsZy5tYXBUcmFuc2Zvcm0pKSxtLmFscGhhTWFwJiYoZy5hbHBoYU1hcC52YWx1ZT1tLmFscGhhTWFwLHQobS5hbHBoYU1hcCxnLmFscGhhTWFwVHJhbnNmb3JtKSksbS5hbHBoYVRlc3Q+MCYmKGcuYWxwaGFUZXN0LnZhbHVlPW0uYWxwaGFUZXN0KX1mdW5jdGlvbiBoKGcsbSl7Zy5zcGVjdWxhci52YWx1ZS5jb3B5KG0uc3BlY3VsYXIpLGcuc2hpbmluZXNzLnZhbHVlPU1hdGgubWF4KG0uc2hpbmluZXNzLDFlLTQpfWZ1bmN0aW9uIHUoZyxtKXttLmdyYWRpZW50TWFwJiYoZy5ncmFkaWVudE1hcC52YWx1ZT1tLmdyYWRpZW50TWFwKX1mdW5jdGlvbiBmKGcsbSl7Zy5tZXRhbG5lc3MudmFsdWU9bS5tZXRhbG5lc3MsbS5tZXRhbG5lc3NNYXAmJihnLm1ldGFsbmVzc01hcC52YWx1ZT1tLm1ldGFsbmVzc01hcCx0KG0ubWV0YWxuZXNzTWFwLGcubWV0YWxuZXNzTWFwVHJhbnNmb3JtKSksZy5yb3VnaG5lc3MudmFsdWU9bS5yb3VnaG5lc3MsbS5yb3VnaG5lc3NNYXAmJihnLnJvdWdobmVzc01hcC52YWx1ZT1tLnJvdWdobmVzc01hcCx0KG0ucm91Z2huZXNzTWFwLGcucm91Z2huZXNzTWFwVHJhbnNmb3JtKSksZS5nZXQobSkuZW52TWFwJiYoZy5lbnZNYXBJbnRlbnNpdHkudmFsdWU9bS5lbnZNYXBJbnRlbnNpdHkpfWZ1bmN0aW9uIGQoZyxtLHkpe2cuaW9yLnZhbHVlPW0uaW9yLG0uc2hlZW4+MCYmKGcuc2hlZW5Db2xvci52YWx1ZS5jb3B5KG0uc2hlZW5Db2xvcikubXVsdGlwbHlTY2FsYXIobS5zaGVlbiksZy5zaGVlblJvdWdobmVzcy52YWx1ZT1tLnNoZWVuUm91Z2huZXNzLG0uc2hlZW5Db2xvck1hcCYmKGcuc2hlZW5Db2xvck1hcC52YWx1ZT1tLnNoZWVuQ29sb3JNYXAsdChtLnNoZWVuQ29sb3JNYXAsZy5zaGVlbkNvbG9yTWFwVHJhbnNmb3JtKSksbS5zaGVlblJvdWdobmVzc01hcCYmKGcuc2hlZW5Sb3VnaG5lc3NNYXAudmFsdWU9bS5zaGVlblJvdWdobmVzc01hcCx0KG0uc2hlZW5Sb3VnaG5lc3NNYXAsZy5zaGVlblJvdWdobmVzc01hcFRyYW5zZm9ybSkpKSxtLmNsZWFyY29hdD4wJiYoZy5jbGVhcmNvYXQudmFsdWU9bS5jbGVhcmNvYXQsZy5jbGVhcmNvYXRSb3VnaG5lc3MudmFsdWU9bS5jbGVhcmNvYXRSb3VnaG5lc3MsbS5jbGVhcmNvYXRNYXAmJihnLmNsZWFyY29hdE1hcC52YWx1ZT1tLmNsZWFyY29hdE1hcCx0KG0uY2xlYXJjb2F0TWFwLGcuY2xlYXJjb2F0TWFwVHJhbnNmb3JtKSksbS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJihnLmNsZWFyY29hdFJvdWdobmVzc01hcC52YWx1ZT1tLmNsZWFyY29hdFJvdWdobmVzc01hcCx0KG0uY2xlYXJjb2F0Um91Z2huZXNzTWFwLGcuY2xlYXJjb2F0Um91Z2huZXNzTWFwVHJhbnNmb3JtKSksbS5jbGVhcmNvYXROb3JtYWxNYXAmJihnLmNsZWFyY29hdE5vcm1hbE1hcC52YWx1ZT1tLmNsZWFyY29hdE5vcm1hbE1hcCx0KG0uY2xlYXJjb2F0Tm9ybWFsTWFwLGcuY2xlYXJjb2F0Tm9ybWFsTWFwVHJhbnNmb3JtKSxnLmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLmNvcHkobS5jbGVhcmNvYXROb3JtYWxTY2FsZSksbS5zaWRlPT09WXQmJmcuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpKSxtLmlyaWRlc2NlbmNlPjAmJihnLmlyaWRlc2NlbmNlLnZhbHVlPW0uaXJpZGVzY2VuY2UsZy5pcmlkZXNjZW5jZUlPUi52YWx1ZT1tLmlyaWRlc2NlbmNlSU9SLGcuaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtLnZhbHVlPW0uaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZVswXSxnLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bS52YWx1ZT1tLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2VbMV0sbS5pcmlkZXNjZW5jZU1hcCYmKGcuaXJpZGVzY2VuY2VNYXAudmFsdWU9bS5pcmlkZXNjZW5jZU1hcCx0KG0uaXJpZGVzY2VuY2VNYXAsZy5pcmlkZXNjZW5jZU1hcFRyYW5zZm9ybSkpLG0uaXJpZGVzY2VuY2VUaGlja25lc3NNYXAmJihnLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnZhbHVlPW0uaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsdChtLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLGcuaXJpZGVzY2VuY2VUaGlja25lc3NNYXBUcmFuc2Zvcm0pKSksbS50cmFuc21pc3Npb24+MCYmKGcudHJhbnNtaXNzaW9uLnZhbHVlPW0udHJhbnNtaXNzaW9uLGcudHJhbnNtaXNzaW9uU2FtcGxlck1hcC52YWx1ZT15LnRleHR1cmUsZy50cmFuc21pc3Npb25TYW1wbGVyU2l6ZS52YWx1ZS5zZXQoeS53aWR0aCx5LmhlaWdodCksbS50cmFuc21pc3Npb25NYXAmJihnLnRyYW5zbWlzc2lvbk1hcC52YWx1ZT1tLnRyYW5zbWlzc2lvbk1hcCx0KG0udHJhbnNtaXNzaW9uTWFwLGcudHJhbnNtaXNzaW9uTWFwVHJhbnNmb3JtKSksZy50aGlja25lc3MudmFsdWU9bS50aGlja25lc3MsbS50aGlja25lc3NNYXAmJihnLnRoaWNrbmVzc01hcC52YWx1ZT1tLnRoaWNrbmVzc01hcCx0KG0udGhpY2tuZXNzTWFwLGcudGhpY2tuZXNzTWFwVHJhbnNmb3JtKSksZy5hdHRlbnVhdGlvbkRpc3RhbmNlLnZhbHVlPW0uYXR0ZW51YXRpb25EaXN0YW5jZSxnLmF0dGVudWF0aW9uQ29sb3IudmFsdWUuY29weShtLmF0dGVudWF0aW9uQ29sb3IpKSxtLmFuaXNvdHJvcHk+MCYmKGcuYW5pc290cm9weVZlY3Rvci52YWx1ZS5zZXQobS5hbmlzb3Ryb3B5Kk1hdGguY29zKG0uYW5pc290cm9weVJvdGF0aW9uKSxtLmFuaXNvdHJvcHkqTWF0aC5zaW4obS5hbmlzb3Ryb3B5Um90YXRpb24pKSxtLmFuaXNvdHJvcHlNYXAmJihnLmFuaXNvdHJvcHlNYXAudmFsdWU9bS5hbmlzb3Ryb3B5TWFwLHQobS5hbmlzb3Ryb3B5TWFwLGcuYW5pc290cm9weU1hcFRyYW5zZm9ybSkpKSxnLnNwZWN1bGFySW50ZW5zaXR5LnZhbHVlPW0uc3BlY3VsYXJJbnRlbnNpdHksZy5zcGVjdWxhckNvbG9yLnZhbHVlLmNvcHkobS5zcGVjdWxhckNvbG9yKSxtLnNwZWN1bGFyQ29sb3JNYXAmJihnLnNwZWN1bGFyQ29sb3JNYXAudmFsdWU9bS5zcGVjdWxhckNvbG9yTWFwLHQobS5zcGVjdWxhckNvbG9yTWFwLGcuc3BlY3VsYXJDb2xvck1hcFRyYW5zZm9ybSkpLG0uc3BlY3VsYXJJbnRlbnNpdHlNYXAmJihnLnNwZWN1bGFySW50ZW5zaXR5TWFwLnZhbHVlPW0uc3BlY3VsYXJJbnRlbnNpdHlNYXAsdChtLnNwZWN1bGFySW50ZW5zaXR5TWFwLGcuc3BlY3VsYXJJbnRlbnNpdHlNYXBUcmFuc2Zvcm0pKX1mdW5jdGlvbiBwKGcsbSl7bS5tYXRjYXAmJihnLm1hdGNhcC52YWx1ZT1tLm1hdGNhcCl9ZnVuY3Rpb24gXyhnLG0pe2NvbnN0IHk9ZS5nZXQobSkubGlnaHQ7Zy5yZWZlcmVuY2VQb3NpdGlvbi52YWx1ZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oeS5tYXRyaXhXb3JsZCksZy5uZWFyRGlzdGFuY2UudmFsdWU9eS5zaGFkb3cuY2FtZXJhLm5lYXIsZy5mYXJEaXN0YW5jZS52YWx1ZT15LnNoYWRvdy5jYW1lcmEuZmFyfXJldHVybntyZWZyZXNoRm9nVW5pZm9ybXM6bixyZWZyZXNoTWF0ZXJpYWxVbmlmb3JtczppfX1mdW5jdGlvbiBBUyhyLGUsdCxuKXtsZXQgaT17fSxzPXt9LGE9W107Y29uc3Qgbz10LmlzV2ViR0wyP3IuZ2V0UGFyYW1ldGVyKHIuTUFYX1VOSUZPUk1fQlVGRkVSX0JJTkRJTkdTKTowO2Z1bmN0aW9uIGwoeSx4KXtjb25zdCB2PXgucHJvZ3JhbTtuLnVuaWZvcm1CbG9ja0JpbmRpbmcoeSx2KX1mdW5jdGlvbiBjKHkseCl7bGV0IHY9aVt5LmlkXTt2PT09dm9pZCAwJiYocCh5KSx2PWgoeSksaVt5LmlkXT12LHkuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZykpO2NvbnN0IFM9eC5wcm9ncmFtO24udXBkYXRlVUJPTWFwcGluZyh5LFMpO2NvbnN0IGI9ZS5yZW5kZXIuZnJhbWU7c1t5LmlkXSE9PWImJihmKHkpLHNbeS5pZF09Yil9ZnVuY3Rpb24gaCh5KXtjb25zdCB4PXUoKTt5Ll9fYmluZGluZ1BvaW50SW5kZXg9eDtjb25zdCB2PXIuY3JlYXRlQnVmZmVyKCksUz15Ll9fc2l6ZSxiPXkudXNhZ2U7cmV0dXJuIHIuYmluZEJ1ZmZlcihyLlVOSUZPUk1fQlVGRkVSLHYpLHIuYnVmZmVyRGF0YShyLlVOSUZPUk1fQlVGRkVSLFMsYiksci5iaW5kQnVmZmVyKHIuVU5JRk9STV9CVUZGRVIsbnVsbCksci5iaW5kQnVmZmVyQmFzZShyLlVOSUZPUk1fQlVGRkVSLHgsdiksdn1mdW5jdGlvbiB1KCl7Zm9yKGxldCB5PTA7eTxvO3krKylpZihhLmluZGV4T2YoeSk9PT0tMSlyZXR1cm4gYS5wdXNoKHkpLHk7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6IE1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91c2x5IHVzYWJsZSB1bmlmb3JtcyBncm91cHMgcmVhY2hlZC4iKSwwfWZ1bmN0aW9uIGYoeSl7Y29uc3QgeD1pW3kuaWRdLHY9eS51bmlmb3JtcyxTPXkuX19jYWNoZTtyLmJpbmRCdWZmZXIoci5VTklGT1JNX0JVRkZFUix4KTtmb3IobGV0IGI9MCxBPXYubGVuZ3RoO2I8QTtiKyspe2NvbnN0IEw9dltiXTtpZihkKEwsYixTKT09PSEwKXtjb25zdCBNPUwuX19vZmZzZXQsdz1BcnJheS5pc0FycmF5KEwudmFsdWUpP0wudmFsdWU6W0wudmFsdWVdO2xldCBSPTA7Zm9yKGxldCBOPTA7Tjx3Lmxlbmd0aDtOKyspe2NvbnN0IEI9d1tOXSxJPV8oQik7dHlwZW9mIEI9PSJudW1iZXIiPyhMLl9fZGF0YVswXT1CLHIuYnVmZmVyU3ViRGF0YShyLlVOSUZPUk1fQlVGRkVSLE0rUixMLl9fZGF0YSkpOkIuaXNNYXRyaXgzPyhMLl9fZGF0YVswXT1CLmVsZW1lbnRzWzBdLEwuX19kYXRhWzFdPUIuZWxlbWVudHNbMV0sTC5fX2RhdGFbMl09Qi5lbGVtZW50c1syXSxMLl9fZGF0YVszXT1CLmVsZW1lbnRzWzBdLEwuX19kYXRhWzRdPUIuZWxlbWVudHNbM10sTC5fX2RhdGFbNV09Qi5lbGVtZW50c1s0XSxMLl9fZGF0YVs2XT1CLmVsZW1lbnRzWzVdLEwuX19kYXRhWzddPUIuZWxlbWVudHNbMF0sTC5fX2RhdGFbOF09Qi5lbGVtZW50c1s2XSxMLl9fZGF0YVs5XT1CLmVsZW1lbnRzWzddLEwuX19kYXRhWzEwXT1CLmVsZW1lbnRzWzhdLEwuX19kYXRhWzExXT1CLmVsZW1lbnRzWzBdKTooQi50b0FycmF5KEwuX19kYXRhLFIpLFIrPUkuc3RvcmFnZS9GbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpfXIuYnVmZmVyU3ViRGF0YShyLlVOSUZPUk1fQlVGRkVSLE0sTC5fX2RhdGEpfX1yLmJpbmRCdWZmZXIoci5VTklGT1JNX0JVRkZFUixudWxsKX1mdW5jdGlvbiBkKHkseCx2KXtjb25zdCBTPXkudmFsdWU7aWYodlt4XT09PXZvaWQgMCl7aWYodHlwZW9mIFM9PSJudW1iZXIiKXZbeF09UztlbHNle2NvbnN0IGI9QXJyYXkuaXNBcnJheShTKT9TOltTXSxBPVtdO2ZvcihsZXQgTD0wO0w8Yi5sZW5ndGg7TCsrKUEucHVzaChiW0xdLmNsb25lKCkpO3ZbeF09QX1yZXR1cm4hMH1lbHNlIGlmKHR5cGVvZiBTPT0ibnVtYmVyIil7aWYodlt4XSE9PVMpcmV0dXJuIHZbeF09UywhMH1lbHNle2NvbnN0IGI9QXJyYXkuaXNBcnJheSh2W3hdKT92W3hdOlt2W3hdXSxBPUFycmF5LmlzQXJyYXkoUyk/UzpbU107Zm9yKGxldCBMPTA7TDxiLmxlbmd0aDtMKyspe2NvbnN0IE09YltMXTtpZihNLmVxdWFscyhBW0xdKT09PSExKXJldHVybiBNLmNvcHkoQVtMXSksITB9fXJldHVybiExfWZ1bmN0aW9uIHAoeSl7Y29uc3QgeD15LnVuaWZvcm1zO2xldCB2PTA7Y29uc3QgUz0xNjtsZXQgYj0wO2ZvcihsZXQgQT0wLEw9eC5sZW5ndGg7QTxMO0ErKyl7Y29uc3QgTT14W0FdLHc9e2JvdW5kYXJ5OjAsc3RvcmFnZTowfSxSPUFycmF5LmlzQXJyYXkoTS52YWx1ZSk/TS52YWx1ZTpbTS52YWx1ZV07Zm9yKGxldCBOPTAsQj1SLmxlbmd0aDtOPEI7TisrKXtjb25zdCBJPVJbTl0sVT1fKEkpO3cuYm91bmRhcnkrPVUuYm91bmRhcnksdy5zdG9yYWdlKz1VLnN0b3JhZ2V9aWYoTS5fX2RhdGE9bmV3IEZsb2F0MzJBcnJheSh3LnN0b3JhZ2UvRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UKSxNLl9fb2Zmc2V0PXYsQT4wKXtiPXYlUztjb25zdCBOPVMtYjtiIT09MCYmTi13LmJvdW5kYXJ5PDAmJih2Kz1TLWIsTS5fX29mZnNldD12KX12Kz13LnN0b3JhZ2V9cmV0dXJuIGI9diVTLGI+MCYmKHYrPVMtYikseS5fX3NpemU9dix5Ll9fY2FjaGU9e30sdGhpc31mdW5jdGlvbiBfKHkpe2NvbnN0IHg9e2JvdW5kYXJ5OjAsc3RvcmFnZTowfTtyZXR1cm4gdHlwZW9mIHk9PSJudW1iZXIiPyh4LmJvdW5kYXJ5PTQseC5zdG9yYWdlPTQpOnkuaXNWZWN0b3IyPyh4LmJvdW5kYXJ5PTgseC5zdG9yYWdlPTgpOnkuaXNWZWN0b3IzfHx5LmlzQ29sb3I/KHguYm91bmRhcnk9MTYseC5zdG9yYWdlPTEyKTp5LmlzVmVjdG9yND8oeC5ib3VuZGFyeT0xNix4LnN0b3JhZ2U9MTYpOnkuaXNNYXRyaXgzPyh4LmJvdW5kYXJ5PTQ4LHguc3RvcmFnZT00OCk6eS5pc01hdHJpeDQ/KHguYm91bmRhcnk9NjQseC5zdG9yYWdlPTY0KTp5LmlzVGV4dHVyZT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgc2FtcGxlcnMgY2FuIG5vdCBiZSBwYXJ0IG9mIGFuIHVuaWZvcm1zIGdyb3VwLiIpOmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVW5zdXBwb3J0ZWQgdW5pZm9ybSB2YWx1ZSB0eXBlLiIseSkseH1mdW5jdGlvbiBnKHkpe2NvbnN0IHg9eS50YXJnZXQ7eC5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixnKTtjb25zdCB2PWEuaW5kZXhPZih4Ll9fYmluZGluZ1BvaW50SW5kZXgpO2Euc3BsaWNlKHYsMSksci5kZWxldGVCdWZmZXIoaVt4LmlkXSksZGVsZXRlIGlbeC5pZF0sZGVsZXRlIHNbeC5pZF19ZnVuY3Rpb24gbSgpe2Zvcihjb25zdCB5IGluIGkpci5kZWxldGVCdWZmZXIoaVt5XSk7YT1bXSxpPXt9LHM9e319cmV0dXJue2JpbmQ6bCx1cGRhdGU6YyxkaXNwb3NlOm19fWNsYXNzIGJwe2NvbnN0cnVjdG9yKGU9e30pe2NvbnN0e2NhbnZhczp0PUVkKCksY29udGV4dDpuPW51bGwsZGVwdGg6aT0hMCxzdGVuY2lsOnM9ITAsYWxwaGE6YT0hMSxhbnRpYWxpYXM6bz0hMSxwcmVtdWx0aXBsaWVkQWxwaGE6bD0hMCxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6Yz0hMSxwb3dlclByZWZlcmVuY2U6aD0iZGVmYXVsdCIsZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDp1PSExfT1lO3RoaXMuaXNXZWJHTFJlbmRlcmVyPSEwO2xldCBmO24hPT1udWxsP2Y9bi5nZXRDb250ZXh0QXR0cmlidXRlcygpLmFscGhhOmY9YTtjb25zdCBkPW5ldyBVaW50MzJBcnJheSg0KSxwPW5ldyBJbnQzMkFycmF5KDQpO2xldCBfPW51bGwsZz1udWxsO2NvbnN0IG09W10seT1bXTt0aGlzLmRvbUVsZW1lbnQ9dCx0aGlzLmRlYnVnPXtjaGVja1NoYWRlckVycm9yczohMCxvblNoYWRlckVycm9yOm51bGx9LHRoaXMuYXV0b0NsZWFyPSEwLHRoaXMuYXV0b0NsZWFyQ29sb3I9ITAsdGhpcy5hdXRvQ2xlYXJEZXB0aD0hMCx0aGlzLmF1dG9DbGVhclN0ZW5jaWw9ITAsdGhpcy5zb3J0T2JqZWN0cz0hMCx0aGlzLmNsaXBwaW5nUGxhbmVzPVtdLHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQ9ITEsdGhpcy5fb3V0cHV0Q29sb3JTcGFjZT1QdCx0aGlzLl91c2VMZWdhY3lMaWdodHM9ITEsdGhpcy50b25lTWFwcGluZz1Kbix0aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmU9MTtjb25zdCB4PXRoaXM7bGV0IHY9ITEsUz0wLGI9MCxBPW51bGwsTD0tMSxNPW51bGw7Y29uc3Qgdz1uZXcgbHQsUj1uZXcgbHQ7bGV0IE49bnVsbDtjb25zdCBCPW5ldyB5ZSgwKTtsZXQgST0wLFU9dC53aWR0aCx6PXQuaGVpZ2h0LEY9MSxaPW51bGwsVj1udWxsO2NvbnN0IFE9bmV3IGx0KDAsMCxVLHopLG5lPW5ldyBsdCgwLDAsVSx6KTtsZXQgZmU9ITE7Y29uc3QgJD1uZXcgcXM7bGV0IGVlPSExLGRlPSExLFRlPW51bGw7Y29uc3QgYmU9bmV3IEllLE9lPW5ldyBxLEJlPW5ldyBQLHdlPXtiYWNrZ3JvdW5kOm51bGwsZm9nOm51bGwsZW52aXJvbm1lbnQ6bnVsbCxvdmVycmlkZU1hdGVyaWFsOm51bGwsaXNTY2VuZTohMH07ZnVuY3Rpb24gUGUoKXtyZXR1cm4gQT09PW51bGw/RjoxfWxldCBEPW47ZnVuY3Rpb24gbGUoVCxHKXtmb3IobGV0IFg9MDtYPFQubGVuZ3RoO1grKyl7Y29uc3QgWT1UW1hdLEg9dC5nZXRDb250ZXh0KFksRyk7aWYoSCE9PW51bGwpcmV0dXJuIEh9cmV0dXJuIG51bGx9dHJ5e2NvbnN0IFQ9e2FscGhhOiEwLGRlcHRoOmksc3RlbmNpbDpzLGFudGlhbGlhczpvLHByZW11bHRpcGxpZWRBbHBoYTpsLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjpjLHBvd2VyUHJlZmVyZW5jZTpoLGZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ6dX07aWYoInNldEF0dHJpYnV0ZSJpbiB0JiZ0LnNldEF0dHJpYnV0ZSgiZGF0YS1lbmdpbmUiLGB0aHJlZS5qcyByJHtmdH1gKSx0LmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLGplLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIixPLCExKSx0LmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IiLHZlLCExKSxEPT09bnVsbCl7Y29uc3QgRz1bIndlYmdsMiIsIndlYmdsIiwiZXhwZXJpbWVudGFsLXdlYmdsIl07aWYoeC5pc1dlYkdMMVJlbmRlcmVyPT09ITAmJkcuc2hpZnQoKSxEPWxlKEcsVCksRD09PW51bGwpdGhyb3cgbGUoRyk/bmV3IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0IHdpdGggeW91ciBzZWxlY3RlZCBhdHRyaWJ1dGVzLiIpOm5ldyBFcnJvcigiRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dC4iKX10eXBlb2YgV2ViR0xSZW5kZXJpbmdDb250ZXh0IT0idW5kZWZpbmVkIiYmRCBpbnN0YW5jZW9mIFdlYkdMUmVuZGVyaW5nQ29udGV4dCYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTCAxIHN1cHBvcnQgd2FzIGRlcHJlY2F0ZWQgaW4gcjE1MyBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHIxNjMuIiksRC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQ9PT12b2lkIDAmJihELmdldFNoYWRlclByZWNpc2lvbkZvcm1hdD1mdW5jdGlvbigpe3JldHVybntyYW5nZU1pbjoxLHJhbmdlTWF4OjEscHJlY2lzaW9uOjF9fSl9Y2F0Y2goVCl7dGhyb3cgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlcjogIitULm1lc3NhZ2UpLFR9bGV0IEssdWUscmUsQ2UsVyxKLGllLG1lLHBlLEMsRSxrLHNlLHRlLGFlLEFlLG9lLHhlLERlLHR0LGNlLGF0LFZlLE5lO2Z1bmN0aW9uIExlKCl7Sz1uZXcgR3YoRCksdWU9bmV3IE52KEQsSyxlKSxLLmluaXQodWUpLGF0PW5ldyBNcChELEssdWUpLHJlPW5ldyBNUyhELEssdWUpLENlPW5ldyBXdihEKSxXPW5ldyBjUyxKPW5ldyBTUyhELEsscmUsVyx1ZSxhdCxDZSksaWU9bmV3IE92KHgpLG1lPW5ldyBrdih4KSxwZT1uZXcgSXgoRCx1ZSksVmU9bmV3IFV2KEQsSyxwZSx1ZSksQz1uZXcgVnYoRCxwZSxDZSxWZSksRT1uZXcgWXYoRCxDLHBlLENlKSxEZT1uZXcgJHYoRCx1ZSxKKSxBZT1uZXcgRnYoVyksaz1uZXcgbFMoeCxpZSxtZSxLLHVlLFZlLEFlKSxzZT1uZXcgRVMoeCxXKSx0ZT1uZXcgdVMsYWU9bmV3IF9TKEssdWUpLHhlPW5ldyBJdih4LGllLG1lLHJlLEUsZixsKSxvZT1uZXcgdlMoeCxFLHVlKSxOZT1uZXcgQVMoRCxDZSx1ZSxyZSksdHQ9bmV3IER2KEQsSyxDZSx1ZSksY2U9bmV3IEh2KEQsSyxDZSx1ZSksQ2UucHJvZ3JhbXM9ay5wcm9ncmFtcyx4LmNhcGFiaWxpdGllcz11ZSx4LmV4dGVuc2lvbnM9Syx4LnByb3BlcnRpZXM9Vyx4LnJlbmRlckxpc3RzPXRlLHguc2hhZG93TWFwPW9lLHguc3RhdGU9cmUseC5pbmZvPUNlfUxlKCk7Y29uc3QgRWU9bmV3IHdTKHgsRCk7dGhpcy54cj1FZSx0aGlzLmdldENvbnRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gRH0sdGhpcy5nZXRDb250ZXh0QXR0cmlidXRlcz1mdW5jdGlvbigpe3JldHVybiBELmdldENvbnRleHRBdHRyaWJ1dGVzKCl9LHRoaXMuZm9yY2VDb250ZXh0TG9zcz1mdW5jdGlvbigpe2NvbnN0IFQ9Sy5nZXQoIldFQkdMX2xvc2VfY29udGV4dCIpO1QmJlQubG9zZUNvbnRleHQoKX0sdGhpcy5mb3JjZUNvbnRleHRSZXN0b3JlPWZ1bmN0aW9uKCl7Y29uc3QgVD1LLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7VCYmVC5yZXN0b3JlQ29udGV4dCgpfSx0aGlzLmdldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4gRn0sdGhpcy5zZXRQaXhlbFJhdGlvPWZ1bmN0aW9uKFQpe1QhPT12b2lkIDAmJihGPVQsdGhpcy5zZXRTaXplKFUseiwhMSkpfSx0aGlzLmdldFNpemU9ZnVuY3Rpb24oVCl7cmV0dXJuIFQuc2V0KFUseil9LHRoaXMuc2V0U2l6ZT1mdW5jdGlvbihULEcsWD0hMCl7aWYoRWUuaXNQcmVzZW50aW5nKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IENhbid0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLiIpO3JldHVybn1VPVQsej1HLHQud2lkdGg9TWF0aC5mbG9vcihUKkYpLHQuaGVpZ2h0PU1hdGguZmxvb3IoRypGKSxYPT09ITAmJih0LnN0eWxlLndpZHRoPVQrInB4Iix0LnN0eWxlLmhlaWdodD1HKyJweCIpLHRoaXMuc2V0Vmlld3BvcnQoMCwwLFQsRyl9LHRoaXMuZ2V0RHJhd2luZ0J1ZmZlclNpemU9ZnVuY3Rpb24oVCl7cmV0dXJuIFQuc2V0KFUqRix6KkYpLmZsb29yKCl9LHRoaXMuc2V0RHJhd2luZ0J1ZmZlclNpemU9ZnVuY3Rpb24oVCxHLFgpe1U9VCx6PUcsRj1YLHQud2lkdGg9TWF0aC5mbG9vcihUKlgpLHQuaGVpZ2h0PU1hdGguZmxvb3IoRypYKSx0aGlzLnNldFZpZXdwb3J0KDAsMCxULEcpfSx0aGlzLmdldEN1cnJlbnRWaWV3cG9ydD1mdW5jdGlvbihUKXtyZXR1cm4gVC5jb3B5KHcpfSx0aGlzLmdldFZpZXdwb3J0PWZ1bmN0aW9uKFQpe3JldHVybiBULmNvcHkoUSl9LHRoaXMuc2V0Vmlld3BvcnQ9ZnVuY3Rpb24oVCxHLFgsWSl7VC5pc1ZlY3RvcjQ/US5zZXQoVC54LFQueSxULnosVC53KTpRLnNldChULEcsWCxZKSxyZS52aWV3cG9ydCh3LmNvcHkoUSkubXVsdGlwbHlTY2FsYXIoRikuZmxvb3IoKSl9LHRoaXMuZ2V0U2Npc3Nvcj1mdW5jdGlvbihUKXtyZXR1cm4gVC5jb3B5KG5lKX0sdGhpcy5zZXRTY2lzc29yPWZ1bmN0aW9uKFQsRyxYLFkpe1QuaXNWZWN0b3I0P25lLnNldChULngsVC55LFQueixULncpOm5lLnNldChULEcsWCxZKSxyZS5zY2lzc29yKFIuY29weShuZSkubXVsdGlwbHlTY2FsYXIoRikuZmxvb3IoKSl9LHRoaXMuZ2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gZmV9LHRoaXMuc2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oVCl7cmUuc2V0U2Npc3NvclRlc3QoZmU9VCl9LHRoaXMuc2V0T3BhcXVlU29ydD1mdW5jdGlvbihUKXtaPVR9LHRoaXMuc2V0VHJhbnNwYXJlbnRTb3J0PWZ1bmN0aW9uKFQpe1Y9VH0sdGhpcy5nZXRDbGVhckNvbG9yPWZ1bmN0aW9uKFQpe3JldHVybiBULmNvcHkoeGUuZ2V0Q2xlYXJDb2xvcigpKX0sdGhpcy5zZXRDbGVhckNvbG9yPWZ1bmN0aW9uKCl7eGUuc2V0Q2xlYXJDb2xvci5hcHBseSh4ZSxhcmd1bWVudHMpfSx0aGlzLmdldENsZWFyQWxwaGE9ZnVuY3Rpb24oKXtyZXR1cm4geGUuZ2V0Q2xlYXJBbHBoYSgpfSx0aGlzLnNldENsZWFyQWxwaGE9ZnVuY3Rpb24oKXt4ZS5zZXRDbGVhckFscGhhLmFwcGx5KHhlLGFyZ3VtZW50cyl9LHRoaXMuY2xlYXI9ZnVuY3Rpb24oVD0hMCxHPSEwLFg9ITApe2xldCBZPTA7aWYoVCl7bGV0IEg9ITE7aWYoQSE9PW51bGwpe2NvbnN0IE1lPUEudGV4dHVyZS5mb3JtYXQ7SD1NZT09PU1jfHxNZT09PXZjfHxNZT09PXljfWlmKEgpe2NvbnN0IE1lPUEudGV4dHVyZS50eXBlLFJlPU1lPT09UW58fE1lPT09am58fE1lPT09QmF8fE1lPT09TWl8fE1lPT09X2N8fE1lPT09eGMsRmU9eGUuZ2V0Q2xlYXJDb2xvcigpLEhlPXhlLmdldENsZWFyQWxwaGEoKSxKZT1GZS5yLFhlPUZlLmcsWWU9RmUuYjtSZT8oZFswXT1KZSxkWzFdPVhlLGRbMl09WWUsZFszXT1IZSxELmNsZWFyQnVmZmVydWl2KEQuQ09MT1IsMCxkKSk6KHBbMF09SmUscFsxXT1YZSxwWzJdPVllLHBbM109SGUsRC5jbGVhckJ1ZmZlcml2KEQuQ09MT1IsMCxwKSl9ZWxzZSBZfD1ELkNPTE9SX0JVRkZFUl9CSVR9RyYmKFl8PUQuREVQVEhfQlVGRkVSX0JJVCksWCYmKFl8PUQuU1RFTkNJTF9CVUZGRVJfQklULHRoaXMuc3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldE1hc2soNDI5NDk2NzI5NSkpLEQuY2xlYXIoWSl9LHRoaXMuY2xlYXJDb2xvcj1mdW5jdGlvbigpe3RoaXMuY2xlYXIoITAsITEsITEpfSx0aGlzLmNsZWFyRGVwdGg9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCExLCEwLCExKX0sdGhpcy5jbGVhclN0ZW5jaWw9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCExLCExLCEwKX0sdGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IixqZSwhMSksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRyZXN0b3JlZCIsTywhMSksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yIix2ZSwhMSksdGUuZGlzcG9zZSgpLGFlLmRpc3Bvc2UoKSxXLmRpc3Bvc2UoKSxpZS5kaXNwb3NlKCksbWUuZGlzcG9zZSgpLEUuZGlzcG9zZSgpLFZlLmRpc3Bvc2UoKSxOZS5kaXNwb3NlKCksay5kaXNwb3NlKCksRWUuZGlzcG9zZSgpLEVlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlc3Npb25zdGFydCIsbm4pLEVlLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlc3Npb25lbmQiLHV0KSxUZSYmKFRlLmRpc3Bvc2UoKSxUZT1udWxsKSxybi5zdG9wKCl9O2Z1bmN0aW9uIGplKFQpe1QucHJldmVudERlZmF1bHQoKSxjb25zb2xlLmxvZygiVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LiIpLHY9ITB9ZnVuY3Rpb24gTygpe2NvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLiIpLHY9ITE7Y29uc3QgVD1DZS5hdXRvUmVzZXQsRz1vZS5lbmFibGVkLFg9b2UuYXV0b1VwZGF0ZSxZPW9lLm5lZWRzVXBkYXRlLEg9b2UudHlwZTtMZSgpLENlLmF1dG9SZXNldD1ULG9lLmVuYWJsZWQ9RyxvZS5hdXRvVXBkYXRlPVgsb2UubmVlZHNVcGRhdGU9WSxvZS50eXBlPUh9ZnVuY3Rpb24gdmUoVCl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQSBXZWJHTCBjb250ZXh0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiBSZWFzb246ICIsVC5zdGF0dXNNZXNzYWdlKX1mdW5jdGlvbiBoZShUKXtjb25zdCBHPVQudGFyZ2V0O0cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaGUpLGooRyl9ZnVuY3Rpb24gaihUKXtnZShUKSxXLnJlbW92ZShUKX1mdW5jdGlvbiBnZShUKXtjb25zdCBHPVcuZ2V0KFQpLnByb2dyYW1zO0chPT12b2lkIDAmJihHLmZvckVhY2goZnVuY3Rpb24oWCl7ay5yZWxlYXNlUHJvZ3JhbShYKX0pLFQuaXNTaGFkZXJNYXRlcmlhbCYmay5yZWxlYXNlU2hhZGVyQ2FjaGUoVCkpfXRoaXMucmVuZGVyQnVmZmVyRGlyZWN0PWZ1bmN0aW9uKFQsRyxYLFksSCxNZSl7Rz09PW51bGwmJihHPXdlKTtjb25zdCBSZT1ILmlzTWVzaCYmSC5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpPDAsRmU9WUEoVCxHLFgsWSxIKTtyZS5zZXRNYXRlcmlhbChZLFJlKTtsZXQgSGU9WC5pbmRleCxKZT0xO2lmKFkud2lyZWZyYW1lPT09ITApe2lmKEhlPUMuZ2V0V2lyZWZyYW1lQXR0cmlidXRlKFgpLEhlPT09dm9pZCAwKXJldHVybjtKZT0yfWNvbnN0IFhlPVguZHJhd1JhbmdlLFllPVguYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgVHQ9WGUuc3RhcnQqSmUsd249KFhlLnN0YXJ0K1hlLmNvdW50KSpKZTtNZSE9PW51bGwmJihUdD1NYXRoLm1heChUdCxNZS5zdGFydCpKZSksd249TWF0aC5taW4od24sKE1lLnN0YXJ0K01lLmNvdW50KSpKZSkpLEhlIT09bnVsbD8oVHQ9TWF0aC5tYXgoVHQsMCksd249TWF0aC5taW4od24sSGUuY291bnQpKTpZZSE9bnVsbCYmKFR0PU1hdGgubWF4KFR0LDApLHduPU1hdGgubWluKHduLFllLmNvdW50KSk7Y29uc3QgT3Q9d24tVHQ7aWYoT3Q8MHx8T3Q9PT0xLzApcmV0dXJuO1ZlLnNldHVwKEgsWSxGZSxYLEhlKTtsZXQgX2ksZ3Q9dHQ7aWYoSGUhPT1udWxsJiYoX2k9cGUuZ2V0KEhlKSxndD1jZSxndC5zZXRJbmRleChfaSkpLEguaXNNZXNoKVkud2lyZWZyYW1lPT09ITA/KHJlLnNldExpbmVXaWR0aChZLndpcmVmcmFtZUxpbmV3aWR0aCpQZSgpKSxndC5zZXRNb2RlKEQuTElORVMpKTpndC5zZXRNb2RlKEQuVFJJQU5HTEVTKTtlbHNlIGlmKEguaXNMaW5lKXtsZXQgUWU9WS5saW5ld2lkdGg7UWU9PT12b2lkIDAmJihRZT0xKSxyZS5zZXRMaW5lV2lkdGgoUWUqUGUoKSksSC5pc0xpbmVTZWdtZW50cz9ndC5zZXRNb2RlKEQuTElORVMpOkguaXNMaW5lTG9vcD9ndC5zZXRNb2RlKEQuTElORV9MT09QKTpndC5zZXRNb2RlKEQuTElORV9TVFJJUCl9ZWxzZSBILmlzUG9pbnRzP2d0LnNldE1vZGUoRC5QT0lOVFMpOkguaXNTcHJpdGUmJmd0LnNldE1vZGUoRC5UUklBTkdMRVMpO2lmKEguaXNCYXRjaGVkTWVzaClndC5yZW5kZXJNdWx0aURyYXcoSC5fbXVsdGlEcmF3U3RhcnRzLEguX211bHRpRHJhd0NvdW50cyxILl9tdWx0aURyYXdDb3VudCk7ZWxzZSBpZihILmlzSW5zdGFuY2VkTWVzaClndC5yZW5kZXJJbnN0YW5jZXMoVHQsT3QsSC5jb3VudCk7ZWxzZSBpZihYLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkpe2NvbnN0IFFlPVguX21heEluc3RhbmNlQ291bnQhPT12b2lkIDA/WC5fbWF4SW5zdGFuY2VDb3VudDoxLzAsdmY9TWF0aC5taW4oWC5pbnN0YW5jZUNvdW50LFFlKTtndC5yZW5kZXJJbnN0YW5jZXMoVHQsT3QsdmYpfWVsc2UgZ3QucmVuZGVyKFR0LE90KX07ZnVuY3Rpb24gemUoVCxHLFgpe1QudHJhbnNwYXJlbnQ9PT0hMCYmVC5zaWRlPT09R24mJlQuZm9yY2VTaW5nbGVQYXNzPT09ITE/KFQuc2lkZT1ZdCxULm5lZWRzVXBkYXRlPSEwLGFjKFQsRyxYKSxULnNpZGU9WW4sVC5uZWVkc1VwZGF0ZT0hMCxhYyhULEcsWCksVC5zaWRlPUduKTphYyhULEcsWCl9dGhpcy5jb21waWxlPWZ1bmN0aW9uKFQsRyxYPW51bGwpe1g9PT1udWxsJiYoWD1UKSxnPWFlLmdldChYKSxnLmluaXQoKSx5LnB1c2goZyksWC50cmF2ZXJzZVZpc2libGUoZnVuY3Rpb24oSCl7SC5pc0xpZ2h0JiZILmxheWVycy50ZXN0KEcubGF5ZXJzKSYmKGcucHVzaExpZ2h0KEgpLEguY2FzdFNoYWRvdyYmZy5wdXNoU2hhZG93KEgpKX0pLFQhPT1YJiZULnRyYXZlcnNlVmlzaWJsZShmdW5jdGlvbihIKXtILmlzTGlnaHQmJkgubGF5ZXJzLnRlc3QoRy5sYXllcnMpJiYoZy5wdXNoTGlnaHQoSCksSC5jYXN0U2hhZG93JiZnLnB1c2hTaGFkb3coSCkpfSksZy5zZXR1cExpZ2h0cyh4Ll91c2VMZWdhY3lMaWdodHMpO2NvbnN0IFk9bmV3IFNldDtyZXR1cm4gVC50cmF2ZXJzZShmdW5jdGlvbihIKXtjb25zdCBNZT1ILm1hdGVyaWFsO2lmKE1lKWlmKEFycmF5LmlzQXJyYXkoTWUpKWZvcihsZXQgUmU9MDtSZTxNZS5sZW5ndGg7UmUrKyl7Y29uc3QgRmU9TWVbUmVdO3plKEZlLFgsSCksWS5hZGQoRmUpfWVsc2UgemUoTWUsWCxIKSxZLmFkZChNZSl9KSx5LnBvcCgpLGc9bnVsbCxZfSx0aGlzLmNvbXBpbGVBc3luYz1mdW5jdGlvbihULEcsWD1udWxsKXtjb25zdCBZPXRoaXMuY29tcGlsZShULEcsWCk7cmV0dXJuIG5ldyBQcm9taXNlKEg9PntmdW5jdGlvbiBNZSgpe2lmKFkuZm9yRWFjaChmdW5jdGlvbihSZSl7Vy5nZXQoUmUpLmN1cnJlbnRQcm9ncmFtLmlzUmVhZHkoKSYmWS5kZWxldGUoUmUpfSksWS5zaXplPT09MCl7SChUKTtyZXR1cm59c2V0VGltZW91dChNZSwxMCl9Sy5nZXQoIktIUl9wYXJhbGxlbF9zaGFkZXJfY29tcGlsZSIpIT09bnVsbD9NZSgpOnNldFRpbWVvdXQoTWUsMTApfSl9O2xldCBpdD1udWxsO2Z1bmN0aW9uIEZ0KFQpe2l0JiZpdChUKX1mdW5jdGlvbiBubigpe3JuLnN0b3AoKX1mdW5jdGlvbiB1dCgpe3JuLnN0YXJ0KCl9Y29uc3Qgcm49bmV3IFlkO3JuLnNldEFuaW1hdGlvbkxvb3AoRnQpLHR5cGVvZiBzZWxmIT0idW5kZWZpbmVkIiYmcm4uc2V0Q29udGV4dChzZWxmKSx0aGlzLnNldEFuaW1hdGlvbkxvb3A9ZnVuY3Rpb24oVCl7aXQ9VCxFZS5zZXRBbmltYXRpb25Mb29wKFQpLFQ9PT1udWxsP3JuLnN0b3AoKTpybi5zdGFydCgpfSxFZS5hZGRFdmVudExpc3RlbmVyKCJzZXNzaW9uc3RhcnQiLG5uKSxFZS5hZGRFdmVudExpc3RlbmVyKCJzZXNzaW9uZW5kIix1dCksdGhpcy5yZW5kZXI9ZnVuY3Rpb24oVCxHKXtpZihHIT09dm9pZCAwJiZHLmlzQ2FtZXJhIT09ITApe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyOiBjYW1lcmEgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkNhbWVyYS4iKTtyZXR1cm59aWYodj09PSEwKXJldHVybjtULm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiZULnVwZGF0ZU1hdHJpeFdvcmxkKCksRy5wYXJlbnQ9PT1udWxsJiZHLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT09PSEwJiZHLnVwZGF0ZU1hdHJpeFdvcmxkKCksRWUuZW5hYmxlZD09PSEwJiZFZS5pc1ByZXNlbnRpbmc9PT0hMCYmKEVlLmNhbWVyYUF1dG9VcGRhdGU9PT0hMCYmRWUudXBkYXRlQ2FtZXJhKEcpLEc9RWUuZ2V0Q2FtZXJhKCkpLFQuaXNTY2VuZT09PSEwJiZULm9uQmVmb3JlUmVuZGVyKHgsVCxHLEEpLGc9YWUuZ2V0KFQseS5sZW5ndGgpLGcuaW5pdCgpLHkucHVzaChnKSxiZS5tdWx0aXBseU1hdHJpY2VzKEcucHJvamVjdGlvbk1hdHJpeCxHLm1hdHJpeFdvcmxkSW52ZXJzZSksJC5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChiZSksZGU9dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCxlZT1BZS5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsZGUpLF89dGUuZ2V0KFQsbS5sZW5ndGgpLF8uaW5pdCgpLG0ucHVzaChfKSwkbihULEcsMCx4LnNvcnRPYmplY3RzKSxfLmZpbmlzaCgpLHguc29ydE9iamVjdHM9PT0hMCYmXy5zb3J0KFosViksdGhpcy5pbmZvLnJlbmRlci5mcmFtZSsrLGVlPT09ITAmJkFlLmJlZ2luU2hhZG93cygpO2NvbnN0IFg9Zy5zdGF0ZS5zaGFkb3dzQXJyYXk7aWYob2UucmVuZGVyKFgsVCxHKSxlZT09PSEwJiZBZS5lbmRTaGFkb3dzKCksdGhpcy5pbmZvLmF1dG9SZXNldD09PSEwJiZ0aGlzLmluZm8ucmVzZXQoKSx4ZS5yZW5kZXIoXyxUKSxnLnNldHVwTGlnaHRzKHguX3VzZUxlZ2FjeUxpZ2h0cyksRy5pc0FycmF5Q2FtZXJhKXtjb25zdCBZPUcuY2FtZXJhcztmb3IobGV0IEg9MCxNZT1ZLmxlbmd0aDtIPE1lO0grKyl7Y29uc3QgUmU9WVtIXTtLMChfLFQsUmUsUmUudmlld3BvcnQpfX1lbHNlIEswKF8sVCxHKTtBIT09bnVsbCYmKEoudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoQSksSi51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoQSkpLFQuaXNTY2VuZT09PSEwJiZULm9uQWZ0ZXJSZW5kZXIoeCxULEcpLFZlLnJlc2V0RGVmYXVsdFN0YXRlKCksTD0tMSxNPW51bGwseS5wb3AoKSx5Lmxlbmd0aD4wP2c9eVt5Lmxlbmd0aC0xXTpnPW51bGwsbS5wb3AoKSxtLmxlbmd0aD4wP189bVttLmxlbmd0aC0xXTpfPW51bGx9O2Z1bmN0aW9uICRuKFQsRyxYLFkpe2lmKFQudmlzaWJsZT09PSExKXJldHVybjtpZihULmxheWVycy50ZXN0KEcubGF5ZXJzKSl7aWYoVC5pc0dyb3VwKVg9VC5yZW5kZXJPcmRlcjtlbHNlIGlmKFQuaXNMT0QpVC5hdXRvVXBkYXRlPT09ITAmJlQudXBkYXRlKEcpO2Vsc2UgaWYoVC5pc0xpZ2h0KWcucHVzaExpZ2h0KFQpLFQuY2FzdFNoYWRvdyYmZy5wdXNoU2hhZG93KFQpO2Vsc2UgaWYoVC5pc1Nwcml0ZSl7aWYoIVQuZnJ1c3R1bUN1bGxlZHx8JC5pbnRlcnNlY3RzU3ByaXRlKFQpKXtZJiZCZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oVC5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KGJlKTtjb25zdCBSZT1FLnVwZGF0ZShUKSxGZT1ULm1hdGVyaWFsO0ZlLnZpc2libGUmJl8ucHVzaChULFJlLEZlLFgsQmUueixudWxsKX19ZWxzZSBpZigoVC5pc01lc2h8fFQuaXNMaW5lfHxULmlzUG9pbnRzKSYmKCFULmZydXN0dW1DdWxsZWR8fCQuaW50ZXJzZWN0c09iamVjdChUKSkpe2NvbnN0IFJlPUUudXBkYXRlKFQpLEZlPVQubWF0ZXJpYWw7aWYoWSYmKFQuYm91bmRpbmdTcGhlcmUhPT12b2lkIDA/KFQuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZULmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLEJlLmNvcHkoVC5ib3VuZGluZ1NwaGVyZS5jZW50ZXIpKTooUmUuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZSZS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxCZS5jb3B5KFJlLmJvdW5kaW5nU3BoZXJlLmNlbnRlcikpLEJlLmFwcGx5TWF0cml4NChULm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoYmUpKSxBcnJheS5pc0FycmF5KEZlKSl7Y29uc3QgSGU9UmUuZ3JvdXBzO2ZvcihsZXQgSmU9MCxYZT1IZS5sZW5ndGg7SmU8WGU7SmUrKyl7Y29uc3QgWWU9SGVbSmVdLFR0PUZlW1llLm1hdGVyaWFsSW5kZXhdO1R0JiZUdC52aXNpYmxlJiZfLnB1c2goVCxSZSxUdCxYLEJlLnosWWUpfX1lbHNlIEZlLnZpc2libGUmJl8ucHVzaChULFJlLEZlLFgsQmUueixudWxsKX19Y29uc3QgTWU9VC5jaGlsZHJlbjtmb3IobGV0IFJlPTAsRmU9TWUubGVuZ3RoO1JlPEZlO1JlKyspJG4oTWVbUmVdLEcsWCxZKX1mdW5jdGlvbiBLMChULEcsWCxZKXtjb25zdCBIPVQub3BhcXVlLE1lPVQudHJhbnNtaXNzaXZlLFJlPVQudHJhbnNwYXJlbnQ7Zy5zZXR1cExpZ2h0c1ZpZXcoWCksZWU9PT0hMCYmQWUuc2V0R2xvYmFsU3RhdGUoeC5jbGlwcGluZ1BsYW5lcyxYKSxNZS5sZW5ndGg+MCYmJEEoSCxNZSxHLFgpLFkmJnJlLnZpZXdwb3J0KHcuY29weShZKSksSC5sZW5ndGg+MCYmc2MoSCxHLFgpLE1lLmxlbmd0aD4wJiZzYyhNZSxHLFgpLFJlLmxlbmd0aD4wJiZzYyhSZSxHLFgpLHJlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCkscmUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCEwKSxyZS5idWZmZXJzLmNvbG9yLnNldE1hc2soITApLHJlLnNldFBvbHlnb25PZmZzZXQoITEpfWZ1bmN0aW9uICRBKFQsRyxYLFkpe2lmKChYLmlzU2NlbmU9PT0hMD9YLm92ZXJyaWRlTWF0ZXJpYWw6bnVsbCkhPT1udWxsKXJldHVybjtjb25zdCBNZT11ZS5pc1dlYkdMMjtUZT09PW51bGwmJihUZT1uZXcgTG4oMSwxLHtnZW5lcmF0ZU1pcG1hcHM6ITAsdHlwZTpLLmhhcygiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0Iik/d3I6UW4sbWluRmlsdGVyOnZpLHNhbXBsZXM6TWU/NDowfSkpLHguZ2V0RHJhd2luZ0J1ZmZlclNpemUoT2UpLE1lP1RlLnNldFNpemUoT2UueCxPZS55KTpUZS5zZXRTaXplKFlhKE9lLngpLFlhKE9lLnkpKTtjb25zdCBSZT14LmdldFJlbmRlclRhcmdldCgpO3guc2V0UmVuZGVyVGFyZ2V0KFRlKSx4LmdldENsZWFyQ29sb3IoQiksST14LmdldENsZWFyQWxwaGEoKSxJPDEmJnguc2V0Q2xlYXJDb2xvcigxNjc3NzIxNSwuNSkseC5jbGVhcigpO2NvbnN0IEZlPXgudG9uZU1hcHBpbmc7eC50b25lTWFwcGluZz1KbixzYyhULFgsWSksSi51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldChUZSksSi51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoVGUpO2xldCBIZT0hMTtmb3IobGV0IEplPTAsWGU9Ry5sZW5ndGg7SmU8WGU7SmUrKyl7Y29uc3QgWWU9R1tKZV0sVHQ9WWUub2JqZWN0LHduPVllLmdlb21ldHJ5LE90PVllLm1hdGVyaWFsLF9pPVllLmdyb3VwO2lmKE90LnNpZGU9PT1HbiYmVHQubGF5ZXJzLnRlc3QoWS5sYXllcnMpKXtjb25zdCBndD1PdC5zaWRlO090LnNpZGU9WXQsT3QubmVlZHNVcGRhdGU9ITAsUTAoVHQsWCxZLHduLE90LF9pKSxPdC5zaWRlPWd0LE90Lm5lZWRzVXBkYXRlPSEwLEhlPSEwfX1IZT09PSEwJiYoSi51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldChUZSksSi51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoVGUpKSx4LnNldFJlbmRlclRhcmdldChSZSkseC5zZXRDbGVhckNvbG9yKEIsSSkseC50b25lTWFwcGluZz1GZX1mdW5jdGlvbiBzYyhULEcsWCl7Y29uc3QgWT1HLmlzU2NlbmU9PT0hMD9HLm92ZXJyaWRlTWF0ZXJpYWw6bnVsbDtmb3IobGV0IEg9MCxNZT1ULmxlbmd0aDtIPE1lO0grKyl7Y29uc3QgUmU9VFtIXSxGZT1SZS5vYmplY3QsSGU9UmUuZ2VvbWV0cnksSmU9WT09PW51bGw/UmUubWF0ZXJpYWw6WSxYZT1SZS5ncm91cDtGZS5sYXllcnMudGVzdChYLmxheWVycykmJlEwKEZlLEcsWCxIZSxKZSxYZSl9fWZ1bmN0aW9uIFEwKFQsRyxYLFksSCxNZSl7VC5vbkJlZm9yZVJlbmRlcih4LEcsWCxZLEgsTWUpLFQubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoWC5tYXRyaXhXb3JsZEludmVyc2UsVC5tYXRyaXhXb3JsZCksVC5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KFQubW9kZWxWaWV3TWF0cml4KSxILm9uQmVmb3JlUmVuZGVyKHgsRyxYLFksVCxNZSksSC50cmFuc3BhcmVudD09PSEwJiZILnNpZGU9PT1HbiYmSC5mb3JjZVNpbmdsZVBhc3M9PT0hMT8oSC5zaWRlPVl0LEgubmVlZHNVcGRhdGU9ITAseC5yZW5kZXJCdWZmZXJEaXJlY3QoWCxHLFksSCxULE1lKSxILnNpZGU9WW4sSC5uZWVkc1VwZGF0ZT0hMCx4LnJlbmRlckJ1ZmZlckRpcmVjdChYLEcsWSxILFQsTWUpLEguc2lkZT1Hbik6eC5yZW5kZXJCdWZmZXJEaXJlY3QoWCxHLFksSCxULE1lKSxULm9uQWZ0ZXJSZW5kZXIoeCxHLFgsWSxILE1lKX1mdW5jdGlvbiBhYyhULEcsWCl7Ry5pc1NjZW5lIT09ITAmJihHPXdlKTtjb25zdCBZPVcuZ2V0KFQpLEg9Zy5zdGF0ZS5saWdodHMsTWU9Zy5zdGF0ZS5zaGFkb3dzQXJyYXksUmU9SC5zdGF0ZS52ZXJzaW9uLEZlPWsuZ2V0UGFyYW1ldGVycyhULEguc3RhdGUsTWUsRyxYKSxIZT1rLmdldFByb2dyYW1DYWNoZUtleShGZSk7bGV0IEplPVkucHJvZ3JhbXM7WS5lbnZpcm9ubWVudD1ULmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/Ry5lbnZpcm9ubWVudDpudWxsLFkuZm9nPUcuZm9nLFkuZW52TWFwPShULmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/bWU6aWUpLmdldChULmVudk1hcHx8WS5lbnZpcm9ubWVudCksSmU9PT12b2lkIDAmJihULmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGhlKSxKZT1uZXcgTWFwLFkucHJvZ3JhbXM9SmUpO2xldCBYZT1KZS5nZXQoSGUpO2lmKFhlIT09dm9pZCAwKXtpZihZLmN1cnJlbnRQcm9ncmFtPT09WGUmJlkubGlnaHRzU3RhdGVWZXJzaW9uPT09UmUpcmV0dXJuIGVfKFQsRmUpLFhlfWVsc2UgRmUudW5pZm9ybXM9ay5nZXRVbmlmb3JtcyhUKSxULm9uQnVpbGQoWCxGZSx4KSxULm9uQmVmb3JlQ29tcGlsZShGZSx4KSxYZT1rLmFjcXVpcmVQcm9ncmFtKEZlLEhlKSxKZS5zZXQoSGUsWGUpLFkudW5pZm9ybXM9RmUudW5pZm9ybXM7Y29uc3QgWWU9WS51bmlmb3JtcztyZXR1cm4oIVQuaXNTaGFkZXJNYXRlcmlhbCYmIVQuaXNSYXdTaGFkZXJNYXRlcmlhbHx8VC5jbGlwcGluZz09PSEwKSYmKFllLmNsaXBwaW5nUGxhbmVzPUFlLnVuaWZvcm0pLGVfKFQsRmUpLFkubmVlZHNMaWdodHM9SkEoVCksWS5saWdodHNTdGF0ZVZlcnNpb249UmUsWS5uZWVkc0xpZ2h0cyYmKFllLmFtYmllbnRMaWdodENvbG9yLnZhbHVlPUguc3RhdGUuYW1iaWVudCxZZS5saWdodFByb2JlLnZhbHVlPUguc3RhdGUucHJvYmUsWWUuZGlyZWN0aW9uYWxMaWdodHMudmFsdWU9SC5zdGF0ZS5kaXJlY3Rpb25hbCxZZS5kaXJlY3Rpb25hbExpZ2h0U2hhZG93cy52YWx1ZT1ILnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93LFllLnNwb3RMaWdodHMudmFsdWU9SC5zdGF0ZS5zcG90LFllLnNwb3RMaWdodFNoYWRvd3MudmFsdWU9SC5zdGF0ZS5zcG90U2hhZG93LFllLnJlY3RBcmVhTGlnaHRzLnZhbHVlPUguc3RhdGUucmVjdEFyZWEsWWUubHRjXzEudmFsdWU9SC5zdGF0ZS5yZWN0QXJlYUxUQzEsWWUubHRjXzIudmFsdWU9SC5zdGF0ZS5yZWN0QXJlYUxUQzIsWWUucG9pbnRMaWdodHMudmFsdWU9SC5zdGF0ZS5wb2ludCxZZS5wb2ludExpZ2h0U2hhZG93cy52YWx1ZT1ILnN0YXRlLnBvaW50U2hhZG93LFllLmhlbWlzcGhlcmVMaWdodHMudmFsdWU9SC5zdGF0ZS5oZW1pLFllLmRpcmVjdGlvbmFsU2hhZG93TWFwLnZhbHVlPUguc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAsWWUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWU9SC5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeCxZZS5zcG90U2hhZG93TWFwLnZhbHVlPUguc3RhdGUuc3BvdFNoYWRvd01hcCxZZS5zcG90TGlnaHRNYXRyaXgudmFsdWU9SC5zdGF0ZS5zcG90TGlnaHRNYXRyaXgsWWUuc3BvdExpZ2h0TWFwLnZhbHVlPUguc3RhdGUuc3BvdExpZ2h0TWFwLFllLnBvaW50U2hhZG93TWFwLnZhbHVlPUguc3RhdGUucG9pbnRTaGFkb3dNYXAsWWUucG9pbnRTaGFkb3dNYXRyaXgudmFsdWU9SC5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeCksWS5jdXJyZW50UHJvZ3JhbT1YZSxZLnVuaWZvcm1zTGlzdD1udWxsLFhlfWZ1bmN0aW9uIGowKFQpe2lmKFQudW5pZm9ybXNMaXN0PT09bnVsbCl7Y29uc3QgRz1ULmN1cnJlbnRQcm9ncmFtLmdldFVuaWZvcm1zKCk7VC51bmlmb3Jtc0xpc3Q9Ym8uc2VxV2l0aFZhbHVlKEcuc2VxLFQudW5pZm9ybXMpfXJldHVybiBULnVuaWZvcm1zTGlzdH1mdW5jdGlvbiBlXyhULEcpe2NvbnN0IFg9Vy5nZXQoVCk7WC5vdXRwdXRDb2xvclNwYWNlPUcub3V0cHV0Q29sb3JTcGFjZSxYLmJhdGNoaW5nPUcuYmF0Y2hpbmcsWC5pbnN0YW5jaW5nPUcuaW5zdGFuY2luZyxYLmluc3RhbmNpbmdDb2xvcj1HLmluc3RhbmNpbmdDb2xvcixYLnNraW5uaW5nPUcuc2tpbm5pbmcsWC5tb3JwaFRhcmdldHM9Ry5tb3JwaFRhcmdldHMsWC5tb3JwaE5vcm1hbHM9Ry5tb3JwaE5vcm1hbHMsWC5tb3JwaENvbG9ycz1HLm1vcnBoQ29sb3JzLFgubW9ycGhUYXJnZXRzQ291bnQ9Ry5tb3JwaFRhcmdldHNDb3VudCxYLm51bUNsaXBwaW5nUGxhbmVzPUcubnVtQ2xpcHBpbmdQbGFuZXMsWC5udW1JbnRlcnNlY3Rpb249Ry5udW1DbGlwSW50ZXJzZWN0aW9uLFgudmVydGV4QWxwaGFzPUcudmVydGV4QWxwaGFzLFgudmVydGV4VGFuZ2VudHM9Ry52ZXJ0ZXhUYW5nZW50cyxYLnRvbmVNYXBwaW5nPUcudG9uZU1hcHBpbmd9ZnVuY3Rpb24gWUEoVCxHLFgsWSxIKXtHLmlzU2NlbmUhPT0hMCYmKEc9d2UpLEoucmVzZXRUZXh0dXJlVW5pdHMoKTtjb25zdCBNZT1HLmZvZyxSZT1ZLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw/Ry5lbnZpcm9ubWVudDpudWxsLEZlPUE9PT1udWxsP3gub3V0cHV0Q29sb3JTcGFjZTpBLmlzWFJSZW5kZXJUYXJnZXQ9PT0hMD9BLnRleHR1cmUuY29sb3JTcGFjZTpWbixIZT0oWS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP21lOmllKS5nZXQoWS5lbnZNYXB8fFJlKSxKZT1ZLnZlcnRleENvbG9ycz09PSEwJiYhIVguYXR0cmlidXRlcy5jb2xvciYmWC5hdHRyaWJ1dGVzLmNvbG9yLml0ZW1TaXplPT09NCxYZT0hIVguYXR0cmlidXRlcy50YW5nZW50JiYoISFZLm5vcm1hbE1hcHx8WS5hbmlzb3Ryb3B5PjApLFllPSEhWC5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sVHQ9ISFYLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwsd249ISFYLm1vcnBoQXR0cmlidXRlcy5jb2xvcjtsZXQgT3Q9Sm47WS50b25lTWFwcGVkJiYoQT09PW51bGx8fEEuaXNYUlJlbmRlclRhcmdldD09PSEwKSYmKE90PXgudG9uZU1hcHBpbmcpO2NvbnN0IF9pPVgubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9ufHxYLm1vcnBoQXR0cmlidXRlcy5ub3JtYWx8fFgubW9ycGhBdHRyaWJ1dGVzLmNvbG9yLGd0PV9pIT09dm9pZCAwP19pLmxlbmd0aDowLFFlPVcuZ2V0KFkpLHZmPWcuc3RhdGUubGlnaHRzO2lmKGVlPT09ITAmJihkZT09PSEwfHxUIT09TSkpe2NvbnN0IFRuPVQ9PT1NJiZZLmlkPT09TDtBZS5zZXRTdGF0ZShZLFQsVG4pfWxldCBNdD0hMTtZLnZlcnNpb249PT1RZS5fX3ZlcnNpb24/KFFlLm5lZWRzTGlnaHRzJiZRZS5saWdodHNTdGF0ZVZlcnNpb24hPT12Zi5zdGF0ZS52ZXJzaW9ufHxRZS5vdXRwdXRDb2xvclNwYWNlIT09RmV8fEguaXNCYXRjaGVkTWVzaCYmUWUuYmF0Y2hpbmc9PT0hMXx8IUguaXNCYXRjaGVkTWVzaCYmUWUuYmF0Y2hpbmc9PT0hMHx8SC5pc0luc3RhbmNlZE1lc2gmJlFlLmluc3RhbmNpbmc9PT0hMXx8IUguaXNJbnN0YW5jZWRNZXNoJiZRZS5pbnN0YW5jaW5nPT09ITB8fEguaXNTa2lubmVkTWVzaCYmUWUuc2tpbm5pbmc9PT0hMXx8IUguaXNTa2lubmVkTWVzaCYmUWUuc2tpbm5pbmc9PT0hMHx8SC5pc0luc3RhbmNlZE1lc2gmJlFlLmluc3RhbmNpbmdDb2xvcj09PSEwJiZILmluc3RhbmNlQ29sb3I9PT1udWxsfHxILmlzSW5zdGFuY2VkTWVzaCYmUWUuaW5zdGFuY2luZ0NvbG9yPT09ITEmJkguaW5zdGFuY2VDb2xvciE9PW51bGx8fFFlLmVudk1hcCE9PUhlfHxZLmZvZz09PSEwJiZRZS5mb2chPT1NZXx8UWUubnVtQ2xpcHBpbmdQbGFuZXMhPT12b2lkIDAmJihRZS5udW1DbGlwcGluZ1BsYW5lcyE9PUFlLm51bVBsYW5lc3x8UWUubnVtSW50ZXJzZWN0aW9uIT09QWUubnVtSW50ZXJzZWN0aW9uKXx8UWUudmVydGV4QWxwaGFzIT09SmV8fFFlLnZlcnRleFRhbmdlbnRzIT09WGV8fFFlLm1vcnBoVGFyZ2V0cyE9PVllfHxRZS5tb3JwaE5vcm1hbHMhPT1UdHx8UWUubW9ycGhDb2xvcnMhPT13bnx8UWUudG9uZU1hcHBpbmchPT1PdHx8dWUuaXNXZWJHTDI9PT0hMCYmUWUubW9ycGhUYXJnZXRzQ291bnQhPT1ndCkmJihNdD0hMCk6KE10PSEwLFFlLl9fdmVyc2lvbj1ZLnZlcnNpb24pO2xldCB4cj1RZS5jdXJyZW50UHJvZ3JhbTtNdD09PSEwJiYoeHI9YWMoWSxHLEgpKTtsZXQgdF89ITEsSWE9ITEsTWY9ITE7Y29uc3QgJHQ9eHIuZ2V0VW5pZm9ybXMoKSx5cj1RZS51bmlmb3JtcztpZihyZS51c2VQcm9ncmFtKHhyLnByb2dyYW0pJiYodF89ITAsSWE9ITAsTWY9ITApLFkuaWQhPT1MJiYoTD1ZLmlkLElhPSEwKSx0X3x8TSE9PVQpeyR0LnNldFZhbHVlKEQsInByb2plY3Rpb25NYXRyaXgiLFQucHJvamVjdGlvbk1hdHJpeCksJHQuc2V0VmFsdWUoRCwidmlld01hdHJpeCIsVC5tYXRyaXhXb3JsZEludmVyc2UpO2NvbnN0IFRuPSR0Lm1hcC5jYW1lcmFQb3NpdGlvbjtUbiE9PXZvaWQgMCYmVG4uc2V0VmFsdWUoRCxCZS5zZXRGcm9tTWF0cml4UG9zaXRpb24oVC5tYXRyaXhXb3JsZCkpLHVlLmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJiR0LnNldFZhbHVlKEQsImxvZ0RlcHRoQnVmRkMiLDIvKE1hdGgubG9nKFQuZmFyKzEpL01hdGguTE4yKSksKFkuaXNNZXNoUGhvbmdNYXRlcmlhbHx8WS5pc01lc2hUb29uTWF0ZXJpYWx8fFkuaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxZLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fFkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbHx8WS5pc1NoYWRlck1hdGVyaWFsKSYmJHQuc2V0VmFsdWUoRCwiaXNPcnRob2dyYXBoaWMiLFQuaXNPcnRob2dyYXBoaWNDYW1lcmE9PT0hMCksTSE9PVQmJihNPVQsSWE9ITAsTWY9ITApfWlmKEguaXNTa2lubmVkTWVzaCl7JHQuc2V0T3B0aW9uYWwoRCxILCJiaW5kTWF0cml4IiksJHQuc2V0T3B0aW9uYWwoRCxILCJiaW5kTWF0cml4SW52ZXJzZSIpO2NvbnN0IFRuPUguc2tlbGV0b247VG4mJih1ZS5mbG9hdFZlcnRleFRleHR1cmVzPyhUbi5ib25lVGV4dHVyZT09PW51bGwmJlRuLmNvbXB1dGVCb25lVGV4dHVyZSgpLCR0LnNldFZhbHVlKEQsImJvbmVUZXh0dXJlIixUbi5ib25lVGV4dHVyZSxKKSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2lubmVkTWVzaCBjYW4gb25seSBiZSB1c2VkIHdpdGggV2ViR0wgMi4gV2l0aCBXZWJHTCAxIE9FU190ZXh0dXJlX2Zsb2F0IGFuZCB2ZXJ0ZXggdGV4dHVyZXMgc3VwcG9ydCBpcyByZXF1aXJlZC4iKSl9SC5pc0JhdGNoZWRNZXNoJiYoJHQuc2V0T3B0aW9uYWwoRCxILCJiYXRjaGluZ1RleHR1cmUiKSwkdC5zZXRWYWx1ZShELCJiYXRjaGluZ1RleHR1cmUiLEguX21hdHJpY2VzVGV4dHVyZSxKKSk7Y29uc3QgU2Y9WC5tb3JwaEF0dHJpYnV0ZXM7aWYoKFNmLnBvc2l0aW9uIT09dm9pZCAwfHxTZi5ub3JtYWwhPT12b2lkIDB8fFNmLmNvbG9yIT09dm9pZCAwJiZ1ZS5pc1dlYkdMMj09PSEwKSYmRGUudXBkYXRlKEgsWCx4ciksKElhfHxRZS5yZWNlaXZlU2hhZG93IT09SC5yZWNlaXZlU2hhZG93KSYmKFFlLnJlY2VpdmVTaGFkb3c9SC5yZWNlaXZlU2hhZG93LCR0LnNldFZhbHVlKEQsInJlY2VpdmVTaGFkb3ciLEgucmVjZWl2ZVNoYWRvdykpLFkuaXNNZXNoR291cmF1ZE1hdGVyaWFsJiZZLmVudk1hcCE9PW51bGwmJih5ci5lbnZNYXAudmFsdWU9SGUseXIuZmxpcEVudk1hcC52YWx1ZT1IZS5pc0N1YmVUZXh0dXJlJiZIZS5pc1JlbmRlclRhcmdldFRleHR1cmU9PT0hMT8tMToxKSxJYSYmKCR0LnNldFZhbHVlKEQsInRvbmVNYXBwaW5nRXhwb3N1cmUiLHgudG9uZU1hcHBpbmdFeHBvc3VyZSksUWUubmVlZHNMaWdodHMmJlpBKHlyLE1mKSxNZSYmWS5mb2c9PT0hMCYmc2UucmVmcmVzaEZvZ1VuaWZvcm1zKHlyLE1lKSxzZS5yZWZyZXNoTWF0ZXJpYWxVbmlmb3Jtcyh5cixZLEYseixUZSksYm8udXBsb2FkKEQsajAoUWUpLHlyLEopKSxZLmlzU2hhZGVyTWF0ZXJpYWwmJlkudW5pZm9ybXNOZWVkVXBkYXRlPT09ITAmJihiby51cGxvYWQoRCxqMChRZSkseXIsSiksWS51bmlmb3Jtc05lZWRVcGRhdGU9ITEpLFkuaXNTcHJpdGVNYXRlcmlhbCYmJHQuc2V0VmFsdWUoRCwiY2VudGVyIixILmNlbnRlciksJHQuc2V0VmFsdWUoRCwibW9kZWxWaWV3TWF0cml4IixILm1vZGVsVmlld01hdHJpeCksJHQuc2V0VmFsdWUoRCwibm9ybWFsTWF0cml4IixILm5vcm1hbE1hdHJpeCksJHQuc2V0VmFsdWUoRCwibW9kZWxNYXRyaXgiLEgubWF0cml4V29ybGQpLFkuaXNTaGFkZXJNYXRlcmlhbHx8WS5pc1Jhd1NoYWRlck1hdGVyaWFsKXtjb25zdCBUbj1ZLnVuaWZvcm1zR3JvdXBzO2ZvcihsZXQgYmY9MCxLQT1Ubi5sZW5ndGg7YmY8S0E7YmYrKylpZih1ZS5pc1dlYkdMMil7Y29uc3Qgbl89VG5bYmZdO05lLnVwZGF0ZShuXyx4ciksTmUuYmluZChuXyx4cil9ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVuaWZvcm0gQnVmZmVyIE9iamVjdHMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMIDIuIil9cmV0dXJuIHhyfWZ1bmN0aW9uIFpBKFQsRyl7VC5hbWJpZW50TGlnaHRDb2xvci5uZWVkc1VwZGF0ZT1HLFQubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZT1HLFQuZGlyZWN0aW9uYWxMaWdodHMubmVlZHNVcGRhdGU9RyxULmRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzLm5lZWRzVXBkYXRlPUcsVC5wb2ludExpZ2h0cy5uZWVkc1VwZGF0ZT1HLFQucG9pbnRMaWdodFNoYWRvd3MubmVlZHNVcGRhdGU9RyxULnNwb3RMaWdodHMubmVlZHNVcGRhdGU9RyxULnNwb3RMaWdodFNoYWRvd3MubmVlZHNVcGRhdGU9RyxULnJlY3RBcmVhTGlnaHRzLm5lZWRzVXBkYXRlPUcsVC5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlPUd9ZnVuY3Rpb24gSkEoVCl7cmV0dXJuIFQuaXNNZXNoTGFtYmVydE1hdGVyaWFsfHxULmlzTWVzaFRvb25NYXRlcmlhbHx8VC5pc01lc2hQaG9uZ01hdGVyaWFsfHxULmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWx8fFQuaXNTaGFkb3dNYXRlcmlhbHx8VC5pc1NoYWRlck1hdGVyaWFsJiZULmxpZ2h0cz09PSEwfXRoaXMuZ2V0QWN0aXZlQ3ViZUZhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gU30sdGhpcy5nZXRBY3RpdmVNaXBtYXBMZXZlbD1mdW5jdGlvbigpe3JldHVybiBifSx0aGlzLmdldFJlbmRlclRhcmdldD1mdW5jdGlvbigpe3JldHVybiBBfSx0aGlzLnNldFJlbmRlclRhcmdldFRleHR1cmVzPWZ1bmN0aW9uKFQsRyxYKXtXLmdldChULnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlPUcsVy5nZXQoVC5kZXB0aFRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlPVg7Y29uc3QgWT1XLmdldChUKTtZLl9faGFzRXh0ZXJuYWxUZXh0dXJlcz0hMCxZLl9faGFzRXh0ZXJuYWxUZXh0dXJlcyYmKFkuX19hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlcj1YPT09dm9pZCAwLFkuX19hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlcnx8Sy5oYXMoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpPT09ITAmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFJlbmRlci10by10ZXh0dXJlIGV4dGVuc2lvbiB3YXMgZGlzYWJsZWQgYmVjYXVzZSBhbiBleHRlcm5hbCB0ZXh0dXJlIHdhcyBwcm92aWRlZCIpLFkuX191c2VSZW5kZXJUb1RleHR1cmU9ITEpKX0sdGhpcy5zZXRSZW5kZXJUYXJnZXRGcmFtZWJ1ZmZlcj1mdW5jdGlvbihULEcpe2NvbnN0IFg9Vy5nZXQoVCk7WC5fX3dlYmdsRnJhbWVidWZmZXI9RyxYLl9fdXNlRGVmYXVsdEZyYW1lYnVmZmVyPUc9PT12b2lkIDB9LHRoaXMuc2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKFQsRz0wLFg9MCl7QT1ULFM9RyxiPVg7bGV0IFk9ITAsSD1udWxsLE1lPSExLFJlPSExO2lmKFQpe2NvbnN0IEhlPVcuZ2V0KFQpO0hlLl9fdXNlRGVmYXVsdEZyYW1lYnVmZmVyIT09dm9pZCAwPyhyZS5iaW5kRnJhbWVidWZmZXIoRC5GUkFNRUJVRkZFUixudWxsKSxZPSExKTpIZS5fX3dlYmdsRnJhbWVidWZmZXI9PT12b2lkIDA/Si5zZXR1cFJlbmRlclRhcmdldChUKTpIZS5fX2hhc0V4dGVybmFsVGV4dHVyZXMmJkoucmViaW5kVGV4dHVyZXMoVCxXLmdldChULnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlLFcuZ2V0KFQuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSk7Y29uc3QgSmU9VC50ZXh0dXJlOyhKZS5pc0RhdGEzRFRleHR1cmV8fEplLmlzRGF0YUFycmF5VGV4dHVyZXx8SmUuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlKSYmKFJlPSEwKTtjb25zdCBYZT1XLmdldChUKS5fX3dlYmdsRnJhbWVidWZmZXI7VC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldD8oQXJyYXkuaXNBcnJheShYZVtHXSk/SD1YZVtHXVtYXTpIPVhlW0ddLE1lPSEwKTp1ZS5pc1dlYkdMMiYmVC5zYW1wbGVzPjAmJkoudXNlTXVsdGlzYW1wbGVkUlRUKFQpPT09ITE/SD1XLmdldChUKS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI6QXJyYXkuaXNBcnJheShYZSk/SD1YZVtYXTpIPVhlLHcuY29weShULnZpZXdwb3J0KSxSLmNvcHkoVC5zY2lzc29yKSxOPVQuc2Npc3NvclRlc3R9ZWxzZSB3LmNvcHkoUSkubXVsdGlwbHlTY2FsYXIoRikuZmxvb3IoKSxSLmNvcHkobmUpLm11bHRpcGx5U2NhbGFyKEYpLmZsb29yKCksTj1mZTtpZihyZS5iaW5kRnJhbWVidWZmZXIoRC5GUkFNRUJVRkZFUixIKSYmdWUuZHJhd0J1ZmZlcnMmJlkmJnJlLmRyYXdCdWZmZXJzKFQsSCkscmUudmlld3BvcnQodykscmUuc2Npc3NvcihSKSxyZS5zZXRTY2lzc29yVGVzdChOKSxNZSl7Y29uc3QgSGU9Vy5nZXQoVC50ZXh0dXJlKTtELmZyYW1lYnVmZmVyVGV4dHVyZTJEKEQuRlJBTUVCVUZGRVIsRC5DT0xPUl9BVFRBQ0hNRU5UMCxELlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCtHLEhlLl9fd2ViZ2xUZXh0dXJlLFgpfWVsc2UgaWYoUmUpe2NvbnN0IEhlPVcuZ2V0KFQudGV4dHVyZSksSmU9R3x8MDtELmZyYW1lYnVmZmVyVGV4dHVyZUxheWVyKEQuRlJBTUVCVUZGRVIsRC5DT0xPUl9BVFRBQ0hNRU5UMCxIZS5fX3dlYmdsVGV4dHVyZSxYfHwwLEplKX1MPS0xfSx0aGlzLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM9ZnVuY3Rpb24oVCxHLFgsWSxILE1lLFJlKXtpZighKFQmJlQuaXNXZWJHTFJlbmRlclRhcmdldCkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4iKTtyZXR1cm59bGV0IEZlPVcuZ2V0KFQpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtpZihULmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0JiZSZSE9PXZvaWQgMCYmKEZlPUZlW1JlXSksRmUpe3JlLmJpbmRGcmFtZWJ1ZmZlcihELkZSQU1FQlVGRkVSLEZlKTt0cnl7Y29uc3QgSGU9VC50ZXh0dXJlLEplPUhlLmZvcm1hdCxYZT1IZS50eXBlO2lmKEplIT09YW4mJmF0LmNvbnZlcnQoSmUpIT09RC5nZXRQYXJhbWV0ZXIoRC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LiIpO3JldHVybn1jb25zdCBZZT1YZT09PXdyJiYoSy5oYXMoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpfHx1ZS5pc1dlYkdMMiYmSy5oYXMoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKSk7aWYoWGUhPT1RbiYmYXQuY29udmVydChYZSkhPT1ELmdldFBhcmFtZXRlcihELklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSkmJiEoWGU9PT1SbiYmKHVlLmlzV2ViR0wyfHxLLmhhcygiT0VTX3RleHR1cmVfZmxvYXQiKXx8Sy5oYXMoIldFQkdMX2NvbG9yX2J1ZmZlcl9mbG9hdCIpKSkmJiFZZSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFVuc2lnbmVkQnl0ZVR5cGUgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLiIpO3JldHVybn1HPj0wJiZHPD1ULndpZHRoLVkmJlg+PTAmJlg8PVQuaGVpZ2h0LUgmJkQucmVhZFBpeGVscyhHLFgsWSxILGF0LmNvbnZlcnQoSmUpLGF0LmNvbnZlcnQoWGUpLE1lKX1maW5hbGx5e2NvbnN0IEhlPUEhPT1udWxsP1cuZ2V0KEEpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjpudWxsO3JlLmJpbmRGcmFtZWJ1ZmZlcihELkZSQU1FQlVGRkVSLEhlKX19fSx0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbihULEcsWD0wKXtjb25zdCBZPU1hdGgucG93KDIsLVgpLEg9TWF0aC5mbG9vcihHLmltYWdlLndpZHRoKlkpLE1lPU1hdGguZmxvb3IoRy5pbWFnZS5oZWlnaHQqWSk7Si5zZXRUZXh0dXJlMkQoRywwKSxELmNvcHlUZXhTdWJJbWFnZTJEKEQuVEVYVFVSRV8yRCxYLDAsMCxULngsVC55LEgsTWUpLHJlLnVuYmluZFRleHR1cmUoKX0sdGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZT1mdW5jdGlvbihULEcsWCxZPTApe2NvbnN0IEg9Ry5pbWFnZS53aWR0aCxNZT1HLmltYWdlLmhlaWdodCxSZT1hdC5jb252ZXJ0KFguZm9ybWF0KSxGZT1hdC5jb252ZXJ0KFgudHlwZSk7Si5zZXRUZXh0dXJlMkQoWCwwKSxELnBpeGVsU3RvcmVpKEQuVU5QQUNLX0ZMSVBfWV9XRUJHTCxYLmZsaXBZKSxELnBpeGVsU3RvcmVpKEQuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLFgucHJlbXVsdGlwbHlBbHBoYSksRC5waXhlbFN0b3JlaShELlVOUEFDS19BTElHTk1FTlQsWC51bnBhY2tBbGlnbm1lbnQpLEcuaXNEYXRhVGV4dHVyZT9ELnRleFN1YkltYWdlMkQoRC5URVhUVVJFXzJELFksVC54LFQueSxILE1lLFJlLEZlLEcuaW1hZ2UuZGF0YSk6Ry5pc0NvbXByZXNzZWRUZXh0dXJlP0QuY29tcHJlc3NlZFRleFN1YkltYWdlMkQoRC5URVhUVVJFXzJELFksVC54LFQueSxHLm1pcG1hcHNbMF0ud2lkdGgsRy5taXBtYXBzWzBdLmhlaWdodCxSZSxHLm1pcG1hcHNbMF0uZGF0YSk6RC50ZXhTdWJJbWFnZTJEKEQuVEVYVFVSRV8yRCxZLFQueCxULnksUmUsRmUsRy5pbWFnZSksWT09PTAmJlguZ2VuZXJhdGVNaXBtYXBzJiZELmdlbmVyYXRlTWlwbWFwKEQuVEVYVFVSRV8yRCkscmUudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q9ZnVuY3Rpb24oVCxHLFgsWSxIPTApe2lmKHguaXNXZWJHTDFSZW5kZXJlcil7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q6IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7cmV0dXJufWNvbnN0IE1lPVQubWF4LngtVC5taW4ueCsxLFJlPVQubWF4LnktVC5taW4ueSsxLEZlPVQubWF4LnotVC5taW4ueisxLEhlPWF0LmNvbnZlcnQoWS5mb3JtYXQpLEplPWF0LmNvbnZlcnQoWS50eXBlKTtsZXQgWGU7aWYoWS5pc0RhdGEzRFRleHR1cmUpSi5zZXRUZXh0dXJlM0QoWSwwKSxYZT1ELlRFWFRVUkVfM0Q7ZWxzZSBpZihZLmlzRGF0YUFycmF5VGV4dHVyZSlKLnNldFRleHR1cmUyREFycmF5KFksMCksWGU9RC5URVhUVVJFXzJEX0FSUkFZO2Vsc2V7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q6IG9ubHkgc3VwcG9ydHMgVEhSRUUuRGF0YVRleHR1cmUzRCBhbmQgVEhSRUUuRGF0YVRleHR1cmUyREFycmF5LiIpO3JldHVybn1ELnBpeGVsU3RvcmVpKEQuVU5QQUNLX0ZMSVBfWV9XRUJHTCxZLmZsaXBZKSxELnBpeGVsU3RvcmVpKEQuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMLFkucHJlbXVsdGlwbHlBbHBoYSksRC5waXhlbFN0b3JlaShELlVOUEFDS19BTElHTk1FTlQsWS51bnBhY2tBbGlnbm1lbnQpO2NvbnN0IFllPUQuZ2V0UGFyYW1ldGVyKEQuVU5QQUNLX1JPV19MRU5HVEgpLFR0PUQuZ2V0UGFyYW1ldGVyKEQuVU5QQUNLX0lNQUdFX0hFSUdIVCksd249RC5nZXRQYXJhbWV0ZXIoRC5VTlBBQ0tfU0tJUF9QSVhFTFMpLE90PUQuZ2V0UGFyYW1ldGVyKEQuVU5QQUNLX1NLSVBfUk9XUyksX2k9RC5nZXRQYXJhbWV0ZXIoRC5VTlBBQ0tfU0tJUF9JTUFHRVMpLGd0PVguaXNDb21wcmVzc2VkVGV4dHVyZT9YLm1pcG1hcHNbMF06WC5pbWFnZTtELnBpeGVsU3RvcmVpKEQuVU5QQUNLX1JPV19MRU5HVEgsZ3Qud2lkdGgpLEQucGl4ZWxTdG9yZWkoRC5VTlBBQ0tfSU1BR0VfSEVJR0hULGd0LmhlaWdodCksRC5waXhlbFN0b3JlaShELlVOUEFDS19TS0lQX1BJWEVMUyxULm1pbi54KSxELnBpeGVsU3RvcmVpKEQuVU5QQUNLX1NLSVBfUk9XUyxULm1pbi55KSxELnBpeGVsU3RvcmVpKEQuVU5QQUNLX1NLSVBfSU1BR0VTLFQubWluLnopLFguaXNEYXRhVGV4dHVyZXx8WC5pc0RhdGEzRFRleHR1cmU/RC50ZXhTdWJJbWFnZTNEKFhlLEgsRy54LEcueSxHLnosTWUsUmUsRmUsSGUsSmUsZ3QuZGF0YSk6WC5pc0NvbXByZXNzZWRBcnJheVRleHR1cmU/KGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlci5jb3B5VGV4dHVyZVRvVGV4dHVyZTNEOiB1bnRlc3RlZCBzdXBwb3J0IGZvciBjb21wcmVzc2VkIHNyY1RleHR1cmUuIiksRC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UzRChYZSxILEcueCxHLnksRy56LE1lLFJlLEZlLEhlLGd0LmRhdGEpKTpELnRleFN1YkltYWdlM0QoWGUsSCxHLngsRy55LEcueixNZSxSZSxGZSxIZSxKZSxndCksRC5waXhlbFN0b3JlaShELlVOUEFDS19ST1dfTEVOR1RILFllKSxELnBpeGVsU3RvcmVpKEQuVU5QQUNLX0lNQUdFX0hFSUdIVCxUdCksRC5waXhlbFN0b3JlaShELlVOUEFDS19TS0lQX1BJWEVMUyx3biksRC5waXhlbFN0b3JlaShELlVOUEFDS19TS0lQX1JPV1MsT3QpLEQucGl4ZWxTdG9yZWkoRC5VTlBBQ0tfU0tJUF9JTUFHRVMsX2kpLEg9PT0wJiZZLmdlbmVyYXRlTWlwbWFwcyYmRC5nZW5lcmF0ZU1pcG1hcChYZSkscmUudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmluaXRUZXh0dXJlPWZ1bmN0aW9uKFQpe1QuaXNDdWJlVGV4dHVyZT9KLnNldFRleHR1cmVDdWJlKFQsMCk6VC5pc0RhdGEzRFRleHR1cmU/Si5zZXRUZXh0dXJlM0QoVCwwKTpULmlzRGF0YUFycmF5VGV4dHVyZXx8VC5pc0NvbXByZXNzZWRBcnJheVRleHR1cmU/Si5zZXRUZXh0dXJlMkRBcnJheShULDApOkouc2V0VGV4dHVyZTJEKFQsMCkscmUudW5iaW5kVGV4dHVyZSgpfSx0aGlzLnJlc2V0U3RhdGU9ZnVuY3Rpb24oKXtTPTAsYj0wLEE9bnVsbCxyZS5yZXNldCgpLFZlLnJlc2V0KCl9LHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18hPSJ1bmRlZmluZWQiJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1nZXQgY29vcmRpbmF0ZVN5c3RlbSgpe3JldHVybiBQbn1nZXQgb3V0cHV0Q29sb3JTcGFjZSgpe3JldHVybiB0aGlzLl9vdXRwdXRDb2xvclNwYWNlfXNldCBvdXRwdXRDb2xvclNwYWNlKGUpe3RoaXMuX291dHB1dENvbG9yU3BhY2U9ZTtjb25zdCB0PXRoaXMuZ2V0Q29udGV4dCgpO3QuZHJhd2luZ0J1ZmZlckNvbG9yU3BhY2U9ZT09PXFhPyJkaXNwbGF5LXAzIjoic3JnYiIsdC51bnBhY2tDb2xvclNwYWNlPW90LndvcmtpbmdDb2xvclNwYWNlPT09THM/ImRpc3BsYXktcDMiOiJzcmdiIn1nZXQgcGh5c2ljYWxseUNvcnJlY3RMaWdodHMoKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUaGUgcHJvcGVydHkgLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzIGhhcyBiZWVuIHJlbW92ZWQuIFNldCByZW5kZXJlci51c2VMZWdhY3lMaWdodHMgaW5zdGVhZC4iKSwhdGhpcy51c2VMZWdhY3lMaWdodHN9c2V0IHBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzKGUpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGhlIHByb3BlcnR5IC5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyBoYXMgYmVlbiByZW1vdmVkLiBTZXQgcmVuZGVyZXIudXNlTGVnYWN5TGlnaHRzIGluc3RlYWQuIiksdGhpcy51c2VMZWdhY3lMaWdodHM9IWV9Z2V0IG91dHB1dEVuY29kaW5nKCl7cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogUHJvcGVydHkgLm91dHB1dEVuY29kaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAub3V0cHV0Q29sb3JTcGFjZSBpbnN0ZWFkLiIpLHRoaXMub3V0cHV0Q29sb3JTcGFjZT09PVB0P2JpOlpjfXNldCBvdXRwdXRFbmNvZGluZyhlKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFByb3BlcnR5IC5vdXRwdXRFbmNvZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm91dHB1dENvbG9yU3BhY2UgaW5zdGVhZC4iKSx0aGlzLm91dHB1dENvbG9yU3BhY2U9ZT09PWJpP1B0OlZufWdldCB1c2VMZWdhY3lMaWdodHMoKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUaGUgcHJvcGVydHkgLnVzZUxlZ2FjeUxpZ2h0cyBoYXMgYmVlbiBkZXByZWNhdGVkLiBNaWdyYXRlIHlvdXIgbGlnaHRpbmcgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgZ3VpZGU6IGh0dHBzOi8vZGlzY291cnNlLnRocmVlanMub3JnL3QvdXBkYXRlcy10by1saWdodGluZy1pbi10aHJlZS1qcy1yMTU1LzUzNzMzLiIpLHRoaXMuX3VzZUxlZ2FjeUxpZ2h0c31zZXQgdXNlTGVnYWN5TGlnaHRzKGUpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGhlIHByb3BlcnR5IC51c2VMZWdhY3lMaWdodHMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTWlncmF0ZSB5b3VyIGxpZ2h0aW5nIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIGd1aWRlOiBodHRwczovL2Rpc2NvdXJzZS50aHJlZWpzLm9yZy90L3VwZGF0ZXMtdG8tbGlnaHRpbmctaW4tdGhyZWUtanMtcjE1NS81MzczMy4iKSx0aGlzLl91c2VMZWdhY3lMaWdodHM9ZX19Y2xhc3Mgd3AgZXh0ZW5kcyBicHt9d3AucHJvdG90eXBlLmlzV2ViR0wxUmVuZGVyZXI9ITA7Y2xhc3Mgd297Y29uc3RydWN0b3IoZSx0PTI1ZS01KXt0aGlzLmlzRm9nRXhwMj0hMCx0aGlzLm5hbWU9IiIsdGhpcy5jb2xvcj1uZXcgeWUoZSksdGhpcy5kZW5zaXR5PXR9Y2xvbmUoKXtyZXR1cm4gbmV3IHdvKHRoaXMuY29sb3IsdGhpcy5kZW5zaXR5KX10b0pTT04oKXtyZXR1cm57dHlwZToiRm9nRXhwMiIsbmFtZTp0aGlzLm5hbWUsY29sb3I6dGhpcy5jb2xvci5nZXRIZXgoKSxkZW5zaXR5OnRoaXMuZGVuc2l0eX19fWNsYXNzIEVve2NvbnN0cnVjdG9yKGUsdD0xLG49MWUzKXt0aGlzLmlzRm9nPSEwLHRoaXMubmFtZT0iIix0aGlzLmNvbG9yPW5ldyB5ZShlKSx0aGlzLm5lYXI9dCx0aGlzLmZhcj1ufWNsb25lKCl7cmV0dXJuIG5ldyBFbyh0aGlzLmNvbG9yLHRoaXMubmVhcix0aGlzLmZhcil9dG9KU09OKCl7cmV0dXJue3R5cGU6IkZvZyIsbmFtZTp0aGlzLm5hbWUsY29sb3I6dGhpcy5jb2xvci5nZXRIZXgoKSxuZWFyOnRoaXMubmVhcixmYXI6dGhpcy5mYXJ9fX1jbGFzcyBFcCBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzU2NlbmU9ITAsdGhpcy50eXBlPSJTY2VuZSIsdGhpcy5iYWNrZ3JvdW5kPW51bGwsdGhpcy5lbnZpcm9ubWVudD1udWxsLHRoaXMuZm9nPW51bGwsdGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcz0wLHRoaXMuYmFja2dyb3VuZEludGVuc2l0eT0xLHRoaXMub3ZlcnJpZGVNYXRlcmlhbD1udWxsLHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18hPSJ1bmRlZmluZWQiJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1jb3B5KGUsdCl7cmV0dXJuIHN1cGVyLmNvcHkoZSx0KSxlLmJhY2tncm91bmQhPT1udWxsJiYodGhpcy5iYWNrZ3JvdW5kPWUuYmFja2dyb3VuZC5jbG9uZSgpKSxlLmVudmlyb25tZW50IT09bnVsbCYmKHRoaXMuZW52aXJvbm1lbnQ9ZS5lbnZpcm9ubWVudC5jbG9uZSgpKSxlLmZvZyE9PW51bGwmJih0aGlzLmZvZz1lLmZvZy5jbG9uZSgpKSx0aGlzLmJhY2tncm91bmRCbHVycmluZXNzPWUuYmFja2dyb3VuZEJsdXJyaW5lc3MsdGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5PWUuYmFja2dyb3VuZEludGVuc2l0eSxlLm92ZXJyaWRlTWF0ZXJpYWwhPT1udWxsJiYodGhpcy5vdmVycmlkZU1hdGVyaWFsPWUub3ZlcnJpZGVNYXRlcmlhbC5jbG9uZSgpKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ZS5tYXRyaXhBdXRvVXBkYXRlLHRoaXN9dG9KU09OKGUpe2NvbnN0IHQ9c3VwZXIudG9KU09OKGUpO3JldHVybiB0aGlzLmZvZyE9PW51bGwmJih0Lm9iamVjdC5mb2c9dGhpcy5mb2cudG9KU09OKCkpLHRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3M+MCYmKHQub2JqZWN0LmJhY2tncm91bmRCbHVycmluZXNzPXRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3MpLHRoaXMuYmFja2dyb3VuZEludGVuc2l0eSE9PTEmJih0Lm9iamVjdC5iYWNrZ3JvdW5kSW50ZW5zaXR5PXRoaXMuYmFja2dyb3VuZEludGVuc2l0eSksdH19Y2xhc3MgQW97Y29uc3RydWN0b3IoZSx0KXt0aGlzLmlzSW50ZXJsZWF2ZWRCdWZmZXI9ITAsdGhpcy5hcnJheT1lLHRoaXMuc3RyaWRlPXQsdGhpcy5jb3VudD1lIT09dm9pZCAwP2UubGVuZ3RoL3Q6MCx0aGlzLnVzYWdlPU5zLHRoaXMuX3VwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX0sdGhpcy51cGRhdGVSYW5nZXM9W10sdGhpcy52ZXJzaW9uPTAsdGhpcy51dWlkPV9uKCl9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUoZSl7ZT09PSEwJiZ0aGlzLnZlcnNpb24rK31nZXQgdXBkYXRlUmFuZ2UoKXtyZXR1cm4gY29uc29sZS53YXJuKCdUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlcjogInVwZGF0ZVJhbmdlIiBpcyBkZXByZWNhdGVkIGFuZCByZW1vdmVkIGluIHIxNjkuIFVzZSAiYWRkVXBkYXRlUmFuZ2UoKSIgaW5zdGVhZC4nKSx0aGlzLl91cGRhdGVSYW5nZX1zZXRVc2FnZShlKXtyZXR1cm4gdGhpcy51c2FnZT1lLHRoaXN9YWRkVXBkYXRlUmFuZ2UoZSx0KXt0aGlzLnVwZGF0ZVJhbmdlcy5wdXNoKHtzdGFydDplLGNvdW50OnR9KX1jbGVhclVwZGF0ZVJhbmdlcygpe3RoaXMudXBkYXRlUmFuZ2VzLmxlbmd0aD0wfWNvcHkoZSl7cmV0dXJuIHRoaXMuYXJyYXk9bmV3IGUuYXJyYXkuY29uc3RydWN0b3IoZS5hcnJheSksdGhpcy5jb3VudD1lLmNvdW50LHRoaXMuc3RyaWRlPWUuc3RyaWRlLHRoaXMudXNhZ2U9ZS51c2FnZSx0aGlzfWNvcHlBdChlLHQsbil7ZSo9dGhpcy5zdHJpZGUsbio9dC5zdHJpZGU7Zm9yKGxldCBpPTAscz10aGlzLnN0cmlkZTtpPHM7aSsrKXRoaXMuYXJyYXlbZStpXT10LmFycmF5W24raV07cmV0dXJuIHRoaXN9c2V0KGUsdD0wKXtyZXR1cm4gdGhpcy5hcnJheS5zZXQoZSx0KSx0aGlzfWNsb25lKGUpe2UuYXJyYXlCdWZmZXJzPT09dm9pZCAwJiYoZS5hcnJheUJ1ZmZlcnM9e30pLHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkPT09dm9pZCAwJiYodGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9X24oKSksZS5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPT09dm9pZCAwJiYoZS5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPXRoaXMuYXJyYXkuc2xpY2UoMCkuYnVmZmVyKTtjb25zdCB0PW5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKGUuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSksbj1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0LHRoaXMuc3RyaWRlKTtyZXR1cm4gbi5zZXRVc2FnZSh0aGlzLnVzYWdlKSxufW9uVXBsb2FkKGUpe3JldHVybiB0aGlzLm9uVXBsb2FkQ2FsbGJhY2s9ZSx0aGlzfXRvSlNPTihlKXtyZXR1cm4gZS5hcnJheUJ1ZmZlcnM9PT12b2lkIDAmJihlLmFycmF5QnVmZmVycz17fSksdGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9PT12b2lkIDAmJih0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZD1fbigpKSxlLmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09PT12b2lkIDAmJihlLmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF09QXJyYXkuZnJvbShuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheS5idWZmZXIpKSkse3V1aWQ6dGhpcy51dWlkLGJ1ZmZlcjp0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxzdHJpZGU6dGhpcy5zdHJpZGV9fX1jb25zdCBKdD1uZXcgUDtjbGFzcyBRaXtjb25zdHJ1Y3RvcihlLHQsbixpPSExKXt0aGlzLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5uYW1lPSIiLHRoaXMuZGF0YT1lLHRoaXMuaXRlbVNpemU9dCx0aGlzLm9mZnNldD1uLHRoaXMubm9ybWFsaXplZD1pfWdldCBjb3VudCgpe3JldHVybiB0aGlzLmRhdGEuY291bnR9Z2V0IGFycmF5KCl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheX1zZXQgbmVlZHNVcGRhdGUoZSl7dGhpcy5kYXRhLm5lZWRzVXBkYXRlPWV9YXBwbHlNYXRyaXg0KGUpe2ZvcihsZXQgdD0wLG49dGhpcy5kYXRhLmNvdW50O3Q8bjt0KyspSnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLHQpLEp0LmFwcGx5TWF0cml4NChlKSx0aGlzLnNldFhZWih0LEp0LngsSnQueSxKdC56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeChlKXtmb3IobGV0IHQ9MCxuPXRoaXMuY291bnQ7dDxuO3QrKylKdC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsdCksSnQuYXBwbHlOb3JtYWxNYXRyaXgoZSksdGhpcy5zZXRYWVoodCxKdC54LEp0LnksSnQueik7cmV0dXJuIHRoaXN9dHJhbnNmb3JtRGlyZWN0aW9uKGUpe2ZvcihsZXQgdD0wLG49dGhpcy5jb3VudDt0PG47dCsrKUp0LmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyx0KSxKdC50cmFuc2Zvcm1EaXJlY3Rpb24oZSksdGhpcy5zZXRYWVoodCxKdC54LEp0LnksSnQueik7cmV0dXJuIHRoaXN9c2V0WChlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVtlKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdPXQsdGhpc31zZXRZKGUsdCl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKHQ9cWUodCx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W2UqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsxXT10LHRoaXN9c2V0WihlLHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVtlKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl09dCx0aGlzfXNldFcoZSx0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYodD1xZSh0LHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbZSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdPXQsdGhpc31nZXRYKGUpe2xldCB0PXRoaXMuZGF0YS5hcnJheVtlKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9Z2V0WShlKXtsZXQgdD10aGlzLmRhdGEuYXJyYXlbZSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9Z2V0WihlKXtsZXQgdD10aGlzLmRhdGEuYXJyYXlbZSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9Z2V0VyhlKXtsZXQgdD10aGlzLmRhdGEuYXJyYXlbZSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJih0PW9uKHQsdGhpcy5hcnJheSkpLHR9c2V0WFkoZSx0LG4pe3JldHVybiBlPWUqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCx0aGlzLm5vcm1hbGl6ZWQmJih0PXFlKHQsdGhpcy5hcnJheSksbj1xZShuLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbZSswXT10LHRoaXMuZGF0YS5hcnJheVtlKzFdPW4sdGhpc31zZXRYWVooZSx0LG4saSl7cmV0dXJuIGU9ZSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCYmKHQ9cWUodCx0aGlzLmFycmF5KSxuPXFlKG4sdGhpcy5hcnJheSksaT1xZShpLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbZSswXT10LHRoaXMuZGF0YS5hcnJheVtlKzFdPW4sdGhpcy5kYXRhLmFycmF5W2UrMl09aSx0aGlzfXNldFhZWlcoZSx0LG4saSxzKXtyZXR1cm4gZT1lKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQsdGhpcy5ub3JtYWxpemVkJiYodD1xZSh0LHRoaXMuYXJyYXkpLG49cWUobix0aGlzLmFycmF5KSxpPXFlKGksdGhpcy5hcnJheSkscz1xZShzLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbZSswXT10LHRoaXMuZGF0YS5hcnJheVtlKzFdPW4sdGhpcy5kYXRhLmFycmF5W2UrMl09aSx0aGlzLmRhdGEuYXJyYXlbZSszXT1zLHRoaXN9Y2xvbmUoZSl7aWYoZT09PXZvaWQgMCl7Y29uc29sZS5sb2coIlRIUkVFLkludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLmNsb25lKCk6IENsb25pbmcgYW4gaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlLWludGVybGVhdmUgYnVmZmVyIGRhdGEuIik7Y29uc3QgdD1bXTtmb3IobGV0IG49MDtuPHRoaXMuY291bnQ7bisrKXtjb25zdCBpPW4qdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDtmb3IobGV0IHM9MDtzPHRoaXMuaXRlbVNpemU7cysrKXQucHVzaCh0aGlzLmRhdGEuYXJyYXlbaStzXSl9cmV0dXJuIG5ldyBLZShuZXcgdGhpcy5hcnJheS5jb25zdHJ1Y3Rvcih0KSx0aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCl9ZWxzZSByZXR1cm4gZS5pbnRlcmxlYXZlZEJ1ZmZlcnM9PT12b2lkIDAmJihlLmludGVybGVhdmVkQnVmZmVycz17fSksZS5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdPT09dm9pZCAwJiYoZS5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdPXRoaXMuZGF0YS5jbG9uZShlKSksbmV3IFFpKGUuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXSx0aGlzLml0ZW1TaXplLHRoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCl9dG9KU09OKGUpe2lmKGU9PT12b2lkIDApe2NvbnNvbGUubG9nKCJUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS50b0pTT04oKTogU2VyaWFsaXppbmcgYW4gaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlLWludGVybGVhdmUgYnVmZmVyIGRhdGEuIik7Y29uc3QgdD1bXTtmb3IobGV0IG49MDtuPHRoaXMuY291bnQ7bisrKXtjb25zdCBpPW4qdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDtmb3IobGV0IHM9MDtzPHRoaXMuaXRlbVNpemU7cysrKXQucHVzaCh0aGlzLmRhdGEuYXJyYXlbaStzXSl9cmV0dXJue2l0ZW1TaXplOnRoaXMuaXRlbVNpemUsdHlwZTp0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6dCxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19ZWxzZSByZXR1cm4gZS5pbnRlcmxlYXZlZEJ1ZmZlcnM9PT12b2lkIDAmJihlLmludGVybGVhdmVkQnVmZmVycz17fSksZS5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdPT09dm9pZCAwJiYoZS5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdPXRoaXMuZGF0YS50b0pTT04oZSkpLHtpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiEwLGl0ZW1TaXplOnRoaXMuaXRlbVNpemUsZGF0YTp0aGlzLmRhdGEudXVpZCxvZmZzZXQ6dGhpcy5vZmZzZXQsbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9fX1jbGFzcyBEaCBleHRlbmRzIEh0e2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy5pc1Nwcml0ZU1hdGVyaWFsPSEwLHRoaXMudHlwZT0iU3ByaXRlTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHllKDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLnJvdGF0aW9uPTAsdGhpcy5zaXplQXR0ZW51YXRpb249ITAsdGhpcy50cmFuc3BhcmVudD0hMCx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuY29sb3IuY29weShlLmNvbG9yKSx0aGlzLm1hcD1lLm1hcCx0aGlzLmFscGhhTWFwPWUuYWxwaGFNYXAsdGhpcy5yb3RhdGlvbj1lLnJvdGF0aW9uLHRoaXMuc2l6ZUF0dGVudWF0aW9uPWUuc2l6ZUF0dGVudWF0aW9uLHRoaXMuZm9nPWUuZm9nLHRoaXN9fWxldCBacjtjb25zdCBacz1uZXcgUCxKcj1uZXcgUCxLcj1uZXcgUCxRcj1uZXcgcSxKcz1uZXcgcSxBcD1uZXcgSWUsVG89bmV3IFAsS3M9bmV3IFAsQ289bmV3IFAsVHA9bmV3IHEsTmg9bmV3IHEsQ3A9bmV3IHE7Y2xhc3MgUnAgZXh0ZW5kcyBydHtjb25zdHJ1Y3RvcihlPW5ldyBEaCl7aWYoc3VwZXIoKSx0aGlzLmlzU3ByaXRlPSEwLHRoaXMudHlwZT0iU3ByaXRlIixacj09PXZvaWQgMCl7WnI9bmV3IGtlO2NvbnN0IHQ9bmV3IEZsb2F0MzJBcnJheShbLS41LC0uNSwwLDAsMCwuNSwtLjUsMCwxLDAsLjUsLjUsMCwxLDEsLS41LC41LDAsMCwxXSksbj1uZXcgQW8odCw1KTtaci5zZXRJbmRleChbMCwxLDIsMCwyLDNdKSxaci5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUWkobiwzLDAsITEpKSxaci5zZXRBdHRyaWJ1dGUoInV2IixuZXcgUWkobiwyLDMsITEpKX10aGlzLmdlb21ldHJ5PVpyLHRoaXMubWF0ZXJpYWw9ZSx0aGlzLmNlbnRlcj1uZXcgcSguNSwuNSl9cmF5Y2FzdChlLHQpe2UuY2FtZXJhPT09bnVsbCYmY29uc29sZS5lcnJvcignVEhSRUUuU3ByaXRlOiAiUmF5Y2FzdGVyLmNhbWVyYSIgbmVlZHMgdG8gYmUgc2V0IGluIG9yZGVyIHRvIHJheWNhc3QgYWdhaW5zdCBzcHJpdGVzLicpLEpyLnNldEZyb21NYXRyaXhTY2FsZSh0aGlzLm1hdHJpeFdvcmxkKSxBcC5jb3B5KGUuY2FtZXJhLm1hdHJpeFdvcmxkKSx0aGlzLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKGUuY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSx0aGlzLm1hdHJpeFdvcmxkKSxLci5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tb2RlbFZpZXdNYXRyaXgpLGUuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEmJnRoaXMubWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uPT09ITEmJkpyLm11bHRpcGx5U2NhbGFyKC1Lci56KTtjb25zdCBuPXRoaXMubWF0ZXJpYWwucm90YXRpb247bGV0IGkscztuIT09MCYmKHM9TWF0aC5jb3MobiksaT1NYXRoLnNpbihuKSk7Y29uc3QgYT10aGlzLmNlbnRlcjtSbyhUby5zZXQoLS41LC0uNSwwKSxLcixhLEpyLGkscyksUm8oS3Muc2V0KC41LC0uNSwwKSxLcixhLEpyLGkscyksUm8oQ28uc2V0KC41LC41LDApLEtyLGEsSnIsaSxzKSxUcC5zZXQoMCwwKSxOaC5zZXQoMSwwKSxDcC5zZXQoMSwxKTtsZXQgbz1lLnJheS5pbnRlcnNlY3RUcmlhbmdsZShUbyxLcyxDbywhMSxacyk7aWYobz09PW51bGwmJihSbyhLcy5zZXQoLS41LC41LDApLEtyLGEsSnIsaSxzKSxOaC5zZXQoMCwxKSxvPWUucmF5LmludGVyc2VjdFRyaWFuZ2xlKFRvLENvLEtzLCExLFpzKSxvPT09bnVsbCkpcmV0dXJuO2NvbnN0IGw9ZS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oWnMpO2w8ZS5uZWFyfHxsPmUuZmFyfHx0LnB1c2goe2Rpc3RhbmNlOmwscG9pbnQ6WnMuY2xvbmUoKSx1djpjbi5nZXRJbnRlcnBvbGF0aW9uKFpzLFRvLEtzLENvLFRwLE5oLENwLG5ldyBxKSxmYWNlOm51bGwsb2JqZWN0OnRoaXN9KX1jb3B5KGUsdCl7cmV0dXJuIHN1cGVyLmNvcHkoZSx0KSxlLmNlbnRlciE9PXZvaWQgMCYmdGhpcy5jZW50ZXIuY29weShlLmNlbnRlciksdGhpcy5tYXRlcmlhbD1lLm1hdGVyaWFsLHRoaXN9fWZ1bmN0aW9uIFJvKHIsZSx0LG4saSxzKXtRci5zdWJWZWN0b3JzKHIsdCkuYWRkU2NhbGFyKC41KS5tdWx0aXBseShuKSxpIT09dm9pZCAwPyhKcy54PXMqUXIueC1pKlFyLnksSnMueT1pKlFyLngrcypRci55KTpKcy5jb3B5KFFyKSxyLmNvcHkoZSksci54Kz1Kcy54LHIueSs9SnMueSxyLmFwcGx5TWF0cml4NChBcCl9Y29uc3QgUG89bmV3IFAsUHA9bmV3IFA7Y2xhc3MgTHAgZXh0ZW5kcyBydHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5fY3VycmVudExldmVsPTAsdGhpcy50eXBlPSJMT0QiLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse2xldmVsczp7ZW51bWVyYWJsZTohMCx2YWx1ZTpbXX0saXNMT0Q6e3ZhbHVlOiEwfX0pLHRoaXMuYXV0b1VwZGF0ZT0hMH1jb3B5KGUpe3N1cGVyLmNvcHkoZSwhMSk7Y29uc3QgdD1lLmxldmVscztmb3IobGV0IG49MCxpPXQubGVuZ3RoO248aTtuKyspe2NvbnN0IHM9dFtuXTt0aGlzLmFkZExldmVsKHMub2JqZWN0LmNsb25lKCkscy5kaXN0YW5jZSxzLmh5c3RlcmVzaXMpfXJldHVybiB0aGlzLmF1dG9VcGRhdGU9ZS5hdXRvVXBkYXRlLHRoaXN9YWRkTGV2ZWwoZSx0PTAsbj0wKXt0PU1hdGguYWJzKHQpO2NvbnN0IGk9dGhpcy5sZXZlbHM7bGV0IHM7Zm9yKHM9MDtzPGkubGVuZ3RoJiYhKHQ8aVtzXS5kaXN0YW5jZSk7cysrKTtyZXR1cm4gaS5zcGxpY2UocywwLHtkaXN0YW5jZTp0LGh5c3RlcmVzaXM6bixvYmplY3Q6ZX0pLHRoaXMuYWRkKGUpLHRoaXN9Z2V0Q3VycmVudExldmVsKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnRMZXZlbH1nZXRPYmplY3RGb3JEaXN0YW5jZShlKXtjb25zdCB0PXRoaXMubGV2ZWxzO2lmKHQubGVuZ3RoPjApe2xldCBuLGk7Zm9yKG49MSxpPXQubGVuZ3RoO248aTtuKyspe2xldCBzPXRbbl0uZGlzdGFuY2U7aWYodFtuXS5vYmplY3QudmlzaWJsZSYmKHMtPXMqdFtuXS5oeXN0ZXJlc2lzKSxlPHMpYnJlYWt9cmV0dXJuIHRbbi0xXS5vYmplY3R9cmV0dXJuIG51bGx9cmF5Y2FzdChlLHQpe2lmKHRoaXMubGV2ZWxzLmxlbmd0aD4wKXtQby5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7Y29uc3QgaT1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhQbyk7dGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZShpKS5yYXljYXN0KGUsdCl9fXVwZGF0ZShlKXtjb25zdCB0PXRoaXMubGV2ZWxzO2lmKHQubGVuZ3RoPjEpe1BvLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLm1hdHJpeFdvcmxkKSxQcC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7Y29uc3Qgbj1Qby5kaXN0YW5jZVRvKFBwKS9lLnpvb207dFswXS5vYmplY3QudmlzaWJsZT0hMDtsZXQgaSxzO2ZvcihpPTEscz10Lmxlbmd0aDtpPHM7aSsrKXtsZXQgYT10W2ldLmRpc3RhbmNlO2lmKHRbaV0ub2JqZWN0LnZpc2libGUmJihhLT1hKnRbaV0uaHlzdGVyZXNpcyksbj49YSl0W2ktMV0ub2JqZWN0LnZpc2libGU9ITEsdFtpXS5vYmplY3QudmlzaWJsZT0hMDtlbHNlIGJyZWFrfWZvcih0aGlzLl9jdXJyZW50TGV2ZWw9aS0xO2k8cztpKyspdFtpXS5vYmplY3QudmlzaWJsZT0hMX19dG9KU09OKGUpe2NvbnN0IHQ9c3VwZXIudG9KU09OKGUpO3RoaXMuYXV0b1VwZGF0ZT09PSExJiYodC5vYmplY3QuYXV0b1VwZGF0ZT0hMSksdC5vYmplY3QubGV2ZWxzPVtdO2NvbnN0IG49dGhpcy5sZXZlbHM7Zm9yKGxldCBpPTAscz1uLmxlbmd0aDtpPHM7aSsrKXtjb25zdCBhPW5baV07dC5vYmplY3QubGV2ZWxzLnB1c2goe29iamVjdDphLm9iamVjdC51dWlkLGRpc3RhbmNlOmEuZGlzdGFuY2UsaHlzdGVyZXNpczphLmh5c3RlcmVzaXN9KX1yZXR1cm4gdH19Y29uc3QgSXA9bmV3IFAsVXA9bmV3IGx0LERwPW5ldyBsdCxUUz1uZXcgUCxOcD1uZXcgSWUsTG89bmV3IFAsRmg9bmV3IEd0LEZwPW5ldyBJZSxPaD1uZXcgVXI7Y2xhc3MgT3AgZXh0ZW5kcyBMdHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy5pc1NraW5uZWRNZXNoPSEwLHRoaXMudHlwZT0iU2tpbm5lZE1lc2giLHRoaXMuYmluZE1vZGU9cGMsdGhpcy5iaW5kTWF0cml4PW5ldyBJZSx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlPW5ldyBJZSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsfWNvbXB1dGVCb3VuZGluZ0JveCgpe2NvbnN0IGU9dGhpcy5nZW9tZXRyeTt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IER0KSx0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpO2NvbnN0IHQ9ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7Zm9yKGxldCBuPTA7bjx0LmNvdW50O24rKyl0aGlzLmdldFZlcnRleFBvc2l0aW9uKG4sTG8pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChMbyl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5O3RoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgR3QpLHRoaXMuYm91bmRpbmdTcGhlcmUubWFrZUVtcHR5KCk7Y29uc3QgdD1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtmb3IobGV0IG49MDtuPHQuY291bnQ7bisrKXRoaXMuZ2V0VmVydGV4UG9zaXRpb24obixMbyksdGhpcy5ib3VuZGluZ1NwaGVyZS5leHBhbmRCeVBvaW50KExvKX1jb3B5KGUsdCl7cmV0dXJuIHN1cGVyLmNvcHkoZSx0KSx0aGlzLmJpbmRNb2RlPWUuYmluZE1vZGUsdGhpcy5iaW5kTWF0cml4LmNvcHkoZS5iaW5kTWF0cml4KSx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoZS5iaW5kTWF0cml4SW52ZXJzZSksdGhpcy5za2VsZXRvbj1lLnNrZWxldG9uLGUuYm91bmRpbmdCb3ghPT1udWxsJiYodGhpcy5ib3VuZGluZ0JveD1lLmJvdW5kaW5nQm94LmNsb25lKCkpLGUuYm91bmRpbmdTcGhlcmUhPT1udWxsJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1lLmJvdW5kaW5nU3BoZXJlLmNsb25lKCkpLHRoaXN9cmF5Y2FzdChlLHQpe2NvbnN0IG49dGhpcy5tYXRlcmlhbCxpPXRoaXMubWF0cml4V29ybGQ7biE9PXZvaWQgMCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9PT1udWxsJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLEZoLmNvcHkodGhpcy5ib3VuZGluZ1NwaGVyZSksRmguYXBwbHlNYXRyaXg0KGkpLGUucmF5LmludGVyc2VjdHNTcGhlcmUoRmgpIT09ITEmJihGcC5jb3B5KGkpLmludmVydCgpLE9oLmNvcHkoZS5yYXkpLmFwcGx5TWF0cml4NChGcCksISh0aGlzLmJvdW5kaW5nQm94IT09bnVsbCYmT2guaW50ZXJzZWN0c0JveCh0aGlzLmJvdW5kaW5nQm94KT09PSExKSYmdGhpcy5fY29tcHV0ZUludGVyc2VjdGlvbnMoZSx0LE9oKSkpfWdldFZlcnRleFBvc2l0aW9uKGUsdCl7cmV0dXJuIHN1cGVyLmdldFZlcnRleFBvc2l0aW9uKGUsdCksdGhpcy5hcHBseUJvbmVUcmFuc2Zvcm0oZSx0KSx0fWJpbmQoZSx0KXt0aGlzLnNrZWxldG9uPWUsdD09PXZvaWQgMCYmKHRoaXMudXBkYXRlTWF0cml4V29ybGQoITApLHRoaXMuc2tlbGV0b24uY2FsY3VsYXRlSW52ZXJzZXMoKSx0PXRoaXMubWF0cml4V29ybGQpLHRoaXMuYmluZE1hdHJpeC5jb3B5KHQpLHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSh0KS5pbnZlcnQoKX1wb3NlKCl7dGhpcy5za2VsZXRvbi5wb3NlKCl9bm9ybWFsaXplU2tpbldlaWdodHMoKXtjb25zdCBlPW5ldyBsdCx0PXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0O2ZvcihsZXQgbj0wLGk9dC5jb3VudDtuPGk7bisrKXtlLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxuKTtjb25zdCBzPTEvZS5tYW5oYXR0YW5MZW5ndGgoKTtzIT09MS8wP2UubXVsdGlwbHlTY2FsYXIocyk6ZS5zZXQoMSwwLDAsMCksdC5zZXRYWVpXKG4sZS54LGUueSxlLnosZS53KX19dXBkYXRlTWF0cml4V29ybGQoZSl7c3VwZXIudXBkYXRlTWF0cml4V29ybGQoZSksdGhpcy5iaW5kTW9kZT09PXBjP3RoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKTp0aGlzLmJpbmRNb2RlPT09dGQ/dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuYmluZE1hdHJpeCkuaW52ZXJ0KCk6Y29uc29sZS53YXJuKCJUSFJFRS5Ta2lubmVkTWVzaDogVW5yZWNvZ25pemVkIGJpbmRNb2RlOiAiK3RoaXMuYmluZE1vZGUpfWFwcGx5Qm9uZVRyYW5zZm9ybShlLHQpe2NvbnN0IG49dGhpcy5za2VsZXRvbixpPXRoaXMuZ2VvbWV0cnk7VXAuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLmF0dHJpYnV0ZXMuc2tpbkluZGV4LGUpLERwLmZyb21CdWZmZXJBdHRyaWJ1dGUoaS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQsZSksSXAuY29weSh0KS5hcHBseU1hdHJpeDQodGhpcy5iaW5kTWF0cml4KSx0LnNldCgwLDAsMCk7Zm9yKGxldCBzPTA7czw0O3MrKyl7Y29uc3QgYT1EcC5nZXRDb21wb25lbnQocyk7aWYoYSE9PTApe2NvbnN0IG89VXAuZ2V0Q29tcG9uZW50KHMpO05wLm11bHRpcGx5TWF0cmljZXMobi5ib25lc1tvXS5tYXRyaXhXb3JsZCxuLmJvbmVJbnZlcnNlc1tvXSksdC5hZGRTY2FsZWRWZWN0b3IoVFMuY29weShJcCkuYXBwbHlNYXRyaXg0KE5wKSxhKX19cmV0dXJuIHQuYXBwbHlNYXRyaXg0KHRoaXMuYmluZE1hdHJpeEludmVyc2UpfWJvbmVUcmFuc2Zvcm0oZSx0KXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5Ta2lubmVkTWVzaDogLmJvbmVUcmFuc2Zvcm0oKSB3YXMgcmVuYW1lZCB0byAuYXBwbHlCb25lVHJhbnNmb3JtKCkgaW4gcjE1MS4iKSx0aGlzLmFwcGx5Qm9uZVRyYW5zZm9ybShlLHQpfX1jbGFzcyBCaCBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzQm9uZT0hMCx0aGlzLnR5cGU9IkJvbmUifX1jbGFzcyBqaSBleHRlbmRzIEV0e2NvbnN0cnVjdG9yKGU9bnVsbCx0PTEsbj0xLGkscyxhLG8sbCxjPWJ0LGg9YnQsdSxmKXtzdXBlcihudWxsLGEsbyxsLGMsaCxpLHMsdSxmKSx0aGlzLmlzRGF0YVRleHR1cmU9ITAsdGhpcy5pbWFnZT17ZGF0YTplLHdpZHRoOnQsaGVpZ2h0Om59LHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MX19Y29uc3QgQnA9bmV3IEllLENTPW5ldyBJZTtjbGFzcyBJb3tjb25zdHJ1Y3RvcihlPVtdLHQ9W10pe3RoaXMudXVpZD1fbigpLHRoaXMuYm9uZXM9ZS5zbGljZSgwKSx0aGlzLmJvbmVJbnZlcnNlcz10LHRoaXMuYm9uZU1hdHJpY2VzPW51bGwsdGhpcy5ib25lVGV4dHVyZT1udWxsLHRoaXMuaW5pdCgpfWluaXQoKXtjb25zdCBlPXRoaXMuYm9uZXMsdD10aGlzLmJvbmVJbnZlcnNlcztpZih0aGlzLmJvbmVNYXRyaWNlcz1uZXcgRmxvYXQzMkFycmF5KGUubGVuZ3RoKjE2KSx0Lmxlbmd0aD09PTApdGhpcy5jYWxjdWxhdGVJbnZlcnNlcygpO2Vsc2UgaWYoZS5sZW5ndGghPT10Lmxlbmd0aCl7Y29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogTnVtYmVyIG9mIGludmVyc2UgYm9uZSBtYXRyaWNlcyBkb2VzIG5vdCBtYXRjaCBhbW91bnQgb2YgYm9uZXMuIiksdGhpcy5ib25lSW52ZXJzZXM9W107Zm9yKGxldCBuPTAsaT10aGlzLmJvbmVzLmxlbmd0aDtuPGk7bisrKXRoaXMuYm9uZUludmVyc2VzLnB1c2gobmV3IEllKX19Y2FsY3VsYXRlSW52ZXJzZXMoKXt0aGlzLmJvbmVJbnZlcnNlcy5sZW5ndGg9MDtmb3IobGV0IGU9MCx0PXRoaXMuYm9uZXMubGVuZ3RoO2U8dDtlKyspe2NvbnN0IG49bmV3IEllO3RoaXMuYm9uZXNbZV0mJm4uY29weSh0aGlzLmJvbmVzW2VdLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSx0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG4pfX1wb3NlKCl7Zm9yKGxldCBlPTAsdD10aGlzLmJvbmVzLmxlbmd0aDtlPHQ7ZSsrKXtjb25zdCBuPXRoaXMuYm9uZXNbZV07biYmbi5tYXRyaXhXb3JsZC5jb3B5KHRoaXMuYm9uZUludmVyc2VzW2VdKS5pbnZlcnQoKX1mb3IobGV0IGU9MCx0PXRoaXMuYm9uZXMubGVuZ3RoO2U8dDtlKyspe2NvbnN0IG49dGhpcy5ib25lc1tlXTtuJiYobi5wYXJlbnQmJm4ucGFyZW50LmlzQm9uZT8obi5tYXRyaXguY29weShuLnBhcmVudC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksbi5tYXRyaXgubXVsdGlwbHkobi5tYXRyaXhXb3JsZCkpOm4ubWF0cml4LmNvcHkobi5tYXRyaXhXb3JsZCksbi5tYXRyaXguZGVjb21wb3NlKG4ucG9zaXRpb24sbi5xdWF0ZXJuaW9uLG4uc2NhbGUpKX19dXBkYXRlKCl7Y29uc3QgZT10aGlzLmJvbmVzLHQ9dGhpcy5ib25lSW52ZXJzZXMsbj10aGlzLmJvbmVNYXRyaWNlcyxpPXRoaXMuYm9uZVRleHR1cmU7Zm9yKGxldCBzPTAsYT1lLmxlbmd0aDtzPGE7cysrKXtjb25zdCBvPWVbc10/ZVtzXS5tYXRyaXhXb3JsZDpDUztCcC5tdWx0aXBseU1hdHJpY2VzKG8sdFtzXSksQnAudG9BcnJheShuLHMqMTYpfWkhPT1udWxsJiYoaS5uZWVkc1VwZGF0ZT0hMCl9Y2xvbmUoKXtyZXR1cm4gbmV3IElvKHRoaXMuYm9uZXMsdGhpcy5ib25lSW52ZXJzZXMpfWNvbXB1dGVCb25lVGV4dHVyZSgpe2xldCBlPU1hdGguc3FydCh0aGlzLmJvbmVzLmxlbmd0aCo0KTtlPU1hdGguY2VpbChlLzQpKjQsZT1NYXRoLm1heChlLDQpO2NvbnN0IHQ9bmV3IEZsb2F0MzJBcnJheShlKmUqNCk7dC5zZXQodGhpcy5ib25lTWF0cmljZXMpO2NvbnN0IG49bmV3IGppKHQsZSxlLGFuLFJuKTtyZXR1cm4gbi5uZWVkc1VwZGF0ZT0hMCx0aGlzLmJvbmVNYXRyaWNlcz10LHRoaXMuYm9uZVRleHR1cmU9bix0aGlzfWdldEJvbmVCeU5hbWUoZSl7Zm9yKGxldCB0PTAsbj10aGlzLmJvbmVzLmxlbmd0aDt0PG47dCsrKXtjb25zdCBpPXRoaXMuYm9uZXNbdF07aWYoaS5uYW1lPT09ZSlyZXR1cm4gaX19ZGlzcG9zZSgpe3RoaXMuYm9uZVRleHR1cmUhPT1udWxsJiYodGhpcy5ib25lVGV4dHVyZS5kaXNwb3NlKCksdGhpcy5ib25lVGV4dHVyZT1udWxsKX1mcm9tSlNPTihlLHQpe3RoaXMudXVpZD1lLnV1aWQ7Zm9yKGxldCBuPTAsaT1lLmJvbmVzLmxlbmd0aDtuPGk7bisrKXtjb25zdCBzPWUuYm9uZXNbbl07bGV0IGE9dFtzXTthPT09dm9pZCAwJiYoY29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogTm8gYm9uZSBmb3VuZCB3aXRoIFVVSUQ6IixzKSxhPW5ldyBCaCksdGhpcy5ib25lcy5wdXNoKGEpLHRoaXMuYm9uZUludmVyc2VzLnB1c2gobmV3IEllKCkuZnJvbUFycmF5KGUuYm9uZUludmVyc2VzW25dKSl9cmV0dXJuIHRoaXMuaW5pdCgpLHRoaXN9dG9KU09OKCl7Y29uc3QgZT17bWV0YWRhdGE6e3ZlcnNpb246NC42LHR5cGU6IlNrZWxldG9uIixnZW5lcmF0b3I6IlNrZWxldG9uLnRvSlNPTiJ9LGJvbmVzOltdLGJvbmVJbnZlcnNlczpbXX07ZS51dWlkPXRoaXMudXVpZDtjb25zdCB0PXRoaXMuYm9uZXMsbj10aGlzLmJvbmVJbnZlcnNlcztmb3IobGV0IGk9MCxzPXQubGVuZ3RoO2k8cztpKyspe2NvbnN0IGE9dFtpXTtlLmJvbmVzLnB1c2goYS51dWlkKTtjb25zdCBvPW5baV07ZS5ib25lSW52ZXJzZXMucHVzaChvLnRvQXJyYXkoKSl9cmV0dXJuIGV9fWNsYXNzIGpyIGV4dGVuZHMgS2V7Y29uc3RydWN0b3IoZSx0LG4saT0xKXtzdXBlcihlLHQsbiksdGhpcy5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT0hMCx0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9aX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMubWVzaFBlckF0dHJpYnV0ZT1lLm1lc2hQZXJBdHRyaWJ1dGUsdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO3JldHVybiBlLm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLGUuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITAsZX19Y29uc3QgZXM9bmV3IEllLHpwPW5ldyBJZSxVbz1bXSxrcD1uZXcgRHQsUlM9bmV3IEllLFFzPW5ldyBMdCxqcz1uZXcgR3Q7Y2xhc3MgR3AgZXh0ZW5kcyBMdHtjb25zdHJ1Y3RvcihlLHQsbil7c3VwZXIoZSx0KSx0aGlzLmlzSW5zdGFuY2VkTWVzaD0hMCx0aGlzLmluc3RhbmNlTWF0cml4PW5ldyBqcihuZXcgRmxvYXQzMkFycmF5KG4qMTYpLDE2KSx0aGlzLmluc3RhbmNlQ29sb3I9bnVsbCx0aGlzLmNvdW50PW4sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbDtmb3IobGV0IGk9MDtpPG47aSsrKXRoaXMuc2V0TWF0cml4QXQoaSxSUyl9Y29tcHV0ZUJvdW5kaW5nQm94KCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5LHQ9dGhpcy5jb3VudDt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IER0KSxlLmJvdW5kaW5nQm94PT09bnVsbCYmZS5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpO2ZvcihsZXQgbj0wO248dDtuKyspdGhpcy5nZXRNYXRyaXhBdChuLGVzKSxrcC5jb3B5KGUuYm91bmRpbmdCb3gpLmFwcGx5TWF0cml4NChlcyksdGhpcy5ib3VuZGluZ0JveC51bmlvbihrcCl9Y29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5LHQ9dGhpcy5jb3VudDt0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IEd0KSxlLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmZS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSx0aGlzLmJvdW5kaW5nU3BoZXJlLm1ha2VFbXB0eSgpO2ZvcihsZXQgbj0wO248dDtuKyspdGhpcy5nZXRNYXRyaXhBdChuLGVzKSxqcy5jb3B5KGUuYm91bmRpbmdTcGhlcmUpLmFwcGx5TWF0cml4NChlcyksdGhpcy5ib3VuZGluZ1NwaGVyZS51bmlvbihqcyl9Y29weShlLHQpe3JldHVybiBzdXBlci5jb3B5KGUsdCksdGhpcy5pbnN0YW5jZU1hdHJpeC5jb3B5KGUuaW5zdGFuY2VNYXRyaXgpLGUuaW5zdGFuY2VDb2xvciE9PW51bGwmJih0aGlzLmluc3RhbmNlQ29sb3I9ZS5pbnN0YW5jZUNvbG9yLmNsb25lKCkpLHRoaXMuY291bnQ9ZS5jb3VudCxlLmJvdW5kaW5nQm94IT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9ZS5ib3VuZGluZ0JveC5jbG9uZSgpKSxlLmJvdW5kaW5nU3BoZXJlIT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9ZS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKSx0aGlzfWdldENvbG9yQXQoZSx0KXt0LmZyb21BcnJheSh0aGlzLmluc3RhbmNlQ29sb3IuYXJyYXksZSozKX1nZXRNYXRyaXhBdChlLHQpe3QuZnJvbUFycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksZSoxNil9cmF5Y2FzdChlLHQpe2NvbnN0IG49dGhpcy5tYXRyaXhXb3JsZCxpPXRoaXMuY291bnQ7aWYoUXMuZ2VvbWV0cnk9dGhpcy5nZW9tZXRyeSxRcy5tYXRlcmlhbD10aGlzLm1hdGVyaWFsLFFzLm1hdGVyaWFsIT09dm9pZCAwJiYodGhpcy5ib3VuZGluZ1NwaGVyZT09PW51bGwmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksanMuY29weSh0aGlzLmJvdW5kaW5nU3BoZXJlKSxqcy5hcHBseU1hdHJpeDQobiksZS5yYXkuaW50ZXJzZWN0c1NwaGVyZShqcykhPT0hMSkpZm9yKGxldCBzPTA7czxpO3MrKyl7dGhpcy5nZXRNYXRyaXhBdChzLGVzKSx6cC5tdWx0aXBseU1hdHJpY2VzKG4sZXMpLFFzLm1hdHJpeFdvcmxkPXpwLFFzLnJheWNhc3QoZSxVbyk7Zm9yKGxldCBhPTAsbz1Vby5sZW5ndGg7YTxvO2ErKyl7Y29uc3QgbD1Vb1thXTtsLmluc3RhbmNlSWQ9cyxsLm9iamVjdD10aGlzLHQucHVzaChsKX1Vby5sZW5ndGg9MH19c2V0Q29sb3JBdChlLHQpe3RoaXMuaW5zdGFuY2VDb2xvcj09PW51bGwmJih0aGlzLmluc3RhbmNlQ29sb3I9bmV3IGpyKG5ldyBGbG9hdDMyQXJyYXkodGhpcy5pbnN0YW5jZU1hdHJpeC5jb3VudCozKSwzKSksdC50b0FycmF5KHRoaXMuaW5zdGFuY2VDb2xvci5hcnJheSxlKjMpfXNldE1hdHJpeEF0KGUsdCl7dC50b0FycmF5KHRoaXMuaW5zdGFuY2VNYXRyaXguYXJyYXksZSoxNil9dXBkYXRlTW9ycGhUYXJnZXRzKCl7fWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWZ1bmN0aW9uIFBTKHIsZSl7cmV0dXJuIHIuei1lLnp9ZnVuY3Rpb24gTFMocixlKXtyZXR1cm4gZS56LXIuen1jbGFzcyBJU3tjb25zdHJ1Y3Rvcigpe3RoaXMuaW5kZXg9MCx0aGlzLnBvb2w9W10sdGhpcy5saXN0PVtdfXB1c2goZSx0KXtjb25zdCBuPXRoaXMucG9vbCxpPXRoaXMubGlzdDt0aGlzLmluZGV4Pj1uLmxlbmd0aCYmbi5wdXNoKHtzdGFydDotMSxjb3VudDotMSx6Oi0xfSk7Y29uc3Qgcz1uW3RoaXMuaW5kZXhdO2kucHVzaChzKSx0aGlzLmluZGV4Kysscy5zdGFydD1lLnN0YXJ0LHMuY291bnQ9ZS5jb3VudCxzLno9dH1yZXNldCgpe3RoaXMubGlzdC5sZW5ndGg9MCx0aGlzLmluZGV4PTB9fWNvbnN0IHRzPSJiYXRjaElkIixJaT1uZXcgSWUsVnA9bmV3IEllLFVTPW5ldyBJZSxIcD1uZXcgSWUsemg9bmV3IHFzLERvPW5ldyBEdCxlcj1uZXcgR3QsZWE9bmV3IFAsa2g9bmV3IElTLFd0PW5ldyBMdCxObz1bXTtmdW5jdGlvbiBEUyhyLGUsdD0wKXtjb25zdCBuPWUuaXRlbVNpemU7aWYoci5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlfHxyLmFycmF5LmNvbnN0cnVjdG9yIT09ZS5hcnJheS5jb25zdHJ1Y3Rvcil7Y29uc3QgaT1yLmNvdW50O2ZvcihsZXQgcz0wO3M8aTtzKyspZm9yKGxldCBhPTA7YTxuO2ErKyllLnNldENvbXBvbmVudChzK3QsYSxyLmdldENvbXBvbmVudChzLGEpKX1lbHNlIGUuYXJyYXkuc2V0KHIuYXJyYXksdCpuKTtlLm5lZWRzVXBkYXRlPSEwfWNsYXNzIFdwIGV4dGVuZHMgTHR7Z2V0IG1heEdlb21ldHJ5Q291bnQoKXtyZXR1cm4gdGhpcy5fbWF4R2VvbWV0cnlDb3VudH1jb25zdHJ1Y3RvcihlLHQsbj10KjIsaSl7c3VwZXIobmV3IGtlLGkpLHRoaXMuaXNCYXRjaGVkTWVzaD0hMCx0aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQ9ITAsdGhpcy5zb3J0T2JqZWN0cz0hMCx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsLHRoaXMuY3VzdG9tU29ydD1udWxsLHRoaXMuX2RyYXdSYW5nZXM9W10sdGhpcy5fcmVzZXJ2ZWRSYW5nZXM9W10sdGhpcy5fdmlzaWJpbGl0eT1bXSx0aGlzLl9hY3RpdmU9W10sdGhpcy5fYm91bmRzPVtdLHRoaXMuX21heEdlb21ldHJ5Q291bnQ9ZSx0aGlzLl9tYXhWZXJ0ZXhDb3VudD10LHRoaXMuX21heEluZGV4Q291bnQ9bix0aGlzLl9nZW9tZXRyeUluaXRpYWxpemVkPSExLHRoaXMuX2dlb21ldHJ5Q291bnQ9MCx0aGlzLl9tdWx0aURyYXdDb3VudHM9bmV3IEludDMyQXJyYXkoZSksdGhpcy5fbXVsdGlEcmF3U3RhcnRzPW5ldyBJbnQzMkFycmF5KGUpLHRoaXMuX211bHRpRHJhd0NvdW50PTAsdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQ9ITAsdGhpcy5fbWF0cmljZXNUZXh0dXJlPW51bGwsdGhpcy5faW5pdE1hdHJpY2VzVGV4dHVyZSgpfV9pbml0TWF0cmljZXNUZXh0dXJlKCl7bGV0IGU9TWF0aC5zcXJ0KHRoaXMuX21heEdlb21ldHJ5Q291bnQqNCk7ZT1NYXRoLmNlaWwoZS80KSo0LGU9TWF0aC5tYXgoZSw0KTtjb25zdCB0PW5ldyBGbG9hdDMyQXJyYXkoZSplKjQpLG49bmV3IGppKHQsZSxlLGFuLFJuKTt0aGlzLl9tYXRyaWNlc1RleHR1cmU9bn1faW5pdGlhbGl6ZUdlb21ldHJ5KGUpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeSxuPXRoaXMuX21heFZlcnRleENvdW50LGk9dGhpcy5fbWF4R2VvbWV0cnlDb3VudCxzPXRoaXMuX21heEluZGV4Q291bnQ7aWYodGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZD09PSExKXtmb3IoY29uc3QgbyBpbiBlLmF0dHJpYnV0ZXMpe2NvbnN0IGw9ZS5nZXRBdHRyaWJ1dGUobykse2FycmF5OmMsaXRlbVNpemU6aCxub3JtYWxpemVkOnV9PWwsZj1uZXcgYy5jb25zdHJ1Y3RvcihuKmgpLGQ9bmV3IGwuY29uc3RydWN0b3IoZixoLHUpO2Quc2V0VXNhZ2UobC51c2FnZSksdC5zZXRBdHRyaWJ1dGUobyxkKX1pZihlLmdldEluZGV4KCkhPT1udWxsKXtjb25zdCBvPW4+NjU1MzY/bmV3IFVpbnQzMkFycmF5KHMpOm5ldyBVaW50MTZBcnJheShzKTt0LnNldEluZGV4KG5ldyBLZShvLDEpKX1jb25zdCBhPWk+NjU1MzY/bmV3IFVpbnQzMkFycmF5KG4pOm5ldyBVaW50MTZBcnJheShuKTt0LnNldEF0dHJpYnV0ZSh0cyxuZXcgS2UoYSwxKSksdGhpcy5fZ2VvbWV0cnlJbml0aWFsaXplZD0hMH19X3ZhbGlkYXRlR2VvbWV0cnkoZSl7aWYoZS5nZXRBdHRyaWJ1dGUodHMpKXRocm93IG5ldyBFcnJvcihgQmF0Y2hlZE1lc2g6IEdlb21ldHJ5IGNhbm5vdCB1c2UgYXR0cmlidXRlICIke3RzfSJgKTtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYoQm9vbGVhbihlLmdldEluZGV4KCkpIT09Qm9vbGVhbih0LmdldEluZGV4KCkpKXRocm93IG5ldyBFcnJvcignQmF0Y2hlZE1lc2g6IEFsbCBnZW9tZXRyaWVzIG11c3QgY29uc2lzdGVudGx5IGhhdmUgImluZGV4Ii4nKTtmb3IoY29uc3QgbiBpbiB0LmF0dHJpYnV0ZXMpe2lmKG49PT10cyljb250aW51ZTtpZighZS5oYXNBdHRyaWJ1dGUobikpdGhyb3cgbmV3IEVycm9yKGBCYXRjaGVkTWVzaDogQWRkZWQgZ2VvbWV0cnkgbWlzc2luZyAiJHtufSIuIEFsbCBnZW9tZXRyaWVzIG11c3QgaGF2ZSBjb25zaXN0ZW50IGF0dHJpYnV0ZXMuYCk7Y29uc3QgaT1lLmdldEF0dHJpYnV0ZShuKSxzPXQuZ2V0QXR0cmlidXRlKG4pO2lmKGkuaXRlbVNpemUhPT1zLml0ZW1TaXplfHxpLm5vcm1hbGl6ZWQhPT1zLm5vcm1hbGl6ZWQpdGhyb3cgbmV3IEVycm9yKCJCYXRjaGVkTWVzaDogQWxsIGF0dHJpYnV0ZXMgbXVzdCBoYXZlIGEgY29uc2lzdGVudCBpdGVtU2l6ZSBhbmQgbm9ybWFsaXplZCB2YWx1ZS4iKX19c2V0Q3VzdG9tU29ydChlKXtyZXR1cm4gdGhpcy5jdXN0b21Tb3J0PWUsdGhpc31jb21wdXRlQm91bmRpbmdCb3goKXt0aGlzLmJvdW5kaW5nQm94PT09bnVsbCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IER0KTtjb25zdCBlPXRoaXMuX2dlb21ldHJ5Q291bnQsdD10aGlzLmJvdW5kaW5nQm94LG49dGhpcy5fYWN0aXZlO3QubWFrZUVtcHR5KCk7Zm9yKGxldCBpPTA7aTxlO2krKyluW2ldIT09ITEmJih0aGlzLmdldE1hdHJpeEF0KGksSWkpLHRoaXMuZ2V0Qm91bmRpbmdCb3hBdChpLERvKS5hcHBseU1hdHJpeDQoSWkpLHQudW5pb24oRG8pKX1jb21wdXRlQm91bmRpbmdTcGhlcmUoKXt0aGlzLmJvdW5kaW5nU3BoZXJlPT09bnVsbCYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IEd0KTtjb25zdCBlPXRoaXMuX2dlb21ldHJ5Q291bnQsdD10aGlzLmJvdW5kaW5nU3BoZXJlLG49dGhpcy5fYWN0aXZlO3QubWFrZUVtcHR5KCk7Zm9yKGxldCBpPTA7aTxlO2krKyluW2ldIT09ITEmJih0aGlzLmdldE1hdHJpeEF0KGksSWkpLHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdChpLGVyKS5hcHBseU1hdHJpeDQoSWkpLHQudW5pb24oZXIpKX1hZGRHZW9tZXRyeShlLHQ9LTEsbj0tMSl7aWYodGhpcy5faW5pdGlhbGl6ZUdlb21ldHJ5KGUpLHRoaXMuX3ZhbGlkYXRlR2VvbWV0cnkoZSksdGhpcy5fZ2VvbWV0cnlDb3VudD49dGhpcy5fbWF4R2VvbWV0cnlDb3VudCl0aHJvdyBuZXcgRXJyb3IoIkJhdGNoZWRNZXNoOiBNYXhpbXVtIGdlb21ldHJ5IGNvdW50IHJlYWNoZWQuIik7Y29uc3QgaT17dmVydGV4U3RhcnQ6LTEsdmVydGV4Q291bnQ6LTEsaW5kZXhTdGFydDotMSxpbmRleENvdW50Oi0xfTtsZXQgcz1udWxsO2NvbnN0IGE9dGhpcy5fcmVzZXJ2ZWRSYW5nZXMsbz10aGlzLl9kcmF3UmFuZ2VzLGw9dGhpcy5fYm91bmRzO3RoaXMuX2dlb21ldHJ5Q291bnQhPT0wJiYocz1hW2EubGVuZ3RoLTFdKSx0PT09LTE/aS52ZXJ0ZXhDb3VudD1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5jb3VudDppLnZlcnRleENvdW50PXQscz09PW51bGw/aS52ZXJ0ZXhTdGFydD0wOmkudmVydGV4U3RhcnQ9cy52ZXJ0ZXhTdGFydCtzLnZlcnRleENvdW50O2NvbnN0IGM9ZS5nZXRJbmRleCgpLGg9YyE9PW51bGw7aWYoaCYmKG49PT0tMT9pLmluZGV4Q291bnQ9Yy5jb3VudDppLmluZGV4Q291bnQ9bixzPT09bnVsbD9pLmluZGV4U3RhcnQ9MDppLmluZGV4U3RhcnQ9cy5pbmRleFN0YXJ0K3MuaW5kZXhDb3VudCksaS5pbmRleFN0YXJ0IT09LTEmJmkuaW5kZXhTdGFydCtpLmluZGV4Q291bnQ+dGhpcy5fbWF4SW5kZXhDb3VudHx8aS52ZXJ0ZXhTdGFydCtpLnZlcnRleENvdW50PnRoaXMuX21heFZlcnRleENvdW50KXRocm93IG5ldyBFcnJvcigiQmF0Y2hlZE1lc2g6IFJlc2VydmVkIHNwYWNlIHJlcXVlc3QgZXhjZWVkcyB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZS4iKTtjb25zdCB1PXRoaXMuX3Zpc2liaWxpdHksZj10aGlzLl9hY3RpdmUsZD10aGlzLl9tYXRyaWNlc1RleHR1cmUscD10aGlzLl9tYXRyaWNlc1RleHR1cmUuaW1hZ2UuZGF0YTt1LnB1c2goITApLGYucHVzaCghMCk7Y29uc3QgXz10aGlzLl9nZW9tZXRyeUNvdW50O3RoaXMuX2dlb21ldHJ5Q291bnQrKyxVUy50b0FycmF5KHAsXyoxNiksZC5uZWVkc1VwZGF0ZT0hMCxhLnB1c2goaSksby5wdXNoKHtzdGFydDpoP2kuaW5kZXhTdGFydDppLnZlcnRleFN0YXJ0LGNvdW50Oi0xfSksbC5wdXNoKHtib3hJbml0aWFsaXplZDohMSxib3g6bmV3IER0LHNwaGVyZUluaXRpYWxpemVkOiExLHNwaGVyZTpuZXcgR3R9KTtjb25zdCBnPXRoaXMuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKHRzKTtmb3IobGV0IG09MDttPGkudmVydGV4Q291bnQ7bSsrKWcuc2V0WChpLnZlcnRleFN0YXJ0K20sXyk7cmV0dXJuIGcubmVlZHNVcGRhdGU9ITAsdGhpcy5zZXRHZW9tZXRyeUF0KF8sZSksX31zZXRHZW9tZXRyeUF0KGUsdCl7aWYoZT49dGhpcy5fZ2VvbWV0cnlDb3VudCl0aHJvdyBuZXcgRXJyb3IoIkJhdGNoZWRNZXNoOiBNYXhpbXVtIGdlb21ldHJ5IGNvdW50IHJlYWNoZWQuIik7dGhpcy5fdmFsaWRhdGVHZW9tZXRyeSh0KTtjb25zdCBuPXRoaXMuZ2VvbWV0cnksaT1uLmdldEluZGV4KCkhPT1udWxsLHM9bi5nZXRJbmRleCgpLGE9dC5nZXRJbmRleCgpLG89dGhpcy5fcmVzZXJ2ZWRSYW5nZXNbZV07aWYoaSYmYS5jb3VudD5vLmluZGV4Q291bnR8fHQuYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudD5vLnZlcnRleENvdW50KXRocm93IG5ldyBFcnJvcigiQmF0Y2hlZE1lc2g6IFJlc2VydmVkIHNwYWNlIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHByb3ZpZGVkIGdlb21ldHJ5LiIpO2NvbnN0IGw9by52ZXJ0ZXhTdGFydCxjPW8udmVydGV4Q291bnQ7Zm9yKGNvbnN0IGQgaW4gbi5hdHRyaWJ1dGVzKXtpZihkPT09dHMpY29udGludWU7Y29uc3QgcD10LmdldEF0dHJpYnV0ZShkKSxfPW4uZ2V0QXR0cmlidXRlKGQpO0RTKHAsXyxsKTtjb25zdCBnPXAuaXRlbVNpemU7Zm9yKGxldCBtPXAuY291bnQseT1jO208eTttKyspe2NvbnN0IHg9bCttO2ZvcihsZXQgdj0wO3Y8Zzt2KyspXy5zZXRDb21wb25lbnQoeCx2LDApfV8ubmVlZHNVcGRhdGU9ITB9aWYoaSl7Y29uc3QgZD1vLmluZGV4U3RhcnQ7Zm9yKGxldCBwPTA7cDxhLmNvdW50O3ArKylzLnNldFgoZCtwLGwrYS5nZXRYKHApKTtmb3IobGV0IHA9YS5jb3VudCxfPW8uaW5kZXhDb3VudDtwPF87cCsrKXMuc2V0WChkK3AsbCk7cy5uZWVkc1VwZGF0ZT0hMH1jb25zdCBoPXRoaXMuX2JvdW5kc1tlXTt0LmJvdW5kaW5nQm94IT09bnVsbD8oaC5ib3guY29weSh0LmJvdW5kaW5nQm94KSxoLmJveEluaXRpYWxpemVkPSEwKTpoLmJveEluaXRpYWxpemVkPSExLHQuYm91bmRpbmdTcGhlcmUhPT1udWxsPyhoLnNwaGVyZS5jb3B5KHQuYm91bmRpbmdTcGhlcmUpLGguc3BoZXJlSW5pdGlhbGl6ZWQ9ITApOmguc3BoZXJlSW5pdGlhbGl6ZWQ9ITE7Y29uc3QgdT10aGlzLl9kcmF3UmFuZ2VzW2VdLGY9dC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7cmV0dXJuIHUuY291bnQ9aT9hLmNvdW50OmYuY291bnQsdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQ9ITAsZX1kZWxldGVHZW9tZXRyeShlKXtjb25zdCB0PXRoaXMuX2FjdGl2ZTtyZXR1cm4gZT49dC5sZW5ndGh8fHRbZV09PT0hMT90aGlzOih0W2VdPSExLHRoaXMuX3Zpc2liaWxpdHlDaGFuZ2VkPSEwLHRoaXMpfWdldEJvdW5kaW5nQm94QXQoZSx0KXtpZih0aGlzLl9hY3RpdmVbZV09PT0hMSlyZXR1cm4gdGhpcztjb25zdCBpPXRoaXMuX2JvdW5kc1tlXSxzPWkuYm94LGE9dGhpcy5nZW9tZXRyeTtpZihpLmJveEluaXRpYWxpemVkPT09ITEpe3MubWFrZUVtcHR5KCk7Y29uc3Qgbz1hLmluZGV4LGw9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGM9dGhpcy5fZHJhd1Jhbmdlc1tlXTtmb3IobGV0IGg9Yy5zdGFydCx1PWMuc3RhcnQrYy5jb3VudDtoPHU7aCsrKXtsZXQgZj1oO28mJihmPW8uZ2V0WChmKSkscy5leHBhbmRCeVBvaW50KGVhLmZyb21CdWZmZXJBdHRyaWJ1dGUobCxmKSl9aS5ib3hJbml0aWFsaXplZD0hMH1yZXR1cm4gdC5jb3B5KHMpLHR9Z2V0Qm91bmRpbmdTcGhlcmVBdChlLHQpe2lmKHRoaXMuX2FjdGl2ZVtlXT09PSExKXJldHVybiB0aGlzO2NvbnN0IGk9dGhpcy5fYm91bmRzW2VdLHM9aS5zcGhlcmUsYT10aGlzLmdlb21ldHJ5O2lmKGkuc3BoZXJlSW5pdGlhbGl6ZWQ9PT0hMSl7cy5tYWtlRW1wdHkoKSx0aGlzLmdldEJvdW5kaW5nQm94QXQoZSxEbyksRG8uZ2V0Q2VudGVyKHMuY2VudGVyKTtjb25zdCBvPWEuaW5kZXgsbD1hLmF0dHJpYnV0ZXMucG9zaXRpb24sYz10aGlzLl9kcmF3UmFuZ2VzW2VdO2xldCBoPTA7Zm9yKGxldCB1PWMuc3RhcnQsZj1jLnN0YXJ0K2MuY291bnQ7dTxmO3UrKyl7bGV0IGQ9dTtvJiYoZD1vLmdldFgoZCkpLGVhLmZyb21CdWZmZXJBdHRyaWJ1dGUobCxkKSxoPU1hdGgubWF4KGgscy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoZWEpKX1zLnJhZGl1cz1NYXRoLnNxcnQoaCksaS5zcGhlcmVJbml0aWFsaXplZD0hMH1yZXR1cm4gdC5jb3B5KHMpLHR9c2V0TWF0cml4QXQoZSx0KXtjb25zdCBuPXRoaXMuX2FjdGl2ZSxpPXRoaXMuX21hdHJpY2VzVGV4dHVyZSxzPXRoaXMuX21hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhLGE9dGhpcy5fZ2VvbWV0cnlDb3VudDtyZXR1cm4gZT49YXx8bltlXT09PSExP3RoaXM6KHQudG9BcnJheShzLGUqMTYpLGkubmVlZHNVcGRhdGU9ITAsdGhpcyl9Z2V0TWF0cml4QXQoZSx0KXtjb25zdCBuPXRoaXMuX2FjdGl2ZSxpPXRoaXMuX21hdHJpY2VzVGV4dHVyZS5pbWFnZS5kYXRhLHM9dGhpcy5fZ2VvbWV0cnlDb3VudDtyZXR1cm4gZT49c3x8bltlXT09PSExP251bGw6dC5mcm9tQXJyYXkoaSxlKjE2KX1zZXRWaXNpYmxlQXQoZSx0KXtjb25zdCBuPXRoaXMuX3Zpc2liaWxpdHksaT10aGlzLl9hY3RpdmUscz10aGlzLl9nZW9tZXRyeUNvdW50O3JldHVybiBlPj1zfHxpW2VdPT09ITF8fG5bZV09PT10P3RoaXM6KG5bZV09dCx0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZD0hMCx0aGlzKX1nZXRWaXNpYmxlQXQoZSl7Y29uc3QgdD10aGlzLl92aXNpYmlsaXR5LG49dGhpcy5fYWN0aXZlLGk9dGhpcy5fZ2VvbWV0cnlDb3VudDtyZXR1cm4gZT49aXx8bltlXT09PSExPyExOnRbZV19cmF5Y2FzdChlLHQpe2NvbnN0IG49dGhpcy5fdmlzaWJpbGl0eSxpPXRoaXMuX2FjdGl2ZSxzPXRoaXMuX2RyYXdSYW5nZXMsYT10aGlzLl9nZW9tZXRyeUNvdW50LG89dGhpcy5tYXRyaXhXb3JsZCxsPXRoaXMuZ2VvbWV0cnk7V3QubWF0ZXJpYWw9dGhpcy5tYXRlcmlhbCxXdC5nZW9tZXRyeS5pbmRleD1sLmluZGV4LFd0Lmdlb21ldHJ5LmF0dHJpYnV0ZXM9bC5hdHRyaWJ1dGVzLFd0Lmdlb21ldHJ5LmJvdW5kaW5nQm94PT09bnVsbCYmKFd0Lmdlb21ldHJ5LmJvdW5kaW5nQm94PW5ldyBEdCksV3QuZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmU9PT1udWxsJiYoV3QuZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmU9bmV3IEd0KTtmb3IobGV0IGM9MDtjPGE7YysrKXtpZighbltjXXx8IWlbY10pY29udGludWU7Y29uc3QgaD1zW2NdO1d0Lmdlb21ldHJ5LnNldERyYXdSYW5nZShoLnN0YXJ0LGguY291bnQpLHRoaXMuZ2V0TWF0cml4QXQoYyxXdC5tYXRyaXhXb3JsZCkucHJlbXVsdGlwbHkobyksdGhpcy5nZXRCb3VuZGluZ0JveEF0KGMsV3QuZ2VvbWV0cnkuYm91bmRpbmdCb3gpLHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdChjLFd0Lmdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlKSxXdC5yYXljYXN0KGUsTm8pO2ZvcihsZXQgdT0wLGY9Tm8ubGVuZ3RoO3U8Zjt1Kyspe2NvbnN0IGQ9Tm9bdV07ZC5vYmplY3Q9dGhpcyxkLmJhdGNoSWQ9Yyx0LnB1c2goZCl9Tm8ubGVuZ3RoPTB9V3QubWF0ZXJpYWw9bnVsbCxXdC5nZW9tZXRyeS5pbmRleD1udWxsLFd0Lmdlb21ldHJ5LmF0dHJpYnV0ZXM9e30sV3QuZ2VvbWV0cnkuc2V0RHJhd1JhbmdlKDAsMS8wKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuZ2VvbWV0cnk9ZS5nZW9tZXRyeS5jbG9uZSgpLHRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZD1lLnBlck9iamVjdEZydXN0dW1DdWxsZWQsdGhpcy5zb3J0T2JqZWN0cz1lLnNvcnRPYmplY3RzLHRoaXMuYm91bmRpbmdCb3g9ZS5ib3VuZGluZ0JveCE9PW51bGw/ZS5ib3VuZGluZ0JveC5jbG9uZSgpOm51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1lLmJvdW5kaW5nU3BoZXJlIT09bnVsbD9lLmJvdW5kaW5nU3BoZXJlLmNsb25lKCk6bnVsbCx0aGlzLl9kcmF3UmFuZ2VzPWUuX2RyYXdSYW5nZXMubWFwKHQ9PnZyKHt9LHQpKSx0aGlzLl9yZXNlcnZlZFJhbmdlcz1lLl9yZXNlcnZlZFJhbmdlcy5tYXAodD0+dnIoe30sdCkpLHRoaXMuX3Zpc2liaWxpdHk9ZS5fdmlzaWJpbGl0eS5zbGljZSgpLHRoaXMuX2FjdGl2ZT1lLl9hY3RpdmUuc2xpY2UoKSx0aGlzLl9ib3VuZHM9ZS5fYm91bmRzLm1hcCh0PT4oe2JveEluaXRpYWxpemVkOnQuYm94SW5pdGlhbGl6ZWQsYm94OnQuYm94LmNsb25lKCksc3BoZXJlSW5pdGlhbGl6ZWQ6dC5zcGhlcmVJbml0aWFsaXplZCxzcGhlcmU6dC5zcGhlcmUuY2xvbmUoKX0pKSx0aGlzLl9tYXhHZW9tZXRyeUNvdW50PWUuX21heEdlb21ldHJ5Q291bnQsdGhpcy5fbWF4VmVydGV4Q291bnQ9ZS5fbWF4VmVydGV4Q291bnQsdGhpcy5fbWF4SW5kZXhDb3VudD1lLl9tYXhJbmRleENvdW50LHRoaXMuX2dlb21ldHJ5SW5pdGlhbGl6ZWQ9ZS5fZ2VvbWV0cnlJbml0aWFsaXplZCx0aGlzLl9nZW9tZXRyeUNvdW50PWUuX2dlb21ldHJ5Q291bnQsdGhpcy5fbXVsdGlEcmF3Q291bnRzPWUuX211bHRpRHJhd0NvdW50cy5zbGljZSgpLHRoaXMuX211bHRpRHJhd1N0YXJ0cz1lLl9tdWx0aURyYXdTdGFydHMuc2xpY2UoKSx0aGlzLl9tYXRyaWNlc1RleHR1cmU9ZS5fbWF0cmljZXNUZXh0dXJlLmNsb25lKCksdGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLmRhdGE9dGhpcy5fbWF0cmljZXNUZXh0dXJlLmltYWdlLnNsaWNlKCksdGhpc31kaXNwb3NlKCl7cmV0dXJuIHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMuX21hdHJpY2VzVGV4dHVyZS5kaXNwb3NlKCksdGhpcy5fbWF0cmljZXNUZXh0dXJlPW51bGwsdGhpc31vbkJlZm9yZVJlbmRlcihlLHQsbixpLHMpe2lmKCF0aGlzLl92aXNpYmlsaXR5Q2hhbmdlZCYmIXRoaXMucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCYmIXRoaXMuc29ydE9iamVjdHMpcmV0dXJuO2NvbnN0IGE9aS5nZXRJbmRleCgpLG89YT09PW51bGw/MTphLmFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULGw9dGhpcy5fdmlzaWJpbGl0eSxjPXRoaXMuX211bHRpRHJhd1N0YXJ0cyxoPXRoaXMuX211bHRpRHJhd0NvdW50cyx1PXRoaXMuX2RyYXdSYW5nZXMsZj10aGlzLnBlck9iamVjdEZydXN0dW1DdWxsZWQ7ZiYmKEhwLm11bHRpcGx5TWF0cmljZXMobi5wcm9qZWN0aW9uTWF0cml4LG4ubWF0cml4V29ybGRJbnZlcnNlKS5tdWx0aXBseSh0aGlzLm1hdHJpeFdvcmxkKSx6aC5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChIcCxlLmlzV2ViR1BVUmVuZGVyZXI/RXI6UG4pKTtsZXQgZD0wO2lmKHRoaXMuc29ydE9iamVjdHMpe1ZwLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksZWEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG4ubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NChWcCk7Zm9yKGxldCBnPTAsbT1sLmxlbmd0aDtnPG07ZysrKWlmKGxbZ10pe3RoaXMuZ2V0TWF0cml4QXQoZyxJaSksdGhpcy5nZXRCb3VuZGluZ1NwaGVyZUF0KGcsZXIpLmFwcGx5TWF0cml4NChJaSk7bGV0IHk9ITE7aWYoZiYmKHk9IXpoLmludGVyc2VjdHNTcGhlcmUoZXIpKSwheSl7Y29uc3QgeD1lYS5kaXN0YW5jZVRvKGVyLmNlbnRlcik7a2gucHVzaCh1W2ddLHgpfX1jb25zdCBwPWtoLmxpc3QsXz10aGlzLmN1c3RvbVNvcnQ7Xz09PW51bGw/cC5zb3J0KHMudHJhbnNwYXJlbnQ/TFM6UFMpOl8uY2FsbCh0aGlzLHAsbik7Zm9yKGxldCBnPTAsbT1wLmxlbmd0aDtnPG07ZysrKXtjb25zdCB5PXBbZ107Y1tkXT15LnN0YXJ0Km8saFtkXT15LmNvdW50LGQrK31raC5yZXNldCgpfWVsc2UgZm9yKGxldCBwPTAsXz1sLmxlbmd0aDtwPF87cCsrKWlmKGxbcF0pe2xldCBnPSExO2lmKGYmJih0aGlzLmdldE1hdHJpeEF0KHAsSWkpLHRoaXMuZ2V0Qm91bmRpbmdTcGhlcmVBdChwLGVyKS5hcHBseU1hdHJpeDQoSWkpLGc9IXpoLmludGVyc2VjdHNTcGhlcmUoZXIpKSwhZyl7Y29uc3QgbT11W3BdO2NbZF09bS5zdGFydCpvLGhbZF09bS5jb3VudCxkKyt9fXRoaXMuX211bHRpRHJhd0NvdW50PWQsdGhpcy5fdmlzaWJpbGl0eUNoYW5nZWQ9ITF9b25CZWZvcmVTaGFkb3coZSx0LG4saSxzLGEpe3RoaXMub25CZWZvcmVSZW5kZXIoZSxudWxsLGkscyxhKX19Y2xhc3MgS3QgZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNMaW5lQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5ZSgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpbmV3aWR0aD0xLHRoaXMubGluZWNhcD0icm91bmQiLHRoaXMubGluZWpvaW49InJvdW5kIix0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuY29sb3IuY29weShlLmNvbG9yKSx0aGlzLm1hcD1lLm1hcCx0aGlzLmxpbmV3aWR0aD1lLmxpbmV3aWR0aCx0aGlzLmxpbmVjYXA9ZS5saW5lY2FwLHRoaXMubGluZWpvaW49ZS5saW5lam9pbix0aGlzLmZvZz1lLmZvZyx0aGlzfX1jb25zdCBYcD1uZXcgUCxxcD1uZXcgUCwkcD1uZXcgSWUsR2g9bmV3IFVyLEZvPW5ldyBHdDtjbGFzcyBVaSBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKGU9bmV3IGtlLHQ9bmV3IEt0KXtzdXBlcigpLHRoaXMuaXNMaW5lPSEwLHRoaXMudHlwZT0iTGluZSIsdGhpcy5nZW9tZXRyeT1lLHRoaXMubWF0ZXJpYWw9dCx0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpfWNvcHkoZSx0KXtyZXR1cm4gc3VwZXIuY29weShlLHQpLHRoaXMubWF0ZXJpYWw9QXJyYXkuaXNBcnJheShlLm1hdGVyaWFsKT9lLm1hdGVyaWFsLnNsaWNlKCk6ZS5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PWUuZ2VvbWV0cnksdGhpc31jb21wdXRlTGluZURpc3RhbmNlcygpe2NvbnN0IGU9dGhpcy5nZW9tZXRyeTtpZihlLmluZGV4PT09bnVsbCl7Y29uc3QgdD1lLmF0dHJpYnV0ZXMucG9zaXRpb24sbj1bMF07Zm9yKGxldCBpPTEscz10LmNvdW50O2k8cztpKyspWHAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGktMSkscXAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGkpLG5baV09bltpLTFdLG5baV0rPVhwLmRpc3RhbmNlVG8ocXApO2Uuc2V0QXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBTZShuLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7cmV0dXJuIHRoaXN9cmF5Y2FzdChlLHQpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxpPXRoaXMubWF0cml4V29ybGQscz1lLnBhcmFtcy5MaW5lLnRocmVzaG9sZCxhPW4uZHJhd1JhbmdlO2lmKG4uYm91bmRpbmdTcGhlcmU9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLEZvLmNvcHkobi5ib3VuZGluZ1NwaGVyZSksRm8uYXBwbHlNYXRyaXg0KGkpLEZvLnJhZGl1cys9cyxlLnJheS5pbnRlcnNlY3RzU3BoZXJlKEZvKT09PSExKXJldHVybjskcC5jb3B5KGkpLmludmVydCgpLEdoLmNvcHkoZS5yYXkpLmFwcGx5TWF0cml4NCgkcCk7Y29uc3Qgbz1zLygodGhpcy5zY2FsZS54K3RoaXMuc2NhbGUueSt0aGlzLnNjYWxlLnopLzMpLGw9bypvLGM9bmV3IFAsaD1uZXcgUCx1PW5ldyBQLGY9bmV3IFAsZD10aGlzLmlzTGluZVNlZ21lbnRzPzI6MSxwPW4uaW5kZXgsZz1uLmF0dHJpYnV0ZXMucG9zaXRpb247aWYocCE9PW51bGwpe2NvbnN0IG09TWF0aC5tYXgoMCxhLnN0YXJ0KSx5PU1hdGgubWluKHAuY291bnQsYS5zdGFydCthLmNvdW50KTtmb3IobGV0IHg9bSx2PXktMTt4PHY7eCs9ZCl7Y29uc3QgUz1wLmdldFgoeCksYj1wLmdldFgoeCsxKTtpZihjLmZyb21CdWZmZXJBdHRyaWJ1dGUoZyxTKSxoLmZyb21CdWZmZXJBdHRyaWJ1dGUoZyxiKSxHaC5kaXN0YW5jZVNxVG9TZWdtZW50KGMsaCxmLHUpPmwpY29udGludWU7Zi5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCk7Y29uc3QgTD1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhmKTtMPGUubmVhcnx8TD5lLmZhcnx8dC5wdXNoKHtkaXN0YW5jZTpMLHBvaW50OnUuY2xvbmUoKS5hcHBseU1hdHJpeDQodGhpcy5tYXRyaXhXb3JsZCksaW5kZXg6eCxmYWNlOm51bGwsZmFjZUluZGV4Om51bGwsb2JqZWN0OnRoaXN9KX19ZWxzZXtjb25zdCBtPU1hdGgubWF4KDAsYS5zdGFydCkseT1NYXRoLm1pbihnLmNvdW50LGEuc3RhcnQrYS5jb3VudCk7Zm9yKGxldCB4PW0sdj15LTE7eDx2O3grPWQpe2lmKGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShnLHgpLGguZnJvbUJ1ZmZlckF0dHJpYnV0ZShnLHgrMSksR2guZGlzdGFuY2VTcVRvU2VnbWVudChjLGgsZix1KT5sKWNvbnRpbnVlO2YuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpO2NvbnN0IGI9ZS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oZik7YjxlLm5lYXJ8fGI+ZS5mYXJ8fHQucHVzaCh7ZGlzdGFuY2U6Yixwb2ludDp1LmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4OngsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSl9fX11cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXModCk7aWYobi5sZW5ndGg+MCl7Y29uc3QgaT10W25bMF1dO2lmKGkhPT12b2lkIDApe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgcz0wLGE9aS5sZW5ndGg7czxhO3MrKyl7Y29uc3Qgbz1pW3NdLm5hbWV8fFN0cmluZyhzKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W29dPXN9fX19fWNvbnN0IFlwPW5ldyBQLFpwPW5ldyBQO2NsYXNzIFduIGV4dGVuZHMgVWl7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpLHRoaXMuaXNMaW5lU2VnbWVudHM9ITAsdGhpcy50eXBlPSJMaW5lU2VnbWVudHMifWNvbXB1dGVMaW5lRGlzdGFuY2VzKCl7Y29uc3QgZT10aGlzLmdlb21ldHJ5O2lmKGUuaW5kZXg9PT1udWxsKXtjb25zdCB0PWUuYXR0cmlidXRlcy5wb3NpdGlvbixuPVtdO2ZvcihsZXQgaT0wLHM9dC5jb3VudDtpPHM7aSs9MilZcC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsaSksWnAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGkrMSksbltpXT1pPT09MD8wOm5baS0xXSxuW2krMV09bltpXStZcC5kaXN0YW5jZVRvKFpwKTtlLnNldEF0dHJpYnV0ZSgibGluZURpc3RhbmNlIixuZXcgU2UobiwxKSl9ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLkxpbmVTZWdtZW50cy5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7cmV0dXJuIHRoaXN9fWNsYXNzIEpwIGV4dGVuZHMgVWl7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpLHRoaXMuaXNMaW5lTG9vcD0hMCx0aGlzLnR5cGU9IkxpbmVMb29wIn19Y2xhc3MgVmggZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNQb2ludHNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlBvaW50c01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5ZSgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5zaXplPTEsdGhpcy5zaXplQXR0ZW51YXRpb249ITAsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXMoZSl9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLmNvbG9yLmNvcHkoZS5jb2xvciksdGhpcy5tYXA9ZS5tYXAsdGhpcy5hbHBoYU1hcD1lLmFscGhhTWFwLHRoaXMuc2l6ZT1lLnNpemUsdGhpcy5zaXplQXR0ZW51YXRpb249ZS5zaXplQXR0ZW51YXRpb24sdGhpcy5mb2c9ZS5mb2csdGhpc319Y29uc3QgS3A9bmV3IEllLEhoPW5ldyBVcixPbz1uZXcgR3QsQm89bmV3IFA7Y2xhc3MgUXAgZXh0ZW5kcyBydHtjb25zdHJ1Y3RvcihlPW5ldyBrZSx0PW5ldyBWaCl7c3VwZXIoKSx0aGlzLmlzUG9pbnRzPSEwLHRoaXMudHlwZT0iUG9pbnRzIix0aGlzLmdlb21ldHJ5PWUsdGhpcy5tYXRlcmlhbD10LHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9Y29weShlLHQpe3JldHVybiBzdXBlci5jb3B5KGUsdCksdGhpcy5tYXRlcmlhbD1BcnJheS5pc0FycmF5KGUubWF0ZXJpYWwpP2UubWF0ZXJpYWwuc2xpY2UoKTplLm1hdGVyaWFsLHRoaXMuZ2VvbWV0cnk9ZS5nZW9tZXRyeSx0aGlzfXJheWNhc3QoZSx0KXtjb25zdCBuPXRoaXMuZ2VvbWV0cnksaT10aGlzLm1hdHJpeFdvcmxkLHM9ZS5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZCxhPW4uZHJhd1JhbmdlO2lmKG4uYm91bmRpbmdTcGhlcmU9PT1udWxsJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLE9vLmNvcHkobi5ib3VuZGluZ1NwaGVyZSksT28uYXBwbHlNYXRyaXg0KGkpLE9vLnJhZGl1cys9cyxlLnJheS5pbnRlcnNlY3RzU3BoZXJlKE9vKT09PSExKXJldHVybjtLcC5jb3B5KGkpLmludmVydCgpLEhoLmNvcHkoZS5yYXkpLmFwcGx5TWF0cml4NChLcCk7Y29uc3Qgbz1zLygodGhpcy5zY2FsZS54K3RoaXMuc2NhbGUueSt0aGlzLnNjYWxlLnopLzMpLGw9bypvLGM9bi5pbmRleCx1PW4uYXR0cmlidXRlcy5wb3NpdGlvbjtpZihjIT09bnVsbCl7Y29uc3QgZj1NYXRoLm1heCgwLGEuc3RhcnQpLGQ9TWF0aC5taW4oYy5jb3VudCxhLnN0YXJ0K2EuY291bnQpO2ZvcihsZXQgcD1mLF89ZDtwPF87cCsrKXtjb25zdCBnPWMuZ2V0WChwKTtCby5mcm9tQnVmZmVyQXR0cmlidXRlKHUsZyksanAoQm8sZyxsLGksZSx0LHRoaXMpfX1lbHNle2NvbnN0IGY9TWF0aC5tYXgoMCxhLnN0YXJ0KSxkPU1hdGgubWluKHUuY291bnQsYS5zdGFydCthLmNvdW50KTtmb3IobGV0IHA9ZixfPWQ7cDxfO3ArKylCby5mcm9tQnVmZmVyQXR0cmlidXRlKHUscCksanAoQm8scCxsLGksZSx0LHRoaXMpfX11cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXModCk7aWYobi5sZW5ndGg+MCl7Y29uc3QgaT10W25bMF1dO2lmKGkhPT12b2lkIDApe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgcz0wLGE9aS5sZW5ndGg7czxhO3MrKyl7Y29uc3Qgbz1pW3NdLm5hbWV8fFN0cmluZyhzKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W29dPXN9fX19fWZ1bmN0aW9uIGpwKHIsZSx0LG4saSxzLGEpe2NvbnN0IG89SGguZGlzdGFuY2VTcVRvUG9pbnQocik7aWYobzx0KXtjb25zdCBsPW5ldyBQO0hoLmNsb3Nlc3RQb2ludFRvUG9pbnQocixsKSxsLmFwcGx5TWF0cml4NChuKTtjb25zdCBjPWkucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKGwpO2lmKGM8aS5uZWFyfHxjPmkuZmFyKXJldHVybjtzLnB1c2goe2Rpc3RhbmNlOmMsZGlzdGFuY2VUb1JheTpNYXRoLnNxcnQobykscG9pbnQ6bCxpbmRleDplLGZhY2U6bnVsbCxvYmplY3Q6YX0pfX1jbGFzcyBOUyBleHRlbmRzIEV0e2NvbnN0cnVjdG9yKGUsdCxuLGkscyxhLG8sbCxjKXtzdXBlcihlLHQsbixpLHMsYSxvLGwsYyksdGhpcy5pc1ZpZGVvVGV4dHVyZT0hMCx0aGlzLm1pbkZpbHRlcj1hIT09dm9pZCAwP2E6d3QsdGhpcy5tYWdGaWx0ZXI9cyE9PXZvaWQgMD9zOnd0LHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExO2NvbnN0IGg9dGhpcztmdW5jdGlvbiB1KCl7aC5uZWVkc1VwZGF0ZT0hMCxlLnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2sodSl9InJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2siaW4gZSYmZS5yZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrKHUpfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuaW1hZ2UpLmNvcHkodGhpcyl9dXBkYXRlKCl7Y29uc3QgZT10aGlzLmltYWdlOyJyZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrImluIGU9PT0hMSYmZS5yZWFkeVN0YXRlPj1lLkhBVkVfQ1VSUkVOVF9EQVRBJiYodGhpcy5uZWVkc1VwZGF0ZT0hMCl9fWNsYXNzIEZTIGV4dGVuZHMgRXR7Y29uc3RydWN0b3IoZSx0KXtzdXBlcih7d2lkdGg6ZSxoZWlnaHQ6dH0pLHRoaXMuaXNGcmFtZWJ1ZmZlclRleHR1cmU9ITAsdGhpcy5tYWdGaWx0ZXI9YnQsdGhpcy5taW5GaWx0ZXI9YnQsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5uZWVkc1VwZGF0ZT0hMH19Y2xhc3Mgem8gZXh0ZW5kcyBFdHtjb25zdHJ1Y3RvcihlLHQsbixpLHMsYSxvLGwsYyxoLHUsZil7c3VwZXIobnVsbCxhLG8sbCxjLGgsaSxzLHUsZiksdGhpcy5pc0NvbXByZXNzZWRUZXh0dXJlPSEwLHRoaXMuaW1hZ2U9e3dpZHRoOnQsaGVpZ2h0Om59LHRoaXMubWlwbWFwcz1lLHRoaXMuZmxpcFk9ITEsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9fWNsYXNzIE9TIGV4dGVuZHMgem97Y29uc3RydWN0b3IoZSx0LG4saSxzLGEpe3N1cGVyKGUsdCxuLHMsYSksdGhpcy5pc0NvbXByZXNzZWRBcnJheVRleHR1cmU9ITAsdGhpcy5pbWFnZS5kZXB0aD1pLHRoaXMud3JhcFI9enR9fWNsYXNzIEJTIGV4dGVuZHMgem97Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKHZvaWQgMCxlWzBdLndpZHRoLGVbMF0uaGVpZ2h0LHQsbixLbiksdGhpcy5pc0NvbXByZXNzZWRDdWJlVGV4dHVyZT0hMCx0aGlzLmlzQ3ViZVRleHR1cmU9ITAsdGhpcy5pbWFnZT1lfX1jbGFzcyB6UyBleHRlbmRzIEV0e2NvbnN0cnVjdG9yKGUsdCxuLGkscyxhLG8sbCxjKXtzdXBlcihlLHQsbixpLHMsYSxvLGwsYyksdGhpcy5pc0NhbnZhc1RleHR1cmU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMH19Y2xhc3MgRm57Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU9IkN1cnZlIix0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz0yMDB9Z2V0UG9pbnQoKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZTogLmdldFBvaW50KCkgbm90IGltcGxlbWVudGVkLiIpLG51bGx9Z2V0UG9pbnRBdChlLHQpe2NvbnN0IG49dGhpcy5nZXRVdG9UbWFwcGluZyhlKTtyZXR1cm4gdGhpcy5nZXRQb2ludChuLHQpfWdldFBvaW50cyhlPTUpe2NvbnN0IHQ9W107Zm9yKGxldCBuPTA7bjw9ZTtuKyspdC5wdXNoKHRoaXMuZ2V0UG9pbnQobi9lKSk7cmV0dXJuIHR9Z2V0U3BhY2VkUG9pbnRzKGU9NSl7Y29uc3QgdD1bXTtmb3IobGV0IG49MDtuPD1lO24rKyl0LnB1c2godGhpcy5nZXRQb2ludEF0KG4vZSkpO3JldHVybiB0fWdldExlbmd0aCgpe2NvbnN0IGU9dGhpcy5nZXRMZW5ndGhzKCk7cmV0dXJuIGVbZS5sZW5ndGgtMV19Z2V0TGVuZ3RocyhlPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zKXtpZih0aGlzLmNhY2hlQXJjTGVuZ3RocyYmdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoPT09ZSsxJiYhdGhpcy5uZWVkc1VwZGF0ZSlyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7dGhpcy5uZWVkc1VwZGF0ZT0hMTtjb25zdCB0PVtdO2xldCBuLGk9dGhpcy5nZXRQb2ludCgwKSxzPTA7dC5wdXNoKDApO2ZvcihsZXQgYT0xO2E8PWU7YSsrKW49dGhpcy5nZXRQb2ludChhL2UpLHMrPW4uZGlzdGFuY2VUbyhpKSx0LnB1c2gocyksaT1uO3JldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Rocz10LHR9dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5nZXRMZW5ndGhzKCl9Z2V0VXRvVG1hcHBpbmcoZSx0KXtjb25zdCBuPXRoaXMuZ2V0TGVuZ3RocygpO2xldCBpPTA7Y29uc3Qgcz1uLmxlbmd0aDtsZXQgYTt0P2E9dDphPWUqbltzLTFdO2xldCBvPTAsbD1zLTEsYztmb3IoO288PWw7KWlmKGk9TWF0aC5mbG9vcihvKyhsLW8pLzIpLGM9bltpXS1hLGM8MClvPWkrMTtlbHNlIGlmKGM+MClsPWktMTtlbHNle2w9aTticmVha31pZihpPWwsbltpXT09PWEpcmV0dXJuIGkvKHMtMSk7Y29uc3QgaD1uW2ldLGY9bltpKzFdLWgsZD0oYS1oKS9mO3JldHVybihpK2QpLyhzLTEpfWdldFRhbmdlbnQoZSx0KXtsZXQgaT1lLTFlLTQscz1lKzFlLTQ7aTwwJiYoaT0wKSxzPjEmJihzPTEpO2NvbnN0IGE9dGhpcy5nZXRQb2ludChpKSxvPXRoaXMuZ2V0UG9pbnQocyksbD10fHwoYS5pc1ZlY3RvcjI/bmV3IHE6bmV3IFApO3JldHVybiBsLmNvcHkobykuc3ViKGEpLm5vcm1hbGl6ZSgpLGx9Z2V0VGFuZ2VudEF0KGUsdCl7Y29uc3Qgbj10aGlzLmdldFV0b1RtYXBwaW5nKGUpO3JldHVybiB0aGlzLmdldFRhbmdlbnQobix0KX1jb21wdXRlRnJlbmV0RnJhbWVzKGUsdCl7Y29uc3Qgbj1uZXcgUCxpPVtdLHM9W10sYT1bXSxvPW5ldyBQLGw9bmV3IEllO2ZvcihsZXQgZD0wO2Q8PWU7ZCsrKXtjb25zdCBwPWQvZTtpW2RdPXRoaXMuZ2V0VGFuZ2VudEF0KHAsbmV3IFApfXNbMF09bmV3IFAsYVswXT1uZXcgUDtsZXQgYz1OdW1iZXIuTUFYX1ZBTFVFO2NvbnN0IGg9TWF0aC5hYnMoaVswXS54KSx1PU1hdGguYWJzKGlbMF0ueSksZj1NYXRoLmFicyhpWzBdLnopO2g8PWMmJihjPWgsbi5zZXQoMSwwLDApKSx1PD1jJiYoYz11LG4uc2V0KDAsMSwwKSksZjw9YyYmbi5zZXQoMCwwLDEpLG8uY3Jvc3NWZWN0b3JzKGlbMF0sbikubm9ybWFsaXplKCksc1swXS5jcm9zc1ZlY3RvcnMoaVswXSxvKSxhWzBdLmNyb3NzVmVjdG9ycyhpWzBdLHNbMF0pO2ZvcihsZXQgZD0xO2Q8PWU7ZCsrKXtpZihzW2RdPXNbZC0xXS5jbG9uZSgpLGFbZF09YVtkLTFdLmNsb25lKCksby5jcm9zc1ZlY3RvcnMoaVtkLTFdLGlbZF0pLG8ubGVuZ3RoKCk+TnVtYmVyLkVQU0lMT04pe28ubm9ybWFsaXplKCk7Y29uc3QgcD1NYXRoLmFjb3MoX3QoaVtkLTFdLmRvdChpW2RdKSwtMSwxKSk7c1tkXS5hcHBseU1hdHJpeDQobC5tYWtlUm90YXRpb25BeGlzKG8scCkpfWFbZF0uY3Jvc3NWZWN0b3JzKGlbZF0sc1tkXSl9aWYodD09PSEwKXtsZXQgZD1NYXRoLmFjb3MoX3Qoc1swXS5kb3Qoc1tlXSksLTEsMSkpO2QvPWUsaVswXS5kb3Qoby5jcm9zc1ZlY3RvcnMoc1swXSxzW2VdKSk+MCYmKGQ9LWQpO2ZvcihsZXQgcD0xO3A8PWU7cCsrKXNbcF0uYXBwbHlNYXRyaXg0KGwubWFrZVJvdGF0aW9uQXhpcyhpW3BdLGQqcCkpLGFbcF0uY3Jvc3NWZWN0b3JzKGlbcF0sc1twXSl9cmV0dXJue3RhbmdlbnRzOmksbm9ybWFsczpzLGJpbm9ybWFsczphfX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9Y29weShlKXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9ZS5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc310b0pTT04oKXtjb25zdCBlPXttZXRhZGF0YTp7dmVyc2lvbjo0LjYsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O3JldHVybiBlLmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyxlLnR5cGU9dGhpcy50eXBlLGV9ZnJvbUpTT04oZSl7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWUuYXJjTGVuZ3RoRGl2aXNpb25zLHRoaXN9fWNsYXNzIGtvIGV4dGVuZHMgRm57Y29uc3RydWN0b3IoZT0wLHQ9MCxuPTEsaT0xLHM9MCxhPU1hdGguUEkqMixvPSExLGw9MCl7c3VwZXIoKSx0aGlzLmlzRWxsaXBzZUN1cnZlPSEwLHRoaXMudHlwZT0iRWxsaXBzZUN1cnZlIix0aGlzLmFYPWUsdGhpcy5hWT10LHRoaXMueFJhZGl1cz1uLHRoaXMueVJhZGl1cz1pLHRoaXMuYVN0YXJ0QW5nbGU9cyx0aGlzLmFFbmRBbmdsZT1hLHRoaXMuYUNsb2Nrd2lzZT1vLHRoaXMuYVJvdGF0aW9uPWx9Z2V0UG9pbnQoZSx0KXtjb25zdCBuPXR8fG5ldyBxLGk9TWF0aC5QSSoyO2xldCBzPXRoaXMuYUVuZEFuZ2xlLXRoaXMuYVN0YXJ0QW5nbGU7Y29uc3QgYT1NYXRoLmFicyhzKTxOdW1iZXIuRVBTSUxPTjtmb3IoO3M8MDspcys9aTtmb3IoO3M+aTspcy09aTtzPE51bWJlci5FUFNJTE9OJiYoYT9zPTA6cz1pKSx0aGlzLmFDbG9ja3dpc2U9PT0hMCYmIWEmJihzPT09aT9zPS1pOnM9cy1pKTtjb25zdCBvPXRoaXMuYVN0YXJ0QW5nbGUrZSpzO2xldCBsPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKG8pLGM9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4obyk7aWYodGhpcy5hUm90YXRpb24hPT0wKXtjb25zdCBoPU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSx1PU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxmPWwtdGhpcy5hWCxkPWMtdGhpcy5hWTtsPWYqaC1kKnUrdGhpcy5hWCxjPWYqdStkKmgrdGhpcy5hWX1yZXR1cm4gbi5zZXQobCxjKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuYVg9ZS5hWCx0aGlzLmFZPWUuYVksdGhpcy54UmFkaXVzPWUueFJhZGl1cyx0aGlzLnlSYWRpdXM9ZS55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9ZS5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT1lLmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9ZS5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPWUuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgZT1zdXBlci50b0pTT04oKTtyZXR1cm4gZS5hWD10aGlzLmFYLGUuYVk9dGhpcy5hWSxlLnhSYWRpdXM9dGhpcy54UmFkaXVzLGUueVJhZGl1cz10aGlzLnlSYWRpdXMsZS5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLGUuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLGUuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsZS5hUm90YXRpb249dGhpcy5hUm90YXRpb24sZX1mcm9tSlNPTihlKXtyZXR1cm4gc3VwZXIuZnJvbUpTT04oZSksdGhpcy5hWD1lLmFYLHRoaXMuYVk9ZS5hWSx0aGlzLnhSYWRpdXM9ZS54UmFkaXVzLHRoaXMueVJhZGl1cz1lLnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT1lLmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPWUuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT1lLmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249ZS5hUm90YXRpb24sdGhpc319Y2xhc3MgZW0gZXh0ZW5kcyBrb3tjb25zdHJ1Y3RvcihlLHQsbixpLHMsYSl7c3VwZXIoZSx0LG4sbixpLHMsYSksdGhpcy5pc0FyY0N1cnZlPSEwLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiBXaCgpe2xldCByPTAsZT0wLHQ9MCxuPTA7ZnVuY3Rpb24gaShzLGEsbyxsKXtyPXMsZT1vLHQ9LTMqcyszKmEtMipvLWwsbj0yKnMtMiphK28rbH1yZXR1cm57aW5pdENhdG11bGxSb206ZnVuY3Rpb24ocyxhLG8sbCxjKXtpKGEsbyxjKihvLXMpLGMqKGwtYSkpfSxpbml0Tm9udW5pZm9ybUNhdG11bGxSb206ZnVuY3Rpb24ocyxhLG8sbCxjLGgsdSl7bGV0IGY9KGEtcykvYy0oby1zKS8oYytoKSsoby1hKS9oLGQ9KG8tYSkvaC0obC1hKS8oaCt1KSsobC1vKS91O2YqPWgsZCo9aCxpKGEsbyxmLGQpfSxjYWxjOmZ1bmN0aW9uKHMpe2NvbnN0IGE9cypzLG89YSpzO3JldHVybiByK2Uqcyt0KmErbipvfX19Y29uc3QgR289bmV3IFAsWGg9bmV3IFdoLHFoPW5ldyBXaCwkaD1uZXcgV2g7Y2xhc3MgdG0gZXh0ZW5kcyBGbntjb25zdHJ1Y3RvcihlPVtdLHQ9ITEsbj0iY2VudHJpcGV0YWwiLGk9LjUpe3N1cGVyKCksdGhpcy5pc0NhdG11bGxSb21DdXJ2ZTM9ITAsdGhpcy50eXBlPSJDYXRtdWxsUm9tQ3VydmUzIix0aGlzLnBvaW50cz1lLHRoaXMuY2xvc2VkPXQsdGhpcy5jdXJ2ZVR5cGU9bix0aGlzLnRlbnNpb249aX1nZXRQb2ludChlLHQ9bmV3IFApe2NvbnN0IG49dCxpPXRoaXMucG9pbnRzLHM9aS5sZW5ndGgsYT0ocy0odGhpcy5jbG9zZWQ/MDoxKSkqZTtsZXQgbz1NYXRoLmZsb29yKGEpLGw9YS1vO3RoaXMuY2xvc2VkP28rPW8+MD8wOihNYXRoLmZsb29yKE1hdGguYWJzKG8pL3MpKzEpKnM6bD09PTAmJm89PT1zLTEmJihvPXMtMixsPTEpO2xldCBjLGg7dGhpcy5jbG9zZWR8fG8+MD9jPWlbKG8tMSklc106KEdvLnN1YlZlY3RvcnMoaVswXSxpWzFdKS5hZGQoaVswXSksYz1Hbyk7Y29uc3QgdT1pW28lc10sZj1pWyhvKzEpJXNdO2lmKHRoaXMuY2xvc2VkfHxvKzI8cz9oPWlbKG8rMiklc106KEdvLnN1YlZlY3RvcnMoaVtzLTFdLGlbcy0yXSkuYWRkKGlbcy0xXSksaD1HbyksdGhpcy5jdXJ2ZVR5cGU9PT0iY2VudHJpcGV0YWwifHx0aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIil7Y29uc3QgZD10aGlzLmN1cnZlVHlwZT09PSJjaG9yZGFsIj8uNTouMjU7bGV0IHA9TWF0aC5wb3coYy5kaXN0YW5jZVRvU3F1YXJlZCh1KSxkKSxfPU1hdGgucG93KHUuZGlzdGFuY2VUb1NxdWFyZWQoZiksZCksZz1NYXRoLnBvdyhmLmRpc3RhbmNlVG9TcXVhcmVkKGgpLGQpO188MWUtNCYmKF89MSkscDwxZS00JiYocD1fKSxnPDFlLTQmJihnPV8pLFhoLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShjLngsdS54LGYueCxoLngscCxfLGcpLHFoLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShjLnksdS55LGYueSxoLnkscCxfLGcpLCRoLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbShjLnosdS56LGYueixoLnoscCxfLGcpfWVsc2UgdGhpcy5jdXJ2ZVR5cGU9PT0iY2F0bXVsbHJvbSImJihYaC5pbml0Q2F0bXVsbFJvbShjLngsdS54LGYueCxoLngsdGhpcy50ZW5zaW9uKSxxaC5pbml0Q2F0bXVsbFJvbShjLnksdS55LGYueSxoLnksdGhpcy50ZW5zaW9uKSwkaC5pbml0Q2F0bXVsbFJvbShjLnosdS56LGYueixoLnosdGhpcy50ZW5zaW9uKSk7cmV0dXJuIG4uc2V0KFhoLmNhbGMobCkscWguY2FsYyhsKSwkaC5jYWxjKGwpKSxufWNvcHkoZSl7c3VwZXIuY29weShlKSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IHQ9MCxuPWUucG9pbnRzLmxlbmd0aDt0PG47dCsrKXtjb25zdCBpPWUucG9pbnRzW3RdO3RoaXMucG9pbnRzLnB1c2goaS5jbG9uZSgpKX1yZXR1cm4gdGhpcy5jbG9zZWQ9ZS5jbG9zZWQsdGhpcy5jdXJ2ZVR5cGU9ZS5jdXJ2ZVR5cGUsdGhpcy50ZW5zaW9uPWUudGVuc2lvbix0aGlzfXRvSlNPTigpe2NvbnN0IGU9c3VwZXIudG9KU09OKCk7ZS5wb2ludHM9W107Zm9yKGxldCB0PTAsbj10aGlzLnBvaW50cy5sZW5ndGg7dDxuO3QrKyl7Y29uc3QgaT10aGlzLnBvaW50c1t0XTtlLnBvaW50cy5wdXNoKGkudG9BcnJheSgpKX1yZXR1cm4gZS5jbG9zZWQ9dGhpcy5jbG9zZWQsZS5jdXJ2ZVR5cGU9dGhpcy5jdXJ2ZVR5cGUsZS50ZW5zaW9uPXRoaXMudGVuc2lvbixlfWZyb21KU09OKGUpe3N1cGVyLmZyb21KU09OKGUpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgdD0wLG49ZS5wb2ludHMubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IGk9ZS5wb2ludHNbdF07dGhpcy5wb2ludHMucHVzaChuZXcgUCgpLmZyb21BcnJheShpKSl9cmV0dXJuIHRoaXMuY2xvc2VkPWUuY2xvc2VkLHRoaXMuY3VydmVUeXBlPWUuY3VydmVUeXBlLHRoaXMudGVuc2lvbj1lLnRlbnNpb24sdGhpc319ZnVuY3Rpb24gbm0ocixlLHQsbixpKXtjb25zdCBzPShuLWUpKi41LGE9KGktdCkqLjUsbz1yKnIsbD1yKm87cmV0dXJuKDIqdC0yKm4rcythKSpsKygtMyp0KzMqbi0yKnMtYSkqbytzKnIrdH1mdW5jdGlvbiBrUyhyLGUpe2NvbnN0IHQ9MS1yO3JldHVybiB0KnQqZX1mdW5jdGlvbiBHUyhyLGUpe3JldHVybiAyKigxLXIpKnIqZX1mdW5jdGlvbiBWUyhyLGUpe3JldHVybiByKnIqZX1mdW5jdGlvbiB0YShyLGUsdCxuKXtyZXR1cm4ga1MocixlKStHUyhyLHQpK1ZTKHIsbil9ZnVuY3Rpb24gSFMocixlKXtjb25zdCB0PTEtcjtyZXR1cm4gdCp0KnQqZX1mdW5jdGlvbiBXUyhyLGUpe2NvbnN0IHQ9MS1yO3JldHVybiAzKnQqdCpyKmV9ZnVuY3Rpb24gWFMocixlKXtyZXR1cm4gMyooMS1yKSpyKnIqZX1mdW5jdGlvbiBxUyhyLGUpe3JldHVybiByKnIqciplfWZ1bmN0aW9uIG5hKHIsZSx0LG4saSl7cmV0dXJuIEhTKHIsZSkrV1Mocix0KStYUyhyLG4pK3FTKHIsaSl9Y2xhc3MgWWggZXh0ZW5kcyBGbntjb25zdHJ1Y3RvcihlPW5ldyBxLHQ9bmV3IHEsbj1uZXcgcSxpPW5ldyBxKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlPSEwLHRoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSIsdGhpcy52MD1lLHRoaXMudjE9dCx0aGlzLnYyPW4sdGhpcy52Mz1pfWdldFBvaW50KGUsdD1uZXcgcSl7Y29uc3Qgbj10LGk9dGhpcy52MCxzPXRoaXMudjEsYT10aGlzLnYyLG89dGhpcy52MztyZXR1cm4gbi5zZXQobmEoZSxpLngscy54LGEueCxvLngpLG5hKGUsaS55LHMueSxhLnksby55KSksbn1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMudjAuY29weShlLnYwKSx0aGlzLnYxLmNvcHkoZS52MSksdGhpcy52Mi5jb3B5KGUudjIpLHRoaXMudjMuY29weShlLnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IGU9c3VwZXIudG9KU09OKCk7cmV0dXJuIGUudjA9dGhpcy52MC50b0FycmF5KCksZS52MT10aGlzLnYxLnRvQXJyYXkoKSxlLnYyPXRoaXMudjIudG9BcnJheSgpLGUudjM9dGhpcy52My50b0FycmF5KCksZX1mcm9tSlNPTihlKXtyZXR1cm4gc3VwZXIuZnJvbUpTT04oZSksdGhpcy52MC5mcm9tQXJyYXkoZS52MCksdGhpcy52MS5mcm9tQXJyYXkoZS52MSksdGhpcy52Mi5mcm9tQXJyYXkoZS52MiksdGhpcy52My5mcm9tQXJyYXkoZS52MyksdGhpc319Y2xhc3MgaW0gZXh0ZW5kcyBGbntjb25zdHJ1Y3RvcihlPW5ldyBQLHQ9bmV3IFAsbj1uZXcgUCxpPW5ldyBQKXtzdXBlcigpLHRoaXMuaXNDdWJpY0JlemllckN1cnZlMz0hMCx0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIix0aGlzLnYwPWUsdGhpcy52MT10LHRoaXMudjI9bix0aGlzLnYzPWl9Z2V0UG9pbnQoZSx0PW5ldyBQKXtjb25zdCBuPXQsaT10aGlzLnYwLHM9dGhpcy52MSxhPXRoaXMudjIsbz10aGlzLnYzO3JldHVybiBuLnNldChuYShlLGkueCxzLngsYS54LG8ueCksbmEoZSxpLnkscy55LGEueSxvLnkpLG5hKGUsaS56LHMueixhLnosby56KSksbn1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMudjAuY29weShlLnYwKSx0aGlzLnYxLmNvcHkoZS52MSksdGhpcy52Mi5jb3B5KGUudjIpLHRoaXMudjMuY29weShlLnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IGU9c3VwZXIudG9KU09OKCk7cmV0dXJuIGUudjA9dGhpcy52MC50b0FycmF5KCksZS52MT10aGlzLnYxLnRvQXJyYXkoKSxlLnYyPXRoaXMudjIudG9BcnJheSgpLGUudjM9dGhpcy52My50b0FycmF5KCksZX1mcm9tSlNPTihlKXtyZXR1cm4gc3VwZXIuZnJvbUpTT04oZSksdGhpcy52MC5mcm9tQXJyYXkoZS52MCksdGhpcy52MS5mcm9tQXJyYXkoZS52MSksdGhpcy52Mi5mcm9tQXJyYXkoZS52MiksdGhpcy52My5mcm9tQXJyYXkoZS52MyksdGhpc319Y2xhc3MgWmggZXh0ZW5kcyBGbntjb25zdHJ1Y3RvcihlPW5ldyBxLHQ9bmV3IHEpe3N1cGVyKCksdGhpcy5pc0xpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZSIsdGhpcy52MT1lLHRoaXMudjI9dH1nZXRQb2ludChlLHQ9bmV3IHEpe2NvbnN0IG49dDtyZXR1cm4gZT09PTE/bi5jb3B5KHRoaXMudjIpOihuLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLG4ubXVsdGlwbHlTY2FsYXIoZSkuYWRkKHRoaXMudjEpKSxufWdldFBvaW50QXQoZSx0KXtyZXR1cm4gdGhpcy5nZXRQb2ludChlLHQpfWdldFRhbmdlbnQoZSx0PW5ldyBxKXtyZXR1cm4gdC5zdWJWZWN0b3JzKHRoaXMudjIsdGhpcy52MSkubm9ybWFsaXplKCl9Z2V0VGFuZ2VudEF0KGUsdCl7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChlLHQpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy52MS5jb3B5KGUudjEpLHRoaXMudjIuY29weShlLnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IGU9c3VwZXIudG9KU09OKCk7cmV0dXJuIGUudjE9dGhpcy52MS50b0FycmF5KCksZS52Mj10aGlzLnYyLnRvQXJyYXkoKSxlfWZyb21KU09OKGUpe3JldHVybiBzdXBlci5mcm9tSlNPTihlKSx0aGlzLnYxLmZyb21BcnJheShlLnYxKSx0aGlzLnYyLmZyb21BcnJheShlLnYyKSx0aGlzfX1jbGFzcyBybSBleHRlbmRzIEZue2NvbnN0cnVjdG9yKGU9bmV3IFAsdD1uZXcgUCl7c3VwZXIoKSx0aGlzLmlzTGluZUN1cnZlMz0hMCx0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiLHRoaXMudjE9ZSx0aGlzLnYyPXR9Z2V0UG9pbnQoZSx0PW5ldyBQKXtjb25zdCBuPXQ7cmV0dXJuIGU9PT0xP24uY29weSh0aGlzLnYyKToobi5jb3B5KHRoaXMudjIpLnN1Yih0aGlzLnYxKSxuLm11bHRpcGx5U2NhbGFyKGUpLmFkZCh0aGlzLnYxKSksbn1nZXRQb2ludEF0KGUsdCl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoZSx0KX1nZXRUYW5nZW50KGUsdD1uZXcgUCl7cmV0dXJuIHQuc3ViVmVjdG9ycyh0aGlzLnYyLHRoaXMudjEpLm5vcm1hbGl6ZSgpfWdldFRhbmdlbnRBdChlLHQpe3JldHVybiB0aGlzLmdldFRhbmdlbnQoZSx0KX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMudjEuY29weShlLnYxKSx0aGlzLnYyLmNvcHkoZS52MiksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO3JldHVybiBlLnYxPXRoaXMudjEudG9BcnJheSgpLGUudjI9dGhpcy52Mi50b0FycmF5KCksZX1mcm9tSlNPTihlKXtyZXR1cm4gc3VwZXIuZnJvbUpTT04oZSksdGhpcy52MS5mcm9tQXJyYXkoZS52MSksdGhpcy52Mi5mcm9tQXJyYXkoZS52MiksdGhpc319Y2xhc3MgSmggZXh0ZW5kcyBGbntjb25zdHJ1Y3RvcihlPW5ldyBxLHQ9bmV3IHEsbj1uZXcgcSl7c3VwZXIoKSx0aGlzLmlzUXVhZHJhdGljQmV6aWVyQ3VydmU9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZSIsdGhpcy52MD1lLHRoaXMudjE9dCx0aGlzLnYyPW59Z2V0UG9pbnQoZSx0PW5ldyBxKXtjb25zdCBuPXQsaT10aGlzLnYwLHM9dGhpcy52MSxhPXRoaXMudjI7cmV0dXJuIG4uc2V0KHRhKGUsaS54LHMueCxhLngpLHRhKGUsaS55LHMueSxhLnkpKSxufWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy52MC5jb3B5KGUudjApLHRoaXMudjEuY29weShlLnYxKSx0aGlzLnYyLmNvcHkoZS52MiksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO3JldHVybiBlLnYwPXRoaXMudjAudG9BcnJheSgpLGUudjE9dGhpcy52MS50b0FycmF5KCksZS52Mj10aGlzLnYyLnRvQXJyYXkoKSxlfWZyb21KU09OKGUpe3JldHVybiBzdXBlci5mcm9tSlNPTihlKSx0aGlzLnYwLmZyb21BcnJheShlLnYwKSx0aGlzLnYxLmZyb21BcnJheShlLnYxKSx0aGlzLnYyLmZyb21BcnJheShlLnYyKSx0aGlzfX1jbGFzcyBLaCBleHRlbmRzIEZue2NvbnN0cnVjdG9yKGU9bmV3IFAsdD1uZXcgUCxuPW5ldyBQKXtzdXBlcigpLHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9ZSx0aGlzLnYxPXQsdGhpcy52Mj1ufWdldFBvaW50KGUsdD1uZXcgUCl7Y29uc3Qgbj10LGk9dGhpcy52MCxzPXRoaXMudjEsYT10aGlzLnYyO3JldHVybiBuLnNldCh0YShlLGkueCxzLngsYS54KSx0YShlLGkueSxzLnksYS55KSx0YShlLGkueixzLnosYS56KSksbn1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMudjAuY29weShlLnYwKSx0aGlzLnYxLmNvcHkoZS52MSksdGhpcy52Mi5jb3B5KGUudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgZT1zdXBlci50b0pTT04oKTtyZXR1cm4gZS52MD10aGlzLnYwLnRvQXJyYXkoKSxlLnYxPXRoaXMudjEudG9BcnJheSgpLGUudjI9dGhpcy52Mi50b0FycmF5KCksZX1mcm9tSlNPTihlKXtyZXR1cm4gc3VwZXIuZnJvbUpTT04oZSksdGhpcy52MC5mcm9tQXJyYXkoZS52MCksdGhpcy52MS5mcm9tQXJyYXkoZS52MSksdGhpcy52Mi5mcm9tQXJyYXkoZS52MiksdGhpc319Y2xhc3MgUWggZXh0ZW5kcyBGbntjb25zdHJ1Y3RvcihlPVtdKXtzdXBlcigpLHRoaXMuaXNTcGxpbmVDdXJ2ZT0hMCx0aGlzLnR5cGU9IlNwbGluZUN1cnZlIix0aGlzLnBvaW50cz1lfWdldFBvaW50KGUsdD1uZXcgcSl7Y29uc3Qgbj10LGk9dGhpcy5wb2ludHMscz0oaS5sZW5ndGgtMSkqZSxhPU1hdGguZmxvb3Iocyksbz1zLWEsbD1pW2E9PT0wP2E6YS0xXSxjPWlbYV0saD1pW2E+aS5sZW5ndGgtMj9pLmxlbmd0aC0xOmErMV0sdT1pW2E+aS5sZW5ndGgtMz9pLmxlbmd0aC0xOmErMl07cmV0dXJuIG4uc2V0KG5tKG8sbC54LGMueCxoLngsdS54KSxubShvLGwueSxjLnksaC55LHUueSkpLG59Y29weShlKXtzdXBlci5jb3B5KGUpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgdD0wLG49ZS5wb2ludHMubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IGk9ZS5wb2ludHNbdF07dGhpcy5wb2ludHMucHVzaChpLmNsb25lKCkpfXJldHVybiB0aGlzfXRvSlNPTigpe2NvbnN0IGU9c3VwZXIudG9KU09OKCk7ZS5wb2ludHM9W107Zm9yKGxldCB0PTAsbj10aGlzLnBvaW50cy5sZW5ndGg7dDxuO3QrKyl7Y29uc3QgaT10aGlzLnBvaW50c1t0XTtlLnBvaW50cy5wdXNoKGkudG9BcnJheSgpKX1yZXR1cm4gZX1mcm9tSlNPTihlKXtzdXBlci5mcm9tSlNPTihlKSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IHQ9MCxuPWUucG9pbnRzLmxlbmd0aDt0PG47dCsrKXtjb25zdCBpPWUucG9pbnRzW3RdO3RoaXMucG9pbnRzLnB1c2gobmV3IHEoKS5mcm9tQXJyYXkoaSkpfXJldHVybiB0aGlzfX12YXIgVm89T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6ZW0sQ2F0bXVsbFJvbUN1cnZlMzp0bSxDdWJpY0JlemllckN1cnZlOlloLEN1YmljQmV6aWVyQ3VydmUzOmltLEVsbGlwc2VDdXJ2ZTprbyxMaW5lQ3VydmU6WmgsTGluZUN1cnZlMzpybSxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpKaCxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6S2gsU3BsaW5lQ3VydmU6UWh9KTtjbGFzcyBzbSBleHRlbmRzIEZue2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkN1cnZlUGF0aCIsdGhpcy5jdXJ2ZXM9W10sdGhpcy5hdXRvQ2xvc2U9ITF9YWRkKGUpe3RoaXMuY3VydmVzLnB1c2goZSl9Y2xvc2VQYXRoKCl7Y29uc3QgZT10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSx0PXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTtpZighZS5lcXVhbHModCkpe2NvbnN0IG49ZS5pc1ZlY3RvcjI9PT0hMD8iTGluZUN1cnZlIjoiTGluZUN1cnZlMyI7dGhpcy5jdXJ2ZXMucHVzaChuZXcgVm9bbl0odCxlKSl9cmV0dXJuIHRoaXN9Z2V0UG9pbnQoZSx0KXtjb25zdCBuPWUqdGhpcy5nZXRMZW5ndGgoKSxpPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7bGV0IHM9MDtmb3IoO3M8aS5sZW5ndGg7KXtpZihpW3NdPj1uKXtjb25zdCBhPWlbc10tbixvPXRoaXMuY3VydmVzW3NdLGw9by5nZXRMZW5ndGgoKSxjPWw9PT0wPzA6MS1hL2w7cmV0dXJuIG8uZ2V0UG9pbnRBdChjLHQpfXMrK31yZXR1cm4gbnVsbH1nZXRMZW5ndGgoKXtjb25zdCBlPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIGVbZS5sZW5ndGgtMV19dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5jYWNoZUxlbmd0aHM9bnVsbCx0aGlzLmdldEN1cnZlTGVuZ3RocygpfWdldEN1cnZlTGVuZ3Rocygpe2lmKHRoaXMuY2FjaGVMZW5ndGhzJiZ0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGg9PT10aGlzLmN1cnZlcy5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO2NvbnN0IGU9W107bGV0IHQ9MDtmb3IobGV0IG49MCxpPXRoaXMuY3VydmVzLmxlbmd0aDtuPGk7bisrKXQrPXRoaXMuY3VydmVzW25dLmdldExlbmd0aCgpLGUucHVzaCh0KTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9ZSxlfWdldFNwYWNlZFBvaW50cyhlPTQwKXtjb25zdCB0PVtdO2ZvcihsZXQgbj0wO248PWU7bisrKXQucHVzaCh0aGlzLmdldFBvaW50KG4vZSkpO3JldHVybiB0aGlzLmF1dG9DbG9zZSYmdC5wdXNoKHRbMF0pLHR9Z2V0UG9pbnRzKGU9MTIpe2NvbnN0IHQ9W107bGV0IG47Zm9yKGxldCBpPTAscz10aGlzLmN1cnZlcztpPHMubGVuZ3RoO2krKyl7Y29uc3QgYT1zW2ldLG89YS5pc0VsbGlwc2VDdXJ2ZT9lKjI6YS5pc0xpbmVDdXJ2ZXx8YS5pc0xpbmVDdXJ2ZTM/MTphLmlzU3BsaW5lQ3VydmU/ZSphLnBvaW50cy5sZW5ndGg6ZSxsPWEuZ2V0UG9pbnRzKG8pO2ZvcihsZXQgYz0wO2M8bC5sZW5ndGg7YysrKXtjb25zdCBoPWxbY107biYmbi5lcXVhbHMoaCl8fCh0LnB1c2goaCksbj1oKX19cmV0dXJuIHRoaXMuYXV0b0Nsb3NlJiZ0Lmxlbmd0aD4xJiYhdFt0Lmxlbmd0aC0xXS5lcXVhbHModFswXSkmJnQucHVzaCh0WzBdKSx0fWNvcHkoZSl7c3VwZXIuY29weShlKSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IHQ9MCxuPWUuY3VydmVzLmxlbmd0aDt0PG47dCsrKXtjb25zdCBpPWUuY3VydmVzW3RdO3RoaXMuY3VydmVzLnB1c2goaS5jbG9uZSgpKX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2U9ZS5hdXRvQ2xvc2UsdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO2UuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlLGUuY3VydmVzPVtdO2ZvcihsZXQgdD0wLG49dGhpcy5jdXJ2ZXMubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IGk9dGhpcy5jdXJ2ZXNbdF07ZS5jdXJ2ZXMucHVzaChpLnRvSlNPTigpKX1yZXR1cm4gZX1mcm9tSlNPTihlKXtzdXBlci5mcm9tSlNPTihlKSx0aGlzLmF1dG9DbG9zZT1lLmF1dG9DbG9zZSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IHQ9MCxuPWUuY3VydmVzLmxlbmd0aDt0PG47dCsrKXtjb25zdCBpPWUuY3VydmVzW3RdO3RoaXMuY3VydmVzLnB1c2gobmV3IFZvW2kudHlwZV0oKS5mcm9tSlNPTihpKSl9cmV0dXJuIHRoaXN9fWxldCBpYT1jbGFzcyBleHRlbmRzIHNte2NvbnN0cnVjdG9yKGUpe3N1cGVyKCksdGhpcy50eXBlPSJQYXRoIix0aGlzLmN1cnJlbnRQb2ludD1uZXcgcSxlJiZ0aGlzLnNldEZyb21Qb2ludHMoZSl9c2V0RnJvbVBvaW50cyhlKXt0aGlzLm1vdmVUbyhlWzBdLngsZVswXS55KTtmb3IobGV0IHQ9MSxuPWUubGVuZ3RoO3Q8bjt0KyspdGhpcy5saW5lVG8oZVt0XS54LGVbdF0ueSk7cmV0dXJuIHRoaXN9bW92ZVRvKGUsdCl7cmV0dXJuIHRoaXMuY3VycmVudFBvaW50LnNldChlLHQpLHRoaXN9bGluZVRvKGUsdCl7Y29uc3Qgbj1uZXcgWmgodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgcShlLHQpKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5zZXQoZSx0KSx0aGlzfXF1YWRyYXRpY0N1cnZlVG8oZSx0LG4saSl7Y29uc3Qgcz1uZXcgSmgodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgcShlLHQpLG5ldyBxKG4saSkpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKHMpLHRoaXMuY3VycmVudFBvaW50LnNldChuLGkpLHRoaXN9YmV6aWVyQ3VydmVUbyhlLHQsbixpLHMsYSl7Y29uc3Qgbz1uZXcgWWgodGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgcShlLHQpLG5ldyBxKG4saSksbmV3IHEocyxhKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2gobyksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHMsYSksdGhpc31zcGxpbmVUaHJ1KGUpe2NvbnN0IHQ9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdChlKSxuPW5ldyBRaCh0KTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChuKSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGVbZS5sZW5ndGgtMV0pLHRoaXN9YXJjKGUsdCxuLGkscyxhKXtjb25zdCBvPXRoaXMuY3VycmVudFBvaW50LngsbD10aGlzLmN1cnJlbnRQb2ludC55O3JldHVybiB0aGlzLmFic2FyYyhlK28sdCtsLG4saSxzLGEpLHRoaXN9YWJzYXJjKGUsdCxuLGkscyxhKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKGUsdCxuLG4saSxzLGEpLHRoaXN9ZWxsaXBzZShlLHQsbixpLHMsYSxvLGwpe2NvbnN0IGM9dGhpcy5jdXJyZW50UG9pbnQueCxoPXRoaXMuY3VycmVudFBvaW50Lnk7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZShlK2MsdCtoLG4saSxzLGEsbyxsKSx0aGlzfWFic2VsbGlwc2UoZSx0LG4saSxzLGEsbyxsKXtjb25zdCBjPW5ldyBrbyhlLHQsbixpLHMsYSxvLGwpO2lmKHRoaXMuY3VydmVzLmxlbmd0aD4wKXtjb25zdCB1PWMuZ2V0UG9pbnQoMCk7dS5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyh1LngsdS55KX10aGlzLmN1cnZlcy5wdXNoKGMpO2NvbnN0IGg9Yy5nZXRQb2ludCgxKTtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuY29weShoKSx0aGlzfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5jdXJyZW50UG9pbnQuY29weShlLmN1cnJlbnRQb2ludCksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO3JldHVybiBlLmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCksZX1mcm9tSlNPTihlKXtyZXR1cm4gc3VwZXIuZnJvbUpTT04oZSksdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KGUuY3VycmVudFBvaW50KSx0aGlzfX07Y2xhc3MgcmEgZXh0ZW5kcyBrZXtjb25zdHJ1Y3RvcihlPVtuZXcgcSgwLC0uNSksbmV3IHEoLjUsMCksbmV3IHEoMCwuNSldLHQ9MTIsbj0wLGk9TWF0aC5QSSoyKXtzdXBlcigpLHRoaXMudHlwZT0iTGF0aGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtwb2ludHM6ZSxzZWdtZW50czp0LHBoaVN0YXJ0Om4scGhpTGVuZ3RoOml9LHQ9TWF0aC5mbG9vcih0KSxpPV90KGksMCxNYXRoLlBJKjIpO2NvbnN0IHM9W10sYT1bXSxvPVtdLGw9W10sYz1bXSxoPTEvdCx1PW5ldyBQLGY9bmV3IHEsZD1uZXcgUCxwPW5ldyBQLF89bmV3IFA7bGV0IGc9MCxtPTA7Zm9yKGxldCB5PTA7eTw9ZS5sZW5ndGgtMTt5Kyspc3dpdGNoKHkpe2Nhc2UgMDpnPWVbeSsxXS54LWVbeV0ueCxtPWVbeSsxXS55LWVbeV0ueSxkLng9bSoxLGQueT0tZyxkLno9bSowLF8uY29weShkKSxkLm5vcm1hbGl6ZSgpLGwucHVzaChkLngsZC55LGQueik7YnJlYWs7Y2FzZSBlLmxlbmd0aC0xOmwucHVzaChfLngsXy55LF8ueik7YnJlYWs7ZGVmYXVsdDpnPWVbeSsxXS54LWVbeV0ueCxtPWVbeSsxXS55LWVbeV0ueSxkLng9bSoxLGQueT0tZyxkLno9bSowLHAuY29weShkKSxkLngrPV8ueCxkLnkrPV8ueSxkLnorPV8ueixkLm5vcm1hbGl6ZSgpLGwucHVzaChkLngsZC55LGQueiksXy5jb3B5KHApfWZvcihsZXQgeT0wO3k8PXQ7eSsrKXtjb25zdCB4PW4reSpoKmksdj1NYXRoLnNpbih4KSxTPU1hdGguY29zKHgpO2ZvcihsZXQgYj0wO2I8PWUubGVuZ3RoLTE7YisrKXt1Lng9ZVtiXS54KnYsdS55PWVbYl0ueSx1Lno9ZVtiXS54KlMsYS5wdXNoKHUueCx1LnksdS56KSxmLng9eS90LGYueT1iLyhlLmxlbmd0aC0xKSxvLnB1c2goZi54LGYueSk7Y29uc3QgQT1sWzMqYiswXSp2LEw9bFszKmIrMV0sTT1sWzMqYiswXSpTO2MucHVzaChBLEwsTSl9fWZvcihsZXQgeT0wO3k8dDt5KyspZm9yKGxldCB4PTA7eDxlLmxlbmd0aC0xO3grKyl7Y29uc3Qgdj14K3kqZS5sZW5ndGgsUz12LGI9ditlLmxlbmd0aCxBPXYrZS5sZW5ndGgrMSxMPXYrMTtzLnB1c2goUyxiLEwpLHMucHVzaChBLEwsYil9dGhpcy5zZXRJbmRleChzKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShhLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBTZShvLDIpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgU2UoYywzKSl9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSxlLnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKGUpe3JldHVybiBuZXcgcmEoZS5wb2ludHMsZS5zZWdtZW50cyxlLnBoaVN0YXJ0LGUucGhpTGVuZ3RoKX19Y2xhc3MgSG8gZXh0ZW5kcyByYXtjb25zdHJ1Y3RvcihlPTEsdD0xLG49NCxpPTgpe2NvbnN0IHM9bmV3IGlhO3MuYWJzYXJjKDAsLXQvMixlLE1hdGguUEkqMS41LDApLHMuYWJzYXJjKDAsdC8yLGUsMCxNYXRoLlBJKi41KSxzdXBlcihzLmdldFBvaW50cyhuKSxpKSx0aGlzLnR5cGU9IkNhcHN1bGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6ZSxsZW5ndGg6dCxjYXBTZWdtZW50czpuLHJhZGlhbFNlZ21lbnRzOml9fXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IEhvKGUucmFkaXVzLGUubGVuZ3RoLGUuY2FwU2VnbWVudHMsZS5yYWRpYWxTZWdtZW50cyl9fWNsYXNzIFdvIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT0xLHQ9MzIsbj0wLGk9TWF0aC5QSSoyKXtzdXBlcigpLHRoaXMudHlwZT0iQ2lyY2xlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOmUsc2VnbWVudHM6dCx0aGV0YVN0YXJ0Om4sdGhldGFMZW5ndGg6aX0sdD1NYXRoLm1heCgzLHQpO2NvbnN0IHM9W10sYT1bXSxvPVtdLGw9W10sYz1uZXcgUCxoPW5ldyBxO2EucHVzaCgwLDAsMCksby5wdXNoKDAsMCwxKSxsLnB1c2goLjUsLjUpO2ZvcihsZXQgdT0wLGY9Mzt1PD10O3UrKyxmKz0zKXtjb25zdCBkPW4rdS90Kmk7Yy54PWUqTWF0aC5jb3MoZCksYy55PWUqTWF0aC5zaW4oZCksYS5wdXNoKGMueCxjLnksYy56KSxvLnB1c2goMCwwLDEpLGgueD0oYVtmXS9lKzEpLzIsaC55PShhW2YrMV0vZSsxKS8yLGwucHVzaChoLngsaC55KX1mb3IobGV0IHU9MTt1PD10O3UrKylzLnB1c2godSx1KzEsMCk7dGhpcy5zZXRJbmRleChzKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShhLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgU2UobywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU2UobCwyKSl9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSxlLnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKGUpe3JldHVybiBuZXcgV28oZS5yYWRpdXMsZS5zZWdtZW50cyxlLnRoZXRhU3RhcnQsZS50aGV0YUxlbmd0aCl9fWNsYXNzIG5zIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT0xLHQ9MSxuPTEsaT0zMixzPTEsYT0hMSxvPTAsbD1NYXRoLlBJKjIpe3N1cGVyKCksdGhpcy50eXBlPSJDeWxpbmRlckdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1c1RvcDplLHJhZGl1c0JvdHRvbTp0LGhlaWdodDpuLHJhZGlhbFNlZ21lbnRzOmksaGVpZ2h0U2VnbWVudHM6cyxvcGVuRW5kZWQ6YSx0aGV0YVN0YXJ0Om8sdGhldGFMZW5ndGg6bH07Y29uc3QgYz10aGlzO2k9TWF0aC5mbG9vcihpKSxzPU1hdGguZmxvb3Iocyk7Y29uc3QgaD1bXSx1PVtdLGY9W10sZD1bXTtsZXQgcD0wO2NvbnN0IF89W10sZz1uLzI7bGV0IG09MDt5KCksYT09PSExJiYoZT4wJiZ4KCEwKSx0PjAmJngoITEpKSx0aGlzLnNldEluZGV4KGgpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFNlKHUsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBTZShmLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBTZShkLDIpKTtmdW5jdGlvbiB5KCl7Y29uc3Qgdj1uZXcgUCxTPW5ldyBQO2xldCBiPTA7Y29uc3QgQT0odC1lKS9uO2ZvcihsZXQgTD0wO0w8PXM7TCsrKXtjb25zdCBNPVtdLHc9TC9zLFI9dyoodC1lKStlO2ZvcihsZXQgTj0wO048PWk7TisrKXtjb25zdCBCPU4vaSxJPUIqbCtvLFU9TWF0aC5zaW4oSSksej1NYXRoLmNvcyhJKTtTLng9UipVLFMueT0tdypuK2csUy56PVIqeix1LnB1c2goUy54LFMueSxTLnopLHYuc2V0KFUsQSx6KS5ub3JtYWxpemUoKSxmLnB1c2godi54LHYueSx2LnopLGQucHVzaChCLDEtdyksTS5wdXNoKHArKyl9Xy5wdXNoKE0pfWZvcihsZXQgTD0wO0w8aTtMKyspZm9yKGxldCBNPTA7TTxzO00rKyl7Y29uc3Qgdz1fW01dW0xdLFI9X1tNKzFdW0xdLE49X1tNKzFdW0wrMV0sQj1fW01dW0wrMV07aC5wdXNoKHcsUixCKSxoLnB1c2goUixOLEIpLGIrPTZ9Yy5hZGRHcm91cChtLGIsMCksbSs9Yn1mdW5jdGlvbiB4KHYpe2NvbnN0IFM9cCxiPW5ldyBxLEE9bmV3IFA7bGV0IEw9MDtjb25zdCBNPXY9PT0hMD9lOnQsdz12PT09ITA/MTotMTtmb3IobGV0IE49MTtOPD1pO04rKyl1LnB1c2goMCxnKncsMCksZi5wdXNoKDAsdywwKSxkLnB1c2goLjUsLjUpLHArKztjb25zdCBSPXA7Zm9yKGxldCBOPTA7Tjw9aTtOKyspe2NvbnN0IEk9Ti9pKmwrbyxVPU1hdGguY29zKEkpLHo9TWF0aC5zaW4oSSk7QS54PU0qeixBLnk9Zyp3LEEuej1NKlUsdS5wdXNoKEEueCxBLnksQS56KSxmLnB1c2goMCx3LDApLGIueD1VKi41Ky41LGIueT16Ki41KncrLjUsZC5wdXNoKGIueCxiLnkpLHArK31mb3IobGV0IE49MDtOPGk7TisrKXtjb25zdCBCPVMrTixJPVIrTjt2PT09ITA/aC5wdXNoKEksSSsxLEIpOmgucHVzaChJKzEsSSxCKSxMKz0zfWMuYWRkR3JvdXAobSxMLHY9PT0hMD8xOjIpLG0rPUx9fWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IG5zKGUucmFkaXVzVG9wLGUucmFkaXVzQm90dG9tLGUuaGVpZ2h0LGUucmFkaWFsU2VnbWVudHMsZS5oZWlnaHRTZWdtZW50cyxlLm9wZW5FbmRlZCxlLnRoZXRhU3RhcnQsZS50aGV0YUxlbmd0aCl9fWNsYXNzIFhvIGV4dGVuZHMgbnN7Y29uc3RydWN0b3IoZT0xLHQ9MSxuPTMyLGk9MSxzPSExLGE9MCxvPU1hdGguUEkqMil7c3VwZXIoMCxlLHQsbixpLHMsYSxvKSx0aGlzLnR5cGU9IkNvbmVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6ZSxoZWlnaHQ6dCxyYWRpYWxTZWdtZW50czpuLGhlaWdodFNlZ21lbnRzOmksb3BlbkVuZGVkOnMsdGhldGFTdGFydDphLHRoZXRhTGVuZ3RoOm99fXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IFhvKGUucmFkaXVzLGUuaGVpZ2h0LGUucmFkaWFsU2VnbWVudHMsZS5oZWlnaHRTZWdtZW50cyxlLm9wZW5FbmRlZCxlLnRoZXRhU3RhcnQsZS50aGV0YUxlbmd0aCl9fWNsYXNzIERpIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT1bXSx0PVtdLG49MSxpPTApe3N1cGVyKCksdGhpcy50eXBlPSJQb2x5aGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17dmVydGljZXM6ZSxpbmRpY2VzOnQscmFkaXVzOm4sZGV0YWlsOml9O2NvbnN0IHM9W10sYT1bXTtvKGkpLGMobiksaCgpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFNlKHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBTZShzLnNsaWNlKCksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGEsMikpLGk9PT0wP3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTp0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTtmdW5jdGlvbiBvKHkpe2NvbnN0IHg9bmV3IFAsdj1uZXcgUCxTPW5ldyBQO2ZvcihsZXQgYj0wO2I8dC5sZW5ndGg7Yis9MylkKHRbYiswXSx4KSxkKHRbYisxXSx2KSxkKHRbYisyXSxTKSxsKHgsdixTLHkpfWZ1bmN0aW9uIGwoeSx4LHYsUyl7Y29uc3QgYj1TKzEsQT1bXTtmb3IobGV0IEw9MDtMPD1iO0wrKyl7QVtMXT1bXTtjb25zdCBNPXkuY2xvbmUoKS5sZXJwKHYsTC9iKSx3PXguY2xvbmUoKS5sZXJwKHYsTC9iKSxSPWItTDtmb3IobGV0IE49MDtOPD1SO04rKylOPT09MCYmTD09PWI/QVtMXVtOXT1NOkFbTF1bTl09TS5jbG9uZSgpLmxlcnAodyxOL1IpfWZvcihsZXQgTD0wO0w8YjtMKyspZm9yKGxldCBNPTA7TTwyKihiLUwpLTE7TSsrKXtjb25zdCB3PU1hdGguZmxvb3IoTS8yKTtNJTI9PT0wPyhmKEFbTF1bdysxXSksZihBW0wrMV1bd10pLGYoQVtMXVt3XSkpOihmKEFbTF1bdysxXSksZihBW0wrMV1bdysxXSksZihBW0wrMV1bd10pKX19ZnVuY3Rpb24gYyh5KXtjb25zdCB4PW5ldyBQO2ZvcihsZXQgdj0wO3Y8cy5sZW5ndGg7dis9Myl4Lng9c1t2KzBdLHgueT1zW3YrMV0seC56PXNbdisyXSx4Lm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHkpLHNbdiswXT14Lngsc1t2KzFdPXgueSxzW3YrMl09eC56fWZ1bmN0aW9uIGgoKXtjb25zdCB5PW5ldyBQO2ZvcihsZXQgeD0wO3g8cy5sZW5ndGg7eCs9Myl7eS54PXNbeCswXSx5Lnk9c1t4KzFdLHkuej1zW3grMl07Y29uc3Qgdj1nKHkpLzIvTWF0aC5QSSsuNSxTPW0oeSkvTWF0aC5QSSsuNTthLnB1c2godiwxLVMpfXAoKSx1KCl9ZnVuY3Rpb24gdSgpe2ZvcihsZXQgeT0wO3k8YS5sZW5ndGg7eSs9Nil7Y29uc3QgeD1hW3krMF0sdj1hW3krMl0sUz1hW3krNF0sYj1NYXRoLm1heCh4LHYsUyksQT1NYXRoLm1pbih4LHYsUyk7Yj4uOSYmQTwuMSYmKHg8LjImJihhW3krMF0rPTEpLHY8LjImJihhW3krMl0rPTEpLFM8LjImJihhW3krNF0rPTEpKX19ZnVuY3Rpb24gZih5KXtzLnB1c2goeS54LHkueSx5LnopfWZ1bmN0aW9uIGQoeSx4KXtjb25zdCB2PXkqMzt4Lng9ZVt2KzBdLHgueT1lW3YrMV0seC56PWVbdisyXX1mdW5jdGlvbiBwKCl7Y29uc3QgeT1uZXcgUCx4PW5ldyBQLHY9bmV3IFAsUz1uZXcgUCxiPW5ldyBxLEE9bmV3IHEsTD1uZXcgcTtmb3IobGV0IE09MCx3PTA7TTxzLmxlbmd0aDtNKz05LHcrPTYpe3kuc2V0KHNbTSswXSxzW00rMV0sc1tNKzJdKSx4LnNldChzW00rM10sc1tNKzRdLHNbTSs1XSksdi5zZXQoc1tNKzZdLHNbTSs3XSxzW00rOF0pLGIuc2V0KGFbdyswXSxhW3crMV0pLEEuc2V0KGFbdysyXSxhW3crM10pLEwuc2V0KGFbdys0XSxhW3crNV0pLFMuY29weSh5KS5hZGQoeCkuYWRkKHYpLmRpdmlkZVNjYWxhcigzKTtjb25zdCBSPWcoUyk7XyhiLHcrMCx5LFIpLF8oQSx3KzIseCxSKSxfKEwsdys0LHYsUil9fWZ1bmN0aW9uIF8oeSx4LHYsUyl7UzwwJiZ5Lng9PT0xJiYoYVt4XT15LngtMSksdi54PT09MCYmdi56PT09MCYmKGFbeF09Uy8yL01hdGguUEkrLjUpfWZ1bmN0aW9uIGcoeSl7cmV0dXJuIE1hdGguYXRhbjIoeS56LC15LngpfWZ1bmN0aW9uIG0oeSl7cmV0dXJuIE1hdGguYXRhbjIoLXkueSxNYXRoLnNxcnQoeS54KnkueCt5LnoqeS56KSl9fWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IERpKGUudmVydGljZXMsZS5pbmRpY2VzLGUucmFkaXVzLGUuZGV0YWlscyl9fWNsYXNzIHFvIGV4dGVuZHMgRGl7Y29uc3RydWN0b3IoZT0xLHQ9MCl7Y29uc3Qgbj0oMStNYXRoLnNxcnQoNSkpLzIsaT0xL24scz1bLTEsLTEsLTEsLTEsLTEsMSwtMSwxLC0xLC0xLDEsMSwxLC0xLC0xLDEsLTEsMSwxLDEsLTEsMSwxLDEsMCwtaSwtbiwwLC1pLG4sMCxpLC1uLDAsaSxuLC1pLC1uLDAsLWksbiwwLGksLW4sMCxpLG4sMCwtbiwwLC1pLG4sMCwtaSwtbiwwLGksbiwwLGldLGE9WzMsMTEsNywzLDcsMTUsMywxNSwxMyw3LDE5LDE3LDcsMTcsNiw3LDYsMTUsMTcsNCw4LDE3LDgsMTAsMTcsMTAsNiw4LDAsMTYsOCwxNiwyLDgsMiwxMCwwLDEyLDEsMCwxLDE4LDAsMTgsMTYsNiwxMCwyLDYsMiwxMyw2LDEzLDE1LDIsMTYsMTgsMiwxOCwzLDIsMywxMywxOCwxLDksMTgsOSwxMSwxOCwxMSwzLDQsMTQsMTIsNCwxMiwwLDQsMCw4LDExLDksNSwxMSw1LDE5LDExLDE5LDcsMTksNSwxNCwxOSwxNCw0LDE5LDQsMTcsMSwxMiwxNCwxLDE0LDUsMSw1LDldO3N1cGVyKHMsYSxlLHQpLHRoaXMudHlwZT0iRG9kZWNhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOmUsZGV0YWlsOnR9fXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IHFvKGUucmFkaXVzLGUuZGV0YWlsKX19Y29uc3QgJG89bmV3IFAsWW89bmV3IFAsamg9bmV3IFAsWm89bmV3IGNuO2NsYXNzIGFtIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT1udWxsLHQ9MSl7aWYoc3VwZXIoKSx0aGlzLnR5cGU9IkVkZ2VzR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17Z2VvbWV0cnk6ZSx0aHJlc2hvbGRBbmdsZTp0fSxlIT09bnVsbCl7Y29uc3QgaT1NYXRoLnBvdygxMCw0KSxzPU1hdGguY29zKEhpKnQpLGE9ZS5nZXRJbmRleCgpLG89ZS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksbD1hP2EuY291bnQ6by5jb3VudCxjPVswLDAsMF0saD1bImEiLCJiIiwiYyJdLHU9bmV3IEFycmF5KDMpLGY9e30sZD1bXTtmb3IobGV0IHA9MDtwPGw7cCs9Myl7YT8oY1swXT1hLmdldFgocCksY1sxXT1hLmdldFgocCsxKSxjWzJdPWEuZ2V0WChwKzIpKTooY1swXT1wLGNbMV09cCsxLGNbMl09cCsyKTtjb25zdHthOl8sYjpnLGM6bX09Wm87aWYoXy5mcm9tQnVmZmVyQXR0cmlidXRlKG8sY1swXSksZy5mcm9tQnVmZmVyQXR0cmlidXRlKG8sY1sxXSksbS5mcm9tQnVmZmVyQXR0cmlidXRlKG8sY1syXSksWm8uZ2V0Tm9ybWFsKGpoKSx1WzBdPWAke01hdGgucm91bmQoXy54KmkpfSwke01hdGgucm91bmQoXy55KmkpfSwke01hdGgucm91bmQoXy56KmkpfWAsdVsxXT1gJHtNYXRoLnJvdW5kKGcueCppKX0sJHtNYXRoLnJvdW5kKGcueSppKX0sJHtNYXRoLnJvdW5kKGcueippKX1gLHVbMl09YCR7TWF0aC5yb3VuZChtLngqaSl9LCR7TWF0aC5yb3VuZChtLnkqaSl9LCR7TWF0aC5yb3VuZChtLnoqaSl9YCwhKHVbMF09PT11WzFdfHx1WzFdPT09dVsyXXx8dVsyXT09PXVbMF0pKWZvcihsZXQgeT0wO3k8Mzt5Kyspe2NvbnN0IHg9KHkrMSklMyx2PXVbeV0sUz11W3hdLGI9Wm9baFt5XV0sQT1ab1toW3hdXSxMPWAke3Z9XyR7U31gLE09YCR7U31fJHt2fWA7TSBpbiBmJiZmW01dPyhqaC5kb3QoZltNXS5ub3JtYWwpPD1zJiYoZC5wdXNoKGIueCxiLnksYi56KSxkLnB1c2goQS54LEEueSxBLnopKSxmW01dPW51bGwpOkwgaW4gZnx8KGZbTF09e2luZGV4MDpjW3ldLGluZGV4MTpjW3hdLG5vcm1hbDpqaC5jbG9uZSgpfSl9fWZvcihjb25zdCBwIGluIGYpaWYoZltwXSl7Y29uc3R7aW5kZXgwOl8saW5kZXgxOmd9PWZbcF07JG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLF8pLFlvLmZyb21CdWZmZXJBdHRyaWJ1dGUobyxnKSxkLnB1c2goJG8ueCwkby55LCRvLnopLGQucHVzaChZby54LFlvLnksWW8ueil9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoZCwzKSl9fWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfX1jbGFzcyBvaSBleHRlbmRzIGlhe2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMudXVpZD1fbigpLHRoaXMudHlwZT0iU2hhcGUiLHRoaXMuaG9sZXM9W119Z2V0UG9pbnRzSG9sZXMoZSl7Y29uc3QgdD1bXTtmb3IobGV0IG49MCxpPXRoaXMuaG9sZXMubGVuZ3RoO248aTtuKyspdFtuXT10aGlzLmhvbGVzW25dLmdldFBvaW50cyhlKTtyZXR1cm4gdH1leHRyYWN0UG9pbnRzKGUpe3JldHVybntzaGFwZTp0aGlzLmdldFBvaW50cyhlKSxob2xlczp0aGlzLmdldFBvaW50c0hvbGVzKGUpfX1jb3B5KGUpe3N1cGVyLmNvcHkoZSksdGhpcy5ob2xlcz1bXTtmb3IobGV0IHQ9MCxuPWUuaG9sZXMubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IGk9ZS5ob2xlc1t0XTt0aGlzLmhvbGVzLnB1c2goaS5jbG9uZSgpKX1yZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO2UudXVpZD10aGlzLnV1aWQsZS5ob2xlcz1bXTtmb3IobGV0IHQ9MCxuPXRoaXMuaG9sZXMubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IGk9dGhpcy5ob2xlc1t0XTtlLmhvbGVzLnB1c2goaS50b0pTT04oKSl9cmV0dXJuIGV9ZnJvbUpTT04oZSl7c3VwZXIuZnJvbUpTT04oZSksdGhpcy51dWlkPWUudXVpZCx0aGlzLmhvbGVzPVtdO2ZvcihsZXQgdD0wLG49ZS5ob2xlcy5sZW5ndGg7dDxuO3QrKyl7Y29uc3QgaT1lLmhvbGVzW3RdO3RoaXMuaG9sZXMucHVzaChuZXcgaWEoKS5mcm9tSlNPTihpKSl9cmV0dXJuIHRoaXN9fWNvbnN0ICRTPXt0cmlhbmd1bGF0ZTpmdW5jdGlvbihyLGUsdD0yKXtjb25zdCBuPWUmJmUubGVuZ3RoLGk9bj9lWzBdKnQ6ci5sZW5ndGg7bGV0IHM9b20ociwwLGksdCwhMCk7Y29uc3QgYT1bXTtpZighc3x8cy5uZXh0PT09cy5wcmV2KXJldHVybiBhO2xldCBvLGwsYyxoLHUsZixkO2lmKG4mJihzPVFTKHIsZSxzLHQpKSxyLmxlbmd0aD44MCp0KXtvPWM9clswXSxsPWg9clsxXTtmb3IobGV0IHA9dDtwPGk7cCs9dCl1PXJbcF0sZj1yW3ArMV0sdTxvJiYobz11KSxmPGwmJihsPWYpLHU+YyYmKGM9dSksZj5oJiYoaD1mKTtkPU1hdGgubWF4KGMtbyxoLWwpLGQ9ZCE9PTA/MzI3NjcvZDowfXJldHVybiBzYShzLGEsdCxvLGwsZCwwKSxhfX07ZnVuY3Rpb24gb20ocixlLHQsbixpKXtsZXQgcyxhO2lmKGk9PT1jYihyLGUsdCxuKT4wKWZvcihzPWU7czx0O3MrPW4pYT1obShzLHJbc10scltzKzFdLGEpO2Vsc2UgZm9yKHM9dC1uO3M+PWU7cy09bilhPWhtKHMscltzXSxyW3MrMV0sYSk7cmV0dXJuIGEmJkpvKGEsYS5uZXh0KSYmKG9hKGEpLGE9YS5uZXh0KSxhfWZ1bmN0aW9uIHRyKHIsZSl7aWYoIXIpcmV0dXJuIHI7ZXx8KGU9cik7bGV0IHQ9cixuO2RvIGlmKG49ITEsIXQuc3RlaW5lciYmKEpvKHQsdC5uZXh0KXx8ZHQodC5wcmV2LHQsdC5uZXh0KT09PTApKXtpZihvYSh0KSx0PWU9dC5wcmV2LHQ9PT10Lm5leHQpYnJlYWs7bj0hMH1lbHNlIHQ9dC5uZXh0O3doaWxlKG58fHQhPT1lKTtyZXR1cm4gZX1mdW5jdGlvbiBzYShyLGUsdCxuLGkscyxhKXtpZighcilyZXR1cm47IWEmJnMmJmliKHIsbixpLHMpO2xldCBvPXIsbCxjO2Zvcig7ci5wcmV2IT09ci5uZXh0Oyl7aWYobD1yLnByZXYsYz1yLm5leHQscz9aUyhyLG4saSxzKTpZUyhyKSl7ZS5wdXNoKGwuaS90fDApLGUucHVzaChyLmkvdHwwKSxlLnB1c2goYy5pL3R8MCksb2Eocikscj1jLm5leHQsbz1jLm5leHQ7Y29udGludWV9aWYocj1jLHI9PT1vKXthP2E9PT0xPyhyPUpTKHRyKHIpLGUsdCksc2EocixlLHQsbixpLHMsMikpOmE9PT0yJiZLUyhyLGUsdCxuLGkscyk6c2EodHIociksZSx0LG4saSxzLDEpO2JyZWFrfX19ZnVuY3Rpb24gWVMocil7Y29uc3QgZT1yLnByZXYsdD1yLG49ci5uZXh0O2lmKGR0KGUsdCxuKT49MClyZXR1cm4hMTtjb25zdCBpPWUueCxzPXQueCxhPW4ueCxvPWUueSxsPXQueSxjPW4ueSxoPWk8cz9pPGE/aTphOnM8YT9zOmEsdT1vPGw/bzxjP286YzpsPGM/bDpjLGY9aT5zP2k+YT9pOmE6cz5hP3M6YSxkPW8+bD9vPmM/bzpjOmw+Yz9sOmM7bGV0IHA9bi5uZXh0O2Zvcig7cCE9PWU7KXtpZihwLng+PWgmJnAueDw9ZiYmcC55Pj11JiZwLnk8PWQmJmlzKGksbyxzLGwsYSxjLHAueCxwLnkpJiZkdChwLnByZXYscCxwLm5leHQpPj0wKXJldHVybiExO3A9cC5uZXh0fXJldHVybiEwfWZ1bmN0aW9uIFpTKHIsZSx0LG4pe2NvbnN0IGk9ci5wcmV2LHM9cixhPXIubmV4dDtpZihkdChpLHMsYSk+PTApcmV0dXJuITE7Y29uc3Qgbz1pLngsbD1zLngsYz1hLngsaD1pLnksdT1zLnksZj1hLnksZD1vPGw/bzxjP286YzpsPGM/bDpjLHA9aDx1P2g8Zj9oOmY6dTxmP3U6ZixfPW8+bD9vPmM/bzpjOmw+Yz9sOmMsZz1oPnU/aD5mP2g6Zjp1PmY/dTpmLG09ZXUoZCxwLGUsdCxuKSx5PWV1KF8sZyxlLHQsbik7bGV0IHg9ci5wcmV2Wix2PXIubmV4dFo7Zm9yKDt4JiZ4Lno+PW0mJnYmJnYuejw9eTspe2lmKHgueD49ZCYmeC54PD1fJiZ4Lnk+PXAmJngueTw9ZyYmeCE9PWkmJnghPT1hJiZpcyhvLGgsbCx1LGMsZix4LngseC55KSYmZHQoeC5wcmV2LHgseC5uZXh0KT49MHx8KHg9eC5wcmV2Wix2Lng+PWQmJnYueDw9XyYmdi55Pj1wJiZ2Lnk8PWcmJnYhPT1pJiZ2IT09YSYmaXMobyxoLGwsdSxjLGYsdi54LHYueSkmJmR0KHYucHJldix2LHYubmV4dCk+PTApKXJldHVybiExO3Y9di5uZXh0Wn1mb3IoO3gmJnguej49bTspe2lmKHgueD49ZCYmeC54PD1fJiZ4Lnk+PXAmJngueTw9ZyYmeCE9PWkmJnghPT1hJiZpcyhvLGgsbCx1LGMsZix4LngseC55KSYmZHQoeC5wcmV2LHgseC5uZXh0KT49MClyZXR1cm4hMTt4PXgucHJldlp9Zm9yKDt2JiZ2Lno8PXk7KXtpZih2Lng+PWQmJnYueDw9XyYmdi55Pj1wJiZ2Lnk8PWcmJnYhPT1pJiZ2IT09YSYmaXMobyxoLGwsdSxjLGYsdi54LHYueSkmJmR0KHYucHJldix2LHYubmV4dCk+PTApcmV0dXJuITE7dj12Lm5leHRafXJldHVybiEwfWZ1bmN0aW9uIEpTKHIsZSx0KXtsZXQgbj1yO2Rve2NvbnN0IGk9bi5wcmV2LHM9bi5uZXh0Lm5leHQ7IUpvKGkscykmJmxtKGksbixuLm5leHQscykmJmFhKGkscykmJmFhKHMsaSkmJihlLnB1c2goaS5pL3R8MCksZS5wdXNoKG4uaS90fDApLGUucHVzaChzLmkvdHwwKSxvYShuKSxvYShuLm5leHQpLG49cj1zKSxuPW4ubmV4dH13aGlsZShuIT09cik7cmV0dXJuIHRyKG4pfWZ1bmN0aW9uIEtTKHIsZSx0LG4saSxzKXtsZXQgYT1yO2Rve2xldCBvPWEubmV4dC5uZXh0O2Zvcig7byE9PWEucHJldjspe2lmKGEuaSE9PW8uaSYmYWIoYSxvKSl7bGV0IGw9Y20oYSxvKTthPXRyKGEsYS5uZXh0KSxsPXRyKGwsbC5uZXh0KSxzYShhLGUsdCxuLGkscywwKSxzYShsLGUsdCxuLGkscywwKTtyZXR1cm59bz1vLm5leHR9YT1hLm5leHR9d2hpbGUoYSE9PXIpfWZ1bmN0aW9uIFFTKHIsZSx0LG4pe2NvbnN0IGk9W107bGV0IHMsYSxvLGwsYztmb3Iocz0wLGE9ZS5sZW5ndGg7czxhO3MrKylvPWVbc10qbixsPXM8YS0xP2VbcysxXSpuOnIubGVuZ3RoLGM9b20ocixvLGwsbiwhMSksYz09PWMubmV4dCYmKGMuc3RlaW5lcj0hMCksaS5wdXNoKHNiKGMpKTtmb3IoaS5zb3J0KGpTKSxzPTA7czxpLmxlbmd0aDtzKyspdD1lYihpW3NdLHQpO3JldHVybiB0fWZ1bmN0aW9uIGpTKHIsZSl7cmV0dXJuIHIueC1lLnh9ZnVuY3Rpb24gZWIocixlKXtjb25zdCB0PXRiKHIsZSk7aWYoIXQpcmV0dXJuIGU7Y29uc3Qgbj1jbSh0LHIpO3JldHVybiB0cihuLG4ubmV4dCksdHIodCx0Lm5leHQpfWZ1bmN0aW9uIHRiKHIsZSl7bGV0IHQ9ZSxuPS0xLzAsaTtjb25zdCBzPXIueCxhPXIueTtkb3tpZihhPD10LnkmJmE+PXQubmV4dC55JiZ0Lm5leHQueSE9PXQueSl7Y29uc3QgZj10LngrKGEtdC55KSoodC5uZXh0LngtdC54KS8odC5uZXh0LnktdC55KTtpZihmPD1zJiZmPm4mJihuPWYsaT10Lng8dC5uZXh0Lng/dDp0Lm5leHQsZj09PXMpKXJldHVybiBpfXQ9dC5uZXh0fXdoaWxlKHQhPT1lKTtpZighaSlyZXR1cm4gbnVsbDtjb25zdCBvPWksbD1pLngsYz1pLnk7bGV0IGg9MS8wLHU7dD1pO2RvIHM+PXQueCYmdC54Pj1sJiZzIT09dC54JiZpcyhhPGM/czpuLGEsbCxjLGE8Yz9uOnMsYSx0LngsdC55KSYmKHU9TWF0aC5hYnMoYS10LnkpLyhzLXQueCksYWEodCxyKSYmKHU8aHx8dT09PWgmJih0Lng+aS54fHx0Lng9PT1pLngmJm5iKGksdCkpKSYmKGk9dCxoPXUpKSx0PXQubmV4dDt3aGlsZSh0IT09byk7cmV0dXJuIGl9ZnVuY3Rpb24gbmIocixlKXtyZXR1cm4gZHQoci5wcmV2LHIsZS5wcmV2KTwwJiZkdChlLm5leHQscixyLm5leHQpPDB9ZnVuY3Rpb24gaWIocixlLHQsbil7bGV0IGk9cjtkbyBpLno9PT0wJiYoaS56PWV1KGkueCxpLnksZSx0LG4pKSxpLnByZXZaPWkucHJldixpLm5leHRaPWkubmV4dCxpPWkubmV4dDt3aGlsZShpIT09cik7aS5wcmV2Wi5uZXh0Wj1udWxsLGkucHJldlo9bnVsbCxyYihpKX1mdW5jdGlvbiByYihyKXtsZXQgZSx0LG4saSxzLGEsbyxsLGM9MTtkb3tmb3IodD1yLHI9bnVsbCxzPW51bGwsYT0wO3Q7KXtmb3IoYSsrLG49dCxvPTAsZT0wO2U8YyYmKG8rKyxuPW4ubmV4dFosISFuKTtlKyspO2ZvcihsPWM7bz4wfHxsPjAmJm47KW8hPT0wJiYobD09PTB8fCFufHx0Lno8PW4ueik/KGk9dCx0PXQubmV4dFosby0tKTooaT1uLG49bi5uZXh0WixsLS0pLHM/cy5uZXh0Wj1pOnI9aSxpLnByZXZaPXMscz1pO3Q9bn1zLm5leHRaPW51bGwsYyo9Mn13aGlsZShhPjEpO3JldHVybiByfWZ1bmN0aW9uIGV1KHIsZSx0LG4saSl7cmV0dXJuIHI9KHItdCkqaXwwLGU9KGUtbikqaXwwLHI9KHJ8cjw8OCkmMTY3MTE5MzUscj0ocnxyPDw0KSYyNTI2NDUxMzUscj0ocnxyPDwyKSY4NTg5OTM0NTkscj0ocnxyPDwxKSYxNDMxNjU1NzY1LGU9KGV8ZTw8OCkmMTY3MTE5MzUsZT0oZXxlPDw0KSYyNTI2NDUxMzUsZT0oZXxlPDwyKSY4NTg5OTM0NTksZT0oZXxlPDwxKSYxNDMxNjU1NzY1LHJ8ZTw8MX1mdW5jdGlvbiBzYihyKXtsZXQgZT1yLHQ9cjtkbyhlLng8dC54fHxlLng9PT10LngmJmUueTx0LnkpJiYodD1lKSxlPWUubmV4dDt3aGlsZShlIT09cik7cmV0dXJuIHR9ZnVuY3Rpb24gaXMocixlLHQsbixpLHMsYSxvKXtyZXR1cm4oaS1hKSooZS1vKT49KHItYSkqKHMtbykmJihyLWEpKihuLW8pPj0odC1hKSooZS1vKSYmKHQtYSkqKHMtbyk+PShpLWEpKihuLW8pfWZ1bmN0aW9uIGFiKHIsZSl7cmV0dXJuIHIubmV4dC5pIT09ZS5pJiZyLnByZXYuaSE9PWUuaSYmIW9iKHIsZSkmJihhYShyLGUpJiZhYShlLHIpJiZsYihyLGUpJiYoZHQoci5wcmV2LHIsZS5wcmV2KXx8ZHQocixlLnByZXYsZSkpfHxKbyhyLGUpJiZkdChyLnByZXYscixyLm5leHQpPjAmJmR0KGUucHJldixlLGUubmV4dCk+MCl9ZnVuY3Rpb24gZHQocixlLHQpe3JldHVybihlLnktci55KSoodC54LWUueCktKGUueC1yLngpKih0LnktZS55KX1mdW5jdGlvbiBKbyhyLGUpe3JldHVybiByLng9PT1lLngmJnIueT09PWUueX1mdW5jdGlvbiBsbShyLGUsdCxuKXtjb25zdCBpPVFvKGR0KHIsZSx0KSkscz1RbyhkdChyLGUsbikpLGE9UW8oZHQodCxuLHIpKSxvPVFvKGR0KHQsbixlKSk7cmV0dXJuISEoaSE9PXMmJmEhPT1vfHxpPT09MCYmS28ocix0LGUpfHxzPT09MCYmS28ocixuLGUpfHxhPT09MCYmS28odCxyLG4pfHxvPT09MCYmS28odCxlLG4pKX1mdW5jdGlvbiBLbyhyLGUsdCl7cmV0dXJuIGUueDw9TWF0aC5tYXgoci54LHQueCkmJmUueD49TWF0aC5taW4oci54LHQueCkmJmUueTw9TWF0aC5tYXgoci55LHQueSkmJmUueT49TWF0aC5taW4oci55LHQueSl9ZnVuY3Rpb24gUW8ocil7cmV0dXJuIHI+MD8xOnI8MD8tMTowfWZ1bmN0aW9uIG9iKHIsZSl7bGV0IHQ9cjtkb3tpZih0LmkhPT1yLmkmJnQubmV4dC5pIT09ci5pJiZ0LmkhPT1lLmkmJnQubmV4dC5pIT09ZS5pJiZsbSh0LHQubmV4dCxyLGUpKXJldHVybiEwO3Q9dC5uZXh0fXdoaWxlKHQhPT1yKTtyZXR1cm4hMX1mdW5jdGlvbiBhYShyLGUpe3JldHVybiBkdChyLnByZXYscixyLm5leHQpPDA/ZHQocixlLHIubmV4dCk+PTAmJmR0KHIsci5wcmV2LGUpPj0wOmR0KHIsZSxyLnByZXYpPDB8fGR0KHIsci5uZXh0LGUpPDB9ZnVuY3Rpb24gbGIocixlKXtsZXQgdD1yLG49ITE7Y29uc3QgaT0oci54K2UueCkvMixzPShyLnkrZS55KS8yO2RvIHQueT5zIT10Lm5leHQueT5zJiZ0Lm5leHQueSE9PXQueSYmaTwodC5uZXh0LngtdC54KSoocy10LnkpLyh0Lm5leHQueS10LnkpK3QueCYmKG49IW4pLHQ9dC5uZXh0O3doaWxlKHQhPT1yKTtyZXR1cm4gbn1mdW5jdGlvbiBjbShyLGUpe2NvbnN0IHQ9bmV3IHR1KHIuaSxyLngsci55KSxuPW5ldyB0dShlLmksZS54LGUueSksaT1yLm5leHQscz1lLnByZXY7cmV0dXJuIHIubmV4dD1lLGUucHJldj1yLHQubmV4dD1pLGkucHJldj10LG4ubmV4dD10LHQucHJldj1uLHMubmV4dD1uLG4ucHJldj1zLG59ZnVuY3Rpb24gaG0ocixlLHQsbil7Y29uc3QgaT1uZXcgdHUocixlLHQpO3JldHVybiBuPyhpLm5leHQ9bi5uZXh0LGkucHJldj1uLG4ubmV4dC5wcmV2PWksbi5uZXh0PWkpOihpLnByZXY9aSxpLm5leHQ9aSksaX1mdW5jdGlvbiBvYShyKXtyLm5leHQucHJldj1yLnByZXYsci5wcmV2Lm5leHQ9ci5uZXh0LHIucHJldlomJihyLnByZXZaLm5leHRaPXIubmV4dFopLHIubmV4dFomJihyLm5leHRaLnByZXZaPXIucHJldlopfWZ1bmN0aW9uIHR1KHIsZSx0KXt0aGlzLmk9cix0aGlzLng9ZSx0aGlzLnk9dCx0aGlzLnByZXY9bnVsbCx0aGlzLm5leHQ9bnVsbCx0aGlzLno9MCx0aGlzLnByZXZaPW51bGwsdGhpcy5uZXh0Wj1udWxsLHRoaXMuc3RlaW5lcj0hMX1mdW5jdGlvbiBjYihyLGUsdCxuKXtsZXQgaT0wO2ZvcihsZXQgcz1lLGE9dC1uO3M8dDtzKz1uKWkrPShyW2FdLXJbc10pKihyW3MrMV0rclthKzFdKSxhPXM7cmV0dXJuIGl9Y2xhc3Mgdm57c3RhdGljIGFyZWEoZSl7Y29uc3QgdD1lLmxlbmd0aDtsZXQgbj0wO2ZvcihsZXQgaT10LTEscz0wO3M8dDtpPXMrKyluKz1lW2ldLngqZVtzXS55LWVbc10ueCplW2ldLnk7cmV0dXJuIG4qLjV9c3RhdGljIGlzQ2xvY2tXaXNlKGUpe3JldHVybiB2bi5hcmVhKGUpPDB9c3RhdGljIHRyaWFuZ3VsYXRlU2hhcGUoZSx0KXtjb25zdCBuPVtdLGk9W10scz1bXTt1bShlKSxmbShuLGUpO2xldCBhPWUubGVuZ3RoO3QuZm9yRWFjaCh1bSk7Zm9yKGxldCBsPTA7bDx0Lmxlbmd0aDtsKyspaS5wdXNoKGEpLGErPXRbbF0ubGVuZ3RoLGZtKG4sdFtsXSk7Y29uc3Qgbz0kUy50cmlhbmd1bGF0ZShuLGkpO2ZvcihsZXQgbD0wO2w8by5sZW5ndGg7bCs9MylzLnB1c2goby5zbGljZShsLGwrMykpO3JldHVybiBzfX1mdW5jdGlvbiB1bShyKXtjb25zdCBlPXIubGVuZ3RoO2U+MiYmcltlLTFdLmVxdWFscyhyWzBdKSYmci5wb3AoKX1mdW5jdGlvbiBmbShyLGUpe2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXIucHVzaChlW3RdLngpLHIucHVzaChlW3RdLnkpfWxldCBkbT1jbGFzcyBvXyBleHRlbmRzIGtle2NvbnN0cnVjdG9yKGU9bmV3IG9pKFtuZXcgcSguNSwuNSksbmV3IHEoLS41LC41KSxuZXcgcSgtLjUsLS41KSxuZXcgcSguNSwtLjUpXSksdD17fSl7c3VwZXIoKSx0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6ZSxvcHRpb25zOnR9LGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtjb25zdCBuPXRoaXMsaT1bXSxzPVtdO2ZvcihsZXQgbz0wLGw9ZS5sZW5ndGg7bzxsO28rKyl7Y29uc3QgYz1lW29dO2EoYyl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoaSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU2UocywyKSksdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO2Z1bmN0aW9uIGEobyl7Y29uc3QgbD1bXSxjPXQuY3VydmVTZWdtZW50cyE9PXZvaWQgMD90LmN1cnZlU2VnbWVudHM6MTIsaD10LnN0ZXBzIT09dm9pZCAwP3Quc3RlcHM6MSx1PXQuZGVwdGghPT12b2lkIDA/dC5kZXB0aDoxO2xldCBmPXQuYmV2ZWxFbmFibGVkIT09dm9pZCAwP3QuYmV2ZWxFbmFibGVkOiEwLGQ9dC5iZXZlbFRoaWNrbmVzcyE9PXZvaWQgMD90LmJldmVsVGhpY2tuZXNzOi4yLHA9dC5iZXZlbFNpemUhPT12b2lkIDA/dC5iZXZlbFNpemU6ZC0uMSxfPXQuYmV2ZWxPZmZzZXQhPT12b2lkIDA/dC5iZXZlbE9mZnNldDowLGc9dC5iZXZlbFNlZ21lbnRzIT09dm9pZCAwP3QuYmV2ZWxTZWdtZW50czozO2NvbnN0IG09dC5leHRydWRlUGF0aCx5PXQuVVZHZW5lcmF0b3IhPT12b2lkIDA/dC5VVkdlbmVyYXRvcjpoYjtsZXQgeCx2PSExLFMsYixBLEw7bSYmKHg9bS5nZXRTcGFjZWRQb2ludHMoaCksdj0hMCxmPSExLFM9bS5jb21wdXRlRnJlbmV0RnJhbWVzKGgsITEpLGI9bmV3IFAsQT1uZXcgUCxMPW5ldyBQKSxmfHwoZz0wLGQ9MCxwPTAsXz0wKTtjb25zdCBNPW8uZXh0cmFjdFBvaW50cyhjKTtsZXQgdz1NLnNoYXBlO2NvbnN0IFI9TS5ob2xlcztpZighdm4uaXNDbG9ja1dpc2Uodykpe3c9dy5yZXZlcnNlKCk7Zm9yKGxldCBEPTAsbGU9Ui5sZW5ndGg7RDxsZTtEKyspe2NvbnN0IEs9UltEXTt2bi5pc0Nsb2NrV2lzZShLKSYmKFJbRF09Sy5yZXZlcnNlKCkpfX1jb25zdCBCPXZuLnRyaWFuZ3VsYXRlU2hhcGUodyxSKSxJPXc7Zm9yKGxldCBEPTAsbGU9Ui5sZW5ndGg7RDxsZTtEKyspe2NvbnN0IEs9UltEXTt3PXcuY29uY2F0KEspfWZ1bmN0aW9uIFUoRCxsZSxLKXtyZXR1cm4gbGV8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0IiksRC5jbG9uZSgpLmFkZFNjYWxlZFZlY3RvcihsZSxLKX1jb25zdCB6PXcubGVuZ3RoLEY9Qi5sZW5ndGg7ZnVuY3Rpb24gWihELGxlLEspe2xldCB1ZSxyZSxDZTtjb25zdCBXPUQueC1sZS54LEo9RC55LWxlLnksaWU9Sy54LUQueCxtZT1LLnktRC55LHBlPVcqVytKKkosQz1XKm1lLUoqaWU7aWYoTWF0aC5hYnMoQyk+TnVtYmVyLkVQU0lMT04pe2NvbnN0IEU9TWF0aC5zcXJ0KHBlKSxrPU1hdGguc3FydChpZSppZSttZSptZSksc2U9bGUueC1KL0UsdGU9bGUueStXL0UsYWU9Sy54LW1lL2ssQWU9Sy55K2llL2ssb2U9KChhZS1zZSkqbWUtKEFlLXRlKSppZSkvKFcqbWUtSippZSk7dWU9c2UrVypvZS1ELngscmU9dGUrSipvZS1ELnk7Y29uc3QgeGU9dWUqdWUrcmUqcmU7aWYoeGU8PTIpcmV0dXJuIG5ldyBxKHVlLHJlKTtDZT1NYXRoLnNxcnQoeGUvMil9ZWxzZXtsZXQgRT0hMTtXPk51bWJlci5FUFNJTE9OP2llPk51bWJlci5FUFNJTE9OJiYoRT0hMCk6VzwtTnVtYmVyLkVQU0lMT04/aWU8LU51bWJlci5FUFNJTE9OJiYoRT0hMCk6TWF0aC5zaWduKEopPT09TWF0aC5zaWduKG1lKSYmKEU9ITApLEU/KHVlPS1KLHJlPVcsQ2U9TWF0aC5zcXJ0KHBlKSk6KHVlPVcscmU9SixDZT1NYXRoLnNxcnQocGUvMikpfXJldHVybiBuZXcgcSh1ZS9DZSxyZS9DZSl9Y29uc3QgVj1bXTtmb3IobGV0IEQ9MCxsZT1JLmxlbmd0aCxLPWxlLTEsdWU9RCsxO0Q8bGU7RCsrLEsrKyx1ZSsrKUs9PT1sZSYmKEs9MCksdWU9PT1sZSYmKHVlPTApLFZbRF09WihJW0RdLElbS10sSVt1ZV0pO2NvbnN0IFE9W107bGV0IG5lLGZlPVYuY29uY2F0KCk7Zm9yKGxldCBEPTAsbGU9Ui5sZW5ndGg7RDxsZTtEKyspe2NvbnN0IEs9UltEXTtuZT1bXTtmb3IobGV0IHVlPTAscmU9Sy5sZW5ndGgsQ2U9cmUtMSxXPXVlKzE7dWU8cmU7dWUrKyxDZSsrLFcrKylDZT09PXJlJiYoQ2U9MCksVz09PXJlJiYoVz0wKSxuZVt1ZV09WihLW3VlXSxLW0NlXSxLW1ddKTtRLnB1c2gobmUpLGZlPWZlLmNvbmNhdChuZSl9Zm9yKGxldCBEPTA7RDxnO0QrKyl7Y29uc3QgbGU9RC9nLEs9ZCpNYXRoLmNvcyhsZSpNYXRoLlBJLzIpLHVlPXAqTWF0aC5zaW4obGUqTWF0aC5QSS8yKStfO2ZvcihsZXQgcmU9MCxDZT1JLmxlbmd0aDtyZTxDZTtyZSsrKXtjb25zdCBXPVUoSVtyZV0sVltyZV0sdWUpO2JlKFcueCxXLnksLUspfWZvcihsZXQgcmU9MCxDZT1SLmxlbmd0aDtyZTxDZTtyZSsrKXtjb25zdCBXPVJbcmVdO25lPVFbcmVdO2ZvcihsZXQgSj0wLGllPVcubGVuZ3RoO0o8aWU7SisrKXtjb25zdCBtZT1VKFdbSl0sbmVbSl0sdWUpO2JlKG1lLngsbWUueSwtSyl9fX1jb25zdCAkPXArXztmb3IobGV0IEQ9MDtEPHo7RCsrKXtjb25zdCBsZT1mP1Uod1tEXSxmZVtEXSwkKTp3W0RdO3Y/KEEuY29weShTLm5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGxlLngpLGIuY29weShTLmJpbm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIobGUueSksTC5jb3B5KHhbMF0pLmFkZChBKS5hZGQoYiksYmUoTC54LEwueSxMLnopKTpiZShsZS54LGxlLnksMCl9Zm9yKGxldCBEPTE7RDw9aDtEKyspZm9yKGxldCBsZT0wO2xlPHo7bGUrKyl7Y29uc3QgSz1mP1Uod1tsZV0sZmVbbGVdLCQpOndbbGVdO3Y/KEEuY29weShTLm5vcm1hbHNbRF0pLm11bHRpcGx5U2NhbGFyKEsueCksYi5jb3B5KFMuYmlub3JtYWxzW0RdKS5tdWx0aXBseVNjYWxhcihLLnkpLEwuY29weSh4W0RdKS5hZGQoQSkuYWRkKGIpLGJlKEwueCxMLnksTC56KSk6YmUoSy54LEsueSx1L2gqRCl9Zm9yKGxldCBEPWctMTtEPj0wO0QtLSl7Y29uc3QgbGU9RC9nLEs9ZCpNYXRoLmNvcyhsZSpNYXRoLlBJLzIpLHVlPXAqTWF0aC5zaW4obGUqTWF0aC5QSS8yKStfO2ZvcihsZXQgcmU9MCxDZT1JLmxlbmd0aDtyZTxDZTtyZSsrKXtjb25zdCBXPVUoSVtyZV0sVltyZV0sdWUpO2JlKFcueCxXLnksdStLKX1mb3IobGV0IHJlPTAsQ2U9Ui5sZW5ndGg7cmU8Q2U7cmUrKyl7Y29uc3QgVz1SW3JlXTtuZT1RW3JlXTtmb3IobGV0IEo9MCxpZT1XLmxlbmd0aDtKPGllO0orKyl7Y29uc3QgbWU9VShXW0pdLG5lW0pdLHVlKTt2P2JlKG1lLngsbWUueSt4W2gtMV0ueSx4W2gtMV0ueCtLKTpiZShtZS54LG1lLnksdStLKX19fWVlKCksZGUoKTtmdW5jdGlvbiBlZSgpe2NvbnN0IEQ9aS5sZW5ndGgvMztpZihmKXtsZXQgbGU9MCxLPXoqbGU7Zm9yKGxldCB1ZT0wO3VlPEY7dWUrKyl7Y29uc3QgcmU9Qlt1ZV07T2UocmVbMl0rSyxyZVsxXStLLHJlWzBdK0spfWxlPWgrZyoyLEs9eipsZTtmb3IobGV0IHVlPTA7dWU8Rjt1ZSsrKXtjb25zdCByZT1CW3VlXTtPZShyZVswXStLLHJlWzFdK0sscmVbMl0rSyl9fWVsc2V7Zm9yKGxldCBsZT0wO2xlPEY7bGUrKyl7Y29uc3QgSz1CW2xlXTtPZShLWzJdLEtbMV0sS1swXSl9Zm9yKGxldCBsZT0wO2xlPEY7bGUrKyl7Y29uc3QgSz1CW2xlXTtPZShLWzBdK3oqaCxLWzFdK3oqaCxLWzJdK3oqaCl9fW4uYWRkR3JvdXAoRCxpLmxlbmd0aC8zLUQsMCl9ZnVuY3Rpb24gZGUoKXtjb25zdCBEPWkubGVuZ3RoLzM7bGV0IGxlPTA7VGUoSSxsZSksbGUrPUkubGVuZ3RoO2ZvcihsZXQgSz0wLHVlPVIubGVuZ3RoO0s8dWU7SysrKXtjb25zdCByZT1SW0tdO1RlKHJlLGxlKSxsZSs9cmUubGVuZ3RofW4uYWRkR3JvdXAoRCxpLmxlbmd0aC8zLUQsMSl9ZnVuY3Rpb24gVGUoRCxsZSl7bGV0IEs9RC5sZW5ndGg7Zm9yKDstLUs+PTA7KXtjb25zdCB1ZT1LO2xldCByZT1LLTE7cmU8MCYmKHJlPUQubGVuZ3RoLTEpO2ZvcihsZXQgQ2U9MCxXPWgrZyoyO0NlPFc7Q2UrKyl7Y29uc3QgSj16KkNlLGllPXoqKENlKzEpLG1lPWxlK3VlK0oscGU9bGUrcmUrSixDPWxlK3JlK2llLEU9bGUrdWUraWU7QmUobWUscGUsQyxFKX19fWZ1bmN0aW9uIGJlKEQsbGUsSyl7bC5wdXNoKEQpLGwucHVzaChsZSksbC5wdXNoKEspfWZ1bmN0aW9uIE9lKEQsbGUsSyl7d2UoRCksd2UobGUpLHdlKEspO2NvbnN0IHVlPWkubGVuZ3RoLzMscmU9eS5nZW5lcmF0ZVRvcFVWKG4saSx1ZS0zLHVlLTIsdWUtMSk7UGUocmVbMF0pLFBlKHJlWzFdKSxQZShyZVsyXSl9ZnVuY3Rpb24gQmUoRCxsZSxLLHVlKXt3ZShEKSx3ZShsZSksd2UodWUpLHdlKGxlKSx3ZShLKSx3ZSh1ZSk7Y29uc3QgcmU9aS5sZW5ndGgvMyxDZT15LmdlbmVyYXRlU2lkZVdhbGxVVihuLGkscmUtNixyZS0zLHJlLTIscmUtMSk7UGUoQ2VbMF0pLFBlKENlWzFdKSxQZShDZVszXSksUGUoQ2VbMV0pLFBlKENlWzJdKSxQZShDZVszXSl9ZnVuY3Rpb24gd2UoRCl7aS5wdXNoKGxbRCozKzBdKSxpLnB1c2gobFtEKjMrMV0pLGkucHVzaChsW0QqMysyXSl9ZnVuY3Rpb24gUGUoRCl7cy5wdXNoKEQueCkscy5wdXNoKEQueSl9fX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LGUucGFyYW1ldGVycyksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpLHQ9dGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxuPXRoaXMucGFyYW1ldGVycy5vcHRpb25zO3JldHVybiB1Yih0LG4sZSl9c3RhdGljIGZyb21KU09OKGUsdCl7Y29uc3Qgbj1bXTtmb3IobGV0IHM9MCxhPWUuc2hhcGVzLmxlbmd0aDtzPGE7cysrKXtjb25zdCBvPXRbZS5zaGFwZXNbc11dO24ucHVzaChvKX1jb25zdCBpPWUub3B0aW9ucy5leHRydWRlUGF0aDtyZXR1cm4gaSE9PXZvaWQgMCYmKGUub3B0aW9ucy5leHRydWRlUGF0aD1uZXcgVm9baS50eXBlXSgpLmZyb21KU09OKGkpKSxuZXcgb18obixlLm9wdGlvbnMpfX07Y29uc3QgaGI9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24ocixlLHQsbixpKXtjb25zdCBzPWVbdCozXSxhPWVbdCozKzFdLG89ZVtuKjNdLGw9ZVtuKjMrMV0sYz1lW2kqM10saD1lW2kqMysxXTtyZXR1cm5bbmV3IHEocyxhKSxuZXcgcShvLGwpLG5ldyBxKGMsaCldfSxnZW5lcmF0ZVNpZGVXYWxsVVY6ZnVuY3Rpb24ocixlLHQsbixpLHMpe2NvbnN0IGE9ZVt0KjNdLG89ZVt0KjMrMV0sbD1lW3QqMysyXSxjPWVbbiozXSxoPWVbbiozKzFdLHU9ZVtuKjMrMl0sZj1lW2kqM10sZD1lW2kqMysxXSxwPWVbaSozKzJdLF89ZVtzKjNdLGc9ZVtzKjMrMV0sbT1lW3MqMysyXTtyZXR1cm4gTWF0aC5hYnMoby1oKTxNYXRoLmFicyhhLWMpP1tuZXcgcShhLDEtbCksbmV3IHEoYywxLXUpLG5ldyBxKGYsMS1wKSxuZXcgcShfLDEtbSldOltuZXcgcShvLDEtbCksbmV3IHEoaCwxLXUpLG5ldyBxKGQsMS1wKSxuZXcgcShnLDEtbSldfX07ZnVuY3Rpb24gdWIocixlLHQpe2lmKHQuc2hhcGVzPVtdLEFycmF5LmlzQXJyYXkocikpZm9yKGxldCBuPTAsaT1yLmxlbmd0aDtuPGk7bisrKXtjb25zdCBzPXJbbl07dC5zaGFwZXMucHVzaChzLnV1aWQpfWVsc2UgdC5zaGFwZXMucHVzaChyLnV1aWQpO3JldHVybiB0Lm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSxlKSxlLmV4dHJ1ZGVQYXRoIT09dm9pZCAwJiYodC5vcHRpb25zLmV4dHJ1ZGVQYXRoPWUuZXh0cnVkZVBhdGgudG9KU09OKCkpLHR9Y2xhc3Mgam8gZXh0ZW5kcyBEaXtjb25zdHJ1Y3RvcihlPTEsdD0wKXtjb25zdCBuPSgxK01hdGguc3FydCg1KSkvMixpPVstMSxuLDAsMSxuLDAsLTEsLW4sMCwxLC1uLDAsMCwtMSxuLDAsMSxuLDAsLTEsLW4sMCwxLC1uLG4sMCwtMSxuLDAsMSwtbiwwLC0xLC1uLDAsMV0scz1bMCwxMSw1LDAsNSwxLDAsMSw3LDAsNywxMCwwLDEwLDExLDEsNSw5LDUsMTEsNCwxMSwxMCwyLDEwLDcsNiw3LDEsOCwzLDksNCwzLDQsMiwzLDIsNiwzLDYsOCwzLDgsOSw0LDksNSwyLDQsMTEsNiwyLDEwLDgsNiw3LDksOCwxXTtzdXBlcihpLHMsZSx0KSx0aGlzLnR5cGU9Ikljb3NhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOmUsZGV0YWlsOnR9fXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IGpvKGUucmFkaXVzLGUuZGV0YWlsKX19Y2xhc3MgbGEgZXh0ZW5kcyBEaXtjb25zdHJ1Y3RvcihlPTEsdD0wKXtjb25zdCBuPVsxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMV0saT1bMCwyLDQsMCw0LDMsMCwzLDUsMCw1LDIsMSwyLDUsMSw1LDMsMSwzLDQsMSw0LDJdO3N1cGVyKG4saSxlLHQpLHRoaXMudHlwZT0iT2N0YWhlZHJvbkdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czplLGRldGFpbDp0fX1zdGF0aWMgZnJvbUpTT04oZSl7cmV0dXJuIG5ldyBsYShlLnJhZGl1cyxlLmRldGFpbCl9fWNsYXNzIGVsIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT0uNSx0PTEsbj0zMixpPTEscz0wLGE9TWF0aC5QSSoyKXtzdXBlcigpLHRoaXMudHlwZT0iUmluZ0dlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e2lubmVyUmFkaXVzOmUsb3V0ZXJSYWRpdXM6dCx0aGV0YVNlZ21lbnRzOm4scGhpU2VnbWVudHM6aSx0aGV0YVN0YXJ0OnMsdGhldGFMZW5ndGg6YX0sbj1NYXRoLm1heCgzLG4pLGk9TWF0aC5tYXgoMSxpKTtjb25zdCBvPVtdLGw9W10sYz1bXSxoPVtdO2xldCB1PWU7Y29uc3QgZj0odC1lKS9pLGQ9bmV3IFAscD1uZXcgcTtmb3IobGV0IF89MDtfPD1pO18rKyl7Zm9yKGxldCBnPTA7Zzw9bjtnKyspe2NvbnN0IG09cytnL24qYTtkLng9dSpNYXRoLmNvcyhtKSxkLnk9dSpNYXRoLnNpbihtKSxsLnB1c2goZC54LGQueSxkLnopLGMucHVzaCgwLDAsMSkscC54PShkLngvdCsxKS8yLHAueT0oZC55L3QrMSkvMixoLnB1c2gocC54LHAueSl9dSs9Zn1mb3IobGV0IF89MDtfPGk7XysrKXtjb25zdCBnPV8qKG4rMSk7Zm9yKGxldCBtPTA7bTxuO20rKyl7Y29uc3QgeT1tK2cseD15LHY9eStuKzEsUz15K24rMixiPXkrMTtvLnB1c2goeCx2LGIpLG8ucHVzaCh2LFMsYil9fXRoaXMuc2V0SW5kZXgobyksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UobCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKGMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGgsMikpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IGVsKGUuaW5uZXJSYWRpdXMsZS5vdXRlclJhZGl1cyxlLnRoZXRhU2VnbWVudHMsZS5waGlTZWdtZW50cyxlLnRoZXRhU3RhcnQsZS50aGV0YUxlbmd0aCl9fWNsYXNzIHRsIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT1uZXcgb2koW25ldyBxKDAsLjUpLG5ldyBxKC0uNSwtLjUpLG5ldyBxKC41LC0uNSldKSx0PTEyKXtzdXBlcigpLHRoaXMudHlwZT0iU2hhcGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6ZSxjdXJ2ZVNlZ21lbnRzOnR9O2NvbnN0IG49W10saT1bXSxzPVtdLGE9W107bGV0IG89MCxsPTA7aWYoQXJyYXkuaXNBcnJheShlKT09PSExKWMoZSk7ZWxzZSBmb3IobGV0IGg9MDtoPGUubGVuZ3RoO2grKyljKGVbaF0pLHRoaXMuYWRkR3JvdXAobyxsLGgpLG8rPWwsbD0wO3RoaXMuc2V0SW5kZXgobiksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoaSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKHMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGEsMikpO2Z1bmN0aW9uIGMoaCl7Y29uc3QgdT1pLmxlbmd0aC8zLGY9aC5leHRyYWN0UG9pbnRzKHQpO2xldCBkPWYuc2hhcGU7Y29uc3QgcD1mLmhvbGVzO3ZuLmlzQ2xvY2tXaXNlKGQpPT09ITEmJihkPWQucmV2ZXJzZSgpKTtmb3IobGV0IGc9MCxtPXAubGVuZ3RoO2c8bTtnKyspe2NvbnN0IHk9cFtnXTt2bi5pc0Nsb2NrV2lzZSh5KT09PSEwJiYocFtnXT15LnJldmVyc2UoKSl9Y29uc3QgXz12bi50cmlhbmd1bGF0ZVNoYXBlKGQscCk7Zm9yKGxldCBnPTAsbT1wLmxlbmd0aDtnPG07ZysrKXtjb25zdCB5PXBbZ107ZD1kLmNvbmNhdCh5KX1mb3IobGV0IGc9MCxtPWQubGVuZ3RoO2c8bTtnKyspe2NvbnN0IHk9ZFtnXTtpLnB1c2goeS54LHkueSwwKSxzLnB1c2goMCwwLDEpLGEucHVzaCh5LngseS55KX1mb3IobGV0IGc9MCxtPV8ubGVuZ3RoO2c8bTtnKyspe2NvbnN0IHk9X1tnXSx4PXlbMF0rdSx2PXlbMV0rdSxTPXlbMl0rdTtuLnB1c2goeCx2LFMpLGwrPTN9fX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LGUucGFyYW1ldGVycyksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpLHQ9dGhpcy5wYXJhbWV0ZXJzLnNoYXBlcztyZXR1cm4gZmIodCxlKX1zdGF0aWMgZnJvbUpTT04oZSx0KXtjb25zdCBuPVtdO2ZvcihsZXQgaT0wLHM9ZS5zaGFwZXMubGVuZ3RoO2k8cztpKyspe2NvbnN0IGE9dFtlLnNoYXBlc1tpXV07bi5wdXNoKGEpfXJldHVybiBuZXcgdGwobixlLmN1cnZlU2VnbWVudHMpfX1mdW5jdGlvbiBmYihyLGUpe2lmKGUuc2hhcGVzPVtdLEFycmF5LmlzQXJyYXkocikpZm9yKGxldCB0PTAsbj1yLmxlbmd0aDt0PG47dCsrKXtjb25zdCBpPXJbdF07ZS5zaGFwZXMucHVzaChpLnV1aWQpfWVsc2UgZS5zaGFwZXMucHVzaChyLnV1aWQpO3JldHVybiBlfWNsYXNzIGNhIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT0xLHQ9MzIsbj0xNixpPTAscz1NYXRoLlBJKjIsYT0wLG89TWF0aC5QSSl7c3VwZXIoKSx0aGlzLnR5cGU9IlNwaGVyZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czplLHdpZHRoU2VnbWVudHM6dCxoZWlnaHRTZWdtZW50czpuLHBoaVN0YXJ0OmkscGhpTGVuZ3RoOnMsdGhldGFTdGFydDphLHRoZXRhTGVuZ3RoOm99LHQ9TWF0aC5tYXgoMyxNYXRoLmZsb29yKHQpKSxuPU1hdGgubWF4KDIsTWF0aC5mbG9vcihuKSk7Y29uc3QgbD1NYXRoLm1pbihhK28sTWF0aC5QSSk7bGV0IGM9MDtjb25zdCBoPVtdLHU9bmV3IFAsZj1uZXcgUCxkPVtdLHA9W10sXz1bXSxnPVtdO2ZvcihsZXQgbT0wO208PW47bSsrKXtjb25zdCB5PVtdLHg9bS9uO2xldCB2PTA7bT09PTAmJmE9PT0wP3Y9LjUvdDptPT09biYmbD09PU1hdGguUEkmJih2PS0uNS90KTtmb3IobGV0IFM9MDtTPD10O1MrKyl7Y29uc3QgYj1TL3Q7dS54PS1lKk1hdGguY29zKGkrYipzKSpNYXRoLnNpbihhK3gqbyksdS55PWUqTWF0aC5jb3MoYSt4Km8pLHUuej1lKk1hdGguc2luKGkrYipzKSpNYXRoLnNpbihhK3gqbykscC5wdXNoKHUueCx1LnksdS56KSxmLmNvcHkodSkubm9ybWFsaXplKCksXy5wdXNoKGYueCxmLnksZi56KSxnLnB1c2goYit2LDEteCkseS5wdXNoKGMrKyl9aC5wdXNoKHkpfWZvcihsZXQgbT0wO208bjttKyspZm9yKGxldCB5PTA7eTx0O3krKyl7Y29uc3QgeD1oW21dW3krMV0sdj1oW21dW3ldLFM9aFttKzFdW3ldLGI9aFttKzFdW3krMV07KG0hPT0wfHxhPjApJiZkLnB1c2goeCx2LGIpLChtIT09bi0xfHxsPE1hdGguUEkpJiZkLnB1c2godixTLGIpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKF8sMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGcsMikpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IGNhKGUucmFkaXVzLGUud2lkdGhTZWdtZW50cyxlLmhlaWdodFNlZ21lbnRzLGUucGhpU3RhcnQsZS5waGlMZW5ndGgsZS50aGV0YVN0YXJ0LGUudGhldGFMZW5ndGgpfX1jbGFzcyBubCBleHRlbmRzIERpe2NvbnN0cnVjdG9yKGU9MSx0PTApe2NvbnN0IG49WzEsMSwxLC0xLC0xLDEsLTEsMSwtMSwxLC0xLC0xXSxpPVsyLDEsMCwwLDMsMiwxLDMsMCwyLDMsMV07c3VwZXIobixpLGUsdCksdGhpcy50eXBlPSJUZXRyYWhlZHJvbkdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czplLGRldGFpbDp0fX1zdGF0aWMgZnJvbUpTT04oZSl7cmV0dXJuIG5ldyBubChlLnJhZGl1cyxlLmRldGFpbCl9fWNsYXNzIGlsIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT0xLHQ9LjQsbj0xMixpPTQ4LHM9TWF0aC5QSSoyKXtzdXBlcigpLHRoaXMudHlwZT0iVG9ydXNHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6ZSx0dWJlOnQscmFkaWFsU2VnbWVudHM6bix0dWJ1bGFyU2VnbWVudHM6aSxhcmM6c30sbj1NYXRoLmZsb29yKG4pLGk9TWF0aC5mbG9vcihpKTtjb25zdCBhPVtdLG89W10sbD1bXSxjPVtdLGg9bmV3IFAsdT1uZXcgUCxmPW5ldyBQO2ZvcihsZXQgZD0wO2Q8PW47ZCsrKWZvcihsZXQgcD0wO3A8PWk7cCsrKXtjb25zdCBfPXAvaSpzLGc9ZC9uKk1hdGguUEkqMjt1Lng9KGUrdCpNYXRoLmNvcyhnKSkqTWF0aC5jb3MoXyksdS55PShlK3QqTWF0aC5jb3MoZykpKk1hdGguc2luKF8pLHUuej10Kk1hdGguc2luKGcpLG8ucHVzaCh1LngsdS55LHUueiksaC54PWUqTWF0aC5jb3MoXyksaC55PWUqTWF0aC5zaW4oXyksZi5zdWJWZWN0b3JzKHUsaCkubm9ybWFsaXplKCksbC5wdXNoKGYueCxmLnksZi56KSxjLnB1c2gocC9pKSxjLnB1c2goZC9uKX1mb3IobGV0IGQ9MTtkPD1uO2QrKylmb3IobGV0IHA9MTtwPD1pO3ArKyl7Y29uc3QgXz0oaSsxKSpkK3AtMSxnPShpKzEpKihkLTEpK3AtMSxtPShpKzEpKihkLTEpK3AseT0oaSsxKSpkK3A7YS5wdXNoKF8sZyx5KSxhLnB1c2goZyxtLHkpfXRoaXMuc2V0SW5kZXgoYSksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UobywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKGwsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGMsMikpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5wYXJhbWV0ZXJzPU9iamVjdC5hc3NpZ24oe30sZS5wYXJhbWV0ZXJzKSx0aGlzfXN0YXRpYyBmcm9tSlNPTihlKXtyZXR1cm4gbmV3IGlsKGUucmFkaXVzLGUudHViZSxlLnJhZGlhbFNlZ21lbnRzLGUudHVidWxhclNlZ21lbnRzLGUuYXJjKX19Y2xhc3MgcmwgZXh0ZW5kcyBrZXtjb25zdHJ1Y3RvcihlPTEsdD0uNCxuPTY0LGk9OCxzPTIsYT0zKXtzdXBlcigpLHRoaXMudHlwZT0iVG9ydXNLbm90R2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOmUsdHViZTp0LHR1YnVsYXJTZWdtZW50czpuLHJhZGlhbFNlZ21lbnRzOmkscDpzLHE6YX0sbj1NYXRoLmZsb29yKG4pLGk9TWF0aC5mbG9vcihpKTtjb25zdCBvPVtdLGw9W10sYz1bXSxoPVtdLHU9bmV3IFAsZj1uZXcgUCxkPW5ldyBQLHA9bmV3IFAsXz1uZXcgUCxnPW5ldyBQLG09bmV3IFA7Zm9yKGxldCB4PTA7eDw9bjsrK3gpe2NvbnN0IHY9eC9uKnMqTWF0aC5QSSoyO3kodixzLGEsZSxkKSx5KHYrLjAxLHMsYSxlLHApLGcuc3ViVmVjdG9ycyhwLGQpLG0uYWRkVmVjdG9ycyhwLGQpLF8uY3Jvc3NWZWN0b3JzKGcsbSksbS5jcm9zc1ZlY3RvcnMoXyxnKSxfLm5vcm1hbGl6ZSgpLG0ubm9ybWFsaXplKCk7Zm9yKGxldCBTPTA7Uzw9aTsrK1Mpe2NvbnN0IGI9Uy9pKk1hdGguUEkqMixBPS10Kk1hdGguY29zKGIpLEw9dCpNYXRoLnNpbihiKTt1Lng9ZC54KyhBKm0ueCtMKl8ueCksdS55PWQueSsoQSptLnkrTCpfLnkpLHUuej1kLnorKEEqbS56K0wqXy56KSxsLnB1c2godS54LHUueSx1LnopLGYuc3ViVmVjdG9ycyh1LGQpLm5vcm1hbGl6ZSgpLGMucHVzaChmLngsZi55LGYueiksaC5wdXNoKHgvbiksaC5wdXNoKFMvaSl9fWZvcihsZXQgeD0xO3g8PW47eCsrKWZvcihsZXQgdj0xO3Y8PWk7disrKXtjb25zdCBTPShpKzEpKih4LTEpKyh2LTEpLGI9KGkrMSkqeCsodi0xKSxBPShpKzEpKngrdixMPShpKzEpKih4LTEpK3Y7by5wdXNoKFMsYixMKSxvLnB1c2goYixBLEwpfXRoaXMuc2V0SW5kZXgobyksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UobCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKGMsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGgsMikpO2Z1bmN0aW9uIHkoeCx2LFMsYixBKXtjb25zdCBMPU1hdGguY29zKHgpLE09TWF0aC5zaW4oeCksdz1TL3YqeCxSPU1hdGguY29zKHcpO0EueD1iKigyK1IpKi41KkwsQS55PWIqKDIrUikqTSouNSxBLno9YipNYXRoLnNpbih3KSouNX19Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSxlLnBhcmFtZXRlcnMpLHRoaXN9c3RhdGljIGZyb21KU09OKGUpe3JldHVybiBuZXcgcmwoZS5yYWRpdXMsZS50dWJlLGUudHVidWxhclNlZ21lbnRzLGUucmFkaWFsU2VnbWVudHMsZS5wLGUucSl9fWNsYXNzIHNsIGV4dGVuZHMga2V7Y29uc3RydWN0b3IoZT1uZXcgS2gobmV3IFAoLTEsLTEsMCksbmV3IFAoLTEsMSwwKSxuZXcgUCgxLDEsMCkpLHQ9NjQsbj0xLGk9OCxzPSExKXtzdXBlcigpLHRoaXMudHlwZT0iVHViZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3BhdGg6ZSx0dWJ1bGFyU2VnbWVudHM6dCxyYWRpdXM6bixyYWRpYWxTZWdtZW50czppLGNsb3NlZDpzfTtjb25zdCBhPWUuY29tcHV0ZUZyZW5ldEZyYW1lcyh0LHMpO3RoaXMudGFuZ2VudHM9YS50YW5nZW50cyx0aGlzLm5vcm1hbHM9YS5ub3JtYWxzLHRoaXMuYmlub3JtYWxzPWEuYmlub3JtYWxzO2NvbnN0IG89bmV3IFAsbD1uZXcgUCxjPW5ldyBxO2xldCBoPW5ldyBQO2NvbnN0IHU9W10sZj1bXSxkPVtdLHA9W107XygpLHRoaXMuc2V0SW5kZXgocCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UodSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IFNlKGYsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IFNlKGQsMikpO2Z1bmN0aW9uIF8oKXtmb3IobGV0IHg9MDt4PHQ7eCsrKWcoeCk7ZyhzPT09ITE/dDowKSx5KCksbSgpfWZ1bmN0aW9uIGcoeCl7aD1lLmdldFBvaW50QXQoeC90LGgpO2NvbnN0IHY9YS5ub3JtYWxzW3hdLFM9YS5iaW5vcm1hbHNbeF07Zm9yKGxldCBiPTA7Yjw9aTtiKyspe2NvbnN0IEE9Yi9pKk1hdGguUEkqMixMPU1hdGguc2luKEEpLE09LU1hdGguY29zKEEpO2wueD1NKnYueCtMKlMueCxsLnk9TSp2LnkrTCpTLnksbC56PU0qdi56K0wqUy56LGwubm9ybWFsaXplKCksZi5wdXNoKGwueCxsLnksbC56KSxvLng9aC54K24qbC54LG8ueT1oLnkrbipsLnksby56PWgueituKmwueix1LnB1c2goby54LG8ueSxvLnopfX1mdW5jdGlvbiBtKCl7Zm9yKGxldCB4PTE7eDw9dDt4KyspZm9yKGxldCB2PTE7djw9aTt2Kyspe2NvbnN0IFM9KGkrMSkqKHgtMSkrKHYtMSksYj0oaSsxKSp4Kyh2LTEpLEE9KGkrMSkqeCt2LEw9KGkrMSkqKHgtMSkrdjtwLnB1c2goUyxiLEwpLHAucHVzaChiLEEsTCl9fWZ1bmN0aW9uIHkoKXtmb3IobGV0IHg9MDt4PD10O3grKylmb3IobGV0IHY9MDt2PD1pO3YrKyljLng9eC90LGMueT12L2ksZC5wdXNoKGMueCxjLnkpfX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LGUucGFyYW1ldGVycyksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO3JldHVybiBlLnBhdGg9dGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCksZX1zdGF0aWMgZnJvbUpTT04oZSl7cmV0dXJuIG5ldyBzbChuZXcgVm9bZS5wYXRoLnR5cGVdKCkuZnJvbUpTT04oZS5wYXRoKSxlLnR1YnVsYXJTZWdtZW50cyxlLnJhZGl1cyxlLnJhZGlhbFNlZ21lbnRzLGUuY2xvc2VkKX19Y2xhc3MgcG0gZXh0ZW5kcyBrZXtjb25zdHJ1Y3RvcihlPW51bGwpe2lmKHN1cGVyKCksdGhpcy50eXBlPSJXaXJlZnJhbWVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtnZW9tZXRyeTplfSxlIT09bnVsbCl7Y29uc3QgdD1bXSxuPW5ldyBTZXQsaT1uZXcgUCxzPW5ldyBQO2lmKGUuaW5kZXghPT1udWxsKXtjb25zdCBhPWUuYXR0cmlidXRlcy5wb3NpdGlvbixvPWUuaW5kZXg7bGV0IGw9ZS5ncm91cHM7bC5sZW5ndGg9PT0wJiYobD1be3N0YXJ0OjAsY291bnQ6by5jb3VudCxtYXRlcmlhbEluZGV4OjB9XSk7Zm9yKGxldCBjPTAsaD1sLmxlbmd0aDtjPGg7KytjKXtjb25zdCB1PWxbY10sZj11LnN0YXJ0LGQ9dS5jb3VudDtmb3IobGV0IHA9ZixfPWYrZDtwPF87cCs9Mylmb3IobGV0IGc9MDtnPDM7ZysrKXtjb25zdCBtPW8uZ2V0WChwK2cpLHk9by5nZXRYKHArKGcrMSklMyk7aS5mcm9tQnVmZmVyQXR0cmlidXRlKGEsbSkscy5mcm9tQnVmZmVyQXR0cmlidXRlKGEseSksbW0oaSxzLG4pPT09ITAmJih0LnB1c2goaS54LGkueSxpLnopLHQucHVzaChzLngscy55LHMueikpfX19ZWxzZXtjb25zdCBhPWUuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IG89MCxsPWEuY291bnQvMztvPGw7bysrKWZvcihsZXQgYz0wO2M8MztjKyspe2NvbnN0IGg9MypvK2MsdT0zKm8rKGMrMSklMztpLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxoKSxzLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSx1KSxtbShpLHMsbik9PT0hMCYmKHQucHVzaChpLngsaS55LGkueiksdC5wdXNoKHMueCxzLnkscy56KSl9fXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFNlKHQsMykpfX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LGUucGFyYW1ldGVycyksdGhpc319ZnVuY3Rpb24gbW0ocixlLHQpe2NvbnN0IG49YCR7ci54fSwke3IueX0sJHtyLnp9LSR7ZS54fSwke2UueX0sJHtlLnp9YCxpPWAke2UueH0sJHtlLnl9LCR7ZS56fS0ke3IueH0sJHtyLnl9LCR7ci56fWA7cmV0dXJuIHQuaGFzKG4pPT09ITB8fHQuaGFzKGkpPT09ITA/ITE6KHQuYWRkKG4pLHQuYWRkKGkpLCEwKX12YXIgZ209T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQm94R2VvbWV0cnk6WWksQ2Fwc3VsZUdlb21ldHJ5OkhvLENpcmNsZUdlb21ldHJ5OldvLENvbmVHZW9tZXRyeTpYbyxDeWxpbmRlckdlb21ldHJ5Om5zLERvZGVjYWhlZHJvbkdlb21ldHJ5OnFvLEVkZ2VzR2VvbWV0cnk6YW0sRXh0cnVkZUdlb21ldHJ5OmRtLEljb3NhaGVkcm9uR2VvbWV0cnk6am8sTGF0aGVHZW9tZXRyeTpyYSxPY3RhaGVkcm9uR2VvbWV0cnk6bGEsUGxhbmVHZW9tZXRyeTokcyxQb2x5aGVkcm9uR2VvbWV0cnk6RGksUmluZ0dlb21ldHJ5OmVsLFNoYXBlR2VvbWV0cnk6dGwsU3BoZXJlR2VvbWV0cnk6Y2EsVGV0cmFoZWRyb25HZW9tZXRyeTpubCxUb3J1c0dlb21ldHJ5OmlsLFRvcnVzS25vdEdlb21ldHJ5OnJsLFR1YmVHZW9tZXRyeTpzbCxXaXJlZnJhbWVHZW9tZXRyeTpwbX0pO2NsYXNzIF9tIGV4dGVuZHMgSHR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzU2hhZG93TWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJTaGFkb3dNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgeWUoMCksdGhpcy50cmFuc3BhcmVudD0hMCx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuY29sb3IuY29weShlLmNvbG9yKSx0aGlzLmZvZz1lLmZvZyx0aGlzfX1jbGFzcyB4bSBleHRlbmRzIEhue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuaXNSYXdTaGFkZXJNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlJhd1NoYWRlck1hdGVyaWFsIn19Y2xhc3MgbnUgZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD0hMCx0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifSx0aGlzLnR5cGU9Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5ZSgxNjc3NzIxNSksdGhpcy5yb3VnaG5lc3M9MSx0aGlzLm1ldGFsbmVzcz0wLHRoaXMubWFwPW51bGwsdGhpcy5saWdodE1hcD1udWxsLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9MSx0aGlzLmFvTWFwPW51bGwsdGhpcy5hb01hcEludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmU9bmV3IHllKDApLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlTWFwPW51bGwsdGhpcy5idW1wTWFwPW51bGwsdGhpcy5idW1wU2NhbGU9MSx0aGlzLm5vcm1hbE1hcD1udWxsLHRoaXMubm9ybWFsTWFwVHlwZT13aSx0aGlzLm5vcm1hbFNjYWxlPW5ldyBxKDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5yb3VnaG5lc3NNYXA9bnVsbCx0aGlzLm1ldGFsbmVzc01hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuZW52TWFwSW50ZW5zaXR5PTEsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiJ9LHRoaXMuY29sb3IuY29weShlLmNvbG9yKSx0aGlzLnJvdWdobmVzcz1lLnJvdWdobmVzcyx0aGlzLm1ldGFsbmVzcz1lLm1ldGFsbmVzcyx0aGlzLm1hcD1lLm1hcCx0aGlzLmxpZ2h0TWFwPWUubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT1lLmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9ZS5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PWUuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KGUuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9ZS5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PWUuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPWUuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT1lLmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD1lLm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9ZS5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weShlLm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1lLmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWUuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPWUuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLnJvdWdobmVzc01hcD1lLnJvdWdobmVzc01hcCx0aGlzLm1ldGFsbmVzc01hcD1lLm1ldGFsbmVzc01hcCx0aGlzLmFscGhhTWFwPWUuYWxwaGFNYXAsdGhpcy5lbnZNYXA9ZS5lbnZNYXAsdGhpcy5lbnZNYXBJbnRlbnNpdHk9ZS5lbnZNYXBJbnRlbnNpdHksdGhpcy53aXJlZnJhbWU9ZS53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9ZS53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPWUud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPWUud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mbGF0U2hhZGluZz1lLmZsYXRTaGFkaW5nLHRoaXMuZm9nPWUuZm9nLHRoaXN9fWNsYXNzIHltIGV4dGVuZHMgbnV7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw9ITAsdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn0sdGhpcy50eXBlPSJNZXNoUGh5c2ljYWxNYXRlcmlhbCIsdGhpcy5hbmlzb3Ryb3B5Um90YXRpb249MCx0aGlzLmFuaXNvdHJvcHlNYXA9bnVsbCx0aGlzLmNsZWFyY29hdE1hcD1udWxsLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzPTAsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9bnVsbCx0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlPW5ldyBxKDEsMSksdGhpcy5jbGVhcmNvYXROb3JtYWxNYXA9bnVsbCx0aGlzLmlvcj0xLjUsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInJlZmxlY3Rpdml0eSIse2dldDpmdW5jdGlvbigpe3JldHVybiBfdCgyLjUqKHRoaXMuaW9yLTEpLyh0aGlzLmlvcisxKSwwLDEpfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5pb3I9KDErLjQqdCkvKDEtLjQqdCl9fSksdGhpcy5pcmlkZXNjZW5jZU1hcD1udWxsLHRoaXMuaXJpZGVzY2VuY2VJT1I9MS4zLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZT1bMTAwLDQwMF0sdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD1udWxsLHRoaXMuc2hlZW5Db2xvcj1uZXcgeWUoMCksdGhpcy5zaGVlbkNvbG9yTWFwPW51bGwsdGhpcy5zaGVlblJvdWdobmVzcz0xLHRoaXMuc2hlZW5Sb3VnaG5lc3NNYXA9bnVsbCx0aGlzLnRyYW5zbWlzc2lvbk1hcD1udWxsLHRoaXMudGhpY2tuZXNzPTAsdGhpcy50aGlja25lc3NNYXA9bnVsbCx0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2U9MS8wLHRoaXMuYXR0ZW51YXRpb25Db2xvcj1uZXcgeWUoMSwxLDEpLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHk9MSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwPW51bGwsdGhpcy5zcGVjdWxhckNvbG9yPW5ldyB5ZSgxLDEsMSksdGhpcy5zcGVjdWxhckNvbG9yTWFwPW51bGwsdGhpcy5fYW5pc290cm9weT0wLHRoaXMuX2NsZWFyY29hdD0wLHRoaXMuX2lyaWRlc2NlbmNlPTAsdGhpcy5fc2hlZW49MCx0aGlzLl90cmFuc21pc3Npb249MCx0aGlzLnNldFZhbHVlcyhlKX1nZXQgYW5pc290cm9weSgpe3JldHVybiB0aGlzLl9hbmlzb3Ryb3B5fXNldCBhbmlzb3Ryb3B5KGUpe3RoaXMuX2FuaXNvdHJvcHk+MCE9ZT4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9hbmlzb3Ryb3B5PWV9Z2V0IGNsZWFyY29hdCgpe3JldHVybiB0aGlzLl9jbGVhcmNvYXR9c2V0IGNsZWFyY29hdChlKXt0aGlzLl9jbGVhcmNvYXQ+MCE9ZT4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9jbGVhcmNvYXQ9ZX1nZXQgaXJpZGVzY2VuY2UoKXtyZXR1cm4gdGhpcy5faXJpZGVzY2VuY2V9c2V0IGlyaWRlc2NlbmNlKGUpe3RoaXMuX2lyaWRlc2NlbmNlPjAhPWU+MCYmdGhpcy52ZXJzaW9uKyssdGhpcy5faXJpZGVzY2VuY2U9ZX1nZXQgc2hlZW4oKXtyZXR1cm4gdGhpcy5fc2hlZW59c2V0IHNoZWVuKGUpe3RoaXMuX3NoZWVuPjAhPWU+MCYmdGhpcy52ZXJzaW9uKyssdGhpcy5fc2hlZW49ZX1nZXQgdHJhbnNtaXNzaW9uKCl7cmV0dXJuIHRoaXMuX3RyYW5zbWlzc2lvbn1zZXQgdHJhbnNtaXNzaW9uKGUpe3RoaXMuX3RyYW5zbWlzc2lvbj4wIT1lPjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX3RyYW5zbWlzc2lvbj1lfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn0sdGhpcy5hbmlzb3Ryb3B5PWUuYW5pc290cm9weSx0aGlzLmFuaXNvdHJvcHlSb3RhdGlvbj1lLmFuaXNvdHJvcHlSb3RhdGlvbix0aGlzLmFuaXNvdHJvcHlNYXA9ZS5hbmlzb3Ryb3B5TWFwLHRoaXMuY2xlYXJjb2F0PWUuY2xlYXJjb2F0LHRoaXMuY2xlYXJjb2F0TWFwPWUuY2xlYXJjb2F0TWFwLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzPWUuY2xlYXJjb2F0Um91Z2huZXNzLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwPWUuY2xlYXJjb2F0Um91Z2huZXNzTWFwLHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPWUuY2xlYXJjb2F0Tm9ybWFsTWFwLHRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUuY29weShlLmNsZWFyY29hdE5vcm1hbFNjYWxlKSx0aGlzLmlvcj1lLmlvcix0aGlzLmlyaWRlc2NlbmNlPWUuaXJpZGVzY2VuY2UsdGhpcy5pcmlkZXNjZW5jZU1hcD1lLmlyaWRlc2NlbmNlTWFwLHRoaXMuaXJpZGVzY2VuY2VJT1I9ZS5pcmlkZXNjZW5jZUlPUix0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2U9Wy4uLmUuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZV0sdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD1lLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLHRoaXMuc2hlZW49ZS5zaGVlbix0aGlzLnNoZWVuQ29sb3IuY29weShlLnNoZWVuQ29sb3IpLHRoaXMuc2hlZW5Db2xvck1hcD1lLnNoZWVuQ29sb3JNYXAsdGhpcy5zaGVlblJvdWdobmVzcz1lLnNoZWVuUm91Z2huZXNzLHRoaXMuc2hlZW5Sb3VnaG5lc3NNYXA9ZS5zaGVlblJvdWdobmVzc01hcCx0aGlzLnRyYW5zbWlzc2lvbj1lLnRyYW5zbWlzc2lvbix0aGlzLnRyYW5zbWlzc2lvbk1hcD1lLnRyYW5zbWlzc2lvbk1hcCx0aGlzLnRoaWNrbmVzcz1lLnRoaWNrbmVzcyx0aGlzLnRoaWNrbmVzc01hcD1lLnRoaWNrbmVzc01hcCx0aGlzLmF0dGVudWF0aW9uRGlzdGFuY2U9ZS5hdHRlbnVhdGlvbkRpc3RhbmNlLHRoaXMuYXR0ZW51YXRpb25Db2xvci5jb3B5KGUuYXR0ZW51YXRpb25Db2xvciksdGhpcy5zcGVjdWxhckludGVuc2l0eT1lLnNwZWN1bGFySW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXA9ZS5zcGVjdWxhckludGVuc2l0eU1hcCx0aGlzLnNwZWN1bGFyQ29sb3IuY29weShlLnNwZWN1bGFyQ29sb3IpLHRoaXMuc3BlY3VsYXJDb2xvck1hcD1lLnNwZWN1bGFyQ29sb3JNYXAsdGhpc319Y2xhc3Mgdm0gZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNNZXNoUGhvbmdNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hQaG9uZ01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5ZSgxNjc3NzIxNSksdGhpcy5zcGVjdWxhcj1uZXcgeWUoMTExODQ4MSksdGhpcy5zaGluaW5lc3M9MzAsdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZT1uZXcgeWUoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPXdpLHRoaXMubm9ybWFsU2NhbGU9bmV3IHEoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5jb21iaW5lPVNzLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXMoZSl9Y29weShlKXtyZXR1cm4gc3VwZXIuY29weShlKSx0aGlzLmNvbG9yLmNvcHkoZS5jb2xvciksdGhpcy5zcGVjdWxhci5jb3B5KGUuc3BlY3VsYXIpLHRoaXMuc2hpbmluZXNzPWUuc2hpbmluZXNzLHRoaXMubWFwPWUubWFwLHRoaXMubGlnaHRNYXA9ZS5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PWUubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD1lLmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9ZS5hb01hcEludGVuc2l0eSx0aGlzLmVtaXNzaXZlLmNvcHkoZS5lbWlzc2l2ZSksdGhpcy5lbWlzc2l2ZU1hcD1lLmVtaXNzaXZlTWFwLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9ZS5lbWlzc2l2ZUludGVuc2l0eSx0aGlzLmJ1bXBNYXA9ZS5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPWUuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPWUubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT1lLm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KGUubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPWUuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9ZS5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9ZS5kaXNwbGFjZW1lbnRCaWFzLHRoaXMuc3BlY3VsYXJNYXA9ZS5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPWUuYWxwaGFNYXAsdGhpcy5lbnZNYXA9ZS5lbnZNYXAsdGhpcy5jb21iaW5lPWUuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT1lLnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz1lLnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT1lLndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1lLndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9ZS53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49ZS53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZsYXRTaGFkaW5nPWUuZmxhdFNoYWRpbmcsdGhpcy5mb2c9ZS5mb2csdGhpc319Y2xhc3MgTW0gZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNNZXNoVG9vbk1hdGVyaWFsPSEwLHRoaXMuZGVmaW5lcz17VE9PTjoiIn0sdGhpcy50eXBlPSJNZXNoVG9vbk1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyB5ZSgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmdyYWRpZW50TWFwPW51bGwsdGhpcy5saWdodE1hcD1udWxsLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9MSx0aGlzLmFvTWFwPW51bGwsdGhpcy5hb01hcEludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmU9bmV3IHllKDApLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlTWFwPW51bGwsdGhpcy5idW1wTWFwPW51bGwsdGhpcy5idW1wU2NhbGU9MSx0aGlzLm5vcm1hbE1hcD1udWxsLHRoaXMubm9ybWFsTWFwVHlwZT13aSx0aGlzLm5vcm1hbFNjYWxlPW5ldyBxKDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKGUpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5jb2xvci5jb3B5KGUuY29sb3IpLHRoaXMubWFwPWUubWFwLHRoaXMuZ3JhZGllbnRNYXA9ZS5ncmFkaWVudE1hcCx0aGlzLmxpZ2h0TWFwPWUubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT1lLmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9ZS5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PWUuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KGUuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9ZS5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PWUuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPWUuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT1lLmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD1lLm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9ZS5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weShlLm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1lLmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWUuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPWUuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLmFscGhhTWFwPWUuYWxwaGFNYXAsdGhpcy53aXJlZnJhbWU9ZS53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9ZS53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPWUud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPWUud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mb2c9ZS5mb2csdGhpc319Y2xhc3MgU20gZXh0ZW5kcyBIdHtjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMuaXNNZXNoTm9ybWFsTWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJNZXNoTm9ybWFsTWF0ZXJpYWwiLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9d2ksdGhpcy5ub3JtYWxTY2FsZT1uZXcgcSgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuYnVtcE1hcD1lLmJ1bXBNYXAsdGhpcy5idW1wU2NhbGU9ZS5idW1wU2NhbGUsdGhpcy5ub3JtYWxNYXA9ZS5ub3JtYWxNYXAsdGhpcy5ub3JtYWxNYXBUeXBlPWUubm9ybWFsTWFwVHlwZSx0aGlzLm5vcm1hbFNjYWxlLmNvcHkoZS5ub3JtYWxTY2FsZSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9ZS5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1lLmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz1lLmRpc3BsYWNlbWVudEJpYXMsdGhpcy53aXJlZnJhbWU9ZS53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9ZS53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy5mbGF0U2hhZGluZz1lLmZsYXRTaGFkaW5nLHRoaXN9fWNsYXNzIGJtIGV4dGVuZHMgSHR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzTWVzaExhbWJlcnRNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hMYW1iZXJ0TWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHllKDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyB5ZSgwKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZU1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9d2ksdGhpcy5ub3JtYWxTY2FsZT1uZXcgcSgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMuc3BlY3VsYXJNYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5lbnZNYXA9bnVsbCx0aGlzLmNvbWJpbmU9U3MsdGhpcy5yZWZsZWN0aXZpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuY29sb3IuY29weShlLmNvbG9yKSx0aGlzLm1hcD1lLm1hcCx0aGlzLmxpZ2h0TWFwPWUubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT1lLmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9ZS5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PWUuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KGUuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9ZS5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PWUuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPWUuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT1lLmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD1lLm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9ZS5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weShlLm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1lLmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWUuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPWUuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLnNwZWN1bGFyTWFwPWUuc3BlY3VsYXJNYXAsdGhpcy5hbHBoYU1hcD1lLmFscGhhTWFwLHRoaXMuZW52TWFwPWUuZW52TWFwLHRoaXMuY29tYmluZT1lLmNvbWJpbmUsdGhpcy5yZWZsZWN0aXZpdHk9ZS5yZWZsZWN0aXZpdHksdGhpcy5yZWZyYWN0aW9uUmF0aW89ZS5yZWZyYWN0aW9uUmF0aW8sdGhpcy53aXJlZnJhbWU9ZS53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9ZS53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPWUud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPWUud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mbGF0U2hhZGluZz1lLmZsYXRTaGFkaW5nLHRoaXMuZm9nPWUuZm9nLHRoaXN9fWNsYXNzIHdtIGV4dGVuZHMgSHR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzTWVzaE1hdGNhcE1hdGVyaWFsPSEwLHRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifSx0aGlzLnR5cGU9Ik1lc2hNYXRjYXBNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgeWUoMTY3NzcyMTUpLHRoaXMubWF0Y2FwPW51bGwsdGhpcy5tYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPXdpLHRoaXMubm9ybWFsU2NhbGU9bmV3IHEoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifSx0aGlzLmNvbG9yLmNvcHkoZS5jb2xvciksdGhpcy5tYXRjYXA9ZS5tYXRjYXAsdGhpcy5tYXA9ZS5tYXAsdGhpcy5idW1wTWFwPWUuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT1lLmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD1lLm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9ZS5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weShlLm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1lLmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWUuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPWUuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLmFscGhhTWFwPWUuYWxwaGFNYXAsdGhpcy5mbGF0U2hhZGluZz1lLmZsYXRTaGFkaW5nLHRoaXMuZm9nPWUuZm9nLHRoaXN9fWNsYXNzIEVtIGV4dGVuZHMgS3R7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLmlzTGluZURhc2hlZE1hdGVyaWFsPSEwLHRoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIix0aGlzLnNjYWxlPTEsdGhpcy5kYXNoU2l6ZT0zLHRoaXMuZ2FwU2l6ZT0xLHRoaXMuc2V0VmFsdWVzKGUpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSksdGhpcy5zY2FsZT1lLnNjYWxlLHRoaXMuZGFzaFNpemU9ZS5kYXNoU2l6ZSx0aGlzLmdhcFNpemU9ZS5nYXBTaXplLHRoaXN9fWZ1bmN0aW9uIG5yKHIsZSx0KXtyZXR1cm4hcnx8IXQmJnIuY29uc3RydWN0b3I9PT1lP3I6dHlwZW9mIGUuQllURVNfUEVSX0VMRU1FTlQ9PSJudW1iZXIiP25ldyBlKHIpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHIpfWZ1bmN0aW9uIEFtKHIpe3JldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcocikmJiEociBpbnN0YW5jZW9mIERhdGFWaWV3KX1mdW5jdGlvbiBUbShyKXtmdW5jdGlvbiBlKGkscyl7cmV0dXJuIHJbaV0tcltzXX1jb25zdCB0PXIubGVuZ3RoLG49bmV3IEFycmF5KHQpO2ZvcihsZXQgaT0wO2khPT10OysraSluW2ldPWk7cmV0dXJuIG4uc29ydChlKSxufWZ1bmN0aW9uIGl1KHIsZSx0KXtjb25zdCBuPXIubGVuZ3RoLGk9bmV3IHIuY29uc3RydWN0b3Iobik7Zm9yKGxldCBzPTAsYT0wO2EhPT1uOysrcyl7Y29uc3Qgbz10W3NdKmU7Zm9yKGxldCBsPTA7bCE9PWU7KytsKWlbYSsrXT1yW28rbF19cmV0dXJuIGl9ZnVuY3Rpb24gcnUocixlLHQsbil7bGV0IGk9MSxzPXJbMF07Zm9yKDtzIT09dm9pZCAwJiZzW25dPT09dm9pZCAwOylzPXJbaSsrXTtpZihzPT09dm9pZCAwKXJldHVybjtsZXQgYT1zW25dO2lmKGEhPT12b2lkIDApaWYoQXJyYXkuaXNBcnJheShhKSlkbyBhPXNbbl0sYSE9PXZvaWQgMCYmKGUucHVzaChzLnRpbWUpLHQucHVzaC5hcHBseSh0LGEpKSxzPXJbaSsrXTt3aGlsZShzIT09dm9pZCAwKTtlbHNlIGlmKGEudG9BcnJheSE9PXZvaWQgMClkbyBhPXNbbl0sYSE9PXZvaWQgMCYmKGUucHVzaChzLnRpbWUpLGEudG9BcnJheSh0LHQubGVuZ3RoKSkscz1yW2krK107d2hpbGUocyE9PXZvaWQgMCk7ZWxzZSBkbyBhPXNbbl0sYSE9PXZvaWQgMCYmKGUucHVzaChzLnRpbWUpLHQucHVzaChhKSkscz1yW2krK107d2hpbGUocyE9PXZvaWQgMCl9ZnVuY3Rpb24gZGIocixlLHQsbixpPTMwKXtjb25zdCBzPXIuY2xvbmUoKTtzLm5hbWU9ZTtjb25zdCBhPVtdO2ZvcihsZXQgbD0wO2w8cy50cmFja3MubGVuZ3RoOysrbCl7Y29uc3QgYz1zLnRyYWNrc1tsXSxoPWMuZ2V0VmFsdWVTaXplKCksdT1bXSxmPVtdO2ZvcihsZXQgZD0wO2Q8Yy50aW1lcy5sZW5ndGg7KytkKXtjb25zdCBwPWMudGltZXNbZF0qaTtpZighKHA8dHx8cD49bikpe3UucHVzaChjLnRpbWVzW2RdKTtmb3IobGV0IF89MDtfPGg7KytfKWYucHVzaChjLnZhbHVlc1tkKmgrX10pfX11Lmxlbmd0aCE9PTAmJihjLnRpbWVzPW5yKHUsYy50aW1lcy5jb25zdHJ1Y3RvciksYy52YWx1ZXM9bnIoZixjLnZhbHVlcy5jb25zdHJ1Y3RvciksYS5wdXNoKGMpKX1zLnRyYWNrcz1hO2xldCBvPTEvMDtmb3IobGV0IGw9MDtsPHMudHJhY2tzLmxlbmd0aDsrK2wpbz5zLnRyYWNrc1tsXS50aW1lc1swXSYmKG89cy50cmFja3NbbF0udGltZXNbMF0pO2ZvcihsZXQgbD0wO2w8cy50cmFja3MubGVuZ3RoOysrbClzLnRyYWNrc1tsXS5zaGlmdCgtMSpvKTtyZXR1cm4gcy5yZXNldER1cmF0aW9uKCksc31mdW5jdGlvbiBwYihyLGU9MCx0PXIsbj0zMCl7bjw9MCYmKG49MzApO2NvbnN0IGk9dC50cmFja3MubGVuZ3RoLHM9ZS9uO2ZvcihsZXQgYT0wO2E8aTsrK2Epe2NvbnN0IG89dC50cmFja3NbYV0sbD1vLlZhbHVlVHlwZU5hbWU7aWYobD09PSJib29sInx8bD09PSJzdHJpbmciKWNvbnRpbnVlO2NvbnN0IGM9ci50cmFja3MuZmluZChmdW5jdGlvbihtKXtyZXR1cm4gbS5uYW1lPT09by5uYW1lJiZtLlZhbHVlVHlwZU5hbWU9PT1sfSk7aWYoYz09PXZvaWQgMCljb250aW51ZTtsZXQgaD0wO2NvbnN0IHU9by5nZXRWYWx1ZVNpemUoKTtvLmNyZWF0ZUludGVycG9sYW50LmlzSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kR0xURkN1YmljU3BsaW5lJiYoaD11LzMpO2xldCBmPTA7Y29uc3QgZD1jLmdldFZhbHVlU2l6ZSgpO2MuY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUmJihmPWQvMyk7Y29uc3QgcD1vLnRpbWVzLmxlbmd0aC0xO2xldCBfO2lmKHM8PW8udGltZXNbMF0pe2NvbnN0IG09aCx5PXUtaDtfPW8udmFsdWVzLnNsaWNlKG0seSl9ZWxzZSBpZihzPj1vLnRpbWVzW3BdKXtjb25zdCBtPXAqdStoLHk9bSt1LWg7Xz1vLnZhbHVlcy5zbGljZShtLHkpfWVsc2V7Y29uc3QgbT1vLmNyZWF0ZUludGVycG9sYW50KCkseT1oLHg9dS1oO20uZXZhbHVhdGUocyksXz1tLnJlc3VsdEJ1ZmZlci5zbGljZSh5LHgpfWw9PT0icXVhdGVybmlvbiImJm5ldyBsbigpLmZyb21BcnJheShfKS5ub3JtYWxpemUoKS5jb25qdWdhdGUoKS50b0FycmF5KF8pO2NvbnN0IGc9Yy50aW1lcy5sZW5ndGg7Zm9yKGxldCBtPTA7bTxnOysrbSl7Y29uc3QgeT1tKmQrZjtpZihsPT09InF1YXRlcm5pb24iKWxuLm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KGMudmFsdWVzLHksXywwLGMudmFsdWVzLHkpO2Vsc2V7Y29uc3QgeD1kLWYqMjtmb3IobGV0IHY9MDt2PHg7Kyt2KWMudmFsdWVzW3krdl0tPV9bdl19fX1yZXR1cm4gci5ibGVuZE1vZGU9WWMscn1jb25zdCBtYj17Y29udmVydEFycmF5Om5yLGlzVHlwZWRBcnJheTpBbSxnZXRLZXlmcmFtZU9yZGVyOlRtLHNvcnRlZEFycmF5Oml1LGZsYXR0ZW5KU09OOnJ1LHN1YmNsaXA6ZGIsbWFrZUNsaXBBZGRpdGl2ZTpwYn07Y2xhc3MgaGF7Y29uc3RydWN0b3IoZSx0LG4saSl7dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM9ZSx0aGlzLl9jYWNoZWRJbmRleD0wLHRoaXMucmVzdWx0QnVmZmVyPWkhPT12b2lkIDA/aTpuZXcgdC5jb25zdHJ1Y3RvcihuKSx0aGlzLnNhbXBsZVZhbHVlcz10LHRoaXMudmFsdWVTaXplPW4sdGhpcy5zZXR0aW5ncz1udWxsLHRoaXMuRGVmYXVsdFNldHRpbmdzXz17fX1ldmFsdWF0ZShlKXtjb25zdCB0PXRoaXMucGFyYW1ldGVyUG9zaXRpb25zO2xldCBuPXRoaXMuX2NhY2hlZEluZGV4LGk9dFtuXSxzPXRbbi0xXTtlOnt0OntsZXQgYTtuOntpOmlmKCEoZTxpKSl7Zm9yKGxldCBvPW4rMjs7KXtpZihpPT09dm9pZCAwKXtpZihlPHMpYnJlYWsgaTtyZXR1cm4gbj10Lmxlbmd0aCx0aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuY29weVNhbXBsZVZhbHVlXyhuLTEpfWlmKG49PT1vKWJyZWFrO2lmKHM9aSxpPXRbKytuXSxlPGkpYnJlYWsgdH1hPXQubGVuZ3RoO2JyZWFrIG59aWYoIShlPj1zKSl7Y29uc3Qgbz10WzFdO2U8byYmKG49MixzPW8pO2ZvcihsZXQgbD1uLTI7Oyl7aWYocz09PXZvaWQgMClyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oMCk7aWYobj09PWwpYnJlYWs7aWYoaT1zLHM9dFstLW4tMV0sZT49cylicmVhayB0fWE9bixuPTA7YnJlYWsgbn1icmVhayBlfWZvcig7bjxhOyl7Y29uc3Qgbz1uK2E+Pj4xO2U8dFtvXT9hPW86bj1vKzF9aWYoaT10W25dLHM9dFtuLTFdLHM9PT12b2lkIDApcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5jb3B5U2FtcGxlVmFsdWVfKDApO2lmKGk9PT12b2lkIDApcmV0dXJuIG49dC5sZW5ndGgsdGhpcy5fY2FjaGVkSW5kZXg9bix0aGlzLmNvcHlTYW1wbGVWYWx1ZV8obi0xKX10aGlzLl9jYWNoZWRJbmRleD1uLHRoaXMuaW50ZXJ2YWxDaGFuZ2VkXyhuLHMsaSl9cmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKG4scyxlLGkpfWdldFNldHRpbmdzXygpe3JldHVybiB0aGlzLnNldHRpbmdzfHx0aGlzLkRlZmF1bHRTZXR0aW5nc199Y29weVNhbXBsZVZhbHVlXyhlKXtjb25zdCB0PXRoaXMucmVzdWx0QnVmZmVyLG49dGhpcy5zYW1wbGVWYWx1ZXMsaT10aGlzLnZhbHVlU2l6ZSxzPWUqaTtmb3IobGV0IGE9MDthIT09aTsrK2EpdFthXT1uW3MrYV07cmV0dXJuIHR9aW50ZXJwb2xhdGVfKCl7dGhyb3cgbmV3IEVycm9yKCJjYWxsIHRvIGFic3RyYWN0IG1ldGhvZCIpfWludGVydmFsQ2hhbmdlZF8oKXt9fWNsYXNzIENtIGV4dGVuZHMgaGF7Y29uc3RydWN0b3IoZSx0LG4saSl7c3VwZXIoZSx0LG4saSksdGhpcy5fd2VpZ2h0UHJldj0tMCx0aGlzLl9vZmZzZXRQcmV2PS0wLHRoaXMuX3dlaWdodE5leHQ9LTAsdGhpcy5fb2Zmc2V0TmV4dD0tMCx0aGlzLkRlZmF1bHRTZXR0aW5nc189e2VuZGluZ1N0YXJ0OmtpLGVuZGluZ0VuZDpraX19aW50ZXJ2YWxDaGFuZ2VkXyhlLHQsbil7Y29uc3QgaT10aGlzLnBhcmFtZXRlclBvc2l0aW9ucztsZXQgcz1lLTIsYT1lKzEsbz1pW3NdLGw9aVthXTtpZihvPT09dm9pZCAwKXN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0KXtjYXNlIEdpOnM9ZSxvPTIqdC1uO2JyZWFrO2Nhc2UgUHM6cz1pLmxlbmd0aC0yLG89dCtpW3NdLWlbcysxXTticmVhaztkZWZhdWx0OnM9ZSxvPW59aWYobD09PXZvaWQgMClzd2l0Y2godGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQpe2Nhc2UgR2k6YT1lLGw9MipuLXQ7YnJlYWs7Y2FzZSBQczphPTEsbD1uK2lbMV0taVswXTticmVhaztkZWZhdWx0OmE9ZS0xLGw9dH1jb25zdCBjPShuLXQpKi41LGg9dGhpcy52YWx1ZVNpemU7dGhpcy5fd2VpZ2h0UHJldj1jLyh0LW8pLHRoaXMuX3dlaWdodE5leHQ9Yy8obC1uKSx0aGlzLl9vZmZzZXRQcmV2PXMqaCx0aGlzLl9vZmZzZXROZXh0PWEqaH1pbnRlcnBvbGF0ZV8oZSx0LG4saSl7Y29uc3Qgcz10aGlzLnJlc3VsdEJ1ZmZlcixhPXRoaXMuc2FtcGxlVmFsdWVzLG89dGhpcy52YWx1ZVNpemUsbD1lKm8sYz1sLW8saD10aGlzLl9vZmZzZXRQcmV2LHU9dGhpcy5fb2Zmc2V0TmV4dCxmPXRoaXMuX3dlaWdodFByZXYsZD10aGlzLl93ZWlnaHROZXh0LHA9KG4tdCkvKGktdCksXz1wKnAsZz1fKnAsbT0tZipnKzIqZipfLWYqcCx5PSgxK2YpKmcrKC0xLjUtMipmKSpfKygtLjUrZikqcCsxLHg9KC0xLWQpKmcrKDEuNStkKSpfKy41KnAsdj1kKmctZCpfO2ZvcihsZXQgUz0wO1MhPT1vOysrUylzW1NdPW0qYVtoK1NdK3kqYVtjK1NdK3gqYVtsK1NdK3YqYVt1K1NdO3JldHVybiBzfX1jbGFzcyBzdSBleHRlbmRzIGhhe2NvbnN0cnVjdG9yKGUsdCxuLGkpe3N1cGVyKGUsdCxuLGkpfWludGVycG9sYXRlXyhlLHQsbixpKXtjb25zdCBzPXRoaXMucmVzdWx0QnVmZmVyLGE9dGhpcy5zYW1wbGVWYWx1ZXMsbz10aGlzLnZhbHVlU2l6ZSxsPWUqbyxjPWwtbyxoPShuLXQpLyhpLXQpLHU9MS1oO2ZvcihsZXQgZj0wO2YhPT1vOysrZilzW2ZdPWFbYytmXSp1K2FbbCtmXSpoO3JldHVybiBzfX1jbGFzcyBSbSBleHRlbmRzIGhhe2NvbnN0cnVjdG9yKGUsdCxuLGkpe3N1cGVyKGUsdCxuLGkpfWludGVycG9sYXRlXyhlKXtyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKGUtMSl9fWNsYXNzIE9ue2NvbnN0cnVjdG9yKGUsdCxuLGkpe2lmKGU9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayBuYW1lIGlzIHVuZGVmaW5lZCIpO2lmKHQ9PT12b2lkIDB8fHQubGVuZ3RoPT09MCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IG5vIGtleWZyYW1lcyBpbiB0cmFjayBuYW1lZCAiK2UpO3RoaXMubmFtZT1lLHRoaXMudGltZXM9bnIodCx0aGlzLlRpbWVCdWZmZXJUeXBlKSx0aGlzLnZhbHVlcz1ucihuLHRoaXMuVmFsdWVCdWZmZXJUeXBlKSx0aGlzLnNldEludGVycG9sYXRpb24oaXx8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9c3RhdGljIHRvSlNPTihlKXtjb25zdCB0PWUuY29uc3RydWN0b3I7bGV0IG47aWYodC50b0pTT04hPT10aGlzLnRvSlNPTiluPXQudG9KU09OKGUpO2Vsc2V7bj17bmFtZTplLm5hbWUsdGltZXM6bnIoZS50aW1lcyxBcnJheSksdmFsdWVzOm5yKGUudmFsdWVzLEFycmF5KX07Y29uc3QgaT1lLmdldEludGVycG9sYXRpb24oKTtpIT09ZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiYmKG4uaW50ZXJwb2xhdGlvbj1pKX1yZXR1cm4gbi50eXBlPWUuVmFsdWVUeXBlTmFtZSxufUludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlKGUpe3JldHVybiBuZXcgUm0odGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGUpfUludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcihlKXtyZXR1cm4gbmV3IHN1KHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSxlKX1JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGgoZSl7cmV0dXJuIG5ldyBDbSh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksZSl9c2V0SW50ZXJwb2xhdGlvbihlKXtsZXQgdDtzd2l0Y2goZSl7Y2FzZSBDczp0PXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU7YnJlYWs7Y2FzZSBSczp0PXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyO2JyZWFrO2Nhc2UgV2E6dD10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDticmVha31pZih0PT09dm9pZCAwKXtjb25zdCBuPSJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAiK3RoaXMuVmFsdWVUeXBlTmFtZSsiIGtleWZyYW1lIHRyYWNrIG5hbWVkICIrdGhpcy5uYW1lO2lmKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ9PT12b2lkIDApaWYoZSE9PXRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pdGhpcy5zZXRJbnRlcnBvbGF0aW9uKHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pO2Vsc2UgdGhyb3cgbmV3IEVycm9yKG4pO3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLktleWZyYW1lVHJhY2s6IixuKSx0aGlzfXJldHVybiB0aGlzLmNyZWF0ZUludGVycG9sYW50PXQsdGhpc31nZXRJbnRlcnBvbGF0aW9uKCl7c3dpdGNoKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpe2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpyZXR1cm4gQ3M7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpyZXR1cm4gUnM7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpyZXR1cm4gV2F9fWdldFZhbHVlU2l6ZSgpe3JldHVybiB0aGlzLnZhbHVlcy5sZW5ndGgvdGhpcy50aW1lcy5sZW5ndGh9c2hpZnQoZSl7aWYoZSE9PTApe2NvbnN0IHQ9dGhpcy50aW1lcztmb3IobGV0IG49MCxpPXQubGVuZ3RoO24hPT1pOysrbil0W25dKz1lfXJldHVybiB0aGlzfXNjYWxlKGUpe2lmKGUhPT0xKXtjb25zdCB0PXRoaXMudGltZXM7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuIT09aTsrK24pdFtuXSo9ZX1yZXR1cm4gdGhpc310cmltKGUsdCl7Y29uc3Qgbj10aGlzLnRpbWVzLGk9bi5sZW5ndGg7bGV0IHM9MCxhPWktMTtmb3IoO3MhPT1pJiZuW3NdPGU7KSsrcztmb3IoO2EhPT0tMSYmblthXT50OyktLWE7aWYoKythLHMhPT0wfHxhIT09aSl7cz49YSYmKGE9TWF0aC5tYXgoYSwxKSxzPWEtMSk7Y29uc3Qgbz10aGlzLmdldFZhbHVlU2l6ZSgpO3RoaXMudGltZXM9bi5zbGljZShzLGEpLHRoaXMudmFsdWVzPXRoaXMudmFsdWVzLnNsaWNlKHMqbyxhKm8pfXJldHVybiB0aGlzfXZhbGlkYXRlKCl7bGV0IGU9ITA7Y29uc3QgdD10aGlzLmdldFZhbHVlU2l6ZSgpO3QtTWF0aC5mbG9vcih0KSE9PTAmJihjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBJbnZhbGlkIHZhbHVlIHNpemUgaW4gdHJhY2suIix0aGlzKSxlPSExKTtjb25zdCBuPXRoaXMudGltZXMsaT10aGlzLnZhbHVlcyxzPW4ubGVuZ3RoO3M9PT0wJiYoY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuIix0aGlzKSxlPSExKTtsZXQgYT1udWxsO2ZvcihsZXQgbz0wO28hPT1zO28rKyl7Y29uc3QgbD1uW29dO2lmKHR5cGVvZiBsPT0ibnVtYmVyIiYmaXNOYU4obCkpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFRpbWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsdGhpcyxvLGwpLGU9ITE7YnJlYWt9aWYoYSE9PW51bGwmJmE+bCl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogT3V0IG9mIG9yZGVyIGtleXMuIix0aGlzLG8sbCxhKSxlPSExO2JyZWFrfWE9bH1pZihpIT09dm9pZCAwJiZBbShpKSlmb3IobGV0IG89MCxsPWkubGVuZ3RoO28hPT1sOysrbyl7Y29uc3QgYz1pW29dO2lmKGlzTmFOKGMpKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBWYWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuIix0aGlzLG8sYyksZT0hMTticmVha319cmV0dXJuIGV9b3B0aW1pemUoKXtjb25zdCBlPXRoaXMudGltZXMuc2xpY2UoKSx0PXRoaXMudmFsdWVzLnNsaWNlKCksbj10aGlzLmdldFZhbHVlU2l6ZSgpLGk9dGhpcy5nZXRJbnRlcnBvbGF0aW9uKCk9PT1XYSxzPWUubGVuZ3RoLTE7bGV0IGE9MTtmb3IobGV0IG89MTtvPHM7KytvKXtsZXQgbD0hMTtjb25zdCBjPWVbb10saD1lW28rMV07aWYoYyE9PWgmJihvIT09MXx8YyE9PWVbMF0pKWlmKGkpbD0hMDtlbHNle2NvbnN0IHU9bypuLGY9dS1uLGQ9dStuO2ZvcihsZXQgcD0wO3AhPT1uOysrcCl7Y29uc3QgXz10W3UrcF07aWYoXyE9PXRbZitwXXx8XyE9PXRbZCtwXSl7bD0hMDticmVha319fWlmKGwpe2lmKG8hPT1hKXtlW2FdPWVbb107Y29uc3QgdT1vKm4sZj1hKm47Zm9yKGxldCBkPTA7ZCE9PW47KytkKXRbZitkXT10W3UrZF19KythfX1pZihzPjApe2VbYV09ZVtzXTtmb3IobGV0IG89cypuLGw9YSpuLGM9MDtjIT09bjsrK2MpdFtsK2NdPXRbbytjXTsrK2F9cmV0dXJuIGEhPT1lLmxlbmd0aD8odGhpcy50aW1lcz1lLnNsaWNlKDAsYSksdGhpcy52YWx1ZXM9dC5zbGljZSgwLGEqbikpOih0aGlzLnRpbWVzPWUsdGhpcy52YWx1ZXM9dCksdGhpc31jbG9uZSgpe2NvbnN0IGU9dGhpcy50aW1lcy5zbGljZSgpLHQ9dGhpcy52YWx1ZXMuc2xpY2UoKSxuPXRoaXMuY29uc3RydWN0b3IsaT1uZXcgbih0aGlzLm5hbWUsZSx0KTtyZXR1cm4gaS5jcmVhdGVJbnRlcnBvbGFudD10aGlzLmNyZWF0ZUludGVycG9sYW50LGl9fU9uLnByb3RvdHlwZS5UaW1lQnVmZmVyVHlwZT1GbG9hdDMyQXJyYXksT24ucHJvdG90eXBlLlZhbHVlQnVmZmVyVHlwZT1GbG9hdDMyQXJyYXksT24ucHJvdG90eXBlLkRlZmF1bHRJbnRlcnBvbGF0aW9uPVJzO2NsYXNzIGlyIGV4dGVuZHMgT257fWlyLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJib29sIixpci5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUFycmF5LGlyLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj1Dcyxpci5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyPXZvaWQgMCxpci5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoPXZvaWQgMDtjbGFzcyBhdSBleHRlbmRzIE9ue31hdS5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0iY29sb3IiO2NsYXNzIHVhIGV4dGVuZHMgT257fXVhLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJudW1iZXIiO2NsYXNzIFBtIGV4dGVuZHMgaGF7Y29uc3RydWN0b3IoZSx0LG4saSl7c3VwZXIoZSx0LG4saSl9aW50ZXJwb2xhdGVfKGUsdCxuLGkpe2NvbnN0IHM9dGhpcy5yZXN1bHRCdWZmZXIsYT10aGlzLnNhbXBsZVZhbHVlcyxvPXRoaXMudmFsdWVTaXplLGw9KG4tdCkvKGktdCk7bGV0IGM9ZSpvO2ZvcihsZXQgaD1jK287YyE9PWg7Yys9NClsbi5zbGVycEZsYXQocywwLGEsYy1vLGEsYyxsKTtyZXR1cm4gc319Y2xhc3MgcnMgZXh0ZW5kcyBPbntJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIoZSl7cmV0dXJuIG5ldyBQbSh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksZSl9fXJzLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJxdWF0ZXJuaW9uIixycy5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249UnMscnMucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aD12b2lkIDA7Y2xhc3MgcnIgZXh0ZW5kcyBPbnt9cnIucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9InN0cmluZyIscnIucHJvdG90eXBlLlZhbHVlQnVmZmVyVHlwZT1BcnJheSxyci5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249Q3MscnIucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcj12b2lkIDAscnIucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aD12b2lkIDA7Y2xhc3MgZmEgZXh0ZW5kcyBPbnt9ZmEucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9InZlY3RvciI7Y2xhc3MgZGF7Y29uc3RydWN0b3IoZSx0PS0xLG4saT1YYSl7dGhpcy5uYW1lPWUsdGhpcy50cmFja3M9bix0aGlzLmR1cmF0aW9uPXQsdGhpcy5ibGVuZE1vZGU9aSx0aGlzLnV1aWQ9X24oKSx0aGlzLmR1cmF0aW9uPDAmJnRoaXMucmVzZXREdXJhdGlvbigpfXN0YXRpYyBwYXJzZShlKXtjb25zdCB0PVtdLG49ZS50cmFja3MsaT0xLyhlLmZwc3x8MSk7Zm9yKGxldCBhPTAsbz1uLmxlbmd0aDthIT09bzsrK2EpdC5wdXNoKF9iKG5bYV0pLnNjYWxlKGkpKTtjb25zdCBzPW5ldyB0aGlzKGUubmFtZSxlLmR1cmF0aW9uLHQsZS5ibGVuZE1vZGUpO3JldHVybiBzLnV1aWQ9ZS51dWlkLHN9c3RhdGljIHRvSlNPTihlKXtjb25zdCB0PVtdLG49ZS50cmFja3MsaT17bmFtZTplLm5hbWUsZHVyYXRpb246ZS5kdXJhdGlvbix0cmFja3M6dCx1dWlkOmUudXVpZCxibGVuZE1vZGU6ZS5ibGVuZE1vZGV9O2ZvcihsZXQgcz0wLGE9bi5sZW5ndGg7cyE9PWE7KytzKXQucHVzaChPbi50b0pTT04obltzXSkpO3JldHVybiBpfXN0YXRpYyBDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZShlLHQsbixpKXtjb25zdCBzPXQubGVuZ3RoLGE9W107Zm9yKGxldCBvPTA7bzxzO28rKyl7bGV0IGw9W10sYz1bXTtsLnB1c2goKG8rcy0xKSVzLG8sKG8rMSklcyksYy5wdXNoKDAsMSwwKTtjb25zdCBoPVRtKGwpO2w9aXUobCwxLGgpLGM9aXUoYywxLGgpLCFpJiZsWzBdPT09MCYmKGwucHVzaChzKSxjLnB1c2goY1swXSkpLGEucHVzaChuZXcgdWEoIi5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIit0W29dLm5hbWUrIl0iLGwsYykuc2NhbGUoMS9uKSl9cmV0dXJuIG5ldyB0aGlzKGUsLTEsYSl9c3RhdGljIGZpbmRCeU5hbWUoZSx0KXtsZXQgbj1lO2lmKCFBcnJheS5pc0FycmF5KGUpKXtjb25zdCBpPWU7bj1pLmdlb21ldHJ5JiZpLmdlb21ldHJ5LmFuaW1hdGlvbnN8fGkuYW5pbWF0aW9uc31mb3IobGV0IGk9MDtpPG4ubGVuZ3RoO2krKylpZihuW2ldLm5hbWU9PT10KXJldHVybiBuW2ldO3JldHVybiBudWxsfXN0YXRpYyBDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlcyhlLHQsbil7Y29uc3QgaT17fSxzPS9eKFtcdy1dKj8pKFtcZF0rKSQvO2ZvcihsZXQgbz0wLGw9ZS5sZW5ndGg7bzxsO28rKyl7Y29uc3QgYz1lW29dLGg9Yy5uYW1lLm1hdGNoKHMpO2lmKGgmJmgubGVuZ3RoPjEpe2NvbnN0IHU9aFsxXTtsZXQgZj1pW3VdO2Z8fChpW3VdPWY9W10pLGYucHVzaChjKX19Y29uc3QgYT1bXTtmb3IoY29uc3QgbyBpbiBpKWEucHVzaCh0aGlzLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKG8saVtvXSx0LG4pKTtyZXR1cm4gYX1zdGF0aWMgcGFyc2VBbmltYXRpb24oZSx0KXtpZighZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uQ2xpcDogTm8gYW5pbWF0aW9uIGluIEpTT05Mb2FkZXIgZGF0YS4iKSxudWxsO2NvbnN0IG49ZnVuY3Rpb24odSxmLGQscCxfKXtpZihkLmxlbmd0aCE9PTApe2NvbnN0IGc9W10sbT1bXTtydShkLGcsbSxwKSxnLmxlbmd0aCE9PTAmJl8ucHVzaChuZXcgdShmLGcsbSkpfX0saT1bXSxzPWUubmFtZXx8ImRlZmF1bHQiLGE9ZS5mcHN8fDMwLG89ZS5ibGVuZE1vZGU7bGV0IGw9ZS5sZW5ndGh8fC0xO2NvbnN0IGM9ZS5oaWVyYXJjaHl8fFtdO2ZvcihsZXQgdT0wO3U8Yy5sZW5ndGg7dSsrKXtjb25zdCBmPWNbdV0ua2V5cztpZighKCFmfHxmLmxlbmd0aD09PTApKWlmKGZbMF0ubW9ycGhUYXJnZXRzKXtjb25zdCBkPXt9O2xldCBwO2ZvcihwPTA7cDxmLmxlbmd0aDtwKyspaWYoZltwXS5tb3JwaFRhcmdldHMpZm9yKGxldCBfPTA7XzxmW3BdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7XysrKWRbZltwXS5tb3JwaFRhcmdldHNbX11dPS0xO2Zvcihjb25zdCBfIGluIGQpe2NvbnN0IGc9W10sbT1bXTtmb3IobGV0IHk9MDt5IT09ZltwXS5tb3JwaFRhcmdldHMubGVuZ3RoOysreSl7Y29uc3QgeD1mW3BdO2cucHVzaCh4LnRpbWUpLG0ucHVzaCh4Lm1vcnBoVGFyZ2V0PT09Xz8xOjApfWkucHVzaChuZXcgdWEoIi5tb3JwaFRhcmdldEluZmx1ZW5jZVsiK18rIl0iLGcsbSkpfWw9ZC5sZW5ndGgqYX1lbHNle2NvbnN0IGQ9Ii5ib25lc1siK3RbdV0ubmFtZSsiXSI7bihmYSxkKyIucG9zaXRpb24iLGYsInBvcyIsaSksbihycyxkKyIucXVhdGVybmlvbiIsZiwicm90IixpKSxuKGZhLGQrIi5zY2FsZSIsZiwic2NsIixpKX19cmV0dXJuIGkubGVuZ3RoPT09MD9udWxsOm5ldyB0aGlzKHMsbCxpLG8pfXJlc2V0RHVyYXRpb24oKXtjb25zdCBlPXRoaXMudHJhY2tzO2xldCB0PTA7Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuIT09aTsrK24pe2NvbnN0IHM9dGhpcy50cmFja3Nbbl07dD1NYXRoLm1heCh0LHMudGltZXNbcy50aW1lcy5sZW5ndGgtMV0pfXJldHVybiB0aGlzLmR1cmF0aW9uPXQsdGhpc310cmltKCl7Zm9yKGxldCBlPTA7ZTx0aGlzLnRyYWNrcy5sZW5ndGg7ZSsrKXRoaXMudHJhY2tzW2VdLnRyaW0oMCx0aGlzLmR1cmF0aW9uKTtyZXR1cm4gdGhpc312YWxpZGF0ZSgpe2xldCBlPSEwO2ZvcihsZXQgdD0wO3Q8dGhpcy50cmFja3MubGVuZ3RoO3QrKyllPWUmJnRoaXMudHJhY2tzW3RdLnZhbGlkYXRlKCk7cmV0dXJuIGV9b3B0aW1pemUoKXtmb3IobGV0IGU9MDtlPHRoaXMudHJhY2tzLmxlbmd0aDtlKyspdGhpcy50cmFja3NbZV0ub3B0aW1pemUoKTtyZXR1cm4gdGhpc31jbG9uZSgpe2NvbnN0IGU9W107Zm9yKGxldCB0PTA7dDx0aGlzLnRyYWNrcy5sZW5ndGg7dCsrKWUucHVzaCh0aGlzLnRyYWNrc1t0XS5jbG9uZSgpKTtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5uYW1lLHRoaXMuZHVyYXRpb24sZSx0aGlzLmJsZW5kTW9kZSl9dG9KU09OKCl7cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9KU09OKHRoaXMpfX1mdW5jdGlvbiBnYihyKXtzd2l0Y2goci50b0xvd2VyQ2FzZSgpKXtjYXNlInNjYWxhciI6Y2FzZSJkb3VibGUiOmNhc2UiZmxvYXQiOmNhc2UibnVtYmVyIjpjYXNlImludGVnZXIiOnJldHVybiB1YTtjYXNlInZlY3RvciI6Y2FzZSJ2ZWN0b3IyIjpjYXNlInZlY3RvcjMiOmNhc2UidmVjdG9yNCI6cmV0dXJuIGZhO2Nhc2UiY29sb3IiOnJldHVybiBhdTtjYXNlInF1YXRlcm5pb24iOnJldHVybiBycztjYXNlImJvb2wiOmNhc2UiYm9vbGVhbiI6cmV0dXJuIGlyO2Nhc2Uic3RyaW5nIjpyZXR1cm4gcnJ9dGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIityKX1mdW5jdGlvbiBfYihyKXtpZihyLnR5cGU9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayB0eXBlIHVuZGVmaW5lZCwgY2FuIG5vdCBwYXJzZSIpO2NvbnN0IGU9Z2Ioci50eXBlKTtpZihyLnRpbWVzPT09dm9pZCAwKXtjb25zdCB0PVtdLG49W107cnUoci5rZXlzLHQsbiwidmFsdWUiKSxyLnRpbWVzPXQsci52YWx1ZXM9bn1yZXR1cm4gZS5wYXJzZSE9PXZvaWQgMD9lLnBhcnNlKHIpOm5ldyBlKHIubmFtZSxyLnRpbWVzLHIudmFsdWVzLHIuaW50ZXJwb2xhdGlvbil9Y29uc3Qgc3I9e2VuYWJsZWQ6ITEsZmlsZXM6e30sYWRkOmZ1bmN0aW9uKHIsZSl7dGhpcy5lbmFibGVkIT09ITEmJih0aGlzLmZpbGVzW3JdPWUpfSxnZXQ6ZnVuY3Rpb24ocil7aWYodGhpcy5lbmFibGVkIT09ITEpcmV0dXJuIHRoaXMuZmlsZXNbcl19LHJlbW92ZTpmdW5jdGlvbihyKXtkZWxldGUgdGhpcy5maWxlc1tyXX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmZpbGVzPXt9fX07Y2xhc3Mgb3V7Y29uc3RydWN0b3IoZSx0LG4pe2NvbnN0IGk9dGhpcztsZXQgcz0hMSxhPTAsbz0wLGw7Y29uc3QgYz1bXTt0aGlzLm9uU3RhcnQ9dm9pZCAwLHRoaXMub25Mb2FkPWUsdGhpcy5vblByb2dyZXNzPXQsdGhpcy5vbkVycm9yPW4sdGhpcy5pdGVtU3RhcnQ9ZnVuY3Rpb24oaCl7bysrLHM9PT0hMSYmaS5vblN0YXJ0IT09dm9pZCAwJiZpLm9uU3RhcnQoaCxhLG8pLHM9ITB9LHRoaXMuaXRlbUVuZD1mdW5jdGlvbihoKXthKyssaS5vblByb2dyZXNzIT09dm9pZCAwJiZpLm9uUHJvZ3Jlc3MoaCxhLG8pLGE9PT1vJiYocz0hMSxpLm9uTG9hZCE9PXZvaWQgMCYmaS5vbkxvYWQoKSl9LHRoaXMuaXRlbUVycm9yPWZ1bmN0aW9uKGgpe2kub25FcnJvciE9PXZvaWQgMCYmaS5vbkVycm9yKGgpfSx0aGlzLnJlc29sdmVVUkw9ZnVuY3Rpb24oaCl7cmV0dXJuIGw/bChoKTpofSx0aGlzLnNldFVSTE1vZGlmaWVyPWZ1bmN0aW9uKGgpe3JldHVybiBsPWgsdGhpc30sdGhpcy5hZGRIYW5kbGVyPWZ1bmN0aW9uKGgsdSl7cmV0dXJuIGMucHVzaChoLHUpLHRoaXN9LHRoaXMucmVtb3ZlSGFuZGxlcj1mdW5jdGlvbihoKXtjb25zdCB1PWMuaW5kZXhPZihoKTtyZXR1cm4gdSE9PS0xJiZjLnNwbGljZSh1LDIpLHRoaXN9LHRoaXMuZ2V0SGFuZGxlcj1mdW5jdGlvbihoKXtmb3IobGV0IHU9MCxmPWMubGVuZ3RoO3U8Zjt1Kz0yKXtjb25zdCBkPWNbdV0scD1jW3UrMV07aWYoZC5nbG9iYWwmJihkLmxhc3RJbmRleD0wKSxkLnRlc3QoaCkpcmV0dXJuIHB9cmV0dXJuIG51bGx9fX1jb25zdCBMbT1uZXcgb3U7Y2xhc3MgdW57Y29uc3RydWN0b3IoZSl7dGhpcy5tYW5hZ2VyPWUhPT12b2lkIDA/ZTpMbSx0aGlzLmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLHRoaXMud2l0aENyZWRlbnRpYWxzPSExLHRoaXMucGF0aD0iIix0aGlzLnJlc291cmNlUGF0aD0iIix0aGlzLnJlcXVlc3RIZWFkZXI9e319bG9hZCgpe31sb2FkQXN5bmMoZSx0KXtjb25zdCBuPXRoaXM7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGkscyl7bi5sb2FkKGUsaSx0LHMpfSl9cGFyc2UoKXt9c2V0Q3Jvc3NPcmlnaW4oZSl7cmV0dXJuIHRoaXMuY3Jvc3NPcmlnaW49ZSx0aGlzfXNldFdpdGhDcmVkZW50aWFscyhlKXtyZXR1cm4gdGhpcy53aXRoQ3JlZGVudGlhbHM9ZSx0aGlzfXNldFBhdGgoZSl7cmV0dXJuIHRoaXMucGF0aD1lLHRoaXN9c2V0UmVzb3VyY2VQYXRoKGUpe3JldHVybiB0aGlzLnJlc291cmNlUGF0aD1lLHRoaXN9c2V0UmVxdWVzdEhlYWRlcihlKXtyZXR1cm4gdGhpcy5yZXF1ZXN0SGVhZGVyPWUsdGhpc319dW4uREVGQVVMVF9NQVRFUklBTF9OQU1FPSJfX0RFRkFVTFQiO2NvbnN0IGxpPXt9O2NsYXNzIHhiIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlKSx0aGlzLnJlc3BvbnNlPXR9fWNsYXNzIGNpIGV4dGVuZHMgdW57Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9bG9hZChlLHQsbixpKXtlPT09dm9pZCAwJiYoZT0iIiksdGhpcy5wYXRoIT09dm9pZCAwJiYoZT10aGlzLnBhdGgrZSksZT10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTChlKTtjb25zdCBzPXNyLmdldChlKTtpZihzIT09dm9pZCAwKXJldHVybiB0aGlzLm1hbmFnZXIuaXRlbVN0YXJ0KGUpLHNldFRpbWVvdXQoKCk9Pnt0JiZ0KHMpLHRoaXMubWFuYWdlci5pdGVtRW5kKGUpfSwwKSxzO2lmKGxpW2VdIT09dm9pZCAwKXtsaVtlXS5wdXNoKHtvbkxvYWQ6dCxvblByb2dyZXNzOm4sb25FcnJvcjppfSk7cmV0dXJufWxpW2VdPVtdLGxpW2VdLnB1c2goe29uTG9hZDp0LG9uUHJvZ3Jlc3M6bixvbkVycm9yOml9KTtjb25zdCBhPW5ldyBSZXF1ZXN0KGUse2hlYWRlcnM6bmV3IEhlYWRlcnModGhpcy5yZXF1ZXN0SGVhZGVyKSxjcmVkZW50aWFsczp0aGlzLndpdGhDcmVkZW50aWFscz8iaW5jbHVkZSI6InNhbWUtb3JpZ2luIn0pLG89dGhpcy5taW1lVHlwZSxsPXRoaXMucmVzcG9uc2VUeXBlO2ZldGNoKGEpLnRoZW4oYz0+e2lmKGMuc3RhdHVzPT09MjAwfHxjLnN0YXR1cz09PTApe2lmKGMuc3RhdHVzPT09MCYmY29uc29sZS53YXJuKCJUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLiIpLHR5cGVvZiBSZWFkYWJsZVN0cmVhbT09InVuZGVmaW5lZCJ8fGMuYm9keT09PXZvaWQgMHx8Yy5ib2R5LmdldFJlYWRlcj09PXZvaWQgMClyZXR1cm4gYztjb25zdCBoPWxpW2VdLHU9Yy5ib2R5LmdldFJlYWRlcigpLGY9Yy5oZWFkZXJzLmdldCgiQ29udGVudC1MZW5ndGgiKXx8Yy5oZWFkZXJzLmdldCgiWC1GaWxlLVNpemUiKSxkPWY/cGFyc2VJbnQoZik6MCxwPWQhPT0wO2xldCBfPTA7Y29uc3QgZz1uZXcgUmVhZGFibGVTdHJlYW0oe3N0YXJ0KG0pe3koKTtmdW5jdGlvbiB5KCl7dS5yZWFkKCkudGhlbigoe2RvbmU6eCx2YWx1ZTp2fSk9PntpZih4KW0uY2xvc2UoKTtlbHNle18rPXYuYnl0ZUxlbmd0aDtjb25zdCBTPW5ldyBQcm9ncmVzc0V2ZW50KCJwcm9ncmVzcyIse2xlbmd0aENvbXB1dGFibGU6cCxsb2FkZWQ6Xyx0b3RhbDpkfSk7Zm9yKGxldCBiPTAsQT1oLmxlbmd0aDtiPEE7YisrKXtjb25zdCBMPWhbYl07TC5vblByb2dyZXNzJiZMLm9uUHJvZ3Jlc3MoUyl9bS5lbnF1ZXVlKHYpLHkoKX19KX19fSk7cmV0dXJuIG5ldyBSZXNwb25zZShnKX1lbHNlIHRocm93IG5ldyB4YihgZmV0Y2ggZm9yICIke2MudXJsfSIgcmVzcG9uZGVkIHdpdGggJHtjLnN0YXR1c306ICR7Yy5zdGF0dXNUZXh0fWAsYyl9KS50aGVuKGM9Pntzd2l0Y2gobCl7Y2FzZSJhcnJheWJ1ZmZlciI6cmV0dXJuIGMuYXJyYXlCdWZmZXIoKTtjYXNlImJsb2IiOnJldHVybiBjLmJsb2IoKTtjYXNlImRvY3VtZW50IjpyZXR1cm4gYy50ZXh0KCkudGhlbihoPT5uZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGgsbykpO2Nhc2UianNvbiI6cmV0dXJuIGMuanNvbigpO2RlZmF1bHQ6aWYobz09PXZvaWQgMClyZXR1cm4gYy50ZXh0KCk7e2NvbnN0IHU9L2NoYXJzZXQ9Ij8oW147IlxzXSopIj8vaS5leGVjKG8pLGY9dSYmdVsxXT91WzFdLnRvTG93ZXJDYXNlKCk6dm9pZCAwLGQ9bmV3IFRleHREZWNvZGVyKGYpO3JldHVybiBjLmFycmF5QnVmZmVyKCkudGhlbihwPT5kLmRlY29kZShwKSl9fX0pLnRoZW4oYz0+e3NyLmFkZChlLGMpO2NvbnN0IGg9bGlbZV07ZGVsZXRlIGxpW2VdO2ZvcihsZXQgdT0wLGY9aC5sZW5ndGg7dTxmO3UrKyl7Y29uc3QgZD1oW3VdO2Qub25Mb2FkJiZkLm9uTG9hZChjKX19KS5jYXRjaChjPT57Y29uc3QgaD1saVtlXTtpZihoPT09dm9pZCAwKXRocm93IHRoaXMubWFuYWdlci5pdGVtRXJyb3IoZSksYztkZWxldGUgbGlbZV07Zm9yKGxldCB1PTAsZj1oLmxlbmd0aDt1PGY7dSsrKXtjb25zdCBkPWhbdV07ZC5vbkVycm9yJiZkLm9uRXJyb3IoYyl9dGhpcy5tYW5hZ2VyLml0ZW1FcnJvcihlKX0pLmZpbmFsbHkoKCk9Pnt0aGlzLm1hbmFnZXIuaXRlbUVuZChlKX0pLHRoaXMubWFuYWdlci5pdGVtU3RhcnQoZSl9c2V0UmVzcG9uc2VUeXBlKGUpe3JldHVybiB0aGlzLnJlc3BvbnNlVHlwZT1lLHRoaXN9c2V0TWltZVR5cGUoZSl7cmV0dXJuIHRoaXMubWltZVR5cGU9ZSx0aGlzfX1jbGFzcyB5YiBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9bmV3IGNpKHRoaXMubWFuYWdlcik7YS5zZXRQYXRoKHRoaXMucGF0aCksYS5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksYS5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpLGEubG9hZChlLGZ1bmN0aW9uKG8pe3RyeXt0KHMucGFyc2UoSlNPTi5wYXJzZShvKSkpfWNhdGNoKGwpe2k/aShsKTpjb25zb2xlLmVycm9yKGwpLHMubWFuYWdlci5pdGVtRXJyb3IoZSl9fSxuLGkpfXBhcnNlKGUpe2NvbnN0IHQ9W107Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2NvbnN0IGk9ZGEucGFyc2UoZVtuXSk7dC5wdXNoKGkpfXJldHVybiB0fX1jbGFzcyB2YiBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9W10sbz1uZXcgem8sbD1uZXcgY2kodGhpcy5tYW5hZ2VyKTtsLnNldFBhdGgodGhpcy5wYXRoKSxsLnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKSxsLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxsLnNldFdpdGhDcmVkZW50aWFscyhzLndpdGhDcmVkZW50aWFscyk7bGV0IGM9MDtmdW5jdGlvbiBoKHUpe2wubG9hZChlW3VdLGZ1bmN0aW9uKGYpe2NvbnN0IGQ9cy5wYXJzZShmLCEwKTthW3VdPXt3aWR0aDpkLndpZHRoLGhlaWdodDpkLmhlaWdodCxmb3JtYXQ6ZC5mb3JtYXQsbWlwbWFwczpkLm1pcG1hcHN9LGMrPTEsYz09PTYmJihkLm1pcG1hcENvdW50PT09MSYmKG8ubWluRmlsdGVyPXd0KSxvLmltYWdlPWEsby5mb3JtYXQ9ZC5mb3JtYXQsby5uZWVkc1VwZGF0ZT0hMCx0JiZ0KG8pKX0sbixpKX1pZihBcnJheS5pc0FycmF5KGUpKWZvcihsZXQgdT0wLGY9ZS5sZW5ndGg7dTxmOysrdSloKHUpO2Vsc2UgbC5sb2FkKGUsZnVuY3Rpb24odSl7Y29uc3QgZj1zLnBhcnNlKHUsITApO2lmKGYuaXNDdWJlbWFwKXtjb25zdCBkPWYubWlwbWFwcy5sZW5ndGgvZi5taXBtYXBDb3VudDtmb3IobGV0IHA9MDtwPGQ7cCsrKXthW3BdPXttaXBtYXBzOltdfTtmb3IobGV0IF89MDtfPGYubWlwbWFwQ291bnQ7XysrKWFbcF0ubWlwbWFwcy5wdXNoKGYubWlwbWFwc1twKmYubWlwbWFwQ291bnQrX10pLGFbcF0uZm9ybWF0PWYuZm9ybWF0LGFbcF0ud2lkdGg9Zi53aWR0aCxhW3BdLmhlaWdodD1mLmhlaWdodH1vLmltYWdlPWF9ZWxzZSBvLmltYWdlLndpZHRoPWYud2lkdGgsby5pbWFnZS5oZWlnaHQ9Zi5oZWlnaHQsby5taXBtYXBzPWYubWlwbWFwcztmLm1pcG1hcENvdW50PT09MSYmKG8ubWluRmlsdGVyPXd0KSxvLmZvcm1hdD1mLmZvcm1hdCxvLm5lZWRzVXBkYXRlPSEwLHQmJnQobyl9LG4saSk7cmV0dXJuIG99fWNsYXNzIHBhIGV4dGVuZHMgdW57Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9bG9hZChlLHQsbixpKXt0aGlzLnBhdGghPT12b2lkIDAmJihlPXRoaXMucGF0aCtlKSxlPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGUpO2NvbnN0IHM9dGhpcyxhPXNyLmdldChlKTtpZihhIT09dm9pZCAwKXJldHVybiBzLm1hbmFnZXIuaXRlbVN0YXJ0KGUpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0JiZ0KGEpLHMubWFuYWdlci5pdGVtRW5kKGUpfSwwKSxhO2NvbnN0IG89T3MoImltZyIpO2Z1bmN0aW9uIGwoKXtoKCksc3IuYWRkKGUsdGhpcyksdCYmdCh0aGlzKSxzLm1hbmFnZXIuaXRlbUVuZChlKX1mdW5jdGlvbiBjKHUpe2goKSxpJiZpKHUpLHMubWFuYWdlci5pdGVtRXJyb3IoZSkscy5tYW5hZ2VyLml0ZW1FbmQoZSl9ZnVuY3Rpb24gaCgpe28ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsbCwhMSksby5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsYywhMSl9cmV0dXJuIG8uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsbCwhMSksby5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYywhMSksZS5zbGljZSgwLDUpIT09ImRhdGE6IiYmdGhpcy5jcm9zc09yaWdpbiE9PXZvaWQgMCYmKG8uY3Jvc3NPcmlnaW49dGhpcy5jcm9zc09yaWdpbikscy5tYW5hZ2VyLml0ZW1TdGFydChlKSxvLnNyYz1lLG99fWNsYXNzIE1iIGV4dGVuZHMgdW57Y29uc3RydWN0b3IoZSl7c3VwZXIoZSl9bG9hZChlLHQsbixpKXtjb25zdCBzPW5ldyBYcztzLmNvbG9yU3BhY2U9UHQ7Y29uc3QgYT1uZXcgcGEodGhpcy5tYW5hZ2VyKTthLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pLGEuc2V0UGF0aCh0aGlzLnBhdGgpO2xldCBvPTA7ZnVuY3Rpb24gbChjKXthLmxvYWQoZVtjXSxmdW5jdGlvbihoKXtzLmltYWdlc1tjXT1oLG8rKyxvPT09NiYmKHMubmVlZHNVcGRhdGU9ITAsdCYmdChzKSl9LHZvaWQgMCxpKX1mb3IobGV0IGM9MDtjPGUubGVuZ3RoOysrYylsKGMpO3JldHVybiBzfX1jbGFzcyBTYiBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9bmV3IGppLG89bmV3IGNpKHRoaXMubWFuYWdlcik7cmV0dXJuIG8uc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLG8uc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLG8uc2V0UGF0aCh0aGlzLnBhdGgpLG8uc2V0V2l0aENyZWRlbnRpYWxzKHMud2l0aENyZWRlbnRpYWxzKSxvLmxvYWQoZSxmdW5jdGlvbihsKXtsZXQgYzt0cnl7Yz1zLnBhcnNlKGwpfWNhdGNoKGgpe2lmKGkhPT12b2lkIDApaShoKTtlbHNle2NvbnNvbGUuZXJyb3IoaCk7cmV0dXJufX1jLmltYWdlIT09dm9pZCAwP2EuaW1hZ2U9Yy5pbWFnZTpjLmRhdGEhPT12b2lkIDAmJihhLmltYWdlLndpZHRoPWMud2lkdGgsYS5pbWFnZS5oZWlnaHQ9Yy5oZWlnaHQsYS5pbWFnZS5kYXRhPWMuZGF0YSksYS53cmFwUz1jLndyYXBTIT09dm9pZCAwP2Mud3JhcFM6enQsYS53cmFwVD1jLndyYXBUIT09dm9pZCAwP2Mud3JhcFQ6enQsYS5tYWdGaWx0ZXI9Yy5tYWdGaWx0ZXIhPT12b2lkIDA/Yy5tYWdGaWx0ZXI6d3QsYS5taW5GaWx0ZXI9Yy5taW5GaWx0ZXIhPT12b2lkIDA/Yy5taW5GaWx0ZXI6d3QsYS5hbmlzb3Ryb3B5PWMuYW5pc290cm9weSE9PXZvaWQgMD9jLmFuaXNvdHJvcHk6MSxjLmNvbG9yU3BhY2UhPT12b2lkIDA/YS5jb2xvclNwYWNlPWMuY29sb3JTcGFjZTpjLmVuY29kaW5nIT09dm9pZCAwJiYoYS5lbmNvZGluZz1jLmVuY29kaW5nKSxjLmZsaXBZIT09dm9pZCAwJiYoYS5mbGlwWT1jLmZsaXBZKSxjLmZvcm1hdCE9PXZvaWQgMCYmKGEuZm9ybWF0PWMuZm9ybWF0KSxjLnR5cGUhPT12b2lkIDAmJihhLnR5cGU9Yy50eXBlKSxjLm1pcG1hcHMhPT12b2lkIDAmJihhLm1pcG1hcHM9Yy5taXBtYXBzLGEubWluRmlsdGVyPXZpKSxjLm1pcG1hcENvdW50PT09MSYmKGEubWluRmlsdGVyPXd0KSxjLmdlbmVyYXRlTWlwbWFwcyE9PXZvaWQgMCYmKGEuZ2VuZXJhdGVNaXBtYXBzPWMuZ2VuZXJhdGVNaXBtYXBzKSxhLm5lZWRzVXBkYXRlPSEwLHQmJnQoYSxjKX0sbixpKSxhfX1jbGFzcyBiYiBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz1uZXcgRXQsYT1uZXcgcGEodGhpcy5tYW5hZ2VyKTtyZXR1cm4gYS5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKSxhLnNldFBhdGgodGhpcy5wYXRoKSxhLmxvYWQoZSxmdW5jdGlvbihvKXtzLmltYWdlPW8scy5uZWVkc1VwZGF0ZT0hMCx0IT09dm9pZCAwJiZ0KHMpfSxuLGkpLHN9fWNsYXNzIE5pIGV4dGVuZHMgcnR7Y29uc3RydWN0b3IoZSx0PTEpe3N1cGVyKCksdGhpcy5pc0xpZ2h0PSEwLHRoaXMudHlwZT0iTGlnaHQiLHRoaXMuY29sb3I9bmV3IHllKGUpLHRoaXMuaW50ZW5zaXR5PXR9ZGlzcG9zZSgpe31jb3B5KGUsdCl7cmV0dXJuIHN1cGVyLmNvcHkoZSx0KSx0aGlzLmNvbG9yLmNvcHkoZS5jb2xvciksdGhpcy5pbnRlbnNpdHk9ZS5pbnRlbnNpdHksdGhpc310b0pTT04oZSl7Y29uc3QgdD1zdXBlci50b0pTT04oZSk7cmV0dXJuIHQub2JqZWN0LmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCksdC5vYmplY3QuaW50ZW5zaXR5PXRoaXMuaW50ZW5zaXR5LHRoaXMuZ3JvdW5kQ29sb3IhPT12b2lkIDAmJih0Lm9iamVjdC5ncm91bmRDb2xvcj10aGlzLmdyb3VuZENvbG9yLmdldEhleCgpKSx0aGlzLmRpc3RhbmNlIT09dm9pZCAwJiYodC5vYmplY3QuZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSksdGhpcy5hbmdsZSE9PXZvaWQgMCYmKHQub2JqZWN0LmFuZ2xlPXRoaXMuYW5nbGUpLHRoaXMuZGVjYXkhPT12b2lkIDAmJih0Lm9iamVjdC5kZWNheT10aGlzLmRlY2F5KSx0aGlzLnBlbnVtYnJhIT09dm9pZCAwJiYodC5vYmplY3QucGVudW1icmE9dGhpcy5wZW51bWJyYSksdGhpcy5zaGFkb3chPT12b2lkIDAmJih0Lm9iamVjdC5zaGFkb3c9dGhpcy5zaGFkb3cudG9KU09OKCkpLHR9fWNsYXNzIEltIGV4dGVuZHMgTml7Y29uc3RydWN0b3IoZSx0LG4pe3N1cGVyKGUsbiksdGhpcy5pc0hlbWlzcGhlcmVMaWdodD0hMCx0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCIsdGhpcy5wb3NpdGlvbi5jb3B5KHJ0LkRFRkFVTFRfVVApLHRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5ncm91bmRDb2xvcj1uZXcgeWUodCl9Y29weShlLHQpe3JldHVybiBzdXBlci5jb3B5KGUsdCksdGhpcy5ncm91bmRDb2xvci5jb3B5KGUuZ3JvdW5kQ29sb3IpLHRoaXN9fWNvbnN0IGx1PW5ldyBJZSxVbT1uZXcgUCxEbT1uZXcgUDtjbGFzcyBjdXtjb25zdHJ1Y3RvcihlKXt0aGlzLmNhbWVyYT1lLHRoaXMuYmlhcz0wLHRoaXMubm9ybWFsQmlhcz0wLHRoaXMucmFkaXVzPTEsdGhpcy5ibHVyU2FtcGxlcz04LHRoaXMubWFwU2l6ZT1uZXcgcSg1MTIsNTEyKSx0aGlzLm1hcD1udWxsLHRoaXMubWFwUGFzcz1udWxsLHRoaXMubWF0cml4PW5ldyBJZSx0aGlzLmF1dG9VcGRhdGU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMSx0aGlzLl9mcnVzdHVtPW5ldyBxcyx0aGlzLl9mcmFtZUV4dGVudHM9bmV3IHEoMSwxKSx0aGlzLl92aWV3cG9ydENvdW50PTEsdGhpcy5fdmlld3BvcnRzPVtuZXcgbHQoMCwwLDEsMSldfWdldFZpZXdwb3J0Q291bnQoKXtyZXR1cm4gdGhpcy5fdmlld3BvcnRDb3VudH1nZXRGcnVzdHVtKCl7cmV0dXJuIHRoaXMuX2ZydXN0dW19dXBkYXRlTWF0cmljZXMoZSl7Y29uc3QgdD10aGlzLmNhbWVyYSxuPXRoaXMubWF0cml4O1VtLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLm1hdHJpeFdvcmxkKSx0LnBvc2l0aW9uLmNvcHkoVW0pLERtLnNldEZyb21NYXRyaXhQb3NpdGlvbihlLnRhcmdldC5tYXRyaXhXb3JsZCksdC5sb29rQXQoRG0pLHQudXBkYXRlTWF0cml4V29ybGQoKSxsdS5tdWx0aXBseU1hdHJpY2VzKHQucHJvamVjdGlvbk1hdHJpeCx0Lm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChsdSksbi5zZXQoLjUsMCwwLC41LDAsLjUsMCwuNSwwLDAsLjUsLjUsMCwwLDAsMSksbi5tdWx0aXBseShsdSl9Z2V0Vmlld3BvcnQoZSl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1tlXX1nZXRGcmFtZUV4dGVudHMoKXtyZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzfWRpc3Bvc2UoKXt0aGlzLm1hcCYmdGhpcy5tYXAuZGlzcG9zZSgpLHRoaXMubWFwUGFzcyYmdGhpcy5tYXBQYXNzLmRpc3Bvc2UoKX1jb3B5KGUpe3JldHVybiB0aGlzLmNhbWVyYT1lLmNhbWVyYS5jbG9uZSgpLHRoaXMuYmlhcz1lLmJpYXMsdGhpcy5yYWRpdXM9ZS5yYWRpdXMsdGhpcy5tYXBTaXplLmNvcHkoZS5tYXBTaXplKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX10b0pTT04oKXtjb25zdCBlPXt9O3JldHVybiB0aGlzLmJpYXMhPT0wJiYoZS5iaWFzPXRoaXMuYmlhcyksdGhpcy5ub3JtYWxCaWFzIT09MCYmKGUubm9ybWFsQmlhcz10aGlzLm5vcm1hbEJpYXMpLHRoaXMucmFkaXVzIT09MSYmKGUucmFkaXVzPXRoaXMucmFkaXVzKSwodGhpcy5tYXBTaXplLnghPT01MTJ8fHRoaXMubWFwU2l6ZS55IT09NTEyKSYmKGUubWFwU2l6ZT10aGlzLm1hcFNpemUudG9BcnJheSgpKSxlLmNhbWVyYT10aGlzLmNhbWVyYS50b0pTT04oITEpLm9iamVjdCxkZWxldGUgZS5jYW1lcmEubWF0cml4LGV9fWNsYXNzIHdiIGV4dGVuZHMgY3V7Y29uc3RydWN0b3IoKXtzdXBlcihuZXcgQnQoNTAsMSwuNSw1MDApKSx0aGlzLmlzU3BvdExpZ2h0U2hhZG93PSEwLHRoaXMuZm9jdXM9MX11cGRhdGVNYXRyaWNlcyhlKXtjb25zdCB0PXRoaXMuY2FtZXJhLG49QXIqMiplLmFuZ2xlKnRoaXMuZm9jdXMsaT10aGlzLm1hcFNpemUud2lkdGgvdGhpcy5tYXBTaXplLmhlaWdodCxzPWUuZGlzdGFuY2V8fHQuZmFyOyhuIT09dC5mb3Z8fGkhPT10LmFzcGVjdHx8cyE9PXQuZmFyKSYmKHQuZm92PW4sdC5hc3BlY3Q9aSx0LmZhcj1zLHQudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKSxzdXBlci51cGRhdGVNYXRyaWNlcyhlKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuZm9jdXM9ZS5mb2N1cyx0aGlzfX1jbGFzcyBObSBleHRlbmRzIE5pe2NvbnN0cnVjdG9yKGUsdCxuPTAsaT1NYXRoLlBJLzMscz0wLGE9Mil7c3VwZXIoZSx0KSx0aGlzLmlzU3BvdExpZ2h0PSEwLHRoaXMudHlwZT0iU3BvdExpZ2h0Iix0aGlzLnBvc2l0aW9uLmNvcHkocnQuREVGQVVMVF9VUCksdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLnRhcmdldD1uZXcgcnQsdGhpcy5kaXN0YW5jZT1uLHRoaXMuYW5nbGU9aSx0aGlzLnBlbnVtYnJhPXMsdGhpcy5kZWNheT1hLHRoaXMubWFwPW51bGwsdGhpcy5zaGFkb3c9bmV3IHdifWdldCBwb3dlcigpe3JldHVybiB0aGlzLmludGVuc2l0eSpNYXRoLlBJfXNldCBwb3dlcihlKXt0aGlzLmludGVuc2l0eT1lL01hdGguUEl9ZGlzcG9zZSgpe3RoaXMuc2hhZG93LmRpc3Bvc2UoKX1jb3B5KGUsdCl7cmV0dXJuIHN1cGVyLmNvcHkoZSx0KSx0aGlzLmRpc3RhbmNlPWUuZGlzdGFuY2UsdGhpcy5hbmdsZT1lLmFuZ2xlLHRoaXMucGVudW1icmE9ZS5wZW51bWJyYSx0aGlzLmRlY2F5PWUuZGVjYXksdGhpcy50YXJnZXQ9ZS50YXJnZXQuY2xvbmUoKSx0aGlzLnNoYWRvdz1lLnNoYWRvdy5jbG9uZSgpLHRoaXN9fWNvbnN0IEZtPW5ldyBJZSxtYT1uZXcgUCxodT1uZXcgUDtjbGFzcyBFYiBleHRlbmRzIGN1e2NvbnN0cnVjdG9yKCl7c3VwZXIobmV3IEJ0KDkwLDEsLjUsNTAwKSksdGhpcy5pc1BvaW50TGlnaHRTaGFkb3c9ITAsdGhpcy5fZnJhbWVFeHRlbnRzPW5ldyBxKDQsMiksdGhpcy5fdmlld3BvcnRDb3VudD02LHRoaXMuX3ZpZXdwb3J0cz1bbmV3IGx0KDIsMSwxLDEpLG5ldyBsdCgwLDEsMSwxKSxuZXcgbHQoMywxLDEsMSksbmV3IGx0KDEsMSwxLDEpLG5ldyBsdCgzLDAsMSwxKSxuZXcgbHQoMSwwLDEsMSldLHRoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgUCgxLDAsMCksbmV3IFAoLTEsMCwwKSxuZXcgUCgwLDAsMSksbmV3IFAoMCwwLC0xKSxuZXcgUCgwLDEsMCksbmV3IFAoMCwtMSwwKV0sdGhpcy5fY3ViZVVwcz1bbmV3IFAoMCwxLDApLG5ldyBQKDAsMSwwKSxuZXcgUCgwLDEsMCksbmV3IFAoMCwxLDApLG5ldyBQKDAsMCwxKSxuZXcgUCgwLDAsLTEpXX11cGRhdGVNYXRyaWNlcyhlLHQ9MCl7Y29uc3Qgbj10aGlzLmNhbWVyYSxpPXRoaXMubWF0cml4LHM9ZS5kaXN0YW5jZXx8bi5mYXI7cyE9PW4uZmFyJiYobi5mYXI9cyxuLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSksbWEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUubWF0cml4V29ybGQpLG4ucG9zaXRpb24uY29weShtYSksaHUuY29weShuLnBvc2l0aW9uKSxodS5hZGQodGhpcy5fY3ViZURpcmVjdGlvbnNbdF0pLG4udXAuY29weSh0aGlzLl9jdWJlVXBzW3RdKSxuLmxvb2tBdChodSksbi51cGRhdGVNYXRyaXhXb3JsZCgpLGkubWFrZVRyYW5zbGF0aW9uKC1tYS54LC1tYS55LC1tYS56KSxGbS5tdWx0aXBseU1hdHJpY2VzKG4ucHJvamVjdGlvbk1hdHJpeCxuLm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChGbSl9fWNsYXNzIE9tIGV4dGVuZHMgTml7Y29uc3RydWN0b3IoZSx0LG49MCxpPTIpe3N1cGVyKGUsdCksdGhpcy5pc1BvaW50TGlnaHQ9ITAsdGhpcy50eXBlPSJQb2ludExpZ2h0Iix0aGlzLmRpc3RhbmNlPW4sdGhpcy5kZWNheT1pLHRoaXMuc2hhZG93PW5ldyBFYn1nZXQgcG93ZXIoKXtyZXR1cm4gdGhpcy5pbnRlbnNpdHkqNCpNYXRoLlBJfXNldCBwb3dlcihlKXt0aGlzLmludGVuc2l0eT1lLyg0Kk1hdGguUEkpfWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weShlLHQpe3JldHVybiBzdXBlci5jb3B5KGUsdCksdGhpcy5kaXN0YW5jZT1lLmRpc3RhbmNlLHRoaXMuZGVjYXk9ZS5kZWNheSx0aGlzLnNoYWRvdz1lLnNoYWRvdy5jbG9uZSgpLHRoaXN9fWNsYXNzIEFiIGV4dGVuZHMgY3V7Y29uc3RydWN0b3IoKXtzdXBlcihuZXcgdm8oLTUsNSw1LC01LC41LDUwMCkpLHRoaXMuaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93PSEwfX1jbGFzcyBCbSBleHRlbmRzIE5pe2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0KSx0aGlzLmlzRGlyZWN0aW9uYWxMaWdodD0hMCx0aGlzLnR5cGU9IkRpcmVjdGlvbmFsTGlnaHQiLHRoaXMucG9zaXRpb24uY29weShydC5ERUZBVUxUX1VQKSx0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMudGFyZ2V0PW5ldyBydCx0aGlzLnNoYWRvdz1uZXcgQWJ9ZGlzcG9zZSgpe3RoaXMuc2hhZG93LmRpc3Bvc2UoKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMudGFyZ2V0PWUudGFyZ2V0LmNsb25lKCksdGhpcy5zaGFkb3c9ZS5zaGFkb3cuY2xvbmUoKSx0aGlzfX1jbGFzcyB6bSBleHRlbmRzIE5pe2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0KSx0aGlzLmlzQW1iaWVudExpZ2h0PSEwLHRoaXMudHlwZT0iQW1iaWVudExpZ2h0In19Y2xhc3Mga20gZXh0ZW5kcyBOaXtjb25zdHJ1Y3RvcihlLHQsbj0xMCxpPTEwKXtzdXBlcihlLHQpLHRoaXMuaXNSZWN0QXJlYUxpZ2h0PSEwLHRoaXMudHlwZT0iUmVjdEFyZWFMaWdodCIsdGhpcy53aWR0aD1uLHRoaXMuaGVpZ2h0PWl9Z2V0IHBvd2VyKCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5KnRoaXMud2lkdGgqdGhpcy5oZWlnaHQqTWF0aC5QSX1zZXQgcG93ZXIoZSl7dGhpcy5pbnRlbnNpdHk9ZS8odGhpcy53aWR0aCp0aGlzLmhlaWdodCpNYXRoLlBJKX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMud2lkdGg9ZS53aWR0aCx0aGlzLmhlaWdodD1lLmhlaWdodCx0aGlzfXRvSlNPTihlKXtjb25zdCB0PXN1cGVyLnRvSlNPTihlKTtyZXR1cm4gdC5vYmplY3Qud2lkdGg9dGhpcy53aWR0aCx0Lm9iamVjdC5oZWlnaHQ9dGhpcy5oZWlnaHQsdH19Y2xhc3MgR217Y29uc3RydWN0b3IoKXt0aGlzLmlzU3BoZXJpY2FsSGFybW9uaWNzMz0hMCx0aGlzLmNvZWZmaWNpZW50cz1bXTtmb3IobGV0IGU9MDtlPDk7ZSsrKXRoaXMuY29lZmZpY2llbnRzLnB1c2gobmV3IFApfXNldChlKXtmb3IobGV0IHQ9MDt0PDk7dCsrKXRoaXMuY29lZmZpY2llbnRzW3RdLmNvcHkoZVt0XSk7cmV0dXJuIHRoaXN9emVybygpe2ZvcihsZXQgZT0wO2U8OTtlKyspdGhpcy5jb2VmZmljaWVudHNbZV0uc2V0KDAsMCwwKTtyZXR1cm4gdGhpc31nZXRBdChlLHQpe2NvbnN0IG49ZS54LGk9ZS55LHM9ZS56LGE9dGhpcy5jb2VmZmljaWVudHM7cmV0dXJuIHQuY29weShhWzBdKS5tdWx0aXBseVNjYWxhciguMjgyMDk1KSx0LmFkZFNjYWxlZFZlY3RvcihhWzFdLC40ODg2MDMqaSksdC5hZGRTY2FsZWRWZWN0b3IoYVsyXSwuNDg4NjAzKnMpLHQuYWRkU2NhbGVkVmVjdG9yKGFbM10sLjQ4ODYwMypuKSx0LmFkZFNjYWxlZFZlY3RvcihhWzRdLDEuMDkyNTQ4KihuKmkpKSx0LmFkZFNjYWxlZFZlY3RvcihhWzVdLDEuMDkyNTQ4KihpKnMpKSx0LmFkZFNjYWxlZFZlY3RvcihhWzZdLC4zMTUzOTIqKDMqcypzLTEpKSx0LmFkZFNjYWxlZFZlY3RvcihhWzddLDEuMDkyNTQ4KihuKnMpKSx0LmFkZFNjYWxlZFZlY3RvcihhWzhdLC41NDYyNzQqKG4qbi1pKmkpKSx0fWdldElycmFkaWFuY2VBdChlLHQpe2NvbnN0IG49ZS54LGk9ZS55LHM9ZS56LGE9dGhpcy5jb2VmZmljaWVudHM7cmV0dXJuIHQuY29weShhWzBdKS5tdWx0aXBseVNjYWxhciguODg2MjI3KSx0LmFkZFNjYWxlZFZlY3RvcihhWzFdLDIqLjUxMTY2NCppKSx0LmFkZFNjYWxlZFZlY3RvcihhWzJdLDIqLjUxMTY2NCpzKSx0LmFkZFNjYWxlZFZlY3RvcihhWzNdLDIqLjUxMTY2NCpuKSx0LmFkZFNjYWxlZFZlY3RvcihhWzRdLDIqLjQyOTA0MypuKmkpLHQuYWRkU2NhbGVkVmVjdG9yKGFbNV0sMiouNDI5MDQzKmkqcyksdC5hZGRTY2FsZWRWZWN0b3IoYVs2XSwuNzQzMTI1KnMqcy0uMjQ3NzA4KSx0LmFkZFNjYWxlZFZlY3RvcihhWzddLDIqLjQyOTA0MypuKnMpLHQuYWRkU2NhbGVkVmVjdG9yKGFbOF0sLjQyOTA0MyoobipuLWkqaSkpLHR9YWRkKGUpe2ZvcihsZXQgdD0wO3Q8OTt0KyspdGhpcy5jb2VmZmljaWVudHNbdF0uYWRkKGUuY29lZmZpY2llbnRzW3RdKTtyZXR1cm4gdGhpc31hZGRTY2FsZWRTSChlLHQpe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5jb2VmZmljaWVudHNbbl0uYWRkU2NhbGVkVmVjdG9yKGUuY29lZmZpY2llbnRzW25dLHQpO3JldHVybiB0aGlzfXNjYWxlKGUpe2ZvcihsZXQgdD0wO3Q8OTt0KyspdGhpcy5jb2VmZmljaWVudHNbdF0ubXVsdGlwbHlTY2FsYXIoZSk7cmV0dXJuIHRoaXN9bGVycChlLHQpe2ZvcihsZXQgbj0wO248OTtuKyspdGhpcy5jb2VmZmljaWVudHNbbl0ubGVycChlLmNvZWZmaWNpZW50c1tuXSx0KTtyZXR1cm4gdGhpc31lcXVhbHMoZSl7Zm9yKGxldCB0PTA7dDw5O3QrKylpZighdGhpcy5jb2VmZmljaWVudHNbdF0uZXF1YWxzKGUuY29lZmZpY2llbnRzW3RdKSlyZXR1cm4hMTtyZXR1cm4hMH1jb3B5KGUpe3JldHVybiB0aGlzLnNldChlLmNvZWZmaWNpZW50cyl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KHRoaXMpfWZyb21BcnJheShlLHQ9MCl7Y29uc3Qgbj10aGlzLmNvZWZmaWNpZW50cztmb3IobGV0IGk9MDtpPDk7aSsrKW5baV0uZnJvbUFycmF5KGUsdCtpKjMpO3JldHVybiB0aGlzfXRvQXJyYXkoZT1bXSx0PTApe2NvbnN0IG49dGhpcy5jb2VmZmljaWVudHM7Zm9yKGxldCBpPTA7aTw5O2krKyluW2ldLnRvQXJyYXkoZSx0K2kqMyk7cmV0dXJuIGV9c3RhdGljIGdldEJhc2lzQXQoZSx0KXtjb25zdCBuPWUueCxpPWUueSxzPWUuejt0WzBdPS4yODIwOTUsdFsxXT0uNDg4NjAzKmksdFsyXT0uNDg4NjAzKnMsdFszXT0uNDg4NjAzKm4sdFs0XT0xLjA5MjU0OCpuKmksdFs1XT0xLjA5MjU0OCppKnMsdFs2XT0uMzE1MzkyKigzKnMqcy0xKSx0WzddPTEuMDkyNTQ4Km4qcyx0WzhdPS41NDYyNzQqKG4qbi1pKmkpfX1jbGFzcyBWbSBleHRlbmRzIE5pe2NvbnN0cnVjdG9yKGU9bmV3IEdtLHQ9MSl7c3VwZXIodm9pZCAwLHQpLHRoaXMuaXNMaWdodFByb2JlPSEwLHRoaXMuc2g9ZX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuc2guY29weShlLnNoKSx0aGlzfWZyb21KU09OKGUpe3JldHVybiB0aGlzLmludGVuc2l0eT1lLmludGVuc2l0eSx0aGlzLnNoLmZyb21BcnJheShlLnNoKSx0aGlzfXRvSlNPTihlKXtjb25zdCB0PXN1cGVyLnRvSlNPTihlKTtyZXR1cm4gdC5vYmplY3Quc2g9dGhpcy5zaC50b0FycmF5KCksdH19Y2xhc3MgYWwgZXh0ZW5kcyB1bntjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnRleHR1cmVzPXt9fWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9bmV3IGNpKHMubWFuYWdlcik7YS5zZXRQYXRoKHMucGF0aCksYS5zZXRSZXF1ZXN0SGVhZGVyKHMucmVxdWVzdEhlYWRlciksYS5zZXRXaXRoQ3JlZGVudGlhbHMocy53aXRoQ3JlZGVudGlhbHMpLGEubG9hZChlLGZ1bmN0aW9uKG8pe3RyeXt0KHMucGFyc2UoSlNPTi5wYXJzZShvKSkpfWNhdGNoKGwpe2k/aShsKTpjb25zb2xlLmVycm9yKGwpLHMubWFuYWdlci5pdGVtRXJyb3IoZSl9fSxuLGkpfXBhcnNlKGUpe2NvbnN0IHQ9dGhpcy50ZXh0dXJlcztmdW5jdGlvbiBuKHMpe3JldHVybiB0W3NdPT09dm9pZCAwJiZjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsTG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZSIscyksdFtzXX1jb25zdCBpPWFsLmNyZWF0ZU1hdGVyaWFsRnJvbVR5cGUoZS50eXBlKTtpZihlLnV1aWQhPT12b2lkIDAmJihpLnV1aWQ9ZS51dWlkKSxlLm5hbWUhPT12b2lkIDAmJihpLm5hbWU9ZS5uYW1lKSxlLmNvbG9yIT09dm9pZCAwJiZpLmNvbG9yIT09dm9pZCAwJiZpLmNvbG9yLnNldEhleChlLmNvbG9yKSxlLnJvdWdobmVzcyE9PXZvaWQgMCYmKGkucm91Z2huZXNzPWUucm91Z2huZXNzKSxlLm1ldGFsbmVzcyE9PXZvaWQgMCYmKGkubWV0YWxuZXNzPWUubWV0YWxuZXNzKSxlLnNoZWVuIT09dm9pZCAwJiYoaS5zaGVlbj1lLnNoZWVuKSxlLnNoZWVuQ29sb3IhPT12b2lkIDAmJihpLnNoZWVuQ29sb3I9bmV3IHllKCkuc2V0SGV4KGUuc2hlZW5Db2xvcikpLGUuc2hlZW5Sb3VnaG5lc3MhPT12b2lkIDAmJihpLnNoZWVuUm91Z2huZXNzPWUuc2hlZW5Sb3VnaG5lc3MpLGUuZW1pc3NpdmUhPT12b2lkIDAmJmkuZW1pc3NpdmUhPT12b2lkIDAmJmkuZW1pc3NpdmUuc2V0SGV4KGUuZW1pc3NpdmUpLGUuc3BlY3VsYXIhPT12b2lkIDAmJmkuc3BlY3VsYXIhPT12b2lkIDAmJmkuc3BlY3VsYXIuc2V0SGV4KGUuc3BlY3VsYXIpLGUuc3BlY3VsYXJJbnRlbnNpdHkhPT12b2lkIDAmJihpLnNwZWN1bGFySW50ZW5zaXR5PWUuc3BlY3VsYXJJbnRlbnNpdHkpLGUuc3BlY3VsYXJDb2xvciE9PXZvaWQgMCYmaS5zcGVjdWxhckNvbG9yIT09dm9pZCAwJiZpLnNwZWN1bGFyQ29sb3Iuc2V0SGV4KGUuc3BlY3VsYXJDb2xvciksZS5zaGluaW5lc3MhPT12b2lkIDAmJihpLnNoaW5pbmVzcz1lLnNoaW5pbmVzcyksZS5jbGVhcmNvYXQhPT12b2lkIDAmJihpLmNsZWFyY29hdD1lLmNsZWFyY29hdCksZS5jbGVhcmNvYXRSb3VnaG5lc3MhPT12b2lkIDAmJihpLmNsZWFyY29hdFJvdWdobmVzcz1lLmNsZWFyY29hdFJvdWdobmVzcyksZS5pcmlkZXNjZW5jZSE9PXZvaWQgMCYmKGkuaXJpZGVzY2VuY2U9ZS5pcmlkZXNjZW5jZSksZS5pcmlkZXNjZW5jZUlPUiE9PXZvaWQgMCYmKGkuaXJpZGVzY2VuY2VJT1I9ZS5pcmlkZXNjZW5jZUlPUiksZS5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlIT09dm9pZCAwJiYoaS5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPWUuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSksZS50cmFuc21pc3Npb24hPT12b2lkIDAmJihpLnRyYW5zbWlzc2lvbj1lLnRyYW5zbWlzc2lvbiksZS50aGlja25lc3MhPT12b2lkIDAmJihpLnRoaWNrbmVzcz1lLnRoaWNrbmVzcyksZS5hdHRlbnVhdGlvbkRpc3RhbmNlIT09dm9pZCAwJiYoaS5hdHRlbnVhdGlvbkRpc3RhbmNlPWUuYXR0ZW51YXRpb25EaXN0YW5jZSksZS5hdHRlbnVhdGlvbkNvbG9yIT09dm9pZCAwJiZpLmF0dGVudWF0aW9uQ29sb3IhPT12b2lkIDAmJmkuYXR0ZW51YXRpb25Db2xvci5zZXRIZXgoZS5hdHRlbnVhdGlvbkNvbG9yKSxlLmFuaXNvdHJvcHkhPT12b2lkIDAmJihpLmFuaXNvdHJvcHk9ZS5hbmlzb3Ryb3B5KSxlLmFuaXNvdHJvcHlSb3RhdGlvbiE9PXZvaWQgMCYmKGkuYW5pc290cm9weVJvdGF0aW9uPWUuYW5pc290cm9weVJvdGF0aW9uKSxlLmZvZyE9PXZvaWQgMCYmKGkuZm9nPWUuZm9nKSxlLmZsYXRTaGFkaW5nIT09dm9pZCAwJiYoaS5mbGF0U2hhZGluZz1lLmZsYXRTaGFkaW5nKSxlLmJsZW5kaW5nIT09dm9pZCAwJiYoaS5ibGVuZGluZz1lLmJsZW5kaW5nKSxlLmNvbWJpbmUhPT12b2lkIDAmJihpLmNvbWJpbmU9ZS5jb21iaW5lKSxlLnNpZGUhPT12b2lkIDAmJihpLnNpZGU9ZS5zaWRlKSxlLnNoYWRvd1NpZGUhPT12b2lkIDAmJihpLnNoYWRvd1NpZGU9ZS5zaGFkb3dTaWRlKSxlLm9wYWNpdHkhPT12b2lkIDAmJihpLm9wYWNpdHk9ZS5vcGFjaXR5KSxlLnRyYW5zcGFyZW50IT09dm9pZCAwJiYoaS50cmFuc3BhcmVudD1lLnRyYW5zcGFyZW50KSxlLmFscGhhVGVzdCE9PXZvaWQgMCYmKGkuYWxwaGFUZXN0PWUuYWxwaGFUZXN0KSxlLmFscGhhSGFzaCE9PXZvaWQgMCYmKGkuYWxwaGFIYXNoPWUuYWxwaGFIYXNoKSxlLmRlcHRoRnVuYyE9PXZvaWQgMCYmKGkuZGVwdGhGdW5jPWUuZGVwdGhGdW5jKSxlLmRlcHRoVGVzdCE9PXZvaWQgMCYmKGkuZGVwdGhUZXN0PWUuZGVwdGhUZXN0KSxlLmRlcHRoV3JpdGUhPT12b2lkIDAmJihpLmRlcHRoV3JpdGU9ZS5kZXB0aFdyaXRlKSxlLmNvbG9yV3JpdGUhPT12b2lkIDAmJihpLmNvbG9yV3JpdGU9ZS5jb2xvcldyaXRlKSxlLmJsZW5kU3JjIT09dm9pZCAwJiYoaS5ibGVuZFNyYz1lLmJsZW5kU3JjKSxlLmJsZW5kRHN0IT09dm9pZCAwJiYoaS5ibGVuZERzdD1lLmJsZW5kRHN0KSxlLmJsZW5kRXF1YXRpb24hPT12b2lkIDAmJihpLmJsZW5kRXF1YXRpb249ZS5ibGVuZEVxdWF0aW9uKSxlLmJsZW5kU3JjQWxwaGEhPT12b2lkIDAmJihpLmJsZW5kU3JjQWxwaGE9ZS5ibGVuZFNyY0FscGhhKSxlLmJsZW5kRHN0QWxwaGEhPT12b2lkIDAmJihpLmJsZW5kRHN0QWxwaGE9ZS5ibGVuZERzdEFscGhhKSxlLmJsZW5kRXF1YXRpb25BbHBoYSE9PXZvaWQgMCYmKGkuYmxlbmRFcXVhdGlvbkFscGhhPWUuYmxlbmRFcXVhdGlvbkFscGhhKSxlLmJsZW5kQ29sb3IhPT12b2lkIDAmJmkuYmxlbmRDb2xvciE9PXZvaWQgMCYmaS5ibGVuZENvbG9yLnNldEhleChlLmJsZW5kQ29sb3IpLGUuYmxlbmRBbHBoYSE9PXZvaWQgMCYmKGkuYmxlbmRBbHBoYT1lLmJsZW5kQWxwaGEpLGUuc3RlbmNpbFdyaXRlTWFzayE9PXZvaWQgMCYmKGkuc3RlbmNpbFdyaXRlTWFzaz1lLnN0ZW5jaWxXcml0ZU1hc2spLGUuc3RlbmNpbEZ1bmMhPT12b2lkIDAmJihpLnN0ZW5jaWxGdW5jPWUuc3RlbmNpbEZ1bmMpLGUuc3RlbmNpbFJlZiE9PXZvaWQgMCYmKGkuc3RlbmNpbFJlZj1lLnN0ZW5jaWxSZWYpLGUuc3RlbmNpbEZ1bmNNYXNrIT09dm9pZCAwJiYoaS5zdGVuY2lsRnVuY01hc2s9ZS5zdGVuY2lsRnVuY01hc2spLGUuc3RlbmNpbEZhaWwhPT12b2lkIDAmJihpLnN0ZW5jaWxGYWlsPWUuc3RlbmNpbEZhaWwpLGUuc3RlbmNpbFpGYWlsIT09dm9pZCAwJiYoaS5zdGVuY2lsWkZhaWw9ZS5zdGVuY2lsWkZhaWwpLGUuc3RlbmNpbFpQYXNzIT09dm9pZCAwJiYoaS5zdGVuY2lsWlBhc3M9ZS5zdGVuY2lsWlBhc3MpLGUuc3RlbmNpbFdyaXRlIT09dm9pZCAwJiYoaS5zdGVuY2lsV3JpdGU9ZS5zdGVuY2lsV3JpdGUpLGUud2lyZWZyYW1lIT09dm9pZCAwJiYoaS53aXJlZnJhbWU9ZS53aXJlZnJhbWUpLGUud2lyZWZyYW1lTGluZXdpZHRoIT09dm9pZCAwJiYoaS53aXJlZnJhbWVMaW5ld2lkdGg9ZS53aXJlZnJhbWVMaW5ld2lkdGgpLGUud2lyZWZyYW1lTGluZWNhcCE9PXZvaWQgMCYmKGkud2lyZWZyYW1lTGluZWNhcD1lLndpcmVmcmFtZUxpbmVjYXApLGUud2lyZWZyYW1lTGluZWpvaW4hPT12b2lkIDAmJihpLndpcmVmcmFtZUxpbmVqb2luPWUud2lyZWZyYW1lTGluZWpvaW4pLGUucm90YXRpb24hPT12b2lkIDAmJihpLnJvdGF0aW9uPWUucm90YXRpb24pLGUubGluZXdpZHRoIT09dm9pZCAwJiYoaS5saW5ld2lkdGg9ZS5saW5ld2lkdGgpLGUuZGFzaFNpemUhPT12b2lkIDAmJihpLmRhc2hTaXplPWUuZGFzaFNpemUpLGUuZ2FwU2l6ZSE9PXZvaWQgMCYmKGkuZ2FwU2l6ZT1lLmdhcFNpemUpLGUuc2NhbGUhPT12b2lkIDAmJihpLnNjYWxlPWUuc2NhbGUpLGUucG9seWdvbk9mZnNldCE9PXZvaWQgMCYmKGkucG9seWdvbk9mZnNldD1lLnBvbHlnb25PZmZzZXQpLGUucG9seWdvbk9mZnNldEZhY3RvciE9PXZvaWQgMCYmKGkucG9seWdvbk9mZnNldEZhY3Rvcj1lLnBvbHlnb25PZmZzZXRGYWN0b3IpLGUucG9seWdvbk9mZnNldFVuaXRzIT09dm9pZCAwJiYoaS5wb2x5Z29uT2Zmc2V0VW5pdHM9ZS5wb2x5Z29uT2Zmc2V0VW5pdHMpLGUuZGl0aGVyaW5nIT09dm9pZCAwJiYoaS5kaXRoZXJpbmc9ZS5kaXRoZXJpbmcpLGUuYWxwaGFUb0NvdmVyYWdlIT09dm9pZCAwJiYoaS5hbHBoYVRvQ292ZXJhZ2U9ZS5hbHBoYVRvQ292ZXJhZ2UpLGUucHJlbXVsdGlwbGllZEFscGhhIT09dm9pZCAwJiYoaS5wcmVtdWx0aXBsaWVkQWxwaGE9ZS5wcmVtdWx0aXBsaWVkQWxwaGEpLGUuZm9yY2VTaW5nbGVQYXNzIT09dm9pZCAwJiYoaS5mb3JjZVNpbmdsZVBhc3M9ZS5mb3JjZVNpbmdsZVBhc3MpLGUudmlzaWJsZSE9PXZvaWQgMCYmKGkudmlzaWJsZT1lLnZpc2libGUpLGUudG9uZU1hcHBlZCE9PXZvaWQgMCYmKGkudG9uZU1hcHBlZD1lLnRvbmVNYXBwZWQpLGUudXNlckRhdGEhPT12b2lkIDAmJihpLnVzZXJEYXRhPWUudXNlckRhdGEpLGUudmVydGV4Q29sb3JzIT09dm9pZCAwJiYodHlwZW9mIGUudmVydGV4Q29sb3JzPT0ibnVtYmVyIj9pLnZlcnRleENvbG9ycz1lLnZlcnRleENvbG9ycz4wOmkudmVydGV4Q29sb3JzPWUudmVydGV4Q29sb3JzKSxlLnVuaWZvcm1zIT09dm9pZCAwKWZvcihjb25zdCBzIGluIGUudW5pZm9ybXMpe2NvbnN0IGE9ZS51bmlmb3Jtc1tzXTtzd2l0Y2goaS51bmlmb3Jtc1tzXT17fSxhLnR5cGUpe2Nhc2UidCI6aS51bmlmb3Jtc1tzXS52YWx1ZT1uKGEudmFsdWUpO2JyZWFrO2Nhc2UiYyI6aS51bmlmb3Jtc1tzXS52YWx1ZT1uZXcgeWUoKS5zZXRIZXgoYS52YWx1ZSk7YnJlYWs7Y2FzZSJ2MiI6aS51bmlmb3Jtc1tzXS52YWx1ZT1uZXcgcSgpLmZyb21BcnJheShhLnZhbHVlKTticmVhaztjYXNlInYzIjppLnVuaWZvcm1zW3NdLnZhbHVlPW5ldyBQKCkuZnJvbUFycmF5KGEudmFsdWUpO2JyZWFrO2Nhc2UidjQiOmkudW5pZm9ybXNbc10udmFsdWU9bmV3IGx0KCkuZnJvbUFycmF5KGEudmFsdWUpO2JyZWFrO2Nhc2UibTMiOmkudW5pZm9ybXNbc10udmFsdWU9bmV3IFplKCkuZnJvbUFycmF5KGEudmFsdWUpO2JyZWFrO2Nhc2UibTQiOmkudW5pZm9ybXNbc10udmFsdWU9bmV3IEllKCkuZnJvbUFycmF5KGEudmFsdWUpO2JyZWFrO2RlZmF1bHQ6aS51bmlmb3Jtc1tzXS52YWx1ZT1hLnZhbHVlfX1pZihlLmRlZmluZXMhPT12b2lkIDAmJihpLmRlZmluZXM9ZS5kZWZpbmVzKSxlLnZlcnRleFNoYWRlciE9PXZvaWQgMCYmKGkudmVydGV4U2hhZGVyPWUudmVydGV4U2hhZGVyKSxlLmZyYWdtZW50U2hhZGVyIT09dm9pZCAwJiYoaS5mcmFnbWVudFNoYWRlcj1lLmZyYWdtZW50U2hhZGVyKSxlLmdsc2xWZXJzaW9uIT09dm9pZCAwJiYoaS5nbHNsVmVyc2lvbj1lLmdsc2xWZXJzaW9uKSxlLmV4dGVuc2lvbnMhPT12b2lkIDApZm9yKGNvbnN0IHMgaW4gZS5leHRlbnNpb25zKWkuZXh0ZW5zaW9uc1tzXT1lLmV4dGVuc2lvbnNbc107aWYoZS5saWdodHMhPT12b2lkIDAmJihpLmxpZ2h0cz1lLmxpZ2h0cyksZS5jbGlwcGluZyE9PXZvaWQgMCYmKGkuY2xpcHBpbmc9ZS5jbGlwcGluZyksZS5zaXplIT09dm9pZCAwJiYoaS5zaXplPWUuc2l6ZSksZS5zaXplQXR0ZW51YXRpb24hPT12b2lkIDAmJihpLnNpemVBdHRlbnVhdGlvbj1lLnNpemVBdHRlbnVhdGlvbiksZS5tYXAhPT12b2lkIDAmJihpLm1hcD1uKGUubWFwKSksZS5tYXRjYXAhPT12b2lkIDAmJihpLm1hdGNhcD1uKGUubWF0Y2FwKSksZS5hbHBoYU1hcCE9PXZvaWQgMCYmKGkuYWxwaGFNYXA9bihlLmFscGhhTWFwKSksZS5idW1wTWFwIT09dm9pZCAwJiYoaS5idW1wTWFwPW4oZS5idW1wTWFwKSksZS5idW1wU2NhbGUhPT12b2lkIDAmJihpLmJ1bXBTY2FsZT1lLmJ1bXBTY2FsZSksZS5ub3JtYWxNYXAhPT12b2lkIDAmJihpLm5vcm1hbE1hcD1uKGUubm9ybWFsTWFwKSksZS5ub3JtYWxNYXBUeXBlIT09dm9pZCAwJiYoaS5ub3JtYWxNYXBUeXBlPWUubm9ybWFsTWFwVHlwZSksZS5ub3JtYWxTY2FsZSE9PXZvaWQgMCl7bGV0IHM9ZS5ub3JtYWxTY2FsZTtBcnJheS5pc0FycmF5KHMpPT09ITEmJihzPVtzLHNdKSxpLm5vcm1hbFNjYWxlPW5ldyBxKCkuZnJvbUFycmF5KHMpfXJldHVybiBlLmRpc3BsYWNlbWVudE1hcCE9PXZvaWQgMCYmKGkuZGlzcGxhY2VtZW50TWFwPW4oZS5kaXNwbGFjZW1lbnRNYXApKSxlLmRpc3BsYWNlbWVudFNjYWxlIT09dm9pZCAwJiYoaS5kaXNwbGFjZW1lbnRTY2FsZT1lLmRpc3BsYWNlbWVudFNjYWxlKSxlLmRpc3BsYWNlbWVudEJpYXMhPT12b2lkIDAmJihpLmRpc3BsYWNlbWVudEJpYXM9ZS5kaXNwbGFjZW1lbnRCaWFzKSxlLnJvdWdobmVzc01hcCE9PXZvaWQgMCYmKGkucm91Z2huZXNzTWFwPW4oZS5yb3VnaG5lc3NNYXApKSxlLm1ldGFsbmVzc01hcCE9PXZvaWQgMCYmKGkubWV0YWxuZXNzTWFwPW4oZS5tZXRhbG5lc3NNYXApKSxlLmVtaXNzaXZlTWFwIT09dm9pZCAwJiYoaS5lbWlzc2l2ZU1hcD1uKGUuZW1pc3NpdmVNYXApKSxlLmVtaXNzaXZlSW50ZW5zaXR5IT09dm9pZCAwJiYoaS5lbWlzc2l2ZUludGVuc2l0eT1lLmVtaXNzaXZlSW50ZW5zaXR5KSxlLnNwZWN1bGFyTWFwIT09dm9pZCAwJiYoaS5zcGVjdWxhck1hcD1uKGUuc3BlY3VsYXJNYXApKSxlLnNwZWN1bGFySW50ZW5zaXR5TWFwIT09dm9pZCAwJiYoaS5zcGVjdWxhckludGVuc2l0eU1hcD1uKGUuc3BlY3VsYXJJbnRlbnNpdHlNYXApKSxlLnNwZWN1bGFyQ29sb3JNYXAhPT12b2lkIDAmJihpLnNwZWN1bGFyQ29sb3JNYXA9bihlLnNwZWN1bGFyQ29sb3JNYXApKSxlLmVudk1hcCE9PXZvaWQgMCYmKGkuZW52TWFwPW4oZS5lbnZNYXApKSxlLmVudk1hcEludGVuc2l0eSE9PXZvaWQgMCYmKGkuZW52TWFwSW50ZW5zaXR5PWUuZW52TWFwSW50ZW5zaXR5KSxlLnJlZmxlY3Rpdml0eSE9PXZvaWQgMCYmKGkucmVmbGVjdGl2aXR5PWUucmVmbGVjdGl2aXR5KSxlLnJlZnJhY3Rpb25SYXRpbyE9PXZvaWQgMCYmKGkucmVmcmFjdGlvblJhdGlvPWUucmVmcmFjdGlvblJhdGlvKSxlLmxpZ2h0TWFwIT09dm9pZCAwJiYoaS5saWdodE1hcD1uKGUubGlnaHRNYXApKSxlLmxpZ2h0TWFwSW50ZW5zaXR5IT09dm9pZCAwJiYoaS5saWdodE1hcEludGVuc2l0eT1lLmxpZ2h0TWFwSW50ZW5zaXR5KSxlLmFvTWFwIT09dm9pZCAwJiYoaS5hb01hcD1uKGUuYW9NYXApKSxlLmFvTWFwSW50ZW5zaXR5IT09dm9pZCAwJiYoaS5hb01hcEludGVuc2l0eT1lLmFvTWFwSW50ZW5zaXR5KSxlLmdyYWRpZW50TWFwIT09dm9pZCAwJiYoaS5ncmFkaWVudE1hcD1uKGUuZ3JhZGllbnRNYXApKSxlLmNsZWFyY29hdE1hcCE9PXZvaWQgMCYmKGkuY2xlYXJjb2F0TWFwPW4oZS5jbGVhcmNvYXRNYXApKSxlLmNsZWFyY29hdFJvdWdobmVzc01hcCE9PXZvaWQgMCYmKGkuY2xlYXJjb2F0Um91Z2huZXNzTWFwPW4oZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXApKSxlLmNsZWFyY29hdE5vcm1hbE1hcCE9PXZvaWQgMCYmKGkuY2xlYXJjb2F0Tm9ybWFsTWFwPW4oZS5jbGVhcmNvYXROb3JtYWxNYXApKSxlLmNsZWFyY29hdE5vcm1hbFNjYWxlIT09dm9pZCAwJiYoaS5jbGVhcmNvYXROb3JtYWxTY2FsZT1uZXcgcSgpLmZyb21BcnJheShlLmNsZWFyY29hdE5vcm1hbFNjYWxlKSksZS5pcmlkZXNjZW5jZU1hcCE9PXZvaWQgMCYmKGkuaXJpZGVzY2VuY2VNYXA9bihlLmlyaWRlc2NlbmNlTWFwKSksZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCE9PXZvaWQgMCYmKGkuaXJpZGVzY2VuY2VUaGlja25lc3NNYXA9bihlLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwKSksZS50cmFuc21pc3Npb25NYXAhPT12b2lkIDAmJihpLnRyYW5zbWlzc2lvbk1hcD1uKGUudHJhbnNtaXNzaW9uTWFwKSksZS50aGlja25lc3NNYXAhPT12b2lkIDAmJihpLnRoaWNrbmVzc01hcD1uKGUudGhpY2tuZXNzTWFwKSksZS5hbmlzb3Ryb3B5TWFwIT09dm9pZCAwJiYoaS5hbmlzb3Ryb3B5TWFwPW4oZS5hbmlzb3Ryb3B5TWFwKSksZS5zaGVlbkNvbG9yTWFwIT09dm9pZCAwJiYoaS5zaGVlbkNvbG9yTWFwPW4oZS5zaGVlbkNvbG9yTWFwKSksZS5zaGVlblJvdWdobmVzc01hcCE9PXZvaWQgMCYmKGkuc2hlZW5Sb3VnaG5lc3NNYXA9bihlLnNoZWVuUm91Z2huZXNzTWFwKSksaX1zZXRUZXh0dXJlcyhlKXtyZXR1cm4gdGhpcy50ZXh0dXJlcz1lLHRoaXN9c3RhdGljIGNyZWF0ZU1hdGVyaWFsRnJvbVR5cGUoZSl7Y29uc3QgdD17U2hhZG93TWF0ZXJpYWw6X20sU3ByaXRlTWF0ZXJpYWw6RGgsUmF3U2hhZGVyTWF0ZXJpYWw6eG0sU2hhZGVyTWF0ZXJpYWw6SG4sUG9pbnRzTWF0ZXJpYWw6VmgsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6eW0sTWVzaFN0YW5kYXJkTWF0ZXJpYWw6bnUsTWVzaFBob25nTWF0ZXJpYWw6dm0sTWVzaFRvb25NYXRlcmlhbDpNbSxNZXNoTm9ybWFsTWF0ZXJpYWw6U20sTWVzaExhbWJlcnRNYXRlcmlhbDpibSxNZXNoRGVwdGhNYXRlcmlhbDpMaCxNZXNoRGlzdGFuY2VNYXRlcmlhbDpJaCxNZXNoQmFzaWNNYXRlcmlhbDpQaSxNZXNoTWF0Y2FwTWF0ZXJpYWw6d20sTGluZURhc2hlZE1hdGVyaWFsOkVtLExpbmVCYXNpY01hdGVyaWFsOkt0LE1hdGVyaWFsOkh0fTtyZXR1cm4gbmV3IHRbZV19fWNsYXNzIHV1e3N0YXRpYyBkZWNvZGVUZXh0KGUpe2lmKHR5cGVvZiBUZXh0RGVjb2RlciE9InVuZGVmaW5lZCIpcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShlKTtsZXQgdD0iIjtmb3IobGV0IG49MCxpPWUubGVuZ3RoO248aTtuKyspdCs9U3RyaW5nLmZyb21DaGFyQ29kZShlW25dKTt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlc2NhcGUodCkpfWNhdGNoKG4pe3JldHVybiB0fX1zdGF0aWMgZXh0cmFjdFVybEJhc2UoZSl7Y29uc3QgdD1lLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuIHQ9PT0tMT8iLi8iOmUuc2xpY2UoMCx0KzEpfXN0YXRpYyByZXNvbHZlVVJMKGUsdCl7cmV0dXJuIHR5cGVvZiBlIT0ic3RyaW5nInx8ZT09PSIiPyIiOigvXmh0dHBzPzpcL1wvL2kudGVzdCh0KSYmL15cLy8udGVzdChlKSYmKHQ9dC5yZXBsYWNlKC8oXmh0dHBzPzpcL1wvW15cL10rKS4qL2ksIiQxIikpLC9eKGh0dHBzPzopP1wvXC8vaS50ZXN0KGUpfHwvXmRhdGE6LiosLiokL2kudGVzdChlKXx8L15ibG9iOi4qJC9pLnRlc3QoZSk/ZTp0K2UpfX1jbGFzcyBIbSBleHRlbmRzIGtle2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk9ITAsdGhpcy50eXBlPSJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbnN0YW5jZUNvdW50PTEvMH1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMuaW5zdGFuY2VDb3VudD1lLmluc3RhbmNlQ291bnQsdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpO3JldHVybiBlLmluc3RhbmNlQ291bnQ9dGhpcy5pbnN0YW5jZUNvdW50LGUuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMCxlfX1jbGFzcyBXbSBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9bmV3IGNpKHMubWFuYWdlcik7YS5zZXRQYXRoKHMucGF0aCksYS5zZXRSZXF1ZXN0SGVhZGVyKHMucmVxdWVzdEhlYWRlciksYS5zZXRXaXRoQ3JlZGVudGlhbHMocy53aXRoQ3JlZGVudGlhbHMpLGEubG9hZChlLGZ1bmN0aW9uKG8pe3RyeXt0KHMucGFyc2UoSlNPTi5wYXJzZShvKSkpfWNhdGNoKGwpe2k/aShsKTpjb25zb2xlLmVycm9yKGwpLHMubWFuYWdlci5pdGVtRXJyb3IoZSl9fSxuLGkpfXBhcnNlKGUpe2NvbnN0IHQ9e30sbj17fTtmdW5jdGlvbiBpKGQscCl7aWYodFtwXSE9PXZvaWQgMClyZXR1cm4gdFtwXTtjb25zdCBnPWQuaW50ZXJsZWF2ZWRCdWZmZXJzW3BdLG09cyhkLGcuYnVmZmVyKSx5PVRyKGcudHlwZSxtKSx4PW5ldyBBbyh5LGcuc3RyaWRlKTtyZXR1cm4geC51dWlkPWcudXVpZCx0W3BdPXgseH1mdW5jdGlvbiBzKGQscCl7aWYobltwXSE9PXZvaWQgMClyZXR1cm4gbltwXTtjb25zdCBnPWQuYXJyYXlCdWZmZXJzW3BdLG09bmV3IFVpbnQzMkFycmF5KGcpLmJ1ZmZlcjtyZXR1cm4gbltwXT1tLG19Y29uc3QgYT1lLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk/bmV3IEhtOm5ldyBrZSxvPWUuZGF0YS5pbmRleDtpZihvIT09dm9pZCAwKXtjb25zdCBkPVRyKG8udHlwZSxvLmFycmF5KTthLnNldEluZGV4KG5ldyBLZShkLDEpKX1jb25zdCBsPWUuZGF0YS5hdHRyaWJ1dGVzO2Zvcihjb25zdCBkIGluIGwpe2NvbnN0IHA9bFtkXTtsZXQgXztpZihwLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IGc9aShlLmRhdGEscC5kYXRhKTtfPW5ldyBRaShnLHAuaXRlbVNpemUscC5vZmZzZXQscC5ub3JtYWxpemVkKX1lbHNle2NvbnN0IGc9VHIocC50eXBlLHAuYXJyYXkpLG09cC5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT9qcjpLZTtfPW5ldyBtKGcscC5pdGVtU2l6ZSxwLm5vcm1hbGl6ZWQpfXAubmFtZSE9PXZvaWQgMCYmKF8ubmFtZT1wLm5hbWUpLHAudXNhZ2UhPT12b2lkIDAmJl8uc2V0VXNhZ2UocC51c2FnZSksYS5zZXRBdHRyaWJ1dGUoZCxfKX1jb25zdCBjPWUuZGF0YS5tb3JwaEF0dHJpYnV0ZXM7aWYoYylmb3IoY29uc3QgZCBpbiBjKXtjb25zdCBwPWNbZF0sXz1bXTtmb3IobGV0IGc9MCxtPXAubGVuZ3RoO2c8bTtnKyspe2NvbnN0IHk9cFtnXTtsZXQgeDtpZih5LmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IHY9aShlLmRhdGEseS5kYXRhKTt4PW5ldyBRaSh2LHkuaXRlbVNpemUseS5vZmZzZXQseS5ub3JtYWxpemVkKX1lbHNle2NvbnN0IHY9VHIoeS50eXBlLHkuYXJyYXkpO3g9bmV3IEtlKHYseS5pdGVtU2l6ZSx5Lm5vcm1hbGl6ZWQpfXkubmFtZSE9PXZvaWQgMCYmKHgubmFtZT15Lm5hbWUpLF8ucHVzaCh4KX1hLm1vcnBoQXR0cmlidXRlc1tkXT1ffWUuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZSYmKGEubW9ycGhUYXJnZXRzUmVsYXRpdmU9ITApO2NvbnN0IHU9ZS5kYXRhLmdyb3Vwc3x8ZS5kYXRhLmRyYXdjYWxsc3x8ZS5kYXRhLm9mZnNldHM7aWYodSE9PXZvaWQgMClmb3IobGV0IGQ9MCxwPXUubGVuZ3RoO2QhPT1wOysrZCl7Y29uc3QgXz11W2RdO2EuYWRkR3JvdXAoXy5zdGFydCxfLmNvdW50LF8ubWF0ZXJpYWxJbmRleCl9Y29uc3QgZj1lLmRhdGEuYm91bmRpbmdTcGhlcmU7aWYoZiE9PXZvaWQgMCl7Y29uc3QgZD1uZXcgUDtmLmNlbnRlciE9PXZvaWQgMCYmZC5mcm9tQXJyYXkoZi5jZW50ZXIpLGEuYm91bmRpbmdTcGhlcmU9bmV3IEd0KGQsZi5yYWRpdXMpfXJldHVybiBlLm5hbWUmJihhLm5hbWU9ZS5uYW1lKSxlLnVzZXJEYXRhJiYoYS51c2VyRGF0YT1lLnVzZXJEYXRhKSxhfX1jbGFzcyBUYiBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9dGhpcy5wYXRoPT09IiI/dXUuZXh0cmFjdFVybEJhc2UoZSk6dGhpcy5wYXRoO3RoaXMucmVzb3VyY2VQYXRoPXRoaXMucmVzb3VyY2VQYXRofHxhO2NvbnN0IG89bmV3IGNpKHRoaXMubWFuYWdlcik7by5zZXRQYXRoKHRoaXMucGF0aCksby5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksby5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpLG8ubG9hZChlLGZ1bmN0aW9uKGwpe2xldCBjPW51bGw7dHJ5e2M9SlNPTi5wYXJzZShsKX1jYXRjaCh1KXtpIT09dm9pZCAwJiZpKHUpLGNvbnNvbGUuZXJyb3IoIlRIUkVFOk9iamVjdExvYWRlcjogQ2FuJ3QgcGFyc2UgIitlKyIuIix1Lm1lc3NhZ2UpO3JldHVybn1jb25zdCBoPWMubWV0YWRhdGE7aWYoaD09PXZvaWQgMHx8aC50eXBlPT09dm9pZCAwfHxoLnR5cGUudG9Mb3dlckNhc2UoKT09PSJnZW9tZXRyeSIpe2khPT12b2lkIDAmJmkobmV3IEVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIitlKSksY29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW4ndCBsb2FkICIrZSk7cmV0dXJufXMucGFyc2UoYyx0KX0sbixpKX1sb2FkQXN5bmMoZSx0KXtyZXR1cm4geXModGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IG49dGhpcyxpPXRoaXMucGF0aD09PSIiP3V1LmV4dHJhY3RVcmxCYXNlKGUpOnRoaXMucGF0aDt0aGlzLnJlc291cmNlUGF0aD10aGlzLnJlc291cmNlUGF0aHx8aTtjb25zdCBzPW5ldyBjaSh0aGlzLm1hbmFnZXIpO3Muc2V0UGF0aCh0aGlzLnBhdGgpLHMuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLHMuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKTtjb25zdCBhPXlpZWxkIHMubG9hZEFzeW5jKGUsdCksbz1KU09OLnBhcnNlKGEpLGw9by5tZXRhZGF0YTtpZihsPT09dm9pZCAwfHxsLnR5cGU9PT12b2lkIDB8fGwudHlwZS50b0xvd2VyQ2FzZSgpPT09Imdlb21ldHJ5Iil0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLk9iamVjdExvYWRlcjogQ2FuJ3QgbG9hZCAiK2UpO3JldHVybiB5aWVsZCBuLnBhcnNlQXN5bmMobyl9KX1wYXJzZShlLHQpe2NvbnN0IG49dGhpcy5wYXJzZUFuaW1hdGlvbnMoZS5hbmltYXRpb25zKSxpPXRoaXMucGFyc2VTaGFwZXMoZS5zaGFwZXMpLHM9dGhpcy5wYXJzZUdlb21ldHJpZXMoZS5nZW9tZXRyaWVzLGkpLGE9dGhpcy5wYXJzZUltYWdlcyhlLmltYWdlcyxmdW5jdGlvbigpe3QhPT12b2lkIDAmJnQoYyl9KSxvPXRoaXMucGFyc2VUZXh0dXJlcyhlLnRleHR1cmVzLGEpLGw9dGhpcy5wYXJzZU1hdGVyaWFscyhlLm1hdGVyaWFscyxvKSxjPXRoaXMucGFyc2VPYmplY3QoZS5vYmplY3QscyxsLG8sbiksaD10aGlzLnBhcnNlU2tlbGV0b25zKGUuc2tlbGV0b25zLGMpO2lmKHRoaXMuYmluZFNrZWxldG9ucyhjLGgpLHQhPT12b2lkIDApe2xldCB1PSExO2Zvcihjb25zdCBmIGluIGEpaWYoYVtmXS5kYXRhIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCl7dT0hMDticmVha311PT09ITEmJnQoYyl9cmV0dXJuIGN9cGFyc2VBc3luYyhlKXtyZXR1cm4geXModGhpcyxudWxsLGZ1bmN0aW9uKigpe2NvbnN0IHQ9dGhpcy5wYXJzZUFuaW1hdGlvbnMoZS5hbmltYXRpb25zKSxuPXRoaXMucGFyc2VTaGFwZXMoZS5zaGFwZXMpLGk9dGhpcy5wYXJzZUdlb21ldHJpZXMoZS5nZW9tZXRyaWVzLG4pLHM9eWllbGQgdGhpcy5wYXJzZUltYWdlc0FzeW5jKGUuaW1hZ2VzKSxhPXRoaXMucGFyc2VUZXh0dXJlcyhlLnRleHR1cmVzLHMpLG89dGhpcy5wYXJzZU1hdGVyaWFscyhlLm1hdGVyaWFscyxhKSxsPXRoaXMucGFyc2VPYmplY3QoZS5vYmplY3QsaSxvLGEsdCksYz10aGlzLnBhcnNlU2tlbGV0b25zKGUuc2tlbGV0b25zLGwpO3JldHVybiB0aGlzLmJpbmRTa2VsZXRvbnMobCxjKSxsfSl9cGFyc2VTaGFwZXMoZSl7Y29uc3QgdD17fTtpZihlIT09dm9pZCAwKWZvcihsZXQgbj0wLGk9ZS5sZW5ndGg7bjxpO24rKyl7Y29uc3Qgcz1uZXcgb2koKS5mcm9tSlNPTihlW25dKTt0W3MudXVpZF09c31yZXR1cm4gdH1wYXJzZVNrZWxldG9ucyhlLHQpe2NvbnN0IG49e30saT17fTtpZih0LnRyYXZlcnNlKGZ1bmN0aW9uKHMpe3MuaXNCb25lJiYoaVtzLnV1aWRdPXMpfSksZSE9PXZvaWQgMClmb3IobGV0IHM9MCxhPWUubGVuZ3RoO3M8YTtzKyspe2NvbnN0IG89bmV3IElvKCkuZnJvbUpTT04oZVtzXSxpKTtuW28udXVpZF09b31yZXR1cm4gbn1wYXJzZUdlb21ldHJpZXMoZSx0KXtjb25zdCBuPXt9O2lmKGUhPT12b2lkIDApe2NvbnN0IGk9bmV3IFdtO2ZvcihsZXQgcz0wLGE9ZS5sZW5ndGg7czxhO3MrKyl7bGV0IG87Y29uc3QgbD1lW3NdO3N3aXRjaChsLnR5cGUpe2Nhc2UiQnVmZmVyR2VvbWV0cnkiOmNhc2UiSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkiOm89aS5wYXJzZShsKTticmVhaztkZWZhdWx0OmwudHlwZSBpbiBnbT9vPWdtW2wudHlwZV0uZnJvbUpTT04obCx0KTpjb25zb2xlLndhcm4oYFRIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSAiJHtsLnR5cGV9ImApfW8udXVpZD1sLnV1aWQsbC5uYW1lIT09dm9pZCAwJiYoby5uYW1lPWwubmFtZSksbC51c2VyRGF0YSE9PXZvaWQgMCYmKG8udXNlckRhdGE9bC51c2VyRGF0YSksbltsLnV1aWRdPW99fXJldHVybiBufXBhcnNlTWF0ZXJpYWxzKGUsdCl7Y29uc3Qgbj17fSxpPXt9O2lmKGUhPT12b2lkIDApe2NvbnN0IHM9bmV3IGFsO3Muc2V0VGV4dHVyZXModCk7Zm9yKGxldCBhPTAsbz1lLmxlbmd0aDthPG87YSsrKXtjb25zdCBsPWVbYV07bltsLnV1aWRdPT09dm9pZCAwJiYobltsLnV1aWRdPXMucGFyc2UobCkpLGlbbC51dWlkXT1uW2wudXVpZF19fXJldHVybiBpfXBhcnNlQW5pbWF0aW9ucyhlKXtjb25zdCB0PXt9O2lmKGUhPT12b2lkIDApZm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2NvbnN0IGk9ZVtuXSxzPWRhLnBhcnNlKGkpO3Rbcy51dWlkXT1zfXJldHVybiB0fXBhcnNlSW1hZ2VzKGUsdCl7Y29uc3Qgbj10aGlzLGk9e307bGV0IHM7ZnVuY3Rpb24gYShsKXtyZXR1cm4gbi5tYW5hZ2VyLml0ZW1TdGFydChsKSxzLmxvYWQobCxmdW5jdGlvbigpe24ubWFuYWdlci5pdGVtRW5kKGwpfSx2b2lkIDAsZnVuY3Rpb24oKXtuLm1hbmFnZXIuaXRlbUVycm9yKGwpLG4ubWFuYWdlci5pdGVtRW5kKGwpfSl9ZnVuY3Rpb24gbyhsKXtpZih0eXBlb2YgbD09InN0cmluZyIpe2NvbnN0IGM9bCxoPS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KGMpP2M6bi5yZXNvdXJjZVBhdGgrYztyZXR1cm4gYShoKX1lbHNlIHJldHVybiBsLmRhdGE/e2RhdGE6VHIobC50eXBlLGwuZGF0YSksd2lkdGg6bC53aWR0aCxoZWlnaHQ6bC5oZWlnaHR9Om51bGx9aWYoZSE9PXZvaWQgMCYmZS5sZW5ndGg+MCl7Y29uc3QgbD1uZXcgb3UodCk7cz1uZXcgcGEobCkscy5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTtmb3IobGV0IGM9MCxoPWUubGVuZ3RoO2M8aDtjKyspe2NvbnN0IHU9ZVtjXSxmPXUudXJsO2lmKEFycmF5LmlzQXJyYXkoZikpe2NvbnN0IGQ9W107Zm9yKGxldCBwPTAsXz1mLmxlbmd0aDtwPF87cCsrKXtjb25zdCBnPWZbcF0sbT1vKGcpO20hPT1udWxsJiYobSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ/ZC5wdXNoKG0pOmQucHVzaChuZXcgamkobS5kYXRhLG0ud2lkdGgsbS5oZWlnaHQpKSl9aVt1LnV1aWRdPW5ldyBXaShkKX1lbHNle2NvbnN0IGQ9byh1LnVybCk7aVt1LnV1aWRdPW5ldyBXaShkKX19fXJldHVybiBpfXBhcnNlSW1hZ2VzQXN5bmMoZSl7cmV0dXJuIHlzKHRoaXMsbnVsbCxmdW5jdGlvbiooKXtjb25zdCB0PXRoaXMsbj17fTtsZXQgaTtmdW5jdGlvbiBzKGEpe3JldHVybiB5cyh0aGlzLG51bGwsZnVuY3Rpb24qKCl7aWYodHlwZW9mIGE9PSJzdHJpbmciKXtjb25zdCBvPWEsbD0vXihcL1wvKXwoW2Etel0rOihcL1wvKT8pL2kudGVzdChvKT9vOnQucmVzb3VyY2VQYXRoK287cmV0dXJuIHlpZWxkIGkubG9hZEFzeW5jKGwpfWVsc2UgcmV0dXJuIGEuZGF0YT97ZGF0YTpUcihhLnR5cGUsYS5kYXRhKSx3aWR0aDphLndpZHRoLGhlaWdodDphLmhlaWdodH06bnVsbH0pfWlmKGUhPT12b2lkIDAmJmUubGVuZ3RoPjApe2k9bmV3IHBhKHRoaXMubWFuYWdlciksaS5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTtmb3IobGV0IGE9MCxvPWUubGVuZ3RoO2E8bzthKyspe2NvbnN0IGw9ZVthXSxjPWwudXJsO2lmKEFycmF5LmlzQXJyYXkoYykpe2NvbnN0IGg9W107Zm9yKGxldCB1PTAsZj1jLmxlbmd0aDt1PGY7dSsrKXtjb25zdCBkPWNbdV0scD15aWVsZCBzKGQpO3AhPT1udWxsJiYocCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ/aC5wdXNoKHApOmgucHVzaChuZXcgamkocC5kYXRhLHAud2lkdGgscC5oZWlnaHQpKSl9bltsLnV1aWRdPW5ldyBXaShoKX1lbHNle2NvbnN0IGg9eWllbGQgcyhsLnVybCk7bltsLnV1aWRdPW5ldyBXaShoKX19fXJldHVybiBufSl9cGFyc2VUZXh0dXJlcyhlLHQpe2Z1bmN0aW9uIG4ocyxhKXtyZXR1cm4gdHlwZW9mIHM9PSJudW1iZXIiP3M6KGNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlVGV4dHVyZTogQ29uc3RhbnQgc2hvdWxkIGJlIGluIG51bWVyaWMgZm9ybS4iLHMpLGFbc10pfWNvbnN0IGk9e307aWYoZSE9PXZvaWQgMClmb3IobGV0IHM9MCxhPWUubGVuZ3RoO3M8YTtzKyspe2NvbnN0IG89ZVtzXTtvLmltYWdlPT09dm9pZCAwJiZjb25zb2xlLndhcm4oJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gImltYWdlIiBzcGVjaWZpZWQgZm9yJyxvLnV1aWQpLHRbby5pbWFnZV09PT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UiLG8uaW1hZ2UpO2NvbnN0IGw9dFtvLmltYWdlXSxjPWwuZGF0YTtsZXQgaDtBcnJheS5pc0FycmF5KGMpPyhoPW5ldyBYcyxjLmxlbmd0aD09PTYmJihoLm5lZWRzVXBkYXRlPSEwKSk6KGMmJmMuZGF0YT9oPW5ldyBqaTpoPW5ldyBFdCxjJiYoaC5uZWVkc1VwZGF0ZT0hMCkpLGguc291cmNlPWwsaC51dWlkPW8udXVpZCxvLm5hbWUhPT12b2lkIDAmJihoLm5hbWU9by5uYW1lKSxvLm1hcHBpbmchPT12b2lkIDAmJihoLm1hcHBpbmc9bihvLm1hcHBpbmcsQ2IpKSxvLmNoYW5uZWwhPT12b2lkIDAmJihoLmNoYW5uZWw9by5jaGFubmVsKSxvLm9mZnNldCE9PXZvaWQgMCYmaC5vZmZzZXQuZnJvbUFycmF5KG8ub2Zmc2V0KSxvLnJlcGVhdCE9PXZvaWQgMCYmaC5yZXBlYXQuZnJvbUFycmF5KG8ucmVwZWF0KSxvLmNlbnRlciE9PXZvaWQgMCYmaC5jZW50ZXIuZnJvbUFycmF5KG8uY2VudGVyKSxvLnJvdGF0aW9uIT09dm9pZCAwJiYoaC5yb3RhdGlvbj1vLnJvdGF0aW9uKSxvLndyYXAhPT12b2lkIDAmJihoLndyYXBTPW4oby53cmFwWzBdLFhtKSxoLndyYXBUPW4oby53cmFwWzFdLFhtKSksby5mb3JtYXQhPT12b2lkIDAmJihoLmZvcm1hdD1vLmZvcm1hdCksby5pbnRlcm5hbEZvcm1hdCE9PXZvaWQgMCYmKGguaW50ZXJuYWxGb3JtYXQ9by5pbnRlcm5hbEZvcm1hdCksby50eXBlIT09dm9pZCAwJiYoaC50eXBlPW8udHlwZSksby5jb2xvclNwYWNlIT09dm9pZCAwJiYoaC5jb2xvclNwYWNlPW8uY29sb3JTcGFjZSksby5lbmNvZGluZyE9PXZvaWQgMCYmKGguZW5jb2Rpbmc9by5lbmNvZGluZyksby5taW5GaWx0ZXIhPT12b2lkIDAmJihoLm1pbkZpbHRlcj1uKG8ubWluRmlsdGVyLHFtKSksby5tYWdGaWx0ZXIhPT12b2lkIDAmJihoLm1hZ0ZpbHRlcj1uKG8ubWFnRmlsdGVyLHFtKSksby5hbmlzb3Ryb3B5IT09dm9pZCAwJiYoaC5hbmlzb3Ryb3B5PW8uYW5pc290cm9weSksby5mbGlwWSE9PXZvaWQgMCYmKGguZmxpcFk9by5mbGlwWSksby5nZW5lcmF0ZU1pcG1hcHMhPT12b2lkIDAmJihoLmdlbmVyYXRlTWlwbWFwcz1vLmdlbmVyYXRlTWlwbWFwcyksby5wcmVtdWx0aXBseUFscGhhIT09dm9pZCAwJiYoaC5wcmVtdWx0aXBseUFscGhhPW8ucHJlbXVsdGlwbHlBbHBoYSksby51bnBhY2tBbGlnbm1lbnQhPT12b2lkIDAmJihoLnVucGFja0FsaWdubWVudD1vLnVucGFja0FsaWdubWVudCksby5jb21wYXJlRnVuY3Rpb24hPT12b2lkIDAmJihoLmNvbXBhcmVGdW5jdGlvbj1vLmNvbXBhcmVGdW5jdGlvbiksby51c2VyRGF0YSE9PXZvaWQgMCYmKGgudXNlckRhdGE9by51c2VyRGF0YSksaVtvLnV1aWRdPWh9cmV0dXJuIGl9cGFyc2VPYmplY3QoZSx0LG4saSxzKXtsZXQgYTtmdW5jdGlvbiBvKGYpe3JldHVybiB0W2ZdPT09dm9pZCAwJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5IixmKSx0W2ZdfWZ1bmN0aW9uIGwoZil7aWYoZiE9PXZvaWQgMCl7aWYoQXJyYXkuaXNBcnJheShmKSl7Y29uc3QgZD1bXTtmb3IobGV0IHA9MCxfPWYubGVuZ3RoO3A8XztwKyspe2NvbnN0IGc9ZltwXTtuW2ddPT09dm9pZCAwJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsIixnKSxkLnB1c2gobltnXSl9cmV0dXJuIGR9cmV0dXJuIG5bZl09PT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLGYpLG5bZl19fWZ1bmN0aW9uIGMoZil7cmV0dXJuIGlbZl09PT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZSIsZiksaVtmXX1sZXQgaCx1O3N3aXRjaChlLnR5cGUpe2Nhc2UiU2NlbmUiOmE9bmV3IEVwLGUuYmFja2dyb3VuZCE9PXZvaWQgMCYmKE51bWJlci5pc0ludGVnZXIoZS5iYWNrZ3JvdW5kKT9hLmJhY2tncm91bmQ9bmV3IHllKGUuYmFja2dyb3VuZCk6YS5iYWNrZ3JvdW5kPWMoZS5iYWNrZ3JvdW5kKSksZS5lbnZpcm9ubWVudCE9PXZvaWQgMCYmKGEuZW52aXJvbm1lbnQ9YyhlLmVudmlyb25tZW50KSksZS5mb2chPT12b2lkIDAmJihlLmZvZy50eXBlPT09IkZvZyI/YS5mb2c9bmV3IEVvKGUuZm9nLmNvbG9yLGUuZm9nLm5lYXIsZS5mb2cuZmFyKTplLmZvZy50eXBlPT09IkZvZ0V4cDIiJiYoYS5mb2c9bmV3IHdvKGUuZm9nLmNvbG9yLGUuZm9nLmRlbnNpdHkpKSxlLmZvZy5uYW1lIT09IiImJihhLmZvZy5uYW1lPWUuZm9nLm5hbWUpKSxlLmJhY2tncm91bmRCbHVycmluZXNzIT09dm9pZCAwJiYoYS5iYWNrZ3JvdW5kQmx1cnJpbmVzcz1lLmJhY2tncm91bmRCbHVycmluZXNzKSxlLmJhY2tncm91bmRJbnRlbnNpdHkhPT12b2lkIDAmJihhLmJhY2tncm91bmRJbnRlbnNpdHk9ZS5iYWNrZ3JvdW5kSW50ZW5zaXR5KTticmVhaztjYXNlIlBlcnNwZWN0aXZlQ2FtZXJhIjphPW5ldyBCdChlLmZvdixlLmFzcGVjdCxlLm5lYXIsZS5mYXIpLGUuZm9jdXMhPT12b2lkIDAmJihhLmZvY3VzPWUuZm9jdXMpLGUuem9vbSE9PXZvaWQgMCYmKGEuem9vbT1lLnpvb20pLGUuZmlsbUdhdWdlIT09dm9pZCAwJiYoYS5maWxtR2F1Z2U9ZS5maWxtR2F1Z2UpLGUuZmlsbU9mZnNldCE9PXZvaWQgMCYmKGEuZmlsbU9mZnNldD1lLmZpbG1PZmZzZXQpLGUudmlldyE9PXZvaWQgMCYmKGEudmlldz1PYmplY3QuYXNzaWduKHt9LGUudmlldykpO2JyZWFrO2Nhc2UiT3J0aG9ncmFwaGljQ2FtZXJhIjphPW5ldyB2byhlLmxlZnQsZS5yaWdodCxlLnRvcCxlLmJvdHRvbSxlLm5lYXIsZS5mYXIpLGUuem9vbSE9PXZvaWQgMCYmKGEuem9vbT1lLnpvb20pLGUudmlldyE9PXZvaWQgMCYmKGEudmlldz1PYmplY3QuYXNzaWduKHt9LGUudmlldykpO2JyZWFrO2Nhc2UiQW1iaWVudExpZ2h0IjphPW5ldyB6bShlLmNvbG9yLGUuaW50ZW5zaXR5KTticmVhaztjYXNlIkRpcmVjdGlvbmFsTGlnaHQiOmE9bmV3IEJtKGUuY29sb3IsZS5pbnRlbnNpdHkpO2JyZWFrO2Nhc2UiUG9pbnRMaWdodCI6YT1uZXcgT20oZS5jb2xvcixlLmludGVuc2l0eSxlLmRpc3RhbmNlLGUuZGVjYXkpO2JyZWFrO2Nhc2UiUmVjdEFyZWFMaWdodCI6YT1uZXcga20oZS5jb2xvcixlLmludGVuc2l0eSxlLndpZHRoLGUuaGVpZ2h0KTticmVhaztjYXNlIlNwb3RMaWdodCI6YT1uZXcgTm0oZS5jb2xvcixlLmludGVuc2l0eSxlLmRpc3RhbmNlLGUuYW5nbGUsZS5wZW51bWJyYSxlLmRlY2F5KTticmVhaztjYXNlIkhlbWlzcGhlcmVMaWdodCI6YT1uZXcgSW0oZS5jb2xvcixlLmdyb3VuZENvbG9yLGUuaW50ZW5zaXR5KTticmVhaztjYXNlIkxpZ2h0UHJvYmUiOmE9bmV3IFZtKCkuZnJvbUpTT04oZSk7YnJlYWs7Y2FzZSJTa2lubmVkTWVzaCI6aD1vKGUuZ2VvbWV0cnkpLHU9bChlLm1hdGVyaWFsKSxhPW5ldyBPcChoLHUpLGUuYmluZE1vZGUhPT12b2lkIDAmJihhLmJpbmRNb2RlPWUuYmluZE1vZGUpLGUuYmluZE1hdHJpeCE9PXZvaWQgMCYmYS5iaW5kTWF0cml4LmZyb21BcnJheShlLmJpbmRNYXRyaXgpLGUuc2tlbGV0b24hPT12b2lkIDAmJihhLnNrZWxldG9uPWUuc2tlbGV0b24pO2JyZWFrO2Nhc2UiTWVzaCI6aD1vKGUuZ2VvbWV0cnkpLHU9bChlLm1hdGVyaWFsKSxhPW5ldyBMdChoLHUpO2JyZWFrO2Nhc2UiSW5zdGFuY2VkTWVzaCI6aD1vKGUuZ2VvbWV0cnkpLHU9bChlLm1hdGVyaWFsKTtjb25zdCBmPWUuY291bnQsZD1lLmluc3RhbmNlTWF0cml4LHA9ZS5pbnN0YW5jZUNvbG9yO2E9bmV3IEdwKGgsdSxmKSxhLmluc3RhbmNlTWF0cml4PW5ldyBqcihuZXcgRmxvYXQzMkFycmF5KGQuYXJyYXkpLDE2KSxwIT09dm9pZCAwJiYoYS5pbnN0YW5jZUNvbG9yPW5ldyBqcihuZXcgRmxvYXQzMkFycmF5KHAuYXJyYXkpLHAuaXRlbVNpemUpKTticmVhaztjYXNlIkJhdGNoZWRNZXNoIjpoPW8oZS5nZW9tZXRyeSksdT1sKGUubWF0ZXJpYWwpLGE9bmV3IFdwKGUubWF4R2VvbWV0cnlDb3VudCxlLm1heFZlcnRleENvdW50LGUubWF4SW5kZXhDb3VudCx1KSxhLmdlb21ldHJ5PWgsYS5wZXJPYmplY3RGcnVzdHVtQ3VsbGVkPWUucGVyT2JqZWN0RnJ1c3R1bUN1bGxlZCxhLnNvcnRPYmplY3RzPWUuc29ydE9iamVjdHMsYS5fZHJhd1Jhbmdlcz1lLmRyYXdSYW5nZXMsYS5fcmVzZXJ2ZWRSYW5nZXM9ZS5yZXNlcnZlZFJhbmdlcyxhLl92aXNpYmlsaXR5PWUudmlzaWJpbGl0eSxhLl9hY3RpdmU9ZS5hY3RpdmUsYS5fYm91bmRzPWUuYm91bmRzLm1hcChfPT57Y29uc3QgZz1uZXcgRHQ7Zy5taW4uZnJvbUFycmF5KF8uYm94TWluKSxnLm1heC5mcm9tQXJyYXkoXy5ib3hNYXgpO2NvbnN0IG09bmV3IEd0O3JldHVybiBtLnJhZGl1cz1fLnNwaGVyZVJhZGl1cyxtLmNlbnRlci5mcm9tQXJyYXkoXy5zcGhlcmVDZW50ZXIpLHtib3hJbml0aWFsaXplZDpfLmJveEluaXRpYWxpemVkLGJveDpnLHNwaGVyZUluaXRpYWxpemVkOl8uc3BoZXJlSW5pdGlhbGl6ZWQsc3BoZXJlOm19fSksYS5fbWF4R2VvbWV0cnlDb3VudD1lLm1heEdlb21ldHJ5Q291bnQsYS5fbWF4VmVydGV4Q291bnQ9ZS5tYXhWZXJ0ZXhDb3VudCxhLl9tYXhJbmRleENvdW50PWUubWF4SW5kZXhDb3VudCxhLl9nZW9tZXRyeUluaXRpYWxpemVkPWUuZ2VvbWV0cnlJbml0aWFsaXplZCxhLl9nZW9tZXRyeUNvdW50PWUuZ2VvbWV0cnlDb3VudCxhLl9tYXRyaWNlc1RleHR1cmU9YyhlLm1hdHJpY2VzVGV4dHVyZS51dWlkKTticmVhaztjYXNlIkxPRCI6YT1uZXcgTHA7YnJlYWs7Y2FzZSJMaW5lIjphPW5ldyBVaShvKGUuZ2VvbWV0cnkpLGwoZS5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UiTGluZUxvb3AiOmE9bmV3IEpwKG8oZS5nZW9tZXRyeSksbChlLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJMaW5lU2VnbWVudHMiOmE9bmV3IFduKG8oZS5nZW9tZXRyeSksbChlLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJQb2ludENsb3VkIjpjYXNlIlBvaW50cyI6YT1uZXcgUXAobyhlLmdlb21ldHJ5KSxsKGUubWF0ZXJpYWwpKTticmVhaztjYXNlIlNwcml0ZSI6YT1uZXcgUnAobChlLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJHcm91cCI6YT1uZXcgWXI7YnJlYWs7Y2FzZSJCb25lIjphPW5ldyBCaDticmVhaztkZWZhdWx0OmE9bmV3IHJ0fWlmKGEudXVpZD1lLnV1aWQsZS5uYW1lIT09dm9pZCAwJiYoYS5uYW1lPWUubmFtZSksZS5tYXRyaXghPT12b2lkIDA/KGEubWF0cml4LmZyb21BcnJheShlLm1hdHJpeCksZS5tYXRyaXhBdXRvVXBkYXRlIT09dm9pZCAwJiYoYS5tYXRyaXhBdXRvVXBkYXRlPWUubWF0cml4QXV0b1VwZGF0ZSksYS5tYXRyaXhBdXRvVXBkYXRlJiZhLm1hdHJpeC5kZWNvbXBvc2UoYS5wb3NpdGlvbixhLnF1YXRlcm5pb24sYS5zY2FsZSkpOihlLnBvc2l0aW9uIT09dm9pZCAwJiZhLnBvc2l0aW9uLmZyb21BcnJheShlLnBvc2l0aW9uKSxlLnJvdGF0aW9uIT09dm9pZCAwJiZhLnJvdGF0aW9uLmZyb21BcnJheShlLnJvdGF0aW9uKSxlLnF1YXRlcm5pb24hPT12b2lkIDAmJmEucXVhdGVybmlvbi5mcm9tQXJyYXkoZS5xdWF0ZXJuaW9uKSxlLnNjYWxlIT09dm9pZCAwJiZhLnNjYWxlLmZyb21BcnJheShlLnNjYWxlKSksZS51cCE9PXZvaWQgMCYmYS51cC5mcm9tQXJyYXkoZS51cCksZS5jYXN0U2hhZG93IT09dm9pZCAwJiYoYS5jYXN0U2hhZG93PWUuY2FzdFNoYWRvdyksZS5yZWNlaXZlU2hhZG93IT09dm9pZCAwJiYoYS5yZWNlaXZlU2hhZG93PWUucmVjZWl2ZVNoYWRvdyksZS5zaGFkb3cmJihlLnNoYWRvdy5iaWFzIT09dm9pZCAwJiYoYS5zaGFkb3cuYmlhcz1lLnNoYWRvdy5iaWFzKSxlLnNoYWRvdy5ub3JtYWxCaWFzIT09dm9pZCAwJiYoYS5zaGFkb3cubm9ybWFsQmlhcz1lLnNoYWRvdy5ub3JtYWxCaWFzKSxlLnNoYWRvdy5yYWRpdXMhPT12b2lkIDAmJihhLnNoYWRvdy5yYWRpdXM9ZS5zaGFkb3cucmFkaXVzKSxlLnNoYWRvdy5tYXBTaXplIT09dm9pZCAwJiZhLnNoYWRvdy5tYXBTaXplLmZyb21BcnJheShlLnNoYWRvdy5tYXBTaXplKSxlLnNoYWRvdy5jYW1lcmEhPT12b2lkIDAmJihhLnNoYWRvdy5jYW1lcmE9dGhpcy5wYXJzZU9iamVjdChlLnNoYWRvdy5jYW1lcmEpKSksZS52aXNpYmxlIT09dm9pZCAwJiYoYS52aXNpYmxlPWUudmlzaWJsZSksZS5mcnVzdHVtQ3VsbGVkIT09dm9pZCAwJiYoYS5mcnVzdHVtQ3VsbGVkPWUuZnJ1c3R1bUN1bGxlZCksZS5yZW5kZXJPcmRlciE9PXZvaWQgMCYmKGEucmVuZGVyT3JkZXI9ZS5yZW5kZXJPcmRlciksZS51c2VyRGF0YSE9PXZvaWQgMCYmKGEudXNlckRhdGE9ZS51c2VyRGF0YSksZS5sYXllcnMhPT12b2lkIDAmJihhLmxheWVycy5tYXNrPWUubGF5ZXJzKSxlLmNoaWxkcmVuIT09dm9pZCAwKXtjb25zdCBmPWUuY2hpbGRyZW47Zm9yKGxldCBkPTA7ZDxmLmxlbmd0aDtkKyspYS5hZGQodGhpcy5wYXJzZU9iamVjdChmW2RdLHQsbixpLHMpKX1pZihlLmFuaW1hdGlvbnMhPT12b2lkIDApe2NvbnN0IGY9ZS5hbmltYXRpb25zO2ZvcihsZXQgZD0wO2Q8Zi5sZW5ndGg7ZCsrKXtjb25zdCBwPWZbZF07YS5hbmltYXRpb25zLnB1c2goc1twXSl9fWlmKGUudHlwZT09PSJMT0QiKXtlLmF1dG9VcGRhdGUhPT12b2lkIDAmJihhLmF1dG9VcGRhdGU9ZS5hdXRvVXBkYXRlKTtjb25zdCBmPWUubGV2ZWxzO2ZvcihsZXQgZD0wO2Q8Zi5sZW5ndGg7ZCsrKXtjb25zdCBwPWZbZF0sXz1hLmdldE9iamVjdEJ5UHJvcGVydHkoInV1aWQiLHAub2JqZWN0KTtfIT09dm9pZCAwJiZhLmFkZExldmVsKF8scC5kaXN0YW5jZSxwLmh5c3RlcmVzaXMpfX1yZXR1cm4gYX1iaW5kU2tlbGV0b25zKGUsdCl7T2JqZWN0LmtleXModCkubGVuZ3RoIT09MCYmZS50cmF2ZXJzZShmdW5jdGlvbihuKXtpZihuLmlzU2tpbm5lZE1lc2g9PT0hMCYmbi5za2VsZXRvbiE9PXZvaWQgMCl7Y29uc3QgaT10W24uc2tlbGV0b25dO2k9PT12b2lkIDA/Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IE5vIHNrZWxldG9uIGZvdW5kIHdpdGggVVVJRDoiLG4uc2tlbGV0b24pOm4uYmluZChpLG4uYmluZE1hdHJpeCl9fSl9fWNvbnN0IENiPXtVVk1hcHBpbmc6RmEsQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOktuLEN1YmVSZWZyYWN0aW9uTWFwcGluZzp5aSxFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzpicyxFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzp3cyxDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpicn0sWG09e1JlcGVhdFdyYXBwaW5nOkVzLENsYW1wVG9FZGdlV3JhcHBpbmc6enQsTWlycm9yZWRSZXBlYXRXcmFwcGluZzpBc30scW09e05lYXJlc3RGaWx0ZXI6YnQsTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI6T2EsTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjpUcyxMaW5lYXJGaWx0ZXI6d3QsTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcjptYyxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI6dml9O2NsYXNzIFJiIGV4dGVuZHMgdW57Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5pc0ltYWdlQml0bWFwTG9hZGVyPSEwLHR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcD09InVuZGVmaW5lZCImJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGNyZWF0ZUltYWdlQml0bWFwKCkgbm90IHN1cHBvcnRlZC4iKSx0eXBlb2YgZmV0Y2g9PSJ1bmRlZmluZWQiJiZjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuIiksdGhpcy5vcHRpb25zPXtwcmVtdWx0aXBseUFscGhhOiJub25lIn19c2V0T3B0aW9ucyhlKXtyZXR1cm4gdGhpcy5vcHRpb25zPWUsdGhpc31sb2FkKGUsdCxuLGkpe2U9PT12b2lkIDAmJihlPSIiKSx0aGlzLnBhdGghPT12b2lkIDAmJihlPXRoaXMucGF0aCtlKSxlPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGUpO2NvbnN0IHM9dGhpcyxhPXNyLmdldChlKTtpZihhIT09dm9pZCAwKXJldHVybiBzLm1hbmFnZXIuaXRlbVN0YXJ0KGUpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0JiZ0KGEpLHMubWFuYWdlci5pdGVtRW5kKGUpfSwwKSxhO2NvbnN0IG89e307by5jcmVkZW50aWFscz10aGlzLmNyb3NzT3JpZ2luPT09ImFub255bW91cyI/InNhbWUtb3JpZ2luIjoiaW5jbHVkZSIsby5oZWFkZXJzPXRoaXMucmVxdWVzdEhlYWRlcixmZXRjaChlLG8pLnRoZW4oZnVuY3Rpb24obCl7cmV0dXJuIGwuYmxvYigpfSkudGhlbihmdW5jdGlvbihsKXtyZXR1cm4gY3JlYXRlSW1hZ2VCaXRtYXAobCxPYmplY3QuYXNzaWduKHMub3B0aW9ucyx7Y29sb3JTcGFjZUNvbnZlcnNpb246Im5vbmUifSkpfSkudGhlbihmdW5jdGlvbihsKXtzci5hZGQoZSxsKSx0JiZ0KGwpLHMubWFuYWdlci5pdGVtRW5kKGUpfSkuY2F0Y2goZnVuY3Rpb24obCl7aSYmaShsKSxzLm1hbmFnZXIuaXRlbUVycm9yKGUpLHMubWFuYWdlci5pdGVtRW5kKGUpfSkscy5tYW5hZ2VyLml0ZW1TdGFydChlKX19bGV0IG9sO2NsYXNzIGZ1e3N0YXRpYyBnZXRDb250ZXh0KCl7cmV0dXJuIG9sPT09dm9pZCAwJiYob2w9bmV3KHdpbmRvdy5BdWRpb0NvbnRleHR8fHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQpKSxvbH1zdGF0aWMgc2V0Q29udGV4dChlKXtvbD1lfX1jbGFzcyBQYiBleHRlbmRzIHVue2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpfWxvYWQoZSx0LG4saSl7Y29uc3Qgcz10aGlzLGE9bmV3IGNpKHRoaXMubWFuYWdlcik7YS5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIiksYS5zZXRQYXRoKHRoaXMucGF0aCksYS5zZXRSZXF1ZXN0SGVhZGVyKHRoaXMucmVxdWVzdEhlYWRlciksYS5zZXRXaXRoQ3JlZGVudGlhbHModGhpcy53aXRoQ3JlZGVudGlhbHMpLGEubG9hZChlLGZ1bmN0aW9uKGwpe3RyeXtjb25zdCBjPWwuc2xpY2UoMCk7ZnUuZ2V0Q29udGV4dCgpLmRlY29kZUF1ZGlvRGF0YShjLGZ1bmN0aW9uKHUpe3QodSl9KS5jYXRjaChvKX1jYXRjaChjKXtvKGMpfX0sbixpKTtmdW5jdGlvbiBvKGwpe2k/aShsKTpjb25zb2xlLmVycm9yKGwpLHMubWFuYWdlci5pdGVtRXJyb3IoZSl9fX1jb25zdCAkbT1uZXcgSWUsWW09bmV3IEllLGFyPW5ldyBJZTtjbGFzcyBMYntjb25zdHJ1Y3Rvcigpe3RoaXMudHlwZT0iU3RlcmVvQ2FtZXJhIix0aGlzLmFzcGVjdD0xLHRoaXMuZXllU2VwPS4wNjQsdGhpcy5jYW1lcmFMPW5ldyBCdCx0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSgxKSx0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNhbWVyYVI9bmV3IEJ0LHRoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKDIpLHRoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuX2NhY2hlPXtmb2N1czpudWxsLGZvdjpudWxsLGFzcGVjdDpudWxsLG5lYXI6bnVsbCxmYXI6bnVsbCx6b29tOm51bGwsZXllU2VwOm51bGx9fXVwZGF0ZShlKXtjb25zdCB0PXRoaXMuX2NhY2hlO2lmKHQuZm9jdXMhPT1lLmZvY3VzfHx0LmZvdiE9PWUuZm92fHx0LmFzcGVjdCE9PWUuYXNwZWN0KnRoaXMuYXNwZWN0fHx0Lm5lYXIhPT1lLm5lYXJ8fHQuZmFyIT09ZS5mYXJ8fHQuem9vbSE9PWUuem9vbXx8dC5leWVTZXAhPT10aGlzLmV5ZVNlcCl7dC5mb2N1cz1lLmZvY3VzLHQuZm92PWUuZm92LHQuYXNwZWN0PWUuYXNwZWN0KnRoaXMuYXNwZWN0LHQubmVhcj1lLm5lYXIsdC5mYXI9ZS5mYXIsdC56b29tPWUuem9vbSx0LmV5ZVNlcD10aGlzLmV5ZVNlcCxhci5jb3B5KGUucHJvamVjdGlvbk1hdHJpeCk7Y29uc3QgaT10LmV5ZVNlcC8yLHM9aSp0Lm5lYXIvdC5mb2N1cyxhPXQubmVhcipNYXRoLnRhbihIaSp0LmZvdiouNSkvdC56b29tO2xldCBvLGw7WW0uZWxlbWVudHNbMTJdPS1pLCRtLmVsZW1lbnRzWzEyXT1pLG89LWEqdC5hc3BlY3QrcyxsPWEqdC5hc3BlY3Qrcyxhci5lbGVtZW50c1swXT0yKnQubmVhci8obC1vKSxhci5lbGVtZW50c1s4XT0obCtvKS8obC1vKSx0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KGFyKSxvPS1hKnQuYXNwZWN0LXMsbD1hKnQuYXNwZWN0LXMsYXIuZWxlbWVudHNbMF09Mip0Lm5lYXIvKGwtbyksYXIuZWxlbWVudHNbOF09KGwrbykvKGwtbyksdGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weShhcil9dGhpcy5jYW1lcmFMLm1hdHJpeFdvcmxkLmNvcHkoZS5tYXRyaXhXb3JsZCkubXVsdGlwbHkoWW0pLHRoaXMuY2FtZXJhUi5tYXRyaXhXb3JsZC5jb3B5KGUubWF0cml4V29ybGQpLm11bHRpcGx5KCRtKX19Y2xhc3MgWm17Y29uc3RydWN0b3IoZT0hMCl7dGhpcy5hdXRvU3RhcnQ9ZSx0aGlzLnN0YXJ0VGltZT0wLHRoaXMub2xkVGltZT0wLHRoaXMuZWxhcHNlZFRpbWU9MCx0aGlzLnJ1bm5pbmc9ITF9c3RhcnQoKXt0aGlzLnN0YXJ0VGltZT1KbSgpLHRoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZSx0aGlzLmVsYXBzZWRUaW1lPTAsdGhpcy5ydW5uaW5nPSEwfXN0b3AoKXt0aGlzLmdldEVsYXBzZWRUaW1lKCksdGhpcy5ydW5uaW5nPSExLHRoaXMuYXV0b1N0YXJ0PSExfWdldEVsYXBzZWRUaW1lKCl7cmV0dXJuIHRoaXMuZ2V0RGVsdGEoKSx0aGlzLmVsYXBzZWRUaW1lfWdldERlbHRhKCl7bGV0IGU9MDtpZih0aGlzLmF1dG9TdGFydCYmIXRoaXMucnVubmluZylyZXR1cm4gdGhpcy5zdGFydCgpLDA7aWYodGhpcy5ydW5uaW5nKXtjb25zdCB0PUptKCk7ZT0odC10aGlzLm9sZFRpbWUpLzFlMyx0aGlzLm9sZFRpbWU9dCx0aGlzLmVsYXBzZWRUaW1lKz1lfXJldHVybiBlfX1mdW5jdGlvbiBKbSgpe3JldHVybih0eXBlb2YgcGVyZm9ybWFuY2U9PSJ1bmRlZmluZWQiP0RhdGU6cGVyZm9ybWFuY2UpLm5vdygpfWNvbnN0IG9yPW5ldyBQLEttPW5ldyBsbixJYj1uZXcgUCxscj1uZXcgUDtjbGFzcyBVYiBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkF1ZGlvTGlzdGVuZXIiLHRoaXMuY29udGV4dD1mdS5nZXRDb250ZXh0KCksdGhpcy5nYWluPXRoaXMuY29udGV4dC5jcmVhdGVHYWluKCksdGhpcy5nYWluLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmZpbHRlcj1udWxsLHRoaXMudGltZURlbHRhPTAsdGhpcy5fY2xvY2s9bmV3IFptfWdldElucHV0KCl7cmV0dXJuIHRoaXMuZ2Fpbn1yZW1vdmVGaWx0ZXIoKXtyZXR1cm4gdGhpcy5maWx0ZXIhPT1udWxsJiYodGhpcy5nYWluLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPW51bGwpLHRoaXN9Z2V0RmlsdGVyKCl7cmV0dXJuIHRoaXMuZmlsdGVyfXNldEZpbHRlcihlKXtyZXR1cm4gdGhpcy5maWx0ZXIhPT1udWxsPyh0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pKTp0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPWUsdGhpcy5nYWluLmNvbm5lY3QodGhpcy5maWx0ZXIpLHRoaXMuZmlsdGVyLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzfWdldE1hc3RlclZvbHVtZSgpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX1zZXRNYXN0ZXJWb2x1bWUoZSl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZShlLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9dXBkYXRlTWF0cml4V29ybGQoZSl7c3VwZXIudXBkYXRlTWF0cml4V29ybGQoZSk7Y29uc3QgdD10aGlzLmNvbnRleHQubGlzdGVuZXIsbj10aGlzLnVwO2lmKHRoaXMudGltZURlbHRhPXRoaXMuX2Nsb2NrLmdldERlbHRhKCksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2Uob3IsS20sSWIpLGxyLnNldCgwLDAsLTEpLmFwcGx5UXVhdGVybmlvbihLbSksdC5wb3NpdGlvblgpe2NvbnN0IGk9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3RoaXMudGltZURlbHRhO3QucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG9yLngsaSksdC5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUob3IueSxpKSx0LnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShvci56LGkpLHQuZm9yd2FyZFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobHIueCxpKSx0LmZvcndhcmRZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGxyLnksaSksdC5mb3J3YXJkWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShsci56LGkpLHQudXBYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG4ueCxpKSx0LnVwWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShuLnksaSksdC51cFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobi56LGkpfWVsc2UgdC5zZXRQb3NpdGlvbihvci54LG9yLnksb3IueiksdC5zZXRPcmllbnRhdGlvbihsci54LGxyLnksbHIueixuLngsbi55LG4ueil9fWNsYXNzIFFtIGV4dGVuZHMgcnR7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLnR5cGU9IkF1ZGlvIix0aGlzLmxpc3RlbmVyPWUsdGhpcy5jb250ZXh0PWUuY29udGV4dCx0aGlzLmdhaW49dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKSx0aGlzLmdhaW4uY29ubmVjdChlLmdldElucHV0KCkpLHRoaXMuYXV0b3BsYXk9ITEsdGhpcy5idWZmZXI9bnVsbCx0aGlzLmRldHVuZT0wLHRoaXMubG9vcD0hMSx0aGlzLmxvb3BTdGFydD0wLHRoaXMubG9vcEVuZD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5kdXJhdGlvbj12b2lkIDAsdGhpcy5wbGF5YmFja1JhdGU9MSx0aGlzLmlzUGxheWluZz0hMSx0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMCx0aGlzLnNvdXJjZT1udWxsLHRoaXMuc291cmNlVHlwZT0iZW1wdHkiLHRoaXMuX3N0YXJ0ZWRBdD0wLHRoaXMuX3Byb2dyZXNzPTAsdGhpcy5fY29ubmVjdGVkPSExLHRoaXMuZmlsdGVycz1bXX1nZXRPdXRwdXQoKXtyZXR1cm4gdGhpcy5nYWlufXNldE5vZGVTb3VyY2UoZSl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0iYXVkaW9Ob2RlIix0aGlzLnNvdXJjZT1lLHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0TWVkaWFFbGVtZW50U291cmNlKGUpe3JldHVybiB0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMSx0aGlzLnNvdXJjZVR5cGU9Im1lZGlhTm9kZSIsdGhpcy5zb3VyY2U9dGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZShlKSx0aGlzLmNvbm5lY3QoKSx0aGlzfXNldE1lZGlhU3RyZWFtU291cmNlKGUpe3JldHVybiB0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMSx0aGlzLnNvdXJjZVR5cGU9Im1lZGlhU3RyZWFtTm9kZSIsdGhpcy5zb3VyY2U9dGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKGUpLHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0QnVmZmVyKGUpe3JldHVybiB0aGlzLmJ1ZmZlcj1lLHRoaXMuc291cmNlVHlwZT0iYnVmZmVyIix0aGlzLmF1dG9wbGF5JiZ0aGlzLnBsYXkoKSx0aGlzfXBsYXkoZT0wKXtpZih0aGlzLmlzUGxheWluZz09PSEwKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiBBdWRpbyBpcyBhbHJlYWR5IHBsYXlpbmcuIik7cmV0dXJufWlmKHRoaXMuaGFzUGxheWJhY2tDb250cm9sPT09ITEpe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7cmV0dXJufXRoaXMuX3N0YXJ0ZWRBdD10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrZTtjb25zdCB0PXRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtyZXR1cm4gdC5idWZmZXI9dGhpcy5idWZmZXIsdC5sb29wPXRoaXMubG9vcCx0Lmxvb3BTdGFydD10aGlzLmxvb3BTdGFydCx0Lmxvb3BFbmQ9dGhpcy5sb29wRW5kLHQub25lbmRlZD10aGlzLm9uRW5kZWQuYmluZCh0aGlzKSx0LnN0YXJ0KHRoaXMuX3N0YXJ0ZWRBdCx0aGlzLl9wcm9ncmVzcyt0aGlzLm9mZnNldCx0aGlzLmR1cmF0aW9uKSx0aGlzLmlzUGxheWluZz0hMCx0aGlzLnNvdXJjZT10LHRoaXMuc2V0RGV0dW5lKHRoaXMuZGV0dW5lKSx0aGlzLnNldFBsYXliYWNrUmF0ZSh0aGlzLnBsYXliYWNrUmF0ZSksdGhpcy5jb25uZWN0KCl9cGF1c2UoKXtpZih0aGlzLmhhc1BsYXliYWNrQ29udHJvbD09PSExKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO3JldHVybn1yZXR1cm4gdGhpcy5pc1BsYXlpbmc9PT0hMCYmKHRoaXMuX3Byb2dyZXNzKz1NYXRoLm1heCh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRlZEF0LDApKnRoaXMucGxheWJhY2tSYXRlLHRoaXMubG9vcD09PSEwJiYodGhpcy5fcHJvZ3Jlc3M9dGhpcy5fcHJvZ3Jlc3MlKHRoaXMuZHVyYXRpb258fHRoaXMuYnVmZmVyLmR1cmF0aW9uKSksdGhpcy5zb3VyY2Uuc3RvcCgpLHRoaXMuc291cmNlLm9uZW5kZWQ9bnVsbCx0aGlzLmlzUGxheWluZz0hMSksdGhpc31zdG9wKCl7aWYodGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9PT0hMSl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtyZXR1cm59cmV0dXJuIHRoaXMuX3Byb2dyZXNzPTAsdGhpcy5zb3VyY2UhPT1udWxsJiYodGhpcy5zb3VyY2Uuc3RvcCgpLHRoaXMuc291cmNlLm9uZW5kZWQ9bnVsbCksdGhpcy5pc1BsYXlpbmc9ITEsdGhpc31jb25uZWN0KCl7aWYodGhpcy5maWx0ZXJzLmxlbmd0aD4wKXt0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMuZmlsdGVyc1swXSk7Zm9yKGxldCBlPTEsdD10aGlzLmZpbHRlcnMubGVuZ3RoO2U8dDtlKyspdGhpcy5maWx0ZXJzW2UtMV0uY29ubmVjdCh0aGlzLmZpbHRlcnNbZV0pO3RoaXMuZmlsdGVyc1t0aGlzLmZpbHRlcnMubGVuZ3RoLTFdLmNvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSl9ZWxzZSB0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpO3JldHVybiB0aGlzLl9jb25uZWN0ZWQ9ITAsdGhpc31kaXNjb25uZWN0KCl7aWYodGhpcy5fY29ubmVjdGVkIT09ITEpe2lmKHRoaXMuZmlsdGVycy5sZW5ndGg+MCl7dGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2ZvcihsZXQgZT0xLHQ9dGhpcy5maWx0ZXJzLmxlbmd0aDtlPHQ7ZSsrKXRoaXMuZmlsdGVyc1tlLTFdLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzW2VdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5kaXNjb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpcy5fY29ubmVjdGVkPSExLHRoaXN9fWdldEZpbHRlcnMoKXtyZXR1cm4gdGhpcy5maWx0ZXJzfXNldEZpbHRlcnMoZSl7cmV0dXJuIGV8fChlPVtdKSx0aGlzLl9jb25uZWN0ZWQ9PT0hMD8odGhpcy5kaXNjb25uZWN0KCksdGhpcy5maWx0ZXJzPWUuc2xpY2UoKSx0aGlzLmNvbm5lY3QoKSk6dGhpcy5maWx0ZXJzPWUuc2xpY2UoKSx0aGlzfXNldERldHVuZShlKXtpZih0aGlzLmRldHVuZT1lLHRoaXMuc291cmNlLmRldHVuZSE9PXZvaWQgMClyZXR1cm4gdGhpcy5pc1BsYXlpbmc9PT0hMCYmdGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSh0aGlzLmRldHVuZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfWdldERldHVuZSgpe3JldHVybiB0aGlzLmRldHVuZX1nZXRGaWx0ZXIoKXtyZXR1cm4gdGhpcy5nZXRGaWx0ZXJzKClbMF19c2V0RmlsdGVyKGUpe3JldHVybiB0aGlzLnNldEZpbHRlcnMoZT9bZV06W10pfXNldFBsYXliYWNrUmF0ZShlKXtpZih0aGlzLmhhc1BsYXliYWNrQ29udHJvbD09PSExKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO3JldHVybn1yZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU9ZSx0aGlzLmlzUGxheWluZz09PSEwJiZ0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMucGxheWJhY2tSYXRlLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9Z2V0UGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlfW9uRW5kZWQoKXt0aGlzLmlzUGxheWluZz0hMX1nZXRMb29wKCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPT09ITE/KGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIiksITEpOnRoaXMubG9vcH1zZXRMb29wKGUpe2lmKHRoaXMuaGFzUGxheWJhY2tDb250cm9sPT09ITEpe2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7cmV0dXJufXJldHVybiB0aGlzLmxvb3A9ZSx0aGlzLmlzUGxheWluZz09PSEwJiYodGhpcy5zb3VyY2UubG9vcD10aGlzLmxvb3ApLHRoaXN9c2V0TG9vcFN0YXJ0KGUpe3JldHVybiB0aGlzLmxvb3BTdGFydD1lLHRoaXN9c2V0TG9vcEVuZChlKXtyZXR1cm4gdGhpcy5sb29wRW5kPWUsdGhpc31nZXRWb2x1bWUoKXtyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWV9c2V0Vm9sdW1lKGUpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfX1jb25zdCBjcj1uZXcgUCxqbT1uZXcgbG4sRGI9bmV3IFAsaHI9bmV3IFA7Y2xhc3MgTmIgZXh0ZW5kcyBRbXtjb25zdHJ1Y3RvcihlKXtzdXBlcihlKSx0aGlzLnBhbm5lcj10aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCksdGhpcy5wYW5uZXIucGFubmluZ01vZGVsPSJIUlRGIix0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbil9Y29ubmVjdCgpe3N1cGVyLmNvbm5lY3QoKSx0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbil9ZGlzY29ubmVjdCgpe3N1cGVyLmRpc2Nvbm5lY3QoKSx0aGlzLnBhbm5lci5kaXNjb25uZWN0KHRoaXMuZ2Fpbil9Z2V0T3V0cHV0KCl7cmV0dXJuIHRoaXMucGFubmVyfWdldFJlZkRpc3RhbmNlKCl7cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlfXNldFJlZkRpc3RhbmNlKGUpe3JldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZT1lLHRoaXN9Z2V0Um9sbG9mZkZhY3Rvcigpe3JldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yfXNldFJvbGxvZmZGYWN0b3IoZSl7cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I9ZSx0aGlzfWdldERpc3RhbmNlTW9kZWwoKXtyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbH1zZXREaXN0YW5jZU1vZGVsKGUpe3JldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsPWUsdGhpc31nZXRNYXhEaXN0YW5jZSgpe3JldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZX1zZXRNYXhEaXN0YW5jZShlKXtyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U9ZSx0aGlzfXNldERpcmVjdGlvbmFsQ29uZShlLHQsbil7cmV0dXJuIHRoaXMucGFubmVyLmNvbmVJbm5lckFuZ2xlPWUsdGhpcy5wYW5uZXIuY29uZU91dGVyQW5nbGU9dCx0aGlzLnBhbm5lci5jb25lT3V0ZXJHYWluPW4sdGhpc311cGRhdGVNYXRyaXhXb3JsZChlKXtpZihzdXBlci51cGRhdGVNYXRyaXhXb3JsZChlKSx0aGlzLmhhc1BsYXliYWNrQ29udHJvbD09PSEwJiZ0aGlzLmlzUGxheWluZz09PSExKXJldHVybjt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShjcixqbSxEYiksaHIuc2V0KDAsMCwxKS5hcHBseVF1YXRlcm5pb24oam0pO2NvbnN0IHQ9dGhpcy5wYW5uZXI7aWYodC5wb3NpdGlvblgpe2NvbnN0IG49dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3RoaXMubGlzdGVuZXIudGltZURlbHRhO3QucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGNyLngsbiksdC5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoY3IueSxuKSx0LnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShjci56LG4pLHQub3JpZW50YXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGhyLngsbiksdC5vcmllbnRhdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoaHIueSxuKSx0Lm9yaWVudGF0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShoci56LG4pfWVsc2UgdC5zZXRQb3NpdGlvbihjci54LGNyLnksY3IueiksdC5zZXRPcmllbnRhdGlvbihoci54LGhyLnksaHIueil9fWNsYXNzIEZie2NvbnN0cnVjdG9yKGUsdD0yMDQ4KXt0aGlzLmFuYWx5c2VyPWUuY29udGV4dC5jcmVhdGVBbmFseXNlcigpLHRoaXMuYW5hbHlzZXIuZmZ0U2l6ZT10LHRoaXMuZGF0YT1uZXcgVWludDhBcnJheSh0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50KSxlLmdldE91dHB1dCgpLmNvbm5lY3QodGhpcy5hbmFseXNlcil9Z2V0RnJlcXVlbmN5RGF0YSgpe3JldHVybiB0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKHRoaXMuZGF0YSksdGhpcy5kYXRhfWdldEF2ZXJhZ2VGcmVxdWVuY3koKXtsZXQgZT0wO2NvbnN0IHQ9dGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspZSs9dFtuXTtyZXR1cm4gZS90Lmxlbmd0aH19Y2xhc3MgZWd7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuYmluZGluZz1lLHRoaXMudmFsdWVTaXplPW47bGV0IGkscyxhO3N3aXRjaCh0KXtjYXNlInF1YXRlcm5pb24iOmk9dGhpcy5fc2xlcnAscz10aGlzLl9zbGVycEFkZGl0aXZlLGE9dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24sdGhpcy5idWZmZXI9bmV3IEZsb2F0NjRBcnJheShuKjYpLHRoaXMuX3dvcmtJbmRleD01O2JyZWFrO2Nhc2Uic3RyaW5nIjpjYXNlImJvb2wiOmk9dGhpcy5fc2VsZWN0LHM9dGhpcy5fc2VsZWN0LGE9dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU90aGVyLHRoaXMuYnVmZmVyPW5ldyBBcnJheShuKjUpO2JyZWFrO2RlZmF1bHQ6aT10aGlzLl9sZXJwLHM9dGhpcy5fbGVycEFkZGl0aXZlLGE9dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU51bWVyaWMsdGhpcy5idWZmZXI9bmV3IEZsb2F0NjRBcnJheShuKjUpfXRoaXMuX21peEJ1ZmZlclJlZ2lvbj1pLHRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlPXMsdGhpcy5fc2V0SWRlbnRpdHk9YSx0aGlzLl9vcmlnSW5kZXg9Myx0aGlzLl9hZGRJbmRleD00LHRoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTAsdGhpcy51c2VDb3VudD0wLHRoaXMucmVmZXJlbmNlQ291bnQ9MH1hY2N1bXVsYXRlKGUsdCl7Y29uc3Qgbj10aGlzLmJ1ZmZlcixpPXRoaXMudmFsdWVTaXplLHM9ZSppK2k7bGV0IGE9dGhpcy5jdW11bGF0aXZlV2VpZ2h0O2lmKGE9PT0wKXtmb3IobGV0IG89MDtvIT09aTsrK28pbltzK29dPW5bb107YT10fWVsc2V7YSs9dDtjb25zdCBvPXQvYTt0aGlzLl9taXhCdWZmZXJSZWdpb24obixzLDAsbyxpKX10aGlzLmN1bXVsYXRpdmVXZWlnaHQ9YX1hY2N1bXVsYXRlQWRkaXRpdmUoZSl7Y29uc3QgdD10aGlzLmJ1ZmZlcixuPXRoaXMudmFsdWVTaXplLGk9bip0aGlzLl9hZGRJbmRleDt0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZT09PTAmJnRoaXMuX3NldElkZW50aXR5KCksdGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUodCxpLDAsZSxuKSx0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSs9ZX1hcHBseShlKXtjb25zdCB0PXRoaXMudmFsdWVTaXplLG49dGhpcy5idWZmZXIsaT1lKnQrdCxzPXRoaXMuY3VtdWxhdGl2ZVdlaWdodCxhPXRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlLG89dGhpcy5iaW5kaW5nO2lmKHRoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTAsczwxKXtjb25zdCBsPXQqdGhpcy5fb3JpZ0luZGV4O3RoaXMuX21peEJ1ZmZlclJlZ2lvbihuLGksbCwxLXMsdCl9YT4wJiZ0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZShuLGksdGhpcy5fYWRkSW5kZXgqdCwxLHQpO2ZvcihsZXQgbD10LGM9dCt0O2whPT1jOysrbClpZihuW2xdIT09bltsK3RdKXtvLnNldFZhbHVlKG4saSk7YnJlYWt9fXNhdmVPcmlnaW5hbFN0YXRlKCl7Y29uc3QgZT10aGlzLmJpbmRpbmcsdD10aGlzLmJ1ZmZlcixuPXRoaXMudmFsdWVTaXplLGk9bip0aGlzLl9vcmlnSW5kZXg7ZS5nZXRWYWx1ZSh0LGkpO2ZvcihsZXQgcz1uLGE9aTtzIT09YTsrK3MpdFtzXT10W2krcyVuXTt0aGlzLl9zZXRJZGVudGl0eSgpLHRoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTB9cmVzdG9yZU9yaWdpbmFsU3RhdGUoKXtjb25zdCBlPXRoaXMudmFsdWVTaXplKjM7dGhpcy5iaW5kaW5nLnNldFZhbHVlKHRoaXMuYnVmZmVyLGUpfV9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpe2NvbnN0IGU9dGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemUsdD1lK3RoaXMudmFsdWVTaXplO2ZvcihsZXQgbj1lO248dDtuKyspdGhpcy5idWZmZXJbbl09MH1fc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24oKXt0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpLHRoaXMuYnVmZmVyW3RoaXMuX2FkZEluZGV4KnRoaXMudmFsdWVTaXplKzNdPTF9X3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcigpe2NvbnN0IGU9dGhpcy5fb3JpZ0luZGV4KnRoaXMudmFsdWVTaXplLHQ9dGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemU7Zm9yKGxldCBuPTA7bjx0aGlzLnZhbHVlU2l6ZTtuKyspdGhpcy5idWZmZXJbdCtuXT10aGlzLmJ1ZmZlcltlK25dfV9zZWxlY3QoZSx0LG4saSxzKXtpZihpPj0uNSlmb3IobGV0IGE9MDthIT09czsrK2EpZVt0K2FdPWVbbithXX1fc2xlcnAoZSx0LG4saSl7bG4uc2xlcnBGbGF0KGUsdCxlLHQsZSxuLGkpfV9zbGVycEFkZGl0aXZlKGUsdCxuLGkscyl7Y29uc3QgYT10aGlzLl93b3JrSW5kZXgqcztsbi5tdWx0aXBseVF1YXRlcm5pb25zRmxhdChlLGEsZSx0LGUsbiksbG4uc2xlcnBGbGF0KGUsdCxlLHQsZSxhLGkpfV9sZXJwKGUsdCxuLGkscyl7Y29uc3QgYT0xLWk7Zm9yKGxldCBvPTA7byE9PXM7KytvKXtjb25zdCBsPXQrbztlW2xdPWVbbF0qYStlW24rb10qaX19X2xlcnBBZGRpdGl2ZShlLHQsbixpLHMpe2ZvcihsZXQgYT0wO2EhPT1zOysrYSl7Y29uc3Qgbz10K2E7ZVtvXT1lW29dK2VbbithXSppfX19Y29uc3QgZHU9IlxcW1xcXVxcLjpcXC8iLE9iPW5ldyBSZWdFeHAoIlsiK2R1KyJdIiwiZyIpLHB1PSJbXiIrZHUrIl0iLEJiPSJbXiIrZHUucmVwbGFjZSgiXFwuIiwiIikrIl0iLHpiPS8oKD86V0MrW1wvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCJXQyIscHUpLGtiPS8oV0NPRCspPy8uc291cmNlLnJlcGxhY2UoIldDT0QiLEJiKSxHYj0vKD86XC4oV0MrKSg/OlxbKC4rKVxdKT8pPy8uc291cmNlLnJlcGxhY2UoIldDIixwdSksVmI9L1wuKFdDKykoPzpcWyguKylcXSk/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLHB1KSxIYj1uZXcgUmVnRXhwKCJeIit6YitrYitHYitWYisiJCIpLFdiPVsibWF0ZXJpYWwiLCJtYXRlcmlhbHMiLCJib25lcyIsIm1hcCJdO2NsYXNzIFhie2NvbnN0cnVjdG9yKGUsdCxuKXtjb25zdCBpPW58fG50LnBhcnNlVHJhY2tOYW1lKHQpO3RoaXMuX3RhcmdldEdyb3VwPWUsdGhpcy5fYmluZGluZ3M9ZS5zdWJzY3JpYmVfKHQsaSl9Z2V0VmFsdWUoZSx0KXt0aGlzLmJpbmQoKTtjb25zdCBuPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxpPXRoaXMuX2JpbmRpbmdzW25dO2khPT12b2lkIDAmJmkuZ2V0VmFsdWUoZSx0KX1zZXRWYWx1ZShlLHQpe2NvbnN0IG49dGhpcy5fYmluZGluZ3M7Zm9yKGxldCBpPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxzPW4ubGVuZ3RoO2khPT1zOysraSluW2ldLnNldFZhbHVlKGUsdCl9YmluZCgpe2NvbnN0IGU9dGhpcy5fYmluZGluZ3M7Zm9yKGxldCB0PXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxuPWUubGVuZ3RoO3QhPT1uOysrdCllW3RdLmJpbmQoKX11bmJpbmQoKXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzO2ZvcihsZXQgdD10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sbj1lLmxlbmd0aDt0IT09bjsrK3QpZVt0XS51bmJpbmQoKX19Y2xhc3MgbnR7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMucGF0aD10LHRoaXMucGFyc2VkUGF0aD1ufHxudC5wYXJzZVRyYWNrTmFtZSh0KSx0aGlzLm5vZGU9bnQuZmluZE5vZGUoZSx0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUpLHRoaXMucm9vdE5vZGU9ZSx0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYm91bmQsdGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmJvdW5kfXN0YXRpYyBjcmVhdGUoZSx0LG4pe3JldHVybiBlJiZlLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA/bmV3IG50LkNvbXBvc2l0ZShlLHQsbik6bmV3IG50KGUsdCxuKX1zdGF0aWMgc2FuaXRpemVOb2RlTmFtZShlKXtyZXR1cm4gZS5yZXBsYWNlKC9ccy9nLCJfIikucmVwbGFjZShPYiwiIil9c3RhdGljIHBhcnNlVHJhY2tOYW1lKGUpe2NvbnN0IHQ9SGIuZXhlYyhlKTtpZih0PT09bnVsbCl0aHJvdyBuZXcgRXJyb3IoIlByb3BlcnR5QmluZGluZzogQ2Fubm90IHBhcnNlIHRyYWNrTmFtZTogIitlKTtjb25zdCBuPXtub2RlTmFtZTp0WzJdLG9iamVjdE5hbWU6dFszXSxvYmplY3RJbmRleDp0WzRdLHByb3BlcnR5TmFtZTp0WzVdLHByb3BlcnR5SW5kZXg6dFs2XX0saT1uLm5vZGVOYW1lJiZuLm5vZGVOYW1lLmxhc3RJbmRleE9mKCIuIik7aWYoaSE9PXZvaWQgMCYmaSE9PS0xKXtjb25zdCBzPW4ubm9kZU5hbWUuc3Vic3RyaW5nKGkrMSk7V2IuaW5kZXhPZihzKSE9PS0xJiYobi5ub2RlTmFtZT1uLm5vZGVOYW1lLnN1YnN0cmluZygwLGkpLG4ub2JqZWN0TmFtZT1zKX1pZihuLnByb3BlcnR5TmFtZT09PW51bGx8fG4ucHJvcGVydHlOYW1lLmxlbmd0aD09PTApdGhyb3cgbmV3IEVycm9yKCJQcm9wZXJ0eUJpbmRpbmc6IGNhbiBub3QgcGFyc2UgcHJvcGVydHlOYW1lIGZyb20gdHJhY2tOYW1lOiAiK2UpO3JldHVybiBufXN0YXRpYyBmaW5kTm9kZShlLHQpe2lmKHQ9PT12b2lkIDB8fHQ9PT0iInx8dD09PSIuInx8dD09PS0xfHx0PT09ZS5uYW1lfHx0PT09ZS51dWlkKXJldHVybiBlO2lmKGUuc2tlbGV0b24pe2NvbnN0IG49ZS5za2VsZXRvbi5nZXRCb25lQnlOYW1lKHQpO2lmKG4hPT12b2lkIDApcmV0dXJuIG59aWYoZS5jaGlsZHJlbil7Y29uc3Qgbj1mdW5jdGlvbihzKXtmb3IobGV0IGE9MDthPHMubGVuZ3RoO2ErKyl7Y29uc3Qgbz1zW2FdO2lmKG8ubmFtZT09PXR8fG8udXVpZD09PXQpcmV0dXJuIG87Y29uc3QgbD1uKG8uY2hpbGRyZW4pO2lmKGwpcmV0dXJuIGx9cmV0dXJuIG51bGx9LGk9bihlLmNoaWxkcmVuKTtpZihpKXJldHVybiBpfXJldHVybiBudWxsfV9nZXRWYWx1ZV91bmF2YWlsYWJsZSgpe31fc2V0VmFsdWVfdW5hdmFpbGFibGUoKXt9X2dldFZhbHVlX2RpcmVjdChlLHQpe2VbdF09dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdfV9nZXRWYWx1ZV9hcnJheShlLHQpe2NvbnN0IG49dGhpcy5yZXNvbHZlZFByb3BlcnR5O2ZvcihsZXQgaT0wLHM9bi5sZW5ndGg7aSE9PXM7KytpKWVbdCsrXT1uW2ldfV9nZXRWYWx1ZV9hcnJheUVsZW1lbnQoZSx0KXtlW3RdPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdfV9nZXRWYWx1ZV90b0FycmF5KGUsdCl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LnRvQXJyYXkoZSx0KX1fc2V0VmFsdWVfZGlyZWN0KGUsdCl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWVbdF19X3NldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZShlLHQpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1lW3RdLHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZShlLHQpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT1lW3RdLHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5KGUsdCl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCBpPTAscz1uLmxlbmd0aDtpIT09czsrK2kpbltpXT1lW3QrK119X3NldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlKGUsdCl7Y29uc3Qgbj10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCBpPTAscz1uLmxlbmd0aDtpIT09czsrK2kpbltpXT1lW3QrK107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoZSx0KXtjb25zdCBuPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtmb3IobGV0IGk9MCxzPW4ubGVuZ3RoO2khPT1zOysraSluW2ldPWVbdCsrXTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnQoZSx0KXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1lW3RdfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUoZSx0KXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1lW3RdLHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZShlLHQpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPWVbdF0sdGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfZnJvbUFycmF5KGUsdCl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheShlLHQpfV9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUoZSx0KXt0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KGUsdCksdGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKGUsdCl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheShlLHQpLHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X2dldFZhbHVlX3VuYm91bmQoZSx0KXt0aGlzLmJpbmQoKSx0aGlzLmdldFZhbHVlKGUsdCl9X3NldFZhbHVlX3VuYm91bmQoZSx0KXt0aGlzLmJpbmQoKSx0aGlzLnNldFZhbHVlKGUsdCl9YmluZCgpe2xldCBlPXRoaXMubm9kZTtjb25zdCB0PXRoaXMucGFyc2VkUGF0aCxuPXQub2JqZWN0TmFtZSxpPXQucHJvcGVydHlOYW1lO2xldCBzPXQucHJvcGVydHlJbmRleDtpZihlfHwoZT1udC5maW5kTm9kZSh0aGlzLnJvb3ROb2RlLHQubm9kZU5hbWUpLHRoaXMubm9kZT1lKSx0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlLHRoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5hdmFpbGFibGUsIWUpe2NvbnNvbGUud2FybigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBObyB0YXJnZXQgbm9kZSBmb3VuZCBmb3IgdHJhY2s6ICIrdGhpcy5wYXRoKyIuIik7cmV0dXJufWlmKG4pe2xldCBjPXQub2JqZWN0SW5kZXg7c3dpdGNoKG4pe2Nhc2UibWF0ZXJpYWxzIjppZighZS5tYXRlcmlhbCl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuIix0aGlzKTtyZXR1cm59aWYoIWUubWF0ZXJpYWwubWF0ZXJpYWxzKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LiIsdGhpcyk7cmV0dXJufWU9ZS5tYXRlcmlhbC5tYXRlcmlhbHM7YnJlYWs7Y2FzZSJib25lcyI6aWYoIWUuc2tlbGV0b24pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLiIsdGhpcyk7cmV0dXJufWU9ZS5za2VsZXRvbi5ib25lcztmb3IobGV0IGg9MDtoPGUubGVuZ3RoO2grKylpZihlW2hdLm5hbWU9PT1jKXtjPWg7YnJlYWt9YnJlYWs7Y2FzZSJtYXAiOmlmKCJtYXAiaW4gZSl7ZT1lLm1hcDticmVha31pZighZS5tYXRlcmlhbCl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuIix0aGlzKTtyZXR1cm59aWYoIWUubWF0ZXJpYWwubWFwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXAgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWFwLiIsdGhpcyk7cmV0dXJufWU9ZS5tYXRlcmlhbC5tYXA7YnJlYWs7ZGVmYXVsdDppZihlW25dPT09dm9pZCAwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBvYmplY3ROYW1lIG9mIG5vZGUgdW5kZWZpbmVkLiIsdGhpcyk7cmV0dXJufWU9ZVtuXX1pZihjIT09dm9pZCAwKXtpZihlW2NdPT09dm9pZCAwKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byBiaW5kIHRvIG9iamVjdEluZGV4IG9mIG9iamVjdE5hbWUsIGJ1dCBpcyB1bmRlZmluZWQuIix0aGlzLGUpO3JldHVybn1lPWVbY119fWNvbnN0IGE9ZVtpXTtpZihhPT09dm9pZCAwKXtjb25zdCBjPXQubm9kZU5hbWU7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogIitjKyIuIitpKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iLGUpO3JldHVybn1sZXQgbz10aGlzLlZlcnNpb25pbmcuTm9uZTt0aGlzLnRhcmdldE9iamVjdD1lLGUubmVlZHNVcGRhdGUhPT12b2lkIDA/bz10aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU6ZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlIT09dm9pZCAwJiYobz10aGlzLlZlcnNpb25pbmcuTWF0cml4V29ybGROZWVkc1VwZGF0ZSk7bGV0IGw9dGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7aWYocyE9PXZvaWQgMCl7aWYoaT09PSJtb3JwaFRhcmdldEluZmx1ZW5jZXMiKXtpZighZS5nZW9tZXRyeSl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuIix0aGlzKTtyZXR1cm59aWYoIWUuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzKXtjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuIix0aGlzKTtyZXR1cm59ZS5tb3JwaFRhcmdldERpY3Rpb25hcnlbc10hPT12b2lkIDAmJihzPWUubW9ycGhUYXJnZXREaWN0aW9uYXJ5W3NdKX1sPXRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT1hLHRoaXMucHJvcGVydHlJbmRleD1zfWVsc2UgYS5mcm9tQXJyYXkhPT12b2lkIDAmJmEudG9BcnJheSE9PXZvaWQgMD8obD10aGlzLkJpbmRpbmdUeXBlLkhhc0Zyb21Ub0FycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT1hKTpBcnJheS5pc0FycmF5KGEpPyhsPXRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXksdGhpcy5yZXNvbHZlZFByb3BlcnR5PWEpOnRoaXMucHJvcGVydHlOYW1lPWk7dGhpcy5nZXRWYWx1ZT10aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbbF0sdGhpcy5zZXRWYWx1ZT10aGlzLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nW2xdW29dfXVuYmluZCgpe3RoaXMubm9kZT1udWxsLHRoaXMuZ2V0VmFsdWU9dGhpcy5fZ2V0VmFsdWVfdW5ib3VuZCx0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYm91bmR9fW50LkNvbXBvc2l0ZT1YYixudC5wcm90b3R5cGUuQmluZGluZ1R5cGU9e0RpcmVjdDowLEVudGlyZUFycmF5OjEsQXJyYXlFbGVtZW50OjIsSGFzRnJvbVRvQXJyYXk6M30sbnQucHJvdG90eXBlLlZlcnNpb25pbmc9e05vbmU6MCxOZWVkc1VwZGF0ZToxLE1hdHJpeFdvcmxkTmVlZHNVcGRhdGU6Mn0sbnQucHJvdG90eXBlLkdldHRlckJ5QmluZGluZ1R5cGU9W250LnByb3RvdHlwZS5fZ2V0VmFsdWVfZGlyZWN0LG50LnByb3RvdHlwZS5fZ2V0VmFsdWVfYXJyYXksbnQucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheUVsZW1lbnQsbnQucHJvdG90eXBlLl9nZXRWYWx1ZV90b0FycmF5XSxudC5wcm90b3R5cGUuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc9W1tudC5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdCxudC5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSxudC5wcm90b3R5cGUuX3NldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlXSxbbnQucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheSxudC5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlLG50LnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZV0sW250LnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50LG50LnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlLG50LnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdLFtudC5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheSxudC5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSxudC5wcm90b3R5cGUuX3NldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlXV07Y2xhc3MgcWJ7Y29uc3RydWN0b3IoKXt0aGlzLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA9ITAsdGhpcy51dWlkPV9uKCksdGhpcy5fb2JqZWN0cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLHRoaXMubkNhY2hlZE9iamVjdHNfPTA7Y29uc3QgZT17fTt0aGlzLl9pbmRpY2VzQnlVVUlEPWU7Zm9yKGxldCBuPTAsaT1hcmd1bWVudHMubGVuZ3RoO24hPT1pOysrbillW2FyZ3VtZW50c1tuXS51dWlkXT1uO3RoaXMuX3BhdGhzPVtdLHRoaXMuX3BhcnNlZFBhdGhzPVtdLHRoaXMuX2JpbmRpbmdzPVtdLHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aD17fTtjb25zdCB0PXRoaXM7dGhpcy5zdGF0cz17b2JqZWN0czp7Z2V0IHRvdGFsKCl7cmV0dXJuIHQuX29iamVjdHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdGhpcy50b3RhbC10Lm5DYWNoZWRPYmplY3RzX319LGdldCBiaW5kaW5nc1Blck9iamVjdCgpe3JldHVybiB0Ll9iaW5kaW5ncy5sZW5ndGh9fX1hZGQoKXtjb25zdCBlPXRoaXMuX29iamVjdHMsdD10aGlzLl9pbmRpY2VzQnlVVUlELG49dGhpcy5fcGF0aHMsaT10aGlzLl9wYXJzZWRQYXRocyxzPXRoaXMuX2JpbmRpbmdzLGE9cy5sZW5ndGg7bGV0IG8sbD1lLmxlbmd0aCxjPXRoaXMubkNhY2hlZE9iamVjdHNfO2ZvcihsZXQgaD0wLHU9YXJndW1lbnRzLmxlbmd0aDtoIT09dTsrK2gpe2NvbnN0IGY9YXJndW1lbnRzW2hdLGQ9Zi51dWlkO2xldCBwPXRbZF07aWYocD09PXZvaWQgMCl7cD1sKyssdFtkXT1wLGUucHVzaChmKTtmb3IobGV0IF89MCxnPWE7XyE9PWc7KytfKXNbX10ucHVzaChuZXcgbnQoZixuW19dLGlbX10pKX1lbHNlIGlmKHA8Yyl7bz1lW3BdO2NvbnN0IF89LS1jLGc9ZVtfXTt0W2cudXVpZF09cCxlW3BdPWcsdFtkXT1fLGVbX109Zjtmb3IobGV0IG09MCx5PWE7bSE9PXk7KyttKXtjb25zdCB4PXNbbV0sdj14W19dO2xldCBTPXhbcF07eFtwXT12LFM9PT12b2lkIDAmJihTPW5ldyBudChmLG5bbV0saVttXSkpLHhbX109U319ZWxzZSBlW3BdIT09byYmY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCBkZXRlY3RlZC4gQ2xlYW4gdGhlIGNhY2hlcyBvciByZWNyZWF0ZSB5b3VyIGluZnJhc3RydWN0dXJlIHdoZW4gcmVsb2FkaW5nIHNjZW5lcy4iKX10aGlzLm5DYWNoZWRPYmplY3RzXz1jfXJlbW92ZSgpe2NvbnN0IGU9dGhpcy5fb2JqZWN0cyx0PXRoaXMuX2luZGljZXNCeVVVSUQsbj10aGlzLl9iaW5kaW5ncyxpPW4ubGVuZ3RoO2xldCBzPXRoaXMubkNhY2hlZE9iamVjdHNfO2ZvcihsZXQgYT0wLG89YXJndW1lbnRzLmxlbmd0aDthIT09bzsrK2Epe2NvbnN0IGw9YXJndW1lbnRzW2FdLGM9bC51dWlkLGg9dFtjXTtpZihoIT09dm9pZCAwJiZoPj1zKXtjb25zdCB1PXMrKyxmPWVbdV07dFtmLnV1aWRdPWgsZVtoXT1mLHRbY109dSxlW3VdPWw7Zm9yKGxldCBkPTAscD1pO2QhPT1wOysrZCl7Y29uc3QgXz1uW2RdLGc9X1t1XSxtPV9baF07X1toXT1nLF9bdV09bX19fXRoaXMubkNhY2hlZE9iamVjdHNfPXN9dW5jYWNoZSgpe2NvbnN0IGU9dGhpcy5fb2JqZWN0cyx0PXRoaXMuX2luZGljZXNCeVVVSUQsbj10aGlzLl9iaW5kaW5ncyxpPW4ubGVuZ3RoO2xldCBzPXRoaXMubkNhY2hlZE9iamVjdHNfLGE9ZS5sZW5ndGg7Zm9yKGxldCBvPTAsbD1hcmd1bWVudHMubGVuZ3RoO28hPT1sOysrbyl7Y29uc3QgYz1hcmd1bWVudHNbb10saD1jLnV1aWQsdT10W2hdO2lmKHUhPT12b2lkIDApaWYoZGVsZXRlIHRbaF0sdTxzKXtjb25zdCBmPS0tcyxkPWVbZl0scD0tLWEsXz1lW3BdO3RbZC51dWlkXT11LGVbdV09ZCx0W18udXVpZF09ZixlW2ZdPV8sZS5wb3AoKTtmb3IobGV0IGc9MCxtPWk7ZyE9PW07KytnKXtjb25zdCB5PW5bZ10seD15W2ZdLHY9eVtwXTt5W3VdPXgseVtmXT12LHkucG9wKCl9fWVsc2V7Y29uc3QgZj0tLWEsZD1lW2ZdO2Y+MCYmKHRbZC51dWlkXT11KSxlW3VdPWQsZS5wb3AoKTtmb3IobGV0IHA9MCxfPWk7cCE9PV87KytwKXtjb25zdCBnPW5bcF07Z1t1XT1nW2ZdLGcucG9wKCl9fX10aGlzLm5DYWNoZWRPYmplY3RzXz1zfXN1YnNjcmliZV8oZSx0KXtjb25zdCBuPXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aDtsZXQgaT1uW2VdO2NvbnN0IHM9dGhpcy5fYmluZGluZ3M7aWYoaSE9PXZvaWQgMClyZXR1cm4gc1tpXTtjb25zdCBhPXRoaXMuX3BhdGhzLG89dGhpcy5fcGFyc2VkUGF0aHMsbD10aGlzLl9vYmplY3RzLGM9bC5sZW5ndGgsaD10aGlzLm5DYWNoZWRPYmplY3RzXyx1PW5ldyBBcnJheShjKTtpPXMubGVuZ3RoLG5bZV09aSxhLnB1c2goZSksby5wdXNoKHQpLHMucHVzaCh1KTtmb3IobGV0IGY9aCxkPWwubGVuZ3RoO2YhPT1kOysrZil7Y29uc3QgcD1sW2ZdO3VbZl09bmV3IG50KHAsZSx0KX1yZXR1cm4gdX11bnN1YnNjcmliZV8oZSl7Y29uc3QgdD10aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsbj10W2VdO2lmKG4hPT12b2lkIDApe2NvbnN0IGk9dGhpcy5fcGF0aHMscz10aGlzLl9wYXJzZWRQYXRocyxhPXRoaXMuX2JpbmRpbmdzLG89YS5sZW5ndGgtMSxsPWFbb10sYz1lW29dO3RbY109bixhW25dPWwsYS5wb3AoKSxzW25dPXNbb10scy5wb3AoKSxpW25dPWlbb10saS5wb3AoKX19fWNsYXNzIHRne2NvbnN0cnVjdG9yKGUsdCxuPW51bGwsaT10LmJsZW5kTW9kZSl7dGhpcy5fbWl4ZXI9ZSx0aGlzLl9jbGlwPXQsdGhpcy5fbG9jYWxSb290PW4sdGhpcy5ibGVuZE1vZGU9aTtjb25zdCBzPXQudHJhY2tzLGE9cy5sZW5ndGgsbz1uZXcgQXJyYXkoYSksbD17ZW5kaW5nU3RhcnQ6a2ksZW5kaW5nRW5kOmtpfTtmb3IobGV0IGM9MDtjIT09YTsrK2Mpe2NvbnN0IGg9c1tjXS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTtvW2NdPWgsaC5zZXR0aW5ncz1sfXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9bCx0aGlzLl9pbnRlcnBvbGFudHM9byx0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPW5ldyBBcnJheShhKSx0aGlzLl9jYWNoZUluZGV4PW51bGwsdGhpcy5fYnlDbGlwQ2FjaGVJbmRleD1udWxsLHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PW51bGwsdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLmxvb3A9dWQsdGhpcy5fbG9vcENvdW50PS0xLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMudGltZT0wLHRoaXMudGltZVNjYWxlPTEsdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPTEsdGhpcy53ZWlnaHQ9MSx0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9MSx0aGlzLnJlcGV0aXRpb25zPTEvMCx0aGlzLnBhdXNlZD0hMSx0aGlzLmVuYWJsZWQ9ITAsdGhpcy5jbGFtcFdoZW5GaW5pc2hlZD0hMSx0aGlzLnplcm9TbG9wZUF0U3RhcnQ9ITAsdGhpcy56ZXJvU2xvcGVBdEVuZD0hMH1wbGF5KCl7cmV0dXJuIHRoaXMuX21peGVyLl9hY3RpdmF0ZUFjdGlvbih0aGlzKSx0aGlzfXN0b3AoKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24odGhpcyksdGhpcy5yZXNldCgpfXJlc2V0KCl7cmV0dXJuIHRoaXMucGF1c2VkPSExLHRoaXMuZW5hYmxlZD0hMCx0aGlzLnRpbWU9MCx0aGlzLl9sb29wQ291bnQ9LTEsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKX1pc1J1bm5pbmcoKXtyZXR1cm4gdGhpcy5lbmFibGVkJiYhdGhpcy5wYXVzZWQmJnRoaXMudGltZVNjYWxlIT09MCYmdGhpcy5fc3RhcnRUaW1lPT09bnVsbCYmdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfWlzU2NoZWR1bGVkKCl7cmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKX1zdGFydEF0KGUpe3JldHVybiB0aGlzLl9zdGFydFRpbWU9ZSx0aGlzfXNldExvb3AoZSx0KXtyZXR1cm4gdGhpcy5sb29wPWUsdGhpcy5yZXBldGl0aW9ucz10LHRoaXN9c2V0RWZmZWN0aXZlV2VpZ2h0KGUpe3JldHVybiB0aGlzLndlaWdodD1lLHRoaXMuX2VmZmVjdGl2ZVdlaWdodD10aGlzLmVuYWJsZWQ/ZTowLHRoaXMuc3RvcEZhZGluZygpfWdldEVmZmVjdGl2ZVdlaWdodCgpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHR9ZmFkZUluKGUpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyhlLDAsMSl9ZmFkZU91dChlKXtyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoZSwxLDApfWNyb3NzRmFkZUZyb20oZSx0LG4pe2lmKGUuZmFkZU91dCh0KSx0aGlzLmZhZGVJbih0KSxuKXtjb25zdCBpPXRoaXMuX2NsaXAuZHVyYXRpb24scz1lLl9jbGlwLmR1cmF0aW9uLGE9cy9pLG89aS9zO2Uud2FycCgxLGEsdCksdGhpcy53YXJwKG8sMSx0KX1yZXR1cm4gdGhpc31jcm9zc0ZhZGVUbyhlLHQsbil7cmV0dXJuIGUuY3Jvc3NGYWRlRnJvbSh0aGlzLHQsbil9c3RvcEZhZGluZygpe2NvbnN0IGU9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7cmV0dXJuIGUhPT1udWxsJiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoZSkpLHRoaXN9c2V0RWZmZWN0aXZlVGltZVNjYWxlKGUpe3JldHVybiB0aGlzLnRpbWVTY2FsZT1lLHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10aGlzLnBhdXNlZD8wOmUsdGhpcy5zdG9wV2FycGluZygpfWdldEVmZmVjdGl2ZVRpbWVTY2FsZSgpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGV9c2V0RHVyYXRpb24oZSl7cmV0dXJuIHRoaXMudGltZVNjYWxlPXRoaXMuX2NsaXAuZHVyYXRpb24vZSx0aGlzLnN0b3BXYXJwaW5nKCl9c3luY1dpdGgoZSl7cmV0dXJuIHRoaXMudGltZT1lLnRpbWUsdGhpcy50aW1lU2NhbGU9ZS50aW1lU2NhbGUsdGhpcy5zdG9wV2FycGluZygpfWhhbHQoZSl7cmV0dXJuIHRoaXMud2FycCh0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsMCxlKX13YXJwKGUsdCxuKXtjb25zdCBpPXRoaXMuX21peGVyLHM9aS50aW1lLGE9dGhpcy50aW1lU2NhbGU7bGV0IG89dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7bz09PW51bGwmJihvPWkuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSx0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1vKTtjb25zdCBsPW8ucGFyYW1ldGVyUG9zaXRpb25zLGM9by5zYW1wbGVWYWx1ZXM7cmV0dXJuIGxbMF09cyxsWzFdPXMrbixjWzBdPWUvYSxjWzFdPXQvYSx0aGlzfXN0b3BXYXJwaW5nKCl7Y29uc3QgZT10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtyZXR1cm4gZSE9PW51bGwmJih0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1udWxsLHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudChlKSksdGhpc31nZXRNaXhlcigpe3JldHVybiB0aGlzLl9taXhlcn1nZXRDbGlwKCl7cmV0dXJuIHRoaXMuX2NsaXB9Z2V0Um9vdCgpe3JldHVybiB0aGlzLl9sb2NhbFJvb3R8fHRoaXMuX21peGVyLl9yb290fV91cGRhdGUoZSx0LG4saSl7aWYoIXRoaXMuZW5hYmxlZCl7dGhpcy5fdXBkYXRlV2VpZ2h0KGUpO3JldHVybn1jb25zdCBzPXRoaXMuX3N0YXJ0VGltZTtpZihzIT09bnVsbCl7Y29uc3QgbD0oZS1zKSpuO2w8MHx8bj09PTA/dD0wOih0aGlzLl9zdGFydFRpbWU9bnVsbCx0PW4qbCl9dCo9dGhpcy5fdXBkYXRlVGltZVNjYWxlKGUpO2NvbnN0IGE9dGhpcy5fdXBkYXRlVGltZSh0KSxvPXRoaXMuX3VwZGF0ZVdlaWdodChlKTtpZihvPjApe2NvbnN0IGw9dGhpcy5faW50ZXJwb2xhbnRzLGM9dGhpcy5fcHJvcGVydHlCaW5kaW5ncztzd2l0Y2godGhpcy5ibGVuZE1vZGUpe2Nhc2UgWWM6Zm9yKGxldCBoPTAsdT1sLmxlbmd0aDtoIT09dTsrK2gpbFtoXS5ldmFsdWF0ZShhKSxjW2hdLmFjY3VtdWxhdGVBZGRpdGl2ZShvKTticmVhaztjYXNlIFhhOmRlZmF1bHQ6Zm9yKGxldCBoPTAsdT1sLmxlbmd0aDtoIT09dTsrK2gpbFtoXS5ldmFsdWF0ZShhKSxjW2hdLmFjY3VtdWxhdGUoaSxvKX19fV91cGRhdGVXZWlnaHQoZSl7bGV0IHQ9MDtpZih0aGlzLmVuYWJsZWQpe3Q9dGhpcy53ZWlnaHQ7Y29uc3Qgbj10aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtpZihuIT09bnVsbCl7Y29uc3QgaT1uLmV2YWx1YXRlKGUpWzBdO3QqPWksZT5uLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcEZhZGluZygpLGk9PT0wJiYodGhpcy5lbmFibGVkPSExKSl9fXJldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dCx0fV91cGRhdGVUaW1lU2NhbGUoZSl7bGV0IHQ9MDtpZighdGhpcy5wYXVzZWQpe3Q9dGhpcy50aW1lU2NhbGU7Y29uc3Qgbj10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtpZihuIT09bnVsbCl7Y29uc3QgaT1uLmV2YWx1YXRlKGUpWzBdO3QqPWksZT5uLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcFdhcnBpbmcoKSx0PT09MD90aGlzLnBhdXNlZD0hMDp0aGlzLnRpbWVTY2FsZT10KX19cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10LHR9X3VwZGF0ZVRpbWUoZSl7Y29uc3QgdD10aGlzLl9jbGlwLmR1cmF0aW9uLG49dGhpcy5sb29wO2xldCBpPXRoaXMudGltZStlLHM9dGhpcy5fbG9vcENvdW50O2NvbnN0IGE9bj09PWZkO2lmKGU9PT0wKXJldHVybiBzPT09LTE/aTphJiYocyYxKT09PTE/dC1pOmk7aWYobj09PWhkKXtzPT09LTEmJih0aGlzLl9sb29wQ291bnQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLCEwLCExKSk7ZTp7aWYoaT49dClpPXQ7ZWxzZSBpZihpPDApaT0wO2Vsc2V7dGhpcy50aW1lPWk7YnJlYWsgZX10aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMSx0aGlzLnRpbWU9aSx0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsYWN0aW9uOnRoaXMsZGlyZWN0aW9uOmU8MD8tMToxfSl9fWVsc2V7aWYocz09PS0xJiYoZT49MD8ocz0wLHRoaXMuX3NldEVuZGluZ3MoITAsdGhpcy5yZXBldGl0aW9ucz09PTAsYSkpOnRoaXMuX3NldEVuZGluZ3ModGhpcy5yZXBldGl0aW9ucz09PTAsITAsYSkpLGk+PXR8fGk8MCl7Y29uc3Qgbz1NYXRoLmZsb29yKGkvdCk7aS09dCpvLHMrPU1hdGguYWJzKG8pO2NvbnN0IGw9dGhpcy5yZXBldGl0aW9ucy1zO2lmKGw8PTApdGhpcy5jbGFtcFdoZW5GaW5pc2hlZD90aGlzLnBhdXNlZD0hMDp0aGlzLmVuYWJsZWQ9ITEsaT1lPjA/dDowLHRoaXMudGltZT1pLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246ZT4wPzE6LTF9KTtlbHNle2lmKGw9PT0xKXtjb25zdCBjPWU8MDt0aGlzLl9zZXRFbmRpbmdzKGMsIWMsYSl9ZWxzZSB0aGlzLl9zZXRFbmRpbmdzKCExLCExLGEpO3RoaXMuX2xvb3BDb3VudD1zLHRoaXMudGltZT1pLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6Imxvb3AiLGFjdGlvbjp0aGlzLGxvb3BEZWx0YTpvfSl9fWVsc2UgdGhpcy50aW1lPWk7aWYoYSYmKHMmMSk9PT0xKXJldHVybiB0LWl9cmV0dXJuIGl9X3NldEVuZGluZ3MoZSx0LG4pe2NvbnN0IGk9dGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncztuPyhpLmVuZGluZ1N0YXJ0PUdpLGkuZW5kaW5nRW5kPUdpKTooZT9pLmVuZGluZ1N0YXJ0PXRoaXMuemVyb1Nsb3BlQXRTdGFydD9HaTpraTppLmVuZGluZ1N0YXJ0PVBzLHQ/aS5lbmRpbmdFbmQ9dGhpcy56ZXJvU2xvcGVBdEVuZD9HaTpraTppLmVuZGluZ0VuZD1Qcyl9X3NjaGVkdWxlRmFkaW5nKGUsdCxuKXtjb25zdCBpPXRoaXMuX21peGVyLHM9aS50aW1lO2xldCBhPXRoaXMuX3dlaWdodEludGVycG9sYW50O2E9PT1udWxsJiYoYT1pLl9sZW5kQ29udHJvbEludGVycG9sYW50KCksdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9YSk7Y29uc3Qgbz1hLnBhcmFtZXRlclBvc2l0aW9ucyxsPWEuc2FtcGxlVmFsdWVzO3JldHVybiBvWzBdPXMsbFswXT10LG9bMV09cytlLGxbMV09bix0aGlzfX1jb25zdCAkYj1uZXcgRmxvYXQzMkFycmF5KDEpO2NsYXNzIFliIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoZSl7c3VwZXIoKSx0aGlzLl9yb290PWUsdGhpcy5faW5pdE1lbW9yeU1hbmFnZXIoKSx0aGlzLl9hY2N1SW5kZXg9MCx0aGlzLnRpbWU9MCx0aGlzLnRpbWVTY2FsZT0xfV9iaW5kQWN0aW9uKGUsdCl7Y29uc3Qgbj1lLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QsaT1lLl9jbGlwLnRyYWNrcyxzPWkubGVuZ3RoLGE9ZS5fcHJvcGVydHlCaW5kaW5ncyxvPWUuX2ludGVycG9sYW50cyxsPW4udXVpZCxjPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZTtsZXQgaD1jW2xdO2g9PT12b2lkIDAmJihoPXt9LGNbbF09aCk7Zm9yKGxldCB1PTA7dSE9PXM7Kyt1KXtjb25zdCBmPWlbdV0sZD1mLm5hbWU7bGV0IHA9aFtkXTtpZihwIT09dm9pZCAwKSsrcC5yZWZlcmVuY2VDb3VudCxhW3VdPXA7ZWxzZXtpZihwPWFbdV0scCE9PXZvaWQgMCl7cC5fY2FjaGVJbmRleD09PW51bGwmJigrK3AucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKHAsbCxkKSk7Y29udGludWV9Y29uc3QgXz10JiZ0Ll9wcm9wZXJ0eUJpbmRpbmdzW3VdLmJpbmRpbmcucGFyc2VkUGF0aDtwPW5ldyBlZyhudC5jcmVhdGUobixkLF8pLGYuVmFsdWVUeXBlTmFtZSxmLmdldFZhbHVlU2l6ZSgpKSwrK3AucmVmZXJlbmNlQ291bnQsdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKHAsbCxkKSxhW3VdPXB9b1t1XS5yZXN1bHRCdWZmZXI9cC5idWZmZXJ9fV9hY3RpdmF0ZUFjdGlvbihlKXtpZighdGhpcy5faXNBY3RpdmVBY3Rpb24oZSkpe2lmKGUuX2NhY2hlSW5kZXg9PT1udWxsKXtjb25zdCBuPShlLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QpLnV1aWQsaT1lLl9jbGlwLnV1aWQscz10aGlzLl9hY3Rpb25zQnlDbGlwW2ldO3RoaXMuX2JpbmRBY3Rpb24oZSxzJiZzLmtub3duQWN0aW9uc1swXSksdGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24oZSxpLG4pfWNvbnN0IHQ9ZS5fcHJvcGVydHlCaW5kaW5ncztmb3IobGV0IG49MCxpPXQubGVuZ3RoO24hPT1pOysrbil7Y29uc3Qgcz10W25dO3MudXNlQ291bnQrKz09PTAmJih0aGlzLl9sZW5kQmluZGluZyhzKSxzLnNhdmVPcmlnaW5hbFN0YXRlKCkpfXRoaXMuX2xlbmRBY3Rpb24oZSl9fV9kZWFjdGl2YXRlQWN0aW9uKGUpe2lmKHRoaXMuX2lzQWN0aXZlQWN0aW9uKGUpKXtjb25zdCB0PWUuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuIT09aTsrK24pe2NvbnN0IHM9dFtuXTstLXMudXNlQ291bnQ9PT0wJiYocy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpLHRoaXMuX3Rha2VCYWNrQmluZGluZyhzKSl9dGhpcy5fdGFrZUJhY2tBY3Rpb24oZSl9fV9pbml0TWVtb3J5TWFuYWdlcigpe3RoaXMuX2FjdGlvbnM9W10sdGhpcy5fbkFjdGl2ZUFjdGlvbnM9MCx0aGlzLl9hY3Rpb25zQnlDbGlwPXt9LHRoaXMuX2JpbmRpbmdzPVtdLHRoaXMuX25BY3RpdmVCaW5kaW5ncz0wLHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZT17fSx0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzPVtdLHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzPTA7Y29uc3QgZT10aGlzO3RoaXMuc3RhdHM9e2FjdGlvbnM6e2dldCB0b3RhbCgpe3JldHVybiBlLl9hY3Rpb25zLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIGUuX25BY3RpdmVBY3Rpb25zfX0sYmluZGluZ3M6e2dldCB0b3RhbCgpe3JldHVybiBlLl9iaW5kaW5ncy5sZW5ndGh9LGdldCBpblVzZSgpe3JldHVybiBlLl9uQWN0aXZlQmluZGluZ3N9fSxjb250cm9sSW50ZXJwb2xhbnRzOntnZXQgdG90YWwoKXtyZXR1cm4gZS5fY29udHJvbEludGVycG9sYW50cy5sZW5ndGh9LGdldCBpblVzZSgpe3JldHVybiBlLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50c319fX1faXNBY3RpdmVBY3Rpb24oZSl7Y29uc3QgdD1lLl9jYWNoZUluZGV4O3JldHVybiB0IT09bnVsbCYmdDx0aGlzLl9uQWN0aXZlQWN0aW9uc31fYWRkSW5hY3RpdmVBY3Rpb24oZSx0LG4pe2NvbnN0IGk9dGhpcy5fYWN0aW9ucyxzPXRoaXMuX2FjdGlvbnNCeUNsaXA7bGV0IGE9c1t0XTtpZihhPT09dm9pZCAwKWE9e2tub3duQWN0aW9uczpbZV0sYWN0aW9uQnlSb290Ont9fSxlLl9ieUNsaXBDYWNoZUluZGV4PTAsc1t0XT1hO2Vsc2V7Y29uc3Qgbz1hLmtub3duQWN0aW9ucztlLl9ieUNsaXBDYWNoZUluZGV4PW8ubGVuZ3RoLG8ucHVzaChlKX1lLl9jYWNoZUluZGV4PWkubGVuZ3RoLGkucHVzaChlKSxhLmFjdGlvbkJ5Um9vdFtuXT1lfV9yZW1vdmVJbmFjdGl2ZUFjdGlvbihlKXtjb25zdCB0PXRoaXMuX2FjdGlvbnMsbj10W3QubGVuZ3RoLTFdLGk9ZS5fY2FjaGVJbmRleDtuLl9jYWNoZUluZGV4PWksdFtpXT1uLHQucG9wKCksZS5fY2FjaGVJbmRleD1udWxsO2NvbnN0IHM9ZS5fY2xpcC51dWlkLGE9dGhpcy5fYWN0aW9uc0J5Q2xpcCxvPWFbc10sbD1vLmtub3duQWN0aW9ucyxjPWxbbC5sZW5ndGgtMV0saD1lLl9ieUNsaXBDYWNoZUluZGV4O2MuX2J5Q2xpcENhY2hlSW5kZXg9aCxsW2hdPWMsbC5wb3AoKSxlLl9ieUNsaXBDYWNoZUluZGV4PW51bGw7Y29uc3QgdT1vLmFjdGlvbkJ5Um9vdCxmPShlLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QpLnV1aWQ7ZGVsZXRlIHVbZl0sbC5sZW5ndGg9PT0wJiZkZWxldGUgYVtzXSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKGUpfV9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKGUpe2NvbnN0IHQ9ZS5fcHJvcGVydHlCaW5kaW5ncztmb3IobGV0IG49MCxpPXQubGVuZ3RoO24hPT1pOysrbil7Y29uc3Qgcz10W25dOy0tcy5yZWZlcmVuY2VDb3VudD09PTAmJnRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyhzKX19X2xlbmRBY3Rpb24oZSl7Y29uc3QgdD10aGlzLl9hY3Rpb25zLG49ZS5fY2FjaGVJbmRleCxpPXRoaXMuX25BY3RpdmVBY3Rpb25zKysscz10W2ldO2UuX2NhY2hlSW5kZXg9aSx0W2ldPWUscy5fY2FjaGVJbmRleD1uLHRbbl09c31fdGFrZUJhY2tBY3Rpb24oZSl7Y29uc3QgdD10aGlzLl9hY3Rpb25zLG49ZS5fY2FjaGVJbmRleCxpPS0tdGhpcy5fbkFjdGl2ZUFjdGlvbnMscz10W2ldO2UuX2NhY2hlSW5kZXg9aSx0W2ldPWUscy5fY2FjaGVJbmRleD1uLHRbbl09c31fYWRkSW5hY3RpdmVCaW5kaW5nKGUsdCxuKXtjb25zdCBpPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxzPXRoaXMuX2JpbmRpbmdzO2xldCBhPWlbdF07YT09PXZvaWQgMCYmKGE9e30saVt0XT1hKSxhW25dPWUsZS5fY2FjaGVJbmRleD1zLmxlbmd0aCxzLnB1c2goZSl9X3JlbW92ZUluYWN0aXZlQmluZGluZyhlKXtjb25zdCB0PXRoaXMuX2JpbmRpbmdzLG49ZS5iaW5kaW5nLGk9bi5yb290Tm9kZS51dWlkLHM9bi5wYXRoLGE9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLG89YVtpXSxsPXRbdC5sZW5ndGgtMV0sYz1lLl9jYWNoZUluZGV4O2wuX2NhY2hlSW5kZXg9Yyx0W2NdPWwsdC5wb3AoKSxkZWxldGUgb1tzXSxPYmplY3Qua2V5cyhvKS5sZW5ndGg9PT0wJiZkZWxldGUgYVtpXX1fbGVuZEJpbmRpbmcoZSl7Y29uc3QgdD10aGlzLl9iaW5kaW5ncyxuPWUuX2NhY2hlSW5kZXgsaT10aGlzLl9uQWN0aXZlQmluZGluZ3MrKyxzPXRbaV07ZS5fY2FjaGVJbmRleD1pLHRbaV09ZSxzLl9jYWNoZUluZGV4PW4sdFtuXT1zfV90YWtlQmFja0JpbmRpbmcoZSl7Y29uc3QgdD10aGlzLl9iaW5kaW5ncyxuPWUuX2NhY2hlSW5kZXgsaT0tLXRoaXMuX25BY3RpdmVCaW5kaW5ncyxzPXRbaV07ZS5fY2FjaGVJbmRleD1pLHRbaV09ZSxzLl9jYWNoZUluZGV4PW4sdFtuXT1zfV9sZW5kQ29udHJvbEludGVycG9sYW50KCl7Y29uc3QgZT10aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLHQ9dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMrKztsZXQgbj1lW3RdO3JldHVybiBuPT09dm9pZCAwJiYobj1uZXcgc3UobmV3IEZsb2F0MzJBcnJheSgyKSxuZXcgRmxvYXQzMkFycmF5KDIpLDEsJGIpLG4uX19jYWNoZUluZGV4PXQsZVt0XT1uKSxufV90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudChlKXtjb25zdCB0PXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsbj1lLl9fY2FjaGVJbmRleCxpPS0tdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMscz10W2ldO2UuX19jYWNoZUluZGV4PWksdFtpXT1lLHMuX19jYWNoZUluZGV4PW4sdFtuXT1zfWNsaXBBY3Rpb24oZSx0LG4pe2NvbnN0IGk9dHx8dGhpcy5fcm9vdCxzPWkudXVpZDtsZXQgYT10eXBlb2YgZT09InN0cmluZyI/ZGEuZmluZEJ5TmFtZShpLGUpOmU7Y29uc3Qgbz1hIT09bnVsbD9hLnV1aWQ6ZSxsPXRoaXMuX2FjdGlvbnNCeUNsaXBbb107bGV0IGM9bnVsbDtpZihuPT09dm9pZCAwJiYoYSE9PW51bGw/bj1hLmJsZW5kTW9kZTpuPVhhKSxsIT09dm9pZCAwKXtjb25zdCB1PWwuYWN0aW9uQnlSb290W3NdO2lmKHUhPT12b2lkIDAmJnUuYmxlbmRNb2RlPT09bilyZXR1cm4gdTtjPWwua25vd25BY3Rpb25zWzBdLGE9PT1udWxsJiYoYT1jLl9jbGlwKX1pZihhPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdCBoPW5ldyB0Zyh0aGlzLGEsdCxuKTtyZXR1cm4gdGhpcy5fYmluZEFjdGlvbihoLGMpLHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGgsbyxzKSxofWV4aXN0aW5nQWN0aW9uKGUsdCl7Y29uc3Qgbj10fHx0aGlzLl9yb290LGk9bi51dWlkLHM9dHlwZW9mIGU9PSJzdHJpbmciP2RhLmZpbmRCeU5hbWUobixlKTplLGE9cz9zLnV1aWQ6ZSxvPXRoaXMuX2FjdGlvbnNCeUNsaXBbYV07cmV0dXJuIG8hPT12b2lkIDAmJm8uYWN0aW9uQnlSb290W2ldfHxudWxsfXN0b3BBbGxBY3Rpb24oKXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsdD10aGlzLl9uQWN0aXZlQWN0aW9ucztmb3IobGV0IG49dC0xO24+PTA7LS1uKWVbbl0uc3RvcCgpO3JldHVybiB0aGlzfXVwZGF0ZShlKXtlKj10aGlzLnRpbWVTY2FsZTtjb25zdCB0PXRoaXMuX2FjdGlvbnMsbj10aGlzLl9uQWN0aXZlQWN0aW9ucyxpPXRoaXMudGltZSs9ZSxzPU1hdGguc2lnbihlKSxhPXRoaXMuX2FjY3VJbmRleF49MTtmb3IobGV0IGM9MDtjIT09bjsrK2MpdFtjXS5fdXBkYXRlKGksZSxzLGEpO2NvbnN0IG89dGhpcy5fYmluZGluZ3MsbD10aGlzLl9uQWN0aXZlQmluZGluZ3M7Zm9yKGxldCBjPTA7YyE9PWw7KytjKW9bY10uYXBwbHkoYSk7cmV0dXJuIHRoaXN9c2V0VGltZShlKXt0aGlzLnRpbWU9MDtmb3IobGV0IHQ9MDt0PHRoaXMuX2FjdGlvbnMubGVuZ3RoO3QrKyl0aGlzLl9hY3Rpb25zW3RdLnRpbWU9MDtyZXR1cm4gdGhpcy51cGRhdGUoZSl9Z2V0Um9vdCgpe3JldHVybiB0aGlzLl9yb290fXVuY2FjaGVDbGlwKGUpe2NvbnN0IHQ9dGhpcy5fYWN0aW9ucyxuPWUudXVpZCxpPXRoaXMuX2FjdGlvbnNCeUNsaXAscz1pW25dO2lmKHMhPT12b2lkIDApe2NvbnN0IGE9cy5rbm93bkFjdGlvbnM7Zm9yKGxldCBvPTAsbD1hLmxlbmd0aDtvIT09bDsrK28pe2NvbnN0IGM9YVtvXTt0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGMpO2NvbnN0IGg9Yy5fY2FjaGVJbmRleCx1PXRbdC5sZW5ndGgtMV07Yy5fY2FjaGVJbmRleD1udWxsLGMuX2J5Q2xpcENhY2hlSW5kZXg9bnVsbCx1Ll9jYWNoZUluZGV4PWgsdFtoXT11LHQucG9wKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbihjKX1kZWxldGUgaVtuXX19dW5jYWNoZVJvb3QoZSl7Y29uc3QgdD1lLnV1aWQsbj10aGlzLl9hY3Rpb25zQnlDbGlwO2Zvcihjb25zdCBhIGluIG4pe2NvbnN0IG89blthXS5hY3Rpb25CeVJvb3QsbD1vW3RdO2whPT12b2lkIDAmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGwpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGwpKX1jb25zdCBpPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxzPWlbdF07aWYocyE9PXZvaWQgMClmb3IoY29uc3QgYSBpbiBzKXtjb25zdCBvPXNbYV07by5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyhvKX19dW5jYWNoZUFjdGlvbihlLHQpe2NvbnN0IG49dGhpcy5leGlzdGluZ0FjdGlvbihlLHQpO24hPT1udWxsJiYodGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihuKSx0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbihuKSl9fWNsYXNzIG11e2NvbnN0cnVjdG9yKGUpe3RoaXMudmFsdWU9ZX1jbG9uZSgpe3JldHVybiBuZXcgbXUodGhpcy52YWx1ZS5jbG9uZT09PXZvaWQgMD90aGlzLnZhbHVlOnRoaXMudmFsdWUuY2xvbmUoKSl9fWxldCBaYj0wO2NsYXNzIEpiIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNVbmlmb3Jtc0dyb3VwPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlpiKyt9KSx0aGlzLm5hbWU9IiIsdGhpcy51c2FnZT1Ocyx0aGlzLnVuaWZvcm1zPVtdfWFkZChlKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5wdXNoKGUpLHRoaXN9cmVtb3ZlKGUpe2NvbnN0IHQ9dGhpcy51bmlmb3Jtcy5pbmRleE9mKGUpO3JldHVybiB0IT09LTEmJnRoaXMudW5pZm9ybXMuc3BsaWNlKHQsMSksdGhpc31zZXROYW1lKGUpe3JldHVybiB0aGlzLm5hbWU9ZSx0aGlzfXNldFVzYWdlKGUpe3JldHVybiB0aGlzLnVzYWdlPWUsdGhpc31kaXNwb3NlKCl7cmV0dXJuIHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KSx0aGlzfWNvcHkoZSl7dGhpcy5uYW1lPWUubmFtZSx0aGlzLnVzYWdlPWUudXNhZ2U7Y29uc3QgdD1lLnVuaWZvcm1zO3RoaXMudW5pZm9ybXMubGVuZ3RoPTA7Zm9yKGxldCBuPTAsaT10Lmxlbmd0aDtuPGk7bisrKXRoaXMudW5pZm9ybXMucHVzaCh0W25dLmNsb25lKCkpO3JldHVybiB0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y2xhc3MgS2IgZXh0ZW5kcyBBb3tjb25zdHJ1Y3RvcihlLHQsbj0xKXtzdXBlcihlLHQpLHRoaXMuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj0hMCx0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9bn1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMubWVzaFBlckF0dHJpYnV0ZT1lLm1lc2hQZXJBdHRyaWJ1dGUsdGhpc31jbG9uZShlKXtjb25zdCB0PXN1cGVyLmNsb25lKGUpO3JldHVybiB0Lm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLHR9dG9KU09OKGUpe2NvbnN0IHQ9c3VwZXIudG9KU09OKGUpO3JldHVybiB0LmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI9ITAsdC5tZXNoUGVyQXR0cmlidXRlPXRoaXMubWVzaFBlckF0dHJpYnV0ZSx0fX1jbGFzcyBRYntjb25zdHJ1Y3RvcihlLHQsbixpLHMpe3RoaXMuaXNHTEJ1ZmZlckF0dHJpYnV0ZT0hMCx0aGlzLm5hbWU9IiIsdGhpcy5idWZmZXI9ZSx0aGlzLnR5cGU9dCx0aGlzLml0ZW1TaXplPW4sdGhpcy5lbGVtZW50U2l6ZT1pLHRoaXMuY291bnQ9cyx0aGlzLnZlcnNpb249MH1zZXQgbmVlZHNVcGRhdGUoZSl7ZT09PSEwJiZ0aGlzLnZlcnNpb24rK31zZXRCdWZmZXIoZSl7cmV0dXJuIHRoaXMuYnVmZmVyPWUsdGhpc31zZXRUeXBlKGUsdCl7cmV0dXJuIHRoaXMudHlwZT1lLHRoaXMuZWxlbWVudFNpemU9dCx0aGlzfXNldEl0ZW1TaXplKGUpe3JldHVybiB0aGlzLml0ZW1TaXplPWUsdGhpc31zZXRDb3VudChlKXtyZXR1cm4gdGhpcy5jb3VudD1lLHRoaXN9fWNsYXNzIGpie2NvbnN0cnVjdG9yKGUsdCxuPTAsaT0xLzApe3RoaXMucmF5PW5ldyBVcihlLHQpLHRoaXMubmVhcj1uLHRoaXMuZmFyPWksdGhpcy5jYW1lcmE9bnVsbCx0aGlzLmxheWVycz1uZXcgaW8sdGhpcy5wYXJhbXM9e01lc2g6e30sTGluZTp7dGhyZXNob2xkOjF9LExPRDp7fSxQb2ludHM6e3RocmVzaG9sZDoxfSxTcHJpdGU6e319fXNldChlLHQpe3RoaXMucmF5LnNldChlLHQpfXNldEZyb21DYW1lcmEoZSx0KXt0LmlzUGVyc3BlY3RpdmVDYW1lcmE/KHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24odC5tYXRyaXhXb3JsZCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldChlLngsZS55LC41KS51bnByb2plY3QodCkuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCksdGhpcy5jYW1lcmE9dCk6dC5pc09ydGhvZ3JhcGhpY0NhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldChlLngsZS55LCh0Lm5lYXIrdC5mYXIpLyh0Lm5lYXItdC5mYXIpKS51bnByb2plY3QodCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCgwLDAsLTEpLnRyYW5zZm9ybURpcmVjdGlvbih0Lm1hdHJpeFdvcmxkKSx0aGlzLmNhbWVyYT10KTpjb25zb2xlLmVycm9yKCJUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlOiAiK3QudHlwZSl9aW50ZXJzZWN0T2JqZWN0KGUsdD0hMCxuPVtdKXtyZXR1cm4gZ3UoZSx0aGlzLG4sdCksbi5zb3J0KG5nKSxufWludGVyc2VjdE9iamVjdHMoZSx0PSEwLG49W10pe2ZvcihsZXQgaT0wLHM9ZS5sZW5ndGg7aTxzO2krKylndShlW2ldLHRoaXMsbix0KTtyZXR1cm4gbi5zb3J0KG5nKSxufX1mdW5jdGlvbiBuZyhyLGUpe3JldHVybiByLmRpc3RhbmNlLWUuZGlzdGFuY2V9ZnVuY3Rpb24gZ3UocixlLHQsbil7aWYoci5sYXllcnMudGVzdChlLmxheWVycykmJnIucmF5Y2FzdChlLHQpLG49PT0hMCl7Y29uc3QgaT1yLmNoaWxkcmVuO2ZvcihsZXQgcz0wLGE9aS5sZW5ndGg7czxhO3MrKylndShpW3NdLGUsdCwhMCl9fWNsYXNzIGUxe2NvbnN0cnVjdG9yKGU9MSx0PTAsbj0wKXtyZXR1cm4gdGhpcy5yYWRpdXM9ZSx0aGlzLnBoaT10LHRoaXMudGhldGE9bix0aGlzfXNldChlLHQsbil7cmV0dXJuIHRoaXMucmFkaXVzPWUsdGhpcy5waGk9dCx0aGlzLnRoZXRhPW4sdGhpc31jb3B5KGUpe3JldHVybiB0aGlzLnJhZGl1cz1lLnJhZGl1cyx0aGlzLnBoaT1lLnBoaSx0aGlzLnRoZXRhPWUudGhldGEsdGhpc31tYWtlU2FmZSgpe3JldHVybiB0aGlzLnBoaT1NYXRoLm1heCgxZS02LE1hdGgubWluKE1hdGguUEktMWUtNix0aGlzLnBoaSkpLHRoaXN9c2V0RnJvbVZlY3RvcjMoZSl7cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhlLngsZS55LGUueil9c2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhlLHQsbil7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChlKmUrdCp0K24qbiksdGhpcy5yYWRpdXM9PT0wPyh0aGlzLnRoZXRhPTAsdGhpcy5waGk9MCk6KHRoaXMudGhldGE9TWF0aC5hdGFuMihlLG4pLHRoaXMucGhpPU1hdGguYWNvcyhfdCh0L3RoaXMucmFkaXVzLC0xLDEpKSksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNsYXNzIHQxe2NvbnN0cnVjdG9yKGU9MSx0PTAsbj0wKXtyZXR1cm4gdGhpcy5yYWRpdXM9ZSx0aGlzLnRoZXRhPXQsdGhpcy55PW4sdGhpc31zZXQoZSx0LG4pe3JldHVybiB0aGlzLnJhZGl1cz1lLHRoaXMudGhldGE9dCx0aGlzLnk9bix0aGlzfWNvcHkoZSl7cmV0dXJuIHRoaXMucmFkaXVzPWUucmFkaXVzLHRoaXMudGhldGE9ZS50aGV0YSx0aGlzLnk9ZS55LHRoaXN9c2V0RnJvbVZlY3RvcjMoZSl7cmV0dXJuIHRoaXMuc2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhlLngsZS55LGUueil9c2V0RnJvbUNhcnRlc2lhbkNvb3JkcyhlLHQsbil7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChlKmUrbipuKSx0aGlzLnRoZXRhPU1hdGguYXRhbjIoZSxuKSx0aGlzLnk9dCx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX19Y29uc3QgaWc9bmV3IHE7Y2xhc3MgbjF7Y29uc3RydWN0b3IoZT1uZXcgcSgxLzAsMS8wKSx0PW5ldyBxKC0xLzAsLTEvMCkpe3RoaXMuaXNCb3gyPSEwLHRoaXMubWluPWUsdGhpcy5tYXg9dH1zZXQoZSx0KXtyZXR1cm4gdGhpcy5taW4uY29weShlKSx0aGlzLm1heC5jb3B5KHQpLHRoaXN9c2V0RnJvbVBvaW50cyhlKXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoZVt0XSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUoZSx0KXtjb25zdCBuPWlnLmNvcHkodCkubXVsdGlwbHlTY2FsYXIoLjUpO3JldHVybiB0aGlzLm1pbi5jb3B5KGUpLnN1YihuKSx0aGlzLm1heC5jb3B5KGUpLmFkZChuKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSh0aGlzKX1jb3B5KGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KGUubWluKSx0aGlzLm1heC5jb3B5KGUubWF4KSx0aGlzfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLm1pbi54PXRoaXMubWluLnk9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT0tMS8wLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueX1nZXRDZW50ZXIoZSl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP2Uuc2V0KDAsMCk6ZS5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZShlKXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/ZS5zZXQoMCwwKTplLnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfWV4cGFuZEJ5UG9pbnQoZSl7cmV0dXJuIHRoaXMubWluLm1pbihlKSx0aGlzLm1heC5tYXgoZSksdGhpc31leHBhbmRCeVZlY3RvcihlKXtyZXR1cm4gdGhpcy5taW4uc3ViKGUpLHRoaXMubWF4LmFkZChlKSx0aGlzfWV4cGFuZEJ5U2NhbGFyKGUpe3JldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLWUpLHRoaXMubWF4LmFkZFNjYWxhcihlKSx0aGlzfWNvbnRhaW5zUG9pbnQoZSl7cmV0dXJuIShlLng8dGhpcy5taW4ueHx8ZS54PnRoaXMubWF4Lnh8fGUueTx0aGlzLm1pbi55fHxlLnk+dGhpcy5tYXgueSl9Y29udGFpbnNCb3goZSl7cmV0dXJuIHRoaXMubWluLng8PWUubWluLngmJmUubWF4Lng8PXRoaXMubWF4LngmJnRoaXMubWluLnk8PWUubWluLnkmJmUubWF4Lnk8PXRoaXMubWF4Lnl9Z2V0UGFyYW1ldGVyKGUsdCl7cmV0dXJuIHQuc2V0KChlLngtdGhpcy5taW4ueCkvKHRoaXMubWF4LngtdGhpcy5taW4ueCksKGUueS10aGlzLm1pbi55KS8odGhpcy5tYXgueS10aGlzLm1pbi55KSl9aW50ZXJzZWN0c0JveChlKXtyZXR1cm4hKGUubWF4Lng8dGhpcy5taW4ueHx8ZS5taW4ueD50aGlzLm1heC54fHxlLm1heC55PHRoaXMubWluLnl8fGUubWluLnk+dGhpcy5tYXgueSl9Y2xhbXBQb2ludChlLHQpe3JldHVybiB0LmNvcHkoZSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludChlKXtyZXR1cm4gdGhpcy5jbGFtcFBvaW50KGUsaWcpLmRpc3RhbmNlVG8oZSl9aW50ZXJzZWN0KGUpe3JldHVybiB0aGlzLm1pbi5tYXgoZS5taW4pLHRoaXMubWF4Lm1pbihlLm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbihlKXtyZXR1cm4gdGhpcy5taW4ubWluKGUubWluKSx0aGlzLm1heC5tYXgoZS5tYXgpLHRoaXN9dHJhbnNsYXRlKGUpe3JldHVybiB0aGlzLm1pbi5hZGQoZSksdGhpcy5tYXguYWRkKGUpLHRoaXN9ZXF1YWxzKGUpe3JldHVybiBlLm1pbi5lcXVhbHModGhpcy5taW4pJiZlLm1heC5lcXVhbHModGhpcy5tYXgpfX1jb25zdCByZz1uZXcgUCxsbD1uZXcgUDtjbGFzcyBpMXtjb25zdHJ1Y3RvcihlPW5ldyBQLHQ9bmV3IFApe3RoaXMuc3RhcnQ9ZSx0aGlzLmVuZD10fXNldChlLHQpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkoZSksdGhpcy5lbmQuY29weSh0KSx0aGlzfWNvcHkoZSl7cmV0dXJuIHRoaXMuc3RhcnQuY29weShlLnN0YXJ0KSx0aGlzLmVuZC5jb3B5KGUuZW5kKSx0aGlzfWdldENlbnRlcihlKXtyZXR1cm4gZS5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsdGhpcy5lbmQpLm11bHRpcGx5U2NhbGFyKC41KX1kZWx0YShlKXtyZXR1cm4gZS5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpfWRpc3RhbmNlU3EoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmVuZCl9ZGlzdGFuY2UoKXtyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKHRoaXMuZW5kKX1hdChlLHQpe3JldHVybiB0aGlzLmRlbHRhKHQpLm11bHRpcGx5U2NhbGFyKGUpLmFkZCh0aGlzLnN0YXJ0KX1jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKGUsdCl7cmcuc3ViVmVjdG9ycyhlLHRoaXMuc3RhcnQpLGxsLnN1YlZlY3RvcnModGhpcy5lbmQsdGhpcy5zdGFydCk7Y29uc3Qgbj1sbC5kb3QobGwpO2xldCBzPWxsLmRvdChyZykvbjtyZXR1cm4gdCYmKHM9X3QocywwLDEpKSxzfWNsb3Nlc3RQb2ludFRvUG9pbnQoZSx0LG4pe2NvbnN0IGk9dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKGUsdCk7cmV0dXJuIHRoaXMuZGVsdGEobikubXVsdGlwbHlTY2FsYXIoaSkuYWRkKHRoaXMuc3RhcnQpfWFwcGx5TWF0cml4NChlKXtyZXR1cm4gdGhpcy5zdGFydC5hcHBseU1hdHJpeDQoZSksdGhpcy5lbmQuYXBwbHlNYXRyaXg0KGUpLHRoaXN9ZXF1YWxzKGUpe3JldHVybiBlLnN0YXJ0LmVxdWFscyh0aGlzLnN0YXJ0KSYmZS5lbmQuZXF1YWxzKHRoaXMuZW5kKX1jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkodGhpcyl9fWNvbnN0IHNnPW5ldyBQO2NsYXNzIHIxIGV4dGVuZHMgcnR7Y29uc3RydWN0b3IoZSx0KXtzdXBlcigpLHRoaXMubGlnaHQ9ZSx0aGlzLm1hdHJpeD1lLm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNvbG9yPXQsdGhpcy50eXBlPSJTcG90TGlnaHRIZWxwZXIiO2NvbnN0IG49bmV3IGtlLGk9WzAsMCwwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLC0xLDAsMSwwLDAsMCwwLDEsMSwwLDAsMCwwLC0xLDFdO2ZvcihsZXQgYT0wLG89MSxsPTMyO2E8bDthKyssbysrKXtjb25zdCBjPWEvbCpNYXRoLlBJKjIsaD1vL2wqTWF0aC5QSSoyO2kucHVzaChNYXRoLmNvcyhjKSxNYXRoLnNpbihjKSwxLE1hdGguY29zKGgpLE1hdGguc2luKGgpLDEpfW4uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFNlKGksMykpO2NvbnN0IHM9bmV3IEt0KHtmb2c6ITEsdG9uZU1hcHBlZDohMX0pO3RoaXMuY29uZT1uZXcgV24obixzKSx0aGlzLmFkZCh0aGlzLmNvbmUpLHRoaXMudXBkYXRlKCl9ZGlzcG9zZSgpe3RoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKX11cGRhdGUoKXt0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLmxpZ2h0LnRhcmdldC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLmxpZ2h0LmRpc3RhbmNlP3RoaXMubGlnaHQuZGlzdGFuY2U6MWUzLHQ9ZSpNYXRoLnRhbih0aGlzLmxpZ2h0LmFuZ2xlKTt0aGlzLmNvbmUuc2NhbGUuc2V0KHQsdCxlKSxzZy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQpLHRoaXMuY29uZS5sb29rQXQoc2cpLHRoaXMuY29sb3IhPT12b2lkIDA/dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTp0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKX19Y29uc3QgRmk9bmV3IFAsY2w9bmV3IEllLF91PW5ldyBJZTtjbGFzcyBzMSBleHRlbmRzIFdue2NvbnN0cnVjdG9yKGUpe2NvbnN0IHQ9YWcoZSksbj1uZXcga2UsaT1bXSxzPVtdLGE9bmV3IHllKDAsMCwxKSxvPW5ldyB5ZSgwLDEsMCk7Zm9yKGxldCBjPTA7Yzx0Lmxlbmd0aDtjKyspe2NvbnN0IGg9dFtjXTtoLnBhcmVudCYmaC5wYXJlbnQuaXNCb25lJiYoaS5wdXNoKDAsMCwwKSxpLnB1c2goMCwwLDApLHMucHVzaChhLnIsYS5nLGEuYikscy5wdXNoKG8ucixvLmcsby5iKSl9bi5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoaSwzKSksbi5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgU2UocywzKSk7Y29uc3QgbD1uZXcgS3Qoe3ZlcnRleENvbG9yczohMCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSx0b25lTWFwcGVkOiExLHRyYW5zcGFyZW50OiEwfSk7c3VwZXIobixsKSx0aGlzLmlzU2tlbGV0b25IZWxwZXI9ITAsdGhpcy50eXBlPSJTa2VsZXRvbkhlbHBlciIsdGhpcy5yb290PWUsdGhpcy5ib25lcz10LHRoaXMubWF0cml4PWUubWF0cml4V29ybGQsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExfXVwZGF0ZU1hdHJpeFdvcmxkKGUpe2NvbnN0IHQ9dGhpcy5ib25lcyxuPXRoaXMuZ2VvbWV0cnksaT1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtfdS5jb3B5KHRoaXMucm9vdC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk7Zm9yKGxldCBzPTAsYT0wO3M8dC5sZW5ndGg7cysrKXtjb25zdCBvPXRbc107by5wYXJlbnQmJm8ucGFyZW50LmlzQm9uZSYmKGNsLm11bHRpcGx5TWF0cmljZXMoX3Usby5tYXRyaXhXb3JsZCksRmkuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGNsKSxpLnNldFhZWihhLEZpLngsRmkueSxGaS56KSxjbC5tdWx0aXBseU1hdHJpY2VzKF91LG8ucGFyZW50Lm1hdHJpeFdvcmxkKSxGaS5zZXRGcm9tTWF0cml4UG9zaXRpb24oY2wpLGkuc2V0WFlaKGErMSxGaS54LEZpLnksRmkueiksYSs9Mil9bi5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITAsc3VwZXIudXBkYXRlTWF0cml4V29ybGQoZSl9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1mdW5jdGlvbiBhZyhyKXtjb25zdCBlPVtdO3IuaXNCb25lPT09ITAmJmUucHVzaChyKTtmb3IobGV0IHQ9MDt0PHIuY2hpbGRyZW4ubGVuZ3RoO3QrKyllLnB1c2guYXBwbHkoZSxhZyhyLmNoaWxkcmVuW3RdKSk7cmV0dXJuIGV9Y2xhc3MgYTEgZXh0ZW5kcyBMdHtjb25zdHJ1Y3RvcihlLHQsbil7Y29uc3QgaT1uZXcgY2EodCw0LDIpLHM9bmV3IFBpKHt3aXJlZnJhbWU6ITAsZm9nOiExLHRvbmVNYXBwZWQ6ITF9KTtzdXBlcihpLHMpLHRoaXMubGlnaHQ9ZSx0aGlzLmNvbG9yPW4sdGhpcy50eXBlPSJQb2ludExpZ2h0SGVscGVyIix0aGlzLm1hdHJpeD10aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX11cGRhdGUoKXt0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLmNvbG9yIT09dm9pZCAwP3RoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOnRoaXMubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKX19Y29uc3QgbzE9bmV3IFAsb2c9bmV3IHllLGxnPW5ldyB5ZTtjbGFzcyBsMSBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcigpLHRoaXMubGlnaHQ9ZSx0aGlzLm1hdHJpeD1lLm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNvbG9yPW4sdGhpcy50eXBlPSJIZW1pc3BoZXJlTGlnaHRIZWxwZXIiO2NvbnN0IGk9bmV3IGxhKHQpO2kucm90YXRlWShNYXRoLlBJKi41KSx0aGlzLm1hdGVyaWFsPW5ldyBQaSh7d2lyZWZyYW1lOiEwLGZvZzohMSx0b25lTWFwcGVkOiExfSksdGhpcy5jb2xvcj09PXZvaWQgMCYmKHRoaXMubWF0ZXJpYWwudmVydGV4Q29sb3JzPSEwKTtjb25zdCBzPWkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLGE9bmV3IEZsb2F0MzJBcnJheShzLmNvdW50KjMpO2kuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IEtlKGEsMykpLHRoaXMuYWRkKG5ldyBMdChpLHRoaXMubWF0ZXJpYWwpKSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmNoaWxkcmVuWzBdLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLmNoaWxkcmVuWzBdLm1hdGVyaWFsLmRpc3Bvc2UoKX11cGRhdGUoKXtjb25zdCBlPXRoaXMuY2hpbGRyZW5bMF07aWYodGhpcy5jb2xvciE9PXZvaWQgMCl0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTtlbHNle2NvbnN0IHQ9ZS5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoImNvbG9yIik7b2cuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSxsZy5jb3B5KHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IpO2ZvcihsZXQgbj0wLGk9dC5jb3VudDtuPGk7bisrKXtjb25zdCBzPW48aS8yP29nOmxnO3Quc2V0WFlaKG4scy5yLHMuZyxzLmIpfXQubmVlZHNVcGRhdGU9ITB9dGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksZS5sb29rQXQobzEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQubWF0cml4V29ybGQpLm5lZ2F0ZSgpKX19Y2xhc3MgYzEgZXh0ZW5kcyBXbntjb25zdHJ1Y3RvcihlPTEwLHQ9MTAsbj00NDczOTI0LGk9ODk0Nzg0OCl7bj1uZXcgeWUobiksaT1uZXcgeWUoaSk7Y29uc3Qgcz10LzIsYT1lL3Qsbz1lLzIsbD1bXSxjPVtdO2ZvcihsZXQgZj0wLGQ9MCxwPS1vO2Y8PXQ7ZisrLHArPWEpe2wucHVzaCgtbywwLHAsbywwLHApLGwucHVzaChwLDAsLW8scCwwLG8pO2NvbnN0IF89Zj09PXM/bjppO18udG9BcnJheShjLGQpLGQrPTMsXy50b0FycmF5KGMsZCksZCs9MyxfLnRvQXJyYXkoYyxkKSxkKz0zLF8udG9BcnJheShjLGQpLGQrPTN9Y29uc3QgaD1uZXcga2U7aC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UobCwzKSksaC5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgU2UoYywzKSk7Y29uc3QgdT1uZXcgS3Qoe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSk7c3VwZXIoaCx1KSx0aGlzLnR5cGU9IkdyaWRIZWxwZXIifWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y2xhc3MgaDEgZXh0ZW5kcyBXbntjb25zdHJ1Y3RvcihlPTEwLHQ9MTYsbj04LGk9NjQscz00NDczOTI0LGE9ODk0Nzg0OCl7cz1uZXcgeWUocyksYT1uZXcgeWUoYSk7Y29uc3Qgbz1bXSxsPVtdO2lmKHQ+MSlmb3IobGV0IHU9MDt1PHQ7dSsrKXtjb25zdCBmPXUvdCooTWF0aC5QSSoyKSxkPU1hdGguc2luKGYpKmUscD1NYXRoLmNvcyhmKSplO28ucHVzaCgwLDAsMCksby5wdXNoKGQsMCxwKTtjb25zdCBfPXUmMT9zOmE7bC5wdXNoKF8ucixfLmcsXy5iKSxsLnB1c2goXy5yLF8uZyxfLmIpfWZvcihsZXQgdT0wO3U8bjt1Kyspe2NvbnN0IGY9dSYxP3M6YSxkPWUtZS9uKnU7Zm9yKGxldCBwPTA7cDxpO3ArKyl7bGV0IF89cC9pKihNYXRoLlBJKjIpLGc9TWF0aC5zaW4oXykqZCxtPU1hdGguY29zKF8pKmQ7by5wdXNoKGcsMCxtKSxsLnB1c2goZi5yLGYuZyxmLmIpLF89KHArMSkvaSooTWF0aC5QSSoyKSxnPU1hdGguc2luKF8pKmQsbT1NYXRoLmNvcyhfKSpkLG8ucHVzaChnLDAsbSksbC5wdXNoKGYucixmLmcsZi5iKX19Y29uc3QgYz1uZXcga2U7Yy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UobywzKSksYy5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgU2UobCwzKSk7Y29uc3QgaD1uZXcgS3Qoe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSk7c3VwZXIoYyxoKSx0aGlzLnR5cGU9IlBvbGFyR3JpZEhlbHBlciJ9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1jb25zdCBjZz1uZXcgUCxobD1uZXcgUCxoZz1uZXcgUDtjbGFzcyB1MSBleHRlbmRzIHJ0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcigpLHRoaXMubGlnaHQ9ZSx0aGlzLm1hdHJpeD1lLm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmNvbG9yPW4sdGhpcy50eXBlPSJEaXJlY3Rpb25hbExpZ2h0SGVscGVyIix0PT09dm9pZCAwJiYodD0xKTtsZXQgaT1uZXcga2U7aS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoWy10LHQsMCx0LHQsMCx0LC10LDAsLXQsLXQsMCwtdCx0LDBdLDMpKTtjb25zdCBzPW5ldyBLdCh7Zm9nOiExLHRvbmVNYXBwZWQ6ITF9KTt0aGlzLmxpZ2h0UGxhbmU9bmV3IFVpKGkscyksdGhpcy5hZGQodGhpcy5saWdodFBsYW5lKSxpPW5ldyBrZSxpLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShbMCwwLDAsMCwwLDFdLDMpKSx0aGlzLnRhcmdldExpbmU9bmV3IFVpKGkscyksdGhpcy5hZGQodGhpcy50YXJnZXRMaW5lKSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCksdGhpcy50YXJnZXRMaW5lLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuZGlzcG9zZSgpfXVwZGF0ZSgpe3RoaXMubGlnaHQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubGlnaHQudGFyZ2V0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxjZy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC5tYXRyaXhXb3JsZCksaGwuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKSxoZy5zdWJWZWN0b3JzKGhsLGNnKSx0aGlzLmxpZ2h0UGxhbmUubG9va0F0KGhsKSx0aGlzLmNvbG9yIT09dm9pZCAwPyh0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcikpOih0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSx0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKSksdGhpcy50YXJnZXRMaW5lLmxvb2tBdChobCksdGhpcy50YXJnZXRMaW5lLnNjYWxlLno9aGcubGVuZ3RoKCl9fWNvbnN0IHVsPW5ldyBQLHh0PW5ldyBfbztjbGFzcyBmMSBleHRlbmRzIFdue2NvbnN0cnVjdG9yKGUpe2NvbnN0IHQ9bmV3IGtlLG49bmV3IEt0KHtjb2xvcjoxNjc3NzIxNSx2ZXJ0ZXhDb2xvcnM6ITAsdG9uZU1hcHBlZDohMX0pLGk9W10scz1bXSxhPXt9O28oIm4xIiwibjIiKSxvKCJuMiIsIm40IiksbygibjQiLCJuMyIpLG8oIm4zIiwibjEiKSxvKCJmMSIsImYyIiksbygiZjIiLCJmNCIpLG8oImY0IiwiZjMiKSxvKCJmMyIsImYxIiksbygibjEiLCJmMSIpLG8oIm4yIiwiZjIiKSxvKCJuMyIsImYzIiksbygibjQiLCJmNCIpLG8oInAiLCJuMSIpLG8oInAiLCJuMiIpLG8oInAiLCJuMyIpLG8oInAiLCJuNCIpLG8oInUxIiwidTIiKSxvKCJ1MiIsInUzIiksbygidTMiLCJ1MSIpLG8oImMiLCJ0IiksbygicCIsImMiKSxvKCJjbjEiLCJjbjIiKSxvKCJjbjMiLCJjbjQiKSxvKCJjZjEiLCJjZjIiKSxvKCJjZjMiLCJjZjQiKTtmdW5jdGlvbiBvKHAsXyl7bChwKSxsKF8pfWZ1bmN0aW9uIGwocCl7aS5wdXNoKDAsMCwwKSxzLnB1c2goMCwwLDApLGFbcF09PT12b2lkIDAmJihhW3BdPVtdKSxhW3BdLnB1c2goaS5sZW5ndGgvMy0xKX10LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShpLDMpKSx0LnNldEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBTZShzLDMpKSxzdXBlcih0LG4pLHRoaXMudHlwZT0iQ2FtZXJhSGVscGVyIix0aGlzLmNhbWVyYT1lLHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgmJnRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSx0aGlzLm1hdHJpeD1lLm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLnBvaW50TWFwPWEsdGhpcy51cGRhdGUoKTtjb25zdCBjPW5ldyB5ZSgxNjc1NTIwMCksaD1uZXcgeWUoMTY3MTE2ODApLHU9bmV3IHllKDQzNzc1KSxmPW5ldyB5ZSgxNjc3NzIxNSksZD1uZXcgeWUoMzM1NTQ0Myk7dGhpcy5zZXRDb2xvcnMoYyxoLHUsZixkKX1zZXRDb2xvcnMoZSx0LG4saSxzKXtjb25zdCBvPXRoaXMuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO28uc2V0WFlaKDAsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDEsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDIsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDMsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDQsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDUsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDYsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDcsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDgsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDksZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDEwLGUucixlLmcsZS5iKSxvLnNldFhZWigxMSxlLnIsZS5nLGUuYiksby5zZXRYWVooMTIsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDEzLGUucixlLmcsZS5iKSxvLnNldFhZWigxNCxlLnIsZS5nLGUuYiksby5zZXRYWVooMTUsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDE2LGUucixlLmcsZS5iKSxvLnNldFhZWigxNyxlLnIsZS5nLGUuYiksby5zZXRYWVooMTgsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDE5LGUucixlLmcsZS5iKSxvLnNldFhZWigyMCxlLnIsZS5nLGUuYiksby5zZXRYWVooMjEsZS5yLGUuZyxlLmIpLG8uc2V0WFlaKDIyLGUucixlLmcsZS5iKSxvLnNldFhZWigyMyxlLnIsZS5nLGUuYiksby5zZXRYWVooMjQsdC5yLHQuZyx0LmIpLG8uc2V0WFlaKDI1LHQucix0LmcsdC5iKSxvLnNldFhZWigyNix0LnIsdC5nLHQuYiksby5zZXRYWVooMjcsdC5yLHQuZyx0LmIpLG8uc2V0WFlaKDI4LHQucix0LmcsdC5iKSxvLnNldFhZWigyOSx0LnIsdC5nLHQuYiksby5zZXRYWVooMzAsdC5yLHQuZyx0LmIpLG8uc2V0WFlaKDMxLHQucix0LmcsdC5iKSxvLnNldFhZWigzMixuLnIsbi5nLG4uYiksby5zZXRYWVooMzMsbi5yLG4uZyxuLmIpLG8uc2V0WFlaKDM0LG4ucixuLmcsbi5iKSxvLnNldFhZWigzNSxuLnIsbi5nLG4uYiksby5zZXRYWVooMzYsbi5yLG4uZyxuLmIpLG8uc2V0WFlaKDM3LG4ucixuLmcsbi5iKSxvLnNldFhZWigzOCxpLnIsaS5nLGkuYiksby5zZXRYWVooMzksaS5yLGkuZyxpLmIpLG8uc2V0WFlaKDQwLHMucixzLmcscy5iKSxvLnNldFhZWig0MSxzLnIscy5nLHMuYiksby5zZXRYWVooNDIscy5yLHMuZyxzLmIpLG8uc2V0WFlaKDQzLHMucixzLmcscy5iKSxvLnNldFhZWig0NCxzLnIscy5nLHMuYiksby5zZXRYWVooNDUscy5yLHMuZyxzLmIpLG8uc2V0WFlaKDQ2LHMucixzLmcscy5iKSxvLnNldFhZWig0NyxzLnIscy5nLHMuYiksby5zZXRYWVooNDgscy5yLHMuZyxzLmIpLG8uc2V0WFlaKDQ5LHMucixzLmcscy5iKSxvLm5lZWRzVXBkYXRlPSEwfXVwZGF0ZSgpe2NvbnN0IGU9dGhpcy5nZW9tZXRyeSx0PXRoaXMucG9pbnRNYXAsbj0xLGk9MTt4dC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKSxBdCgiYyIsdCxlLHh0LDAsMCwtMSksQXQoInQiLHQsZSx4dCwwLDAsMSksQXQoIm4xIix0LGUseHQsLW4sLWksLTEpLEF0KCJuMiIsdCxlLHh0LG4sLWksLTEpLEF0KCJuMyIsdCxlLHh0LC1uLGksLTEpLEF0KCJuNCIsdCxlLHh0LG4saSwtMSksQXQoImYxIix0LGUseHQsLW4sLWksMSksQXQoImYyIix0LGUseHQsbiwtaSwxKSxBdCgiZjMiLHQsZSx4dCwtbixpLDEpLEF0KCJmNCIsdCxlLHh0LG4saSwxKSxBdCgidTEiLHQsZSx4dCxuKi43LGkqMS4xLC0xKSxBdCgidTIiLHQsZSx4dCwtbiouNyxpKjEuMSwtMSksQXQoInUzIix0LGUseHQsMCxpKjIsLTEpLEF0KCJjZjEiLHQsZSx4dCwtbiwwLDEpLEF0KCJjZjIiLHQsZSx4dCxuLDAsMSksQXQoImNmMyIsdCxlLHh0LDAsLWksMSksQXQoImNmNCIsdCxlLHh0LDAsaSwxKSxBdCgiY24xIix0LGUseHQsLW4sMCwtMSksQXQoImNuMiIsdCxlLHh0LG4sMCwtMSksQXQoImNuMyIsdCxlLHh0LDAsLWksLTEpLEF0KCJjbjQiLHQsZSx4dCwwLGksLTEpLGUuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpLm5lZWRzVXBkYXRlPSEwfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19ZnVuY3Rpb24gQXQocixlLHQsbixpLHMsYSl7dWwuc2V0KGkscyxhKS51bnByb2plY3Qobik7Y29uc3Qgbz1lW3JdO2lmKG8hPT12b2lkIDApe2NvbnN0IGw9dC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7Zm9yKGxldCBjPTAsaD1vLmxlbmd0aDtjPGg7YysrKWwuc2V0WFlaKG9bY10sdWwueCx1bC55LHVsLnopfX1jb25zdCBmbD1uZXcgRHQ7Y2xhc3MgZDEgZXh0ZW5kcyBXbntjb25zdHJ1Y3RvcihlLHQ9MTY3NzY5NjApe2NvbnN0IG49bmV3IFVpbnQxNkFycmF5KFswLDEsMSwyLDIsMywzLDAsNCw1LDUsNiw2LDcsNyw0LDAsNCwxLDUsMiw2LDMsN10pLGk9bmV3IEZsb2F0MzJBcnJheSg4KjMpLHM9bmV3IGtlO3Muc2V0SW5kZXgobmV3IEtlKG4sMSkpLHMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IEtlKGksMykpLHN1cGVyKHMsbmV3IEt0KHtjb2xvcjp0LHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5vYmplY3Q9ZSx0aGlzLnR5cGU9IkJveEhlbHBlciIsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMudXBkYXRlKCl9dXBkYXRlKGUpe2lmKGUhPT12b2lkIDAmJmNvbnNvbGUud2FybigiVEhSRUUuQm94SGVscGVyOiAudXBkYXRlKCkgaGFzIG5vIGxvbmdlciBhcmd1bWVudHMuIiksdGhpcy5vYmplY3QhPT12b2lkIDAmJmZsLnNldEZyb21PYmplY3QodGhpcy5vYmplY3QpLGZsLmlzRW1wdHkoKSlyZXR1cm47Y29uc3QgdD1mbC5taW4sbj1mbC5tYXgsaT10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24scz1pLmFycmF5O3NbMF09bi54LHNbMV09bi55LHNbMl09bi56LHNbM109dC54LHNbNF09bi55LHNbNV09bi56LHNbNl09dC54LHNbN109dC55LHNbOF09bi56LHNbOV09bi54LHNbMTBdPXQueSxzWzExXT1uLnosc1sxMl09bi54LHNbMTNdPW4ueSxzWzE0XT10Lnosc1sxNV09dC54LHNbMTZdPW4ueSxzWzE3XT10Lnosc1sxOF09dC54LHNbMTldPXQueSxzWzIwXT10Lnosc1syMV09bi54LHNbMjJdPXQueSxzWzIzXT10LnosaS5uZWVkc1VwZGF0ZT0hMCx0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfXNldEZyb21PYmplY3QoZSl7cmV0dXJuIHRoaXMub2JqZWN0PWUsdGhpcy51cGRhdGUoKSx0aGlzfWNvcHkoZSx0KXtyZXR1cm4gc3VwZXIuY29weShlLHQpLHRoaXMub2JqZWN0PWUub2JqZWN0LHRoaXN9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1jbGFzcyBwMSBleHRlbmRzIFdue2NvbnN0cnVjdG9yKGUsdD0xNjc3Njk2MCl7Y29uc3Qgbj1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LDQsMCw0LDEsNSwyLDYsMyw3XSksaT1bMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwtMSwtMSwxLC0xLC0xLC0xLC0xLDEsLTEsLTFdLHM9bmV3IGtlO3Muc2V0SW5kZXgobmV3IEtlKG4sMSkpLHMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFNlKGksMykpLHN1cGVyKHMsbmV3IEt0KHtjb2xvcjp0LHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5ib3g9ZSx0aGlzLnR5cGU9IkJveDNIZWxwZXIiLHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl9dXBkYXRlTWF0cml4V29ybGQoZSl7Y29uc3QgdD10aGlzLmJveDt0LmlzRW1wdHkoKXx8KHQuZ2V0Q2VudGVyKHRoaXMucG9zaXRpb24pLHQuZ2V0U2l6ZSh0aGlzLnNjYWxlKSx0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKC41KSxzdXBlci51cGRhdGVNYXRyaXhXb3JsZChlKSl9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpfX1jbGFzcyBtMSBleHRlbmRzIFVpe2NvbnN0cnVjdG9yKGUsdD0xLG49MTY3NzY5NjApe2NvbnN0IGk9bixzPVsxLC0xLDAsLTEsMSwwLC0xLC0xLDAsMSwxLDAsLTEsMSwwLC0xLC0xLDAsMSwtMSwwLDEsMSwwXSxhPW5ldyBrZTthLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShzLDMpKSxhLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHN1cGVyKGEsbmV3IEt0KHtjb2xvcjppLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy50eXBlPSJQbGFuZUhlbHBlciIsdGhpcy5wbGFuZT1lLHRoaXMuc2l6ZT10O2NvbnN0IG89WzEsMSwwLC0xLDEsMCwtMSwtMSwwLDEsMSwwLC0xLC0xLDAsMSwtMSwwXSxsPW5ldyBrZTtsLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShvLDMpKSxsLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuYWRkKG5ldyBMdChsLG5ldyBQaSh7Y29sb3I6aSxvcGFjaXR5Oi4yLHRyYW5zcGFyZW50OiEwLGRlcHRoV3JpdGU6ITEsdG9uZU1hcHBlZDohMX0pKSl9dXBkYXRlTWF0cml4V29ybGQoZSl7dGhpcy5wb3NpdGlvbi5zZXQoMCwwLDApLHRoaXMuc2NhbGUuc2V0KC41KnRoaXMuc2l6ZSwuNSp0aGlzLnNpemUsMSksdGhpcy5sb29rQXQodGhpcy5wbGFuZS5ub3JtYWwpLHRoaXMudHJhbnNsYXRlWigtdGhpcy5wbGFuZS5jb25zdGFudCksc3VwZXIudXBkYXRlTWF0cml4V29ybGQoZSl9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpLHRoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfX1jb25zdCB1Zz1uZXcgUDtsZXQgZGwseHU7Y2xhc3MgZzEgZXh0ZW5kcyBydHtjb25zdHJ1Y3RvcihlPW5ldyBQKDAsMCwxKSx0PW5ldyBQKDAsMCwwKSxuPTEsaT0xNjc3Njk2MCxzPW4qLjIsYT1zKi4yKXtzdXBlcigpLHRoaXMudHlwZT0iQXJyb3dIZWxwZXIiLGRsPT09dm9pZCAwJiYoZGw9bmV3IGtlLGRsLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBTZShbMCwwLDAsMCwxLDBdLDMpKSx4dT1uZXcgbnMoMCwuNSwxLDUsMSkseHUudHJhbnNsYXRlKDAsLS41LDApKSx0aGlzLnBvc2l0aW9uLmNvcHkodCksdGhpcy5saW5lPW5ldyBVaShkbCxuZXcgS3Qoe2NvbG9yOmksdG9uZU1hcHBlZDohMX0pKSx0aGlzLmxpbmUubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLmFkZCh0aGlzLmxpbmUpLHRoaXMuY29uZT1uZXcgTHQoeHUsbmV3IFBpKHtjb2xvcjppLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5jb25lLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5hZGQodGhpcy5jb25lKSx0aGlzLnNldERpcmVjdGlvbihlKSx0aGlzLnNldExlbmd0aChuLHMsYSl9c2V0RGlyZWN0aW9uKGUpe2lmKGUueT4uOTk5OTkpdGhpcy5xdWF0ZXJuaW9uLnNldCgwLDAsMCwxKTtlbHNlIGlmKGUueTwtLjk5OTk5KXRoaXMucXVhdGVybmlvbi5zZXQoMSwwLDAsMCk7ZWxzZXt1Zy5zZXQoZS56LDAsLWUueCkubm9ybWFsaXplKCk7Y29uc3QgdD1NYXRoLmFjb3MoZS55KTt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSh1Zyx0KX19c2V0TGVuZ3RoKGUsdD1lKi4yLG49dCouMil7dGhpcy5saW5lLnNjYWxlLnNldCgxLE1hdGgubWF4KDFlLTQsZS10KSwxKSx0aGlzLmxpbmUudXBkYXRlTWF0cml4KCksdGhpcy5jb25lLnNjYWxlLnNldChuLHQsbiksdGhpcy5jb25lLnBvc2l0aW9uLnk9ZSx0aGlzLmNvbmUudXBkYXRlTWF0cml4KCl9c2V0Q29sb3IoZSl7dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLnNldChlKSx0aGlzLmNvbmUubWF0ZXJpYWwuY29sb3Iuc2V0KGUpfWNvcHkoZSl7cmV0dXJuIHN1cGVyLmNvcHkoZSwhMSksdGhpcy5saW5lLmNvcHkoZS5saW5lKSx0aGlzLmNvbmUuY29weShlLmNvbmUpLHRoaXN9ZGlzcG9zZSgpe3RoaXMubGluZS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5saW5lLm1hdGVyaWFsLmRpc3Bvc2UoKSx0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCl9fWNsYXNzIF8xIGV4dGVuZHMgV257Y29uc3RydWN0b3IoZT0xKXtjb25zdCB0PVswLDAsMCxlLDAsMCwwLDAsMCwwLGUsMCwwLDAsMCwwLDAsZV0sbj1bMSwwLDAsMSwuNiwwLDAsMSwwLC42LDEsMCwwLDAsMSwwLC42LDFdLGk9bmV3IGtlO2kuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFNlKHQsMykpLGkuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IFNlKG4sMykpO2NvbnN0IHM9bmV3IEt0KHt2ZXJ0ZXhDb2xvcnM6ITAsdG9uZU1hcHBlZDohMX0pO3N1cGVyKGkscyksdGhpcy50eXBlPSJBeGVzSGVscGVyIn1zZXRDb2xvcnMoZSx0LG4pe2NvbnN0IGk9bmV3IHllLHM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLmNvbG9yLmFycmF5O3JldHVybiBpLnNldChlKSxpLnRvQXJyYXkocywwKSxpLnRvQXJyYXkocywzKSxpLnNldCh0KSxpLnRvQXJyYXkocyw2KSxpLnRvQXJyYXkocyw5KSxpLnNldChuKSxpLnRvQXJyYXkocywxMiksaS50b0FycmF5KHMsMTUpLHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5uZWVkc1VwZGF0ZT0hMCx0aGlzfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19Y2xhc3MgeDF7Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU9IlNoYXBlUGF0aCIsdGhpcy5jb2xvcj1uZXcgeWUsdGhpcy5zdWJQYXRocz1bXSx0aGlzLmN1cnJlbnRQYXRoPW51bGx9bW92ZVRvKGUsdCl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGg9bmV3IGlhLHRoaXMuc3ViUGF0aHMucHVzaCh0aGlzLmN1cnJlbnRQYXRoKSx0aGlzLmN1cnJlbnRQYXRoLm1vdmVUbyhlLHQpLHRoaXN9bGluZVRvKGUsdCl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGgubGluZVRvKGUsdCksdGhpc31xdWFkcmF0aWNDdXJ2ZVRvKGUsdCxuLGkpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8oZSx0LG4saSksdGhpc31iZXppZXJDdXJ2ZVRvKGUsdCxuLGkscyxhKXtyZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKGUsdCxuLGkscyxhKSx0aGlzfXNwbGluZVRocnUoZSl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGguc3BsaW5lVGhydShlKSx0aGlzfXRvU2hhcGVzKGUpe2Z1bmN0aW9uIHQobSl7Y29uc3QgeT1bXTtmb3IobGV0IHg9MCx2PW0ubGVuZ3RoO3g8djt4Kyspe2NvbnN0IFM9bVt4XSxiPW5ldyBvaTtiLmN1cnZlcz1TLmN1cnZlcyx5LnB1c2goYil9cmV0dXJuIHl9ZnVuY3Rpb24gbihtLHkpe2NvbnN0IHg9eS5sZW5ndGg7bGV0IHY9ITE7Zm9yKGxldCBTPXgtMSxiPTA7Yjx4O1M9YisrKXtsZXQgQT15W1NdLEw9eVtiXSxNPUwueC1BLngsdz1MLnktQS55O2lmKE1hdGguYWJzKHcpPk51bWJlci5FUFNJTE9OKXtpZih3PDAmJihBPXlbYl0sTT0tTSxMPXlbU10sdz0tdyksbS55PEEueXx8bS55PkwueSljb250aW51ZTtpZihtLnk9PT1BLnkpe2lmKG0ueD09PUEueClyZXR1cm4hMH1lbHNle2NvbnN0IFI9dyoobS54LUEueCktTSoobS55LUEueSk7aWYoUj09PTApcmV0dXJuITA7aWYoUjwwKWNvbnRpbnVlO3Y9IXZ9fWVsc2V7aWYobS55IT09QS55KWNvbnRpbnVlO2lmKEwueDw9bS54JiZtLng8PUEueHx8QS54PD1tLngmJm0ueDw9TC54KXJldHVybiEwfX1yZXR1cm4gdn1jb25zdCBpPXZuLmlzQ2xvY2tXaXNlLHM9dGhpcy5zdWJQYXRocztpZihzLmxlbmd0aD09PTApcmV0dXJuW107bGV0IGEsbyxsO2NvbnN0IGM9W107aWYocy5sZW5ndGg9PT0xKXJldHVybiBvPXNbMF0sbD1uZXcgb2ksbC5jdXJ2ZXM9by5jdXJ2ZXMsYy5wdXNoKGwpLGM7bGV0IGg9IWkoc1swXS5nZXRQb2ludHMoKSk7aD1lPyFoOmg7Y29uc3QgdT1bXSxmPVtdO2xldCBkPVtdLHA9MCxfO2ZbcF09dm9pZCAwLGRbcF09W107Zm9yKGxldCBtPTAseT1zLmxlbmd0aDttPHk7bSsrKW89c1ttXSxfPW8uZ2V0UG9pbnRzKCksYT1pKF8pLGE9ZT8hYTphLGE/KCFoJiZmW3BdJiZwKyssZltwXT17czpuZXcgb2kscDpffSxmW3BdLnMuY3VydmVzPW8uY3VydmVzLGgmJnArKyxkW3BdPVtdKTpkW3BdLnB1c2goe2g6byxwOl9bMF19KTtpZighZlswXSlyZXR1cm4gdChzKTtpZihmLmxlbmd0aD4xKXtsZXQgbT0hMSx5PTA7Zm9yKGxldCB4PTAsdj1mLmxlbmd0aDt4PHY7eCsrKXVbeF09W107Zm9yKGxldCB4PTAsdj1mLmxlbmd0aDt4PHY7eCsrKXtjb25zdCBTPWRbeF07Zm9yKGxldCBiPTA7YjxTLmxlbmd0aDtiKyspe2NvbnN0IEE9U1tiXTtsZXQgTD0hMDtmb3IobGV0IE09MDtNPGYubGVuZ3RoO00rKyluKEEucCxmW01dLnApJiYoeCE9PU0mJnkrKyxMPyhMPSExLHVbTV0ucHVzaChBKSk6bT0hMCk7TCYmdVt4XS5wdXNoKEEpfX15PjAmJm09PT0hMSYmKGQ9dSl9bGV0IGc7Zm9yKGxldCBtPTAseT1mLmxlbmd0aDttPHk7bSsrKXtsPWZbbV0ucyxjLnB1c2gobCksZz1kW21dO2ZvcihsZXQgeD0wLHY9Zy5sZW5ndGg7eDx2O3grKylsLmhvbGVzLnB1c2goZ1t4XS5oKX1yZXR1cm4gY319dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyE9InVuZGVmaW5lZCImJl9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgicmVnaXN0ZXIiLHtkZXRhaWw6e3JldmlzaW9uOmZ0fX0pKSx0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmKHdpbmRvdy5fX1RIUkVFX18/Y29uc29sZS53YXJuKCJXQVJOSU5HOiBNdWx0aXBsZSBpbnN0YW5jZXMgb2YgVGhyZWUuanMgYmVpbmcgaW1wb3J0ZWQuIik6d2luZG93Ll9fVEhSRUVfXz1mdCk7dmFyIHkxPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEFDRVNGaWxtaWNUb25lTWFwcGluZzpqZixBZGRFcXVhdGlvbjp4aSxBZGRPcGVyYXRpb246WmYsQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGU6WWMsQWRkaXRpdmVCbGVuZGluZzpjYyxBbHBoYUZvcm1hdDpyZCxBbHdheXNDb21wYXJlOlNkLEFsd2F5c0RlcHRoOlZmLEFsd2F5c1N0ZW5jaWxGdW5jOkpjLEFtYmllbnRMaWdodDp6bSxBbmltYXRpb25BY3Rpb246dGcsQW5pbWF0aW9uQ2xpcDpkYSxBbmltYXRpb25Mb2FkZXI6eWIsQW5pbWF0aW9uTWl4ZXI6WWIsQW5pbWF0aW9uT2JqZWN0R3JvdXA6cWIsQW5pbWF0aW9uVXRpbHM6bWIsQXJjQ3VydmU6ZW0sQXJyYXlDYW1lcmE6U3AsQXJyb3dIZWxwZXI6ZzEsQXR0YWNoZWRCaW5kTW9kZTpwYyxBdWRpbzpRbSxBdWRpb0FuYWx5c2VyOkZiLEF1ZGlvQ29udGV4dDpmdSxBdWRpb0xpc3RlbmVyOlViLEF1ZGlvTG9hZGVyOlBiLEF4ZXNIZWxwZXI6XzEsQmFja1NpZGU6WXQsQmFzaWNEZXB0aFBhY2tpbmc6ZGQsQmFzaWNTaGFkb3dNYXA6dnMsQmF0Y2hlZE1lc2g6V3AsQm9uZTpCaCxCb29sZWFuS2V5ZnJhbWVUcmFjazppcixCb3gyOm4xLEJveDM6RHQsQm94M0hlbHBlcjpwMSxCb3hHZW9tZXRyeTpZaSxCb3hIZWxwZXI6ZDEsQnVmZmVyQXR0cmlidXRlOktlLEJ1ZmZlckdlb21ldHJ5OmtlLEJ1ZmZlckdlb21ldHJ5TG9hZGVyOldtLEJ5dGVUeXBlOm5kLENhY2hlOnNyLENhbWVyYTpfbyxDYW1lcmFIZWxwZXI6ZjEsQ2FudmFzVGV4dHVyZTp6UyxDYXBzdWxlR2VvbWV0cnk6SG8sQ2F0bXVsbFJvbUN1cnZlMzp0bSxDaW5lb25Ub25lTWFwcGluZzpRZixDaXJjbGVHZW9tZXRyeTpXbyxDbGFtcFRvRWRnZVdyYXBwaW5nOnp0LENsb2NrOlptLENvbG9yOnllLENvbG9yS2V5ZnJhbWVUcmFjazphdSxDb2xvck1hbmFnZW1lbnQ6b3QsQ29tcHJlc3NlZEFycmF5VGV4dHVyZTpPUyxDb21wcmVzc2VkQ3ViZVRleHR1cmU6QlMsQ29tcHJlc3NlZFRleHR1cmU6em8sQ29tcHJlc3NlZFRleHR1cmVMb2FkZXI6dmIsQ29uZUdlb21ldHJ5OlhvLENvbnN0YW50QWxwaGFGYWN0b3I6emYsQ29uc3RhbnRDb2xvckZhY3RvcjpPZixDdWJlQ2FtZXJhOnFkLEN1YmVSZWZsZWN0aW9uTWFwcGluZzpLbixDdWJlUmVmcmFjdGlvbk1hcHBpbmc6eWksQ3ViZVRleHR1cmU6WHMsQ3ViZVRleHR1cmVMb2FkZXI6TWIsQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6YnIsQ3ViaWNCZXppZXJDdXJ2ZTpZaCxDdWJpY0JlemllckN1cnZlMzppbSxDdWJpY0ludGVycG9sYW50OkNtLEN1bGxGYWNlQmFjazpNcixDdWxsRmFjZUZyb250OlVhLEN1bGxGYWNlRnJvbnRCYWNrOmxjLEN1bGxGYWNlTm9uZTpzbixDdXJ2ZTpGbixDdXJ2ZVBhdGg6c20sQ3VzdG9tQmxlbmRpbmc6RWYsQ3VzdG9tVG9uZU1hcHBpbmc6ZWQsQ3lsaW5kZXJHZW9tZXRyeTpucyxDeWxpbmRyaWNhbDp0MSxEYXRhM0RUZXh0dXJlOnNoLERhdGFBcnJheVRleHR1cmU6SmEsRGF0YVRleHR1cmU6amksRGF0YVRleHR1cmVMb2FkZXI6U2IsRGF0YVV0aWxzOl94LERlY3JlbWVudFN0ZW5jaWxPcDp5XyxEZWNyZW1lbnRXcmFwU3RlbmNpbE9wOk1fLERlZmF1bHRMb2FkaW5nTWFuYWdlcjpMbSxEZXB0aEZvcm1hdDpTaSxEZXB0aFN0ZW5jaWxGb3JtYXQ6emksRGVwdGhUZXh0dXJlOkNoLERldGFjaGVkQmluZE1vZGU6dGQsRGlyZWN0aW9uYWxMaWdodDpCbSxEaXJlY3Rpb25hbExpZ2h0SGVscGVyOnUxLERpc2NyZXRlSW50ZXJwb2xhbnQ6Um0sRGlzcGxheVAzQ29sb3JTcGFjZTpxYSxEb2RlY2FoZWRyb25HZW9tZXRyeTpxbyxEb3VibGVTaWRlOkduLERzdEFscGhhRmFjdG9yOklmLERzdENvbG9yRmFjdG9yOkRmLER5bmFtaWNDb3B5VXNhZ2U6Rl8sRHluYW1pY0RyYXdVc2FnZTpQXyxEeW5hbWljUmVhZFVzYWdlOlVfLEVkZ2VzR2VvbWV0cnk6YW0sRWxsaXBzZUN1cnZlOmtvLEVxdWFsQ29tcGFyZTp4ZCxFcXVhbERlcHRoOldmLEVxdWFsU3RlbmNpbEZ1bmM6RV8sRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6YnMsRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6d3MsRXVsZXI6R3MsRXZlbnREaXNwYXRjaGVyOmVpLEV4dHJ1ZGVHZW9tZXRyeTpkbSxGaWxlTG9hZGVyOmNpLEZsb2F0MTZCdWZmZXJBdHRyaWJ1dGU6YngsRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTpTZSxGbG9hdDY0QnVmZmVyQXR0cmlidXRlOnd4LEZsb2F0VHlwZTpSbixGb2c6RW8sRm9nRXhwMjp3byxGcmFtZWJ1ZmZlclRleHR1cmU6RlMsRnJvbnRTaWRlOlluLEZydXN0dW06cXMsR0xCdWZmZXJBdHRyaWJ1dGU6UWIsR0xTTDE6Ql8sR0xTTDM6UWMsR3JlYXRlckNvbXBhcmU6eWQsR3JlYXRlckRlcHRoOnFmLEdyZWF0ZXJFcXVhbENvbXBhcmU6TWQsR3JlYXRlckVxdWFsRGVwdGg6WGYsR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM6Ul8sR3JlYXRlclN0ZW5jaWxGdW5jOlRfLEdyaWRIZWxwZXI6YzEsR3JvdXA6WXIsSGFsZkZsb2F0VHlwZTp3cixIZW1pc3BoZXJlTGlnaHQ6SW0sSGVtaXNwaGVyZUxpZ2h0SGVscGVyOmwxLEljb3NhaGVkcm9uR2VvbWV0cnk6am8sSW1hZ2VCaXRtYXBMb2FkZXI6UmIsSW1hZ2VMb2FkZXI6cGEsSW1hZ2VVdGlsczppaCxJbmNyZW1lbnRTdGVuY2lsT3A6eF8sSW5jcmVtZW50V3JhcFN0ZW5jaWxPcDp2XyxJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6anIsSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk6SG0sSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6S2IsSW5zdGFuY2VkTWVzaDpHcCxJbnQxNkJ1ZmZlckF0dHJpYnV0ZTpNeCxJbnQzMkJ1ZmZlckF0dHJpYnV0ZTpTeCxJbnQ4QnVmZmVyQXR0cmlidXRlOnh4LEludFR5cGU6Z2MsSW50ZXJsZWF2ZWRCdWZmZXI6QW8sSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6UWksSW50ZXJwb2xhbnQ6aGEsSW50ZXJwb2xhdGVEaXNjcmV0ZTpDcyxJbnRlcnBvbGF0ZUxpbmVhcjpScyxJbnRlcnBvbGF0ZVNtb290aDpXYSxJbnZlcnRTdGVuY2lsT3A6U18sS2VlcFN0ZW5jaWxPcDpWaSxLZXlmcmFtZVRyYWNrOk9uLExPRDpMcCxMYXRoZUdlb21ldHJ5OnJhLExheWVyczppbyxMZXNzQ29tcGFyZTpfZCxMZXNzRGVwdGg6SGYsTGVzc0VxdWFsQ29tcGFyZTpLYyxMZXNzRXF1YWxEZXB0aDpNcyxMZXNzRXF1YWxTdGVuY2lsRnVuYzpBXyxMZXNzU3RlbmNpbEZ1bmM6d18sTGlnaHQ6TmksTGlnaHRQcm9iZTpWbSxMaW5lOlVpLExpbmUzOmkxLExpbmVCYXNpY01hdGVyaWFsOkt0LExpbmVDdXJ2ZTpaaCxMaW5lQ3VydmUzOnJtLExpbmVEYXNoZWRNYXRlcmlhbDpFbSxMaW5lTG9vcDpKcCxMaW5lU2VnbWVudHM6V24sTGluZWFyRGlzcGxheVAzQ29sb3JTcGFjZTpMcyxMaW5lYXJFbmNvZGluZzpaYyxMaW5lYXJGaWx0ZXI6d3QsTGluZWFySW50ZXJwb2xhbnQ6c3UsTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyOmZfLExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXI6dV8sTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOnZpLExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6bWMsTGluZWFyU1JHQkNvbG9yU3BhY2U6Vm4sTGluZWFyVG9uZU1hcHBpbmc6SmYsTGluZWFyVHJhbnNmZXI6SXMsTG9hZGVyOnVuLExvYWRlclV0aWxzOnV1LExvYWRpbmdNYW5hZ2VyOm91LExvb3BPbmNlOmhkLExvb3BQaW5nUG9uZzpmZCxMb29wUmVwZWF0OnVkLEx1bWluYW5jZUFscGhhRm9ybWF0OmFkLEx1bWluYW5jZUZvcm1hdDpzZCxNT1VTRTpSdCxNYXRlcmlhbDpIdCxNYXRlcmlhbExvYWRlcjphbCxNYXRoVXRpbHM6al8sTWF0cml4MzpaZSxNYXRyaXg0OkllLE1heEVxdWF0aW9uOmRjLE1lc2g6THQsTWVzaEJhc2ljTWF0ZXJpYWw6UGksTWVzaERlcHRoTWF0ZXJpYWw6TGgsTWVzaERpc3RhbmNlTWF0ZXJpYWw6SWgsTWVzaExhbWJlcnRNYXRlcmlhbDpibSxNZXNoTWF0Y2FwTWF0ZXJpYWw6d20sTWVzaE5vcm1hbE1hdGVyaWFsOlNtLE1lc2hQaG9uZ01hdGVyaWFsOnZtLE1lc2hQaHlzaWNhbE1hdGVyaWFsOnltLE1lc2hTdGFuZGFyZE1hdGVyaWFsOm51LE1lc2hUb29uTWF0ZXJpYWw6TW0sTWluRXF1YXRpb246ZmMsTWlycm9yZWRSZXBlYXRXcmFwcGluZzpBcyxNaXhPcGVyYXRpb246WWYsTXVsdGlwbHlCbGVuZGluZzp1YyxNdWx0aXBseU9wZXJhdGlvbjpTcyxOZWFyZXN0RmlsdGVyOmJ0LE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI6aF8sTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXI6Y18sTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjpUcyxOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcjpPYSxOZXZlckNvbXBhcmU6Z2QsTmV2ZXJEZXB0aDpHZixOZXZlclN0ZW5jaWxGdW5jOmJfLE5vQmxlbmRpbmc6Wm4sTm9Db2xvclNwYWNlOmduLE5vVG9uZU1hcHBpbmc6Sm4sTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlOlhhLE5vcm1hbEJsZW5kaW5nOkJpLE5vdEVxdWFsQ29tcGFyZTp2ZCxOb3RFcXVhbERlcHRoOiRmLE5vdEVxdWFsU3RlbmNpbEZ1bmM6Q18sTnVtYmVyS2V5ZnJhbWVUcmFjazp1YSxPYmplY3QzRDpydCxPYmplY3RMb2FkZXI6VGIsT2JqZWN0U3BhY2VOb3JtYWxNYXA6bWQsT2N0YWhlZHJvbkdlb21ldHJ5OmxhLE9uZUZhY3RvcjpSZixPbmVNaW51c0NvbnN0YW50QWxwaGFGYWN0b3I6a2YsT25lTWludXNDb25zdGFudENvbG9yRmFjdG9yOkJmLE9uZU1pbnVzRHN0QWxwaGFGYWN0b3I6VWYsT25lTWludXNEc3RDb2xvckZhY3RvcjpOZixPbmVNaW51c1NyY0FscGhhRmFjdG9yOk5hLE9uZU1pbnVzU3JjQ29sb3JGYWN0b3I6TGYsT3J0aG9ncmFwaGljQ2FtZXJhOnZvLFAzUHJpbWFyaWVzOkRzLFBDRlNoYWRvd01hcDpDbixQQ0ZTb2Z0U2hhZG93TWFwOlNyLFBNUkVNR2VuZXJhdG9yOkFoLFBhdGg6aWEsUGVyc3BlY3RpdmVDYW1lcmE6QnQsUGxhbmU6TGksUGxhbmVHZW9tZXRyeTokcyxQbGFuZUhlbHBlcjptMSxQb2ludExpZ2h0Ok9tLFBvaW50TGlnaHRIZWxwZXI6YTEsUG9pbnRzOlFwLFBvaW50c01hdGVyaWFsOlZoLFBvbGFyR3JpZEhlbHBlcjpoMSxQb2x5aGVkcm9uR2VvbWV0cnk6RGksUG9zaXRpb25hbEF1ZGlvOk5iLFByb3BlcnR5QmluZGluZzpudCxQcm9wZXJ0eU1peGVyOmVnLFF1YWRyYXRpY0JlemllckN1cnZlOkpoLFF1YWRyYXRpY0JlemllckN1cnZlMzpLaCxRdWF0ZXJuaW9uOmxuLFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrOnJzLFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudDpQbSxSRURfR1JFRU5fUkdUQzJfRm9ybWF0OnFjLFJFRF9SR1RDMV9Gb3JtYXQ6Y2QsUkVWSVNJT046ZnQsUkdCQURlcHRoUGFja2luZzpwZCxSR0JBRm9ybWF0OmFuLFJHQkFJbnRlZ2VyRm9ybWF0Ok1jLFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ6a2MsUkdCQV9BU1RDXzEweDVfRm9ybWF0Ok9jLFJHQkFfQVNUQ18xMHg2X0Zvcm1hdDpCYyxSR0JBX0FTVENfMTB4OF9Gb3JtYXQ6emMsUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdDpHYyxSR0JBX0FTVENfMTJ4MTJfRm9ybWF0OlZjLFJHQkFfQVNUQ180eDRfRm9ybWF0OlJjLFJHQkFfQVNUQ181eDRfRm9ybWF0OlBjLFJHQkFfQVNUQ181eDVfRm9ybWF0OkxjLFJHQkFfQVNUQ182eDVfRm9ybWF0OkljLFJHQkFfQVNUQ182eDZfRm9ybWF0OlVjLFJHQkFfQVNUQ184eDVfRm9ybWF0OkRjLFJHQkFfQVNUQ184eDZfRm9ybWF0Ok5jLFJHQkFfQVNUQ184eDhfRm9ybWF0OkZjLFJHQkFfQlBUQ19Gb3JtYXQ6SGEsUkdCQV9FVEMyX0VBQ19Gb3JtYXQ6Q2MsUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0OkVjLFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdDp3YyxSR0JBX1MzVENfRFhUMV9Gb3JtYXQ6a2EsUkdCQV9TM1RDX0RYVDNfRm9ybWF0OkdhLFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdDpWYSxSR0JfQlBUQ19TSUdORURfRm9ybWF0OkhjLFJHQl9CUFRDX1VOU0lHTkVEX0Zvcm1hdDpXYyxSR0JfRVRDMV9Gb3JtYXQ6QWMsUkdCX0VUQzJfRm9ybWF0OlRjLFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0OmJjLFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0OlNjLFJHQl9TM1RDX0RYVDFfRm9ybWF0OnphLFJHRm9ybWF0OmxkLFJHSW50ZWdlckZvcm1hdDp2YyxSYXdTaGFkZXJNYXRlcmlhbDp4bSxSYXk6VXIsUmF5Y2FzdGVyOmpiLFJlYzcwOVByaW1hcmllczpVcyxSZWN0QXJlYUxpZ2h0OmttLFJlZEZvcm1hdDpvZCxSZWRJbnRlZ2VyRm9ybWF0OnljLFJlaW5oYXJkVG9uZU1hcHBpbmc6S2YsUmVuZGVyVGFyZ2V0OlJkLFJlcGVhdFdyYXBwaW5nOkVzLFJlcGxhY2VTdGVuY2lsT3A6X18sUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb246VGYsUmluZ0dlb21ldHJ5OmVsLFNJR05FRF9SRURfR1JFRU5fUkdUQzJfRm9ybWF0OiRjLFNJR05FRF9SRURfUkdUQzFfRm9ybWF0OlhjLFNSR0JDb2xvclNwYWNlOlB0LFNSR0JUcmFuc2ZlcjpjdCxTY2VuZTpFcCxTaGFkZXJDaHVuazokZSxTaGFkZXJMaWI6Tm4sU2hhZGVyTWF0ZXJpYWw6SG4sU2hhZG93TWF0ZXJpYWw6X20sU2hhcGU6b2ksU2hhcGVHZW9tZXRyeTp0bCxTaGFwZVBhdGg6eDEsU2hhcGVVdGlsczp2bixTaG9ydFR5cGU6aWQsU2tlbGV0b246SW8sU2tlbGV0b25IZWxwZXI6czEsU2tpbm5lZE1lc2g6T3AsU291cmNlOldpLFNwaGVyZTpHdCxTcGhlcmVHZW9tZXRyeTpjYSxTcGhlcmljYWw6ZTEsU3BoZXJpY2FsSGFybW9uaWNzMzpHbSxTcGxpbmVDdXJ2ZTpRaCxTcG90TGlnaHQ6Tm0sU3BvdExpZ2h0SGVscGVyOnIxLFNwcml0ZTpScCxTcHJpdGVNYXRlcmlhbDpEaCxTcmNBbHBoYUZhY3RvcjpEYSxTcmNBbHBoYVNhdHVyYXRlRmFjdG9yOkZmLFNyY0NvbG9yRmFjdG9yOlBmLFN0YXRpY0NvcHlVc2FnZTpOXyxTdGF0aWNEcmF3VXNhZ2U6TnMsU3RhdGljUmVhZFVzYWdlOklfLFN0ZXJlb0NhbWVyYTpMYixTdHJlYW1Db3B5VXNhZ2U6T18sU3RyZWFtRHJhd1VzYWdlOkxfLFN0cmVhbVJlYWRVc2FnZTpEXyxTdHJpbmdLZXlmcmFtZVRyYWNrOnJyLFN1YnRyYWN0RXF1YXRpb246QWYsU3VidHJhY3RpdmVCbGVuZGluZzpoYyxUT1VDSDpTdCxUYW5nZW50U3BhY2VOb3JtYWxNYXA6d2ksVGV0cmFoZWRyb25HZW9tZXRyeTpubCxUZXh0dXJlOkV0LFRleHR1cmVMb2FkZXI6YmIsVG9ydXNHZW9tZXRyeTppbCxUb3J1c0tub3RHZW9tZXRyeTpybCxUcmlhbmdsZTpjbixUcmlhbmdsZUZhbkRyYXdNb2RlOm1fLFRyaWFuZ2xlU3RyaXBEcmF3TW9kZTpwXyxUcmlhbmdsZXNEcmF3TW9kZTpkXyxUdWJlR2VvbWV0cnk6c2wsVHdvUGFzc0RvdWJsZVNpZGU6bF8sVVZNYXBwaW5nOkZhLFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZTpfaCxVaW50MzJCdWZmZXJBdHRyaWJ1dGU6eGgsVWludDhCdWZmZXJBdHRyaWJ1dGU6eXgsVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlOnZ4LFVuaWZvcm06bXUsVW5pZm9ybXNHcm91cDpKYixVbmlmb3Jtc0xpYjpfZSxVbmlmb3Jtc1V0aWxzOlhkLFVuc2lnbmVkQnl0ZVR5cGU6UW4sVW5zaWduZWRJbnQyNDhUeXBlOk1pLFVuc2lnbmVkSW50VHlwZTpqbixVbnNpZ25lZFNob3J0NDQ0NFR5cGU6X2MsVW5zaWduZWRTaG9ydDU1NTFUeXBlOnhjLFVuc2lnbmVkU2hvcnRUeXBlOkJhLFZTTVNoYWRvd01hcDprbixWZWN0b3IyOnEsVmVjdG9yMzpQLFZlY3RvcjQ6bHQsVmVjdG9yS2V5ZnJhbWVUcmFjazpmYSxWaWRlb1RleHR1cmU6TlMsV2ViR0wxUmVuZGVyZXI6d3AsV2ViR0wzRFJlbmRlclRhcmdldDpzeCxXZWJHTEFycmF5UmVuZGVyVGFyZ2V0OnJ4LFdlYkdMQ29vcmRpbmF0ZVN5c3RlbTpQbixXZWJHTEN1YmVSZW5kZXJUYXJnZXQ6JGQsV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM6YXgsV2ViR0xSZW5kZXJUYXJnZXQ6TG4sV2ViR0xSZW5kZXJlcjpicCxXZWJHTFV0aWxzOk1wLFdlYkdQVUNvb3JkaW5hdGVTeXN0ZW06RXIsV2lyZWZyYW1lR2VvbWV0cnk6cG0sV3JhcEFyb3VuZEVuZGluZzpQcyxaZXJvQ3VydmF0dXJlRW5kaW5nOmtpLFplcm9GYWN0b3I6Q2YsWmVyb1Nsb3BlRW5kaW5nOkdpLFplcm9TdGVuY2lsT3A6Z18sX1NSR0JBRm9ybWF0OiRhLGNyZWF0ZUNhbnZhc0VsZW1lbnQ6RWQsc1JHQkVuY29kaW5nOmJpfSk7Y29uc3QgdXI9bmV3IE1hcCx2MT0ocj17fSk9Pih7Z2VuZXJhdGVUb3BVVihlLHQsbixpLHMpe2NvbnN0IGE9dFtuKjNdLG89dFtuKjMrMV0sbD10W2kqM10sYz10W2kqMysxXSxoPXRbcyozXSx1PXRbcyozKzFdO2xldCBmO2lmKHVyLmhhcyhlKSlmPXVyLmdldChlKTtlbHNle2xldCBnPXIuYm94MztpZighZyl7Zz1uZXcgRHQ7Y29uc3QgeD1lLnBhcmFtZXRlcnMuc2hhcGVzLmdldFBvaW50cygpLm1hcCh2PT5bdi54LHYueSwwXSkuZmxhdCgpO2cuc2V0RnJvbUFycmF5KHgpfWNvbnN0IG09Zy5nZXRTaXplKG5ldyBQKTtyLnNwbGl0JiYobS55Lz1yLnNwbGl0KSxmPXtib3g6ZyxzaXplOm19LHVyLnNldChlLGYpfWNvbnN0e2JveDpkLHNpemU6cH09ZixfPXIuc3BsaXQ/MS1yLnNwbGl0OjA7cmV0dXJuW25ldyBxKChhLWQubWluLngpL3AueCwoby1kLm1pbi55KS9wLnkrXyksbmV3IHEoKGwtZC5taW4ueCkvcC54LChjLWQubWluLnkpL3AueStfKSxuZXcgcSgoaC1kLm1pbi54KS9wLngsKHUtZC5taW4ueSkvcC55K18pXX0sZ2VuZXJhdGVTaWRlV2FsbFVWKGUsdCxuLGkscyxhKXtjb25zdCBvPXRbbiozXSxsPXRbbiozKzFdLGM9dFtuKjMrMl0saD10W2kqM10sdT10W2kqMysxXSxmPXRbaSozKzJdLGQ9dFtzKjNdLHA9dFtzKjMrMV0sXz10W3MqMysyXSxnPXRbYSozXSxtPXRbYSozKzFdLHk9dFthKjMrMl07bGV0IHg7aWYodXIuaGFzKHQpKXg9dXIuZ2V0KHQpO2Vsc2V7Y29uc3QgYj1uZXcgRHQ7Yi5zZXRGcm9tQXJyYXkodCk7Y29uc3QgQT1iLmdldFNpemUobmV3IFApO3Iuc3BsaXQmJihBLnovPTEtci5zcGxpdCkseD17Ym94OmIsc2l6ZTpBfSx1ci5zZXQodCx4KX1jb25zdHtib3g6dixzaXplOlN9PXg7cmV0dXJuIE1hdGguYWJzKGwtdSk8TWF0aC5hYnMoby1oKT9bbmV3IHEoKG8tdi5taW4ueCkvUy54LChjLXYubWluLnopL1MueiksbmV3IHEoKGgtdi5taW4ueCkvUy54LChmLXYubWluLnopL1MueiksbmV3IHEoKGQtdi5taW4ueCkvUy54LChfLXYubWluLnopL1MueiksbmV3IHEoKGctdi5taW4ueCkvUy54LCh5LXYubWluLnopL1MueildOltuZXcgcSgobC12Lm1pbi55KS9TLnksKGMtdi5taW4ueikvUy56KSxuZXcgcSgodS12Lm1pbi55KS9TLnksKGYtdi5taW4ueikvUy56KSxuZXcgcSgocC12Lm1pbi55KS9TLnksKF8tdi5taW4ueikvUy56KSxuZXcgcSgobS12Lm1pbi55KS9TLnksKHktdi5taW4ueikvUy56KV19fSksTTE9KCk9Pnt1ci5jbGVhcigpfTtjbGFzcyB5dSBleHRlbmRzIGtle2NvbnN0cnVjdG9yKGU9bmV3IG9pKFtuZXcgcSguNSwuNSksbmV3IHEoLS41LC41KSxuZXcgcSgtLjUsLS41KSxuZXcgcSguNSwtLjUpXSksdD17fSl7c3VwZXIoKSx0aGlzLnR5cGU9IkV4dHJ1ZGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6ZSxvcHRpb25zOnR9LGU9QXJyYXkuaXNBcnJheShlKT9lOltlXTtjb25zdCBuPXRoaXMsaT1bXSxzPVtdO2ZvcihsZXQgbz0wLGw9ZS5sZW5ndGg7bzxsO28rKyl7Y29uc3QgYz1lW29dO2EoYyl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgU2UoaSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgU2UocywyKSksdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO2Z1bmN0aW9uIGEobyl7dmFyIHVlLHJlLENlO2NvbnN0IGw9W10sYz10LmN1cnZlU2VnbWVudHMhPT12b2lkIDA/dC5jdXJ2ZVNlZ21lbnRzOjEyLGg9dC5zdGVwcyE9PXZvaWQgMD90LnN0ZXBzOjEsdT10LmRlcHRoIT09dm9pZCAwP3QuZGVwdGg6MTtsZXQgZj10LmJldmVsRW5hYmxlZCE9PXZvaWQgMD90LmJldmVsRW5hYmxlZDohMCxkPXQuYmV2ZWxUaGlja25lc3MhPT12b2lkIDA/dC5iZXZlbFRoaWNrbmVzczouMixwPXQuYmV2ZWxTaXplIT09dm9pZCAwP3QuYmV2ZWxTaXplOmQtLjEsXz10LmJldmVsT2Zmc2V0IT09dm9pZCAwP3QuYmV2ZWxPZmZzZXQ6MCxnPXQuYmV2ZWxTZWdtZW50cyE9PXZvaWQgMD90LmJldmVsU2VnbWVudHM6Mztjb25zdCBtPXQuZXh0cnVkZVBhdGgseT10LlVWR2VuZXJhdG9yIT09dm9pZCAwP3QuVVZHZW5lcmF0b3I6UzEseD0odWU9dC5oYXNUb3ApIT1udWxsP3VlOiEwLHY9KHJlPXQuaGFzQm90dG9tKSE9bnVsbD9yZTohMCxTPShDZT10Lmhhc1NpZGUpIT1udWxsP0NlOiEwO2xldCBiLEE9ITEsTCxNLHcsUjttJiYoYj1tLmdldFNwYWNlZFBvaW50cyhoKSxBPSEwLGY9ITEsTD1tLmNvbXB1dGVGcmVuZXRGcmFtZXMoaCwhMSksTT1uZXcgUCx3PW5ldyBQLFI9bmV3IFApLGZ8fChnPTAsZD0wLHA9MCxfPTApO2NvbnN0IE49by5leHRyYWN0UG9pbnRzKGMpO2xldCBCPU4uc2hhcGU7Y29uc3QgST1OLmhvbGVzO2lmKCF2bi5pc0Nsb2NrV2lzZShCKSl7Qj1CLnJldmVyc2UoKTtmb3IobGV0IFc9MCxKPUkubGVuZ3RoO1c8SjtXKyspe2NvbnN0IGllPUlbV107dm4uaXNDbG9ja1dpc2UoaWUpJiYoSVtXXT1pZS5yZXZlcnNlKCkpfX1jb25zdCB6PXZuLnRyaWFuZ3VsYXRlU2hhcGUoQixJKSxGPUI7Zm9yKGxldCBXPTAsSj1JLmxlbmd0aDtXPEo7VysrKXtjb25zdCBpZT1JW1ddO0I9Qi5jb25jYXQoaWUpfWZ1bmN0aW9uIFooVyxKLGllKXtyZXR1cm4gSnx8Y29uc29sZS5lcnJvcigiVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiB2ZWMgZG9lcyBub3QgZXhpc3QiKSxXLmNsb25lKCkuYWRkU2NhbGVkVmVjdG9yKEosaWUpfWNvbnN0IFY9Qi5sZW5ndGgsUT16Lmxlbmd0aDtmdW5jdGlvbiBuZShXLEosaWUpe2xldCBtZSxwZSxDO2NvbnN0IEU9Vy54LUoueCxrPVcueS1KLnksc2U9aWUueC1XLngsdGU9aWUueS1XLnksYWU9RSpFK2sqayxBZT1FKnRlLWsqc2U7aWYoTWF0aC5hYnMoQWUpPk51bWJlci5FUFNJTE9OKXtjb25zdCBvZT1NYXRoLnNxcnQoYWUpLHhlPU1hdGguc3FydChzZSpzZSt0ZSp0ZSksRGU9Si54LWsvb2UsdHQ9Si55K0Uvb2UsY2U9aWUueC10ZS94ZSxhdD1pZS55K3NlL3hlLFZlPSgoY2UtRGUpKnRlLShhdC10dCkqc2UpLyhFKnRlLWsqc2UpO21lPURlK0UqVmUtVy54LHBlPXR0K2sqVmUtVy55O2NvbnN0IE5lPW1lKm1lK3BlKnBlO2lmKE5lPD0yKXJldHVybiBuZXcgcShtZSxwZSk7Qz1NYXRoLnNxcnQoTmUvMil9ZWxzZXtsZXQgb2U9ITE7RT5OdW1iZXIuRVBTSUxPTj9zZT5OdW1iZXIuRVBTSUxPTiYmKG9lPSEwKTpFPC1OdW1iZXIuRVBTSUxPTj9zZTwtTnVtYmVyLkVQU0lMT04mJihvZT0hMCk6TWF0aC5zaWduKGspPT09TWF0aC5zaWduKHRlKSYmKG9lPSEwKSxvZT8obWU9LWsscGU9RSxDPU1hdGguc3FydChhZSkpOihtZT1FLHBlPWssQz1NYXRoLnNxcnQoYWUvMikpfXJldHVybiBuZXcgcShtZS9DLHBlL0MpfWNvbnN0IGZlPVtdO2ZvcihsZXQgVz0wLEo9Ri5sZW5ndGgsaWU9Si0xLG1lPVcrMTtXPEo7VysrLGllKyssbWUrKylpZT09PUomJihpZT0wKSxtZT09PUomJihtZT0wKSxmZVtXXT1uZShGW1ddLEZbaWVdLEZbbWVdKTtjb25zdCAkPVtdO2xldCBlZSxkZT1mZS5jb25jYXQoKTtmb3IobGV0IFc9MCxKPUkubGVuZ3RoO1c8SjtXKyspe2NvbnN0IGllPUlbV107ZWU9W107Zm9yKGxldCBtZT0wLHBlPWllLmxlbmd0aCxDPXBlLTEsRT1tZSsxO21lPHBlO21lKyssQysrLEUrKylDPT09cGUmJihDPTApLEU9PT1wZSYmKEU9MCksZWVbbWVdPW5lKGllW21lXSxpZVtDXSxpZVtFXSk7JC5wdXNoKGVlKSxkZT1kZS5jb25jYXQoZWUpfWZvcihsZXQgVz0wO1c8ZztXKyspe2NvbnN0IEo9Vy9nLGllPWQqTWF0aC5jb3MoSipNYXRoLlBJLzIpLG1lPXAqTWF0aC5zaW4oSipNYXRoLlBJLzIpK187Zm9yKGxldCBwZT0wLEM9Ri5sZW5ndGg7cGU8QztwZSsrKXtjb25zdCBFPVooRltwZV0sZmVbcGVdLG1lKTt3ZShFLngsRS55LC1pZSl9Zm9yKGxldCBwZT0wLEM9SS5sZW5ndGg7cGU8QztwZSsrKXtjb25zdCBFPUlbcGVdO2VlPSRbcGVdO2ZvcihsZXQgaz0wLHNlPUUubGVuZ3RoO2s8c2U7aysrKXtjb25zdCB0ZT1aKEVba10sZWVba10sbWUpO3dlKHRlLngsdGUueSwtaWUpfX19Y29uc3QgVGU9cCtfO2ZvcihsZXQgVz0wO1c8VjtXKyspe2NvbnN0IEo9Zj9aKEJbV10sZGVbV10sVGUpOkJbV107QT8ody5jb3B5KEwubm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoSi54KSxNLmNvcHkoTC5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKEoueSksUi5jb3B5KGJbMF0pLmFkZCh3KS5hZGQoTSksd2UoUi54LFIueSxSLnopKTp3ZShKLngsSi55LDApfWZvcihsZXQgVz0xO1c8PWg7VysrKWZvcihsZXQgSj0wO0o8VjtKKyspe2NvbnN0IGllPWY/WihCW0pdLGRlW0pdLFRlKTpCW0pdO0E/KHcuY29weShMLm5vcm1hbHNbV10pLm11bHRpcGx5U2NhbGFyKGllLngpLE0uY29weShMLmJpbm9ybWFsc1tXXSkubXVsdGlwbHlTY2FsYXIoaWUueSksUi5jb3B5KGJbV10pLmFkZCh3KS5hZGQoTSksd2UoUi54LFIueSxSLnopKTp3ZShpZS54LGllLnksdS9oKlcpfWZvcihsZXQgVz1nLTE7Vz49MDtXLS0pe2NvbnN0IEo9Vy9nLGllPWQqTWF0aC5jb3MoSipNYXRoLlBJLzIpLG1lPXAqTWF0aC5zaW4oSipNYXRoLlBJLzIpK187Zm9yKGxldCBwZT0wLEM9Ri5sZW5ndGg7cGU8QztwZSsrKXtjb25zdCBFPVooRltwZV0sZmVbcGVdLG1lKTt3ZShFLngsRS55LHUraWUpfWZvcihsZXQgcGU9MCxDPUkubGVuZ3RoO3BlPEM7cGUrKyl7Y29uc3QgRT1JW3BlXTtlZT0kW3BlXTtmb3IobGV0IGs9MCxzZT1FLmxlbmd0aDtrPHNlO2srKyl7Y29uc3QgdGU9WihFW2tdLGVlW2tdLG1lKTtBP3dlKHRlLngsdGUueStiW2gtMV0ueSxiW2gtMV0ueCtpZSk6d2UodGUueCx0ZS55LHUraWUpfX19YmUoKSxTJiZPZSgpO2Z1bmN0aW9uIGJlKCl7Y29uc3QgVz1pLmxlbmd0aC8zO2lmKGYpe2xldCBKPTAsaWU9VipKO2lmKHYpZm9yKGxldCBtZT0wO21lPFE7bWUrKyl7Y29uc3QgcGU9elttZV07UGUocGVbMl0raWUscGVbMV0raWUscGVbMF0raWUpfWlmKEo9aCtnKjIsaWU9VipKLHgpZm9yKGxldCBtZT0wO21lPFE7bWUrKyl7Y29uc3QgcGU9elttZV07UGUocGVbMF0raWUscGVbMV0raWUscGVbMl0raWUpfX1lbHNle2lmKHYpZm9yKGxldCBKPTA7SjxRO0orKyl7Y29uc3QgaWU9eltKXTtQZShpZVsyXSxpZVsxXSxpZVswXSl9aWYoeClmb3IobGV0IEo9MDtKPFE7SisrKXtjb25zdCBpZT16W0pdO1BlKGllWzBdK1YqaCxpZVsxXStWKmgsaWVbMl0rVipoKX19bi5hZGRHcm91cChXLGkubGVuZ3RoLzMtVywwKX1mdW5jdGlvbiBPZSgpe2NvbnN0IFc9aS5sZW5ndGgvMztsZXQgSj0wO0JlKEYsSiksSis9Ri5sZW5ndGg7Zm9yKGxldCBpZT0wLG1lPUkubGVuZ3RoO2llPG1lO2llKyspe2NvbnN0IHBlPUlbaWVdO0JlKHBlLEopLEorPXBlLmxlbmd0aH1uLmFkZEdyb3VwKFcsaS5sZW5ndGgvMy1XLDEpfWZ1bmN0aW9uIEJlKFcsSil7bGV0IGllPVcubGVuZ3RoO2Zvcig7LS1pZT49MDspe2NvbnN0IG1lPWllO2xldCBwZT1pZS0xO3BlPDAmJihwZT1XLmxlbmd0aC0xKTtmb3IobGV0IEM9MCxFPWgrZyoyO0M8RTtDKyspe2NvbnN0IGs9VipDLHNlPVYqKEMrMSksdGU9SittZStrLGFlPUorcGUrayxBZT1KK3BlK3NlLG9lPUorbWUrc2U7RCh0ZSxhZSxBZSxvZSl9fX1mdW5jdGlvbiB3ZShXLEosaWUpe2wucHVzaChXKSxsLnB1c2goSiksbC5wdXNoKGllKX1mdW5jdGlvbiBQZShXLEosaWUpe2xlKFcpLGxlKEopLGxlKGllKTtjb25zdCBtZT1pLmxlbmd0aC8zLHBlPXkuZ2VuZXJhdGVUb3BVVihuLGksbWUtMyxtZS0yLG1lLTEpO0socGVbMF0pLEsocGVbMV0pLEsocGVbMl0pfWZ1bmN0aW9uIEQoVyxKLGllLG1lKXtsZShXKSxsZShKKSxsZShtZSksbGUoSiksbGUoaWUpLGxlKG1lKTtjb25zdCBwZT1pLmxlbmd0aC8zLEM9eS5nZW5lcmF0ZVNpZGVXYWxsVVYobixpLHBlLTYscGUtMyxwZS0yLHBlLTEpO0soQ1swXSksSyhDWzFdKSxLKENbM10pLEsoQ1sxXSksSyhDWzJdKSxLKENbM10pfWZ1bmN0aW9uIGxlKFcpe2kucHVzaChsW1cqMyswXSksaS5wdXNoKGxbVyozKzFdKSxpLnB1c2gobFtXKjMrMl0pfWZ1bmN0aW9uIEsoVyl7cy5wdXNoKFcueCkscy5wdXNoKFcueSl9fX1jb3B5KGUpe3JldHVybiBzdXBlci5jb3B5KGUpLHRoaXMucGFyYW1ldGVycz1PYmplY3QuYXNzaWduKHt9LGUucGFyYW1ldGVycyksdGhpc310b0pTT04oKXtjb25zdCBlPXN1cGVyLnRvSlNPTigpLHQ9dGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxuPXRoaXMucGFyYW1ldGVycy5vcHRpb25zO3JldHVybiBiMSh0LG4sZSl9c3RhdGljIGZyb21KU09OKGUsdCl7Y29uc3Qgbj1bXTtmb3IobGV0IHM9MCxhPWUuc2hhcGVzLmxlbmd0aDtzPGE7cysrKXtjb25zdCBvPXRbZS5zaGFwZXNbc11dO24ucHVzaChvKX1jb25zdCBpPWUub3B0aW9ucy5leHRydWRlUGF0aDtyZXR1cm4gY29uc29sZS5sb2coaS50eXBlKSxpIT09dm9pZCAwJiYoZS5vcHRpb25zLmV4dHJ1ZGVQYXRoPW5ldyB5MVtgJHtpLnR5cGV9Q3VydmVgXSgpLmZyb21KU09OKGkpKSxuZXcgeXUobixlLm9wdGlvbnMpfX1jb25zdCBTMT17Z2VuZXJhdGVUb3BVVjpmdW5jdGlvbihyLGUsdCxuLGkpe2NvbnN0IHM9ZVt0KjNdLGE9ZVt0KjMrMV0sbz1lW24qM10sbD1lW24qMysxXSxjPWVbaSozXSxoPWVbaSozKzFdO3JldHVybltuZXcgcShzLGEpLG5ldyBxKG8sbCksbmV3IHEoYyxoKV19LGdlbmVyYXRlU2lkZVdhbGxVVjpmdW5jdGlvbihyLGUsdCxuLGkscyl7Y29uc3QgYT1lW3QqM10sbz1lW3QqMysxXSxsPWVbdCozKzJdLGM9ZVtuKjNdLGg9ZVtuKjMrMV0sdT1lW24qMysyXSxmPWVbaSozXSxkPWVbaSozKzFdLHA9ZVtpKjMrMl0sXz1lW3MqM10sZz1lW3MqMysxXSxtPWVbcyozKzJdO3JldHVybiBNYXRoLmFicyhvLWgpPE1hdGguYWJzKGEtYyk/W25ldyBxKGEsMS1sKSxuZXcgcShjLDEtdSksbmV3IHEoZiwxLXApLG5ldyBxKF8sMS1tKV06W25ldyBxKG8sMS1sKSxuZXcgcShoLDEtdSksbmV3IHEoZCwxLXApLG5ldyBxKGcsMS1tKV19fTtmdW5jdGlvbiBiMShyLGUsdCl7aWYodC5zaGFwZXM9W10sQXJyYXkuaXNBcnJheShyKSlmb3IobGV0IG49MCxpPXIubGVuZ3RoO248aTtuKyspe2NvbnN0IHM9cltuXTt0LnNoYXBlcy5wdXNoKHMudXVpZCl9ZWxzZSB0LnNoYXBlcy5wdXNoKHIudXVpZCk7cmV0dXJuIHQub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LGUpLGUuZXh0cnVkZVBhdGghPT12b2lkIDAmJih0Lm9wdGlvbnMuZXh0cnVkZVBhdGg9ZS5leHRydWRlUGF0aC50b0pTT04oKSksdH12YXIgdzE9cj0+e2NvbnN0e3NwbGl0OmUsZGVwdGg6dCxwb2ludHM6bixib3gzOmksaGFzVG9wOnMsaGFzQm90dG9tOmEsaGFzU2lkZTpvfT1yLGw9bmV3IHl1KG5ldyBvaShuKSx7ZGVwdGg6dCxiZXZlbEVuYWJsZWQ6ITEsVVZHZW5lcmF0b3I6djEoe3NwbGl0OmUsYm94MzppfSksaGFzVG9wOnMsaGFzQm90dG9tOmEsaGFzU2lkZTpvfSk7cmV0dXJuIE0xKCksbH07ZnVuY3Rpb24gRTEocixlLHQ9MCl7Y29uc3Qgbj0oOTAtZSkqTWF0aC5QSS8xODAsaT0oOTAtcikqTWF0aC5QSS8xODA7cmV0dXJuW3QqTWF0aC5zaW4obikqTWF0aC5jb3MoaSksdCpNYXRoLmNvcyhuKSx0Kk1hdGguc2luKG4pKk1hdGguc2luKGkpXX12YXIgQTE9KHIsZSx0KT0+bmV3IFByb21pc2UoKG4saSk9Pnt2YXIgcz1sPT57dHJ5e28odC5uZXh0KGwpKX1jYXRjaChjKXtpKGMpfX0sYT1sPT57dHJ5e28odC50aHJvdyhsKSl9Y2F0Y2goYyl7aShjKX19LG89bD0+bC5kb25lP24obC52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGwudmFsdWUpLnRoZW4ocyxhKTtvKCh0PXQuYXBwbHkocixlKSkubmV4dCgpKX0pO2Z1bmN0aW9uIHZ1KHIpe3RoaXMubWVzc2FnZT1yfHwicHJvbWlzZSBjYW5jZWxsZWQiLHRoaXMuc3RhY2s9bmV3IEVycm9yKCkuc3RhY2t9dnUucHJvdG90eXBlPW5ldyBFcnJvcix2dS5wcm90b3R5cGUuY29uc3RydWN0b3I9RXJyb3IsdnUucHJvdG90eXBlLm5hbWU9IkNhbmNlbGxhdGlvbkVycm9yIjtmdW5jdGlvbiBNdShyKXt0aGlzLm1lc3NhZ2U9cnx8InRpbWVvdXQgZXhjZWVkZWQiLHRoaXMuc3RhY2s9bmV3IEVycm9yKCkuc3RhY2t9TXUucHJvdG90eXBlPW5ldyBFcnJvcixNdS5wcm90b3R5cGUuY29uc3RydWN0b3I9RXJyb3IsTXUucHJvdG90eXBlLm5hbWU9IlRpbWVvdXRFcnJvciI7ZnVuY3Rpb24gZmcocil7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHIpLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpyW3RdLGVudW1lcmFibGU6ITB9KX0se30pfWxldCBTdT1udWxsO2NvbnN0IFQxPXI9Pntjb25zdCBlPXtydW4odCxuKXtjb25zdCBpPW5ldyBGdW5jdGlvbigicmV0dXJuICgiK3QrIikuYXBwbHkobnVsbCwgYXJndW1lbnRzKTsiKTtyZXR1cm4gaS5hcHBseShpLG4pfSxtZXRob2RzKCl7cmV0dXJuIE9iamVjdC5rZXlzKGUpfX07YWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdD0+QTEodm9pZCAwLFt0XSxmdW5jdGlvbiooe2RhdGE6bn0pe3RyeXtjb25zdCBpPWVbbi5tZXRob2RdO2lmKGkpe1N1PW4uaWQ7dHJ5e2NvbnN0IHM9eWllbGQgaS5hcHBseShpLG4ucGFyYW1zKTtzLnRyYW5zZmVyJiZzLm1lc3NhZ2U/cG9zdE1lc3NhZ2Uoe2lkOm4uaWQscmVzdWx0OnMubWVzc2FnZSxlcnJvcjpudWxsfSxzLnRyYW5zZmVyKTpwb3N0TWVzc2FnZSh7aWQ6bi5pZCxyZXN1bHQ6cyxlcnJvcjpudWxsfSksU3U9bnVsbH1jYXRjaChzKXtwb3N0TWVzc2FnZSh7aWQ6bi5pZCxyZXN1bHQ6bnVsbCxlcnJvcjpmZyhzKX0pLFN1PW51bGx9fWVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1ldGhvZCAiJytuLm1ldGhvZCsnIicpfWNhdGNoKGkpe3Bvc3RNZXNzYWdlKHtpZDpuLmlkLHJlc3VsdDpudWxsLGVycm9yOmZnKGkpfSl9fSkpLE9iamVjdC5rZXlzKHIpLmZvckVhY2godD0+e2VbdF09clt0XX0pLHBvc3RNZXNzYWdlKCJyZWFkeSIpfTtmdW5jdGlvbiBwbChyLGUpe3JldHVybiByPT1udWxsfHxlPT1udWxsP05hTjpyPGU/LTE6cj5lPzE6cj49ZT8wOk5hTn1mdW5jdGlvbiBDMShyLGUpe3JldHVybiByPT1udWxsfHxlPT1udWxsP05hTjplPHI/LTE6ZT5yPzE6ZT49cj8wOk5hTn1mdW5jdGlvbiBkZyhyKXtsZXQgZSx0LG47ci5sZW5ndGghPT0yPyhlPXBsLHQ9KG8sbCk9PnBsKHIobyksbCksbj0obyxsKT0+cihvKS1sKTooZT1yPT09cGx8fHI9PT1DMT9yOlIxLHQ9cixuPXIpO2Z1bmN0aW9uIGkobyxsLGM9MCxoPW8ubGVuZ3RoKXtpZihjPGgpe2lmKGUobCxsKSE9PTApcmV0dXJuIGg7ZG97Y29uc3QgdT1jK2g+Pj4xO3Qob1t1XSxsKTwwP2M9dSsxOmg9dX13aGlsZShjPGgpfXJldHVybiBjfWZ1bmN0aW9uIHMobyxsLGM9MCxoPW8ubGVuZ3RoKXtpZihjPGgpe2lmKGUobCxsKSE9PTApcmV0dXJuIGg7ZG97Y29uc3QgdT1jK2g+Pj4xO3Qob1t1XSxsKTw9MD9jPXUrMTpoPXV9d2hpbGUoYzxoKX1yZXR1cm4gY31mdW5jdGlvbiBhKG8sbCxjPTAsaD1vLmxlbmd0aCl7Y29uc3QgdT1pKG8sbCxjLGgtMSk7cmV0dXJuIHU+YyYmbihvW3UtMV0sbCk+LW4ob1t1XSxsKT91LTE6dX1yZXR1cm57bGVmdDppLGNlbnRlcjphLHJpZ2h0OnN9fWZ1bmN0aW9uIFIxKCl7cmV0dXJuIDB9ZnVuY3Rpb24gUDEocil7cmV0dXJuIHI9PT1udWxsP05hTjorcn1jb25zdCBMMT1kZyhwbCkucmlnaHQ7ZGcoUDEpLmNlbnRlcjt2YXIgSTE9TDE7ZnVuY3Rpb24gbWwocixlKXtsZXQgdCxuO2lmKGU9PT12b2lkIDApZm9yKGNvbnN0IGkgb2YgcilpIT1udWxsJiYodD09PXZvaWQgMD9pPj1pJiYodD1uPWkpOih0PmkmJih0PWkpLG48aSYmKG49aSkpKTtlbHNle2xldCBpPS0xO2ZvcihsZXQgcyBvZiByKShzPWUocywrK2kscikpIT1udWxsJiYodD09PXZvaWQgMD9zPj1zJiYodD1uPXMpOih0PnMmJih0PXMpLG48cyYmKG49cykpKX1yZXR1cm5bdCxuXX1jbGFzcyBoaXtjb25zdHJ1Y3Rvcigpe3RoaXMuX3BhcnRpYWxzPW5ldyBGbG9hdDY0QXJyYXkoMzIpLHRoaXMuX249MH1hZGQoZSl7Y29uc3QgdD10aGlzLl9wYXJ0aWFscztsZXQgbj0wO2ZvcihsZXQgaT0wO2k8dGhpcy5fbiYmaTwzMjtpKyspe2NvbnN0IHM9dFtpXSxhPWUrcyxvPU1hdGguYWJzKGUpPE1hdGguYWJzKHMpP2UtKGEtcyk6cy0oYS1lKTtvJiYodFtuKytdPW8pLGU9YX1yZXR1cm4gdFtuXT1lLHRoaXMuX249bisxLHRoaXN9dmFsdWVPZigpe2NvbnN0IGU9dGhpcy5fcGFydGlhbHM7bGV0IHQ9dGhpcy5fbixuLGkscyxhPTA7aWYodD4wKXtmb3IoYT1lWy0tdF07dD4wJiYobj1hLGk9ZVstLXRdLGE9bitpLHM9aS0oYS1uKSwhcyk7KTt0PjAmJihzPDAmJmVbdC0xXTwwfHxzPjAmJmVbdC0xXT4wKSYmKGk9cyoyLG49YStpLGk9PW4tYSYmKGE9bikpfXJldHVybiBhfX1jb25zdCBVMT1NYXRoLnNxcnQoNTApLEQxPU1hdGguc3FydCgxMCksTjE9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIGdsKHIsZSx0KXtjb25zdCBuPShlLXIpL01hdGgubWF4KDAsdCksaT1NYXRoLmZsb29yKE1hdGgubG9nMTAobikpLHM9bi9NYXRoLnBvdygxMCxpKSxhPXM+PVUxPzEwOnM+PUQxPzU6cz49TjE/MjoxO2xldCBvLGwsYztyZXR1cm4gaTwwPyhjPU1hdGgucG93KDEwLC1pKS9hLG89TWF0aC5yb3VuZChyKmMpLGw9TWF0aC5yb3VuZChlKmMpLG8vYzxyJiYrK28sbC9jPmUmJi0tbCxjPS1jKTooYz1NYXRoLnBvdygxMCxpKSphLG89TWF0aC5yb3VuZChyL2MpLGw9TWF0aC5yb3VuZChlL2MpLG8qYzxyJiYrK28sbCpjPmUmJi0tbCksbDxvJiYuNTw9dCYmdDwyP2dsKHIsZSx0KjIpOltvLGwsY119ZnVuY3Rpb24gRjEocixlLHQpe2lmKGU9K2Uscj0rcix0PSt0LCEodD4wKSlyZXR1cm5bXTtpZihyPT09ZSlyZXR1cm5bcl07Y29uc3Qgbj1lPHIsW2kscyxhXT1uP2dsKGUscix0KTpnbChyLGUsdCk7aWYoIShzPj1pKSlyZXR1cm5bXTtjb25zdCBvPXMtaSsxLGw9bmV3IEFycmF5KG8pO2lmKG4paWYoYTwwKWZvcihsZXQgYz0wO2M8bzsrK2MpbFtjXT0ocy1jKS8tYTtlbHNlIGZvcihsZXQgYz0wO2M8bzsrK2MpbFtjXT0ocy1jKSphO2Vsc2UgaWYoYTwwKWZvcihsZXQgYz0wO2M8bzsrK2MpbFtjXT0oaStjKS8tYTtlbHNlIGZvcihsZXQgYz0wO2M8bzsrK2MpbFtjXT0oaStjKSphO3JldHVybiBsfWZ1bmN0aW9uIGJ1KHIsZSx0KXtyZXR1cm4gZT0rZSxyPStyLHQ9K3QsZ2wocixlLHQpWzJdfWZ1bmN0aW9uIE8xKHIsZSx0KXtlPStlLHI9K3IsdD0rdDtjb25zdCBuPWU8cixpPW4/YnUoZSxyLHQpOmJ1KHIsZSx0KTtyZXR1cm4obj8tMToxKSooaTwwPzEvLWk6aSl9ZnVuY3Rpb24gQjEocixlKXtsZXQgdD0wLG49MDtpZihlPT09dm9pZCAwKWZvcihsZXQgaSBvZiByKWkhPW51bGwmJihpPStpKT49aSYmKCsrdCxuKz1pKTtlbHNle2xldCBpPS0xO2ZvcihsZXQgcyBvZiByKShzPWUocywrK2kscikpIT1udWxsJiYocz0rcyk+PXMmJigrK3Qsbis9cyl9aWYodClyZXR1cm4gbi90fWZ1bmN0aW9uKnoxKHIpe2Zvcihjb25zdCBlIG9mIHIpeWllbGQqZX1mdW5jdGlvbiBnYShyKXtyZXR1cm4gQXJyYXkuZnJvbSh6MShyKSl9dmFyIHN0PTFlLTYsX2w9MWUtMTIsZXQ9TWF0aC5QSSxmbj1ldC8yLHhsPWV0LzQsZG49ZXQqMix5dD0xODAvZXQsR2U9ZXQvMTgwLGh0PU1hdGguYWJzLHd1PU1hdGguYXRhbixBbj1NYXRoLmF0YW4yLFdlPU1hdGguY29zLGsxPU1hdGguZXhwLEV1PU1hdGguaHlwb3QsRzE9TWF0aC5sb2csVWU9TWF0aC5zaW4sVjE9TWF0aC5zaWdufHxmdW5jdGlvbihyKXtyZXR1cm4gcj4wPzE6cjwwPy0xOjB9LHVpPU1hdGguc3FydCxIMT1NYXRoLnRhbjtmdW5jdGlvbiBXMShyKXtyZXR1cm4gcj4xPzA6cjwtMT9ldDpNYXRoLmFjb3Mocil9ZnVuY3Rpb24gZmkocil7cmV0dXJuIHI+MT9mbjpyPC0xPy1mbjpNYXRoLmFzaW4ocil9ZnVuY3Rpb24gcGcocil7cmV0dXJuKHI9VWUoci8yKSkqcn1mdW5jdGlvbiBYdCgpe31mdW5jdGlvbiB5bChyLGUpe3ImJmdnLmhhc093blByb3BlcnR5KHIudHlwZSkmJmdnW3IudHlwZV0ocixlKX12YXIgbWc9e0ZlYXR1cmU6ZnVuY3Rpb24ocixlKXt5bChyLmdlb21ldHJ5LGUpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihyLGUpe2Zvcih2YXIgdD1yLmZlYXR1cmVzLG49LTEsaT10Lmxlbmd0aDsrK248aTspeWwodFtuXS5nZW9tZXRyeSxlKX19LGdnPXtTcGhlcmU6ZnVuY3Rpb24ocixlKXtlLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbihyLGUpe3I9ci5jb29yZGluYXRlcyxlLnBvaW50KHJbMF0sclsxXSxyWzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbihyLGUpe2Zvcih2YXIgdD1yLmNvb3JkaW5hdGVzLG49LTEsaT10Lmxlbmd0aDsrK248aTspcj10W25dLGUucG9pbnQoclswXSxyWzFdLHJbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHIsZSl7QXUoci5jb29yZGluYXRlcyxlLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24ocixlKXtmb3IodmFyIHQ9ci5jb29yZGluYXRlcyxuPS0xLGk9dC5sZW5ndGg7KytuPGk7KUF1KHRbbl0sZSwwKX0sUG9seWdvbjpmdW5jdGlvbihyLGUpe19nKHIuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihyLGUpe2Zvcih2YXIgdD1yLmNvb3JkaW5hdGVzLG49LTEsaT10Lmxlbmd0aDsrK248aTspX2codFtuXSxlKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHIsZSl7Zm9yKHZhciB0PXIuZ2VvbWV0cmllcyxuPS0xLGk9dC5sZW5ndGg7KytuPGk7KXlsKHRbbl0sZSl9fTtmdW5jdGlvbiBBdShyLGUsdCl7dmFyIG49LTEsaT1yLmxlbmd0aC10LHM7Zm9yKGUubGluZVN0YXJ0KCk7KytuPGk7KXM9cltuXSxlLnBvaW50KHNbMF0sc1sxXSxzWzJdKTtlLmxpbmVFbmQoKX1mdW5jdGlvbiBfZyhyLGUpe3ZhciB0PS0xLG49ci5sZW5ndGg7Zm9yKGUucG9seWdvblN0YXJ0KCk7Kyt0PG47KUF1KHJbdF0sZSwxKTtlLnBvbHlnb25FbmQoKX1mdW5jdGlvbiB2bChyLGUpe3ImJm1nLmhhc093blByb3BlcnR5KHIudHlwZSk/bWdbci50eXBlXShyLGUpOnlsKHIsZSl9dmFyIE1sPW5ldyBoaSx4Zz1uZXcgaGkseWcsdmcsVHUsQ3UsUnUsZGk9e3BvaW50Olh0LGxpbmVTdGFydDpYdCxsaW5lRW5kOlh0LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe01sPW5ldyBoaSxkaS5saW5lU3RhcnQ9WDEsZGkubGluZUVuZD1xMX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciByPStNbDt4Zy5hZGQocjwwP2RuK3I6ciksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9WHR9LHNwaGVyZTpmdW5jdGlvbigpe3hnLmFkZChkbil9fTtmdW5jdGlvbiBYMSgpe2RpLnBvaW50PSQxfWZ1bmN0aW9uIHExKCl7TWcoeWcsdmcpfWZ1bmN0aW9uICQxKHIsZSl7ZGkucG9pbnQ9TWcseWc9cix2Zz1lLHIqPUdlLGUqPUdlLFR1PXIsQ3U9V2UoZT1lLzIreGwpLFJ1PVVlKGUpfWZ1bmN0aW9uIE1nKHIsZSl7cio9R2UsZSo9R2UsZT1lLzIreGw7dmFyIHQ9ci1UdSxuPXQ+PTA/MTotMSxpPW4qdCxzPVdlKGUpLGE9VWUoZSksbz1SdSphLGw9Q3UqcytvKldlKGkpLGM9bypuKlVlKGkpO01sLmFkZChBbihjLGwpKSxUdT1yLEN1PXMsUnU9YX1mdW5jdGlvbiBTbChyKXtyZXR1cm5bQW4oclsxXSxyWzBdKSxmaShyWzJdKV19ZnVuY3Rpb24gZnIocil7dmFyIGU9clswXSx0PXJbMV0sbj1XZSh0KTtyZXR1cm5bbipXZShlKSxuKlVlKGUpLFVlKHQpXX1mdW5jdGlvbiBibChyLGUpe3JldHVybiByWzBdKmVbMF0rclsxXSplWzFdK3JbMl0qZVsyXX1mdW5jdGlvbiBzcyhyLGUpe3JldHVybltyWzFdKmVbMl0tclsyXSplWzFdLHJbMl0qZVswXS1yWzBdKmVbMl0sclswXSplWzFdLXJbMV0qZVswXV19ZnVuY3Rpb24gUHUocixlKXtyWzBdKz1lWzBdLHJbMV0rPWVbMV0sclsyXSs9ZVsyXX1mdW5jdGlvbiB3bChyLGUpe3JldHVybltyWzBdKmUsclsxXSplLHJbMl0qZV19ZnVuY3Rpb24gRWwocil7dmFyIGU9dWkoclswXSpyWzBdK3JbMV0qclsxXStyWzJdKnJbMl0pO3JbMF0vPWUsclsxXS89ZSxyWzJdLz1lfXZhciBwdCxwbix2dCxNbixkcixTZyxiZyxhcyxfYSxPaSxwaSxtaT17cG9pbnQ6THUsbGluZVN0YXJ0OkVnLGxpbmVFbmQ6QWcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bWkucG9pbnQ9VGcsbWkubGluZVN0YXJ0PVkxLG1pLmxpbmVFbmQ9WjEsX2E9bmV3IGhpLGRpLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7ZGkucG9seWdvbkVuZCgpLG1pLnBvaW50PUx1LG1pLmxpbmVTdGFydD1FZyxtaS5saW5lRW5kPUFnLE1sPDA/KHB0PS0odnQ9MTgwKSxwbj0tKE1uPTkwKSk6X2E+c3Q/TW49OTA6X2E8LXN0JiYocG49LTkwKSxwaVswXT1wdCxwaVsxXT12dH0sc3BoZXJlOmZ1bmN0aW9uKCl7cHQ9LSh2dD0xODApLHBuPS0oTW49OTApfX07ZnVuY3Rpb24gTHUocixlKXtPaS5wdXNoKHBpPVtwdD1yLHZ0PXJdKSxlPHBuJiYocG49ZSksZT5NbiYmKE1uPWUpfWZ1bmN0aW9uIHdnKHIsZSl7dmFyIHQ9ZnIoW3IqR2UsZSpHZV0pO2lmKGFzKXt2YXIgbj1zcyhhcyx0KSxpPVtuWzFdLC1uWzBdLDBdLHM9c3MoaSxuKTtFbChzKSxzPVNsKHMpO3ZhciBhPXItZHIsbz1hPjA/MTotMSxsPXNbMF0qeXQqbyxjLGg9aHQoYSk+MTgwO2heKG8qZHI8bCYmbDxvKnIpPyhjPXNbMV0qeXQsYz5NbiYmKE1uPWMpKToobD0obCszNjApJTM2MC0xODAsaF4obypkcjxsJiZsPG8qcik/KGM9LXNbMV0qeXQsYzxwbiYmKHBuPWMpKTooZTxwbiYmKHBuPWUpLGU+TW4mJihNbj1lKSkpLGg/cjxkcj9TbihwdCxyKT5TbihwdCx2dCkmJih2dD1yKTpTbihyLHZ0KT5TbihwdCx2dCkmJihwdD1yKTp2dD49cHQ/KHI8cHQmJihwdD1yKSxyPnZ0JiYodnQ9cikpOnI+ZHI/U24ocHQscik+U24ocHQsdnQpJiYodnQ9cik6U24ocix2dCk+U24ocHQsdnQpJiYocHQ9cil9ZWxzZSBPaS5wdXNoKHBpPVtwdD1yLHZ0PXJdKTtlPHBuJiYocG49ZSksZT5NbiYmKE1uPWUpLGFzPXQsZHI9cn1mdW5jdGlvbiBFZygpe21pLnBvaW50PXdnfWZ1bmN0aW9uIEFnKCl7cGlbMF09cHQscGlbMV09dnQsbWkucG9pbnQ9THUsYXM9bnVsbH1mdW5jdGlvbiBUZyhyLGUpe2lmKGFzKXt2YXIgdD1yLWRyO19hLmFkZChodCh0KT4xODA/dCsodD4wPzM2MDotMzYwKTp0KX1lbHNlIFNnPXIsYmc9ZTtkaS5wb2ludChyLGUpLHdnKHIsZSl9ZnVuY3Rpb24gWTEoKXtkaS5saW5lU3RhcnQoKX1mdW5jdGlvbiBaMSgpe1RnKFNnLGJnKSxkaS5saW5lRW5kKCksaHQoX2EpPnN0JiYocHQ9LSh2dD0xODApKSxwaVswXT1wdCxwaVsxXT12dCxhcz1udWxsfWZ1bmN0aW9uIFNuKHIsZSl7cmV0dXJuKGUtPXIpPDA/ZSszNjA6ZX1mdW5jdGlvbiBKMShyLGUpe3JldHVybiByWzBdLWVbMF19ZnVuY3Rpb24gQ2cocixlKXtyZXR1cm4gclswXTw9clsxXT9yWzBdPD1lJiZlPD1yWzFdOmU8clswXXx8clsxXTxlfWZ1bmN0aW9uIFJnKHIpe3ZhciBlLHQsbixpLHMsYSxvO2lmKE1uPXZ0PS0ocHQ9cG49MS8wKSxPaT1bXSx2bChyLG1pKSx0PU9pLmxlbmd0aCl7Zm9yKE9pLnNvcnQoSjEpLGU9MSxuPU9pWzBdLHM9W25dO2U8dDsrK2UpaT1PaVtlXSxDZyhuLGlbMF0pfHxDZyhuLGlbMV0pPyhTbihuWzBdLGlbMV0pPlNuKG5bMF0sblsxXSkmJihuWzFdPWlbMV0pLFNuKGlbMF0sblsxXSk+U24oblswXSxuWzFdKSYmKG5bMF09aVswXSkpOnMucHVzaChuPWkpO2ZvcihhPS0xLzAsdD1zLmxlbmd0aC0xLGU9MCxuPXNbdF07ZTw9dDtuPWksKytlKWk9c1tlXSwobz1TbihuWzFdLGlbMF0pKT5hJiYoYT1vLHB0PWlbMF0sdnQ9blsxXSl9cmV0dXJuIE9pPXBpPW51bGwscHQ9PT0xLzB8fHBuPT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW3B0LHBuXSxbdnQsTW5dXX12YXIgeGEsQWwsVGwsQ2wsUmwsUGwsTGwsSWwsSXUsVXUsRHUsUGcsTGcsUXQsanQsZW4sQm49e3NwaGVyZTpYdCxwb2ludDpOdSxsaW5lU3RhcnQ6SWcsbGluZUVuZDpVZyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtCbi5saW5lU3RhcnQ9ajEsQm4ubGluZUVuZD1ld30scG9seWdvbkVuZDpmdW5jdGlvbigpe0JuLmxpbmVTdGFydD1JZyxCbi5saW5lRW5kPVVnfX07ZnVuY3Rpb24gTnUocixlKXtyKj1HZSxlKj1HZTt2YXIgdD1XZShlKTt5YSh0KldlKHIpLHQqVWUociksVWUoZSkpfWZ1bmN0aW9uIHlhKHIsZSx0KXsrK3hhLFRsKz0oci1UbCkveGEsQ2wrPShlLUNsKS94YSxSbCs9KHQtUmwpL3hhfWZ1bmN0aW9uIElnKCl7Qm4ucG9pbnQ9SzF9ZnVuY3Rpb24gSzEocixlKXtyKj1HZSxlKj1HZTt2YXIgdD1XZShlKTtRdD10KldlKHIpLGp0PXQqVWUociksZW49VWUoZSksQm4ucG9pbnQ9UTEseWEoUXQsanQsZW4pfWZ1bmN0aW9uIFExKHIsZSl7cio9R2UsZSo9R2U7dmFyIHQ9V2UoZSksbj10KldlKHIpLGk9dCpVZShyKSxzPVVlKGUpLGE9QW4odWkoKGE9anQqcy1lbippKSphKyhhPWVuKm4tUXQqcykqYSsoYT1RdCppLWp0Km4pKmEpLFF0Km4ranQqaStlbipzKTtBbCs9YSxQbCs9YSooUXQrKFF0PW4pKSxMbCs9YSooanQrKGp0PWkpKSxJbCs9YSooZW4rKGVuPXMpKSx5YShRdCxqdCxlbil9ZnVuY3Rpb24gVWcoKXtCbi5wb2ludD1OdX1mdW5jdGlvbiBqMSgpe0JuLnBvaW50PXR3fWZ1bmN0aW9uIGV3KCl7RGcoUGcsTGcpLEJuLnBvaW50PU51fWZ1bmN0aW9uIHR3KHIsZSl7UGc9cixMZz1lLHIqPUdlLGUqPUdlLEJuLnBvaW50PURnO3ZhciB0PVdlKGUpO1F0PXQqV2UociksanQ9dCpVZShyKSxlbj1VZShlKSx5YShRdCxqdCxlbil9ZnVuY3Rpb24gRGcocixlKXtyKj1HZSxlKj1HZTt2YXIgdD1XZShlKSxuPXQqV2UociksaT10KlVlKHIpLHM9VWUoZSksYT1qdCpzLWVuKmksbz1lbipuLVF0KnMsbD1RdCppLWp0Km4sYz1FdShhLG8sbCksaD1maShjKSx1PWMmJi1oL2M7SXUuYWRkKHUqYSksVXUuYWRkKHUqbyksRHUuYWRkKHUqbCksQWwrPWgsUGwrPWgqKFF0KyhRdD1uKSksTGwrPWgqKGp0KyhqdD1pKSksSWwrPWgqKGVuKyhlbj1zKSkseWEoUXQsanQsZW4pfWZ1bmN0aW9uIE5nKHIpe3hhPUFsPVRsPUNsPVJsPVBsPUxsPUlsPTAsSXU9bmV3IGhpLFV1PW5ldyBoaSxEdT1uZXcgaGksdmwocixCbik7dmFyIGU9K0l1LHQ9K1V1LG49K0R1LGk9RXUoZSx0LG4pO3JldHVybiBpPF9sJiYoZT1QbCx0PUxsLG49SWwsQWw8c3QmJihlPVRsLHQ9Q2wsbj1SbCksaT1FdShlLHQsbiksaTxfbCk/W05hTixOYU5dOltBbih0LGUpKnl0LGZpKG4vaSkqeXRdfWZ1bmN0aW9uIEZ1KHIsZSl7ZnVuY3Rpb24gdChuLGkpe3JldHVybiBuPXIobixpKSxlKG5bMF0sblsxXSl9cmV0dXJuIHIuaW52ZXJ0JiZlLmludmVydCYmKHQuaW52ZXJ0PWZ1bmN0aW9uKG4saSl7cmV0dXJuIG49ZS5pbnZlcnQobixpKSxuJiZyLmludmVydChuWzBdLG5bMV0pfSksdH1mdW5jdGlvbiBPdShyLGUpe3JldHVybiBodChyKT5ldCYmKHItPU1hdGgucm91bmQoci9kbikqZG4pLFtyLGVdfU91LmludmVydD1PdTtmdW5jdGlvbiBGZyhyLGUsdCl7cmV0dXJuKHIlPWRuKT9lfHx0P0Z1KEJnKHIpLHpnKGUsdCkpOkJnKHIpOmV8fHQ/emcoZSx0KTpPdX1mdW5jdGlvbiBPZyhyKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSs9cixodChlKT5ldCYmKGUtPU1hdGgucm91bmQoZS9kbikqZG4pLFtlLHRdfX1mdW5jdGlvbiBCZyhyKXt2YXIgZT1PZyhyKTtyZXR1cm4gZS5pbnZlcnQ9T2coLXIpLGV9ZnVuY3Rpb24gemcocixlKXt2YXIgdD1XZShyKSxuPVVlKHIpLGk9V2UoZSkscz1VZShlKTtmdW5jdGlvbiBhKG8sbCl7dmFyIGM9V2UobCksaD1XZShvKSpjLHU9VWUobykqYyxmPVVlKGwpLGQ9Zip0K2gqbjtyZXR1cm5bQW4odSppLWQqcyxoKnQtZipuKSxmaShkKmkrdSpzKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKG8sbCl7dmFyIGM9V2UobCksaD1XZShvKSpjLHU9VWUobykqYyxmPVVlKGwpLGQ9ZippLXUqcztyZXR1cm5bQW4odSppK2YqcyxoKnQrZCpuKSxmaShkKnQtaCpuKV19LGF9ZnVuY3Rpb24ga2cocil7cj1GZyhyWzBdKkdlLHJbMV0qR2Usci5sZW5ndGg+Mj9yWzJdKkdlOjApO2Z1bmN0aW9uIGUodCl7cmV0dXJuIHQ9cih0WzBdKkdlLHRbMV0qR2UpLHRbMF0qPXl0LHRbMV0qPXl0LHR9cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0PXIuaW52ZXJ0KHRbMF0qR2UsdFsxXSpHZSksdFswXSo9eXQsdFsxXSo9eXQsdH0sZX1mdW5jdGlvbiBudyhyLGUsdCxuLGkscyl7aWYodCl7dmFyIGE9V2UoZSksbz1VZShlKSxsPW4qdDtpPT1udWxsPyhpPWUrbipkbixzPWUtbC8yKTooaT1HZyhhLGkpLHM9R2coYSxzKSwobj4wP2k8czppPnMpJiYoaSs9bipkbikpO2Zvcih2YXIgYyxoPWk7bj4wP2g+czpoPHM7aC09bCljPVNsKFthLC1vKldlKGgpLC1vKlVlKGgpXSksci5wb2ludChjWzBdLGNbMV0pfX1mdW5jdGlvbiBHZyhyLGUpe2U9ZnIoZSksZVswXS09cixFbChlKTt2YXIgdD1XMSgtZVsxXSk7cmV0dXJuKCgtZVsyXTwwPy10OnQpK2RuLXN0KSVkbn1mdW5jdGlvbiBWZygpe3ZhciByPVtdLGU7cmV0dXJue3BvaW50OmZ1bmN0aW9uKHQsbixpKXtlLnB1c2goW3QsbixpXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3IucHVzaChlPVtdKX0sbGluZUVuZDpYdCxyZWpvaW46ZnVuY3Rpb24oKXtyLmxlbmd0aD4xJiZyLnB1c2goci5wb3AoKS5jb25jYXQoci5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PXI7cmV0dXJuIHI9W10sZT1udWxsLHR9fX1mdW5jdGlvbiBVbChyLGUpe3JldHVybiBodChyWzBdLWVbMF0pPHN0JiZodChyWzFdLWVbMV0pPHN0fWZ1bmN0aW9uIERsKHIsZSx0LG4pe3RoaXMueD1yLHRoaXMuej1lLHRoaXMubz10LHRoaXMuZT1uLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gSGcocixlLHQsbixpKXt2YXIgcz1bXSxhPVtdLG8sbDtpZihyLmZvckVhY2goZnVuY3Rpb24ocCl7aWYoISgoXz1wLmxlbmd0aC0xKTw9MCkpe3ZhciBfLGc9cFswXSxtPXBbX10seTtpZihVbChnLG0pKXtpZighZ1syXSYmIW1bMl0pe2ZvcihpLmxpbmVTdGFydCgpLG89MDtvPF87KytvKWkucG9pbnQoKGc9cFtvXSlbMF0sZ1sxXSk7aS5saW5lRW5kKCk7cmV0dXJufW1bMF0rPTIqc3R9cy5wdXNoKHk9bmV3IERsKGcscCxudWxsLCEwKSksYS5wdXNoKHkubz1uZXcgRGwoZyxudWxsLHksITEpKSxzLnB1c2goeT1uZXcgRGwobSxwLG51bGwsITEpKSxhLnB1c2goeS5vPW5ldyBEbChtLG51bGwseSwhMCkpfX0pLCEhcy5sZW5ndGgpe2ZvcihhLnNvcnQoZSksV2cocyksV2coYSksbz0wLGw9YS5sZW5ndGg7bzxsOysrbylhW29dLmU9dD0hdDtmb3IodmFyIGM9c1swXSxoLHU7Oyl7Zm9yKHZhciBmPWMsZD0hMDtmLnY7KWlmKChmPWYubik9PT1jKXJldHVybjtoPWYueixpLmxpbmVTdGFydCgpO2Rve2lmKGYudj1mLm8udj0hMCxmLmUpe2lmKGQpZm9yKG89MCxsPWgubGVuZ3RoO288bDsrK28paS5wb2ludCgodT1oW29dKVswXSx1WzFdKTtlbHNlIG4oZi54LGYubi54LDEsaSk7Zj1mLm59ZWxzZXtpZihkKWZvcihoPWYucC56LG89aC5sZW5ndGgtMTtvPj0wOy0tbylpLnBvaW50KCh1PWhbb10pWzBdLHVbMV0pO2Vsc2UgbihmLngsZi5wLngsLTEsaSk7Zj1mLnB9Zj1mLm8saD1mLnosZD0hZH13aGlsZSghZi52KTtpLmxpbmVFbmQoKX19fWZ1bmN0aW9uIFdnKHIpe2lmKGU9ci5sZW5ndGgpe2Zvcih2YXIgZSx0PTAsbj1yWzBdLGk7Kyt0PGU7KW4ubj1pPXJbdF0saS5wPW4sbj1pO24ubj1pPXJbMF0saS5wPW59fWZ1bmN0aW9uIEJ1KHIpe3JldHVybiBodChyWzBdKTw9ZXQ/clswXTpWMShyWzBdKSooKGh0KHJbMF0pK2V0KSVkbi1ldCl9ZnVuY3Rpb24gWGcocixlKXt2YXIgdD1CdShlKSxuPWVbMV0saT1VZShuKSxzPVtVZSh0KSwtV2UodCksMF0sYT0wLG89MCxsPW5ldyBoaTtpPT09MT9uPWZuK3N0Omk9PT0tMSYmKG49LWZuLXN0KTtmb3IodmFyIGM9MCxoPXIubGVuZ3RoO2M8aDsrK2MpaWYoZj0odT1yW2NdKS5sZW5ndGgpZm9yKHZhciB1LGYsZD11W2YtMV0scD1CdShkKSxfPWRbMV0vMit4bCxnPVVlKF8pLG09V2UoXykseT0wO3k8ZjsrK3kscD12LGc9YixtPUEsZD14KXt2YXIgeD11W3ldLHY9QnUoeCksUz14WzFdLzIreGwsYj1VZShTKSxBPVdlKFMpLEw9di1wLE09TD49MD8xOi0xLHc9TSpMLFI9dz5ldCxOPWcqYjtpZihsLmFkZChBbihOKk0qVWUodyksbSpBK04qV2UodykpKSxhKz1SP0wrTSpkbjpMLFJecD49dF52Pj10KXt2YXIgQj1zcyhmcihkKSxmcih4KSk7RWwoQik7dmFyIEk9c3MocyxCKTtFbChJKTt2YXIgVT0oUl5MPj0wPy0xOjEpKmZpKElbMl0pOyhuPlV8fG49PT1VJiYoQlswXXx8QlsxXSkpJiYobys9Ul5MPj0wPzE6LTEpfX1yZXR1cm4oYTwtc3R8fGE8c3QmJmw8LV9sKV5vJjF9ZnVuY3Rpb24gcWcocixlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciBzPWUoaSksYT1WZygpLG89ZShhKSxsPSExLGMsaCx1LGY9e3BvaW50OmQsbGluZVN0YXJ0Ol8sbGluZUVuZDpnLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2YucG9pbnQ9bSxmLmxpbmVTdGFydD15LGYubGluZUVuZD14LGg9W10sYz1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2YucG9pbnQ9ZCxmLmxpbmVTdGFydD1fLGYubGluZUVuZD1nLGg9Z2EoaCk7dmFyIHY9WGcoYyxuKTtoLmxlbmd0aD8obHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksSGcoaCxydyx2LHQsaSkpOnYmJihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLHQobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGwmJihpLnBvbHlnb25FbmQoKSxsPSExKSxoPWM9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLHQobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKHYsUyl7cih2LFMpJiZpLnBvaW50KHYsUyl9ZnVuY3Rpb24gcCh2LFMpe3MucG9pbnQodixTKX1mdW5jdGlvbiBfKCl7Zi5wb2ludD1wLHMubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2YucG9pbnQ9ZCxzLmxpbmVFbmQoKX1mdW5jdGlvbiBtKHYsUyl7dS5wdXNoKFt2LFNdKSxvLnBvaW50KHYsUyl9ZnVuY3Rpb24geSgpe28ubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiB4KCl7bSh1WzBdWzBdLHVbMF1bMV0pLG8ubGluZUVuZCgpO3ZhciB2PW8uY2xlYW4oKSxTPWEucmVzdWx0KCksYixBPVMubGVuZ3RoLEwsTSx3O2lmKHUucG9wKCksYy5wdXNoKHUpLHU9bnVsbCwhIUEpe2lmKHYmMSl7aWYoTT1TWzBdLChMPU0ubGVuZ3RoLTEpPjApe2ZvcihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLGI9MDtiPEw7KytiKWkucG9pbnQoKHc9TVtiXSlbMF0sd1sxXSk7aS5saW5lRW5kKCl9cmV0dXJufUE+MSYmdiYyJiZTLnB1c2goUy5wb3AoKS5jb25jYXQoUy5zaGlmdCgpKSksaC5wdXNoKFMuZmlsdGVyKGl3KSl9fXJldHVybiBmfX1mdW5jdGlvbiBpdyhyKXtyZXR1cm4gci5sZW5ndGg+MX1mdW5jdGlvbiBydyhyLGUpe3JldHVybigocj1yLngpWzBdPDA/clsxXS1mbi1zdDpmbi1yWzFdKS0oKGU9ZS54KVswXTwwP2VbMV0tZm4tc3Q6Zm4tZVsxXSl9dmFyICRnPXFnKGZ1bmN0aW9uKCl7cmV0dXJuITB9LHN3LG93LFstZXQsLWZuXSk7ZnVuY3Rpb24gc3cocil7dmFyIGU9TmFOLHQ9TmFOLG49TmFOLGk7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3IubGluZVN0YXJ0KCksaT0xfSxwb2ludDpmdW5jdGlvbihzLGEpe3ZhciBvPXM+MD9ldDotZXQsbD1odChzLWUpO2h0KGwtZXQpPHN0PyhyLnBvaW50KGUsdD0odCthKS8yPjA/Zm46LWZuKSxyLnBvaW50KG4sdCksci5saW5lRW5kKCksci5saW5lU3RhcnQoKSxyLnBvaW50KG8sdCksci5wb2ludChzLHQpLGk9MCk6biE9PW8mJmw+PWV0JiYoaHQoZS1uKTxzdCYmKGUtPW4qc3QpLGh0KHMtbyk8c3QmJihzLT1vKnN0KSx0PWF3KGUsdCxzLGEpLHIucG9pbnQobix0KSxyLmxpbmVFbmQoKSxyLmxpbmVTdGFydCgpLHIucG9pbnQobyx0KSxpPTApLHIucG9pbnQoZT1zLHQ9YSksbj1vfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ci5saW5lRW5kKCksZT10PU5hTn0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi1pfX19ZnVuY3Rpb24gYXcocixlLHQsbil7dmFyIGkscyxhPVVlKHItdCk7cmV0dXJuIGh0KGEpPnN0P3d1KChVZShlKSoocz1XZShuKSkqVWUodCktVWUobikqKGk9V2UoZSkpKlVlKHIpKS8oaSpzKmEpKTooZStuKS8yfWZ1bmN0aW9uIG93KHIsZSx0LG4pe3ZhciBpO2lmKHI9PW51bGwpaT10KmZuLG4ucG9pbnQoLWV0LGkpLG4ucG9pbnQoMCxpKSxuLnBvaW50KGV0LGkpLG4ucG9pbnQoZXQsMCksbi5wb2ludChldCwtaSksbi5wb2ludCgwLC1pKSxuLnBvaW50KC1ldCwtaSksbi5wb2ludCgtZXQsMCksbi5wb2ludCgtZXQsaSk7ZWxzZSBpZihodChyWzBdLWVbMF0pPnN0KXt2YXIgcz1yWzBdPGVbMF0/ZXQ6LWV0O2k9dCpzLzIsbi5wb2ludCgtcyxpKSxuLnBvaW50KDAsaSksbi5wb2ludChzLGkpfWVsc2Ugbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGx3KHIpe3ZhciBlPVdlKHIpLHQ9NipHZSxuPWU+MCxpPWh0KGUpPnN0O2Z1bmN0aW9uIHMoaCx1LGYsZCl7bncoZCxyLHQsZixoLHUpfWZ1bmN0aW9uIGEoaCx1KXtyZXR1cm4gV2UoaCkqV2UodSk+ZX1mdW5jdGlvbiBvKGgpe3ZhciB1LGYsZCxwLF87cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3A9ZD0hMSxfPTF9LHBvaW50OmZ1bmN0aW9uKGcsbSl7dmFyIHk9W2csbV0seCx2PWEoZyxtKSxTPW4/dj8wOmMoZyxtKTp2P2MoZysoZzwwP2V0Oi1ldCksbSk6MDtpZighdSYmKHA9ZD12KSYmaC5saW5lU3RhcnQoKSx2IT09ZCYmKHg9bCh1LHkpLCgheHx8VWwodSx4KXx8VWwoeSx4KSkmJih5WzJdPTEpKSx2IT09ZClfPTAsdj8oaC5saW5lU3RhcnQoKSx4PWwoeSx1KSxoLnBvaW50KHhbMF0seFsxXSkpOih4PWwodSx5KSxoLnBvaW50KHhbMF0seFsxXSwyKSxoLmxpbmVFbmQoKSksdT14O2Vsc2UgaWYoaSYmdSYmbl52KXt2YXIgYjshKFMmZikmJihiPWwoeSx1LCEwKSkmJihfPTAsbj8oaC5saW5lU3RhcnQoKSxoLnBvaW50KGJbMF1bMF0sYlswXVsxXSksaC5wb2ludChiWzFdWzBdLGJbMV1bMV0pLGgubGluZUVuZCgpKTooaC5wb2ludChiWzFdWzBdLGJbMV1bMV0pLGgubGluZUVuZCgpLGgubGluZVN0YXJ0KCksaC5wb2ludChiWzBdWzBdLGJbMF1bMV0sMykpKX12JiYoIXV8fCFVbCh1LHkpKSYmaC5wb2ludCh5WzBdLHlbMV0pLHU9eSxkPXYsZj1TfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZCYmaC5saW5lRW5kKCksdT1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBffChwJiZkKTw8MX19fWZ1bmN0aW9uIGwoaCx1LGYpe3ZhciBkPWZyKGgpLHA9ZnIodSksXz1bMSwwLDBdLGc9c3MoZCxwKSxtPWJsKGcsZykseT1nWzBdLHg9bS15Knk7aWYoIXgpcmV0dXJuIWYmJmg7dmFyIHY9ZSptL3gsUz0tZSp5L3gsYj1zcyhfLGcpLEE9d2woXyx2KSxMPXdsKGcsUyk7UHUoQSxMKTt2YXIgTT1iLHc9YmwoQSxNKSxSPWJsKE0sTSksTj13KnctUiooYmwoQSxBKS0xKTtpZighKE48MCkpe3ZhciBCPXVpKE4pLEk9d2woTSwoLXctQikvUik7aWYoUHUoSSxBKSxJPVNsKEkpLCFmKXJldHVybiBJO3ZhciBVPWhbMF0sej11WzBdLEY9aFsxXSxaPXVbMV0sVjt6PFUmJihWPVUsVT16LHo9Vik7dmFyIFE9ei1VLG5lPWh0KFEtZXQpPHN0LGZlPW5lfHxRPHN0O2lmKCFuZSYmWjxGJiYoVj1GLEY9WixaPVYpLGZlP25lP0YrWj4wXklbMV08KGh0KElbMF0tVSk8c3Q/RjpaKTpGPD1JWzFdJiZJWzFdPD1aOlE+ZXReKFU8PUlbMF0mJklbMF08PXopKXt2YXIgJD13bChNLCgtdytCKS9SKTtyZXR1cm4gUHUoJCxBKSxbSSxTbCgkKV19fX1mdW5jdGlvbiBjKGgsdSl7dmFyIGY9bj9yOmV0LXIsZD0wO3JldHVybiBoPC1mP2R8PTE6aD5mJiYoZHw9MiksdTwtZj9kfD00OnU+ZiYmKGR8PTgpLGR9cmV0dXJuIHFnKGEsbyxzLG4/WzAsLXJdOlstZXQsci1ldF0pfWZ1bmN0aW9uIGN3KHIsZSx0LG4saSxzKXt2YXIgYT1yWzBdLG89clsxXSxsPWVbMF0sYz1lWzFdLGg9MCx1PTEsZj1sLWEsZD1jLW8scDtpZihwPXQtYSwhKCFmJiZwPjApKXtpZihwLz1mLGY8MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWVsc2UgaWYoZj4wKXtpZihwPnUpcmV0dXJuO3A+aCYmKGg9cCl9aWYocD1pLWEsISghZiYmcDwwKSl7aWYocC89ZixmPDApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1lbHNlIGlmKGY+MCl7aWYocDxoKXJldHVybjtwPHUmJih1PXApfWlmKHA9bi1vLCEoIWQmJnA+MCkpe2lmKHAvPWQsZDwwKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9ZWxzZSBpZihkPjApe2lmKHA+dSlyZXR1cm47cD5oJiYoaD1wKX1pZihwPXMtbywhKCFkJiZwPDApKXtpZihwLz1kLGQ8MCl7aWYocD51KXJldHVybjtwPmgmJihoPXApfWVsc2UgaWYoZD4wKXtpZihwPGgpcmV0dXJuO3A8dSYmKHU9cCl9cmV0dXJuIGg+MCYmKHJbMF09YStoKmYsclsxXT1vK2gqZCksdTwxJiYoZVswXT1hK3UqZixlWzFdPW8rdSpkKSwhMH19fX19dmFyIHZhPTFlOSxObD0tdmE7ZnVuY3Rpb24gaHcocixlLHQsbil7ZnVuY3Rpb24gaShjLGgpe3JldHVybiByPD1jJiZjPD10JiZlPD1oJiZoPD1ufWZ1bmN0aW9uIHMoYyxoLHUsZil7dmFyIGQ9MCxwPTA7aWYoYz09bnVsbHx8KGQ9YShjLHUpKSE9PShwPWEoaCx1KSl8fGwoYyxoKTwwXnU+MClkbyBmLnBvaW50KGQ9PT0wfHxkPT09Mz9yOnQsZD4xP246ZSk7d2hpbGUoKGQ9KGQrdSs0KSU0KSE9PXApO2Vsc2UgZi5wb2ludChoWzBdLGhbMV0pfWZ1bmN0aW9uIGEoYyxoKXtyZXR1cm4gaHQoY1swXS1yKTxzdD9oPjA/MDozOmh0KGNbMF0tdCk8c3Q/aD4wPzI6MTpodChjWzFdLWUpPHN0P2g+MD8xOjA6aD4wPzM6Mn1mdW5jdGlvbiBvKGMsaCl7cmV0dXJuIGwoYy54LGgueCl9ZnVuY3Rpb24gbChjLGgpe3ZhciB1PWEoYywxKSxmPWEoaCwxKTtyZXR1cm4gdSE9PWY/dS1mOnU9PT0wP2hbMV0tY1sxXTp1PT09MT9jWzBdLWhbMF06dT09PTI/Y1sxXS1oWzFdOmhbMF0tY1swXX1yZXR1cm4gZnVuY3Rpb24oYyl7dmFyIGg9Yyx1PVZnKCksZixkLHAsXyxnLG0seSx4LHYsUyxiLEE9e3BvaW50OkwsbGluZVN0YXJ0Ok4sbGluZUVuZDpCLHBvbHlnb25TdGFydDp3LHBvbHlnb25FbmQ6Un07ZnVuY3Rpb24gTChVLHope2koVSx6KSYmaC5wb2ludChVLHopfWZ1bmN0aW9uIE0oKXtmb3IodmFyIFU9MCx6PTAsRj1kLmxlbmd0aDt6PEY7Kyt6KWZvcih2YXIgWj1kW3pdLFY9MSxRPVoubGVuZ3RoLG5lPVpbMF0sZmUsJCxlZT1uZVswXSxkZT1uZVsxXTtWPFE7KytWKWZlPWVlLCQ9ZGUsbmU9WltWXSxlZT1uZVswXSxkZT1uZVsxXSwkPD1uP2RlPm4mJihlZS1mZSkqKG4tJCk+KGRlLSQpKihyLWZlKSYmKytVOmRlPD1uJiYoZWUtZmUpKihuLSQpPChkZS0kKSooci1mZSkmJi0tVTtyZXR1cm4gVX1mdW5jdGlvbiB3KCl7aD11LGY9W10sZD1bXSxiPSEwfWZ1bmN0aW9uIFIoKXt2YXIgVT1NKCksej1iJiZVLEY9KGY9Z2EoZikpLmxlbmd0aDsoenx8RikmJihjLnBvbHlnb25TdGFydCgpLHomJihjLmxpbmVTdGFydCgpLHMobnVsbCxudWxsLDEsYyksYy5saW5lRW5kKCkpLEYmJkhnKGYsbyxVLHMsYyksYy5wb2x5Z29uRW5kKCkpLGg9YyxmPWQ9cD1udWxsfWZ1bmN0aW9uIE4oKXtBLnBvaW50PUksZCYmZC5wdXNoKHA9W10pLFM9ITAsdj0hMSx5PXg9TmFOfWZ1bmN0aW9uIEIoKXtmJiYoSShfLGcpLG0mJnYmJnUucmVqb2luKCksZi5wdXNoKHUucmVzdWx0KCkpKSxBLnBvaW50PUwsdiYmaC5saW5lRW5kKCl9ZnVuY3Rpb24gSShVLHope3ZhciBGPWkoVSx6KTtpZihkJiZwLnB1c2goW1Usel0pLFMpXz1VLGc9eixtPUYsUz0hMSxGJiYoaC5saW5lU3RhcnQoKSxoLnBvaW50KFUseikpO2Vsc2UgaWYoRiYmdiloLnBvaW50KFUseik7ZWxzZXt2YXIgWj1beT1NYXRoLm1heChObCxNYXRoLm1pbih2YSx5KSkseD1NYXRoLm1heChObCxNYXRoLm1pbih2YSx4KSldLFY9W1U9TWF0aC5tYXgoTmwsTWF0aC5taW4odmEsVSkpLHo9TWF0aC5tYXgoTmwsTWF0aC5taW4odmEseikpXTtjdyhaLFYscixlLHQsbik/KHZ8fChoLmxpbmVTdGFydCgpLGgucG9pbnQoWlswXSxaWzFdKSksaC5wb2ludChWWzBdLFZbMV0pLEZ8fGgubGluZUVuZCgpLGI9ITEpOkYmJihoLmxpbmVTdGFydCgpLGgucG9pbnQoVSx6KSxiPSExKX15PVUseD16LHY9Rn1yZXR1cm4gQX19dmFyIHp1LGt1LEZsLE9sLG9zPXtzcGhlcmU6WHQscG9pbnQ6WHQsbGluZVN0YXJ0OnV3LGxpbmVFbmQ6WHQscG9seWdvblN0YXJ0Olh0LHBvbHlnb25FbmQ6WHR9O2Z1bmN0aW9uIHV3KCl7b3MucG9pbnQ9ZHcsb3MubGluZUVuZD1md31mdW5jdGlvbiBmdygpe29zLnBvaW50PW9zLmxpbmVFbmQ9WHR9ZnVuY3Rpb24gZHcocixlKXtyKj1HZSxlKj1HZSxrdT1yLEZsPVVlKGUpLE9sPVdlKGUpLG9zLnBvaW50PXB3fWZ1bmN0aW9uIHB3KHIsZSl7cio9R2UsZSo9R2U7dmFyIHQ9VWUoZSksbj1XZShlKSxpPWh0KHIta3UpLHM9V2UoaSksYT1VZShpKSxvPW4qYSxsPU9sKnQtRmwqbipzLGM9RmwqdCtPbCpuKnM7enUuYWRkKEFuKHVpKG8qbytsKmwpLGMpKSxrdT1yLEZsPXQsT2w9bn1mdW5jdGlvbiBtdyhyKXtyZXR1cm4genU9bmV3IGhpLHZsKHIsb3MpLCt6dX12YXIgR3U9W251bGwsbnVsbF0sZ3c9e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOkd1fTtmdW5jdGlvbiBscyhyLGUpe3JldHVybiBHdVswXT1yLEd1WzFdPWUsbXcoZ3cpfXZhciBZZz17RmVhdHVyZTpmdW5jdGlvbihyLGUpe3JldHVybiBCbChyLmdlb21ldHJ5LGUpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihyLGUpe2Zvcih2YXIgdD1yLmZlYXR1cmVzLG49LTEsaT10Lmxlbmd0aDsrK248aTspaWYoQmwodFtuXS5nZW9tZXRyeSxlKSlyZXR1cm4hMDtyZXR1cm4hMX19LFpnPXtTcGhlcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUG9pbnQ6ZnVuY3Rpb24ocixlKXtyZXR1cm4gSmcoci5jb29yZGluYXRlcyxlKX0sTXVsdGlQb2ludDpmdW5jdGlvbihyLGUpe2Zvcih2YXIgdD1yLmNvb3JkaW5hdGVzLG49LTEsaT10Lmxlbmd0aDsrK248aTspaWYoSmcodFtuXSxlKSlyZXR1cm4hMDtyZXR1cm4hMX0sTGluZVN0cmluZzpmdW5jdGlvbihyLGUpe3JldHVybiBLZyhyLmNvb3JkaW5hdGVzLGUpfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24ocixlKXtmb3IodmFyIHQ9ci5jb29yZGluYXRlcyxuPS0xLGk9dC5sZW5ndGg7KytuPGk7KWlmKEtnKHRbbl0sZSkpcmV0dXJuITA7cmV0dXJuITF9LFBvbHlnb246ZnVuY3Rpb24ocixlKXtyZXR1cm4gUWcoci5jb29yZGluYXRlcyxlKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHIsZSl7Zm9yKHZhciB0PXIuY29vcmRpbmF0ZXMsbj0tMSxpPXQubGVuZ3RoOysrbjxpOylpZihRZyh0W25dLGUpKXJldHVybiEwO3JldHVybiExfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24ocixlKXtmb3IodmFyIHQ9ci5nZW9tZXRyaWVzLG49LTEsaT10Lmxlbmd0aDsrK248aTspaWYoQmwodFtuXSxlKSlyZXR1cm4hMDtyZXR1cm4hMX19O2Z1bmN0aW9uIEJsKHIsZSl7cmV0dXJuIHImJlpnLmhhc093blByb3BlcnR5KHIudHlwZSk/Wmdbci50eXBlXShyLGUpOiExfWZ1bmN0aW9uIEpnKHIsZSl7cmV0dXJuIGxzKHIsZSk9PT0wfWZ1bmN0aW9uIEtnKHIsZSl7Zm9yKHZhciB0LG4saSxzPTAsYT1yLmxlbmd0aDtzPGE7cysrKXtpZihuPWxzKHJbc10sZSksbj09PTB8fHM+MCYmKGk9bHMocltzXSxyW3MtMV0pLGk+MCYmdDw9aSYmbjw9aSYmKHQrbi1pKSooMS1NYXRoLnBvdygodC1uKS9pLDIpKTxfbCppKSlyZXR1cm4hMDt0PW59cmV0dXJuITF9ZnVuY3Rpb24gUWcocixlKXtyZXR1cm4hIVhnKHIubWFwKF93KSxqZyhlKSl9ZnVuY3Rpb24gX3cocil7cmV0dXJuIHI9ci5tYXAoamcpLHIucG9wKCkscn1mdW5jdGlvbiBqZyhyKXtyZXR1cm5bclswXSpHZSxyWzFdKkdlXX1mdW5jdGlvbiB4dyhyLGUpe3JldHVybihyJiZZZy5oYXNPd25Qcm9wZXJ0eShyLnR5cGUpP1lnW3IudHlwZV06QmwpKHIsZSl9ZnVuY3Rpb24geXcocixlKXt2YXIgdD1yWzBdKkdlLG49clsxXSpHZSxpPWVbMF0qR2Uscz1lWzFdKkdlLGE9V2Uobiksbz1VZShuKSxsPVdlKHMpLGM9VWUocyksaD1hKldlKHQpLHU9YSpVZSh0KSxmPWwqV2UoaSksZD1sKlVlKGkpLHA9MipmaSh1aShwZyhzLW4pK2EqbCpwZyhpLXQpKSksXz1VZShwKSxnPXA/ZnVuY3Rpb24obSl7dmFyIHk9VWUobSo9cCkvXyx4PVVlKHAtbSkvXyx2PXgqaCt5KmYsUz14KnUreSpkLGI9eCpvK3kqYztyZXR1cm5bQW4oUyx2KSp5dCxBbihiLHVpKHYqditTKlMpKSp5dF19OmZ1bmN0aW9uKCl7cmV0dXJuW3QqeXQsbip5dF19O3JldHVybiBnLmRpc3RhbmNlPXAsZ312YXIgZTA9cj0+cixjcz0xLzAsemw9Y3MsTWE9LWNzLGtsPU1hLHZ3PXtwb2ludDpNdyxsaW5lU3RhcnQ6WHQsbGluZUVuZDpYdCxwb2x5Z29uU3RhcnQ6WHQscG9seWdvbkVuZDpYdCxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgcj1bW2NzLHpsXSxbTWEsa2xdXTtyZXR1cm4gTWE9a2w9LSh6bD1jcz0xLzApLHJ9fTtmdW5jdGlvbiBNdyhyLGUpe3I8Y3MmJihjcz1yKSxyPk1hJiYoTWE9ciksZTx6bCYmKHpsPWUpLGU+a2wmJihrbD1lKX12YXIgdDA9dnc7ZnVuY3Rpb24gVnUocil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBIdTtmb3IodmFyIG4gaW4gcil0W25dPXJbbl07cmV0dXJuIHQuc3RyZWFtPWUsdH19ZnVuY3Rpb24gSHUoKXt9SHUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpIdSxwb2ludDpmdW5jdGlvbihyLGUpe3RoaXMuc3RyZWFtLnBvaW50KHIsZSl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBXdShyLGUsdCl7dmFyIG49ci5jbGlwRXh0ZW50JiZyLmNsaXBFeHRlbnQoKTtyZXR1cm4gci5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbiE9bnVsbCYmci5jbGlwRXh0ZW50KG51bGwpLHZsKHQsci5zdHJlYW0odDApKSxlKHQwLnJlc3VsdCgpKSxuIT1udWxsJiZyLmNsaXBFeHRlbnQobikscn1mdW5jdGlvbiBuMChyLGUsdCl7cmV0dXJuIFd1KHIsZnVuY3Rpb24obil7dmFyIGk9ZVsxXVswXS1lWzBdWzBdLHM9ZVsxXVsxXS1lWzBdWzFdLGE9TWF0aC5taW4oaS8oblsxXVswXS1uWzBdWzBdKSxzLyhuWzFdWzFdLW5bMF1bMV0pKSxvPStlWzBdWzBdKyhpLWEqKG5bMV1bMF0rblswXVswXSkpLzIsbD0rZVswXVsxXSsocy1hKihuWzFdWzFdK25bMF1bMV0pKS8yO3Iuc2NhbGUoMTUwKmEpLnRyYW5zbGF0ZShbbyxsXSl9LHQpfWZ1bmN0aW9uIFN3KHIsZSx0KXtyZXR1cm4gbjAocixbWzAsMF0sZV0sdCl9ZnVuY3Rpb24gYncocixlLHQpe3JldHVybiBXdShyLGZ1bmN0aW9uKG4pe3ZhciBpPStlLHM9aS8oblsxXVswXS1uWzBdWzBdKSxhPShpLXMqKG5bMV1bMF0rblswXVswXSkpLzIsbz0tcypuWzBdWzFdO3Iuc2NhbGUoMTUwKnMpLnRyYW5zbGF0ZShbYSxvXSl9LHQpfWZ1bmN0aW9uIHd3KHIsZSx0KXtyZXR1cm4gV3UocixmdW5jdGlvbihuKXt2YXIgaT0rZSxzPWkvKG5bMV1bMV0tblswXVsxXSksYT0tcypuWzBdWzBdLG89KGktcyooblsxXVsxXStuWzBdWzFdKSkvMjtyLnNjYWxlKDE1MCpzKS50cmFuc2xhdGUoW2Esb10pfSx0KX12YXIgaTA9MTYsRXc9V2UoMzAqR2UpO2Z1bmN0aW9uIHIwKHIsZSl7cmV0dXJuK2U/VHcocixlKTpBdyhyKX1mdW5jdGlvbiBBdyhyKXtyZXR1cm4gVnUoe3BvaW50OmZ1bmN0aW9uKGUsdCl7ZT1yKGUsdCksdGhpcy5zdHJlYW0ucG9pbnQoZVswXSxlWzFdKX19KX1mdW5jdGlvbiBUdyhyLGUpe2Z1bmN0aW9uIHQobixpLHMsYSxvLGwsYyxoLHUsZixkLHAsXyxnKXt2YXIgbT1jLW4seT1oLWkseD1tKm0reSp5O2lmKHg+NCplJiZfLS0pe3ZhciB2PWErZixTPW8rZCxiPWwrcCxBPXVpKHYqditTKlMrYipiKSxMPWZpKGIvPUEpLE09aHQoaHQoYiktMSk8c3R8fGh0KHMtdSk8c3Q/KHMrdSkvMjpBbihTLHYpLHc9cihNLEwpLFI9d1swXSxOPXdbMV0sQj1SLW4sST1OLWksVT15KkItbSpJOyhVKlUveD5lfHxodCgobSpCK3kqSSkveC0uNSk+LjN8fGEqZitvKmQrbCpwPEV3KSYmKHQobixpLHMsYSxvLGwsUixOLE0sdi89QSxTLz1BLGIsXyxnKSxnLnBvaW50KFIsTiksdChSLE4sTSx2LFMsYixjLGgsdSxmLGQscCxfLGcpKX19cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpLHMsYSxvLGwsYyxoLHUsZixkLHAsXyxnPXtwb2ludDptLGxpbmVTdGFydDp5LGxpbmVFbmQ6dixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpLGcubGluZVN0YXJ0PVN9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25FbmQoKSxnLmxpbmVTdGFydD15fX07ZnVuY3Rpb24gbShMLE0pe0w9cihMLE0pLG4ucG9pbnQoTFswXSxMWzFdKX1mdW5jdGlvbiB5KCl7dT1OYU4sZy5wb2ludD14LG4ubGluZVN0YXJ0KCl9ZnVuY3Rpb24geChMLE0pe3ZhciB3PWZyKFtMLE1dKSxSPXIoTCxNKTt0KHUsZixoLGQscCxfLHU9UlswXSxmPVJbMV0saD1MLGQ9d1swXSxwPXdbMV0sXz13WzJdLGkwLG4pLG4ucG9pbnQodSxmKX1mdW5jdGlvbiB2KCl7Zy5wb2ludD1tLG4ubGluZUVuZCgpfWZ1bmN0aW9uIFMoKXt5KCksZy5wb2ludD1iLGcubGluZUVuZD1BfWZ1bmN0aW9uIGIoTCxNKXt4KGk9TCxNKSxzPXUsYT1mLG89ZCxsPXAsYz1fLGcucG9pbnQ9eH1mdW5jdGlvbiBBKCl7dCh1LGYsaCxkLHAsXyxzLGEsaSxvLGwsYyxpMCxuKSxnLmxpbmVFbmQ9dix2KCl9cmV0dXJuIGd9fXZhciBDdz1WdSh7cG9pbnQ6ZnVuY3Rpb24ocixlKXt0aGlzLnN0cmVhbS5wb2ludChyKkdlLGUqR2UpfX0pO2Z1bmN0aW9uIFJ3KHIpe3JldHVybiBWdSh7cG9pbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj1yKGUsdCk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9ZnVuY3Rpb24gUHcocixlLHQsbixpKXtmdW5jdGlvbiBzKGEsbyl7cmV0dXJuIGEqPW4sbyo9aSxbZStyKmEsdC1yKm9dfXJldHVybiBzLmludmVydD1mdW5jdGlvbihhLG8pe3JldHVyblsoYS1lKS9yKm4sKHQtbykvcippXX0sc31mdW5jdGlvbiBzMChyLGUsdCxuLGkscyl7aWYoIXMpcmV0dXJuIFB3KHIsZSx0LG4saSk7dmFyIGE9V2Uocyksbz1VZShzKSxsPWEqcixjPW8qcixoPWEvcix1PW8vcixmPShvKnQtYSplKS9yLGQ9KG8qZSthKnQpL3I7ZnVuY3Rpb24gcChfLGcpe3JldHVybiBfKj1uLGcqPWksW2wqXy1jKmcrZSx0LWMqXy1sKmddfXJldHVybiBwLmludmVydD1mdW5jdGlvbihfLGcpe3JldHVybltuKihoKl8tdSpnK2YpLGkqKGQtdSpfLWgqZyldfSxwfWZ1bmN0aW9uIFh1KHIpe3JldHVybiBMdyhmdW5jdGlvbigpe3JldHVybiByfSkoKX1mdW5jdGlvbiBMdyhyKXt2YXIgZSx0PTE1MCxuPTQ4MCxpPTI1MCxzPTAsYT0wLG89MCxsPTAsYz0wLGgsdT0wLGY9MSxkPTEscD1udWxsLF89JGcsZz1udWxsLG0seSx4LHY9ZTAsUz0uNSxiLEEsTCxNLHc7ZnVuY3Rpb24gUihVKXtyZXR1cm4gTChVWzBdKkdlLFVbMV0qR2UpfWZ1bmN0aW9uIE4oVSl7cmV0dXJuIFU9TC5pbnZlcnQoVVswXSxVWzFdKSxVJiZbVVswXSp5dCxVWzFdKnl0XX1SLnN0cmVhbT1mdW5jdGlvbihVKXtyZXR1cm4gTSYmdz09PVU/TTpNPUN3KFJ3KGgpKF8oYih2KHc9VSkpKSkpfSxSLnByZWNsaXA9ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF89VSxwPXZvaWQgMCxJKCkpOl99LFIucG9zdGNsaXA9ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9VSxnPW09eT14PW51bGwsSSgpKTp2fSxSLmNsaXBBbmdsZT1mdW5jdGlvbihVKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz0rVT9sdyhwPVUqR2UpOihwPW51bGwsJGcpLEkoKSk6cCp5dH0sUi5jbGlwRXh0ZW50PWZ1bmN0aW9uKFUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PVU9PW51bGw/KGc9bT15PXg9bnVsbCxlMCk6aHcoZz0rVVswXVswXSxtPStVWzBdWzFdLHk9K1VbMV1bMF0seD0rVVsxXVsxXSksSSgpKTpnPT1udWxsP251bGw6W1tnLG1dLFt5LHhdXX0sUi5zY2FsZT1mdW5jdGlvbihVKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rVSxCKCkpOnR9LFIudHJhbnNsYXRlPWZ1bmN0aW9uKFUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStVWzBdLGk9K1VbMV0sQigpKTpbbixpXX0sUi5jZW50ZXI9ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9VVswXSUzNjAqR2UsYT1VWzFdJTM2MCpHZSxCKCkpOltzKnl0LGEqeXRdfSxSLnJvdGF0ZT1mdW5jdGlvbihVKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1VWzBdJTM2MCpHZSxsPVVbMV0lMzYwKkdlLGM9VS5sZW5ndGg+Mj9VWzJdJTM2MCpHZTowLEIoKSk6W28qeXQsbCp5dCxjKnl0XX0sUi5hbmdsZT1mdW5jdGlvbihVKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1VJTM2MCpHZSxCKCkpOnUqeXR9LFIucmVmbGVjdFg9ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9VT8tMToxLEIoKSk6ZjwwfSxSLnJlZmxlY3RZPWZ1bmN0aW9uKFUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPVU/LTE6MSxCKCkpOmQ8MH0sUi5wcmVjaXNpb249ZnVuY3Rpb24oVSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9cjAoQSxTPVUqVSksSSgpKTp1aShTKX0sUi5maXRFeHRlbnQ9ZnVuY3Rpb24oVSx6KXtyZXR1cm4gbjAoUixVLHopfSxSLmZpdFNpemU9ZnVuY3Rpb24oVSx6KXtyZXR1cm4gU3coUixVLHopfSxSLmZpdFdpZHRoPWZ1bmN0aW9uKFUseil7cmV0dXJuIGJ3KFIsVSx6KX0sUi5maXRIZWlnaHQ9ZnVuY3Rpb24oVSx6KXtyZXR1cm4gd3coUixVLHopfTtmdW5jdGlvbiBCKCl7dmFyIFU9czAodCwwLDAsZixkLHUpLmFwcGx5KG51bGwsZShzLGEpKSx6PXMwKHQsbi1VWzBdLGktVVsxXSxmLGQsdSk7cmV0dXJuIGg9RmcobyxsLGMpLEE9RnUoZSx6KSxMPUZ1KGgsQSksYj1yMChBLFMpLEkoKX1mdW5jdGlvbiBJKCl7cmV0dXJuIE09dz1udWxsLFJ9cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGU9ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksUi5pbnZlcnQ9ZS5pbnZlcnQmJk4sQigpfX1mdW5jdGlvbiBJdyhyKXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj11aShlKmUrdCp0KSxpPXIobikscz1VZShpKSxhPVdlKGkpO3JldHVybltBbihlKnMsbiphKSxmaShuJiZ0KnMvbildfX1mdW5jdGlvbiBxdShyLGUpe3JldHVybltyLEcxKEgxKChmbitlKS8yKSldfXF1LmludmVydD1mdW5jdGlvbihyLGUpe3JldHVybltyLDIqd3UoazEoZSkpLWZuXX07ZnVuY3Rpb24gVXcoKXtyZXR1cm4gRHcocXUpLnNjYWxlKDk2MS9kbil9ZnVuY3Rpb24gRHcocil7dmFyIGU9WHUociksdD1lLmNlbnRlcixuPWUuc2NhbGUsaT1lLnRyYW5zbGF0ZSxzPWUuY2xpcEV4dGVudCxhPW51bGwsbyxsLGM7ZS5zY2FsZT1mdW5jdGlvbih1KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obih1KSxoKCkpOm4oKX0sZS50cmFuc2xhdGU9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkodSksaCgpKTppKCl9LGUuY2VudGVyPWZ1bmN0aW9uKHUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0KHUpLGgoKSk6dCgpfSxlLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9PW51bGw/YT1vPWw9Yz1udWxsOihhPSt1WzBdWzBdLG89K3VbMF1bMV0sbD0rdVsxXVswXSxjPSt1WzFdWzFdKSxoKCkpOmE9PW51bGw/bnVsbDpbW2Esb10sW2wsY11dfTtmdW5jdGlvbiBoKCl7dmFyIHU9ZXQqbigpLGY9ZShrZyhlLnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gcyhhPT1udWxsP1tbZlswXS11LGZbMV0tdV0sW2ZbMF0rdSxmWzFdK3VdXTpyPT09cXU/W1tNYXRoLm1heChmWzBdLXUsYSksb10sW01hdGgubWluKGZbMF0rdSxsKSxjXV06W1thLE1hdGgubWF4KGZbMV0tdSxvKV0sW2wsTWF0aC5taW4oZlsxXSt1LGMpXV0pfXJldHVybiBoKCl9ZnVuY3Rpb24gJHUocixlKXtyZXR1cm5bcixlXX0kdS5pbnZlcnQ9JHU7ZnVuY3Rpb24gTncoKXtyZXR1cm4gWHUoJHUpLnNjYWxlKDE1Mi42Myl9ZnVuY3Rpb24gYTAocixlKXt2YXIgdD1XZShlKSxuPTErV2UocikqdDtyZXR1cm5bdCpVZShyKS9uLFVlKGUpL25dfWEwLmludmVydD1JdyhmdW5jdGlvbihyKXtyZXR1cm4gMip3dShyKX0pO2Z1bmN0aW9uIEZ3KCl7cmV0dXJuIFh1KGEwKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfWNvbnN0IFl1PXt9LFp1PXI9Pnt2YXIgbixpO2NvbnN0IGU9SlNPTi5zdHJpbmdpZnkocik7aWYoWXVbZV0pcmV0dXJuIFl1W2VdO2NvbnN0IHQ9KHIuZXF1aXJlY3Rhbmd1bGFyP053KCk6VXcoKSkuY2VudGVyKHIuY2VudGVyKS5zY2FsZShyLnNjYWxlKS50cmFuc2xhdGUoKG49ci50cmFuc2xhdGUpIT1udWxsP246WzAsMF0pLnByZWNpc2lvbigoaT1yLnByZWNpc2lvbikhPW51bGw/aTouMSk7cmV0dXJuIHIucm90YXRlJiZ0LnJvdGF0ZShyLnJvdGF0ZSksWXVbZV09dCx0fSxKdT0ocixlKT0+e2NvbnN0IHQ9clswXVswXT09PS05OTkmJnJbMF1bMV09PT0tOTk5O2xldCBuPW51bGw7aWYodCYmKHIuc2hpZnQoKSxlKSl7Y29uc3QgaT1lLmNlbnRlcigpLHM9ZS5yb3RhdGUoKTtzWzBdJiYobj1lKFsxODAtc1swXStpWzBdLDBdKSl9cmV0dXJuIHIubWFwKChbaSxzXSk9PntsZXQgYTtpZihlKXtjb25zdFtvLGxdPWUoW2ksc10pO2E9bmV3IHEobywtbCl9ZWxzZSBhPW5ldyBxKGkscyk7cmV0dXJuIG4mJmEueDwwJiYoYS54Kz1NYXRoLmFicyhuWzBdKSoyKSxhfSl9O2Z1bmN0aW9uIE93KHIsZT0wKXtjb25zdCB0PXJbMF0uaW5kZXghPT1udWxsLG49bmV3IFNldChPYmplY3Qua2V5cyhyWzBdLmF0dHJpYnV0ZXMpKSxpPW5ldyBTZXQoT2JqZWN0LmtleXMoclswXS5tb3JwaEF0dHJpYnV0ZXMpKSxzPXt9LGE9e30sbz1yWzBdLm1vcnBoVGFyZ2V0c1JlbGF0aXZlLGw9bmV3IGtlO2xldCBjPTA7Zm9yKGxldCBoPTA7aDxyLmxlbmd0aDsrK2gpe2NvbnN0IHU9cltoXTtsZXQgZj0wO2lmKHQhPT0odS5pbmRleCE9PW51bGwpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuIEFsbCBnZW9tZXRyaWVzIG11c3QgaGF2ZSBjb21wYXRpYmxlIGF0dHJpYnV0ZXM7IG1ha2Ugc3VyZSBpbmRleCBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1LmF0dHJpYnV0ZXMpe2lmKCFuLmhhcyhkKSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsnLiBBbGwgZ2VvbWV0cmllcyBtdXN0IGhhdmUgY29tcGF0aWJsZSBhdHRyaWJ1dGVzOyBtYWtlIHN1cmUgIicrZCsnIiBhdHRyaWJ1dGUgZXhpc3RzIGFtb25nIGFsbCBnZW9tZXRyaWVzLCBvciBpbiBub25lIG9mIHRoZW0uJyksbnVsbDtzW2RdPT09dm9pZCAwJiYoc1tkXT1bXSksc1tkXS5wdXNoKHUuYXR0cmlidXRlc1tkXSksZisrfWlmKGYhPT1uLnNpemUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5VXRpbHM6IC5tZXJnZUdlb21ldHJpZXMoKSBmYWlsZWQgd2l0aCBnZW9tZXRyeSBhdCBpbmRleCAiK2grIi4gTWFrZSBzdXJlIGFsbCBnZW9tZXRyaWVzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihvIT09dS5tb3JwaFRhcmdldHNSZWxhdGl2ZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiAubW9ycGhUYXJnZXRzUmVsYXRpdmUgbXVzdCBiZSBjb25zaXN0ZW50IHRocm91Z2hvdXQgYWxsIGdlb21ldHJpZXMuIiksbnVsbDtmb3IoY29uc3QgZCBpbiB1Lm1vcnBoQXR0cmlidXRlcyl7aWYoIWkuaGFzKGQpKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VHZW9tZXRyaWVzKCkgZmFpbGVkIHdpdGggZ2VvbWV0cnkgYXQgaW5kZXggIitoKyIuICAubW9ycGhBdHRyaWJ1dGVzIG11c3QgYmUgY29uc2lzdGVudCB0aHJvdWdob3V0IGFsbCBnZW9tZXRyaWVzLiIpLG51bGw7YVtkXT09PXZvaWQgMCYmKGFbZF09W10pLGFbZF0ucHVzaCh1Lm1vcnBoQXR0cmlidXRlc1tkXSl9aWYoZSl7bGV0IGQ7aWYodClkPXUuaW5kZXguY291bnQ7ZWxzZSBpZih1LmF0dHJpYnV0ZXMucG9zaXRpb24hPT12b2lkIDApZD11LmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQ7ZWxzZSByZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aXRoIGdlb21ldHJ5IGF0IGluZGV4ICIraCsiLiBUaGUgZ2VvbWV0cnkgbXVzdCBoYXZlIGVpdGhlciBhbiBpbmRleCBvciBhIHBvc2l0aW9uIGF0dHJpYnV0ZSIpLG51bGw7aWYoZT09PTEpbC5hZGRHcm91cChjLGQsaCk7ZWxzZSBpZihlPT09MiYmdS5ncm91cHMubGVuZ3RoPjApZm9yKGxldCBwIG9mIHUuZ3JvdXBzKXtsZXQgXz1wLm1hdGVyaWFsSW5kZXg7bC5hZGRHcm91cChjK3Auc3RhcnQsTWF0aC5taW4ocC5jb3VudCxkKSxfKX1jKz1kfX1pZih0KXtsZXQgaD0wO2NvbnN0IHU9W107Zm9yKGxldCBmPTA7ZjxyLmxlbmd0aDsrK2Ype2NvbnN0IGQ9cltmXS5pbmRleDtmb3IobGV0IHA9MDtwPGQuY291bnQ7KytwKXUucHVzaChkLmdldFgocCkraCk7aCs9cltmXS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmNvdW50fWwuc2V0SW5kZXgodSl9Zm9yKGNvbnN0IGggaW4gcyl7Y29uc3QgdT1vMChzW2hdKTtpZighdSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIGF0dHJpYnV0ZS4iKSxudWxsO2wuc2V0QXR0cmlidXRlKGgsdSl9Zm9yKGNvbnN0IGggaW4gYSl7Y29uc3QgdT1hW2hdWzBdLmxlbmd0aDtpZih1PT09MClicmVhaztsLm1vcnBoQXR0cmlidXRlcz1sLm1vcnBoQXR0cmlidXRlc3x8e30sbC5tb3JwaEF0dHJpYnV0ZXNbaF09W107Zm9yKGxldCBmPTA7Zjx1OysrZil7Y29uc3QgZD1bXTtmb3IobGV0IF89MDtfPGFbaF0ubGVuZ3RoOysrXylkLnB1c2goYVtoXVtfXVtmXSk7Y29uc3QgcD1vMChkKTtpZighcClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlR2VvbWV0cmllcygpIGZhaWxlZCB3aGlsZSB0cnlpbmcgdG8gbWVyZ2UgdGhlICIraCsiIG1vcnBoQXR0cmlidXRlLiIpLG51bGw7bC5tb3JwaEF0dHJpYnV0ZXNbaF0ucHVzaChwKX19cmV0dXJuIGU9PT0yP0J3KGwpOmx9ZnVuY3Rpb24gbzAocil7bGV0IGUsdCxuLGk9LTEscz0wO2ZvcihsZXQgYz0wO2M8ci5sZW5ndGg7KytjKXtjb25zdCBoPXJbY107aWYoaC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuIiksbnVsbDtpZihlPT09dm9pZCAwJiYoZT1oLmFycmF5LmNvbnN0cnVjdG9yKSxlIT09aC5hcnJheS5jb25zdHJ1Y3RvcilyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmFycmF5IG11c3QgYmUgb2YgY29uc2lzdGVudCBhcnJheSB0eXBlcyBhY3Jvc3MgbWF0Y2hpbmcgYXR0cmlidXRlcy4iKSxudWxsO2lmKHQ9PT12b2lkIDAmJih0PWguaXRlbVNpemUpLHQhPT1oLml0ZW1TaXplKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUuaXRlbVNpemUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7aWYobj09PXZvaWQgMCYmKG49aC5ub3JtYWxpemVkKSxuIT09aC5ub3JtYWxpemVkKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzOiAubWVyZ2VBdHRyaWJ1dGVzKCkgZmFpbGVkLiBCdWZmZXJBdHRyaWJ1dGUubm9ybWFsaXplZCBtdXN0IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG1hdGNoaW5nIGF0dHJpYnV0ZXMuIiksbnVsbDtpZihpPT09LTEmJihpPWguZ3B1VHlwZSksaSE9PWguZ3B1VHlwZSlyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlsczogLm1lcmdlQXR0cmlidXRlcygpIGZhaWxlZC4gQnVmZmVyQXR0cmlidXRlLmdwdVR5cGUgbXVzdCBiZSBjb25zaXN0ZW50IGFjcm9zcyBtYXRjaGluZyBhdHRyaWJ1dGVzLiIpLG51bGw7cys9aC5hcnJheS5sZW5ndGh9Y29uc3QgYT1uZXcgZShzKTtsZXQgbz0wO2ZvcihsZXQgYz0wO2M8ci5sZW5ndGg7KytjKWEuc2V0KHJbY10uYXJyYXksbyksbys9cltjXS5hcnJheS5sZW5ndGg7Y29uc3QgbD1uZXcgS2UoYSx0LG4pO3JldHVybiBpIT09dm9pZCAwJiYobC5ncHVUeXBlPWkpLGx9ZnVuY3Rpb24gQncocil7aWYoci5ncm91cHMubGVuZ3RoPT09MClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeVV0aWxzLm1lcmdlR3JvdXBzKCk6IE5vIGdyb3VwcyBhcmUgZGVmaW5lZC4gTm90aGluZyB0byBtZXJnZS4iKSxyO2xldCBlPXIuZ3JvdXBzO2lmKGU9ZS5zb3J0KChhLG8pPT5hLm1hdGVyaWFsSW5kZXghPT1vLm1hdGVyaWFsSW5kZXg/YS5tYXRlcmlhbEluZGV4LW8ubWF0ZXJpYWxJbmRleDphLnN0YXJ0LW8uc3RhcnQpLHIuZ2V0SW5kZXgoKT09PW51bGwpe2NvbnN0IGE9ci5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksbz1bXTtmb3IobGV0IGw9MDtsPGEuY291bnQ7bCs9MylvLnB1c2gobCxsKzEsbCsyKTtyLnNldEluZGV4KG8pLG8ubGVuZ3RoPTB9Y29uc3QgdD1yLmdldEluZGV4KCksbj1bXTtmb3IobGV0IGE9MDthPGUubGVuZ3RoO2ErKyl7Y29uc3Qgbz1lW2FdLGw9by5zdGFydCxjPWwrby5jb3VudDtmb3IobGV0IGg9bDtoPGM7aCsrKW4ucHVzaCh0LmdldFgoaCkpfXIuZGlzcG9zZSgpLHIuc2V0SW5kZXgobiksbi5sZW5ndGg9MDtsZXQgaT0wO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKXtjb25zdCBvPWVbYV07by5zdGFydD1pLGkrPW8uY291bnR9bGV0IHM9ZVswXTtyLmdyb3Vwcz1bc107Zm9yKGxldCBhPTE7YTxlLmxlbmd0aDthKyspe2NvbnN0IG89ZVthXTtzLm1hdGVyaWFsSW5kZXg9PT1vLm1hdGVyaWFsSW5kZXg/cy5jb3VudCs9by5jb3VudDoocz1vLHIuZ3JvdXBzLnB1c2gocykpfXJldHVybiByfXZhciBHbD0ocixlKT0+e2NvbnN0IHQ9T3cocixlIT1udWxsP2U6MCksbj17fSxpPVtdLHM9T2JqZWN0LmtleXModC5hdHRyaWJ1dGVzKTtyZXR1cm4gdC5pbmRleCYmcy5wdXNoKCJpbmRleCIpLHMuZm9yRWFjaChhPT57Y29uc3Qgbz1hPT09ImluZGV4Ij90LmluZGV4OnQuYXR0cmlidXRlc1thXTtuW2FdPXthcnJheTpvLmFycmF5LGl0ZW1TaXplOm8uaXRlbVNpemV9LGkucHVzaChvLmFycmF5LmJ1ZmZlcil9KSxlJiYobi5ncm91cHM9dC5ncm91cHMpLHQuZGlzcG9zZSgpLHIuZm9yRWFjaChhPT57YS5kaXNwb3NlKCl9KSx7bWVzc2FnZTpuLHRyYW5zZmVyOml9fTtjb25zdCB6dz0oe2Nvb3JkaW5hdGVzQXJyOnIsc3BsaXQ6ZSxiYm94OnQsYmJveE9mZnNldDpuLGRlcHRoOmkscHJvamVjdGlvbjpzLHVzZUdyb3VwczphLGhhc1RvcDpvLGhhc0JvdHRvbTpsLGhhc1NpZGU6Y30pPT57Y29uc3QgaD1zJiZadShzKSx1PXIubWFwKHA9Pkp1KHAsaCkpO2xldCBmO2lmKHQpe2NvbnN0W3AsX109SnUoW1t0WzBdLHRbMV1dLFt0WzJdLHRbM11dXSxzIT1udWxsJiZzLnJvdGF0ZT9adSh3Zih2cih7fSxzKSx7cm90YXRlOnZvaWQgMH0pKTpoKTtuJiYocC54Kz1uWzBdLHAueSs9blsxXSxfLngrPW5bMl0sXy55Kz1uWzNdKSxmPW5ldyBEdChuZXcgUChwLngscC55LDApLG5ldyBQKF8ueCxfLnksMCkpfWNvbnN0IGQ9dS5tYXAoKHAsXyk9Pnt2YXIgZztyZXR1cm4gdzEoe3BvaW50czpwLHNwbGl0OmUsZGVwdGg6KGc9aVtfXSkhPW51bGw/ZzppWzBdLGhhc1RvcDpvLGhhc0JvdHRvbTpsLGhhc1NpZGU6Yyxib3gzOmZ9KX0pO3JldHVybiBHbChkLGEpfTtmdW5jdGlvbiBLdShyLGUsdCxuLGkpe2xldCBzO2lmKHI9ci5zdWJhcnJheXx8ci5zbGljZT9yOnIuYnVmZmVyLHQ9dC5zdWJhcnJheXx8dC5zbGljZT90OnQuYnVmZmVyLHI9ZT9yLnN1YmFycmF5P3Iuc3ViYXJyYXkoZSxpJiZlK2kpOnIuc2xpY2UoZSxpJiZlK2kpOnIsdC5zZXQpdC5zZXQocixuKTtlbHNlIGZvcihzPTA7czxyLmxlbmd0aDtzKyspdFtzK25dPXJbc107cmV0dXJuIHR9ZnVuY3Rpb24ga3cocil7cmV0dXJuIHIgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXk/cjpyIGluc3RhbmNlb2Yga2U/ci5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikuYXJyYXk6ci5tYXAoZT0+e2NvbnN0IHQ9QXJyYXkuaXNBcnJheShlKTtyZXR1cm4gZSBpbnN0YW5jZW9mIFA/W2UueCxlLnksZS56XTplIGluc3RhbmNlb2YgcT9bZS54LGUueSwwXTp0JiZlLmxlbmd0aD09PTM/W2VbMF0sZVsxXSxlWzJdXTp0JiZlLmxlbmd0aD09PTI/W2VbMF0sZVsxXSwwXTplfSkuZmxhdCgpfWNsYXNzIEd3IGV4dGVuZHMga2V7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaExpbmUiLHRoaXMuaXNNZXNoTGluZT0hMCx0aGlzLnBvc2l0aW9ucz1bXSx0aGlzLnByZXZpb3VzPVtdLHRoaXMubmV4dD1bXSx0aGlzLnNpZGU9W10sdGhpcy53aWR0aD1bXSx0aGlzLmluZGljZXNfYXJyYXk9W10sdGhpcy51dnM9W10sdGhpcy5jb3VudGVycz1bXSx0aGlzLndpZHRoQ2FsbGJhY2s9bnVsbCx0aGlzLl9wb2ludHM9W10sdGhpcy5tYXRyaXhXb3JsZD1uZXcgSWUsT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7cG9pbnRzOntlbnVtZXJhYmxlOiEwLGdldCgpe3JldHVybiB0aGlzLl9wb2ludHN9LHNldChlKXt0aGlzLnNldFBvaW50cyhlLHRoaXMud2lkdGhDYWxsYmFjayl9fX0pfXNldE1hdHJpeFdvcmxkKGUpe3RoaXMubWF0cml4V29ybGQ9ZX1zZXRQb2ludHMoZSx0KXtpZihlPWt3KGUpLHRoaXMuX3BvaW50cz1lLHRoaXMud2lkdGhDYWxsYmFjaz10IT1udWxsP3Q6bnVsbCx0aGlzLnBvc2l0aW9ucz1bXSx0aGlzLmNvdW50ZXJzPVtdLGUubGVuZ3RoJiZlWzBdaW5zdGFuY2VvZiBQKWZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCBpPWVbbl0scz1uLyhlLmxlbmd0aC0xKTt0aGlzLnBvc2l0aW9ucy5wdXNoKGkueCxpLnksaS56KSx0aGlzLnBvc2l0aW9ucy5wdXNoKGkueCxpLnksaS56KSx0aGlzLmNvdW50ZXJzLnB1c2gocyksdGhpcy5jb3VudGVycy5wdXNoKHMpfWVsc2UgZm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKz0zKXtjb25zdCBpPW4vKGUubGVuZ3RoLTEpO3RoaXMucG9zaXRpb25zLnB1c2goZVtuXSxlW24rMV0sZVtuKzJdKSx0aGlzLnBvc2l0aW9ucy5wdXNoKGVbbl0sZVtuKzFdLGVbbisyXSksdGhpcy5jb3VudGVycy5wdXNoKGkpLHRoaXMuY291bnRlcnMucHVzaChpKX10aGlzLnByb2Nlc3MoKX1jb21wYXJlVjMoZSx0KXtjb25zdCBuPWUqNixpPXQqNjtyZXR1cm4gdGhpcy5wb3NpdGlvbnNbbl09PT10aGlzLnBvc2l0aW9uc1tpXSYmdGhpcy5wb3NpdGlvbnNbbisxXT09PXRoaXMucG9zaXRpb25zW2krMV0mJnRoaXMucG9zaXRpb25zW24rMl09PT10aGlzLnBvc2l0aW9uc1tpKzJdfWNvcHlWMyhlKXtjb25zdCB0PWUqNjtyZXR1cm5bdGhpcy5wb3NpdGlvbnNbdF0sdGhpcy5wb3NpdGlvbnNbdCsxXSx0aGlzLnBvc2l0aW9uc1t0KzJdXX1wcm9jZXNzKCl7Y29uc3QgZT10aGlzLnBvc2l0aW9ucy5sZW5ndGgvNjt0aGlzLnByZXZpb3VzPVtdLHRoaXMubmV4dD1bXSx0aGlzLnNpZGU9W10sdGhpcy53aWR0aD1bXSx0aGlzLmluZGljZXNfYXJyYXk9W10sdGhpcy51dnM9W107bGV0IHQsbjt0aGlzLmNvbXBhcmVWMygwLGUtMSk/bj10aGlzLmNvcHlWMyhlLTIpOm49dGhpcy5jb3B5VjMoMCksdGhpcy5wcmV2aW91cy5wdXNoKG5bMF0sblsxXSxuWzJdKSx0aGlzLnByZXZpb3VzLnB1c2goblswXSxuWzFdLG5bMl0pO2ZvcihsZXQgaT0wO2k8ZTtpKyspe2lmKHRoaXMuc2lkZS5wdXNoKDEpLHRoaXMuc2lkZS5wdXNoKC0xKSx0aGlzLndpZHRoQ2FsbGJhY2s/dD10aGlzLndpZHRoQ2FsbGJhY2soaS8oZS0xKSk6dD0xLHRoaXMud2lkdGgucHVzaCh0KSx0aGlzLndpZHRoLnB1c2godCksdGhpcy51dnMucHVzaChpLyhlLTEpLDApLHRoaXMudXZzLnB1c2goaS8oZS0xKSwxKSxpPGUtMSl7bj10aGlzLmNvcHlWMyhpKSx0aGlzLnByZXZpb3VzLnB1c2goblswXSxuWzFdLG5bMl0pLHRoaXMucHJldmlvdXMucHVzaChuWzBdLG5bMV0sblsyXSk7Y29uc3Qgcz1pKjI7dGhpcy5pbmRpY2VzX2FycmF5LnB1c2gocyxzKzEscysyKSx0aGlzLmluZGljZXNfYXJyYXkucHVzaChzKzIscysxLHMrMyl9aT4wJiYobj10aGlzLmNvcHlWMyhpKSx0aGlzLm5leHQucHVzaChuWzBdLG5bMV0sblsyXSksdGhpcy5uZXh0LnB1c2goblswXSxuWzFdLG5bMl0pKX10aGlzLmNvbXBhcmVWMyhlLTEsMCk/bj10aGlzLmNvcHlWMygxKTpuPXRoaXMuY29weVYzKGUtMSksdGhpcy5uZXh0LnB1c2goblswXSxuWzFdLG5bMl0pLHRoaXMubmV4dC5wdXNoKG5bMF0sblsxXSxuWzJdKSwhdGhpcy5fYXR0cmlidXRlc3x8dGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5jb3VudCE9PXRoaXMucG9zaXRpb25zLmxlbmd0aD90aGlzLl9hdHRyaWJ1dGVzPXtwb3NpdGlvbjpuZXcgS2UobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvc2l0aW9ucyksMykscHJldmlvdXM6bmV3IEtlKG5ldyBGbG9hdDMyQXJyYXkodGhpcy5wcmV2aW91cyksMyksbmV4dDpuZXcgS2UobmV3IEZsb2F0MzJBcnJheSh0aGlzLm5leHQpLDMpLHNpZGU6bmV3IEtlKG5ldyBGbG9hdDMyQXJyYXkodGhpcy5zaWRlKSwxKSx3aWR0aDpuZXcgS2UobmV3IEZsb2F0MzJBcnJheSh0aGlzLndpZHRoKSwxKSx1djpuZXcgS2UobmV3IEZsb2F0MzJBcnJheSh0aGlzLnV2cyksMiksaW5kZXg6bmV3IEtlKG5ldyBVaW50MTZBcnJheSh0aGlzLmluZGljZXNfYXJyYXkpLDEpLGNvdW50ZXJzOm5ldyBLZShuZXcgRmxvYXQzMkFycmF5KHRoaXMuY291bnRlcnMpLDEpfToodGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLnBvc2l0aW9ucykpLHRoaXMuX2F0dHJpYnV0ZXMucG9zaXRpb24ubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cy5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLnByZXZpb3VzKSksdGhpcy5fYXR0cmlidXRlcy5wcmV2aW91cy5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLm5leHQuY29weUFycmF5KG5ldyBGbG9hdDMyQXJyYXkodGhpcy5uZXh0KSksdGhpcy5fYXR0cmlidXRlcy5uZXh0Lm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMuc2lkZS5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLnNpZGUpKSx0aGlzLl9hdHRyaWJ1dGVzLnNpZGUubmVlZHNVcGRhdGU9ITAsdGhpcy5fYXR0cmlidXRlcy53aWR0aC5jb3B5QXJyYXkobmV3IEZsb2F0MzJBcnJheSh0aGlzLndpZHRoKSksdGhpcy5fYXR0cmlidXRlcy53aWR0aC5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLnV2LmNvcHlBcnJheShuZXcgRmxvYXQzMkFycmF5KHRoaXMudXZzKSksdGhpcy5fYXR0cmlidXRlcy51di5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLmluZGV4LmNvcHlBcnJheShuZXcgVWludDE2QXJyYXkodGhpcy5pbmRpY2VzX2FycmF5KSksdGhpcy5fYXR0cmlidXRlcy5pbmRleC5uZWVkc1VwZGF0ZT0hMCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIix0aGlzLl9hdHRyaWJ1dGVzLnBvc2l0aW9uKSx0aGlzLnNldEF0dHJpYnV0ZSgicHJldmlvdXMiLHRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMpLHRoaXMuc2V0QXR0cmlidXRlKCJuZXh0Iix0aGlzLl9hdHRyaWJ1dGVzLm5leHQpLHRoaXMuc2V0QXR0cmlidXRlKCJzaWRlIix0aGlzLl9hdHRyaWJ1dGVzLnNpZGUpLHRoaXMuc2V0QXR0cmlidXRlKCJ3aWR0aCIsdGhpcy5fYXR0cmlidXRlcy53aWR0aCksdGhpcy5zZXRBdHRyaWJ1dGUoInV2Iix0aGlzLl9hdHRyaWJ1dGVzLnV2KSx0aGlzLnNldEF0dHJpYnV0ZSgiY291bnRlcnMiLHRoaXMuX2F0dHJpYnV0ZXMuY291bnRlcnMpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsdGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbiksdGhpcy5zZXRBdHRyaWJ1dGUoInByZXZpb3VzIix0aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzKSx0aGlzLnNldEF0dHJpYnV0ZSgibmV4dCIsdGhpcy5fYXR0cmlidXRlcy5uZXh0KSx0aGlzLnNldEF0dHJpYnV0ZSgic2lkZSIsdGhpcy5fYXR0cmlidXRlcy5zaWRlKSx0aGlzLnNldEF0dHJpYnV0ZSgid2lkdGgiLHRoaXMuX2F0dHJpYnV0ZXMud2lkdGgpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsdGhpcy5fYXR0cmlidXRlcy51diksdGhpcy5zZXRBdHRyaWJ1dGUoImNvdW50ZXJzIix0aGlzLl9hdHRyaWJ1dGVzLmNvdW50ZXJzKSx0aGlzLnNldEluZGV4KHRoaXMuX2F0dHJpYnV0ZXMuaW5kZXgpLHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKX1hZHZhbmNlKHt4OmUseTp0LHo6bn0pe2NvbnN0IGk9dGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheSxzPXRoaXMuX2F0dHJpYnV0ZXMucHJldmlvdXMuYXJyYXksYT10aGlzLl9hdHRyaWJ1dGVzLm5leHQuYXJyYXksbz1pLmxlbmd0aDtLdShpLDAscywwLG8pLEt1KGksNixpLDAsby02KSxpW28tNl09ZSxpW28tNV09dCxpW28tNF09bixpW28tM109ZSxpW28tMl09dCxpW28tMV09bixLdShpLDYsYSwwLG8tNiksYVtvLTZdPWUsYVtvLTVdPXQsYVtvLTRdPW4sYVtvLTNdPWUsYVtvLTJdPXQsYVtvLTFdPW4sdGhpcy5fYXR0cmlidXRlcy5wb3NpdGlvbi5uZWVkc1VwZGF0ZT0hMCx0aGlzLl9hdHRyaWJ1dGVzLnByZXZpb3VzLm5lZWRzVXBkYXRlPSEwLHRoaXMuX2F0dHJpYnV0ZXMubmV4dC5uZWVkc1VwZGF0ZT0hMH19dmFyIGwwPXI9Pntjb25zdHtzZXRQb2ludFdpZHRoOmUsbm9kZXM6dH09cixuPW5ldyBHdztyZXR1cm4gbi5zZXRQb2ludHModCxlKSxufTtjb25zdCBWdz0oe2Nvb3JkaW5hdGVzQXJyOnIscHJvamVjdGlvbjplLGxpbmVXaWR0aDp0LHVzZUdyb3VwczpufSk9Pntjb25zdCBpPWUmJlp1KGUpLGE9ci5tYXAobz0+SnUobyxpKSkubWFwKChvLGwpPT57dmFyIGg7Y29uc3QgYz0oaD10W2xdKSE9bnVsbD9oOnRbMF07cmV0dXJuIGwwKHtub2RlczpvLHNldFBvaW50V2lkdGg6KCk9PmN9KX0pO3JldHVybiBHbChhLG4pfTt2YXIgaHM9e30sSHc9e2dldCBleHBvcnRzKCl7cmV0dXJuIGhzfSxzZXQgZXhwb3J0cyhyKXtocz1yfX07SHcuZXhwb3J0cz1WbCxocy5kZWZhdWx0PVZsO2Z1bmN0aW9uIFZsKHIsZSx0KXt0PXR8fDI7dmFyIG49ZSYmZS5sZW5ndGgsaT1uP2VbMF0qdDpyLmxlbmd0aCxzPWMwKHIsMCxpLHQsITApLGE9W107aWYoIXN8fHMubmV4dD09PXMucHJldilyZXR1cm4gYTt2YXIgbyxsLGMsaCx1LGYsZDtpZihuJiYocz1ZdyhyLGUscyx0KSksci5sZW5ndGg+ODAqdCl7bz1jPXJbMF0sbD1oPXJbMV07Zm9yKHZhciBwPXQ7cDxpO3ArPXQpdT1yW3BdLGY9cltwKzFdLHU8byYmKG89dSksZjxsJiYobD1mKSx1PmMmJihjPXUpLGY+aCYmKGg9Zik7ZD1NYXRoLm1heChjLW8saC1sKSxkPWQhPT0wPzMyNzY3L2Q6MH1yZXR1cm4gU2EocyxhLHQsbyxsLGQsMCksYX1mdW5jdGlvbiBjMChyLGUsdCxuLGkpe3ZhciBzLGE7aWYoaT09PWVmKHIsZSx0LG4pPjApZm9yKHM9ZTtzPHQ7cys9bilhPWYwKHMscltzXSxyW3MrMV0sYSk7ZWxzZSBmb3Iocz10LW47cz49ZTtzLT1uKWE9ZjAocyxyW3NdLHJbcysxXSxhKTtyZXR1cm4gYSYmSGwoYSxhLm5leHQpJiYod2EoYSksYT1hLm5leHQpLGF9ZnVuY3Rpb24gcHIocixlKXtpZighcilyZXR1cm4gcjtlfHwoZT1yKTt2YXIgdD1yLG47ZG8gaWYobj0hMSwhdC5zdGVpbmVyJiYoSGwodCx0Lm5leHQpfHxtdCh0LnByZXYsdCx0Lm5leHQpPT09MCkpe2lmKHdhKHQpLHQ9ZT10LnByZXYsdD09PXQubmV4dClicmVhaztuPSEwfWVsc2UgdD10Lm5leHQ7d2hpbGUobnx8dCE9PWUpO3JldHVybiBlfWZ1bmN0aW9uIFNhKHIsZSx0LG4saSxzLGEpe2lmKHIpeyFhJiZzJiZqdyhyLG4saSxzKTtmb3IodmFyIG89cixsLGM7ci5wcmV2IT09ci5uZXh0Oyl7aWYobD1yLnByZXYsYz1yLm5leHQscz9YdyhyLG4saSxzKTpXdyhyKSl7ZS5wdXNoKGwuaS90fDApLGUucHVzaChyLmkvdHwwKSxlLnB1c2goYy5pL3R8MCksd2Eocikscj1jLm5leHQsbz1jLm5leHQ7Y29udGludWV9aWYocj1jLHI9PT1vKXthP2E9PT0xPyhyPXF3KHByKHIpLGUsdCksU2EocixlLHQsbixpLHMsMikpOmE9PT0yJiYkdyhyLGUsdCxuLGkscyk6U2EocHIociksZSx0LG4saSxzLDEpO2JyZWFrfX19fWZ1bmN0aW9uIFd3KHIpe3ZhciBlPXIucHJldix0PXIsbj1yLm5leHQ7aWYobXQoZSx0LG4pPj0wKXJldHVybiExO2Zvcih2YXIgaT1lLngscz10LngsYT1uLngsbz1lLnksbD10LnksYz1uLnksaD1pPHM/aTxhP2k6YTpzPGE/czphLHU9bzxsP288Yz9vOmM6bDxjP2w6YyxmPWk+cz9pPmE/aTphOnM+YT9zOmEsZD1vPmw/bz5jP286YzpsPmM/bDpjLHA9bi5uZXh0O3AhPT1lOyl7aWYocC54Pj1oJiZwLng8PWYmJnAueT49dSYmcC55PD1kJiZ1cyhpLG8scyxsLGEsYyxwLngscC55KSYmbXQocC5wcmV2LHAscC5uZXh0KT49MClyZXR1cm4hMTtwPXAubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBYdyhyLGUsdCxuKXt2YXIgaT1yLnByZXYscz1yLGE9ci5uZXh0O2lmKG10KGkscyxhKT49MClyZXR1cm4hMTtmb3IodmFyIG89aS54LGw9cy54LGM9YS54LGg9aS55LHU9cy55LGY9YS55LGQ9bzxsP288Yz9vOmM6bDxjP2w6YyxwPWg8dT9oPGY/aDpmOnU8Zj91OmYsXz1vPmw/bz5jP286YzpsPmM/bDpjLGc9aD51P2g+Zj9oOmY6dT5mP3U6ZixtPVF1KGQscCxlLHQsbikseT1RdShfLGcsZSx0LG4pLHg9ci5wcmV2Wix2PXIubmV4dFo7eCYmeC56Pj1tJiZ2JiZ2Lno8PXk7KXtpZih4Lng+PWQmJngueDw9XyYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1pJiZ4IT09YSYmdXMobyxoLGwsdSxjLGYseC54LHgueSkmJm10KHgucHJldix4LHgubmV4dCk+PTB8fCh4PXgucHJldlosdi54Pj1kJiZ2Lng8PV8mJnYueT49cCYmdi55PD1nJiZ2IT09aSYmdiE9PWEmJnVzKG8saCxsLHUsYyxmLHYueCx2LnkpJiZtdCh2LnByZXYsdix2Lm5leHQpPj0wKSlyZXR1cm4hMTt2PXYubmV4dFp9Zm9yKDt4JiZ4Lno+PW07KXtpZih4Lng+PWQmJngueDw9XyYmeC55Pj1wJiZ4Lnk8PWcmJnghPT1pJiZ4IT09YSYmdXMobyxoLGwsdSxjLGYseC54LHgueSkmJm10KHgucHJldix4LHgubmV4dCk+PTApcmV0dXJuITE7eD14LnByZXZafWZvcig7diYmdi56PD15Oyl7aWYodi54Pj1kJiZ2Lng8PV8mJnYueT49cCYmdi55PD1nJiZ2IT09aSYmdiE9PWEmJnVzKG8saCxsLHUsYyxmLHYueCx2LnkpJiZtdCh2LnByZXYsdix2Lm5leHQpPj0wKXJldHVybiExO3Y9di5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiBxdyhyLGUsdCl7dmFyIG49cjtkb3t2YXIgaT1uLnByZXYscz1uLm5leHQubmV4dDshSGwoaSxzKSYmaDAoaSxuLG4ubmV4dCxzKSYmYmEoaSxzKSYmYmEocyxpKSYmKGUucHVzaChpLmkvdHwwKSxlLnB1c2gobi5pL3R8MCksZS5wdXNoKHMuaS90fDApLHdhKG4pLHdhKG4ubmV4dCksbj1yPXMpLG49bi5uZXh0fXdoaWxlKG4hPT1yKTtyZXR1cm4gcHIobil9ZnVuY3Rpb24gJHcocixlLHQsbixpLHMpe3ZhciBhPXI7ZG97Zm9yKHZhciBvPWEubmV4dC5uZXh0O28hPT1hLnByZXY7KXtpZihhLmkhPT1vLmkmJm5FKGEsbykpe3ZhciBsPXUwKGEsbyk7YT1wcihhLGEubmV4dCksbD1wcihsLGwubmV4dCksU2EoYSxlLHQsbixpLHMsMCksU2EobCxlLHQsbixpLHMsMCk7cmV0dXJufW89by5uZXh0fWE9YS5uZXh0fXdoaWxlKGEhPT1yKX1mdW5jdGlvbiBZdyhyLGUsdCxuKXt2YXIgaT1bXSxzLGEsbyxsLGM7Zm9yKHM9MCxhPWUubGVuZ3RoO3M8YTtzKyspbz1lW3NdKm4sbD1zPGEtMT9lW3MrMV0qbjpyLmxlbmd0aCxjPWMwKHIsbyxsLG4sITEpLGM9PT1jLm5leHQmJihjLnN0ZWluZXI9ITApLGkucHVzaCh0RShjKSk7Zm9yKGkuc29ydChadykscz0wO3M8aS5sZW5ndGg7cysrKXQ9SncoaVtzXSx0KTtyZXR1cm4gdH1mdW5jdGlvbiBadyhyLGUpe3JldHVybiByLngtZS54fWZ1bmN0aW9uIEp3KHIsZSl7dmFyIHQ9S3cocixlKTtpZighdClyZXR1cm4gZTt2YXIgbj11MCh0LHIpO3JldHVybiBwcihuLG4ubmV4dCkscHIodCx0Lm5leHQpfWZ1bmN0aW9uIEt3KHIsZSl7dmFyIHQ9ZSxuPXIueCxpPXIueSxzPS0xLzAsYTtkb3tpZihpPD10LnkmJmk+PXQubmV4dC55JiZ0Lm5leHQueSE9PXQueSl7dmFyIG89dC54KyhpLXQueSkqKHQubmV4dC54LXQueCkvKHQubmV4dC55LXQueSk7aWYobzw9biYmbz5zJiYocz1vLGE9dC54PHQubmV4dC54P3Q6dC5uZXh0LG89PT1uKSlyZXR1cm4gYX10PXQubmV4dH13aGlsZSh0IT09ZSk7aWYoIWEpcmV0dXJuIG51bGw7dmFyIGw9YSxjPWEueCxoPWEueSx1PTEvMCxmO3Q9YTtkbyBuPj10LngmJnQueD49YyYmbiE9PXQueCYmdXMoaTxoP246cyxpLGMsaCxpPGg/czpuLGksdC54LHQueSkmJihmPU1hdGguYWJzKGktdC55KS8obi10LngpLGJhKHQscikmJihmPHV8fGY9PT11JiYodC54PmEueHx8dC54PT09YS54JiZRdyhhLHQpKSkmJihhPXQsdT1mKSksdD10Lm5leHQ7d2hpbGUodCE9PWwpO3JldHVybiBhfWZ1bmN0aW9uIFF3KHIsZSl7cmV0dXJuIG10KHIucHJldixyLGUucHJldik8MCYmbXQoZS5uZXh0LHIsci5uZXh0KTwwfWZ1bmN0aW9uIGp3KHIsZSx0LG4pe3ZhciBpPXI7ZG8gaS56PT09MCYmKGkuej1RdShpLngsaS55LGUsdCxuKSksaS5wcmV2Wj1pLnByZXYsaS5uZXh0Wj1pLm5leHQsaT1pLm5leHQ7d2hpbGUoaSE9PXIpO2kucHJldloubmV4dFo9bnVsbCxpLnByZXZaPW51bGwsZUUoaSl9ZnVuY3Rpb24gZUUocil7dmFyIGUsdCxuLGkscyxhLG8sbCxjPTE7ZG97Zm9yKHQ9cixyPW51bGwscz1udWxsLGE9MDt0Oyl7Zm9yKGErKyxuPXQsbz0wLGU9MDtlPGMmJihvKyssbj1uLm5leHRaLCEhbik7ZSsrKTtmb3IobD1jO28+MHx8bD4wJiZuOylvIT09MCYmKGw9PT0wfHwhbnx8dC56PD1uLnopPyhpPXQsdD10Lm5leHRaLG8tLSk6KGk9bixuPW4ubmV4dFosbC0tKSxzP3MubmV4dFo9aTpyPWksaS5wcmV2Wj1zLHM9aTt0PW59cy5uZXh0Wj1udWxsLGMqPTJ9d2hpbGUoYT4xKTtyZXR1cm4gcn1mdW5jdGlvbiBRdShyLGUsdCxuLGkpe3JldHVybiByPShyLXQpKml8MCxlPShlLW4pKml8MCxyPShyfHI8PDgpJjE2NzExOTM1LHI9KHJ8cjw8NCkmMjUyNjQ1MTM1LHI9KHJ8cjw8MikmODU4OTkzNDU5LHI9KHJ8cjw8MSkmMTQzMTY1NTc2NSxlPShlfGU8PDgpJjE2NzExOTM1LGU9KGV8ZTw8NCkmMjUyNjQ1MTM1LGU9KGV8ZTw8MikmODU4OTkzNDU5LGU9KGV8ZTw8MSkmMTQzMTY1NTc2NSxyfGU8PDF9ZnVuY3Rpb24gdEUocil7dmFyIGU9cix0PXI7ZG8oZS54PHQueHx8ZS54PT09dC54JiZlLnk8dC55KSYmKHQ9ZSksZT1lLm5leHQ7d2hpbGUoZSE9PXIpO3JldHVybiB0fWZ1bmN0aW9uIHVzKHIsZSx0LG4saSxzLGEsbyl7cmV0dXJuKGktYSkqKGUtbyk+PShyLWEpKihzLW8pJiYoci1hKSoobi1vKT49KHQtYSkqKGUtbykmJih0LWEpKihzLW8pPj0oaS1hKSoobi1vKX1mdW5jdGlvbiBuRShyLGUpe3JldHVybiByLm5leHQuaSE9PWUuaSYmci5wcmV2LmkhPT1lLmkmJiFpRShyLGUpJiYoYmEocixlKSYmYmEoZSxyKSYmckUocixlKSYmKG10KHIucHJldixyLGUucHJldil8fG10KHIsZS5wcmV2LGUpKXx8SGwocixlKSYmbXQoci5wcmV2LHIsci5uZXh0KT4wJiZtdChlLnByZXYsZSxlLm5leHQpPjApfWZ1bmN0aW9uIG10KHIsZSx0KXtyZXR1cm4oZS55LXIueSkqKHQueC1lLngpLShlLngtci54KSoodC55LWUueSl9ZnVuY3Rpb24gSGwocixlKXtyZXR1cm4gci54PT09ZS54JiZyLnk9PT1lLnl9ZnVuY3Rpb24gaDAocixlLHQsbil7dmFyIGk9WGwobXQocixlLHQpKSxzPVhsKG10KHIsZSxuKSksYT1YbChtdCh0LG4scikpLG89WGwobXQodCxuLGUpKTtyZXR1cm4hIShpIT09cyYmYSE9PW98fGk9PT0wJiZXbChyLHQsZSl8fHM9PT0wJiZXbChyLG4sZSl8fGE9PT0wJiZXbCh0LHIsbil8fG89PT0wJiZXbCh0LGUsbikpfWZ1bmN0aW9uIFdsKHIsZSx0KXtyZXR1cm4gZS54PD1NYXRoLm1heChyLngsdC54KSYmZS54Pj1NYXRoLm1pbihyLngsdC54KSYmZS55PD1NYXRoLm1heChyLnksdC55KSYmZS55Pj1NYXRoLm1pbihyLnksdC55KX1mdW5jdGlvbiBYbChyKXtyZXR1cm4gcj4wPzE6cjwwPy0xOjB9ZnVuY3Rpb24gaUUocixlKXt2YXIgdD1yO2Rve2lmKHQuaSE9PXIuaSYmdC5uZXh0LmkhPT1yLmkmJnQuaSE9PWUuaSYmdC5uZXh0LmkhPT1lLmkmJmgwKHQsdC5uZXh0LHIsZSkpcmV0dXJuITA7dD10Lm5leHR9d2hpbGUodCE9PXIpO3JldHVybiExfWZ1bmN0aW9uIGJhKHIsZSl7cmV0dXJuIG10KHIucHJldixyLHIubmV4dCk8MD9tdChyLGUsci5uZXh0KT49MCYmbXQocixyLnByZXYsZSk+PTA6bXQocixlLHIucHJldik8MHx8bXQocixyLm5leHQsZSk8MH1mdW5jdGlvbiByRShyLGUpe3ZhciB0PXIsbj0hMSxpPShyLngrZS54KS8yLHM9KHIueStlLnkpLzI7ZG8gdC55PnMhPXQubmV4dC55PnMmJnQubmV4dC55IT09dC55JiZpPCh0Lm5leHQueC10LngpKihzLXQueSkvKHQubmV4dC55LXQueSkrdC54JiYobj0hbiksdD10Lm5leHQ7d2hpbGUodCE9PXIpO3JldHVybiBufWZ1bmN0aW9uIHUwKHIsZSl7dmFyIHQ9bmV3IGp1KHIuaSxyLngsci55KSxuPW5ldyBqdShlLmksZS54LGUueSksaT1yLm5leHQscz1lLnByZXY7cmV0dXJuIHIubmV4dD1lLGUucHJldj1yLHQubmV4dD1pLGkucHJldj10LG4ubmV4dD10LHQucHJldj1uLHMubmV4dD1uLG4ucHJldj1zLG59ZnVuY3Rpb24gZjAocixlLHQsbil7dmFyIGk9bmV3IGp1KHIsZSx0KTtyZXR1cm4gbj8oaS5uZXh0PW4ubmV4dCxpLnByZXY9bixuLm5leHQucHJldj1pLG4ubmV4dD1pKTooaS5wcmV2PWksaS5uZXh0PWkpLGl9ZnVuY3Rpb24gd2Eocil7ci5uZXh0LnByZXY9ci5wcmV2LHIucHJldi5uZXh0PXIubmV4dCxyLnByZXZaJiYoci5wcmV2Wi5uZXh0Wj1yLm5leHRaKSxyLm5leHRaJiYoci5uZXh0Wi5wcmV2Wj1yLnByZXZaKX1mdW5jdGlvbiBqdShyLGUsdCl7dGhpcy5pPXIsdGhpcy54PWUsdGhpcy55PXQsdGhpcy5wcmV2PW51bGwsdGhpcy5uZXh0PW51bGwsdGhpcy56PTAsdGhpcy5wcmV2Wj1udWxsLHRoaXMubmV4dFo9bnVsbCx0aGlzLnN0ZWluZXI9ITF9VmwuZGV2aWF0aW9uPWZ1bmN0aW9uKHIsZSx0LG4pe3ZhciBpPWUmJmUubGVuZ3RoLHM9aT9lWzBdKnQ6ci5sZW5ndGgsYT1NYXRoLmFicyhlZihyLDAscyx0KSk7aWYoaSlmb3IodmFyIG89MCxsPWUubGVuZ3RoO288bDtvKyspe3ZhciBjPWVbb10qdCxoPW88bC0xP2VbbysxXSp0OnIubGVuZ3RoO2EtPU1hdGguYWJzKGVmKHIsYyxoLHQpKX12YXIgdT0wO2ZvcihvPTA7bzxuLmxlbmd0aDtvKz0zKXt2YXIgZj1uW29dKnQsZD1uW28rMV0qdCxwPW5bbysyXSp0O3UrPU1hdGguYWJzKChyW2ZdLXJbcF0pKihyW2QrMV0tcltmKzFdKS0ocltmXS1yW2RdKSoocltwKzFdLXJbZisxXSkpfXJldHVybiBhPT09MCYmdT09PTA/MDpNYXRoLmFicygodS1hKS9hKX07ZnVuY3Rpb24gZWYocixlLHQsbil7Zm9yKHZhciBpPTAscz1lLGE9dC1uO3M8dDtzKz1uKWkrPShyW2FdLXJbc10pKihyW3MrMV0rclthKzFdKSxhPXM7cmV0dXJuIGl9VmwuZmxhdHRlbj1mdW5jdGlvbihyKXtmb3IodmFyIGU9clswXVswXS5sZW5ndGgsdD17dmVydGljZXM6W10saG9sZXM6W10sZGltZW5zaW9uczplfSxuPTAsaT0wO2k8ci5sZW5ndGg7aSsrKXtmb3IodmFyIHM9MDtzPHJbaV0ubGVuZ3RoO3MrKylmb3IodmFyIGE9MDthPGU7YSsrKXQudmVydGljZXMucHVzaChyW2ldW3NdW2FdKTtpPjAmJihuKz1yW2ktMV0ubGVuZ3RoLHQuaG9sZXMucHVzaChuKSl9cmV0dXJuIHR9O2Z1bmN0aW9uIHNFKHIpe2lmKCFyKXRocm93IG5ldyBFcnJvcigiY29vcmQgaXMgcmVxdWlyZWQiKTtpZighQXJyYXkuaXNBcnJheShyKSl7aWYoci50eXBlPT09IkZlYXR1cmUiJiZyLmdlb21ldHJ5IT09bnVsbCYmci5nZW9tZXRyeS50eXBlPT09IlBvaW50IilyZXR1cm4gci5nZW9tZXRyeS5jb29yZGluYXRlcztpZihyLnR5cGU9PT0iUG9pbnQiKXJldHVybiByLmNvb3JkaW5hdGVzfWlmKEFycmF5LmlzQXJyYXkocikmJnIubGVuZ3RoPj0yJiYhQXJyYXkuaXNBcnJheShyWzBdKSYmIUFycmF5LmlzQXJyYXkoclsxXSkpcmV0dXJuIHI7dGhyb3cgbmV3IEVycm9yKCJjb29yZCBtdXN0IGJlIEdlb0pTT04gUG9pbnQgb3IgYW4gQXJyYXkgb2YgbnVtYmVycyIpfWZ1bmN0aW9uIGFFKHIpe2lmKEFycmF5LmlzQXJyYXkocikpcmV0dXJuIHI7aWYoci50eXBlPT09IkZlYXR1cmUiKXtpZihyLmdlb21ldHJ5IT09bnVsbClyZXR1cm4gci5nZW9tZXRyeS5jb29yZGluYXRlc31lbHNlIGlmKHIuY29vcmRpbmF0ZXMpcmV0dXJuIHIuY29vcmRpbmF0ZXM7dGhyb3cgbmV3IEVycm9yKCJjb29yZHMgbXVzdCBiZSBHZW9KU09OIEZlYXR1cmUsIEdlb21ldHJ5IE9iamVjdCBvciBhbiBBcnJheSIpfWZ1bmN0aW9uIG9FKHIpe3JldHVybiByLnR5cGU9PT0iRmVhdHVyZSI/ci5nZW9tZXRyeTpyfWZ1bmN0aW9uIGxFKHIpe2Zvcih2YXIgZT1hRShyKSx0PTAsbj0xLGkscztuPGUubGVuZ3RoOylpPXN8fGVbMF0scz1lW25dLHQrPShzWzBdLWlbMF0pKihzWzFdK2lbMV0pLG4rKztyZXR1cm4gdD4wfWNvbnN0IGdpPTExMTAyMjMwMjQ2MjUxNTY1ZS0zMixxdD0xMzQyMTc3MjksY0U9KDMrOCpnaSkqZ2k7ZnVuY3Rpb24gdGYocixlLHQsbixpKXtsZXQgcyxhLG8sbCxjPWVbMF0saD1uWzBdLHU9MCxmPTA7aD5jPT1oPi1jPyhzPWMsYz1lWysrdV0pOihzPWgsaD1uWysrZl0pO2xldCBkPTA7aWYodTxyJiZmPHQpZm9yKGg+Yz09aD4tYz8oYT1jK3Msbz1zLShhLWMpLGM9ZVsrK3VdKTooYT1oK3Msbz1zLShhLWgpLGg9blsrK2ZdKSxzPWEsbyE9PTAmJihpW2QrK109byk7dTxyJiZmPHQ7KWg+Yz09aD4tYz8oYT1zK2MsbD1hLXMsbz1zLShhLWwpKyhjLWwpLGM9ZVsrK3VdKTooYT1zK2gsbD1hLXMsbz1zLShhLWwpKyhoLWwpLGg9blsrK2ZdKSxzPWEsbyE9PTAmJihpW2QrK109byk7Zm9yKDt1PHI7KWE9cytjLGw9YS1zLG89cy0oYS1sKSsoYy1sKSxjPWVbKyt1XSxzPWEsbyE9PTAmJihpW2QrK109byk7Zm9yKDtmPHQ7KWE9cytoLGw9YS1zLG89cy0oYS1sKSsoaC1sKSxoPW5bKytmXSxzPWEsbyE9PTAmJihpW2QrK109byk7cmV0dXJuKHMhPT0wfHxkPT09MCkmJihpW2QrK109cyksZH1mdW5jdGlvbiBoRShyLGUpe2xldCB0PWVbMF07Zm9yKGxldCBuPTE7bjxyO24rKyl0Kz1lW25dO3JldHVybiB0fWZ1bmN0aW9uIEVhKHIpe3JldHVybiBuZXcgRmxvYXQ2NEFycmF5KHIpfWNvbnN0IHVFPSgzKzE2KmdpKSpnaSxmRT0oMisxMipnaSkqZ2ksZEU9KDkrNjQqZ2kpKmdpKmdpLGZzPUVhKDQpLGQwPUVhKDgpLHAwPUVhKDEyKSxtMD1FYSgxNiksdG49RWEoNCk7ZnVuY3Rpb24gcEUocixlLHQsbixpLHMsYSl7bGV0IG8sbCxjLGgsdSxmLGQscCxfLGcsbSx5LHgsdixTLGIsQSxMO2NvbnN0IE09ci1pLHc9dC1pLFI9ZS1zLE49bi1zO3Y9TSpOLGY9cXQqTSxkPWYtKGYtTSkscD1NLWQsZj1xdCpOLF89Zi0oZi1OKSxnPU4tXyxTPXAqZy0odi1kKl8tcCpfLWQqZyksYj1SKncsZj1xdCpSLGQ9Zi0oZi1SKSxwPVItZCxmPXF0KncsXz1mLShmLXcpLGc9dy1fLEE9cCpnLShiLWQqXy1wKl8tZCpnKSxtPVMtQSx1PVMtbSxmc1swXT1TLShtK3UpKyh1LUEpLHk9dittLHU9eS12LHg9di0oeS11KSsobS11KSxtPXgtYix1PXgtbSxmc1sxXT14LShtK3UpKyh1LWIpLEw9eSttLHU9TC15LGZzWzJdPXktKEwtdSkrKG0tdSksZnNbM109TDtsZXQgQj1oRSg0LGZzKSxJPWZFKmE7aWYoQj49SXx8LUI+PUl8fCh1PXItTSxvPXItKE0rdSkrKHUtaSksdT10LXcsYz10LSh3K3UpKyh1LWkpLHU9ZS1SLGw9ZS0oUit1KSsodS1zKSx1PW4tTixoPW4tKE4rdSkrKHUtcyksbz09PTAmJmw9PT0wJiZjPT09MCYmaD09PTApfHwoST1kRSphK2NFKk1hdGguYWJzKEIpLEIrPU0qaCtOKm8tKFIqYyt3KmwpLEI+PUl8fC1CPj1JKSlyZXR1cm4gQjt2PW8qTixmPXF0Km8sZD1mLShmLW8pLHA9by1kLGY9cXQqTixfPWYtKGYtTiksZz1OLV8sUz1wKmctKHYtZCpfLXAqXy1kKmcpLGI9bCp3LGY9cXQqbCxkPWYtKGYtbCkscD1sLWQsZj1xdCp3LF89Zi0oZi13KSxnPXctXyxBPXAqZy0oYi1kKl8tcCpfLWQqZyksbT1TLUEsdT1TLW0sdG5bMF09Uy0obSt1KSsodS1BKSx5PXYrbSx1PXktdix4PXYtKHktdSkrKG0tdSksbT14LWIsdT14LW0sdG5bMV09eC0obSt1KSsodS1iKSxMPXkrbSx1PUwteSx0blsyXT15LShMLXUpKyhtLXUpLHRuWzNdPUw7Y29uc3QgVT10Zig0LGZzLDQsdG4sZDApO3Y9TSpoLGY9cXQqTSxkPWYtKGYtTSkscD1NLWQsZj1xdCpoLF89Zi0oZi1oKSxnPWgtXyxTPXAqZy0odi1kKl8tcCpfLWQqZyksYj1SKmMsZj1xdCpSLGQ9Zi0oZi1SKSxwPVItZCxmPXF0KmMsXz1mLShmLWMpLGc9Yy1fLEE9cCpnLShiLWQqXy1wKl8tZCpnKSxtPVMtQSx1PVMtbSx0blswXT1TLShtK3UpKyh1LUEpLHk9dittLHU9eS12LHg9di0oeS11KSsobS11KSxtPXgtYix1PXgtbSx0blsxXT14LShtK3UpKyh1LWIpLEw9eSttLHU9TC15LHRuWzJdPXktKEwtdSkrKG0tdSksdG5bM109TDtjb25zdCB6PXRmKFUsZDAsNCx0bixwMCk7dj1vKmgsZj1xdCpvLGQ9Zi0oZi1vKSxwPW8tZCxmPXF0KmgsXz1mLShmLWgpLGc9aC1fLFM9cCpnLSh2LWQqXy1wKl8tZCpnKSxiPWwqYyxmPXF0KmwsZD1mLShmLWwpLHA9bC1kLGY9cXQqYyxfPWYtKGYtYyksZz1jLV8sQT1wKmctKGItZCpfLXAqXy1kKmcpLG09Uy1BLHU9Uy1tLHRuWzBdPVMtKG0rdSkrKHUtQSkseT12K20sdT15LXYseD12LSh5LXUpKyhtLXUpLG09eC1iLHU9eC1tLHRuWzFdPXgtKG0rdSkrKHUtYiksTD15K20sdT1MLXksdG5bMl09eS0oTC11KSsobS11KSx0blszXT1MO2NvbnN0IEY9dGYoeixwMCw0LHRuLG0wKTtyZXR1cm4gbTBbRi0xXX1mdW5jdGlvbiBxbChyLGUsdCxuLGkscyl7Y29uc3QgYT0oZS1zKSoodC1pKSxvPShyLWkpKihuLXMpLGw9YS1vO2lmKGE9PT0wfHxvPT09MHx8YT4wIT1vPjApcmV0dXJuIGw7Y29uc3QgYz1NYXRoLmFicyhhK28pO3JldHVybiBNYXRoLmFicyhsKT49dUUqYz9sOi1wRShyLGUsdCxuLGkscyxjKX1jb25zdCBnMD1NYXRoLnBvdygyLC01MiksJGw9bmV3IFVpbnQzMkFycmF5KDUxMik7Y2xhc3MgQWF7c3RhdGljIGZyb20oZSx0PXlFLG49dkUpe2NvbnN0IGk9ZS5sZW5ndGgscz1uZXcgRmxvYXQ2NEFycmF5KGkqMik7Zm9yKGxldCBhPTA7YTxpO2ErKyl7Y29uc3Qgbz1lW2FdO3NbMiphXT10KG8pLHNbMiphKzFdPW4obyl9cmV0dXJuIG5ldyBBYShzKX1jb25zdHJ1Y3RvcihlKXtjb25zdCB0PWUubGVuZ3RoPj4xO2lmKHQ+MCYmdHlwZW9mIGVbMF0hPSJudW1iZXIiKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgY29vcmRzIHRvIGNvbnRhaW4gbnVtYmVycy4iKTt0aGlzLmNvb3Jkcz1lO2NvbnN0IG49TWF0aC5tYXgoMip0LTUsMCk7dGhpcy5fdHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheShuKjMpLHRoaXMuX2hhbGZlZGdlcz1uZXcgSW50MzJBcnJheShuKjMpLHRoaXMuX2hhc2hTaXplPU1hdGguY2VpbChNYXRoLnNxcnQodCkpLHRoaXMuX2h1bGxQcmV2PW5ldyBVaW50MzJBcnJheSh0KSx0aGlzLl9odWxsTmV4dD1uZXcgVWludDMyQXJyYXkodCksdGhpcy5faHVsbFRyaT1uZXcgVWludDMyQXJyYXkodCksdGhpcy5faHVsbEhhc2g9bmV3IEludDMyQXJyYXkodGhpcy5faGFzaFNpemUpLmZpbGwoLTEpLHRoaXMuX2lkcz1uZXcgVWludDMyQXJyYXkodCksdGhpcy5fZGlzdHM9bmV3IEZsb2F0NjRBcnJheSh0KSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZSgpe2NvbnN0e2Nvb3JkczplLF9odWxsUHJldjp0LF9odWxsTmV4dDpuLF9odWxsVHJpOmksX2h1bGxIYXNoOnN9PXRoaXMsYT1lLmxlbmd0aD4+MTtsZXQgbz0xLzAsbD0xLzAsYz0tMS8wLGg9LTEvMDtmb3IobGV0IHc9MDt3PGE7dysrKXtjb25zdCBSPWVbMip3XSxOPWVbMip3KzFdO1I8byYmKG89UiksTjxsJiYobD1OKSxSPmMmJihjPVIpLE4+aCYmKGg9TiksdGhpcy5faWRzW3ddPXd9Y29uc3QgdT0obytjKS8yLGY9KGwraCkvMjtsZXQgZD0xLzAscCxfLGc7Zm9yKGxldCB3PTA7dzxhO3crKyl7Y29uc3QgUj1uZih1LGYsZVsyKnddLGVbMip3KzFdKTtSPGQmJihwPXcsZD1SKX1jb25zdCBtPWVbMipwXSx5PWVbMipwKzFdO2Q9MS8wO2ZvcihsZXQgdz0wO3c8YTt3Kyspe2lmKHc9PT1wKWNvbnRpbnVlO2NvbnN0IFI9bmYobSx5LGVbMip3XSxlWzIqdysxXSk7UjxkJiZSPjAmJihfPXcsZD1SKX1sZXQgeD1lWzIqX10sdj1lWzIqXysxXSxTPTEvMDtmb3IobGV0IHc9MDt3PGE7dysrKXtpZih3PT09cHx8dz09PV8pY29udGludWU7Y29uc3QgUj1fRShtLHkseCx2LGVbMip3XSxlWzIqdysxXSk7UjxTJiYoZz13LFM9Uil9bGV0IGI9ZVsyKmddLEE9ZVsyKmcrMV07aWYoUz09PTEvMCl7Zm9yKGxldCBOPTA7TjxhO04rKyl0aGlzLl9kaXN0c1tOXT1lWzIqTl0tZVswXXx8ZVsyKk4rMV0tZVsxXTtkcyh0aGlzLl9pZHMsdGhpcy5fZGlzdHMsMCxhLTEpO2NvbnN0IHc9bmV3IFVpbnQzMkFycmF5KGEpO2xldCBSPTA7Zm9yKGxldCBOPTAsQj0tMS8wO048YTtOKyspe2NvbnN0IEk9dGhpcy5faWRzW05dO3RoaXMuX2Rpc3RzW0ldPkImJih3W1IrK109SSxCPXRoaXMuX2Rpc3RzW0ldKX10aGlzLmh1bGw9dy5zdWJhcnJheSgwLFIpLHRoaXMudHJpYW5nbGVzPW5ldyBVaW50MzJBcnJheSgwKSx0aGlzLmhhbGZlZGdlcz1uZXcgVWludDMyQXJyYXkoMCk7cmV0dXJufWlmKHFsKG0seSx4LHYsYixBKTwwKXtjb25zdCB3PV8sUj14LE49djtfPWcseD1iLHY9QSxnPXcsYj1SLEE9Tn1jb25zdCBMPXhFKG0seSx4LHYsYixBKTt0aGlzLl9jeD1MLngsdGhpcy5fY3k9TC55O2ZvcihsZXQgdz0wO3c8YTt3KyspdGhpcy5fZGlzdHNbd109bmYoZVsyKnddLGVbMip3KzFdLEwueCxMLnkpO2RzKHRoaXMuX2lkcyx0aGlzLl9kaXN0cywwLGEtMSksdGhpcy5faHVsbFN0YXJ0PXA7bGV0IE09MztuW3BdPXRbZ109XyxuW19dPXRbcF09ZyxuW2ddPXRbX109cCxpW3BdPTAsaVtfXT0xLGlbZ109MixzLmZpbGwoLTEpLHNbdGhpcy5faGFzaEtleShtLHkpXT1wLHNbdGhpcy5faGFzaEtleSh4LHYpXT1fLHNbdGhpcy5faGFzaEtleShiLEEpXT1nLHRoaXMudHJpYW5nbGVzTGVuPTAsdGhpcy5fYWRkVHJpYW5nbGUocCxfLGcsLTEsLTEsLTEpO2ZvcihsZXQgdz0wLFIsTjt3PHRoaXMuX2lkcy5sZW5ndGg7dysrKXtjb25zdCBCPXRoaXMuX2lkc1t3XSxJPWVbMipCXSxVPWVbMipCKzFdO2lmKHc+MCYmTWF0aC5hYnMoSS1SKTw9ZzAmJk1hdGguYWJzKFUtTik8PWcwfHwoUj1JLE49VSxCPT09cHx8Qj09PV98fEI9PT1nKSljb250aW51ZTtsZXQgej0wO2ZvcihsZXQgbmU9MCxmZT10aGlzLl9oYXNoS2V5KEksVSk7bmU8dGhpcy5faGFzaFNpemUmJih6PXNbKGZlK25lKSV0aGlzLl9oYXNoU2l6ZV0sISh6IT09LTEmJnohPT1uW3pdKSk7bmUrKyk7ej10W3pdO2xldCBGPXosWjtmb3IoO1o9bltGXSxxbChJLFUsZVsyKkZdLGVbMipGKzFdLGVbMipaXSxlWzIqWisxXSk+PTA7KWlmKEY9WixGPT09eil7Rj0tMTticmVha31pZihGPT09LTEpY29udGludWU7bGV0IFY9dGhpcy5fYWRkVHJpYW5nbGUoRixCLG5bRl0sLTEsLTEsaVtGXSk7aVtCXT10aGlzLl9sZWdhbGl6ZShWKzIpLGlbRl09VixNKys7bGV0IFE9bltGXTtmb3IoO1o9bltRXSxxbChJLFUsZVsyKlFdLGVbMipRKzFdLGVbMipaXSxlWzIqWisxXSk8MDspVj10aGlzLl9hZGRUcmlhbmdsZShRLEIsWixpW0JdLC0xLGlbUV0pLGlbQl09dGhpcy5fbGVnYWxpemUoVisyKSxuW1FdPVEsTS0tLFE9WjtpZihGPT09eilmb3IoO1o9dFtGXSxxbChJLFUsZVsyKlpdLGVbMipaKzFdLGVbMipGXSxlWzIqRisxXSk8MDspVj10aGlzLl9hZGRUcmlhbmdsZShaLEIsRiwtMSxpW0ZdLGlbWl0pLHRoaXMuX2xlZ2FsaXplKFYrMiksaVtaXT1WLG5bRl09RixNLS0sRj1aO3RoaXMuX2h1bGxTdGFydD10W0JdPUYsbltGXT10W1FdPUIsbltCXT1RLHNbdGhpcy5faGFzaEtleShJLFUpXT1CLHNbdGhpcy5faGFzaEtleShlWzIqRl0sZVsyKkYrMV0pXT1GfXRoaXMuaHVsbD1uZXcgVWludDMyQXJyYXkoTSk7Zm9yKGxldCB3PTAsUj10aGlzLl9odWxsU3RhcnQ7dzxNO3crKyl0aGlzLmh1bGxbd109UixSPW5bUl07dGhpcy50cmlhbmdsZXM9dGhpcy5fdHJpYW5nbGVzLnN1YmFycmF5KDAsdGhpcy50cmlhbmdsZXNMZW4pLHRoaXMuaGFsZmVkZ2VzPXRoaXMuX2hhbGZlZGdlcy5zdWJhcnJheSgwLHRoaXMudHJpYW5nbGVzTGVuKX1faGFzaEtleShlLHQpe3JldHVybiBNYXRoLmZsb29yKG1FKGUtdGhpcy5fY3gsdC10aGlzLl9jeSkqdGhpcy5faGFzaFNpemUpJXRoaXMuX2hhc2hTaXplfV9sZWdhbGl6ZShlKXtjb25zdHtfdHJpYW5nbGVzOnQsX2hhbGZlZGdlczpuLGNvb3JkczppfT10aGlzO2xldCBzPTAsYT0wO2Zvcig7Oyl7Y29uc3Qgbz1uW2VdLGw9ZS1lJTM7aWYoYT1sKyhlKzIpJTMsbz09PS0xKXtpZihzPT09MClicmVhaztlPSRsWy0tc107Y29udGludWV9Y29uc3QgYz1vLW8lMyxoPWwrKGUrMSklMyx1PWMrKG8rMiklMyxmPXRbYV0sZD10W2VdLHA9dFtoXSxfPXRbdV07aWYoZ0UoaVsyKmZdLGlbMipmKzFdLGlbMipkXSxpWzIqZCsxXSxpWzIqcF0saVsyKnArMV0saVsyKl9dLGlbMipfKzFdKSl7dFtlXT1fLHRbb109Zjtjb25zdCBtPW5bdV07aWYobT09PS0xKXtsZXQgeD10aGlzLl9odWxsU3RhcnQ7ZG97aWYodGhpcy5faHVsbFRyaVt4XT09PXUpe3RoaXMuX2h1bGxUcmlbeF09ZTticmVha314PXRoaXMuX2h1bGxQcmV2W3hdfXdoaWxlKHghPT10aGlzLl9odWxsU3RhcnQpfXRoaXMuX2xpbmsoZSxtKSx0aGlzLl9saW5rKG8sblthXSksdGhpcy5fbGluayhhLHUpO2NvbnN0IHk9YysobysxKSUzO3M8JGwubGVuZ3RoJiYoJGxbcysrXT15KX1lbHNle2lmKHM9PT0wKWJyZWFrO2U9JGxbLS1zXX19cmV0dXJuIGF9X2xpbmsoZSx0KXt0aGlzLl9oYWxmZWRnZXNbZV09dCx0IT09LTEmJih0aGlzLl9oYWxmZWRnZXNbdF09ZSl9X2FkZFRyaWFuZ2xlKGUsdCxuLGkscyxhKXtjb25zdCBvPXRoaXMudHJpYW5nbGVzTGVuO3JldHVybiB0aGlzLl90cmlhbmdsZXNbb109ZSx0aGlzLl90cmlhbmdsZXNbbysxXT10LHRoaXMuX3RyaWFuZ2xlc1tvKzJdPW4sdGhpcy5fbGluayhvLGkpLHRoaXMuX2xpbmsobysxLHMpLHRoaXMuX2xpbmsobysyLGEpLHRoaXMudHJpYW5nbGVzTGVuKz0zLG99fWZ1bmN0aW9uIG1FKHIsZSl7Y29uc3QgdD1yLyhNYXRoLmFicyhyKStNYXRoLmFicyhlKSk7cmV0dXJuKGU+MD8zLXQ6MSt0KS80fWZ1bmN0aW9uIG5mKHIsZSx0LG4pe2NvbnN0IGk9ci10LHM9ZS1uO3JldHVybiBpKmkrcypzfWZ1bmN0aW9uIGdFKHIsZSx0LG4saSxzLGEsbyl7Y29uc3QgbD1yLWEsYz1lLW8saD10LWEsdT1uLW8sZj1pLWEsZD1zLW8scD1sKmwrYypjLF89aCpoK3UqdSxnPWYqZitkKmQ7cmV0dXJuIGwqKHUqZy1fKmQpLWMqKGgqZy1fKmYpK3AqKGgqZC11KmYpPDB9ZnVuY3Rpb24gX0UocixlLHQsbixpLHMpe2NvbnN0IGE9dC1yLG89bi1lLGw9aS1yLGM9cy1lLGg9YSphK28qbyx1PWwqbCtjKmMsZj0uNS8oYSpjLW8qbCksZD0oYypoLW8qdSkqZixwPShhKnUtbCpoKSpmO3JldHVybiBkKmQrcCpwfWZ1bmN0aW9uIHhFKHIsZSx0LG4saSxzKXtjb25zdCBhPXQtcixvPW4tZSxsPWktcixjPXMtZSxoPWEqYStvKm8sdT1sKmwrYypjLGY9LjUvKGEqYy1vKmwpLGQ9cisoYypoLW8qdSkqZixwPWUrKGEqdS1sKmgpKmY7cmV0dXJue3g6ZCx5OnB9fWZ1bmN0aW9uIGRzKHIsZSx0LG4pe2lmKG4tdDw9MjApZm9yKGxldCBpPXQrMTtpPD1uO2krKyl7Y29uc3Qgcz1yW2ldLGE9ZVtzXTtsZXQgbz1pLTE7Zm9yKDtvPj10JiZlW3Jbb11dPmE7KXJbbysxXT1yW28tLV07cltvKzFdPXN9ZWxzZXtjb25zdCBpPXQrbj4+MTtsZXQgcz10KzEsYT1uO1RhKHIsaSxzKSxlW3JbdF1dPmVbcltuXV0mJlRhKHIsdCxuKSxlW3Jbc11dPmVbcltuXV0mJlRhKHIscyxuKSxlW3JbdF1dPmVbcltzXV0mJlRhKHIsdCxzKTtjb25zdCBvPXJbc10sbD1lW29dO2Zvcig7Oyl7ZG8gcysrO3doaWxlKGVbcltzXV08bCk7ZG8gYS0tO3doaWxlKGVbclthXV0+bCk7aWYoYTxzKWJyZWFrO1RhKHIscyxhKX1yW3QrMV09clthXSxyW2FdPW8sbi1zKzE+PWEtdD8oZHMocixlLHMsbiksZHMocixlLHQsYS0xKSk6KGRzKHIsZSx0LGEtMSksZHMocixlLHMsbikpfX1mdW5jdGlvbiBUYShyLGUsdCl7Y29uc3Qgbj1yW2VdO3JbZV09clt0XSxyW3RdPW59ZnVuY3Rpb24geUUocil7cmV0dXJuIHJbMF19ZnVuY3Rpb24gdkUocil7cmV0dXJuIHJbMV19ZnVuY3Rpb24gTUUocixlLHQpe2lmKHQ9PT12b2lkIDAmJih0PXt9KSwhcil0aHJvdyBuZXcgRXJyb3IoInBvaW50IGlzIHJlcXVpcmVkIik7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJwb2x5Z29uIGlzIHJlcXVpcmVkIik7dmFyIG49c0UociksaT1vRShlKSxzPWkudHlwZSxhPWUuYmJveCxvPWkuY29vcmRpbmF0ZXM7aWYoYSYmU0UobixhKT09PSExKXJldHVybiExO3M9PT0iUG9seWdvbiImJihvPVtvXSk7Zm9yKHZhciBsPSExLGM9MDtjPG8ubGVuZ3RoJiYhbDtjKyspaWYoXzAobixvW2NdWzBdLHQuaWdub3JlQm91bmRhcnkpKXtmb3IodmFyIGg9ITEsdT0xO3U8b1tjXS5sZW5ndGgmJiFoOylfMChuLG9bY11bdV0sIXQuaWdub3JlQm91bmRhcnkpJiYoaD0hMCksdSsrO2h8fChsPSEwKX1yZXR1cm4gbH1mdW5jdGlvbiBfMChyLGUsdCl7dmFyIG49ITE7ZVswXVswXT09PWVbZS5sZW5ndGgtMV1bMF0mJmVbMF1bMV09PT1lW2UubGVuZ3RoLTFdWzFdJiYoZT1lLnNsaWNlKDAsZS5sZW5ndGgtMSkpO2Zvcih2YXIgaT0wLHM9ZS5sZW5ndGgtMTtpPGUubGVuZ3RoO3M9aSsrKXt2YXIgYT1lW2ldWzBdLG89ZVtpXVsxXSxsPWVbc11bMF0sYz1lW3NdWzFdLGg9clsxXSooYS1sKStvKihsLXJbMF0pK2MqKHJbMF0tYSk9PT0wJiYoYS1yWzBdKSoobC1yWzBdKTw9MCYmKG8tclsxXSkqKGMtclsxXSk8PTA7aWYoaClyZXR1cm4hdDt2YXIgdT1vPnJbMV0hPWM+clsxXSYmclswXTwobC1hKSooclsxXS1vKS8oYy1vKSthO3UmJihuPSFuKX1yZXR1cm4gbn1mdW5jdGlvbiBTRShyLGUpe3JldHVybiBlWzBdPD1yWzBdJiZlWzFdPD1yWzFdJiZlWzJdPj1yWzBdJiZlWzNdPj1yWzFdfWNvbnN0IHgwPTFlLTY7Y2xhc3MgbXJ7Y29uc3RydWN0b3IoKXt0aGlzLl94MD10aGlzLl95MD10aGlzLl94MT10aGlzLl95MT1udWxsLHRoaXMuXz0iIn1tb3ZlVG8oZSx0KXt0aGlzLl8rPWBNJHt0aGlzLl94MD10aGlzLl94MT0rZX0sJHt0aGlzLl95MD10aGlzLl95MT0rdH1gfWNsb3NlUGF0aCgpe3RoaXMuX3gxIT09bnVsbCYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX1saW5lVG8oZSx0KXt0aGlzLl8rPWBMJHt0aGlzLl94MT0rZX0sJHt0aGlzLl95MT0rdH1gfWFyYyhlLHQsbil7ZT0rZSx0PSt0LG49K247Y29uc3QgaT1lK24scz10O2lmKG48MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1cyIpO3RoaXMuX3gxPT09bnVsbD90aGlzLl8rPWBNJHtpfSwke3N9YDooTWF0aC5hYnModGhpcy5feDEtaSk+eDB8fE1hdGguYWJzKHRoaXMuX3kxLXMpPngwKSYmKHRoaXMuXys9IkwiK2krIiwiK3MpLG4mJih0aGlzLl8rPWBBJHtufSwke259LDAsMSwxLCR7ZS1ufSwke3R9QSR7bn0sJHtufSwwLDEsMSwke3RoaXMuX3gxPWl9LCR7dGhpcy5feTE9c31gKX1yZWN0KGUsdCxuLGkpe3RoaXMuXys9YE0ke3RoaXMuX3gwPXRoaXMuX3gxPStlfSwke3RoaXMuX3kwPXRoaXMuX3kxPSt0fWgkeytufXYkeytpfWgkey1ufVpgfXZhbHVlKCl7cmV0dXJuIHRoaXMuX3x8bnVsbH19Y2xhc3MgcmZ7Y29uc3RydWN0b3IoKXt0aGlzLl89W119bW92ZVRvKGUsdCl7dGhpcy5fLnB1c2goW2UsdF0pfWNsb3NlUGF0aCgpe3RoaXMuXy5wdXNoKHRoaXMuX1swXS5zbGljZSgpKX1saW5lVG8oZSx0KXt0aGlzLl8ucHVzaChbZSx0XSl9dmFsdWUoKXtyZXR1cm4gdGhpcy5fLmxlbmd0aD90aGlzLl86bnVsbH19Y2xhc3MgYkV7Y29uc3RydWN0b3IoZSxbdCxuLGksc109WzAsMCw5NjAsNTAwXSl7aWYoISgoaT0raSk+PSh0PSt0KSl8fCEoKHM9K3MpPj0obj0rbikpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBib3VuZHMiKTt0aGlzLmRlbGF1bmF5PWUsdGhpcy5fY2lyY3VtY2VudGVycz1uZXcgRmxvYXQ2NEFycmF5KGUucG9pbnRzLmxlbmd0aCoyKSx0aGlzLnZlY3RvcnM9bmV3IEZsb2F0NjRBcnJheShlLnBvaW50cy5sZW5ndGgqMiksdGhpcy54bWF4PWksdGhpcy54bWluPXQsdGhpcy55bWF4PXMsdGhpcy55bWluPW4sdGhpcy5faW5pdCgpfXVwZGF0ZSgpe3JldHVybiB0aGlzLmRlbGF1bmF5LnVwZGF0ZSgpLHRoaXMuX2luaXQoKSx0aGlzfV9pbml0KCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czplLGh1bGw6dCx0cmlhbmdsZXM6bn0sdmVjdG9yczppfT10aGlzLHM9dGhpcy5jaXJjdW1jZW50ZXJzPXRoaXMuX2NpcmN1bWNlbnRlcnMuc3ViYXJyYXkoMCxuLmxlbmd0aC8zKjIpO2ZvcihsZXQgZD0wLHA9MCxfPW4ubGVuZ3RoLGcsbTtkPF87ZCs9MyxwKz0yKXtjb25zdCB5PW5bZF0qMix4PW5bZCsxXSoyLHY9bltkKzJdKjIsUz1lW3ldLGI9ZVt5KzFdLEE9ZVt4XSxMPWVbeCsxXSxNPWVbdl0sdz1lW3YrMV0sUj1BLVMsTj1MLWIsQj1NLVMsST13LWIsVT0oUipJLU4qQikqMjtpZihNYXRoLmFicyhVKTwxZS05KXtsZXQgej0xZTk7Y29uc3QgRj1uWzBdKjI7eio9TWF0aC5zaWduKChlW0ZdLVMpKkktKGVbRisxXS1iKSpCKSxnPShTK00pLzIteipJLG09KGIrdykvMit6KkJ9ZWxzZXtjb25zdCB6PTEvVSxGPVIqUitOKk4sWj1CKkIrSSpJO2c9UysoSSpGLU4qWikqeixtPWIrKFIqWi1CKkYpKnp9c1twXT1nLHNbcCsxXT1tfWxldCBhPXRbdC5sZW5ndGgtMV0sbyxsPWEqNCxjLGg9ZVsyKmFdLHUsZj1lWzIqYSsxXTtpLmZpbGwoMCk7Zm9yKGxldCBkPTA7ZDx0Lmxlbmd0aDsrK2QpYT10W2RdLG89bCxjPWgsdT1mLGw9YSo0LGg9ZVsyKmFdLGY9ZVsyKmErMV0saVtvKzJdPWlbbF09dS1mLGlbbyszXT1pW2wrMV09aC1jfXJlbmRlcihlKXtjb25zdCB0PWU9PW51bGw/ZT1uZXcgbXI6dm9pZCAwLHtkZWxhdW5heTp7aGFsZmVkZ2VzOm4saW5lZGdlczppLGh1bGw6c30sY2lyY3VtY2VudGVyczphLHZlY3RvcnM6b309dGhpcztpZihzLmxlbmd0aDw9MSlyZXR1cm4gbnVsbDtmb3IobGV0IGg9MCx1PW4ubGVuZ3RoO2g8dTsrK2gpe2NvbnN0IGY9bltoXTtpZihmPGgpY29udGludWU7Y29uc3QgZD1NYXRoLmZsb29yKGgvMykqMixwPU1hdGguZmxvb3IoZi8zKSoyLF89YVtkXSxnPWFbZCsxXSxtPWFbcF0seT1hW3ArMV07dGhpcy5fcmVuZGVyU2VnbWVudChfLGcsbSx5LGUpfWxldCBsLGM9c1tzLmxlbmd0aC0xXTtmb3IobGV0IGg9MDtoPHMubGVuZ3RoOysraCl7bD1jLGM9c1toXTtjb25zdCB1PU1hdGguZmxvb3IoaVtjXS8zKSoyLGY9YVt1XSxkPWFbdSsxXSxwPWwqNCxfPXRoaXMuX3Byb2plY3QoZixkLG9bcCsyXSxvW3ArM10pO18mJnRoaXMuX3JlbmRlclNlZ21lbnQoZixkLF9bMF0sX1sxXSxlKX1yZXR1cm4gdCYmdC52YWx1ZSgpfXJlbmRlckJvdW5kcyhlKXtjb25zdCB0PWU9PW51bGw/ZT1uZXcgbXI6dm9pZCAwO3JldHVybiBlLnJlY3QodGhpcy54bWluLHRoaXMueW1pbix0aGlzLnhtYXgtdGhpcy54bWluLHRoaXMueW1heC10aGlzLnltaW4pLHQmJnQudmFsdWUoKX1yZW5kZXJDZWxsKGUsdCl7Y29uc3Qgbj10PT1udWxsP3Q9bmV3IG1yOnZvaWQgMCxpPXRoaXMuX2NsaXAoZSk7aWYoaT09PW51bGx8fCFpLmxlbmd0aClyZXR1cm47dC5tb3ZlVG8oaVswXSxpWzFdKTtsZXQgcz1pLmxlbmd0aDtmb3IoO2lbMF09PT1pW3MtMl0mJmlbMV09PT1pW3MtMV0mJnM+MTspcy09Mjtmb3IobGV0IGE9MjthPHM7YSs9MikoaVthXSE9PWlbYS0yXXx8aVthKzFdIT09aVthLTFdKSYmdC5saW5lVG8oaVthXSxpW2ErMV0pO3JldHVybiB0LmNsb3NlUGF0aCgpLG4mJm4udmFsdWUoKX0qY2VsbFBvbHlnb25zKCl7Y29uc3R7ZGVsYXVuYXk6e3BvaW50czplfX09dGhpcztmb3IobGV0IHQ9MCxuPWUubGVuZ3RoLzI7dDxuOysrdCl7Y29uc3QgaT10aGlzLmNlbGxQb2x5Z29uKHQpO2kmJihpLmluZGV4PXQseWllbGQgaSl9fWNlbGxQb2x5Z29uKGUpe2NvbnN0IHQ9bmV3IHJmO3JldHVybiB0aGlzLnJlbmRlckNlbGwoZSx0KSx0LnZhbHVlKCl9X3JlbmRlclNlZ21lbnQoZSx0LG4saSxzKXtsZXQgYTtjb25zdCBvPXRoaXMuX3JlZ2lvbmNvZGUoZSx0KSxsPXRoaXMuX3JlZ2lvbmNvZGUobixpKTtvPT09MCYmbD09PTA/KHMubW92ZVRvKGUsdCkscy5saW5lVG8obixpKSk6KGE9dGhpcy5fY2xpcFNlZ21lbnQoZSx0LG4saSxvLGwpKSYmKHMubW92ZVRvKGFbMF0sYVsxXSkscy5saW5lVG8oYVsyXSxhWzNdKSl9Y29udGFpbnMoZSx0LG4pe3JldHVybiB0PSt0LHQhPT10fHwobj0rbixuIT09bik/ITE6dGhpcy5kZWxhdW5heS5fc3RlcChlLHQsbik9PT1lfSpuZWlnaGJvcnMoZSl7Y29uc3QgdD10aGlzLl9jbGlwKGUpO2lmKHQpZm9yKGNvbnN0IG4gb2YgdGhpcy5kZWxhdW5heS5uZWlnaGJvcnMoZSkpe2NvbnN0IGk9dGhpcy5fY2xpcChuKTtpZihpKXtlOmZvcihsZXQgcz0wLGE9dC5sZW5ndGg7czxhO3MrPTIpZm9yKGxldCBvPTAsbD1pLmxlbmd0aDtvPGw7bys9MilpZih0W3NdPT1pW29dJiZ0W3MrMV09PWlbbysxXSYmdFsocysyKSVhXT09aVsobytsLTIpJWxdJiZ0WyhzKzMpJWFdPT1pWyhvK2wtMSklbF0pe3lpZWxkIG47YnJlYWsgZX19fX1fY2VsbChlKXtjb25zdHtjaXJjdW1jZW50ZXJzOnQsZGVsYXVuYXk6e2luZWRnZXM6bixoYWxmZWRnZXM6aSx0cmlhbmdsZXM6c319PXRoaXMsYT1uW2VdO2lmKGE9PT0tMSlyZXR1cm4gbnVsbDtjb25zdCBvPVtdO2xldCBsPWE7ZG97Y29uc3QgYz1NYXRoLmZsb29yKGwvMyk7aWYoby5wdXNoKHRbYyoyXSx0W2MqMisxXSksbD1sJTM9PT0yP2wtMjpsKzEsc1tsXSE9PWUpYnJlYWs7bD1pW2xdfXdoaWxlKGwhPT1hJiZsIT09LTEpO3JldHVybiBvfV9jbGlwKGUpe2lmKGU9PT0wJiZ0aGlzLmRlbGF1bmF5Lmh1bGwubGVuZ3RoPT09MSlyZXR1cm5bdGhpcy54bWF4LHRoaXMueW1pbix0aGlzLnhtYXgsdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltYXgsdGhpcy54bWluLHRoaXMueW1pbl07Y29uc3QgdD10aGlzLl9jZWxsKGUpO2lmKHQ9PT1udWxsKXJldHVybiBudWxsO2NvbnN0e3ZlY3RvcnM6bn09dGhpcyxpPWUqNDtyZXR1cm4gbltpXXx8bltpKzFdP3RoaXMuX2NsaXBJbmZpbml0ZShlLHQsbltpXSxuW2krMV0sbltpKzJdLG5baSszXSk6dGhpcy5fY2xpcEZpbml0ZShlLHQpfV9jbGlwRmluaXRlKGUsdCl7Y29uc3Qgbj10Lmxlbmd0aDtsZXQgaT1udWxsLHMsYSxvPXRbbi0yXSxsPXRbbi0xXSxjLGg9dGhpcy5fcmVnaW9uY29kZShvLGwpLHUsZj0wO2ZvcihsZXQgZD0wO2Q8bjtkKz0yKWlmKHM9byxhPWwsbz10W2RdLGw9dFtkKzFdLGM9aCxoPXRoaXMuX3JlZ2lvbmNvZGUobyxsKSxjPT09MCYmaD09PTApdT1mLGY9MCxpP2kucHVzaChvLGwpOmk9W28sbF07ZWxzZXtsZXQgcCxfLGcsbSx5O2lmKGM9PT0wKXtpZigocD10aGlzLl9jbGlwU2VnbWVudChzLGEsbyxsLGMsaCkpPT09bnVsbCljb250aW51ZTtbXyxnLG0seV09cH1lbHNle2lmKChwPXRoaXMuX2NsaXBTZWdtZW50KG8sbCxzLGEsaCxjKSk9PT1udWxsKWNvbnRpbnVlO1ttLHksXyxnXT1wLHU9ZixmPXRoaXMuX2VkZ2Vjb2RlKF8sZyksdSYmZiYmdGhpcy5fZWRnZShlLHUsZixpLGkubGVuZ3RoKSxpP2kucHVzaChfLGcpOmk9W18sZ119dT1mLGY9dGhpcy5fZWRnZWNvZGUobSx5KSx1JiZmJiZ0aGlzLl9lZGdlKGUsdSxmLGksaS5sZW5ndGgpLGk/aS5wdXNoKG0seSk6aT1bbSx5XX1pZihpKXU9ZixmPXRoaXMuX2VkZ2Vjb2RlKGlbMF0saVsxXSksdSYmZiYmdGhpcy5fZWRnZShlLHUsZixpLGkubGVuZ3RoKTtlbHNlIGlmKHRoaXMuY29udGFpbnMoZSwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikpcmV0dXJuW3RoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4LHRoaXMueG1pbix0aGlzLnltaW5dO3JldHVybiBpfV9jbGlwU2VnbWVudChlLHQsbixpLHMsYSl7Zm9yKDs7KXtpZihzPT09MCYmYT09PTApcmV0dXJuW2UsdCxuLGldO2lmKHMmYSlyZXR1cm4gbnVsbDtsZXQgbyxsLGM9c3x8YTtjJjg/KG89ZSsobi1lKSoodGhpcy55bWF4LXQpLyhpLXQpLGw9dGhpcy55bWF4KTpjJjQ/KG89ZSsobi1lKSoodGhpcy55bWluLXQpLyhpLXQpLGw9dGhpcy55bWluKTpjJjI/KGw9dCsoaS10KSoodGhpcy54bWF4LWUpLyhuLWUpLG89dGhpcy54bWF4KToobD10KyhpLXQpKih0aGlzLnhtaW4tZSkvKG4tZSksbz10aGlzLnhtaW4pLHM/KGU9byx0PWwscz10aGlzLl9yZWdpb25jb2RlKGUsdCkpOihuPW8saT1sLGE9dGhpcy5fcmVnaW9uY29kZShuLGkpKX19X2NsaXBJbmZpbml0ZShlLHQsbixpLHMsYSl7bGV0IG89QXJyYXkuZnJvbSh0KSxsO2lmKChsPXRoaXMuX3Byb2plY3Qob1swXSxvWzFdLG4saSkpJiZvLnVuc2hpZnQobFswXSxsWzFdKSwobD10aGlzLl9wcm9qZWN0KG9bby5sZW5ndGgtMl0sb1tvLmxlbmd0aC0xXSxzLGEpKSYmby5wdXNoKGxbMF0sbFsxXSksbz10aGlzLl9jbGlwRmluaXRlKGUsbykpZm9yKGxldCBjPTAsaD1vLmxlbmd0aCx1LGY9dGhpcy5fZWRnZWNvZGUob1toLTJdLG9baC0xXSk7YzxoO2MrPTIpdT1mLGY9dGhpcy5fZWRnZWNvZGUob1tjXSxvW2MrMV0pLHUmJmYmJihjPXRoaXMuX2VkZ2UoZSx1LGYsbyxjKSxoPW8ubGVuZ3RoKTtlbHNlIHRoaXMuY29udGFpbnMoZSwodGhpcy54bWluK3RoaXMueG1heCkvMiwodGhpcy55bWluK3RoaXMueW1heCkvMikmJihvPVt0aGlzLnhtaW4sdGhpcy55bWluLHRoaXMueG1heCx0aGlzLnltaW4sdGhpcy54bWF4LHRoaXMueW1heCx0aGlzLnhtaW4sdGhpcy55bWF4XSk7cmV0dXJuIG99X2VkZ2UoZSx0LG4saSxzKXtmb3IoO3QhPT1uOyl7bGV0IGEsbztzd2l0Y2godCl7Y2FzZSA1OnQ9NDtjb250aW51ZTtjYXNlIDQ6dD02LGE9dGhpcy54bWF4LG89dGhpcy55bWluO2JyZWFrO2Nhc2UgNjp0PTI7Y29udGludWU7Y2FzZSAyOnQ9MTAsYT10aGlzLnhtYXgsbz10aGlzLnltYXg7YnJlYWs7Y2FzZSAxMDp0PTg7Y29udGludWU7Y2FzZSA4OnQ9OSxhPXRoaXMueG1pbixvPXRoaXMueW1heDticmVhaztjYXNlIDk6dD0xO2NvbnRpbnVlO2Nhc2UgMTp0PTUsYT10aGlzLnhtaW4sbz10aGlzLnltaW47YnJlYWt9KGlbc10hPT1hfHxpW3MrMV0hPT1vKSYmdGhpcy5jb250YWlucyhlLGEsbykmJihpLnNwbGljZShzLDAsYSxvKSxzKz0yKX1pZihpLmxlbmd0aD40KWZvcihsZXQgYT0wO2E8aS5sZW5ndGg7YSs9Mil7Y29uc3Qgbz0oYSsyKSVpLmxlbmd0aCxsPShhKzQpJWkubGVuZ3RoOyhpW2FdPT09aVtvXSYmaVtvXT09PWlbbF18fGlbYSsxXT09PWlbbysxXSYmaVtvKzFdPT09aVtsKzFdKSYmKGkuc3BsaWNlKG8sMiksYS09Mil9cmV0dXJuIHN9X3Byb2plY3QoZSx0LG4saSl7bGV0IHM9MS8wLGEsbyxsO2lmKGk8MCl7aWYodDw9dGhpcy55bWluKXJldHVybiBudWxsOyhhPSh0aGlzLnltaW4tdCkvaSk8cyYmKGw9dGhpcy55bWluLG89ZSsocz1hKSpuKX1lbHNlIGlmKGk+MCl7aWYodD49dGhpcy55bWF4KXJldHVybiBudWxsOyhhPSh0aGlzLnltYXgtdCkvaSk8cyYmKGw9dGhpcy55bWF4LG89ZSsocz1hKSpuKX1pZihuPjApe2lmKGU+PXRoaXMueG1heClyZXR1cm4gbnVsbDsoYT0odGhpcy54bWF4LWUpL24pPHMmJihvPXRoaXMueG1heCxsPXQrKHM9YSkqaSl9ZWxzZSBpZihuPDApe2lmKGU8PXRoaXMueG1pbilyZXR1cm4gbnVsbDsoYT0odGhpcy54bWluLWUpL24pPHMmJihvPXRoaXMueG1pbixsPXQrKHM9YSkqaSl9cmV0dXJuW28sbF19X2VkZ2Vjb2RlKGUsdCl7cmV0dXJuKGU9PT10aGlzLnhtaW4/MTplPT09dGhpcy54bWF4PzI6MCl8KHQ9PT10aGlzLnltaW4/NDp0PT09dGhpcy55bWF4Pzg6MCl9X3JlZ2lvbmNvZGUoZSx0KXtyZXR1cm4oZTx0aGlzLnhtaW4/MTplPnRoaXMueG1heD8yOjApfCh0PHRoaXMueW1pbj80OnQ+dGhpcy55bWF4Pzg6MCl9fWNvbnN0IHdFPTIqTWF0aC5QSSxwcz1NYXRoLnBvdztmdW5jdGlvbiBFRShyKXtyZXR1cm4gclswXX1mdW5jdGlvbiBBRShyKXtyZXR1cm4gclsxXX1mdW5jdGlvbiBURShyKXtjb25zdHt0cmlhbmdsZXM6ZSxjb29yZHM6dH09cjtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rPTMpe2NvbnN0IGk9MiplW25dLHM9MiplW24rMV0sYT0yKmVbbisyXTtpZigodFthXS10W2ldKSoodFtzKzFdLXRbaSsxXSktKHRbc10tdFtpXSkqKHRbYSsxXS10W2krMV0pPjFlLTEwKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIENFKHIsZSx0KXtyZXR1cm5bcitNYXRoLnNpbihyK2UpKnQsZStNYXRoLmNvcyhyLWUpKnRdfWNsYXNzIHNme3N0YXRpYyBmcm9tKGUsdD1FRSxuPUFFLGkpe3JldHVybiBuZXcgc2YoImxlbmd0aCJpbiBlP1JFKGUsdCxuLGkpOkZsb2F0NjRBcnJheS5mcm9tKFBFKGUsdCxuLGkpKSl9Y29uc3RydWN0b3IoZSl7dGhpcy5fZGVsYXVuYXRvcj1uZXcgQWEoZSksdGhpcy5pbmVkZ2VzPW5ldyBJbnQzMkFycmF5KGUubGVuZ3RoLzIpLHRoaXMuX2h1bGxJbmRleD1uZXcgSW50MzJBcnJheShlLmxlbmd0aC8yKSx0aGlzLnBvaW50cz10aGlzLl9kZWxhdW5hdG9yLmNvb3Jkcyx0aGlzLl9pbml0KCl9dXBkYXRlKCl7cmV0dXJuIHRoaXMuX2RlbGF1bmF0b3IudXBkYXRlKCksdGhpcy5faW5pdCgpLHRoaXN9X2luaXQoKXtjb25zdCBlPXRoaXMuX2RlbGF1bmF0b3IsdD10aGlzLnBvaW50cztpZihlLmh1bGwmJmUuaHVsbC5sZW5ndGg+MiYmVEUoZSkpe3RoaXMuY29sbGluZWFyPUludDMyQXJyYXkuZnJvbSh7bGVuZ3RoOnQubGVuZ3RoLzJ9LChmLGQpPT5kKS5zb3J0KChmLGQpPT50WzIqZl0tdFsyKmRdfHx0WzIqZisxXS10WzIqZCsxXSk7Y29uc3QgbD10aGlzLmNvbGxpbmVhclswXSxjPXRoaXMuY29sbGluZWFyW3RoaXMuY29sbGluZWFyLmxlbmd0aC0xXSxoPVt0WzIqbF0sdFsyKmwrMV0sdFsyKmNdLHRbMipjKzFdXSx1PTFlLTgqTWF0aC5oeXBvdChoWzNdLWhbMV0saFsyXS1oWzBdKTtmb3IobGV0IGY9MCxkPXQubGVuZ3RoLzI7ZjxkOysrZil7Y29uc3QgcD1DRSh0WzIqZl0sdFsyKmYrMV0sdSk7dFsyKmZdPXBbMF0sdFsyKmYrMV09cFsxXX10aGlzLl9kZWxhdW5hdG9yPW5ldyBBYSh0KX1lbHNlIGRlbGV0ZSB0aGlzLmNvbGxpbmVhcjtjb25zdCBuPXRoaXMuaGFsZmVkZ2VzPXRoaXMuX2RlbGF1bmF0b3IuaGFsZmVkZ2VzLGk9dGhpcy5odWxsPXRoaXMuX2RlbGF1bmF0b3IuaHVsbCxzPXRoaXMudHJpYW5nbGVzPXRoaXMuX2RlbGF1bmF0b3IudHJpYW5nbGVzLGE9dGhpcy5pbmVkZ2VzLmZpbGwoLTEpLG89dGhpcy5faHVsbEluZGV4LmZpbGwoLTEpO2ZvcihsZXQgbD0wLGM9bi5sZW5ndGg7bDxjOysrbCl7Y29uc3QgaD1zW2wlMz09PTI/bC0yOmwrMV07KG5bbF09PT0tMXx8YVtoXT09PS0xKSYmKGFbaF09bCl9Zm9yKGxldCBsPTAsYz1pLmxlbmd0aDtsPGM7KytsKW9baVtsXV09bDtpLmxlbmd0aDw9MiYmaS5sZW5ndGg+MCYmKHRoaXMudHJpYW5nbGVzPW5ldyBJbnQzMkFycmF5KDMpLmZpbGwoLTEpLHRoaXMuaGFsZmVkZ2VzPW5ldyBJbnQzMkFycmF5KDMpLmZpbGwoLTEpLHRoaXMudHJpYW5nbGVzWzBdPWlbMF0sYVtpWzBdXT0xLGkubGVuZ3RoPT09MiYmKGFbaVsxXV09MCx0aGlzLnRyaWFuZ2xlc1sxXT1pWzFdLHRoaXMudHJpYW5nbGVzWzJdPWlbMV0pKX12b3Jvbm9pKGUpe3JldHVybiBuZXcgYkUodGhpcyxlKX0qbmVpZ2hib3JzKGUpe2NvbnN0e2luZWRnZXM6dCxodWxsOm4sX2h1bGxJbmRleDppLGhhbGZlZGdlczpzLHRyaWFuZ2xlczphLGNvbGxpbmVhcjpvfT10aGlzO2lmKG8pe2NvbnN0IHU9by5pbmRleE9mKGUpO3U+MCYmKHlpZWxkIG9bdS0xXSksdTxvLmxlbmd0aC0xJiYoeWllbGQgb1t1KzFdKTtyZXR1cm59Y29uc3QgbD10W2VdO2lmKGw9PT0tMSlyZXR1cm47bGV0IGM9bCxoPS0xO2Rve2lmKHlpZWxkIGg9YVtjXSxjPWMlMz09PTI/Yy0yOmMrMSxhW2NdIT09ZSlyZXR1cm47aWYoYz1zW2NdLGM9PT0tMSl7Y29uc3QgdT1uWyhpW2VdKzEpJW4ubGVuZ3RoXTt1IT09aCYmKHlpZWxkIHUpO3JldHVybn19d2hpbGUoYyE9PWwpfWZpbmQoZSx0LG49MCl7aWYoZT0rZSxlIT09ZXx8KHQ9K3QsdCE9PXQpKXJldHVybi0xO2NvbnN0IGk9bjtsZXQgcztmb3IoOyhzPXRoaXMuX3N0ZXAobixlLHQpKT49MCYmcyE9PW4mJnMhPT1pOyluPXM7cmV0dXJuIHN9X3N0ZXAoZSx0LG4pe2NvbnN0e2luZWRnZXM6aSxodWxsOnMsX2h1bGxJbmRleDphLGhhbGZlZGdlczpvLHRyaWFuZ2xlczpsLHBvaW50czpjfT10aGlzO2lmKGlbZV09PT0tMXx8IWMubGVuZ3RoKXJldHVybihlKzEpJShjLmxlbmd0aD4+MSk7bGV0IGg9ZSx1PXBzKHQtY1tlKjJdLDIpK3BzKG4tY1tlKjIrMV0sMik7Y29uc3QgZj1pW2VdO2xldCBkPWY7ZG97bGV0IHA9bFtkXTtjb25zdCBfPXBzKHQtY1twKjJdLDIpK3BzKG4tY1twKjIrMV0sMik7aWYoXzx1JiYodT1fLGg9cCksZD1kJTM9PT0yP2QtMjpkKzEsbFtkXSE9PWUpYnJlYWs7aWYoZD1vW2RdLGQ9PT0tMSl7aWYoZD1zWyhhW2VdKzEpJXMubGVuZ3RoXSxkIT09cCYmcHModC1jW2QqMl0sMikrcHMobi1jW2QqMisxXSwyKTx1KXJldHVybiBkO2JyZWFrfX13aGlsZShkIT09Zik7cmV0dXJuIGh9cmVuZGVyKGUpe2NvbnN0IHQ9ZT09bnVsbD9lPW5ldyBtcjp2b2lkIDAse3BvaW50czpuLGhhbGZlZGdlczppLHRyaWFuZ2xlczpzfT10aGlzO2ZvcihsZXQgYT0wLG89aS5sZW5ndGg7YTxvOysrYSl7Y29uc3QgbD1pW2FdO2lmKGw8YSljb250aW51ZTtjb25zdCBjPXNbYV0qMixoPXNbbF0qMjtlLm1vdmVUbyhuW2NdLG5bYysxXSksZS5saW5lVG8obltoXSxuW2grMV0pfXJldHVybiB0aGlzLnJlbmRlckh1bGwoZSksdCYmdC52YWx1ZSgpfXJlbmRlclBvaW50cyhlLHQpe3Q9PT12b2lkIDAmJighZXx8dHlwZW9mIGUubW92ZVRvIT0iZnVuY3Rpb24iKSYmKHQ9ZSxlPW51bGwpLHQ9dD09bnVsbD8yOit0O2NvbnN0IG49ZT09bnVsbD9lPW5ldyBtcjp2b2lkIDAse3BvaW50czppfT10aGlzO2ZvcihsZXQgcz0wLGE9aS5sZW5ndGg7czxhO3MrPTIpe2NvbnN0IG89aVtzXSxsPWlbcysxXTtlLm1vdmVUbyhvK3QsbCksZS5hcmMobyxsLHQsMCx3RSl9cmV0dXJuIG4mJm4udmFsdWUoKX1yZW5kZXJIdWxsKGUpe2NvbnN0IHQ9ZT09bnVsbD9lPW5ldyBtcjp2b2lkIDAse2h1bGw6bixwb2ludHM6aX09dGhpcyxzPW5bMF0qMixhPW4ubGVuZ3RoO2UubW92ZVRvKGlbc10saVtzKzFdKTtmb3IobGV0IG89MTtvPGE7KytvKXtjb25zdCBsPTIqbltvXTtlLmxpbmVUbyhpW2xdLGlbbCsxXSl9cmV0dXJuIGUuY2xvc2VQYXRoKCksdCYmdC52YWx1ZSgpfWh1bGxQb2x5Z29uKCl7Y29uc3QgZT1uZXcgcmY7cmV0dXJuIHRoaXMucmVuZGVySHVsbChlKSxlLnZhbHVlKCl9cmVuZGVyVHJpYW5nbGUoZSx0KXtjb25zdCBuPXQ9PW51bGw/dD1uZXcgbXI6dm9pZCAwLHtwb2ludHM6aSx0cmlhbmdsZXM6c309dGhpcyxhPXNbZSo9M10qMixvPXNbZSsxXSoyLGw9c1tlKzJdKjI7cmV0dXJuIHQubW92ZVRvKGlbYV0saVthKzFdKSx0LmxpbmVUbyhpW29dLGlbbysxXSksdC5saW5lVG8oaVtsXSxpW2wrMV0pLHQuY2xvc2VQYXRoKCksbiYmbi52YWx1ZSgpfSp0cmlhbmdsZVBvbHlnb25zKCl7Y29uc3R7dHJpYW5nbGVzOmV9PXRoaXM7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aC8zO3Q8bjsrK3QpeWllbGQgdGhpcy50cmlhbmdsZVBvbHlnb24odCl9dHJpYW5nbGVQb2x5Z29uKGUpe2NvbnN0IHQ9bmV3IHJmO3JldHVybiB0aGlzLnJlbmRlclRyaWFuZ2xlKGUsdCksdC52YWx1ZSgpfX1mdW5jdGlvbiBSRShyLGUsdCxuKXtjb25zdCBpPXIubGVuZ3RoLHM9bmV3IEZsb2F0NjRBcnJheShpKjIpO2ZvcihsZXQgYT0wO2E8aTsrK2Epe2NvbnN0IG89clthXTtzW2EqMl09ZS5jYWxsKG4sbyxhLHIpLHNbYSoyKzFdPXQuY2FsbChuLG8sYSxyKX1yZXR1cm4gc31mdW5jdGlvbipQRShyLGUsdCxuKXtsZXQgaT0wO2Zvcihjb25zdCBzIG9mIHIpeWllbGQgZS5jYWxsKG4scyxpLHIpLHlpZWxkIHQuY2FsbChuLHMsaSxyKSwrK2l9Y29uc3QgYWY9TWF0aC5QSSx5MD1hZi8yLHYwPTE4MC9hZixNMD1hZi8xODAsTEU9TWF0aC5hdGFuMixTMD1NYXRoLmNvcyxJRT1NYXRoLm1heCxVRT1NYXRoLm1pbixiMD1NYXRoLnNpbixERT1NYXRoLnNpZ258fGZ1bmN0aW9uKHIpe3JldHVybiByPjA/MTpyPDA/LTE6MH0sdzA9TWF0aC5zcXJ0O2Z1bmN0aW9uIE5FKHIpe3JldHVybiByPjE/eTA6cjwtMT8teTA6TWF0aC5hc2luKHIpfWZ1bmN0aW9uIEUwKHIsZSl7cmV0dXJuIHJbMF0qZVswXStyWzFdKmVbMV0rclsyXSplWzJdfWZ1bmN0aW9uIGJuKHIsZSl7cmV0dXJuW3JbMV0qZVsyXS1yWzJdKmVbMV0sclsyXSplWzBdLXJbMF0qZVsyXSxyWzBdKmVbMV0tclsxXSplWzBdXX1mdW5jdGlvbiBZbChyLGUpe3JldHVybltyWzBdK2VbMF0sclsxXStlWzFdLHJbMl0rZVsyXV19ZnVuY3Rpb24gWmwocil7dmFyIGU9dzAoclswXSpyWzBdK3JbMV0qclsxXStyWzJdKnJbMl0pO3JldHVybltyWzBdL2UsclsxXS9lLHJbMl0vZV19ZnVuY3Rpb24gb2Yocil7cmV0dXJuW0xFKHJbMV0sclswXSkqdjAsTkUoSUUoLTEsVUUoMSxyWzJdKSkpKnYwXX1mdW5jdGlvbiBYbihyKXtjb25zdCBlPXJbMF0qTTAsdD1yWzFdKk0wLG49UzAodCk7cmV0dXJuW24qUzAoZSksbipiMChlKSxiMCh0KV19ZnVuY3Rpb24gbGYocil7cmV0dXJuIHI9ci5tYXAoZT0+WG4oZSkpLEUwKHJbMF0sYm4oclsyXSxyWzFdKSl9ZnVuY3Rpb24gRkUocil7Y29uc3QgZT1CRShyKSx0PWtFKGUpLG49ekUodCxyKSxpPVZFKHQsci5sZW5ndGgpLHM9T0UoaSxyKSxhPUdFKHQscikse3BvbHlnb25zOm8sY2VudGVyczpsfT1IRShhLHQsciksYz1XRShvKSxoPXFFKHQsciksdT1YRShuLHQpO3JldHVybntkZWxhdW5heTplLGVkZ2VzOm4sdHJpYW5nbGVzOnQsY2VudGVyczpsLG5laWdoYm9yczppLHBvbHlnb25zOm8sbWVzaDpjLGh1bGw6aCx1cnF1aGFydDp1LGZpbmQ6c319ZnVuY3Rpb24gT0UocixlKXtmdW5jdGlvbiB0KG4saSl7bGV0IHM9blswXS1pWzBdLGE9blsxXS1pWzFdLG89blsyXS1pWzJdO3JldHVybiBzKnMrYSphK28qb31yZXR1cm4gZnVuY3Rpb24oaSxzLGEpe2E9PT12b2lkIDAmJihhPTApO2xldCBvLGwsYz1hO2NvbnN0IGg9WG4oW2ksc10pO2RvIG89YSxhPW51bGwsbD10KGgsWG4oZVtvXSkpLHJbb10uZm9yRWFjaCh1PT57bGV0IGY9dChoLFhuKGVbdV0pKTtpZihmPGwpe2w9ZixhPXUsYz11O3JldHVybn19KTt3aGlsZShhIT09bnVsbCk7cmV0dXJuIGN9fWZ1bmN0aW9uIEJFKHIpe2lmKHIubGVuZ3RoPDIpcmV0dXJue307bGV0IGU9MDtmb3IoO2lzTmFOKHJbZV1bMF0rcltlXVsxXSkmJmUrKzxyLmxlbmd0aDspO2NvbnN0IHQ9a2cocltlXSksbj1GdygpLnRyYW5zbGF0ZShbMCwwXSkuc2NhbGUoMSkucm90YXRlKHQuaW52ZXJ0KFsxODAsMF0pKTtyPXIubWFwKG4pO2NvbnN0IGk9W107bGV0IHM9MTtmb3IobGV0IHU9MCxmPXIubGVuZ3RoO3U8Zjt1Kyspe2xldCBkPXhzKHJbdV1bMF0sMikreHMoclt1XVsxXSwyKTshaXNGaW5pdGUoZCl8fGQ+MWUzMj9pLnB1c2godSk6ZD5zJiYocz1kKX1jb25zdCBhPTFlNip3MChzKTtpLmZvckVhY2godT0+clt1XT1bYSwwXSksci5wdXNoKFswLGFdKSxyLnB1c2goWy1hLDBdKSxyLnB1c2goWzAsLWFdKTtjb25zdCBvPXNmLmZyb20ocik7by5wcm9qZWN0aW9uPW47Y29uc3R7dHJpYW5nbGVzOmwsaGFsZmVkZ2VzOmMsaW5lZGdlczpofT1vO2ZvcihsZXQgdT0wLGY9Yy5sZW5ndGg7dTxmO3UrKylpZihjW3VdPDApe2NvbnN0IGQ9dSUzPT0yP3UtMjp1KzEscD11JTM9PTA/dSsyOnUtMSxfPWNbZF0sZz1jW3BdO2NbX109ZyxjW2ddPV8sY1tkXT1jW3BdPS0xLGxbdV09bFtkXT1sW3BdPWUsaFtsW19dXT1fJTM9PTA/XysyOl8tMSxoW2xbZ11dPWclMz09MD9nKzI6Zy0xLHUrPTItdSUzfWVsc2UgbFt1XT5yLmxlbmd0aC0zLTEmJihsW3VdPWUpO3JldHVybiBvfWZ1bmN0aW9uIHpFKHIsZSl7Y29uc3QgdD1uZXcgU2V0O3JldHVybiBlLmxlbmd0aD09PTI/W1swLDFdXTooci5mb3JFYWNoKG49PntpZihuWzBdIT09blsxXSYmIShsZihuLm1hcChpPT5lW2ldKSk8MCkpZm9yKGxldCBpPTAscztpPDM7aSsrKXM9KGkrMSklMyx0LmFkZChtbChbbltpXSxuW3NdXSkuam9pbigiLSIpKX0pLEFycmF5LmZyb20odCxuPT5uLnNwbGl0KCItIikubWFwKE51bWJlcikpKX1mdW5jdGlvbiBrRShyKXtjb25zdHt0cmlhbmdsZXM6ZX09cjtpZighZSlyZXR1cm5bXTtjb25zdCB0PVtdO2ZvcihsZXQgbj0wLGk9ZS5sZW5ndGgvMztuPGk7bisrKXtjb25zdCBzPWVbMypuXSxhPWVbMypuKzFdLG89ZVszKm4rMl07cyE9PWEmJmEhPT1vJiZ0LnB1c2goW3MsbyxhXSl9cmV0dXJuIHR9ZnVuY3Rpb24gR0UocixlKXtyZXR1cm4gci5tYXAodD0+e2NvbnN0IG49dC5tYXAocz0+ZVtzXSkubWFwKFhuKSxpPVlsKFlsKGJuKG5bMV0sblswXSksYm4oblsyXSxuWzFdKSksYm4oblswXSxuWzJdKSk7cmV0dXJuIG9mKFpsKGkpKX0pfWZ1bmN0aW9uIFZFKHIsZSl7Y29uc3QgdD1bXTtyZXR1cm4gci5mb3JFYWNoKG49Pntmb3IobGV0IGk9MDtpPDM7aSsrKXtjb25zdCBzPW5baV0sYT1uWyhpKzEpJTNdO3Rbc109dFtzXXx8W10sdFtzXS5wdXNoKGEpfX0pLHIubGVuZ3RoPT09MCYmKGU9PT0yPyh0WzBdPVsxXSx0WzFdPVswXSk6ZT09PTEmJih0WzBdPVtdKSksdH1mdW5jdGlvbiBIRShyLGUsdCl7Y29uc3Qgbj1bXSxpPXIuc2xpY2UoKTtpZihlLmxlbmd0aD09PTApe2lmKHQubGVuZ3RoPDIpcmV0dXJue3BvbHlnb25zOm4sY2VudGVyczppfTtpZih0Lmxlbmd0aD09PTIpe2NvbnN0IG89WG4odFswXSksbD1Ybih0WzFdKSxjPVpsKFlsKG8sbCkpLGg9WmwoYm4obyxsKSksdT1ibihjLGgpLGY9W2MsYm4oYyx1KSxibihibihjLHUpLHUpLGJuKGJuKGJuKGMsdSksdSksdSldLm1hcChvZikubWFwKGEpO3JldHVybiBuLnB1c2goZiksbi5wdXNoKGYuc2xpY2UoKS5yZXZlcnNlKCkpLHtwb2x5Z29uczpuLGNlbnRlcnM6aX19fWUuZm9yRWFjaCgobyxsKT0+e2ZvcihsZXQgYz0wO2M8MztjKyspe2NvbnN0IGg9b1tjXSx1PW9bKGMrMSklM10sZj1vWyhjKzIpJTNdO25baF09bltoXXx8W10sbltoXS5wdXNoKFt1LGYsbCxbaCx1LGZdXSl9fSk7Y29uc3Qgcz1uLm1hcChvPT57Y29uc3QgbD1bb1swXVsyXV07bGV0IGM9b1swXVsxXTtmb3IobGV0IGg9MTtoPG8ubGVuZ3RoO2grKylmb3IobGV0IHU9MDt1PG8ubGVuZ3RoO3UrKylpZihvW3VdWzBdPT1jKXtjPW9bdV1bMV0sbC5wdXNoKG9bdV1bMl0pO2JyZWFrfWlmKGwubGVuZ3RoPjIpcmV0dXJuIGw7aWYobC5sZW5ndGg9PTIpe2NvbnN0IGg9QTAodFtvWzBdWzNdWzBdXSx0W29bMF1bM11bMV1dLGlbbFswXV0pLHU9QTAodFtvWzBdWzNdWzJdXSx0W29bMF1bM11bMF1dLGlbbFswXV0pLGY9YShoKSxkPWEodSk7cmV0dXJuW2xbMF0sZCxsWzFdLGZdfX0pO2Z1bmN0aW9uIGEobyl7bGV0IGw9LTE7cmV0dXJuIGkuc2xpY2UoZS5sZW5ndGgsMS8wKS5mb3JFYWNoKChjLGgpPT57Y1swXT09PW9bMF0mJmNbMV09PT1vWzFdJiYobD1oK2UubGVuZ3RoKX0pLGw8MCYmKGw9aS5sZW5ndGgsaS5wdXNoKG8pKSxsfXJldHVybntwb2x5Z29uczpzLGNlbnRlcnM6aX19ZnVuY3Rpb24gQTAocixlLHQpe3I9WG4ociksZT1YbihlKSx0PVhuKHQpO2NvbnN0IG49REUoRTAoYm4oZSxyKSx0KSk7cmV0dXJuIG9mKFpsKFlsKHIsZSkpLm1hcChpPT5uKmkpKX1mdW5jdGlvbiBXRShyKXtjb25zdCBlPVtdO3JldHVybiByLmZvckVhY2godD0+e2lmKCF0KXJldHVybjtsZXQgbj10W3QubGVuZ3RoLTFdO2ZvcihsZXQgaSBvZiB0KWk+biYmZS5wdXNoKFtuLGldKSxuPWl9KSxlfWZ1bmN0aW9uIFhFKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2NvbnN0IG49bmV3IE1hcCxpPW5ldyBNYXA7cmV0dXJuIHIuZm9yRWFjaCgocyxhKT0+e2NvbnN0IG89cy5qb2luKCItIik7bi5zZXQobyx0W2FdKSxpLnNldChvLCEwKX0pLGUuZm9yRWFjaChzPT57bGV0IGE9MCxvPS0xO2ZvcihsZXQgbD0wO2w8MztsKyspe2xldCBjPW1sKFtzW2xdLHNbKGwrMSklM11dKS5qb2luKCItIik7bi5nZXQoYyk+YSYmKGE9bi5nZXQoYyksbz1jKX1pLnNldChvLCExKX0pLHIubWFwKHM9PmkuZ2V0KHMuam9pbigiLSIpKSl9fWZ1bmN0aW9uIHFFKHIsZSl7Y29uc3QgdD1uZXcgU2V0LG49W107ci5tYXAobz0+e2lmKCEobGYoby5tYXAobD0+ZVtsPmUubGVuZ3RoPzA6bF0pKT4xZS0xMikpZm9yKGxldCBsPTA7bDwzO2wrKyl7bGV0IGM9W29bbF0sb1sobCsxKSUzXV0saD1gJHtjWzBdfS0ke2NbMV19YDt0LmhhcyhoKT90LmRlbGV0ZShoKTp0LmFkZChgJHtjWzFdfS0ke2NbMF19YCl9fSk7Y29uc3QgaT1uZXcgTWFwO2xldCBzO2lmKHQuZm9yRWFjaChvPT57bz1vLnNwbGl0KCItIikubWFwKE51bWJlciksaS5zZXQob1swXSxvWzFdKSxzPW9bMF19KSxzPT09dm9pZCAwKXJldHVybiBuO2xldCBhPXM7ZG97bi5wdXNoKGEpO2xldCBvPWkuZ2V0KGEpO2kuc2V0KGEsLTEpLGE9b313aGlsZShhPi0xJiZhIT09cyk7cmV0dXJuIG59ZnVuY3Rpb24gJEUocil7Y29uc3QgZT1mdW5jdGlvbih0KXtpZihlLmRlbGF1bmF5PW51bGwsZS5fZGF0YT10LHR5cGVvZiBlLl9kYXRhPT0ib2JqZWN0IiYmZS5fZGF0YS50eXBlPT09IkZlYXR1cmVDb2xsZWN0aW9uIiYmKGUuX2RhdGE9ZS5fZGF0YS5mZWF0dXJlcyksdHlwZW9mIGUuX2RhdGE9PSJvYmplY3QiKXtjb25zdCBuPWUuX2RhdGEubWFwKGk9PltlLl92eChpKSxlLl92eShpKSxpXSkuZmlsdGVyKGk9PmlzRmluaXRlKGlbMF0raVsxXSkpO2UucG9pbnRzPW4ubWFwKGk9PltpWzBdLGlbMV1dKSxlLnZhbGlkPW4ubWFwKGk9PmlbMl0pLGUuZGVsYXVuYXk9RkUoZS5wb2ludHMpfXJldHVybiBlfTtyZXR1cm4gZS5fdng9ZnVuY3Rpb24odCl7aWYodHlwZW9mIHQ9PSJvYmplY3QiJiYidHlwZSJpbiB0KXJldHVybiBOZyh0KVswXTtpZigwIGluIHQpcmV0dXJuIHRbMF19LGUuX3Z5PWZ1bmN0aW9uKHQpe2lmKHR5cGVvZiB0PT0ib2JqZWN0IiYmInR5cGUiaW4gdClyZXR1cm4gTmcodClbMV07aWYoMSBpbiB0KXJldHVybiB0WzFdfSxlLng9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/KGUuX3Z4PXQsZSk6ZS5fdnh9LGUueT1mdW5jdGlvbih0KXtyZXR1cm4gdD8oZS5fdnk9dCxlKTplLl92eX0sZS5wb2x5Z29ucz1mdW5jdGlvbih0KXtpZih0IT09dm9pZCAwJiZlKHQpLCFlLmRlbGF1bmF5KXJldHVybiExO2NvbnN0IG49e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczpbXX07cmV0dXJuIGUudmFsaWQubGVuZ3RoPT09MHx8KGUuZGVsYXVuYXkucG9seWdvbnMuZm9yRWFjaCgoaSxzKT0+bi5mZWF0dXJlcy5wdXNoKHt0eXBlOiJGZWF0dXJlIixnZW9tZXRyeTppP3t0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLmksaVswXV0ubWFwKGE9PmUuZGVsYXVuYXkuY2VudGVyc1thXSldfTpudWxsLHByb3BlcnRpZXM6e3NpdGU6ZS52YWxpZFtzXSxzaXRlY29vcmRpbmF0ZXM6ZS5wb2ludHNbc10sbmVpZ2hib3VyczplLmRlbGF1bmF5Lm5laWdoYm9yc1tzXX19KSksZS52YWxpZC5sZW5ndGg9PT0xJiZuLmZlYXR1cmVzLnB1c2goe3R5cGU6IkZlYXR1cmUiLGdlb21ldHJ5Ont0eXBlOiJTcGhlcmUifSxwcm9wZXJ0aWVzOntzaXRlOmUudmFsaWRbMF0sc2l0ZWNvb3JkaW5hdGVzOmUucG9pbnRzWzBdLG5laWdoYm91cnM6W119fSkpLG59LGUudHJpYW5nbGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0IT09dm9pZCAwJiZlKHQpLGUuZGVsYXVuYXk/e3R5cGU6IkZlYXR1cmVDb2xsZWN0aW9uIixmZWF0dXJlczplLmRlbGF1bmF5LnRyaWFuZ2xlcy5tYXAoKG4saSk9PihuPW4ubWFwKHM9PmUucG9pbnRzW3NdKSxuLmNlbnRlcj1lLmRlbGF1bmF5LmNlbnRlcnNbaV0sbikpLmZpbHRlcihuPT5sZihuKT4wKS5tYXAobj0+KHt0eXBlOiJGZWF0dXJlIixwcm9wZXJ0aWVzOntjaXJjdW1jZW50ZXI6bi5jZW50ZXJ9LGdlb21ldHJ5Ont0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLm4sblswXV1dfX0pKX06ITF9LGUubGlua3M9ZnVuY3Rpb24odCl7aWYodCE9PXZvaWQgMCYmZSh0KSwhZS5kZWxhdW5heSlyZXR1cm4hMTtjb25zdCBuPWUuZGVsYXVuYXkuZWRnZXMubWFwKHM9PmxzKGUucG9pbnRzW3NbMF1dLGUucG9pbnRzW3NbMV1dKSksaT1lLmRlbGF1bmF5LnVycXVoYXJ0KG4pO3JldHVybnt0eXBlOiJGZWF0dXJlQ29sbGVjdGlvbiIsZmVhdHVyZXM6ZS5kZWxhdW5heS5lZGdlcy5tYXAoKHMsYSk9Pih7dHlwZToiRmVhdHVyZSIscHJvcGVydGllczp7c291cmNlOmUudmFsaWRbc1swXV0sdGFyZ2V0OmUudmFsaWRbc1sxXV0sbGVuZ3RoOm5bYV0sdXJxdWhhcnQ6ISFpW2FdfSxnZW9tZXRyeTp7dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W2UucG9pbnRzW3NbMF1dLGUucG9pbnRzW3NbMV1dXX19KSl9fSxlLm1lc2g9ZnVuY3Rpb24odCl7cmV0dXJuIHQhPT12b2lkIDAmJmUodCksZS5kZWxhdW5heT97dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczplLmRlbGF1bmF5LmVkZ2VzLm1hcChuPT5bZS5wb2ludHNbblswXV0sZS5wb2ludHNbblsxXV1dKX06ITF9LGUuY2VsbE1lc2g9ZnVuY3Rpb24odCl7aWYodCE9PXZvaWQgMCYmZSh0KSwhZS5kZWxhdW5heSlyZXR1cm4hMTtjb25zdHtjZW50ZXJzOm4scG9seWdvbnM6aX09ZS5kZWxhdW5heSxzPVtdO2Zvcihjb25zdCBhIG9mIGkpaWYoYSlmb3IobGV0IG89YS5sZW5ndGgsbD1hW28tMV0sYz1hWzBdLGg9MDtoPG87bD1jLGM9YVsrK2hdKWM+bCYmcy5wdXNoKFtuW2xdLG5bY11dKTtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczpzfX0sZS5fZm91bmQ9dm9pZCAwLGUuZmluZD1mdW5jdGlvbih0LG4saSl7aWYoZS5fZm91bmQ9ZS5kZWxhdW5heS5maW5kKHQsbixlLl9mb3VuZCksIWl8fGxzKFt0LG5dLGUucG9pbnRzW2UuX2ZvdW5kXSk8aSlyZXR1cm4gZS5fZm91bmR9LGUuaHVsbD1mdW5jdGlvbih0KXt0IT09dm9pZCAwJiZlKHQpO2NvbnN0IG49ZS5kZWxhdW5heS5odWxsLGk9ZS5wb2ludHM7cmV0dXJuIG4ubGVuZ3RoPT09MD9udWxsOnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbWy4uLm4ubWFwKHM9Pmlbc10pLGlbblswXV1dXX19LHI/ZShyKTplfWZ1bmN0aW9uIFlFKHIsZSl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpicmVhaztjYXNlIDE6dGhpcy5yYW5nZShyKTticmVhaztkZWZhdWx0OnRoaXMucmFuZ2UoZSkuZG9tYWluKHIpO2JyZWFrfXJldHVybiB0aGlzfWZ1bmN0aW9uIGNmKHIsZSx0KXtyLnByb3RvdHlwZT1lLnByb3RvdHlwZT10LHQuY29uc3RydWN0b3I9cn1mdW5jdGlvbiBUMChyLGUpe3ZhciB0PU9iamVjdC5jcmVhdGUoci5wcm90b3R5cGUpO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXTtyZXR1cm4gdH1mdW5jdGlvbiBDYSgpe312YXIgUmE9LjcsSmw9MS9SYSxtcz0iXFxzKihbKy1dP1xcZCspXFxzKiIsUGE9IlxccyooWystXT8oPzpcXGQqXFwuKT9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLHFuPSJcXHMqKFsrLV0/KD86XFxkKlxcLik/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsWkU9L14jKFswLTlhLWZdezMsOH0pJC8sSkU9bmV3IFJlZ0V4cChgXnJnYlxcKCR7bXN9LCR7bXN9LCR7bXN9XFwpJGApLEtFPW5ldyBSZWdFeHAoYF5yZ2JcXCgke3FufSwke3FufSwke3FufVxcKSRgKSxRRT1uZXcgUmVnRXhwKGBecmdiYVxcKCR7bXN9LCR7bXN9LCR7bXN9LCR7UGF9XFwpJGApLGpFPW5ldyBSZWdFeHAoYF5yZ2JhXFwoJHtxbn0sJHtxbn0sJHtxbn0sJHtQYX1cXCkkYCksZUE9bmV3IFJlZ0V4cChgXmhzbFxcKCR7UGF9LCR7cW59LCR7cW59XFwpJGApLHRBPW5ldyBSZWdFeHAoYF5oc2xhXFwoJHtQYX0sJHtxbn0sJHtxbn0sJHtQYX1cXCkkYCksQzA9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH07Y2YoQ2EsTGEse2NvcHkocil7cmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsdGhpcyxyKX0sZGlzcGxheWFibGUoKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6UjAsZm9ybWF0SGV4OlIwLGZvcm1hdEhleDg6bkEsZm9ybWF0SHNsOmlBLGZvcm1hdFJnYjpQMCx0b1N0cmluZzpQMH0pO2Z1bmN0aW9uIFIwKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCl9ZnVuY3Rpb24gbkEoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXg4KCl9ZnVuY3Rpb24gaUEoKXtyZXR1cm4gTjAodGhpcykuZm9ybWF0SHNsKCl9ZnVuY3Rpb24gUDAoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKX1mdW5jdGlvbiBMYShyKXt2YXIgZSx0O3JldHVybiByPShyKyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwoZT1aRS5leGVjKHIpKT8odD1lWzFdLmxlbmd0aCxlPXBhcnNlSW50KGVbMV0sMTYpLHQ9PT02P0wwKGUpOnQ9PT0zP25ldyBtbihlPj44JjE1fGU+PjQmMjQwLGU+PjQmMTV8ZSYyNDAsKGUmMTUpPDw0fGUmMTUsMSk6dD09PTg/S2woZT4+MjQmMjU1LGU+PjE2JjI1NSxlPj44JjI1NSwoZSYyNTUpLzI1NSk6dD09PTQ/S2woZT4+MTImMTV8ZT4+OCYyNDAsZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fGUmMjQwLCgoZSYxNSk8PDR8ZSYxNSkvMjU1KTpudWxsKTooZT1KRS5leGVjKHIpKT9uZXcgbW4oZVsxXSxlWzJdLGVbM10sMSk6KGU9S0UuZXhlYyhyKSk/bmV3IG1uKGVbMV0qMjU1LzEwMCxlWzJdKjI1NS8xMDAsZVszXSoyNTUvMTAwLDEpOihlPVFFLmV4ZWMocikpP0tsKGVbMV0sZVsyXSxlWzNdLGVbNF0pOihlPWpFLmV4ZWMocikpP0tsKGVbMV0qMjU1LzEwMCxlWzJdKjI1NS8xMDAsZVszXSoyNTUvMTAwLGVbNF0pOihlPWVBLmV4ZWMocikpP0QwKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsMSk6KGU9dEEuZXhlYyhyKSk/RDAoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdKTpDMC5oYXNPd25Qcm9wZXJ0eShyKT9MMChDMFtyXSk6cj09PSJ0cmFuc3BhcmVudCI/bmV3IG1uKE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gTDAocil7cmV0dXJuIG5ldyBtbihyPj4xNiYyNTUscj4+OCYyNTUsciYyNTUsMSl9ZnVuY3Rpb24gS2wocixlLHQsbil7cmV0dXJuIG48PTAmJihyPWU9dD1OYU4pLG5ldyBtbihyLGUsdCxuKX1mdW5jdGlvbiByQShyKXtyZXR1cm4gciBpbnN0YW5jZW9mIENhfHwocj1MYShyKSkscj8ocj1yLnJnYigpLG5ldyBtbihyLnIsci5nLHIuYixyLm9wYWNpdHkpKTpuZXcgbW59ZnVuY3Rpb24gaGYocixlLHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0xP3JBKHIpOm5ldyBtbihyLGUsdCxuPT1udWxsPzE6bil9ZnVuY3Rpb24gbW4ocixlLHQsbil7dGhpcy5yPStyLHRoaXMuZz0rZSx0aGlzLmI9K3QsdGhpcy5vcGFjaXR5PStufWNmKG1uLGhmLFQwKENhLHticmlnaHRlcihyKXtyZXR1cm4gcj1yPT1udWxsP0psOk1hdGgucG93KEpsLHIpLG5ldyBtbih0aGlzLnIqcix0aGlzLmcqcix0aGlzLmIqcix0aGlzLm9wYWNpdHkpfSxkYXJrZXIocil7cmV0dXJuIHI9cj09bnVsbD9SYTpNYXRoLnBvdyhSYSxyKSxuZXcgbW4odGhpcy5yKnIsdGhpcy5nKnIsdGhpcy5iKnIsdGhpcy5vcGFjaXR5KX0scmdiKCl7cmV0dXJuIHRoaXN9LGNsYW1wKCl7cmV0dXJuIG5ldyBtbihncih0aGlzLnIpLGdyKHRoaXMuZyksZ3IodGhpcy5iKSxRbCh0aGlzLm9wYWNpdHkpKX0sZGlzcGxheWFibGUoKXtyZXR1cm4tLjU8PXRoaXMuciYmdGhpcy5yPDI1NS41JiYtLjU8PXRoaXMuZyYmdGhpcy5nPDI1NS41JiYtLjU8PXRoaXMuYiYmdGhpcy5iPDI1NS41JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0saGV4OkkwLGZvcm1hdEhleDpJMCxmb3JtYXRIZXg4OnNBLGZvcm1hdFJnYjpVMCx0b1N0cmluZzpVMH0pKTtmdW5jdGlvbiBJMCgpe3JldHVybmAjJHtfcih0aGlzLnIpfSR7X3IodGhpcy5nKX0ke19yKHRoaXMuYil9YH1mdW5jdGlvbiBzQSgpe3JldHVybmAjJHtfcih0aGlzLnIpfSR7X3IodGhpcy5nKX0ke19yKHRoaXMuYil9JHtfcigoaXNOYU4odGhpcy5vcGFjaXR5KT8xOnRoaXMub3BhY2l0eSkqMjU1KX1gfWZ1bmN0aW9uIFUwKCl7Y29uc3Qgcj1RbCh0aGlzLm9wYWNpdHkpO3JldHVybmAke3I9PT0xPyJyZ2IoIjoicmdiYSgifSR7Z3IodGhpcy5yKX0sICR7Z3IodGhpcy5nKX0sICR7Z3IodGhpcy5iKX0ke3I9PT0xPyIpIjpgLCAke3J9KWB9YH1mdW5jdGlvbiBRbChyKXtyZXR1cm4gaXNOYU4ocik/MTpNYXRoLm1heCgwLE1hdGgubWluKDEscikpfWZ1bmN0aW9uIGdyKHIpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHIpfHwwKSl9ZnVuY3Rpb24gX3Iocil7cmV0dXJuIHI9Z3IociksKHI8MTY/IjAiOiIiKStyLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBEMChyLGUsdCxuKXtyZXR1cm4gbjw9MD9yPWU9dD1OYU46dDw9MHx8dD49MT9yPWU9TmFOOmU8PTAmJihyPU5hTiksbmV3IHpuKHIsZSx0LG4pfWZ1bmN0aW9uIE4wKHIpe2lmKHIgaW5zdGFuY2VvZiB6bilyZXR1cm4gbmV3IHpuKHIuaCxyLnMsci5sLHIub3BhY2l0eSk7aWYociBpbnN0YW5jZW9mIENhfHwocj1MYShyKSksIXIpcmV0dXJuIG5ldyB6bjtpZihyIGluc3RhbmNlb2Ygem4pcmV0dXJuIHI7cj1yLnJnYigpO3ZhciBlPXIuci8yNTUsdD1yLmcvMjU1LG49ci5iLzI1NSxpPU1hdGgubWluKGUsdCxuKSxzPU1hdGgubWF4KGUsdCxuKSxhPU5hTixvPXMtaSxsPShzK2kpLzI7cmV0dXJuIG8/KGU9PT1zP2E9KHQtbikvbysodDxuKSo2OnQ9PT1zP2E9KG4tZSkvbysyOmE9KGUtdCkvbys0LG8vPWw8LjU/cytpOjItcy1pLGEqPTYwKTpvPWw+MCYmbDwxPzA6YSxuZXcgem4oYSxvLGwsci5vcGFjaXR5KX1mdW5jdGlvbiBhQShyLGUsdCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD09PTE/TjAocik6bmV3IHpuKHIsZSx0LG49PW51bGw/MTpuKX1mdW5jdGlvbiB6bihyLGUsdCxuKXt0aGlzLmg9K3IsdGhpcy5zPStlLHRoaXMubD0rdCx0aGlzLm9wYWNpdHk9K259Y2Yoem4sYUEsVDAoQ2Ese2JyaWdodGVyKHIpe3JldHVybiByPXI9PW51bGw/Smw6TWF0aC5wb3coSmwsciksbmV3IHpuKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnIsdGhpcy5vcGFjaXR5KX0sZGFya2VyKHIpe3JldHVybiByPXI9PW51bGw/UmE6TWF0aC5wb3coUmEsciksbmV3IHpuKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnIsdGhpcy5vcGFjaXR5KX0scmdiKCl7dmFyIHI9dGhpcy5oJTM2MCsodGhpcy5oPDApKjM2MCxlPWlzTmFOKHIpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLHQ9dGhpcy5sLG49dCsodDwuNT90OjEtdCkqZSxpPTIqdC1uO3JldHVybiBuZXcgbW4odWYocj49MjQwP3ItMjQwOnIrMTIwLGksbiksdWYocixpLG4pLHVmKHI8MTIwP3IrMjQwOnItMTIwLGksbiksdGhpcy5vcGFjaXR5KX0sY2xhbXAoKXtyZXR1cm4gbmV3IHpuKEYwKHRoaXMuaCksamwodGhpcy5zKSxqbCh0aGlzLmwpLFFsKHRoaXMub3BhY2l0eSkpfSxkaXNwbGF5YWJsZSgpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsKCl7Y29uc3Qgcj1RbCh0aGlzLm9wYWNpdHkpO3JldHVybmAke3I9PT0xPyJoc2woIjoiaHNsYSgifSR7RjAodGhpcy5oKX0sICR7amwodGhpcy5zKSoxMDB9JSwgJHtqbCh0aGlzLmwpKjEwMH0lJHtyPT09MT8iKSI6YCwgJHtyfSlgfWB9fSkpO2Z1bmN0aW9uIEYwKHIpe3JldHVybiByPShyfHwwKSUzNjAscjwwP3IrMzYwOnJ9ZnVuY3Rpb24gamwocil7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMSxyfHwwKSl9ZnVuY3Rpb24gdWYocixlLHQpe3JldHVybihyPDYwP2UrKHQtZSkqci82MDpyPDE4MD90OnI8MjQwP2UrKHQtZSkqKDI0MC1yKS82MDplKSoyNTV9dmFyIGZmPXI9PigpPT5yO2Z1bmN0aW9uIG9BKHIsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByK3QqZX19ZnVuY3Rpb24gbEEocixlLHQpe3JldHVybiByPU1hdGgucG93KHIsdCksZT1NYXRoLnBvdyhlLHQpLXIsdD0xL3QsZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KHIrbiplLHQpfX1mdW5jdGlvbiBjQShyKXtyZXR1cm4ocj0rcik9PTE/TzA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC1lP2xBKGUsdCxyKTpmZihpc05hTihlKT90OmUpfX1mdW5jdGlvbiBPMChyLGUpe3ZhciB0PWUtcjtyZXR1cm4gdD9vQShyLHQpOmZmKGlzTmFOKHIpP2U6cil9dmFyIEIwPWZ1bmN0aW9uIHIoZSl7dmFyIHQ9Y0EoZSk7ZnVuY3Rpb24gbihpLHMpe3ZhciBhPXQoKGk9aGYoaSkpLnIsKHM9aGYocykpLnIpLG89dChpLmcscy5nKSxsPXQoaS5iLHMuYiksYz1PMChpLm9wYWNpdHkscy5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oaCl7cmV0dXJuIGkucj1hKGgpLGkuZz1vKGgpLGkuYj1sKGgpLGkub3BhY2l0eT1jKGgpLGkrIiJ9fXJldHVybiBuLmdhbW1hPXIsbn0oMSk7ZnVuY3Rpb24gaEEocixlKXtlfHwoZT1bXSk7dmFyIHQ9cj9NYXRoLm1pbihlLmxlbmd0aCxyLmxlbmd0aCk6MCxuPWUuc2xpY2UoKSxpO3JldHVybiBmdW5jdGlvbihzKXtmb3IoaT0wO2k8dDsrK2kpbltpXT1yW2ldKigxLXMpK2VbaV0qcztyZXR1cm4gbn19ZnVuY3Rpb24gdUEocil7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhyKSYmIShyIGluc3RhbmNlb2YgRGF0YVZpZXcpfWZ1bmN0aW9uIGZBKHIsZSl7dmFyIHQ9ZT9lLmxlbmd0aDowLG49cj9NYXRoLm1pbih0LHIubGVuZ3RoKTowLGk9bmV3IEFycmF5KG4pLHM9bmV3IEFycmF5KHQpLGE7Zm9yKGE9MDthPG47KythKWlbYV09bWYoclthXSxlW2FdKTtmb3IoO2E8dDsrK2Epc1thXT1lW2FdO3JldHVybiBmdW5jdGlvbihvKXtmb3IoYT0wO2E8bjsrK2Epc1thXT1pW2FdKG8pO3JldHVybiBzfX1mdW5jdGlvbiBkQShyLGUpe3ZhciB0PW5ldyBEYXRlO3JldHVybiByPStyLGU9K2UsZnVuY3Rpb24obil7cmV0dXJuIHQuc2V0VGltZShyKigxLW4pK2UqbiksdH19ZnVuY3Rpb24gZWMocixlKXtyZXR1cm4gcj0rcixlPStlLGZ1bmN0aW9uKHQpe3JldHVybiByKigxLXQpK2UqdH19ZnVuY3Rpb24gcEEocixlKXt2YXIgdD17fSxuPXt9LGk7KHI9PT1udWxsfHx0eXBlb2YgciE9Im9iamVjdCIpJiYocj17fSksKGU9PT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpJiYoZT17fSk7Zm9yKGkgaW4gZSlpIGluIHI/dFtpXT1tZihyW2ldLGVbaV0pOm5baV09ZVtpXTtyZXR1cm4gZnVuY3Rpb24ocyl7Zm9yKGkgaW4gdCluW2ldPXRbaV0ocyk7cmV0dXJuIG59fXZhciBkZj0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2cscGY9bmV3IFJlZ0V4cChkZi5zb3VyY2UsImciKTtmdW5jdGlvbiBtQShyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcn19ZnVuY3Rpb24gZ0Eocil7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiByKGUpKyIifX1mdW5jdGlvbiBfQShyLGUpe3ZhciB0PWRmLmxhc3RJbmRleD1wZi5sYXN0SW5kZXg9MCxuLGkscyxhPS0xLG89W10sbD1bXTtmb3Iocj1yKyIiLGU9ZSsiIjsobj1kZi5leGVjKHIpKSYmKGk9cGYuZXhlYyhlKSk7KShzPWkuaW5kZXgpPnQmJihzPWUuc2xpY2UodCxzKSxvW2FdP29bYV0rPXM6b1srK2FdPXMpLChuPW5bMF0pPT09KGk9aVswXSk/b1thXT9vW2FdKz1pOm9bKythXT1pOihvWysrYV09bnVsbCxsLnB1c2goe2k6YSx4OmVjKG4saSl9KSksdD1wZi5sYXN0SW5kZXg7cmV0dXJuIHQ8ZS5sZW5ndGgmJihzPWUuc2xpY2UodCksb1thXT9vW2FdKz1zOm9bKythXT1zKSxvLmxlbmd0aDwyP2xbMF0/Z0EobFswXS54KTptQShlKTooZT1sLmxlbmd0aCxmdW5jdGlvbihjKXtmb3IodmFyIGg9MCx1O2g8ZTsrK2gpb1sodT1sW2hdKS5pXT11LngoYyk7cmV0dXJuIG8uam9pbigiIil9KX1mdW5jdGlvbiBtZihyLGUpe3ZhciB0PXR5cGVvZiBlLG47cmV0dXJuIGU9PW51bGx8fHQ9PT0iYm9vbGVhbiI/ZmYoZSk6KHQ9PT0ibnVtYmVyIj9lYzp0PT09InN0cmluZyI/KG49TGEoZSkpPyhlPW4sQjApOl9BOmUgaW5zdGFuY2VvZiBMYT9CMDplIGluc3RhbmNlb2YgRGF0ZT9kQTp1QShlKT9oQTpBcnJheS5pc0FycmF5KGUpP2ZBOnR5cGVvZiBlLnZhbHVlT2YhPSJmdW5jdGlvbiImJnR5cGVvZiBlLnRvU3RyaW5nIT0iZnVuY3Rpb24ifHxpc05hTihlKT9wQTplYykocixlKX1mdW5jdGlvbiB4QShyLGUpe3JldHVybiByPStyLGU9K2UsZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQociooMS10KStlKnQpfX1mdW5jdGlvbiB5QShyKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcn19ZnVuY3Rpb24gdkEocil7cmV0dXJuK3J9dmFyIHowPVswLDFdO2Z1bmN0aW9uIGdzKHIpe3JldHVybiByfWZ1bmN0aW9uIGdmKHIsZSl7cmV0dXJuKGUtPXI9K3IpP2Z1bmN0aW9uKHQpe3JldHVybih0LXIpL2V9OnlBKGlzTmFOKGUpP05hTjouNSl9ZnVuY3Rpb24gTUEocixlKXt2YXIgdDtyZXR1cm4gcj5lJiYodD1yLHI9ZSxlPXQpLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLm1heChyLE1hdGgubWluKGUsbikpfX1mdW5jdGlvbiBTQShyLGUsdCl7dmFyIG49clswXSxpPXJbMV0scz1lWzBdLGE9ZVsxXTtyZXR1cm4gaTxuPyhuPWdmKGksbikscz10KGEscykpOihuPWdmKG4saSkscz10KHMsYSkpLGZ1bmN0aW9uKG8pe3JldHVybiBzKG4obykpfX1mdW5jdGlvbiBiQShyLGUsdCl7dmFyIG49TWF0aC5taW4oci5sZW5ndGgsZS5sZW5ndGgpLTEsaT1uZXcgQXJyYXkobikscz1uZXcgQXJyYXkobiksYT0tMTtmb3IocltuXTxyWzBdJiYocj1yLnNsaWNlKCkucmV2ZXJzZSgpLGU9ZS5zbGljZSgpLnJldmVyc2UoKSk7KythPG47KWlbYV09Z2YoclthXSxyW2ErMV0pLHNbYV09dChlW2FdLGVbYSsxXSk7cmV0dXJuIGZ1bmN0aW9uKG8pe3ZhciBsPUkxKHIsbywxLG4pLTE7cmV0dXJuIHNbbF0oaVtsXShvKSl9fWZ1bmN0aW9uIHdBKHIsZSl7cmV0dXJuIGUuZG9tYWluKHIuZG9tYWluKCkpLnJhbmdlKHIucmFuZ2UoKSkuaW50ZXJwb2xhdGUoci5pbnRlcnBvbGF0ZSgpKS5jbGFtcChyLmNsYW1wKCkpLnVua25vd24oci51bmtub3duKCkpfWZ1bmN0aW9uIEVBKCl7dmFyIHI9ejAsZT16MCx0PW1mLG4saSxzLGE9Z3MsbyxsLGM7ZnVuY3Rpb24gaCgpe3ZhciBmPU1hdGgubWluKHIubGVuZ3RoLGUubGVuZ3RoKTtyZXR1cm4gYSE9PWdzJiYoYT1NQShyWzBdLHJbZi0xXSkpLG89Zj4yP2JBOlNBLGw9Yz1udWxsLHV9ZnVuY3Rpb24gdShmKXtyZXR1cm4gZj09bnVsbHx8aXNOYU4oZj0rZik/czoobHx8KGw9byhyLm1hcChuKSxlLHQpKSkobihhKGYpKSl9cmV0dXJuIHUuaW52ZXJ0PWZ1bmN0aW9uKGYpe3JldHVybiBhKGkoKGN8fChjPW8oZSxyLm1hcChuKSxlYykpKShmKSkpfSx1LmRvbWFpbj1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1BcnJheS5mcm9tKGYsdkEpLGgoKSk6ci5zbGljZSgpfSx1LnJhbmdlPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUFycmF5LmZyb20oZiksaCgpKTplLnNsaWNlKCl9LHUucmFuZ2VSb3VuZD1mdW5jdGlvbihmKXtyZXR1cm4gZT1BcnJheS5mcm9tKGYpLHQ9eEEsaCgpfSx1LmNsYW1wPWZ1bmN0aW9uKGYpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPWY/ITA6Z3MsaCgpKTphIT09Z3N9LHUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24oZil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZixoKCkpOnR9LHUudW5rbm93bj1mdW5jdGlvbihmKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1mLHUpOnN9LGZ1bmN0aW9uKGYsZCl7cmV0dXJuIG49ZixpPWQsaCgpfX1mdW5jdGlvbiBBQSgpe3JldHVybiBFQSgpKGdzLGdzKX1mdW5jdGlvbiBUQShyKXtyZXR1cm4gTWF0aC5hYnMocj1NYXRoLnJvdW5kKHIpKT49MWUyMT9yLnRvTG9jYWxlU3RyaW5nKCJlbiIpLnJlcGxhY2UoLywvZywiIik6ci50b1N0cmluZygxMCl9ZnVuY3Rpb24gdGMocixlKXtpZigodD0ocj1lP3IudG9FeHBvbmVudGlhbChlLTEpOnIudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKCJlIikpPDApcmV0dXJuIG51bGw7dmFyIHQsbj1yLnNsaWNlKDAsdCk7cmV0dXJuW24ubGVuZ3RoPjE/blswXStuLnNsaWNlKDIpOm4sK3Iuc2xpY2UodCsxKV19ZnVuY3Rpb24gX3Mocil7cmV0dXJuIHI9dGMoTWF0aC5hYnMocikpLHI/clsxXTpOYU59ZnVuY3Rpb24gQ0EocixlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXtmb3IodmFyIGk9dC5sZW5ndGgscz1bXSxhPTAsbz1yWzBdLGw9MDtpPjAmJm8+MCYmKGwrbysxPm4mJihvPU1hdGgubWF4KDEsbi1sKSkscy5wdXNoKHQuc3Vic3RyaW5nKGktPW8saStvKSksISgobCs9bysxKT5uKSk7KW89clthPShhKzEpJXIubGVuZ3RoXTtyZXR1cm4gcy5yZXZlcnNlKCkuam9pbihlKX19ZnVuY3Rpb24gUkEocil7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1swLTldL2csZnVuY3Rpb24odCl7cmV0dXJuIHJbK3RdfSl9fXZhciBQQT0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiBuYyhyKXtpZighKGU9UEEuZXhlYyhyKSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIityKTt2YXIgZTtyZXR1cm4gbmV3IF9mKHtmaWxsOmVbMV0sYWxpZ246ZVsyXSxzaWduOmVbM10sc3ltYm9sOmVbNF0semVybzplWzVdLHdpZHRoOmVbNl0sY29tbWE6ZVs3XSxwcmVjaXNpb246ZVs4XSYmZVs4XS5zbGljZSgxKSx0cmltOmVbOV0sdHlwZTplWzEwXX0pfW5jLnByb3RvdHlwZT1fZi5wcm90b3R5cGU7ZnVuY3Rpb24gX2Yocil7dGhpcy5maWxsPXIuZmlsbD09PXZvaWQgMD8iICI6ci5maWxsKyIiLHRoaXMuYWxpZ249ci5hbGlnbj09PXZvaWQgMD8iPiI6ci5hbGlnbisiIix0aGlzLnNpZ249ci5zaWduPT09dm9pZCAwPyItIjpyLnNpZ24rIiIsdGhpcy5zeW1ib2w9ci5zeW1ib2w9PT12b2lkIDA/IiI6ci5zeW1ib2wrIiIsdGhpcy56ZXJvPSEhci56ZXJvLHRoaXMud2lkdGg9ci53aWR0aD09PXZvaWQgMD92b2lkIDA6K3Iud2lkdGgsdGhpcy5jb21tYT0hIXIuY29tbWEsdGhpcy5wcmVjaXNpb249ci5wcmVjaXNpb249PT12b2lkIDA/dm9pZCAwOityLnByZWNpc2lvbix0aGlzLnRyaW09ISFyLnRyaW0sdGhpcy50eXBlPXIudHlwZT09PXZvaWQgMD8iIjpyLnR5cGUrIiJ9X2YucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKHRoaXMud2lkdGg9PT12b2lkIDA/IiI6TWF0aC5tYXgoMSx0aGlzLndpZHRofDApKSsodGhpcy5jb21tYT8iLCI6IiIpKyh0aGlzLnByZWNpc2lvbj09PXZvaWQgMD8iIjoiLiIrTWF0aC5tYXgoMCx0aGlzLnByZWNpc2lvbnwwKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07ZnVuY3Rpb24gTEEocil7ZTpmb3IodmFyIGU9ci5sZW5ndGgsdD0xLG49LTEsaTt0PGU7Kyt0KXN3aXRjaChyW3RdKXtjYXNlIi4iOm49aT10O2JyZWFrO2Nhc2UiMCI6bj09PTAmJihuPXQpLGk9dDticmVhaztkZWZhdWx0OmlmKCErclt0XSlicmVhayBlO24+MCYmKG49MCk7YnJlYWt9cmV0dXJuIG4+MD9yLnNsaWNlKDAsbikrci5zbGljZShpKzEpOnJ9dmFyIGswO2Z1bmN0aW9uIElBKHIsZSl7dmFyIHQ9dGMocixlKTtpZighdClyZXR1cm4gcisiIjt2YXIgbj10WzBdLGk9dFsxXSxzPWktKGswPU1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihpLzMpKSkqMykrMSxhPW4ubGVuZ3RoO3JldHVybiBzPT09YT9uOnM+YT9uK25ldyBBcnJheShzLWErMSkuam9pbigiMCIpOnM+MD9uLnNsaWNlKDAscykrIi4iK24uc2xpY2Uocyk6IjAuIituZXcgQXJyYXkoMS1zKS5qb2luKCIwIikrdGMocixNYXRoLm1heCgwLGUrcy0xKSlbMF19ZnVuY3Rpb24gRzAocixlKXt2YXIgdD10YyhyLGUpO2lmKCF0KXJldHVybiByKyIiO3ZhciBuPXRbMF0saT10WzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStuOm4ubGVuZ3RoPmkrMT9uLnNsaWNlKDAsaSsxKSsiLiIrbi5zbGljZShpKzEpOm4rbmV3IEFycmF5KGktbi5sZW5ndGgrMikuam9pbigiMCIpfXZhciBWMD17IiUiOihyLGUpPT4ocioxMDApLnRvRml4ZWQoZSksYjpyPT5NYXRoLnJvdW5kKHIpLnRvU3RyaW5nKDIpLGM6cj0+cisiIixkOlRBLGU6KHIsZSk9PnIudG9FeHBvbmVudGlhbChlKSxmOihyLGUpPT5yLnRvRml4ZWQoZSksZzoocixlKT0+ci50b1ByZWNpc2lvbihlKSxvOnI9Pk1hdGgucm91bmQocikudG9TdHJpbmcoOCkscDoocixlKT0+RzAocioxMDAsZSkscjpHMCxzOklBLFg6cj0+TWF0aC5yb3VuZChyKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSx4OnI9Pk1hdGgucm91bmQocikudG9TdHJpbmcoMTYpfTtmdW5jdGlvbiBIMChyKXtyZXR1cm4gcn12YXIgVzA9QXJyYXkucHJvdG90eXBlLm1hcCxYMD1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl07ZnVuY3Rpb24gVUEocil7dmFyIGU9ci5ncm91cGluZz09PXZvaWQgMHx8ci50aG91c2FuZHM9PT12b2lkIDA/SDA6Q0EoVzAuY2FsbChyLmdyb3VwaW5nLE51bWJlciksci50aG91c2FuZHMrIiIpLHQ9ci5jdXJyZW5jeT09PXZvaWQgMD8iIjpyLmN1cnJlbmN5WzBdKyIiLG49ci5jdXJyZW5jeT09PXZvaWQgMD8iIjpyLmN1cnJlbmN5WzFdKyIiLGk9ci5kZWNpbWFsPT09dm9pZCAwPyIuIjpyLmRlY2ltYWwrIiIscz1yLm51bWVyYWxzPT09dm9pZCAwP0gwOlJBKFcwLmNhbGwoci5udW1lcmFscyxTdHJpbmcpKSxhPXIucGVyY2VudD09PXZvaWQgMD8iJSI6ci5wZXJjZW50KyIiLG89ci5taW51cz09PXZvaWQgMD8i4oiSIjpyLm1pbnVzKyIiLGw9ci5uYW49PT12b2lkIDA/Ik5hTiI6ci5uYW4rIiI7ZnVuY3Rpb24gYyh1KXt1PW5jKHUpO3ZhciBmPXUuZmlsbCxkPXUuYWxpZ24scD11LnNpZ24sXz11LnN5bWJvbCxnPXUuemVybyxtPXUud2lkdGgseT11LmNvbW1hLHg9dS5wcmVjaXNpb24sdj11LnRyaW0sUz11LnR5cGU7Uz09PSJuIj8oeT0hMCxTPSJnIik6VjBbU118fCh4PT09dm9pZCAwJiYoeD0xMiksdj0hMCxTPSJnIiksKGd8fGY9PT0iMCImJmQ9PT0iPSIpJiYoZz0hMCxmPSIwIixkPSI9Iik7dmFyIGI9Xz09PSIkIj90Ol89PT0iIyImJi9bYm94WF0vLnRlc3QoUyk/IjAiK1MudG9Mb3dlckNhc2UoKToiIixBPV89PT0iJCI/bjovWyVwXS8udGVzdChTKT9hOiIiLEw9VjBbU10sTT0vW2RlZmdwcnMlXS8udGVzdChTKTt4PXg9PT12b2lkIDA/NjovW2dwcnNdLy50ZXN0KFMpP01hdGgubWF4KDEsTWF0aC5taW4oMjEseCkpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAseCkpO2Z1bmN0aW9uIHcoUil7dmFyIE49YixCPUEsSSxVLHo7aWYoUz09PSJjIilCPUwoUikrQixSPSIiO2Vsc2V7Uj0rUjt2YXIgRj1SPDB8fDEvUjwwO2lmKFI9aXNOYU4oUik/bDpMKE1hdGguYWJzKFIpLHgpLHYmJihSPUxBKFIpKSxGJiYrUj09MCYmcCE9PSIrIiYmKEY9ITEpLE49KEY/cD09PSIoIj9wOm86cD09PSItInx8cD09PSIoIj8iIjpwKStOLEI9KFM9PT0icyI/WDBbOCtrMC8zXToiIikrQisoRiYmcD09PSIoIj8iKSI6IiIpLE0pe2ZvcihJPS0xLFU9Ui5sZW5ndGg7KytJPFU7KWlmKHo9Ui5jaGFyQ29kZUF0KEkpLDQ4Pnp8fHo+NTcpe0I9KHo9PT00Nj9pK1Iuc2xpY2UoSSsxKTpSLnNsaWNlKEkpKStCLFI9Ui5zbGljZSgwLEkpO2JyZWFrfX19eSYmIWcmJihSPWUoUiwxLzApKTt2YXIgWj1OLmxlbmd0aCtSLmxlbmd0aCtCLmxlbmd0aCxWPVo8bT9uZXcgQXJyYXkobS1aKzEpLmpvaW4oZik6IiI7c3dpdGNoKHkmJmcmJihSPWUoVitSLFYubGVuZ3RoP20tQi5sZW5ndGg6MS8wKSxWPSIiKSxkKXtjYXNlIjwiOlI9TitSK0IrVjticmVhaztjYXNlIj0iOlI9TitWK1IrQjticmVhaztjYXNlIl4iOlI9Vi5zbGljZSgwLFo9Vi5sZW5ndGg+PjEpK04rUitCK1Yuc2xpY2UoWik7YnJlYWs7ZGVmYXVsdDpSPVYrTitSK0I7YnJlYWt9cmV0dXJuIHMoUil9cmV0dXJuIHcudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdSsiIn0sd31mdW5jdGlvbiBoKHUsZil7dmFyIGQ9YygodT1uYyh1KSx1LnR5cGU9ImYiLHUpKSxwPU1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihfcyhmKS8zKSkpKjMsXz1NYXRoLnBvdygxMCwtcCksZz1YMFs4K3AvM107cmV0dXJuIGZ1bmN0aW9uKG0pe3JldHVybiBkKF8qbSkrZ319cmV0dXJue2Zvcm1hdDpjLGZvcm1hdFByZWZpeDpofX12YXIgaWMscTAsJDA7REEoe3Rob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdfSk7ZnVuY3Rpb24gREEocil7cmV0dXJuIGljPVVBKHIpLHEwPWljLmZvcm1hdCwkMD1pYy5mb3JtYXRQcmVmaXgsaWN9ZnVuY3Rpb24gTkEocil7cmV0dXJuIE1hdGgubWF4KDAsLV9zKE1hdGguYWJzKHIpKSl9ZnVuY3Rpb24gRkEocixlKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoX3MoZSkvMykpKSozLV9zKE1hdGguYWJzKHIpKSl9ZnVuY3Rpb24gT0EocixlKXtyZXR1cm4gcj1NYXRoLmFicyhyKSxlPU1hdGguYWJzKGUpLXIsTWF0aC5tYXgoMCxfcyhlKS1fcyhyKSkrMX1mdW5jdGlvbiBCQShyLGUsdCxuKXt2YXIgaT1PMShyLGUsdCkscztzd2l0Y2gobj1uYyhuPT1udWxsPyIsZiI6biksbi50eXBlKXtjYXNlInMiOnt2YXIgYT1NYXRoLm1heChNYXRoLmFicyhyKSxNYXRoLmFicyhlKSk7cmV0dXJuIG4ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocz1GQShpLGEpKSYmKG4ucHJlY2lzaW9uPXMpLCQwKG4sYSl9Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6e24ucHJlY2lzaW9uPT1udWxsJiYhaXNOYU4ocz1PQShpLE1hdGgubWF4KE1hdGguYWJzKHIpLE1hdGguYWJzKGUpKSkpJiYobi5wcmVjaXNpb249cy0obi50eXBlPT09ImUiKSk7YnJlYWt9Y2FzZSJmIjpjYXNlIiUiOntuLnByZWNpc2lvbj09bnVsbCYmIWlzTmFOKHM9TkEoaSkpJiYobi5wcmVjaXNpb249cy0obi50eXBlPT09IiUiKSoyKTticmVha319cmV0dXJuIHEwKG4pfWZ1bmN0aW9uIHpBKHIpe3ZhciBlPXIuZG9tYWluO3JldHVybiByLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuPWUoKTtyZXR1cm4gRjEoblswXSxuW24ubGVuZ3RoLTFdLHQ9PW51bGw/MTA6dCl9LHIudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3ZhciBpPWUoKTtyZXR1cm4gQkEoaVswXSxpW2kubGVuZ3RoLTFdLHQ9PW51bGw/MTA6dCxuKX0sci5uaWNlPWZ1bmN0aW9uKHQpe3Q9PW51bGwmJih0PTEwKTt2YXIgbj1lKCksaT0wLHM9bi5sZW5ndGgtMSxhPW5baV0sbz1uW3NdLGwsYyxoPTEwO2ZvcihvPGEmJihjPWEsYT1vLG89YyxjPWksaT1zLHM9Yyk7aC0tID4wOyl7aWYoYz1idShhLG8sdCksYz09PWwpcmV0dXJuIG5baV09YSxuW3NdPW8sZShuKTtpZihjPjApYT1NYXRoLmZsb29yKGEvYykqYyxvPU1hdGguY2VpbChvL2MpKmM7ZWxzZSBpZihjPDApYT1NYXRoLmNlaWwoYSpjKS9jLG89TWF0aC5mbG9vcihvKmMpL2M7ZWxzZSBicmVhaztsPWN9cmV0dXJuIHJ9LHJ9ZnVuY3Rpb24geGYoKXt2YXIgcj1BQSgpO3JldHVybiByLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gd0Eocix4ZigpKX0sWUUuYXBwbHkocixhcmd1bWVudHMpLHpBKHIpfWZ1bmN0aW9uIGtBKHIsZSl7cmV0dXJuIHIubWFwKHQ9Pntjb25zdCBuPVtdO2xldCBpO3JldHVybiB0LmZvckVhY2gocz0+e2lmKGkpe2NvbnN0IGE9bHMocyxpKSoxODAvTWF0aC5QSTtpZihhPmUpe2NvbnN0IG89eXcoaSxzKSxsPTEvTWF0aC5jZWlsKGEvZSk7bGV0IGM9bDtmb3IoO2M8MTspbi5wdXNoKG8oYykpLGMrPWx9fW4ucHVzaChpPXMpfSksbn0pfWZ1bmN0aW9uIEdBKHIse21pbkxuZzplLG1heExuZzp0LG1pbkxhdDpuLG1heExhdDppfT17fSl7Y29uc3Qgcz1NYXRoLnJvdW5kKHhzKDM2MC9yLDIpL01hdGguUEkpLGE9KDErTWF0aC5zcXJ0KDUpKS8yLG89ZD0+ZC9hKjM2MCUzNjAtMTgwLGw9ZD0+TWF0aC5hY29zKDIqZC9zLTEpL01hdGguUEkqMTgwLTkwLGM9ZD0+cyooTWF0aC5jb3MoKGQrOTApKk1hdGguUEkvMTgwKSsxKS8yLGg9W2khPT12b2lkIDA/TWF0aC5jZWlsKGMoaSkpOjAsbiE9PXZvaWQgMD9NYXRoLmZsb29yKGMobikpOnMtMV0sdT1lPT09dm9pZCAwJiZ0PT09dm9pZCAwPygpPT4hMDplPT09dm9pZCAwP2Q9PmQ8PXQ6dD09PXZvaWQgMD9kPT5kPj1lOnQ+PWU/ZD0+ZD49ZSYmZDw9dDpkPT5kPj1lfHxkPD10LGY9W107Zm9yKGxldCBkPWhbMF07ZDw9aFsxXTtkKyspe2NvbnN0IHA9byhkKTt1KHApJiZmLnB1c2goW3AsbChkKV0pfXJldHVybiBmfWZ1bmN0aW9uIHlmKHIsZSx0PSExKXtyZXR1cm4gdD94dyhlLHIpOk1FKHIsZSl9ZnVuY3Rpb24gVkEocixlKXtjb25zdCB0PXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpyfSxbW24saV0sW3MsYV1dPVJnKHQpO2lmKE1hdGgubWluKE1hdGguYWJzKHMtbiksTWF0aC5hYnMoYS1pKSk8ZSlyZXR1cm5bXTtjb25zdCBvPW4+c3x8YT49ODl8fGk8PS04OTtyZXR1cm4gR0EoZSx7bWluTG5nOm4sbWF4TG5nOnMsbWluTGF0OmksbWF4TGF0OmF9KS5maWx0ZXIobD0+eWYobCx0LG8pKX1mdW5jdGlvbiBIQShyLHtyZXNvbHV0aW9uOmU9MS8wfT17fSl7Y29uc3QgdD1rQShyLGUpLG49Z2EodCksaT1WQShyLGUpLHM9Wy4uLm4sLi4uaV0sYT17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6cn0sW1tvLGxdLFtjLGhdXT1SZyhhKSx1PW8+Y3x8aD49ODl8fGw8PS04OTtsZXQgZj1bXTtpZih1KXtjb25zdCBtPSRFKHMpLnRyaWFuZ2xlcygpLHk9bmV3IE1hcChzLm1hcCgoW3gsdl0sUyk9PltgJHt4fS0ke3Z9YCxTXSkpO20uZmVhdHVyZXMuZm9yRWFjaCh4PT57Y29uc3Qgdj14Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdLnNsaWNlKDAsMykucmV2ZXJzZSgpLFM9W107aWYodi5mb3JFYWNoKChbYixBXSk9Pntjb25zdCBMPWAke2J9LSR7QX1gO3kuaGFzKEwpJiZTLnB1c2goeS5nZXQoTCkpfSksUy5sZW5ndGg9PT0zKXtpZihTLnNvbWUoYj0+YjxuLmxlbmd0aCkpe2NvbnN0IGI9eC5wcm9wZXJ0aWVzLmNpcmN1bWNlbnRlcjtpZigheWYoYixhLHUpKXJldHVybn1mLnB1c2goLi4uUyl9fSl9ZWxzZSBpZihpLmxlbmd0aCl7Y29uc3QgbT1BYS5mcm9tKHMpO2ZvcihsZXQgeT0wLHg9bS50cmlhbmdsZXMubGVuZ3RoO3k8eDt5Kz0zKXtjb25zdCB2PVsyLDEsMF0ubWFwKGI9Pm0udHJpYW5nbGVzW3krYl0pLFM9di5tYXAoYj0+c1tiXSk7aWYodi5zb21lKGI9PmI8bi5sZW5ndGgpKXtjb25zdCBiPVswLDFdLm1hcChBPT5CMShTLEw9PkxbQV0pKTtpZigheWYoYixhLHUpKWNvbnRpbnVlfWYucHVzaCguLi52KX19ZWxzZXtjb25zdHt2ZXJ0aWNlczptLGhvbGVzOnk9W119PWhzLmZsYXR0ZW4odCk7Zj1ocyhtLHksMil9Y29uc3QgZD14ZihtbChzLG09Pm1bMF0pLFswLDFdKSxwPXhmKG1sKHMsbT0+bVsxXSksWzAsMV0pLF89cy5tYXAoKFttLHldKT0+W2QobSkscCh5KV0pO3JldHVybntjb250b3VyOnQsdHJpYW5nbGVzOntwb2ludHM6cyxpbmRpY2VzOmYsdXZzOl99fX1jb25zdCBZMD1uZXcga2UoKS5zZXRBdHRyaWJ1dGU/InNldEF0dHJpYnV0ZSI6ImFkZEF0dHJpYnV0ZSI7ZnVuY3Rpb24gcmMocixlLHQ9ITApe2NvbnN0IG49ci5tYXAoaT0+aS5tYXAoKFtzLGFdKT0+dD9FMShzLGEsZSk6W3MsYSxlXSkpO3JldHVybiBocy5mbGF0dGVuKG4pfWZ1bmN0aW9uIFdBKHIsZSx0LG49ITApe2NvbnN0e3ZlcnRpY2VzOmksaG9sZXM6c309cmMocixlLG4pLHt2ZXJ0aWNlczphfT1yYyhyLHQsbiksbz1nYShbYSxpXSksbD1NYXRoLnJvdW5kKGEubGVuZ3RoLzMpLGM9bmV3IFNldChzKTtsZXQgaD0wO2NvbnN0IHU9W107Zm9yKGxldCBkPTA7ZDxsO2QrKyl7bGV0IHA9ZCsxO2lmKHA9PT1sKXA9aDtlbHNlIGlmKGMuaGFzKHApKXtjb25zdCBfPXA7cD1oLGg9X311LnB1c2goZCxkK2wscCtsKSx1LnB1c2gocCtsLHAsZCl9Y29uc3QgZj1bXTtmb3IobGV0IGQ9MTtkPj0wO2QtLSlmb3IobGV0IHA9MDtwPGw7cCs9MSlmLnB1c2gocC8obC0xKSxkKTtyZXR1cm57aW5kaWNlczp1LHZlcnRpY2VzOm8sdXZzOmYsdG9wVmVydHM6YX19ZnVuY3Rpb24gWjAocixlLHQsbj0hMCxpPSEwKXtyZXR1cm57aW5kaWNlczpuP3IuaW5kaWNlczpyLmluZGljZXMuc2xpY2UoKS5yZXZlcnNlKCksdmVydGljZXM6cmMoW3IucG9pbnRzXSxlLGkpLnZlcnRpY2VzLHV2czp0fX1jb25zdCBKMD0oe3BvbHlnb25HZW9Kc29uOnIsc3RhcnRIZWlnaHQ6ZSxlbmRIZWlnaHQ6dCxjdXJ2YXR1cmVSZXNvbHV0aW9uOm49MSxjYXJ0ZXNpYW46aT0hMCxoYXNTaWRlOnM9ITAsaGFzQm90dG9tOmE9ITEsaGFzVG9wOm89ITF9KT0+e3IuZm9yRWFjaChfPT57bEUoXyl8fF8ucmV2ZXJzZSgpfSk7Y29uc3R7Y29udG91cjpsLHRyaWFuZ2xlczpjfT1IQShyLHtyZXNvbHV0aW9uOm59KTtsZXQgaD17fSx1O3MmJihoPVdBKGwsZSE9bnVsbD9lOnQsdCE9bnVsbD90OmUsaSksdT1oLnRvcFZlcnRzKTtsZXQgZj1bXTsoYXx8bykmJihmPWdhKGMudXZzKSk7bGV0IGQ9e307YSYmKGQ9WjAoYyxlLGYsITEsaSkpO2xldCBwPXt9O3JldHVybiBvJiYocD1aMChjLHQsZiwhMCxpKSkse2NvbnRvdXI6bCx0cmlhbmdsZXM6YyxzaWRlVG9yc286aCxib3R0b21DYXA6ZCx0b3BDYXA6cCx0b3BWZXJ0czp1fX07Y2xhc3MgWEEgZXh0ZW5kcyBrZXtjb25zdHJ1Y3RvcihlLHQ9e30pe3N1cGVyKCksdGhpcy50eXBlPSJQb2x5Z29uQnVmZmVyR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz12cih7cG9seWdvbkdlb0pzb246ZSxzdGFydEhlaWdodDowLGVuZEhlaWdodDoxLGhhc1RvcDohMCxoYXNCb3R0b206ITAsaGFzU2lkZTohMCxjdXJ2YXR1cmVSZXNvbHV0aW9uOjEsY2FydGVzaWFuOiEwLHVzZXJEYXRhUnNvT2Zmc2V0OjB9LHQpO2NvbnN0e2VuZEhlaWdodDpuLGhhc1RvcDppLGhhc0JvdHRvbTpzLGhhc1NpZGU6YSxjYXJ0ZXNpYW46byx1c2VyRGF0YVJzb09mZnNldDpsfT10aGlzLnBhcmFtZXRlcnMse2NvbnRvdXI6YyxzaWRlVG9yc286aCx0b3BWZXJ0czp1LGJvdHRvbUNhcDpmLHRvcENhcDpkfT1KMCh2cih7fSx0aGlzLnBhcmFtZXRlcnMpKTtsZXQgcD1bXSxfPVtdLGc9W10sbT0wO2NvbnN0IHk9eD0+e2NvbnN0IHY9TWF0aC5yb3VuZChwLmxlbmd0aC8zKSxTPWcubGVuZ3RoO3A9cC5jb25jYXQoeC52ZXJ0aWNlcyksXz1fLmNvbmNhdCh4LnV2cyksZz1nLmNvbmNhdCh2P3guaW5kaWNlcy5tYXAoYj0+Yit2KTp4LmluZGljZXMpLHRoaXMuYWRkR3JvdXAoUyxnLmxlbmd0aC1TLG0rKyl9O2EmJih5KGgpLHRoaXMudXNlckRhdGEudG9wVmVydHM9bD9yYyhjLG4rbCxvKS52ZXJ0aWNlczp1KSxzJiZ5KGYpLGkmJnkoZCksdGhpcy5zZXRJbmRleChnKSx0aGlzW1kwXSgicG9zaXRpb24iLG5ldyBTZShwLDMpKSx0aGlzW1kwXSgidXYiLG5ldyBTZShfLDIpKSx0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl9fXZhciBxQT1yPT57Y29uc3Qgbz1yLHtjb29yZGluYXRlOmUsc3RhcnRIZWlnaHQ6dCxoZWlnaHQ6bn09byxpPWFfKG8sWyJjb29yZGluYXRlIiwic3RhcnRIZWlnaHQiLCJoZWlnaHQiXSk7bGV0IHM9dHx8MDtyZXR1cm4gdHlwZW9mIHQhPSJ1bmRlZmluZWQiJiZ0eXBlb2YgbiE9InVuZGVmaW5lZCImJihzPXQrbiksbmV3IFhBKFtlXSx3Zih2cih7fSxpKSx7c3RhcnRIZWlnaHQ6dCxlbmRIZWlnaHQ6c30pKX07VDEoe2V4dHJ1ZGVQb2x5Z29uOnp3LGxpbmU6VncsY29uaWNQb2x5Z29uOih7Y29vcmRpbmF0ZXNBcnI6cixzdGFydDplLGhlaWdodDp0LHVzZUdyb3VwczpuLGhhc1RvcDppLGhhc0JvdHRvbTpzLGhhc1NpZGU6YX0pPT57Y29uc3Qgbz1yLm1hcCgobCxjKT0+e3ZhciBoLHU7cmV0dXJuIHFBKHtjb29yZGluYXRlOmwsc3RhcnRIZWlnaHQ6KGg9ZVtjXSkhPW51bGw/aDplWzBdLGhlaWdodDoodT10W2NdKSE9bnVsbD91OnRbMF0saGFzVG9wOmkhPW51bGw/aTohMCxoYXNCb3R0b206cyE9bnVsbD9zOiEwLGhhc1NpZGU6YSE9bnVsbD9hOiEwfSl9KTtyZXR1cm4gR2wobyxuKX0sY29uaWNMaW5lOih7Y29vcmRpbmF0ZXNBcnI6cixsaW5lV2lkdGg6ZSxzdGFydDp0LHVzZUdyb3VwczpufSk9Pntjb25zdCBzPXIubWFwKChhLG8pPT57dmFyIGw7cmV0dXJuIEowKHtwb2x5Z29uR2VvSnNvbjpbYV0sc3RhcnRIZWlnaHQ6KGw9dFtvXSkhPW51bGw/bDp0WzBdfSkudG9wVmVydHN9KS5tYXAoKGEsbyk9Pnt2YXIgYztjb25zdCBsPShjPWVbb10pIT1udWxsP2M6ZVswXTtyZXR1cm4gbDAoe25vZGVzOmEsc2V0UG9pbnRXaWR0aDooKT0+bH0pfSk7cmV0dXJuIEdsKHMsbil9fSl9KSgpOwo=",M=typeof window!="undefined"&&window.Blob&&new Blob([atob(Q)],{type:"text/javascript;charset=utf-8"});function bl(){const X=M&&(window.URL||window.webkitURL).createObjectURL(M);try{return X?new Worker(X):new Worker("data:application/javascript;base64,"+Q)}finally{X&&(window.URL||window.webkitURL).revokeObjectURL(X)}}const B=X=>{const l=new h.BufferGeometry;return Object.keys(X).forEach(Z=>{Z==="groups"?X[Z].forEach(b=>{l.addGroup(b.start,b.count,b.materialIndex)}):Z==="index"?l.setIndex(new h.BufferAttribute(X[Z].array,X[Z].itemSize)):l.setAttribute(Z,new h.BufferAttribute(X[Z].array,X[Z].itemSize))}),l},dl=(X,l)=>{const Z=X[0][0]===-999&&X[0][1]===-999;let b=null;if(Z&&(X.shift(),l)){const G=l.center(),d=l.rotate();d[0]&&(b=l([180-d[0]+G[0],0]))}return X.map(([G,d])=>{let W;if(l){const[m,c]=l([G,d]);W=new h.Vector2(m,-c)}else W=new h.Vector2(G,d);return b&&W.x<0&&(W.x+=Math.abs(b[0])*2),W})};function Gl(X,l,Z){let b=X==null?0:X.length;if(!b)return[];l=l==null?0:l,Z=Z===void 0?b:Z,l<0&&(l=-l>b?0:b+l),Z=Z>b?b:Z,Z<0&&(Z+=b),b=l>Z?0:Z-l>>>0,l>>>=0;let G=-1;const d=new Array(b);for(;++G<b;)d[G]=X[G+l];return d}function Xl(X,l){const Z=X==null?0:X.length,b=Math.ceil(Z/l);if(!Z)return[];let G=0,d=0;const W=new Array(l);for(;G<Z;)W[d++]=Gl(X,G,G+=b);return W}class Wl{constructor(l){this.bufferGeometryLoader=new h.BufferGeometryLoader,this.options=L({cacheVersion:"1"},l)}install(l){this.pencil=l;const Z=new K.WorkerPool(bl,{maxWorkers:this.options.maxWorkers});this.pool=Z}geoGeometry(l,Z){return R(this,null,function*(){const{mesaage:b,cacheKey:G,cacheVersion:d,maxWorkers:W,cb:m,center:c}=L(L({},this.options),Z),{coordinatesArr:V,depth:p,start:a,lineWidth:Y,height:C}=b;if(V.length===0)return[];const S=yield this.getCachedGeometry({cacheKey:G,cacheVersion:d,cb:m});if(S)return S;const N=this.pool,u=V.map((s,x)=>({coordinatesArr:s,depth:p&&(p[x]||p[0]),start:a&&(a[x]||a[0]),lineWidth:Y&&(Y[x]||Y[0]),height:C&&(C[x]||C[0])})),y=W||N.maxWorkers,t=y===1||u.length<y?[u]:Xl(u,y).filter(s=>s.length),k=[],J={x:0,y:0,z:0},o=b.projection&&c&&O.getProjection(L({},b.projection));if(o){const[s]=dl([c],o);J.x=s.x,J.y=s.y}const w=yield Promise.all(t.map((s,x)=>R(this,null,function*(){const U=yield N.exec(l,[L(L(L({},b),o?{projection:H(L({},b.projection),{center:c})}:{}),s)]);k.push(U);const z=B(U);return z.userData.position=J,m&&(yield m(z)),z})));return G&&I.set(G,{[d]:{attributesArr:k,position:J}}),w})}getCachedGeometry(l){return R(this,null,function*(){const{cacheKey:Z,cb:b,cacheVersion:G}=l;if(Z){const d=yield I.get(Z),W=G||this.options.cacheVersion;if(d!=null&&d[W]){const{attributesArr:m,position:c}=d[W];return yield Promise.all(m.map(V=>R(this,null,function*(){const p=B(V);return p.userData.position=c,b&&(yield b(p)),p})))}else return!1}else return!1})}dispose(){this.pool.dispose()}}class ml{constructor(){this.chunks=[]}install(l){this.pencil=l,this.canvas=l.renderer.domElement}init({frameRequestRate:l=60}={}){const Z=this.canvas.captureStream(l),b=new MediaRecorder(Z,{mimeType:"video/webm; codecs=vp9"});this.mediaRecorder=b,b.ondataavailable=G=>{this.chunks.push(G.data)},b.onstop=()=>{this.handleStop()}}handleStop(){const l=new Blob(this.chunks,{type:"video/webm"}),Z=URL.createObjectURL(l),b=document.createElement("a");b.style.display="none",b.href=Z,b.download="video.webm",document.body.appendChild(b),b.click(),setTimeout(()=>{URL.revokeObjectURL(Z),document.body.removeChild(b)},0)}start(l){this.mediaRecorder.start(l)}stop(){this.mediaRecorder.stop()}dispose(){this.chunks=[]}}class cl extends h.Loader{constructor(l){super(l)}load(l,Z,b,G){const d=document.createElement("video");d.preload="auto",d.autoplay=!1,d.loop=!1,d.muted=!0,d.setAttribute("webkit-playsinline","webkit-playsinline"),d.setAttribute("playsinline","");const W=new h.VideoTexture(d),m=new h.FileLoader(this.manager);return m.setCrossOrigin(this.crossOrigin),m.setPath(this.path),m.setResponseType("blob"),m.load(l,c=>{const V=window.URL.createObjectURL(c);d.src=V,W.needsUpdate=!0,Z!==void 0&&Z(W)},b,G),W}loadAsync(l,Z){return new Promise((b,G)=>{this.load(l,b,Z,G)})}}class Vl extends h.Loader{constructor(l){super(l)}load(l,Z,b,G){const d=new h.Texture,W=document.createElement("img"),m=new h.FileLoader(this.manager);return m.setCrossOrigin(this.crossOrigin),m.setPath(this.path),m.setResponseType("blob"),m.load(l,c=>{const V=window.URL.createObjectURL(c);W.src=V,d.image=W,d.needsUpdate=!0,Z!==void 0&&Z(d)},b,G),d}loadAsync(l,Z){return new Promise((b,G)=>{this.load(l,b,Z,G)})}}class hl extends h.Loader{constructor(l){super(l),this.saveObject=[]}load(l,Z,b,G){let d=[];const W=l;return W.forEach(m=>{this.path!==void 0&&(m.src=this.path+m.src),m.src=this.manager.resolveURL(m.src)}),I.getMany(W.map(m=>m.src)).then(m=>{d=m.map((c,V)=>{const p=W[V].cacheVersion||"1";return c&&c[p]}),Z!==void 0&&Z(d)}),d}loadAsync(l,Z){const b=l;return new Promise((G,d)=>{this.load(b,G,Z,d)})}save(){if(this.saveObject.length===0)return;this.saveObject.forEach(Z=>{this.path!==void 0&&(Z.src=this.path+Z.src),Z.src=this.manager.resolveURL(Z.src)});const l=this.saveObject.map((Z,b)=>[Z.src,{[Z.cacheVersion||"1"]:Z.data}]);I.setMany(l)}dispose(){this.saveObject=[]}}const pl={images:["png","jpg","jpeg","ico","webp","avif"],media:["mp4","webm","ogg"],gltf:["gltf","glb"],json:["json","geojson"],exr:["exr"]};class ul{constructor(){this.itemsLoaded=0,this.itemsTotal=0,this.loadObjOrigin={images:[],media:[],gltf:[],json:[],exr:[]},this.loadObj={images:[],media:[],gltf:[],json:[],exr:[]},this.delLoadObj={},this.assets={images:new Map,media:new Map,gltf:new Map,json:new Map,exr:new Map},this.event=new f.eventsExports.EventEmitter,this.end=!1}get allStarted(){return this.assetsLength&&Object.values(this.loadObj).flat().every(l=>l.progress.loaded)}get lengthComputable(){return Object.values(this.loadObj).flat().every(l=>l.progress.lengthComputable)}get loaded(){return this.lengthComputable?Object.values(this.loadObj).flat().reduce((l,Z)=>l+Z.progress.loaded,0):this.itemsLoaded}get total(){return this.lengthComputable?Object.values(this.loadObj).flat().reduce((l,Z)=>l+Z.progress.total,0):this.itemsTotal}get assetsLength(){return Object.values(this.loadObj).flat().length}emit(l,...Z){this.event.emit(l,...Z)}on(l,Z){this.event.on(l,Z)}getAsset(l){this.prefix&&(l=this.prefix+l);const Z=this.getAssetType(l);if(!Z)return;const b=this.assets[Z].get(l);return!b&&(Z==="images"||Z==="media")?new h.Texture:b}getAssetType(l){var b;const Z=(b=l.split(".").pop())==null?void 0:b.toLowerCase();if(Z){for(const[G,d]of Object.entries(pl))if(d.includes(Z))return G}}install(l){this.pencil=l,this.colorCorrection(),this.setAnisotropy("max")}initLoadingManager(){var l,Z,b,G,d;this.loadingManager=new h.LoadingManager,this.cacheLoader=new hl(this.loadingManager),this.fileLoader=new h.FileLoader(this.loadingManager),this.fileLoader.setResponseType("blob"),((l=this.loadObj.images)==null?void 0:l.length)>0&&(this.textureLoader=new Vl(this.loadingManager)),((Z=this.loadObj.media)==null?void 0:Z.length)>0&&(this.videoTextureLoader=new cl(this.loadingManager)),((b=this.loadObj.gltf)==null?void 0:b.length)>0&&(this.gltfLoader=new i.GLTFLoader(this.loadingManager)),((G=this.loadObj.json)==null?void 0:G.length)>0&&(this.jsonLoader=new h.FileLoader(this.loadingManager),this.jsonLoader.setResponseType("json")),this.dracoPath&&(this.dracoGltfLoader=new i.GLTFLoader(this.loadingManager),this.dracoLoader=new r.DRACOLoader,this.dracoLoader.setDecoderPath(this.dracoPath),this.dracoGltfLoader.setDRACOLoader(this.dracoLoader)),((d=this.loadObj.exr)==null?void 0:d.length)>0&&(this.EXRLoader=new q.EXRLoader(this.loadingManager)),this.loadingManager.onProgress=(W,m,c)=>{this.itemsLoaded=m,this.itemsTotal=c,m===c&&this.onprogress()},this.loadingManager.onError=W=>{console.log("There was an error loading "+W),this.pm.reject(W)}}add(l,Z){typeof l=="string"&&(l=[l]);const{dracoPath:b}=Z||{};b&&(this.dracoPath=b),l.forEach(G=>{const d={src:G,progress:{loaded:0,total:0,lengthComputable:!1},cacheVersion:Z==null?void 0:Z.cacheVersion,draco:!!(Z!=null&&Z.dracoPath)},W=this.getAssetType(G);W&&(this.loadObjOrigin[W]||(this.loadObjOrigin[W]=[]),this.loadObjOrigin[W].push(d))})}setDel(l,Z){this.delLoadObj[l]=Z}getSrcByAsset(l){let Z;return Object.values(this.assets).some(b=>(b.forEach((G,d)=>{G===l&&(Z=d,this.prefix&&(Z=Z==null?void 0:Z.replace(this.prefix,"")))}),!!Z)),Z}colorCorrection(){(+h.REVISION<152&&this.pencil.options.renderer.outputEncoding===F.TextureEncoding.sRGB||+h.REVISION>=152&&this.pencil.options.renderer.outputColorSpace===F.ColorSpace.sRGB)&&(this.assets.images.forEach(l=>{F.colorCorrection({texture:l})}),this.assets.media.forEach(l=>{F.colorCorrection({texture:l})}),this.assets.exr.forEach(l=>{F.colorCorrection({texture:l})}))}setAnisotropy(l){l==="max"&&(l=this.pencil.renderer.capabilities.getMaxAnisotropy()),this.assets.images.forEach(Z=>{Z.anisotropy=l}),this.assets.media.forEach(Z=>{Z.anisotropy=l}),this.assets.exr.forEach(Z=>{Z.anisotropy=l})}onprogress(){this.allStarted&&!this.end&&(this.emit("progress",this.loaded,this.total),this.loaded===this.total&&(this.cacheLoader.save(),this.pm.resolve(),this.end=!0))}load(){return R(this,arguments,function*({prefix:l}={}){var Z,b;return this.loadObj=JSON.parse(JSON.stringify(this.loadObjOrigin)),Object.keys(this.delLoadObj).forEach(G=>{if(this.delLoadObj[G]){const d=this.getAssetType(G);d&&(this.loadObj[d]=this.loadObj[d].filter(W=>W.src!==G))}}),l&&(this.prefix=l,Object.values(this.loadObj).flat().forEach(G=>{G.src=l+G.src})),this.pm=K.makePromiseCreator(!0),this.assetsLength===0?(this.emit("progress",0,0),this.pm.resolve(),this.pm.promise):(this.initLoadingManager(),yield this.checkCache(),this.loadAssets(this.loadObj.json,this.assets.json,this.jsonLoader),this.loadAssets(this.loadObj.images,this.assets.images,this.textureLoader),this.loadAssets(this.loadObj.media,this.assets.media,this.videoTextureLoader),this.loadAssets(this.loadObj.exr,this.assets.exr,this.EXRLoader),this.loadAssets((Z=this.loadObj.gltf)==null?void 0:Z.filter(G=>!G.draco),this.assets.gltf,this.gltfLoader),this.loadAssets((b=this.loadObj.gltf)==null?void 0:b.filter(G=>G.draco),this.assets.gltf,this.dracoGltfLoader),this.pm.promise)})}checkCache(){return R(this,null,function*(){const l=Object.values(this.loadObj).flat().filter(Z=>Z.cacheVersion);l.length>0&&this.cacheLoader&&(yield this.cacheLoader.loadAsync(l)).forEach((b,G)=>{b&&(l[G].cacheData=b)})})}loadAssets(l,Z,b){if(!b||!l)return;const G=b instanceof h.FileLoader&&b.responseType==="json";l.forEach(d=>R(this,null,function*(){const W=V=>{const p=V.loadedR||.95;d.progress.loaded=V.loaded?V.loaded*p:V.loaded,d.progress.total=V.total,d.progress.lengthComputable=V.lengthComputable},m=()=>{d.progress.total?d.progress.loaded=d.progress.total:W({loaded:1,total:1,loadedR:1,lengthComputable:!1}),this.onprogress()};if(d.cacheData)if(G){W({loaded:1,total:1,lengthComputable:!0}),Z.set(d.src,d.cacheData),m();return}else{const V=window.URL.createObjectURL(d.cacheData),p=yield b.loadAsync(V,W);Z.set(d.src,p),window.URL.revokeObjectURL(V),m();return}if(d.cacheVersion&&!G){const V=yield this.fileLoader.loadAsync(d.src,W),p=window.URL.createObjectURL(V),a=yield b.loadAsync(p);Z.set(d.src,a),this.cacheLoader.saveObject.push({src:d.src,data:V,cacheVersion:d.cacheVersion}),window.URL.revokeObjectURL(p),m();return}const c=yield b.loadAsync(d.src,W);Z.set(d.src,c),d.cacheVersion&&this.cacheLoader.saveObject.push({src:d.src,data:c,cacheVersion:d.cacheVersion}),m()}))}clearLoadObj(){Object.values(this.loadObjOrigin).forEach(l=>{l.length=0})}dispose(){var l,Z,b;Object.values(this.assets).forEach(G=>{G.clear()}),(l=this.dracoLoader)==null||l.dispose(),(Z=this.cacheLoader)==null||Z.dispose(),this.event.removeAllListeners(),this.delLoadObj={},(b=this.pm)==null||b.reject(),this.end=!1}}exports.Cache=_;exports.CanvasStream=ml;exports.Data=Zl;exports.Draw=ll;exports.Loader=ul;exports.Wk=Wl;