rtree-sql.js
Version:
SQLite library with support for opening and writing databases, prepared statements, and more. This SQLite library is in pure javascript (compiled with emscripten).
100 lines (87 loc) • 1.29 MB
JavaScript
// We are modularizing this manually because the current modularize setting in Emscripten has some issues:
// https://github.com/kripken/emscripten/issues/5820
// In addition, When you use emcc's modularization, it still expects to export a global object called `Module`,
// which is able to be used/called before the WASM is loaded.
// The modularization below exports a promise that loads and resolves to the actual sql.js module.
// That way, this module can't be used before the WASM is finished loading.
// We are going to define a function that a user will call to start loading initializing our Sql.js library
// However, that function might be called multiple times, and on subsequent calls, we don't actually want it to instantiate a new instance of the Module
// Instead, we want to return the previously loaded module
// TODO: Make this not declare a global if used in the browser
var initSqlJsPromise = undefined;
var initSqlJs = function (moduleConfig) {
if (initSqlJsPromise){
return initSqlJsPromise;
}
// If we're here, we've never called this function before
initSqlJsPromise = new Promise(function (resolveModule, reject) {
// We are modularizing this manually because the current modularize setting in Emscripten has some issues:
// https://github.com/kripken/emscripten/issues/5820
// The way to affect the loading of emcc compiled modules is to create a variable called `Module` and add
// properties to it, like `preRun`, `postRun`, etc
// We are using that to get notified when the WASM has finished loading.
// Only then will we return our promise
// If they passed in a moduleConfig object, use that
// Otherwise, initialize Module to the empty object
var Module = typeof moduleConfig !== 'undefined' ? moduleConfig : {};
// EMCC only allows for a single onAbort function (not an array of functions)
// So if the user defined their own onAbort function, we remember it and call it
var originalOnAbortFunction = Module['onAbort'];
Module['onAbort'] = function (errorThatCausedAbort) {
reject(new Error(errorThatCausedAbort));
if (originalOnAbortFunction){
originalOnAbortFunction(errorThatCausedAbort);
}
};
Module['postRun'] = Module['postRun'] || [];
Module['postRun'].push(function () {
// When Emscripted calls postRun, this promise resolves with the built Module
resolveModule(Module);
});
// There is a section of code in the emcc-generated code below that looks like this:
// (Note that this is lowercase `module`)
// if (typeof module !== 'undefined') {
// module['exports'] = Module;
// }
// When that runs, it's going to overwrite our own modularization export efforts in shell-post.js!
// The only way to tell emcc not to emit it is to pass the MODULARIZE=1 or MODULARIZE_INSTANCE=1 flags,
// but that carries with it additional unnecessary baggage/bugs we don't want either.
// So, we have three options:
// 1) We undefine `module`
// 2) We remember what `module['exports']` was at the beginning of this function and we restore it later
// 3) We write a script to remove those lines of code as part of the Make process.
//
// Since those are the only lines of code that care about module, we will undefine it. It's the most straightforward
// of the options, and has the side effect of reducing emcc's efforts to modify the module if its output were to change in the future.
// That's a nice side effect since we're handling the modularization efforts ourselves
module = undefined;
// The emcc-generated code and shell-post.js code goes below,
// meaning that all of it runs inside of this promise. If anything throws an exception, our promise will abort
var e;e||(e=typeof Module !== 'undefined' ? Module : {});null;
e.onRuntimeInitialized=function(){function a(g,l){this.Ka=g;this.db=l;this.Ia=1;this.cb=[]}function b(g,l){this.db=l;l=aa(g)+1;this.Xa=ba(l);if(null===this.Xa)throw Error("Unable to allocate memory for the SQL string");k(g,n,this.Xa,l);this.bb=this.Xa;this.Ta=this.hb=null}function c(g){this.filename="dbfile_"+(4294967295*Math.random()>>>0);if(null!=g){var l=this.filename,p="/",q=l;p&&(p="string"==typeof p?p:ca(p),q=l?t(p+"/"+l):p);l=da(!0,!0);q=fa(q,(void 0!==l?l:438)&4095|32768,0);if(g){if("string"==
typeof g){p=Array(g.length);for(var y=0,H=g.length;y<H;++y)p[y]=g.charCodeAt(y);g=p}ha(q,l|146);p=w(q,577);ia(p,g,0,g.length,0,void 0);ja(p);ha(q,l)}}this.handleError(h(this.filename,d));this.db=x(d,"i32");dc(this.db);this.Ya={};this.Qa={}}var d=z(4),f=e.cwrap,h=f("sqlite3_open","number",["string","number"]),m=f("sqlite3_close_v2","number",["number"]),r=f("sqlite3_exec","number",["number","string","number","number","number"]),u=f("sqlite3_changes","number",["number"]),v=f("sqlite3_prepare_v2","number",
["number","string","number","number","number"]),B=f("sqlite3_sql","string",["number"]),S=f("sqlite3_normalized_sql","string",["number"]),Qa=f("sqlite3_prepare_v2","number",["number","number","number","number","number"]),ec=f("sqlite3_bind_text","number",["number","number","number","number","number"]),nb=f("sqlite3_bind_blob","number",["number","number","number","number","number"]),fc=f("sqlite3_bind_double","number",["number","number","number"]),gc=f("sqlite3_bind_int","number",["number","number",
"number"]),hc=f("sqlite3_bind_parameter_index","number",["number","string"]),ic=f("sqlite3_step","number",["number"]),jc=f("sqlite3_errmsg","string",["number"]),kc=f("sqlite3_column_count","number",["number"]),lc=f("sqlite3_data_count","number",["number"]),mc=f("sqlite3_column_double","number",["number","number"]),ob=f("sqlite3_column_text","string",["number","number"]),nc=f("sqlite3_column_blob","number",["number","number"]),oc=f("sqlite3_column_bytes","number",["number","number"]),pc=f("sqlite3_column_type",
"number",["number","number"]),qc=f("sqlite3_column_name","string",["number","number"]),rc=f("sqlite3_reset","number",["number"]),sc=f("sqlite3_clear_bindings","number",["number"]),tc=f("sqlite3_finalize","number",["number"]),uc=f("sqlite3_create_function_v2","number","number string number number number number number number number".split(" ")),vc=f("sqlite3_value_type","number",["number"]),wc=f("sqlite3_value_bytes","number",["number"]),xc=f("sqlite3_value_text","string",["number"]),yc=f("sqlite3_value_blob",
"number",["number"]),zc=f("sqlite3_value_double","number",["number"]),Ac=f("sqlite3_result_double","",["number","number"]),pb=f("sqlite3_result_null","",["number"]),Bc=f("sqlite3_result_text","",["number","string","number","number"]),Cc=f("sqlite3_result_blob","",["number","number","number","number"]),Dc=f("sqlite3_result_int","",["number","number"]),qb=f("sqlite3_result_error","",["number","string","number"]),dc=f("RegisterExtensionFunctions","number",["number"]);a.prototype.bind=function(g){if(!this.Ka)throw"Statement closed";
this.reset();return Array.isArray(g)?this.wb(g):null!=g&&"object"===typeof g?this.xb(g):!0};a.prototype.step=function(){if(!this.Ka)throw"Statement closed";this.Ia=1;var g=ic(this.Ka);switch(g){case 100:return!0;case 101:return!1;default:throw this.db.handleError(g);}};a.prototype.rb=function(g){null==g&&(g=this.Ia,this.Ia+=1);return mc(this.Ka,g)};a.prototype.Bb=function(g){null==g&&(g=this.Ia,this.Ia+=1);g=ob(this.Ka,g);if("function"!==typeof BigInt)throw Error("BigInt is not supported");return BigInt(g)};
a.prototype.Cb=function(g){null==g&&(g=this.Ia,this.Ia+=1);return ob(this.Ka,g)};a.prototype.getBlob=function(g){null==g&&(g=this.Ia,this.Ia+=1);var l=oc(this.Ka,g);g=nc(this.Ka,g);for(var p=new Uint8Array(l),q=0;q<l;q+=1)p[q]=A[g+q];return p};a.prototype.get=function(g,l){l=l||{};null!=g&&this.bind(g)&&this.step();g=[];for(var p=lc(this.Ka),q=0;q<p;q+=1)switch(pc(this.Ka,q)){case 1:var y=l.useBigInt?this.Bb(q):this.rb(q);g.push(y);break;case 2:g.push(this.rb(q));break;case 3:g.push(this.Cb(q));break;
case 4:g.push(this.getBlob(q));break;default:g.push(null)}return g};a.prototype.getColumnNames=function(){for(var g=[],l=kc(this.Ka),p=0;p<l;p+=1)g.push(qc(this.Ka,p));return g};a.prototype.getAsObject=function(g,l){g=this.get(g,l);l=this.getColumnNames();for(var p={},q=0;q<l.length;q+=1)p[l[q]]=g[q];return p};a.prototype.getSQL=function(){return B(this.Ka)};a.prototype.getNormalizedSQL=function(){return S(this.Ka)};a.prototype.run=function(g){null!=g&&this.bind(g);this.step();return this.reset()};
a.prototype.mb=function(g,l){null==l&&(l=this.Ia,this.Ia+=1);g=ka(g);var p=la(g);this.cb.push(p);this.db.handleError(ec(this.Ka,l,p,g.length-1,0))};a.prototype.vb=function(g,l){null==l&&(l=this.Ia,this.Ia+=1);var p=la(g);this.cb.push(p);this.db.handleError(nb(this.Ka,l,p,g.length,0))};a.prototype.lb=function(g,l){null==l&&(l=this.Ia,this.Ia+=1);this.db.handleError((g===(g|0)?gc:fc)(this.Ka,l,g))};a.prototype.yb=function(g){null==g&&(g=this.Ia,this.Ia+=1);nb(this.Ka,g,0,0,0)};a.prototype.nb=function(g,
l){null==l&&(l=this.Ia,this.Ia+=1);switch(typeof g){case "string":this.mb(g,l);return;case "number":this.lb(g,l);return;case "bigint":this.mb(g.toString(),l);return;case "boolean":this.lb(g+0,l);return;case "object":if(null===g){this.yb(l);return}if(null!=g.length){this.vb(g,l);return}}throw"Wrong API use : tried to bind a value of an unknown type ("+g+").";};a.prototype.xb=function(g){var l=this;Object.keys(g).forEach(function(p){var q=hc(l.Ka,p);0!==q&&l.nb(g[p],q)});return!0};a.prototype.wb=function(g){for(var l=
0;l<g.length;l+=1)this.nb(g[l],l+1);return!0};a.prototype.reset=function(){this.freemem();return 0===sc(this.Ka)&&0===rc(this.Ka)};a.prototype.freemem=function(){for(var g;void 0!==(g=this.cb.pop());)ma(g)};a.prototype.free=function(){this.freemem();var g=0===tc(this.Ka);delete this.db.Ya[this.Ka];this.Ka=0;return g};b.prototype.next=function(){if(null===this.Xa)return{done:!0};null!==this.Ta&&(this.Ta.free(),this.Ta=null);if(!this.db.db)throw this.fb(),Error("Database closed");var g=na(),l=z(4);
oa(d);oa(l);try{this.db.handleError(Qa(this.db.db,this.bb,-1,d,l));this.bb=x(l,"i32");var p=x(d,"i32");if(0===p)return this.fb(),{done:!0};this.Ta=new a(p,this.db);this.db.Ya[p]=this.Ta;return{value:this.Ta,done:!1}}catch(q){throw this.hb=D(this.bb),this.fb(),q;}finally{pa(g)}};b.prototype.fb=function(){ma(this.Xa);this.Xa=null};b.prototype.getRemainingSQL=function(){return null!==this.hb?this.hb:D(this.bb)};"function"===typeof Symbol&&"symbol"===typeof Symbol.iterator&&(b.prototype[Symbol.iterator]=
function(){return this});c.prototype.run=function(g,l){if(!this.db)throw"Database closed";if(l){g=this.prepare(g,l);try{g.step()}finally{g.free()}}else this.handleError(r(this.db,g,0,0,d));return this};c.prototype.exec=function(g,l,p){if(!this.db)throw"Database closed";var q=na(),y=null;try{var H=aa(g)+1,E=z(H);k(g,A,E,H);var ea=E;var Y=z(4);for(g=[];0!==x(ea,"i8");){oa(d);oa(Y);this.handleError(Qa(this.db,ea,-1,d,Y));var C=x(d,"i32");ea=x(Y,"i32");if(0!==C){H=null;y=new a(C,this);for(null!=l&&y.bind(l);y.step();)null===
H&&(H={columns:y.getColumnNames(),values:[]},g.push(H)),H.values.push(y.get(null,p));y.free()}}return g}catch(I){throw y&&y.free(),I;}finally{pa(q)}};c.prototype.each=function(g,l,p,q,y){"function"===typeof l&&(q=p,p=l,l=void 0);g=this.prepare(g,l);try{for(;g.step();)p(g.getAsObject(null,y))}finally{g.free()}if("function"===typeof q)return q()};c.prototype.prepare=function(g,l){oa(d);this.handleError(v(this.db,g,-1,d,0));g=x(d,"i32");if(0===g)throw"Nothing to prepare";var p=new a(g,this);null!=l&&
p.bind(l);return this.Ya[g]=p};c.prototype.iterateStatements=function(g){return new b(g,this)};c.prototype["export"]=function(){Object.values(this.Ya).forEach(function(l){l.free()});Object.values(this.Qa).forEach(qa);this.Qa={};this.handleError(m(this.db));var g=ra(this.filename);this.handleError(h(this.filename,d));this.db=x(d,"i32");return g};c.prototype.close=function(){null!==this.db&&(Object.values(this.Ya).forEach(function(g){g.free()}),Object.values(this.Qa).forEach(qa),this.Qa={},this.handleError(m(this.db)),
sa("/"+this.filename),this.db=null)};c.prototype.handleError=function(g){if(0===g)return null;g=jc(this.db);throw Error(g);};c.prototype.getRowsModified=function(){return u(this.db)};c.prototype.create_function=function(g,l){Object.prototype.hasOwnProperty.call(this.Qa,g)&&(qa(this.Qa[g]),delete this.Qa[g]);var p=ta(function(q,y,H){for(var E,ea=[],Y=0;Y<y;Y+=1){var C=x(H+4*Y,"i32"),I=vc(C);if(1===I||2===I)C=zc(C);else if(3===I)C=xc(C);else if(4===I){I=C;C=wc(I);I=yc(I);for(var tb=new Uint8Array(C),
Aa=0;Aa<C;Aa+=1)tb[Aa]=A[I+Aa];C=tb}else C=null;ea.push(C)}try{E=l.apply(null,ea)}catch(Gc){qb(q,Gc,-1);return}switch(typeof E){case "boolean":Dc(q,E?1:0);break;case "number":Ac(q,E);break;case "string":Bc(q,E,-1,-1);break;case "object":null===E?pb(q):null!=E.length?(y=la(E),Cc(q,y,E.length,-1),ma(y)):qb(q,"Wrong API use : tried to return a value of an unknown type ("+E+").",-1);break;default:pb(q)}});this.Qa[g]=p;this.handleError(uc(this.db,g,l.length,1,0,p,0,0,0));return this};e.Database=c};
var ua=Object.assign({},e),va="./this.program",wa="object"==typeof window,xa="function"==typeof importScripts,ya="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,F="",za,Ba,Ca,fs,Da,Ea;
if(ya)F=xa?require("path").dirname(F)+"/":__dirname+"/",Ea=()=>{Da||(fs=require("fs"),Da=require("path"))},za=function(a,b){var c=Fa(a);if(c)return b?c:c.toString();Ea();a=Da.normalize(a);return fs.readFileSync(a,b?void 0:"utf8")},Ca=a=>{a=za(a,!0);a.buffer||(a=new Uint8Array(a));return a},Ba=(a,b,c)=>{var d=Fa(a);d&&b(d);Ea();a=Da.normalize(a);fs.readFile(a,function(f,h){f?c(f):b(h.buffer)})},1<process.argv.length&&(va=process.argv[1].replace(/\\/g,"/")),process.argv.slice(2),"undefined"!=typeof module&&
(module.exports=e),e.inspect=function(){return"[Emscripten Module object]"};else if(wa||xa)xa?F=self.location.href:"undefined"!=typeof document&&document.currentScript&&(F=document.currentScript.src),F=0!==F.indexOf("blob:")?F.substr(0,F.replace(/[?#].*/,"").lastIndexOf("/")+1):"",za=a=>{try{var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);return b.responseText}catch(f){if(a=Fa(a)){b=[];for(var c=0;c<a.length;c++){var d=a[c];255<d&&(Ga&&G("Character code "+d+" ("+String.fromCharCode(d)+") at offset "+
c+" not in 0x00-0xFF."),d&=255);b.push(String.fromCharCode(d))}return b.join("")}throw f;}},xa&&(Ca=a=>{try{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}catch(c){if(a=Fa(a))return a;throw c;}}),Ba=(a,b,c)=>{var d=new XMLHttpRequest;d.open("GET",a,!0);d.responseType="arraybuffer";d.onload=()=>{if(200==d.status||0==d.status&&d.response)b(d.response);else{var f=Fa(a);f?b(f.buffer):c()}};d.onerror=c;d.send(null)};
var Ha=e.print||console.log.bind(console),J=e.printErr||console.warn.bind(console);Object.assign(e,ua);ua=null;e.thisProgram&&(va=e.thisProgram);var Ia=[],Ja;
function ta(a){if(!Ja){Ja=new WeakMap;for(var b=K.length,c=0;c<0+b;c++){var d=K.get(c);d&&Ja.set(d,c)}}if(Ja.has(a))return Ja.get(a);if(Ia.length)b=Ia.pop();else{try{K.grow(1)}catch(f){if(!(f instanceof RangeError))throw f;throw"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.";}b=K.length-1}try{K.set(b,a)}catch(f){if(!(f instanceof TypeError))throw f;K.set(b,a)}Ja.set(a,b);return b}function qa(a){Ja.delete(K.get(a));Ia.push(a)}var Ka;e.wasmBinary&&(Ka=e.wasmBinary);
var noExitRuntime=e.noExitRuntime||!0;function La(){this.buffer=new ArrayBuffer(Ma/65536*65536)}function Na(){this.exports=(
// EMSCRIPTEN_START_ASM
function instantiate(Pa){function e(f){f.grow=function(b){var a=this.length;this.length=this.length+b;return a};f.set=function(c,d){this[c]=d};f.get=function(c){return this[c]};return f}var g;var h=new Uint8Array(123);for(var c=25;c>=0;--c){h[48+c]=52+c;h[65+c]=c;h[97+c]=26+c}h[43]=62;h[47]=63;function n(o,p,q){var i,j,c=0,k=p,l=q.length,m=p+(l*3>>2)-(q[l-2]=="=")-(q[l-1]=="=");for(;c<l;c+=4){i=h[q.charCodeAt(c+1)];j=h[q.charCodeAt(c+2)];o[k++]=h[q.charCodeAt(c)]<<2|i>>4;if(k<m)o[k++]=i<<4|j>>2;if(k<m)o[k++]=j<<6|h[q.charCodeAt(c+3)]}}function r(s){n(g,1024,"My4zOC41AHt9ACV6JXMlegAlcy4legBhZmZpbml0eQBSZWFsQWZmaW5pdHkAYnVzeQB0ZW1wX3N0b3JlX2RpcmVjdG9yeQBub3QgYSB3cml0YWJsZSBkaXJlY3RvcnkAb3BlbkRpcmVjdG9yeQBzaHJpbmtfbWVtb3J5AG91dCBvZiBtZW1vcnkAZmFpbGVkIHRvIGFsbG9jYXRlICV1IGJ5dGVzIG9mIG1lbW9yeQBJbnRDb3B5AFNDb3B5AFZEZXN0cm95AE11bHRpcGx5AHF1ZXJ5X29ubHkAdW5saWtlbHkAdGFibGUgIiVzIiBoYXMgbW9yZSB0aGFuIG9uZSBwcmltYXJ5IGtleQBmb3JlaWduIGtleQBqc29uX2dyb3VwX2FycmF5AGpzb25fYXJyYXkAanVsaWFuZGF5AGZ0czRhdXgAdW5peABzcWxpdGVfcmVuYW1lX3F1b3RlZml4AHByZWZpeABMSUtFIG9yIEdMT0IgcGF0dGVybiB0b28gY29tcGxleABoZXgAY2hhcmluZGV4AE9wZW5BdXRvaW5kZXgAYXV0b21hdGljX2luZGV4AGF1dG8taW5kZXgAb3JwaGFuIGluZGV4AERyb3BJbmRleABpZHgAUmVvcGVuSWR4AHBjeABtYXgATWVtTWF4ACUwMngAMHgAIEZST00gJyVxJy4nJXElcycgQVMgeABDUkVBVEUgVEFCTEUgeABydwBwc293AGltcGxpZXNfbm9ubnVsbF9yb3cAbm93AGludGVnZXIgb3ZlcmZsb3cAcGFyc2VyIHN0YWNrIG92ZXJmbG93AHdpbmRvdwBzaGFkb3cAUmVzdWx0Um93AElmTnVsbFJvdwBuZXcAbm8gc3VjaCB2aWV3AGNhbm5vdCBtb2RpZnkgJXMgYmVjYXVzZSBpdCBpcyBhIHZpZXcAQ2Fubm90IGFkZCBhIGNvbHVtbiB0byBhIHZpZXcAY2Fubm90IFVQU0VSVCBhIHZpZXcAUHJldgBzdGRldgAgJWxsdQAlYyV1AHN1YnF1ZXJ5XyV1ACUuKno6JXUARnJhZ21lbnRhdGlvbiBvZiAlZCBieXRlcyByZXBvcnRlZCBhcyAlZCBvbiBwYWdlICV1AE11bHRpcGxlIHVzZXMgZm9yIGJ5dGUgJXUgb2YgcGFnZSAldQBTVUJRVUVSWSAldQB1bmFibGUgdG8gdXNlIGZ1bmN0aW9uICVzIGluIHRoZSByZXF1ZXN0ZWQgY29udGV4dABTb3J0ZXJOZXh0AFZOZXh0AGluY29tcGxldGUgaW5wdXQAYnVzeV90aW1lb3V0AGxvY2FsaG9zdABjYW5ub3QgZHJvcCBjb2x1bW4gIiVzIjogbm8gb3RoZXIgY29sdW1ucyBleGlzdABwZXJzaXN0AGZvcmVpZ25fa2V5X2xpc3QAaW5kZXhfbGlzdABmdW5jdGlvbl9saXN0AGNvbGxhdGlvbl9saXN0AGRhdGFiYXNlX2xpc3QAbW9kdWxlX2xpc3QAUFJBR01BIHRhYmxlX2xpc3QAcHJhZ21hX2xpc3QAc2V0IGxpc3QAVmFsdWVMaXN0AHNxbGl0ZV9yZW5hbWVfdGVzdABSb3dTZXRUZXN0AFNlcXVlbmNlVGVzdABBdXhpbGlhcnkgcnRyZWUgY29sdW1ucyBtdXN0IGJlIGxhc3QAZmFzdABMYXN0AENhc3QAc3FydABTb3J0ZXJTb3J0AGpzb25faW5zZXJ0AElkeEluc2VydABTb3J0ZXJJbnNlcnQAcmVzdGFydABEaW1lbnNpb24gJWQgb2YgY2VsbCAlZCBvbiBub2RlICVsbGQgaXMgY29ycnVwdABjb3QAQml0Tm90AElmTm90AFBhZ2Vjb3VudABmcmVlbGlzdF9jb3VudABtYXhfcGFnZV9jb3VudABSZXNldENvdW50AHdhbF9hdXRvY2hlY2twb2ludAB3YWxfY2hlY2twb2ludABDaGVja3BvaW50AFNhdmVwb2ludABhIENIRUNLIGNvbnN0cmFpbnQAJXNPTiBDT05GTElDVCBjbGF1c2UgZG9lcyBub3QgbWF0Y2ggYW55IFBSSU1BUlkgS0VZIG9yIFVOSVFVRSBjb25zdHJhaW50AEN1cnNvckhpbnQAX2NvbnRlbnQAJV9wYXJlbnQARGltZW5zaW9uICVkIG9mIGNlbGwgJWQgb24gbm9kZSAlbGxkIGlzIGNvcnJ1cHQgcmVsYXRpdmUgdG8gcGFyZW50AERJU1RJTkNUIGFnZ3JlZ2F0ZXMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGFyZ3VtZW50AGNvbW1lbnQAQVBJIGNhbGxlZCB3aXRoIGZpbmFsaXplZCBwcmVwYXJlZCBzdGF0ZW1lbnQAQVBJIGNhbGxlZCB3aXRoIE5VTEwgcHJlcGFyZWQgc3RhdGVtZW50AE1heFBnY250AGRlZmF1bHQgdmFsdWUgb2YgY29sdW1uIFslc10gaXMgbm90IGNvbnN0YW50AE11c3RCZUludABDYW5ub3QgYWRkIGEgY29sdW1uIHdpdGggbm9uLWNvbnN0YW50IGRlZmF1bHQASGFsdABsYW5vaXQAc3RhdF9pbml0AEluaXQAQXV0b0NvbW1pdABhbmFseXNpc19saW1pdABzb2Z0X2hlYXBfbGltaXQAaGFyZF9oZWFwX2xpbWl0AGpvdXJuYWxfc2l6ZV9saW1pdABPZmZzZXRMaW1pdABTZWVrSGl0AE9OIGNsYXVzZSByZWZlcmVuY2VzIHRhYmxlcyB0byBpdHMgcmlnaHQAU2hpZnRSaWdodABoZ2h0AFNoaWZ0TGVmdABPZmZzZXQAcmVzZXQAanNvbl9zZXQAdG9vIG1hbnkgY29sdW1ucyBpbiByZXN1bHQgc2V0ACVyIE9SREVSIEJZIHRlcm0gZG9lcyBub3QgbWF0Y2ggYW55IGNvbHVtbiBpbiB0aGUgcmVzdWx0IHNldABzbmlwcGV0AHN0YXRfZ2V0AHNxbGl0ZV9jb21waWxlb3B0aW9uX2dldABzdHJpY3QATm9Db25mbGljdABqc29uX2dyb3VwX29iamVjdABqc29uX29iamVjdABqc29uX2V4dHJhY3QAU3VidHJhY3QAbHN0YXQAZnN0YXQAJXNfc3RhdAB0YmwsaWR4LHN0YXQAdW5zdXBwb3J0ZWQgZmlsZSBmb3JtYXQAZ3JvdXBfY29uY2F0AENvbmNhdABMdABHdABkZWZlcl9mb3JlaWduX2tleXMAYWx3YXlzAHBhcmFtZXRlcnMgYXJlIG5vdCBhbGxvd2VkIGluIHZpZXdzAHN0YXR1cwBzeW5jaHJvbm91cwBpbmRleCAlcyBhbHJlYWR5IGV4aXN0cwBvdXRwdXQgZmlsZSBhbHJlYWR5IGV4aXN0cwAlcyAlVCBhbHJlYWR5IGV4aXN0cwB0cmlnZ2VyICVUIGFscmVhZHkgZXhpc3RzAE5vdEV4aXN0cwBpZ25vcmVfY2hlY2tfY29uc3RyYWludHMAQ0hFQ0sgY29uc3RyYWludHMAZXhwcmVzc2lvbnMgcHJvaGliaXRlZCBpbiBQUklNQVJZIEtFWSBhbmQgVU5JUVVFIGNvbnN0cmFpbnRzAGpzb25fb2JqZWN0KCkgcmVxdWlyZXMgYW4gZXZlbiBudW1iZXIgb2YgYXJndW1lbnRzAGpzb25fJXMoKSBuZWVkcyBhbiBvZGQgbnVtYmVyIG9mIGFyZ3VtZW50cwAlc19zZWdtZW50cwB1bmFibGUgdG8gZGVsZXRlL21vZGlmeSB1c2VyLWZ1bmN0aW9uIGR1ZSB0byBhY3RpdmUgc3RhdGVtZW50cwB1bmFibGUgdG8gZGVsZXRlL21vZGlmeSBjb2xsYXRpb24gc2VxdWVuY2UgZHVlIHRvIGFjdGl2ZSBzdGF0ZW1lbnRzAG9mZnNldHMAcmV2ZXJzZV91bm9yZGVyZWRfc2VsZWN0cwBpaXNzc3NzcwBpc3MAc2VzcwB1bmNvbXByZXNzAGNhbm5vdCBvcGVuIHNhdmVwb2ludCAtIFNRTCBzdGF0ZW1lbnRzIGluIHByb2dyZXNzAGNhbm5vdCByZWxlYXNlIHNhdmVwb2ludCAtIFNRTCBzdGF0ZW1lbnRzIGluIHByb2dyZXNzAGNhbm5vdCBjb21taXQgdHJhbnNhY3Rpb24gLSBTUUwgc3RhdGVtZW50cyBpbiBwcm9ncmVzcwBjYW5ub3QgVkFDVVVNIC0gU1FMIHN0YXRlbWVudHMgaW4gcHJvZ3Jlc3MAYWNjZXNzAHBhcmFtZXRlcnMAcmVjdXJzaXZlX3RyaWdnZXJzAHRoZSBJTkRFWEVEIEJZIGNsYXVzZSBpcyBub3QgYWxsb3dlZCBvbiBVUERBVEUgb3IgREVMRVRFIHN0YXRlbWVudHMgd2l0aGluIHRyaWdnZXJzAHRoZSBOT1QgSU5ERVhFRCBjbGF1c2UgaXMgbm90IGFsbG93ZWQgb24gVVBEQVRFIG9yIERFTEVURSBzdGF0ZW1lbnRzIHdpdGhpbiB0cmlnZ2VycwBxdWFsaWZpZWQgdGFibGUgbmFtZXMgYXJlIG5vdCBhbGxvd2VkIG9uIElOU0VSVCwgVVBEQVRFLCBhbmQgREVMRVRFIHN0YXRlbWVudHMgd2l0aGluIHRyaWdnZXJzAENoaWxkIHBhZ2UgZGVwdGggZGlmZmVycwB1bmFibGUgdG8gY2xvc2UgZHVlIHRvIHVuZmluYWxpemVkIHN0YXRlbWVudHMgb3IgdW5maW5pc2hlZCBiYWNrdXBzAGFjb3MASWZQb3MAY29tcGlsZV9vcHRpb25zAERJU1RJTkNUIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHdpbmRvdyBmdW5jdGlvbnMARklMVEVSIGNsYXVzZSBtYXkgb25seSBiZSB1c2VkIHdpdGggYWdncmVnYXRlIHdpbmRvdyBmdW5jdGlvbnMAbm9uLWRldGVybWluaXN0aWMgZnVuY3Rpb25zAGluZGV4IGV4cHJlc3Npb25zAFNFTEVDVHMgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IG9mICVzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiByZXN1bHQgY29sdW1ucwB2aXJ0dWFsIHRhYmxlcyBjYW5ub3QgdXNlIGNvbXB1dGVkIGNvbHVtbnMAZ2VuZXJhdGVkIGNvbHVtbnMAdGFibGUgJXMgaGFzICVkIHZhbHVlcyBmb3IgJWQgY29sdW1ucwByYWRpYW5zAGFsbCBWQUxVRVMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiB0ZXJtcwBlbXB0eV9yZXN1bHRfY2FsbGJhY2tzAExvYWRBbmFseXNpcwBmbGdzAGZsYWdzAHZmcwAlZCBjb2x1bW5zIGFzc2lnbmVkICVkIHZhbHVlcwBKU09OIGNhbm5vdCBob2xkIEJMT0IgdmFsdWVzAGZhaWxlZCBtZW1vcnkgcmVzaXplICV1IHRvICV1IGJ5dGVzAHBhcnRpYWwgaW5kZXggV0hFUkUgY2xhdXNlcwBzaG9ydF9jb2x1bW5fbmFtZXMAZnVsbF9jb2x1bW5fbmFtZXMAdW5hYmxlIHRvIG9wZW4gYSB0ZW1wb3JhcnkgZGF0YWJhc2UgZmlsZSBmb3Igc3RvcmluZyB0ZW1wb3JhcnkgdGFibGVzAGNhbm5vdCBjcmVhdGUgdHJpZ2dlcnMgb24gdmlydHVhbCB0YWJsZXMAJXMgUkVUVVJOSU5HIGlzIG5vdCBhdmFpbGFibGUgb24gdmlydHVhbCB0YWJsZXMAY2Fubm90IGpvaW4gdXNpbmcgY29sdW1uICVzIC0gY29sdW1uIG5vdCBwcmVzZW50IGluIGJvdGggdGFibGVzAEFVVE9JTkNSRU1FTlQgbm90IGFsbG93ZWQgb24gV0lUSE9VVCBST1dJRCB0YWJsZXMAJXMgY2Fubm90IHVzZSB2YXJpYWJsZXMAdG9vIG1hbnkgU1FMIHZhcmlhYmxlcwBzdWJxdWVyaWVzAGNhbm5vdCB1c2Ugd2luZG93IGZ1bmN0aW9ucyBpbiByZWN1cnNpdmUgcXVlcmllcwBjb3VudF9jaGFuZ2VzAHRvdGFsX2NoYW5nZXMAZGVncmVlcwBSRVRVUk5JTkcgbWF5IG5vdCB1c2UgIlRBQkxFLioiIHdpbGRjYXJkcwB0aHJlYWRzAGFicwAuJS4qcwAsJS4qcwBDUkVBVEUgJXMgJS4qcwBDUkVBVEUlcyBJTkRFWCAlLipzAGludmFsaWQgdXJpIGF1dGhvcml0eTogJS4qcwB1bmtub3duIHRhYmxlIG9wdGlvbjogJS4qcwAlLipzJXMALCVzJXMlcwBTQ0FOICVzJXMlcwBzcWxpdGVfYWx0ZXJ0YWJfJXMAU0NBTiAlZCBDT05TVEFOVCBST1clcwAlUSVzACBWSVJUVUFMIFRBQkxFIElOREVYICVkOiVzACVzOiAlcy4lcy4lcwBtaXNzaW5nIGRhdGF0eXBlIGZvciAlcy4lcwBjYW5ub3Qgc3RvcmUgJXMgdmFsdWUgaW4gJXMgY29sdW1uICVzLiVzAG5vbi0lcyB2YWx1ZSBpbiAlcy4lcwBOVUxMIHZhbHVlIGluICVzLiVzACVzOiAlcy4lcwBubyBzdWNoIHRhYmxlIGNvbHVtbjogJXMuJXMAVU5JUVVFIGNvbnN0cmFpbnQgZmFpbGVkOiAlcy4lcwAlLjE4cy0lcwAgVVNJTkcgSU5URUdFUiBQUklNQVJZIEtFWSAoJXMAdXNlIERST1AgVklFVyB0byBkZWxldGUgdmlldyAlcwBpbGxlZ2FsIGZpcnN0IGFyZ3VtZW50IHRvICVzAG1pc3VzZSBvZiBhbGlhc2VkIHdpbmRvdyBmdW5jdGlvbiAlcwB0b28gbWFueSBjb2x1bW5zIG9uICVzAHRvbyBtYW55IGNvbHVtbnMgaW4gJXMAJXMgcHJvaGliaXRlZCBpbiAlcwBDSEVDSyBjb25zdHJhaW50IGZhaWxlZCBpbiAlcwBub24tZGV0ZXJtaW5pc3RpYyB1c2Ugb2YgJXMoKSBpbiAlcwByZWNvdmVyZWQgJWQgcGFnZXMgZnJvbSAlcwBtaXN1c2Ugb2YgYWxpYXNlZCBhZ2dyZWdhdGUgJXMAJXMgJVQgY2Fubm90IHJlZmVyZW5jZSBvYmplY3RzIGluIGRhdGFiYXNlICVzAGNhbm5vdCBkZXRhY2ggZGF0YWJhc2UgJXMAYSBKT0lOIGNsYXVzZSBpcyByZXF1aXJlZCBiZWZvcmUgJXMAY2Fubm90IG9wZW4gdmFsdWUgb2YgdHlwZSAlcwBjYW5ub3QgZnN0YXQgZGIgZmlsZSAlcwByZWNvdmVyZWQgJWQgZnJhbWVzIGZyb20gV0FMIGZpbGUgJXMAUFJJTUFSWSBLRVkgbWlzc2luZyBvbiB0YWJsZSAlcwB1c2UgRFJPUCBUQUJMRSB0byBkZWxldGUgdGFibGUgJXMAU0VMRUNUICVzIE9SREVSIEJZIHJvd2lkICVzAFNFTEVDVCAlcyBXSEVSRSByb3dpZCBCRVRXRUVOICVsbGQgQU5EICVsbGQgT1JERVIgQlkgcm93aWQgJXMAdGhlcmUgaXMgYWxyZWFkeSBhbiBpbmRleCBuYW1lZCAlcwB0YWJsZSAlUyBoYXMgbm8gY29sdW1uIG5hbWVkICVzAHRoZXJlIGlzIGFscmVhZHkgYSB0YWJsZSBuYW1lZCAlcwBzdGF0ZW1lbnQgYWJvcnRzIGF0ICVkOiBbJXNdICVzAENPVkVSSU5HIElOREVYICVzAFNFTEVDVCAlcwB1bnN1cHBvcnRlZCB1c2Ugb2YgTlVMTFMgJXMAVVNFIFRFTVAgQi1UUkVFIEZPUiAlcwAtLSBUUklHR0VSICVzAD4/IEFORCAlcwAlejogJXMAcmVjdXJzaXZlIHJlZmVyZW5jZSBpbiBhIHN1YnF1ZXJ5OiAlcwB2dGFibGUgY29uc3RydWN0b3IgY2FsbGVkIHJlY3Vyc2l2ZWx5OiAlcwBubyBzdWNoIGluZGV4OiAlcwBubyBzdWNoIHdpbmRvdzogJXMAY2Fubm90IG92ZXJyaWRlICVzIG9mIHdpbmRvdzogJXMAY2Fubm90IG9wZW4gdmlldzogJXMAbm8gc3VjaCBzYXZlcG9pbnQ6ICVzAG5vIHN1Y2ggdmZzOiAlcwBtdWx0aXBsZSByZWN1cnNpdmUgcmVmZXJlbmNlczogJXMAZXJyb3IgaW4gJXMgJXMlcyVzOiAlcwBlcnJvciBpbiAlcyAlcyBhZnRlciAlczogJXMAdW5rbm93biB0b2tlbml6ZXI6ICVzAGVycm9yIHBhcnNpbmcgcHJlZml4IHBhcmFtZXRlcjogJXMAdW5yZWNvZ25pemVkIHBhcmFtZXRlcjogJXMAdW5yZWNvZ25pemVkIG9yZGVyOiAlcwB1bnJlY29nbml6ZWQgbWF0Y2hpbmZvOiAlcwBubyBzdWNoIGNvbHVtbjogJXMAZmlsZSByZW5hbWVkIHdoaWxlIG9wZW46ICVzAGZpbGUgdW5saW5rZWQgd2hpbGUgb3BlbjogJXMAdW5zdXBwb3J0ZWQgZW5jb2Rpbmc6ICVzAGNhbm5vdCBsaW1pdCBXQUwgc2l6ZTogJXMATUogZGVsZXRlOiAlcwB0YXJnZXQgb2JqZWN0L2FsaWFzIG1heSBub3QgYXBwZWFyIGluIEZST00gY2xhdXNlOiAlcwBvYmplY3QgbmFtZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlOiAlcwB1bmtub3duIGRhdGFiYXNlOiAlcwB1bmFibGUgdG8gb3BlbiBkYXRhYmFzZTogJXMAbm8gc3VjaCBkYXRhYmFzZTogJXMAdGhlcmUgaXMgYWxyZWFkeSBhbm90aGVyIHRhYmxlIG9yIGluZGV4IHdpdGggdGhpcyBuYW1lOiAlcwBkdXBsaWNhdGUgY29sdW1uIG5hbWU6ICVzAGR1cGxpY2F0ZSBXSVRIIHRhYmxlIG5hbWU6ICVzAG5vIHN1Y2ggbW9kdWxlOiAlcwBtdWx0aXBsZSBsaW5rcyB0byBmaWxlOiAlcwBjYW5ub3Qgb3BlbiB2aXJ0dWFsIHRhYmxlOiAlcwBubyBzdWNoIHRhYmxlOiAlcwBtdWx0aXBsZSByZWZlcmVuY2VzIHRvIHJlY3Vyc2l2ZSB0YWJsZTogJXMAbm8gc3VjaCAlcyBtb2RlOiAlcwBNSiBjb2xsaWRlOiAlcwBubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZTogJXMAY2lyY3VsYXIgcmVmZXJlbmNlOiAlcwBjYW5ub3Qgb3BlbiB0YWJsZSB3aXRob3V0IHJvd2lkOiAlcwAlcyBtb2RlIG5vdCBhbGxvd2VkOiAlcwB2dGFibGUgY29uc3RydWN0b3IgZmFpbGVkOiAlcwBhdXRvbWF0aWMgZXh0ZW5zaW9uIGxvYWRpbmcgZmFpbGVkOiAlcwBkYXRhYmFzZSB0YWJsZSBpcyBsb2NrZWQ6ICVzAGRhdGFiYXNlIHNjaGVtYSBpcyBsb2NrZWQ6ICVzAHZ0YWJsZSBjb25zdHJ1Y3RvciBkaWQgbm90IGRlY2xhcmUgc2NoZW1hOiAlcwBhYm9ydCBhdCAlZCBpbiBbJXNdOiAlcwAtLSAlcwAleiAtICVzAG9zX3VuaXguYzolZDogKCVkKSAlcyglcykgLSAlcwB3cgByaWdodHN0cgBsZWZ0c3RyAGluc3RyAHN1YnN0cgBleHByX2ltcGxpZXNfZXhwcgBpbnZhbGlkIGFyZ3VtZW50cyB0byBmdHM0YXV4IGNvbnN0cnVjdG9yAG1pc3NpbmcgJXMgcGFyYW1ldGVyIGluIGZ0czQgY29uc3RydWN0b3IAdGhlICIuIiBvcGVyYXRvcgBmdHMzY3Vyc29yAG5lYXIgIiVUIjogc3ludGF4IGVycm9yAHVua25vd24gZXJyb3IAZG9tYWluIGVycm9yAG5vdCBhbiBlcnJvcgBTUUwgbG9naWMgZXJyb3IAZGlzayBJL08gZXJyb3IAZmxvb3IAcm1kaXIAbWtkaXIAc2VnZGlyAGZ0czNfdG9rZW5pemVyAHVua25vd24gdG9rZW5pemVyAHBvd2VyAGxvd2VyAHNxbGl0ZV90ZW1wX21hc3RlcgBzcWxpdGVfbWFzdGVyAHBvcnRlcgBSZXNldFNvcnRlcgBGa0NvdW50ZXIAQVBJIGNhbGwgd2l0aCAlcyBkYXRhYmFzZSBjb25uZWN0aW9uIHBvaW50ZXIAc3RyZmlsdGVyAFZGaWx0ZXIARVNDQVBFIGV4cHJlc3Npb24gbXVzdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIAdXBwZXIAcHJvcGVyAElmU21hbGxlcgBjYW5ub3QgdXNlIFJFVFVSTklORyBpbiBhIHRyaWdnZXIARHJvcFRyaWdnZXIAc2Vjb25kIGFyZ3VtZW50IHRvIG50aF92YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcgBhcmd1bWVudCBvZiBudGlsZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcgBmcmFtZSBzdGFydGluZyBvZmZzZXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyAGZyYW1lIGVuZGluZyBvZmZzZXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyAEludGVnZXIAUm93aWQgJWxsZCBvdXQgb2Ygb3JkZXIAUmVtYWluZGVyAGZyYW1lIHN0YXJ0aW5nIG9mZnNldCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcgBmcmFtZSBlbmRpbmcgb2Zmc2V0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyAGFkZHIAcGFkcgBjaGFyAHllYXIAQ2xlYXIAQml0T3IAc2VxAENvbGxTZXEARWxzZUVxAHJlZ2V4cABPcGVuRHVwAE5vb3AASnVtcAAvdXNyL3RtcAAvdmFyL3RtcAB0ZW1wAGN1cnJlbnRfdGltZXN0YW1wAEFnZ1N0ZXAAbW9kZVN0ZXAAdmFyaWFuY2VTdGVwAG11bm1hcABtbWFwAG1yZW1hcAB2dGFiOiVwAHNzZW5zdW8AaWxzdW8AYXV0bwBHb3RvAGludG8AaW5jcmVtZW50YWxfdmFjdXVtIGVuYWJsZWQgd2l0aCBhIG1heCByb290cGFnZSBvZiB6ZXJvAElmTm90WmVybwBEZWNySnVtcFplcm8ARmtJZlplcm8Ac2Vxbm8ASU5TRVJUIElOVE8iJXciLiIld19yb3dpZCIocm93aWQsbm9kZW5vKVZBTFVFUyg/MSw/MilPTiBDT05GTElDVChyb3dpZClETyBVUERBVEUgU0VUIG5vZGVubz1leGNsdWRlZC5ub2Rlbm8AQ1JFQVRFIFRBQkxFICIldyIuIiV3X3Jvd2lkIihyb3dpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLG5vZGVubwBpbmRleF94aW5mbwB0YWJsZV94aW5mbwBtYXRjaGluZm8AaW5kZXhfaW5mbwB0YWJsZV9pbmZvAE9wZW5Qc2V1ZG8AZmNob3duAFJldHVybgBqc29uAG5vIHF1ZXJ5IHNvbHV0aW9uAGluZGV4IGNvcnJ1cHRpb24AZGF0YWJhc2UgY29ycnVwdGlvbgBmcmVlIHNwYWNlIGNvcnJ1cHRpb24AdW5rbm93biBjb2x1bW4gIiVzIiBpbiBmb3JlaWduIGtleSBkZWZpbml0aW9uACVzLnhCZXN0SW5kZXggbWFsZnVuY3Rpb24AYXV0aG9yaXplciBtYWxmdW5jdGlvbgAlI1QoKSBtYXkgbm90IGJlIHVzZWQgYXMgYSB3aW5kb3cgZnVuY3Rpb24AJyVzJyBpcyBub3QgYSBmdW5jdGlvbgBGdW5jdGlvbgBjYW5ub3Qgc3RhcnQgYSB0cmFuc2FjdGlvbiB3aXRoaW4gYSB0cmFuc2FjdGlvbgBjYW5ub3QgY2hhbmdlICVzIHdhbCBtb2RlIGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24AdGVtcG9yYXJ5IHN0b3JhZ2UgY2Fubm90IGJlIGNoYW5nZWQgZnJvbSB3aXRoaW4gYSB0cmFuc2FjdGlvbgBjYW5ub3QgVkFDVVVNIGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24AU2FmZXR5IGxldmVsIG1heSBub3QgYmUgY2hhbmdlZCBpbnNpZGUgYSB0cmFuc2FjdGlvbgBUcmFuc2FjdGlvbgBQZXJtdXRhdGlvbgB1bmtub3duIG9wZXJhdGlvbgB1bnN1cHBvcnRlZCBmcmFtZSBzcGVjaWZpY2F0aW9uAFJBTkdFIHdpdGggb2Zmc2V0IFBSRUNFRElORy9GT0xMT1dJTkcgcmVxdWlyZXMgb25lIE9SREVSIEJZIGV4cHJlc3Npb24AdG9vIG1hbnkgbGV2ZWxzIG9mIHRyaWdnZXIgcmVjdXJzaW9uAHVzZXJfdmVyc2lvbgBzcWxpdGVfdmVyc2lvbgBkYXRhX3ZlcnNpb24Ac2NoZW1hX3ZlcnNpb24Ac3FsaXRlX2Ryb3BfY29sdW1uAHNxbGl0ZV9yZW5hbWVfY29sdW1uAGFmdGVyIGRyb3AgY29sdW1uAG5vIHN1Y2ggY29sdW1uAG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgbm9uLWdlbmVyYXRlZCBjb2x1bW4AY2Fubm90IHVzZSBERUZBVUxUIG9uIGEgZ2VuZXJhdGVkIGNvbHVtbgBhZGQgY29sdW1uAENhbm5vdCBhZGQgYSBQUklNQVJZIEtFWSBjb2x1bW4AQ2Fubm90IGFkZCBhIFVOSVFVRSBjb2x1bW4AY2Fubm90IGFkZCBhIFNUT1JFRCBjb2x1bW4AVkNvbHVtbgBidWlsdGluAGFzaW4AY2Fubm90IGhhdmUgYm90aCBPTiBhbmQgVVNJTkcgY2xhdXNlcyBpbiB0aGUgc2FtZSBqb2luAGF0IG1vc3QgJWQgdGFibGVzIGluIGEgam9pbgBtaW4Ab3JpZ2luAFZCZWdpbgBtYWluAEV4cGxhaW4Ac2lnbgBzc2VuAG9wZW4ASWZOb3RPcGVuAFNvcnRlck9wZW4AVk9wZW4AaGlkZGVuAGF0YW4AbWVkaWFuAFNlZWtTY2FuAFZJbml0SW4AYXV0b192YWN1dW0AaW5jcmVtZW50YWxfdmFjdXVtAEluY3JWYWN1dW0Ac3VtAGRyb3AgY29sdW1uIGZyb20AL2Rldi91cmFuZG9tAEFkZEltbQBydHJpbQBsdHJpbQByZWFkb25seV9zaG0AJXMtc2htAHRuZW0AUkFJU0UoKSBtYXkgb25seSBiZSB1c2VkIHdpdGhpbiBhIHRyaWdnZXItcHJvZ3JhbQBQcm9ncmFtAFBhcmFtAGZ1bABmY250bABpb2N0bABpZ29sAGxvY2tpbmcgcHJvdG9jb2wAbmNvbABub3RudWxsAGlmbnVsbAAvZGV2L251bGwAZGF0YWJhc2Ugb3IgZGlzayBpcyBmdWxsAE5vdE51bGwAU29mdE51bGwASXNOdWxsAFplcm9Pck51bGwASGFsdElmTnVsbABjb2xsAGNhY2hlX3NwaWxsAFJvd0NlbGwAY2VpbABkZXRhaWwAcGFkbAB1bml4LWV4Y2wAdGJsAHdhbAB2aXJ0dWFsAHRvdGFsAGluY3JlbWVudGFsAE9wZW5FcGhlbWVyYWwAQWdnRmluYWwAbm9ybWFsAEluZGV4IGFscmVhZHkgb3B0aW1hbABwYXJ0aWFsAHJlYWwAUmVhbABwawBvawB1bmxpbmsAcmVhZGxpbmsARmluaXNoU2VlawBEZWZlcnJlZFNlZWsAbm9sb2NrAEN1cnNvclVubG9jawBibG9jawAlcy5sb2NrAEN1cnNvckxvY2sAVGFibGVMb2NrAHJ0cmVlY2hlY2sAaW50ZWdyaXR5X2NoZWNrAGZvcmVpZ25fa2V5X2NoZWNrAHF1aWNrX2NoZWNrAGNlbGxfc2l6ZV9jaGVjawBpbnRlZ3JpdHktY2hlY2sARmtDaGVjawBUeXBlQ2hlY2sASW50ZWdyaXR5Q2sAcmV6aQBub2l0YXppAGl0aXZpAHNzZW5ldmkAaXRpAGlzc2lzaQBpc2lzaQBwaQBub2kAZ25pAHNpc3NpaQBpc3Npc2lpAHNzc2lpaQBzZWkAaXRpY2kAZXRhY2kAbGFjaQBydHJlZWRlcHRoAGNvdGgAbW9udGgAanNvbl9hcnJheV9sZW5ndGgAb3ZlcmZsb3cgbGlzdCBsZW5ndGgAd2R0aABzdGF0X3B1c2gAYWNvc2gAYXNpbmgAYXRhbmgAanNvbl9wYXRjaABkYXRhdHlwZSBtaXNtYXRjaABhcmd1bWVudCB0eXBlIG1pc21hdGNoAGFiYnJldmlhdGVkIHF1ZXJ5IGFsZ29yaXRobSBzZWFyY2gAdW5peGVwb2NoAHNxbGl0ZV9hdHRhY2gAc3FsaXRlX2RldGFjaABqc29uX2VhY2gAYXZnAG5hcmcAUnRyZWVNYXRjaEFyZwBzcWxpdGVfbG9nAHN0YXRlbWVudCB0b28gbG9uZwBjYW5ub3Qgb3BlbiAlcyBjb2x1bW4gZm9yIHdyaXRpbmcAc3Vic3RyaW5nAFN0cmluZwBzcWxpdGVfcmV0dXJuaW5nAGVuY29kaW5nAHN0cmluZyBvciBibG9iIHRvbyBiaWcAUmVsZWFzZVJlZwAlLjE2ZwAlIS4xNWcAICVnAHNzZW5sdWYAcHJpbnRmAHR5cGVvZgBtb2Rlb2YAb3V0IG9mAHJlbmFtZSBjb2x1bW5zIG9mAG51bGxpZgBpaWYAb2ZmADAxMjM0NTY3ODlhYmNkZWYASWYAJTA2LjNmACUuKmYAZ2V0cGFnZXNpemUAZG9jc2l6ZQBtbWFwX3NpemUAZGVmYXVsdF9jYWNoZV9zaXplAFBSQUdNQSAlUS5wYWdlX3NpemUAZnRzM3Rva2VuaXplAG9wdGltaXplAGpzb25fcmVtb3ZlAE1vdmUAY2Fubm90IGNvbW1pdCAtIG5vIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZQBjYW5ub3Qgcm9sbGJhY2sgLSBubyB0cmFuc2FjdGlvbiBpcyBhY3RpdmUAZXhjbHVzaXZlAHRydWUASXNUcnVlAHVuaXF1ZQBkZmx0X3ZhbHVlAENhbm5vdCBhZGQgYSBSRUZFUkVOQ0VTIGNvbHVtbiB3aXRoIG5vbi1OVUxMIGRlZmF1bHQgdmFsdWUAQWdnVmFsdWUAanNvbl9xdW90ZQBwd3JpdGUAT3BlbldyaXRlAG9uX2RlbGV0ZQBzZWN1cmVfZGVsZXRlAElkeERlbGV0ZQBwcml2YXRlAGFnZ3JlZ2F0ZQBWQ3JlYXRlAG9uX3VwZGF0ZQBWVXBkYXRlAGN1cnJlbnRfZGF0ZQBmYWxsb2NhdGUAZnRydW5jYXRlAHJlcGxpY2F0ZQBiYWQgcGFyYW1ldGVyIG9yIG90aGVyIEFQSSBtaXN1c2UAdG9vIG1hbnkgdGVybXMgaW4gJXMgQlkgY2xhdXNlAHRvbyBtYW55IHRlcm1zIGluIE9SREVSIEJZIGNsYXVzZQBhZ2dyZWdhdGUgZnVuY3Rpb25zIGFyZSBub3QgYWxsb3dlZCBpbiB0aGUgR1JPVVAgQlkgY2xhdXNlAFBBUlRJVElPTiBjbGF1c2UAYSBOQVRVUkFMIGpvaW4gbWF5IG5vdCBoYXZlIGFuIE9OIG9yIFVTSU5HIGNsYXVzZQBkYXRhYmFzZSAlcyBpcyBhbHJlYWR5IGluIHVzZQBBZ2dJbnZlcnNlAHJldmVyc2UAY2xvc2UAQ2xvc2UAZmFsc2UAYXR0ZW1wdCB0byB3cml0ZSBhIHJlYWRvbmx5IGRhdGFiYXNlAGNvcnJ1cHQgZGF0YWJhc2UAYXR0YWNoZWQgZGF0YWJhc2VzIG11c3QgdXNlIHRoZSBzYW1lIHRleHQgZW5jb2RpbmcgYXMgbWFpbiBkYXRhYmFzZQBOb2RlICVsbGQgbWlzc2luZyBmcm9tIGRhdGFiYXNlAGZpbGUgaXMgbm90IGEgZGF0YWJhc2UAdGVtcF9zdG9yZQAlcyBjbGF1c2Ugc2hvdWxkIGNvbWUgYWZ0ZXIgJXMgbm90IGJlZm9yZQBFeHBpcmUAc3F1YXJlAGV4cHJfY29tcGFyZQBTb3J0ZXJDb21wYXJlAHN1YnR5cGUAanNvbl90eXBlAElzTnVsbE9yVHlwZQBJZk5vSG9wZQBpbHRuZQB1bml4LW5vbmUASW5pdENvcm91dGluZQBFbmRDb3JvdXRpbmUAaWNuZQBsb2NhbHRpbWUAc3RyZnRpbWUAZGF0ZXRpbWUAY3VycmVudF90aW1lAHRuZW1lAGFmdGVyIHJlbmFtZQBub24tdGV4dCBmaWxlbmFtZQBWUmVuYW1lAGFtYmlndW91cyBjb2x1bW4gbmFtZQB0ZW1wb3JhcnkgdHJpZ2dlciBtYXkgbm90IGhhdmUgcXVhbGlmaWVkIG5hbWUAc2ltcGxlAGxvd2VyX3F1YXJ0aWxlAHVwcGVyX3F1YXJ0aWxlAHVuaXgtZG90ZmlsZQBjYW5ub3Qgb3BlbiBmaWxlAHVuYWJsZSB0byBvcGVuIGRhdGFiYXNlIGZpbGUAaW1tdXRhYmxlAEFib3J0YWJsZQBsZWdhY3lfYWx0ZXJfdGFibGUAc3FsaXRlX3JlbmFtZV90YWJsZQBNYXBwaW5nICglbGxkIC0+ICVsbGQpIG1pc3NpbmcgZnJvbSAlcyB0YWJsZQBjYW5ub3QgY3JlYXRlIHRyaWdnZXIgb24gc3lzdGVtIHRhYmxlAHZpcnR1YWwgdGFibGUAbm8gc3VjaCB0YWJsZQBUb28gbWFueSBjb2x1bW5zIGZvciBhbiBydHJlZSB0YWJsZQBUb28gZmV3IGNvbHVtbnMgZm9yIGFuIHJ0cmVlIHRhYmxlAFdyb25nIG51bWJlciBvZiBjb2x1bW5zIGZvciBhbiBydHJlZSB0YWJsZQBudW1iZXIgb2YgY29sdW1ucyBpbiBmb3JlaWduIGtleSBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHJlZmVyZW5jZWQgdGFibGUAbG9jYWwgdGltZSB1bmF2YWlsYWJsZQBhbm90aGVyIHJvdyBhdmFpbGFibGUAbm8gbW9yZSByb3dzIGF2YWlsYWJsZQBWYXJpYWJsZQBEcm9wVGFibGUAdXRmMTZsZQBVVEYxNmxlAFVURi0xNmxlAGNhc2Vfc2Vuc2l0aXZlX2xpa2UAU2V0Q29va2llAFJlYWRDb29raWUAY2FjaGUAY29sdW1uIGluZGV4IG91dCBvZiByYW5nZQBub3RpZmljYXRpb24gbWVzc2FnZQB3YXJuaW5nIG1lc3NhZ2UAaW52YWxpZCByb290cGFnZQBFeHRlbmRzIG9mZiBlbmQgb2YgcGFnZQAyMDIyLTA1LTA2IDE1OjI1OjI3IDc4ZDljOTkzZDQwNGNkZmFhN2ZkZDI5NzNmYTEwNTJlM2RhOWY2NjIxNWNmZjljNTU0MGViZTU1YzQwN2Q5ZmUAU2NoZW1hIGNvcnJ1cHQgb3Igbm90IGFuIHJ0cmVlAGpzb25fdHJlZQBDcmVhdGVCdHJlZQBkZWUAcnRyZWVub2RlACVzX25vZGUAam91cm5hbF9tb2RlAGxvY2tpbmdfbW9kZQBvcGNvZGUAdW5pY29kZQBKb3VybmFsTW9kZQBEaXZpZGUAY29hbGVzY2UAc3FsaXRlX3NlcXVlbmNlAFNlcXVlbmNlAGRpZmZlcmVuY2UAdmFyaWFuY2UAT25jZQBUcmFjZQBqc29uX3JlcGxhY2UAdXRmMTZiZQBVVEYxNmJlAFVURi0xNmJlAE5lAExlAEdlADIwYzoyMGUAMjBiOjIwZQAlIS4yMGUAZ2V0Y3dkAE1ha2VSZWNvcmQAdGhzdG5kcmQAbGlrZWxpaG9vZABmY2htb2QAcm91bmQATm90Rm91bmQAUmV3aW5kAFNlZWtFbmQAQml0QW5kAG9sZAB7JWxsZABXcm9uZyBudW1iZXIgb2YgZW50cmllcyBpbiAlJSVzIHRhYmxlIC0gZXhwZWN0ZWQgJWxsZCwgYWN0dWFsICVsbGQAJWxsZCAlbGxkAG5vIHN1Y2ggcm93aWQ6ICVsbGQAcmVidWlsZABZaWVsZABsYXN0X2luc2VydF9yb3dpZAAlX3Jvd2lkACVzLnJvd2lkAFNFTEVDVCpGUk9NIiV3Ii4lcyBPUkRFUiBCWSByb3dpZABTRUxFQ1QqRlJPTSIldyIuJXMgV0hFUkUgJXMgT1JERVIgQlkgcm93aWQASWR4Um93aWQATmV3Um93aWQAU2Vla1Jvd2lkAGdldGV1aWQAaW52YWxpZABqc29uX3ZhbGlkAGZraWQAX19sYW5naWQAJXosIGxhbmdpZABsYW5ndWFnZWlkAGRvY2lkAGFwcGxpY2F0aW9uX2lkAHNxbGl0ZV9zb3VyY2VfaWQAbm90IGF1dGhvcml6ZWQASW5kZXggb3B0aW1pemVkAG5vdGluZGV4ZWQAdW5hYmxlIHRvIGlkZW50aWZ5IHRoZSBvYmplY3QgdG8gYmUgcmVpbmRleGVkAHZpZXdzIG1heSBub3QgYmUgaW5kZXhlZAB2aXJ0dWFsIHRhYmxlcyBtYXkgbm90IGJlIGluZGV4ZWQAdGFibGUgJXMgbWF5IG5vdCBiZSBpbmRleGVkAHJlYWRfdW5jb21taXR0ZWQAUklHSFQgYW5kIEZVTEwgT1VURVIgSk9JTnMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkAHJlY3Vyc2l2ZSBhZ2dyZWdhdGUgcXVlcmllcyBub3Qgc3VwcG9ydGVkAHF1ZXJ5IGFib3J0ZWQAcm93cyBpbnNlcnRlZABpbnRlcnJ1cHRlZABjaGVja3BvaW50ZWQAYWNjZXNzIHRvICV6IGlzIHByb2hpYml0ZWQAYWNjZXNzIHRvIHZpZXcgIiVzIiBwcm9oaWJpdGVkAHJvd3MgZGVsZXRlZABnZW5lcmF0ZWQAcm93cyB1cGRhdGVkAG5vdHVzZWQAcm93IHZhbHVlIG1pc3VzZWQAc3FsaXRlX2NvbXBpbGVvcHRpb25fdXNlZABQYWdlICVkIGlzIG5ldmVyIHVzZWQAQ29sdW1uc1VzZWQAc3RvcmVkAHZpcnR1YWwgdGFibGVzIG1heSBub3QgYmUgYWx0ZXJlZAB2aWV3ICVzIG1heSBub3QgYmUgYWx0ZXJlZAB0YWJsZSAlcyBtYXkgbm90IGJlIGFsdGVyZWQAc2hhcmVkAGluZGV4IGFzc29jaWF0ZWQgd2l0aCBVTklRVUUgb3IgUFJJTUFSWSBLRVkgY29uc3RyYWludCBjYW5ub3QgYmUgZHJvcHBlZAB0YWJsZSAlcyBtYXkgbm90IGJlIGRyb3BwZWQAdmlldyAlcyBpcyBjaXJjdWxhcmx5IGRlZmluZWQAdW5vcGVuZWQAZGF0YWJhc2UgZGlzayBpbWFnZSBpcyBtYWxmb3JtZWQAJXMgY29uc3RyYWludCBmYWlsZWQARk9SRUlHTiBLRVkgY29uc3RyYWludCBmYWlsZWQAbGFyZ2UgZmlsZSBzdXBwb3J0IGlzIGRpc2FibGVkAGZ0czN0b2tlbml6ZSBkaXNhYmxlZABkYXRhYmFzZSAlcyBpcyBsb2NrZWQAZGF0YWJhc2UgaXMgbG9ja2VkAGRhdGFiYXNlIHRhYmxlIGlzIGxvY2tlZABhdXRob3JpemF0aW9uIGRlbmllZABhY2Nlc3MgcGVybWlzc2lvbiBkZW5pZWQAdGFibGUgJVMgaGFzICVkIGNvbHVtbnMgYnV0ICVkIHZhbHVlcyB3ZXJlIHN1cHBsaWVkAHRlbXBvcmFyeSB0YWJsZSBuYW1lIG11c3QgYmUgdW5xdWFsaWZpZWQAdGFibGUgJXMgbWF5IG5vdCBiZSBtb2RpZmllZABjb25mbGljdGluZyBPTiBDT05GTElDVCBjbGF1c2VzIHNwZWNpZmllZABubyB0YWJsZXMgc3BlY2lmaWVkAGRhdGFiYXNlIGlzIGFscmVhZHkgYXR0YWNoZWQAZGF0YWJhc2Ugc2NoZW1hIGhhcyBjaGFuZ2VkAGV4Y2x1ZGVkAFBvaW50ZXIgbWFwIHBhZ2UgJWQgaXMgcmVmZXJlbmNlZABSb3dTZXRBZGQARmlsdGVyQWRkAHByZWFkAFJvd1NldFJlYWQAT3BlblJlYWQAJTA0ZAAlMDNkACUwMmQANDBmLTIxYS0yMWQAc3FsaXRlX3N0YXQlZABjb2x1bW4lZAAsYSVkAHNxbGl0ZV9hdXRvaW5kZXhfJXNfJWQAYSVkPT8lZAB2YXJpYWJsZSBudW1iZXIgbXVzdCBiZSBiZXR3ZWVuID8xIGFuZCA/JWQARmFpbGVkIHRvIHJlYWQgcHRybWFwIGtleT0lZAB1bmFibGUgdG8gZ2V0IHRoZSBwYWdlLiBlcnJvciBjb2RlPSVkAE9mZnNldCAlZCBvdXQgb2YgcmFuZ2UgJWQuLiVkAGsoJWQAVVBEQVRFICVRLnNxbGl0ZV9tYXN0ZXIgU0VUIHJvb3RwYWdlPSVkIFdIRVJFICMlZCBBTkQgcm9vdHBhZ2U9IyVkAFVQREFURSAlUS5zcWxpdGVfbWFzdGVyIFNFVCB0eXBlPSclcycsIG5hbWU9JVEsIHRibF9uYW1lPSVRLCByb290cGFnZT0jJWQsIHNxbD0lUSBXSEVSRSByb3dpZD0jJWQAVVBEQVRFICVRLnNxbGl0ZV9tYXN0ZXIgU0VUIHR5cGU9J3RhYmxlJywgbmFtZT0lUSwgdGJsX25hbWU9JVEsIHJvb3RwYWdlPTAsIHNxbD0lUSBXSEVSRSByb3dpZD0jJWQAdG9vIG1hbnkgYXR0YWNoZWQgZGF0YWJhc2VzIC0gbWF4ICVkAHRvbyBtYW55IGFyZ3VtZW50cyBvbiAlcygpIC0gbWF4ICVkAGV4cGVjdGVkICVkIGNvbHVtbnMgZm9yICclcycgYnV0IGdvdCAlZABhdHRlbXB0IHRvIG9wZW4gIiVzIiBhcyBmaWxlIGRlc2NyaXB0b3IgJWQAaW52YWxpZCBwYWdlIG51bWJlciAlZABmYWlsZWQgdG8gZ2V0IHBhZ2UgJWQAMm5kIHJlZmVyZW5jZSB0byBwYWdlICVkAGZyZWVsaXN0IGxlYWYgY291bnQgdG9vIGJpZyBvbiBwYWdlICVkAGJ0cmVlSW5pdFBhZ2UoKSByZXR1cm5zIGVycm9yIGNvZGUgJWQAJXMgaXMgJWQgYnV0IHNob3VsZCBiZSAlZAAlciAlcyBCWSB0ZXJtIG91dCBvZiByYW5nZSAtIHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kICVkAHN1Yi1zZWxlY3QgcmV0dXJucyAlZCBjb2x1bW5zIC0gZXhwZWN0ZWQgJWQASU4oLi4uKSBlbGVtZW50IGhhcyAlZCB0ZXJtJXMgLSBleHBlY3RlZCAlZAAlc0xJU1QgU1VCUVVFUlkgJWQAUkVVU0UgTElTVCBTVUJRVUVSWSAlZAAlc1NDQUxBUiBTVUJRVUVSWSAlZABSRVVTRSBTVUJRVUVSWSAlZABJTkRFWCAlZAB0b28gbWFueSBGUk9NIGNsYXVzZSB0ZXJtcywgbWF4OiAlZAByd2MAdXRjAGRlc2MAYXNjAGNoZWNrcG9pbnRfZnVsbGZzeW5jAGZ1bGxfZnN5bmMAY2hhcmluZGV4RnVuYwBzcXJ0RnVuYwBjb3RGdW5jAHJpZ2h0RnVuYwBsZWZ0RnVuYwBhY29zRnVuYwBmbG9vckZ1bmMAcG93ZXJGdW5jAHN0cmZpbHRlckZ1bmMAcHJvcGVyRnVuYwBwYWRyRnVuYwBleHBGdW5jAGFzaW5GdW5jAHNpZ25GdW5jAGF0YW5GdW5jAGNlaWxGdW5jAHBhZGxGdW5jAGNvdGhGdW5jAGFjb3NoRnVuYwBhc2luaEZ1bmMAYXRhbmhGdW5jAGxvZ0Z1bmMAcmFkMmRlZ0Z1bmMAcmV2ZXJzZUZ1bmMAUHVyZUZ1bmMAc3F1YXJlRnVuYwBkaWZmZXJlbmNlRnVuYwBkZWcycmFkRnVuYwBwYWRjRnVuYwBhdG4yRnVuYwBsb2cxMEZ1bmMAZW5jAG51bWVyaWMAMT09YXJnYwBTcWxFeGVjAHBhZGMAJS40YyVzJS4xNmMAc3FsaXRlLXNyYy9zcWxpdGUtYW1hbGdhbWF0aW9uLTMzODA1MDAvZXh0ZW5zaW9uLWZ1bmN0aW9ucy5jACVzL2V0aWxxc18lbGx4JWMAdW5yZWNvZ25pemVkIG1hdGNoaW5mbyByZXF1ZXN0OiAlYwBHb3N1YgBnbG9iAHplcm9ibG9iAHJhbmRvbWJsb2IAQmxvYgBpbGIAaXRpbGliAG1lbWRiAEFUVEFDSCAlUSBBUyB2YWN1dW1fZGIAcm90YQBldml0YQBsYW5vaXRhAGV0YQBkYXRhAFJvd0RhdGEAU29ydGVyRGF0YQBpY25hAHNxbGl0ZV90ZW1wX3NjaGVtYQBzcWxpdGVfc2NoZW1hAHdyaXRhYmxlX3NjaGVtYQB0cnVzdGVkX3NjaGVtYQBjb3JydXB0IHNjaGVtYQBQYXJzZVNjaGVtYQBpbGxhAGV6aWxhAGl0aWxhAG1zaWxhAHNxbGl0ZV8AcHJhZ21hXwBTUUxJVEVfAF9ST1dJRF8AJXMgYXQgbGluZSAlZCBvZiBbJS4xMHNdAGJpbmQgb24gYSBidXN5IHByZXBhcmVkIHN0YXRlbWVudDogWyVzXQBtYWxmb3JtZWQgTUFUQ0ggZXhwcmVzc2lvbjogWyVzXQBbJWRdAFtdAFswXQAkWwBMRUZULU1PU1QgU1VCUVVFUlkAQ09NUE9VTkQgUVVFUlkAQU5ZAGdlbmVyYXRlZCBjb2x1bW5zIGNhbm5vdCBiZSBwYXJ0IG9mIHRoZSBQUklNQVJZIEtFWQBBVVRPSU5DUkVNRU5UIGlzIG9ubHkgYWxsb3dlZCBvbiBhbiBJTlRFR0VSIFBSSU1BUlkgS0VZAGRvY2lkIElOVEVHRVIgUFJJTUFSWSBLRVkARk9SRUlHTiBLRVkAUklHSFQgUEFSVCBPRiBPUkRFUiBCWQBHUk9VUCBCWQBpaXNYAGlzaVgAQVVUT01BVElDIFBBUlRJQUwgQ09WRVJJTkcgSU5ERVgAQVVUT01BVElDIENPVkVSSU5HIElOREVYAC1taiUwNlg5JTAyWABTQ0FOIENPTlNUQU5UIFJPVwBWSUVXAGpzb25fb2JqZWN0KCkgbGFiZWxzIG11c3QgYmUgVEVYVABGSVJTVABMQVNUAEVYQ0VQVABOT1QALCUuKnMgSU5UAENSRUFURSBUQUJMRSB4KCUuKnMgSU5UAElkeExUAFNlZWtMVABTRVQgREVGQVVMVABNVVRFWF9PTUlUAENPTU1JVABMSU1JVABSSUdIVABJZHhHVABTZWVrR1QATEVGVABESVNUSU5DVABSRVNUUklDVABJTlRFUlNFQ1QAdG9vIG1hbnkgdGVybXMgaW4gY29tcG91bmQgU0VMRUNUAHVua25vd24gb3IgdW5zdXBwb3J0ZWQgam9pbiB0eXBlOiAlVCAlVCVzJVQALSVUAHRvbyBtYW55IGFyZ3VtZW50cyBvbiBmdW5jdGlvbiAlVAB1bmtub3duIGRhdGFiYXNlICVUAGZvcmVpZ24ga2V5IG9uICVzIHNob3VsZCByZWZlcmVuY2Ugb25seSBvbmUgY29sdW1uIG9mIHRhYmxlICVUAENSRUFURSBWSVJUVUFMIFRBQkxFICVUAGhleCBsaXRlcmFsIHRvbyBiaWc6ICVzJSNUAG5vIHN1Y2ggZnVuY3Rpb246ICUjVABub3QgYXV0aG9yaXplZCB0byB1c2UgZnVuY3Rpb246ICUjVABERUZBVUxUX1JFQ1VSU0lWRV9UUklHR0VSUwBJTlMARU5BQkxFX0ZUUzNfUEFSRU5USEVTSVMARElTQUJMRV9MRlMAJXMgJVMAbm8gc3VjaCBpbmRleDogJVMAY2Fubm90IGNyZWF0ZSAlcyB0cmlnZ2VyIG9uIHZpZXc6ICVTAG5vIHN1Y2ggdHJpZ2dlcjogJVMAY2Fubm90IGNyZWF0ZSBJTlNURUFEIE9GIHRyaWdnZXIgb24gdGFibGU6ICVTAE1BVEVSSUFMSVpFICUhUwBDTy1ST1VUSU5FICUhUwBVU0lORyBJTkRFWCAlcyBGT1IgSU4tT1BFUkFUT1IAVVNJTkcgUk9XSUQgU0VBUkNIIE9OIFRBQkxFICVzIEZPUiBJTi1PUEVSQVRPUgBNVUxUSS1JTkRFWCBPUgBTUUxJVEVfVE1QRElSAEFGVEVSAElOVEVHRVIAT1JERVIATkVBUgBERUxFVEUgRlJPTSAlUS4lcyBXSEVSRSAlcz0lUQBuYW1lPSVRIEFORCBzcWw9JVEAREVMRVRFIEZST00gJVEuc3FsaXRlX3NlcXVlbmNlIFdIRVJFIG5hbWU9JVEALCB4LiVRAFNFTEVDVCAqIEZST00gJVEuJVEAVVBEQVRFICIldyIuc3FsaXRlX3NlcXVlbmNlIHNldCBuYW1lID0gJVEgV0hFUkUgbmFtZSA9ICVRAFVQREFURSAiJXciLnNxbGl0ZV9tYXN0ZXIgU0VUIHNxbCA9IHByaW50ZignJSUuJWRzLCAnLHNxbCkgfHwgJVEgfHwgc3Vic3RyKHNxbCwxK2xlbmd0aChwcmludGYoJyUlLiVkcycsc3FsKSkpIFdIRVJFIHR5cGUgPSAndGFibGUnIEFORCBuYW1lID0gJVEAU0VUVVAAR1JPVVAAUkVDVVJTSVZFIFNURVAATmFOAG1hbGZvcm1lZCBKU09OAE5PIEFDVElPTgBPTUlUX0xPQURfRVhURU5TSU9OAFVOSU9OAEJFR0lOACxhcmcgSElEREVOACxzY2hlbWEgSElEREVOAFNDQU4AREVGQVVMVF9BVVRPVkFDVVVNACBOVU0AUlRSSU0AQ2Fubm90IGFkZCBhIE5PVCBOVUxMIGNvbHVtbiB3aXRoIGRlZmF1bHQgdmFsdWUgTlVMTABOT1QgTlVMTABTRVQgTlVMTABTRUxFQ1QgMSBGUk9NICVRLiclcV9zZWdtZW50cycgV0hFUkUgYmxvY2tpZD0/IEFORCBibG9jayBJUyBOVUxMAFVOSU9OIEFMTAAsJS4qcyBSRUFMAENIRUNLAGFib3J0IGR1ZSB0byBST0xMQkFDSwBNQVRDSABTRUFSQ0gAYSBHUk9VUCBCWSBjbGF1c2UgaXMgcmVxdWlyZWQgYmVmb3JlIEhBVklORwBVU0lORwBFTkFCTEVfTk9STUFMSVpFACBVTklRVUUAREVMRVRFAFVQREFURQBSRUxFQVNFAE5PQ0FTRQBCRUZPUkUAQ1JFAE5PTkUASWR4TEUAU2Vla0xFAFRBQkxFADE2TEUASWR4R0UAU2Vla0dFAEVOQUJMRV9SVFJFRQAlcyBVU0lORyBURU1QIEItVFJFRQBDQVNDQURFADE2QkUARU5EAEFORABST1dJRABPSUQAREVTQwBTRUxFQ1QgaWR4LCBzdGFydF9ibG9jaywgbGVhdmVzX2VuZF9ibG9jaywgZW5kX2Jsb2NrLCByb290IEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgPSA/IE9SREVSIEJZIGlkeCBBU0MAU0VMRUNUIGlkeCwgc3RhcnRfYmxvY2ssIGxlYXZlc19lbmRfYmxvY2ssIGVuZF9ibG9jaywgcm9vdCBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsIEJFVFdFRU4gPyBBTkQgP09SREVSIEJZIGxldmVsIERFU0MsIGlkeCBBU0MAU0VMRUNUIGxldmVsLCBpZHgsIGVuZF9ibG9jayBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsIEJFVFdFRU4gPyBBTkQgPyBPUkRFUiBCWSBsZXZlbCBERVNDLCBpZHggQVNDAFNFTEVDVCBpZHggRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbD0/IE9SREVSIEJZIDEgQVNDAFNZU1RFTV9NQUxMT0MAQkxPQgBCQkIAVVBEQVRFIE9SIEZBSUwgJVEuJyVxX3NlZ2RpcicgU0VUIGxldmVsPS0xLGlkeD0/IFdIRVJFIGxldmVsPT8gQU5EIGlkeD0/AFVQREFURSAlUS4nJXFfc2VnZGlyJyBTRVQgaWR4ID0gPyBXSEVSRSBsZXZlbD0/IEFORCBpZHg9PwAlcz0/AFNFTEVDVCBkYXRhIEZST00gJVEuJyVxX25vZGUnIFdIRVJFIG5vZGVubz0/AFNFTEVDVCAlcyBXSEVSRSByb3dpZD0/AFNFTEVDVCBzaXplIEZST00gJVEuJyVxX2RvY3NpemUnIFdIRVJFIGRvY2lkPT8AU0VMRUNUIHZhbHVlIEZST00gJVEuJyVxX3N0YXQnIFdIRVJFIGlkPT8APyw/LD8AREVMRVRFIEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgQkVUV0VFTiA/IEFORCA/AFNFTEVDVCBtYXgobGV2ZWwpIEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgQkVUV0VFTiA/IEFORCA/AERFTEVURSBGUk9NICVRLiclcV9zZWdtZW50cycgV0hFUkUgYmxvY2tpZCBCRVRXRUVOID8gQU5EID8AVVBEQVRFICVRLiclcV9zZWdkaXInIFNFVCBzdGFydF9ibG9jayA9ID8sIHJvb3QgPSA/V0hFUkUgbGV2ZWwgPSA/IEFORCBpZHggPSA/AFNFTEVDVCBpZHgsIHN0YXJ0X2Jsb2NrLCBsZWF2ZXNfZW5kX2Jsb2NrLCBlbmRfYmxvY2ssIHJvb3QgRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbCA9ID8gQU5EIGlkeCA9ID8AREVMRVRFIEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgPSA/IEFORCBpZHggPSA/AERFTEVURSBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsID0gPwBTRUxFQ1QgY291bnQoKikgRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbCA9ID8AU0VMRUNUICVzIFdIRVJFIHJvd2lkID0gPwBERUxFVEUgRlJPTSAlUS4nJXFfY29udGVudCcgV0hFUkUgcm93aWQgPSA/AERFTEVURSBGUk9NICVRLiclcV9kb2NzaXplJyBXSEVSRSBkb2NpZCA9ID8ALCA/ADxleHByPgA8Yj4APGI+Li4uPC9iPgAtPj4ALT4Ac2VwYXJhdG9ycz0AdG9rZW5jaGFycz0AYXV0b21lcmdlPQA8AENSRUFURSBUQUJMRSAiJXciLiIld19wYXJlbnQiKG5vZGVubyBJTlRFR0VSIFBSSU1BUlkgS0VZLHBhcmVudG5vZGUpOwApO0NSRUFURSBUQUJMRSAiJXciLiIld19ub2RlIihub2Rlbm8gSU5URUdFUiBQUklNQVJZIEtFWSxkYXRhKTsASU5TRVJUIElOVE8gJVEuc3FsaXRlX21hc3RlciBWQUxVRVMoJ2luZGV4JywlUSwlUSwjJWQsJVEpOwBDUkVBVEUgVEFCTEUgJVEuJyVxX3NlZ21lbnRzJyhibG9ja2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIGJsb2NrIEJMT0IpOwBDUkVBVEUgVEFCTEUgJVEuJyVxX2RvY3NpemUnKGRvY2lkIElOVEVHRVIgUFJJTUFSWSBLRVksIHNpemUgQkxPQik7AENSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICVRLiclcV9zdGF0JyhpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCB2YWx1ZSBCTE9CKTsAQ1JFQVRFIFRBQkxFICVRLiclcV9zZWdkaXInKGxldmVsIElOVEVHRVIsaWR4IElOVEVHRVIsc3RhcnRfYmxvY2sgSU5URUdFUixsZWF2ZXNfZW5kX2Jsb2NrIElOVEVHRVIsZW5kX2Jsb2NrIElOVEVHRVIscm9vdCBCTE9CLFBSSU1BUlkgS0VZKGxldmVsLCBpZHgpKTsAVVBEQVRFICVRLnNxbGl0ZV9tYXN0ZXIgU0VUIHRibF9uYW1lID0gJVEsIG5hbWUgPSBDQVNFIFdIRU4gdHlwZT0ndGFibGUnIFRIRU4gJVEgV0hFTiBuYW1lIExJS0UgJ3NxbGl0ZVhfYXV0b2luZGV4JSUnIEVTQ0FQRSAnWCcgICAgICBBTkQgdHlwZT0naW5kZXgnIFRIRU4gJ3NxbGl0ZV9hdXRvaW5kZXhfJyB8fCAlUSB8fCBzdWJzdHIobmFtZSwlZCsxOCkgRUxTRSBuYW1lIEVORCBXSEVSRSB0YmxfbmFtZT0lUSBDT0xMQVRFIG5vY2FzZSBBTkQgKHR5cGU9J3RhYmxlJyBPUiB0eXBlPSdpbmRleCcgT1IgdHlwZT0ndHJpZ2dlcicpOwBEUk9QIFRBQkxFIElGIEVYSVNUUyAlUS4nJXFfc2VnbWVudHMnO0RST1AgVEFCTEUgSUYgRVhJU1RTICVRLiclcV9zZWdkaXInO0RST1AgVEFCTEUgSUYgRVhJU1RTICVRLiclcV9kb2NzaXplJztEUk9QIFRBQkxFIElGIEVYSVNUUyAlUS4nJXFfc3RhdCc7JXMgRFJPUCBUQUJMRSBJRiBFWElTVFMgJVEuJyVxX2NvbnRlbnQnOwBBTFRFUiBUQUJMRSAlUS4nJXFfY29udGVudCcgIFJFTkFNRSBUTyAnJXFfY29udGVudCc7AERST1AgVEFCTEUgJyVxJy4nJXFfbm9kZSc7RFJPUCBUQUJMRSAnJXEnLiclcV9yb3dpZCc7RFJPUCBUQUJMRSAnJXEnLiclcV9wYXJlbnQnOwBBTFRFUiBUQUJMRSAlUS4nJXFfc3RhdCcgIFJFTkFNRSBUTyAnJXFfc3RhdCc7AEFMVEVSIFRBQkxFICVRLiclcV9zZWdtZW50cycgUkVOQU1FIFRPICclcV9zZWdtZW50cyc7AEFMVEVSIFRBQkxFICVRLiclcV9zZWdkaXInICAgUkVOQU1FIFRPICclcV9zZWdkaXInOwBBTFRFUiBUQUJMRSAlUS4nJXFfZG9jc2l6ZScgIFJFTkFNRSBUTyAnJXFfZG9jc2l6ZSc7AEFMVEVSIFRBQkxFICVRLiclcV9ub2RlJyAgIFJFTkFNRSBUTyAiJXdfbm9kZSI7QUxURVIgVEFCTEUgJVEuJyVxX3BhcmVudCcgUkVOQU1FIFRPICIld19wYXJlbnQiO0FMVEVSIFRBQkxFICVRLiclcV9yb3dpZCcgIFJFTkFNRSBUTyAiJXdfcm93aWQiOwA6bWVtb3J5OgBmaWxlOgBTdHJpbmc4AHV0ZjgAVVRGOABVVEYtOABNQVhfRlVOQ1RJT05fQVJHPTEyNwBERUZBVUxUX1NFQ1RPUl9TSVpFPTQwOTYAREVGQVVMVF9QQUdFX1NJWkU9NDA5NgBNQVhfVkFSSUFCTEVfTlVNQkVSPTMyNzY2AE1BWF9QQUdFX1NJWkU9NjU1MzYAVVRGMTYAVVRGLTE2AHA1AHRvbyBtYW55IHJlZmVyZW5jZXMgdG8gIiVzIjogbWF4IDY1NTM1AHNxbGl0ZV9zdGF0NABmdHM0AHA0AERFRkFVTFRfRklMRV9GT1JNQVQ9NABJbnQ2NABwd3JpdGU2NABwcmVhZDY0AE1BTExPQ19TT0ZUX0xJTUlUPTEwMjQAc3FsaXRlX3N0YXQzAFNBVkVQT0lOVCBmdHMzAFJPTExCQUNLIFRPIGZ0czMAUkVMRUFTRSBmdHMzAHAzAEVOQUJMRV9GVFMzAE1BWF9QQUdFX0NPVU5UPTEwNzM3NDE4MjMAcDIAYXRuMgBhdGFuMgByZW1vdmVfZGlhY3JpdGljcz0yAERFRkFVTFRfU1lOQ0hST05PVVM9MgBERUZBVUxUX1dBTF9TWU5DSFJPTk9VUz0yAGFyZ2M9PTMgfHxhcmdjPT0yAE1BWF9ERUZBVUxUX1BBR0VfU0laRT04MTkyAHJ0cmVlX2kzMgBTRUxFQ1QgdGJsLGlkeCxzdGF0IEZST00gJVEuc3FsaXRlX3N0YXQxAEFnZ1N0ZXAxAFNFTEVDVCBwYXJlbnRub2RlIEZST00gJVEuJyVxX3BhcmVudCcgV0hFUkUgbm9kZW5vPT8xAFNFTEVDVCBub2Rlbm8gRlJPTSAlUS4nJXFfcm93aWQnIFdIRVJFIHJvd2lkPT8xAFNFTEVDVCAqIEZST00gIiV3Ii4iJXdfcm93aWQiIFdIRVJFIHJvd2lkPT8xAFNFTEVDVCBwYXJlbnRub2RlIEZST00gJyVxJy4nJXFfcGFyZW50JyBXSEVSRSBub2Rlbm8gPSA/MQBERUxFVEUgRlJPTSAnJXEnLiclcV9wYXJlbnQnIFdIRVJFIG5vZGVubyA9ID8xAERFTEVURSBGUk9NICclcScuJyVxX25vZGUnIFdIRVJFIG5vZGVubyA9ID8xAFNFTEVDVCBub2Rlbm8gRlJPTSAnJXEnLiclcV9yb3dpZCcgV0hFUkUgcm93aWQgPSA/MQBERUxFVEUgRlJPTSAnJXEnLiclcV9yb3dpZCcgV0hFUkUgcm93aWQgPSA/MQByZW1vdmVfZGlhY3JpdGljcz0xAEFUT01JQ19JTlRSSU5TSUNTPTEAVEVNUF9TVE9SRT0xAGFyZ2M9PTEAdW5pY29kZTYxAFVQREFURSBPUiBGQUlMICVRLiclcV9zZWdkaXInIFNFVCBsZXZlbD0/IFdIRVJFIGxldmVsPS0xAERFRkFVTFRfSk9VUk5BTF9TSVpFX0xJTUlUPS0xAFNFTEVDVCBsZXZlbCwgY291bnQoKikgQVMgY250IEZST00gJVEuJyVxX3NlZ2RpcicgICBHUk9VUCBCWSBsZXZlbCBIQVZJTkcgY250Pj0/ICBPUkRFUiBCWSAobGV2ZWwgJSUgMTAyNCkgQVNDLCAyIERFU0MgTElNSVQgMQBTRUxFQ1QgbGVuZ3RoKGRhdGEpIEZST00gJyVxJy4nJXFfbm9kZScgV0hFUkUgbm9kZW5vID0gMQBTRUxFQ1QgKFNFTEVDVCBtYXgoaWR4KSBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsID0gPykgKyAxAFNFTEVDVCdJTlNFUlQgSU5UTyB2YWN1dW1fZGIuJ3x8cXVvdGUobmFtZSl8fCcgU0VMRUNUKkZST00iJXciLid8fHF1b3RlKG5hbWUpRlJPTSB2YWN1dW1fZGIuc3FsaXRlX3NjaGVtYSBXSEVSRSB0eXBlPSd0YWJsZSdBTkQgY29hbGVzY2Uocm9vdHBhZ2UsMSk+MABTRUxFQ1Qgc3FsIEZST00gIiV3Ii5zcWxpdGVfc2NoZW1hIFdIRVJFIHR5cGU9J3RhYmxlJ0FORCBuYW1lPD4nc3FsaXRlX3NlcXVlbmNlJyBBTkQgY29hbGVzY2Uocm9vdHBhZ2UsMSk+MAByZW1vdmVfZGlhY3JpdGljcz0wAE1BWF9XT1JLRVJfVEhSRUFEUz0wAERFRkFVTFRfV09SS0VSX1RIUkVBRFM9MABNQVhfTU1BUF9TSVpFPTAAREVGQVVMVF9NTUFQX1NJWkU9MABUSFJFQURTQUZFPTAAOTIyMzM3MjAzNjg1NDc3NTgwAERFRkFVTFRfUENBQ0hFX0lOSVRTWj0yMABsb2cxMABNQVhfQVRUQUNIRUQ9MTAATUFYX0NPTVBPVU5EX1NFTEVDVD01MDAAPzAwMABNQVhfQ09MVU1OPTIwMDAAREVGQVVMVF9DQUNIRV9TSVpFPS0yMDAwAERFRkFVTFRfV0FMX0FVVE9DSEVDS1BPSU5UPTEwMDAATUFYX0VYUFJfREVQVEg9MTAwMABNQVhfVFJJR0dFUl9ERVBUSD0xMDAwAE1BWF9MSUtFX1BBVFRFUk5fTEVOR1RIPTUwMDAwAE1BWF9WREJFX09QPTI1MDAwMDAwMABNQVhfTEVOR1RIPTEwMDAwMDAwMDAATUFYX1NRTF9MRU5HVEg9MTAwMDAwMDAwMABzZWNvbmQgYXJndW1lbnQgdG8gJSNUKCkgbXVzdCBiZSBhIGNvbnN0YW50IGJldHdlZW4gMC4wIGFuZCAxLjAAQ09NUElMRVI9Y2xhbmctMTUuMC4wAC9wcm9jL3NlbGYvZmQvACVRLgBOLgAkLgAtLQAsAG5vc2tpcHNjYW4qAHVub3JkZXJlZCoAc3o9WzAtOV0qAENSRUFURSBUQUJMRSB4KHR5cGUgdGV4dCxuYW1lIHRleHQsdGJsX25hbWUgdGV4dCxyb290cGFnZSBpbnQsc3FsIHRleHQpAE5vZGUgJWxsZCBpcyB0b28gc21hbGwgKCVkIGJ5dGVzKQBOb2RlICVsbGQgaXMgdG9vIHNtYWxsIGZvciBjZWxsIGNvdW50IG9mICVkICglZCBieXRlcykAcnRyZWUgY29uc3RyYWludCBmYWlsZWQ6ICVzLiglczw9JXMpAENSRUFURSBUQUJMRSAlUS4lcyglcykAYXV0b21hdGljIGluZGV4IG9uICVzKCVzKQBBTlkoJXMpAElOU0VSVCBJTlRPICVRLiclcV9jb250ZW50JyBWQUxVRVMoJXMpAENSRUFURSBUQUJMRSAlUS4nJXFfY29udGVudCcoJXMpAG1hbGZvcm1lZCBkYXRhYmFzZSBzY2hlbWEgKCVzKQBNRVJHRSAoJXMpAENSRUFURSBUQUJMRSAlUS5zcWxpdGVf