galaxy-commits
Threads by month
- ----- 2026 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions
commit/galaxy-central: guerler: Charts: Integrate multipanel charts
by commits-noreply@bitbucket.org 16 Apr '14
by commits-noreply@bitbucket.org 16 Apr '14
16 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/60d37cbc6857/
Changeset: 60d37cbc6857
User: guerler
Date: 2014-04-17 01:01:20
Summary: Charts: Integrate multipanel charts
Affected #: 7 files
diff -r 166660f085a51316976df1ffef426997ed393a24 -r 60d37cbc685789f0419cefdad528863b75b88a18 config/plugins/visualizations/charts/static/build-app.js
--- a/config/plugins/visualizations/charts/static/build-app.js
+++ b/config/plugins/visualizations/charts/static/build-app.js
@@ -3,4 +3,4 @@
// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.
// Underscore may be freely distributed under the MIT license.
-(function(){var e=this,t=e._,n={},r=Array.prototype,i=Object.prototype,s=Function.prototype,o=r.push,u=r.slice,a=r.concat,f=i.toString,l=i.hasOwnProperty,c=r.forEach,h=r.map,p=r.reduce,d=r.reduceRight,v=r.filter,m=r.every,g=r.some,y=r.indexOf,b=r.lastIndexOf,w=Array.isArray,E=Object.keys,S=s.bind,x=function(e){if(e instanceof x)return e;if(!(this instanceof x))return new x(e);this._wrapped=e};typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(exports=module.exports=x),exports._=x):e._=x,x.VERSION="1.4.4";var T=x.each=x.forEach=function(e,t,r){if(e==null)return;if(c&&e.forEach===c)e.forEach(t,r);else if(e.length===+e.length){for(var i=0,s=e.length;i<s;i++)if(t.call(r,e[i],i,e)===n)return}else for(var o in e)if(x.has(e,o)&&t.call(r,e[o],o,e)===n)return};x.map=x.collect=function(e,t,n){var r=[];return e==null?r:h&&e.map===h?e.map(t,n):(T(e,function(e,i,s){r.push(t.call(n,e,i,s))}),r)};var N="Reduce of empty array with no initial value";x.reduce=x.foldl=x.inject=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(p&&e.reduce===p)return r&&(t=x.bind(t,r)),i?e.reduce(t,n):e.reduce(t);T(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(N);return n},x.reduceRight=x.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(d&&e.reduceRight===d)return r&&(t=x.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=x.keys(e);s=o.length}T(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(N);return n},x.find=x.detect=function(e,t,n){var r;return C(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},x.filter=x.select=function(e,t,n){var r=[];return e==null?r:v&&e.filter===v?e.filter(t,n):(T(e,function(e,i,s){t.call(n,e,i,s)&&r.push(e)}),r)},x.reject=function(e,t,n){return x.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},x.every=x.all=function(e,t,r){t||(t=x.identity);var i=!0;return e==null?i:m&&e.every===m?e.every(t,r):(T(e,function(e,s,o){if(!(i=i&&t.call(r,e,s,o)))return n}),!!i)};var C=x.some=x.any=function(e,t,r){t||(t=x.identity);var i=!1;return e==null?i:g&&e.some===g?e.some(t,r):(T(e,function(e,s,o){if(i||(i=t.call(r,e,s,o)))return n}),!!i)};x.contains=x.include=function(e,t){return e==null?!1:y&&e.indexOf===y?e.indexOf(t)!=-1:C(e,function(e){return e===t})},x.invoke=function(e,t){var n=u.call(arguments,2),r=x.isFunction(t);return x.map(e,function(e){return(r?t:e[t]).apply(e,n)})},x.pluck=function(e,t){return x.map(e,function(e){return e[t]})},x.where=function(e,t,n){return x.isEmpty(t)?n?void 0:[]:x[n?"find":"filter"](e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},x.findWhere=function(e,t){return x.where(e,t,!0)},x.max=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&x.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},x.min=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&x.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o<r.computed&&(r={value:e,computed:o})}),r.value},x.shuffle=function(e){var t,n=0,r=[];return T(e,function(e){t=x.random(n++),r[n-1]=r[t],r[t]=e}),r};var k=function(e){return x.isFunction(e)?e:function(t){return t[e]}};x.sortBy=function(e,t,n){var r=k(t);return x.pluck(x.map(e,function(e,t,i){return{value:e,index:t,criteria:r.call(n,e,t,i)}}).sort(function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||n===void 0)return 1;if(n<r||r===void 0)return-1}return e.index<t.index?-1:1}),"value")};var L=function(e,t,n,r){var i={},s=k(t==null?x.identity:t);return T(e,function(t,o){var u=s.call(n,t,o,e);r(i,u,t)}),i};x.groupBy=function(e,t,n){return L(e,t,n,function(e,t,n){(x.has(e,t)?e[t]:e[t]=[]).push(n)})},x.countBy=function(e,t,n){return L(e,t,n,function(e,t){x.has(e,t)||(e[t]=0),e[t]++})},x.sortedIndex=function(e,t,n,r){n=n==null?x.identity:k(n);var i=n.call(r,t),s=0,o=e.length;while(s<o){var u=s+o>>>1;n.call(r,e[u])<i?s=u+1:o=u}return s},x.toArray=function(e){return e?x.isArray(e)?u.call(e):e.length===+e.length?x.map(e,x.identity):x.values(e):[]},x.size=function(e){return e==null?0:e.length===+e.length?e.length:x.keys(e).length},x.first=x.head=x.take=function(e,t,n){return e==null?void 0:t!=null&&!n?u.call(e,0,t):e[0]},x.initial=function(e,t,n){return u.call(e,0,e.length-(t==null||n?1:t))},x.last=function(e,t,n){return e==null?void 0:t!=null&&!n?u.call(e,Math.max(e.length-t,0)):e[e.length-1]},x.rest=x.tail=x.drop=function(e,t,n){return u.call(e,t==null||n?1:t)},x.compact=function(e){return x.filter(e,x.identity)};var A=function(e,t,n){return T(e,function(e){x.isArray(e)?t?o.apply(n,e):A(e,t,n):n.push(e)}),n};x.flatten=function(e,t){return A(e,t,[])},x.without=function(e){return x.difference(e,u.call(arguments,1))},x.uniq=x.unique=function(e,t,n,r){x.isFunction(t)&&(r=n,n=t,t=!1);var i=n?x.map(e,n,r):e,s=[],o=[];return T(i,function(n,r){if(t?!r||o[o.length-1]!==n:!x.contains(o,n))o.push(n),s.push(e[r])}),s},x.union=function(){return x.uniq(a.apply(r,arguments))},x.intersection=function(e){var t=u.call(arguments,1);return x.filter(x.uniq(e),function(e){return x.every(t,function(t){return x.indexOf(t,e)>=0})})},x.difference=function(e){var t=a.apply(r,u.call(arguments,1));return x.filter(e,function(e){return!x.contains(t,e)})},x.zip=function(){var e=u.call(arguments),t=x.max(x.pluck(e,"length")),n=new Array(t);for(var r=0;r<t;r++)n[r]=x.pluck(e,""+r);return n},x.unzip=function(e){var t=[];return x.each(e,function(e,n){x.each(e,function(e,r){t.length<=r&&(t[r]=[]),t[r][n]=e})}),t},x.object=function(e,t){if(e==null)return{};var n={};for(var r=0,i=e.length;r<i;r++)t?n[e[r]]=t[r]:n[e[r][0]]=e[r][1];return n},x.indexOf=function(e,t,n){if(e==null)return-1;var r=0,i=e.length;if(n){if(typeof n!="number")return r=x.sortedIndex(e,t),e[r]===t?r:-1;r=n<0?Math.max(0,i+n):n}if(y&&e.indexOf===y)return e.indexOf(t,n);for(;r<i;r++)if(e[r]===t)return r;return-1},x.lastIndexOf=function(e,t,n){if(e==null)return-1;var r=n!=null;if(b&&e.lastIndexOf===b)return r?e.lastIndexOf(t,n):e.lastIndexOf(t);var i=r?n:e.length;while(i--)if(e[i]===t)return i;return-1},x.range=function(e,t,n){arguments.length<=1&&(t=e||0,e=0),n=arguments[2]||1;var r=Math.max(Math.ceil((t-e)/n),0),i=0,s=new Array(r);while(i<r)s[i++]=e,e+=n;return s};var O=function(){};x.bind=function(e,t){var n,r;if(e.bind===S&&S)return S.apply(e,u.call(arguments,1));if(!x.isFunction(e))throw new TypeError;return n=u.call(arguments,2),r=function(){if(this instanceof r){O.prototype=e.prototype;var i=new O;O.prototype=null;var s=e.apply(i,n.concat(u.call(arguments)));return Object(s)===s?s:i}return e.apply(t,n.concat(u.call(arguments)))}},x.partial=function(e){var t=u.call(arguments,1);return function(){return e.apply(this,t.concat(u.call(arguments)))}},x.bindAll=function(e){var t=u.call(arguments,1);if(t.length===0)throw new Error("bindAll must be passed function names");return T(t,function(t){e[t]=x.bind(e[t],e)}),e},x.memoize=function(e,t){var n={};return t||(t=x.identity),function(){var r=t.apply(this,arguments);return x.has(n,r)?n[r]:n[r]=e.apply(this,arguments)}},x.delay=function(e,t){var n=u.call(arguments,2);return setTimeout(function(){return e.apply(null,n)},t)},x.defer=function(e){return x.delay.apply(x,[e,1].concat(u.call(arguments,1)))},x.throttle=function(e,t,n){var r,i,s,o,u=0,a=function(){u=new Date,s=null,o=e.apply(r,i)};return function(){var f=new Date;!u&&n===!1&&(u=f);var l=t-(f-u);return r=this,i=arguments,l<=0?(clearTimeout(s),s=null,u=f,o=e.apply(r,i)):s||(s=setTimeout(a,l)),o}},x.debounce=function(e,t,n){var r,i;return function(){var s=this,o=arguments,u=function(){r=null,n||(i=e.apply(s,o))},a=n&&!r;return clearTimeout(r),r=setTimeout(u,t),a&&(i=e.apply(s,o)),i}},x.once=function(e){var t=!1,n;return function(){return t?n:(t=!0,n=e.apply(this,arguments),e=null,n)}},x.wrap=function(e,t){return function(){var n=[e];return o.apply(n,arguments),t.apply(this,n)}},x.compose=function(){var e=arguments;return function(){var t=arguments;for(var n=e.length-1;n>=0;n--)t=[e[n].apply(this,t)];return t[0]}},x.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},x.keys=E||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)x.has(e,n)&&t.push(n);return t},x.values=function(e){var t=[];for(var n in e)x.has(e,n)&&t.push(e[n]);return t},x.pairs=function(e){var t=[];for(var n in e)x.has(e,n)&&t.push([n,e[n]]);return t},x.invert=function(e){var t={};for(var n in e)x.has(e,n)&&(t[e[n]]=n);return t},x.functions=x.methods=function(e){var t=[];for(var n in e)x.isFunction(e[n])&&t.push(n);return t.sort()},x.extend=function(e){return T(u.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},x.pick=function(e){var t={},n=a.apply(r,u.call(arguments,1));return T(n,function(n){n in e&&(t[n]=e[n])}),t},x.omit=function(e){var t={},n=a.apply(r,u.call(arguments,1));for(var i in e)x.contains(n,i)||(t[i]=e[i]);return t},x.defaults=function(e){return T(u.call(arguments,1),function(t){if(t)for(var n in t)e[n]===void 0&&(e[n]=t[n])}),e},x.clone=function(e){return x.isObject(e)?x.isArray(e)?e.slice():x.extend({},e):e},x.tap=function(e,t){return t(e),e};var M=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof x&&(e=e._wrapped),t instanceof x&&(t=t._wrapped);var i=f.call(e);if(i!=f.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=M(e[o],t[o],n,r)))break}else{var a=e.constructor,l=t.constructor;if(a!==l&&!(x.isFunction(a)&&a instanceof a&&x.isFunction(l)&&l instanceof l))return!1;for(var c in e)if(x.has(e,c)){o++;if(!(u=x.has(t,c)&&M(e[c],t[c],n,r)))break}if(u){for(c in t)if(x.has(t,c)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};x.isEqual=function(e,t){return M(e,t,[],[])},x.isEmpty=function(e){if(e==null)return!0;if(x.isArray(e)||x.isString(e))return e.length===0;for(var t in e)if(x.has(e,t))return!1;return!0},x.isElement=function(e){return!!e&&e.nodeType===1},x.isArray=w||function(e){return f.call(e)=="[object Array]"},x.isObject=function(e){return e===Object(e)},T(["Arguments","Function","String","Number","Date","RegExp"],function(e){x["is"+e]=function(t){return f.call(t)=="[object "+e+"]"}}),x.isArguments(arguments)||(x.isArguments=function(e){return!!e&&!!x.has(e,"callee")}),typeof /./!="function"&&(x.isFunction=function(e){return typeof e=="function"}),x.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},x.isNaN=function(e){return x.isNumber(e)&&e!=+e},x.isBoolean=function(e){return e===!0||e===!1||f.call(e)=="[object Boolean]"},x.isNull=function(e){return e===null},x.isUndefined=function(e){return e===void 0},x.has=function(e,t){return l.call(e,t)},x.noConflict=function(){return e._=t,this},x.identity=function(e){return e},x.times=function(e,t,n){var r=Array(e);for(var i=0;i<e;i++)r[i]=t.call(n,i);return r},x.random=function(e,t){return t==null&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))};var _={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};_.unescape=x.invert(_.escape);var D={escape:new RegExp("["+x.keys(_.escape).join("")+"]","g"),unescape:new RegExp("("+x.keys(_.unescape).join("|")+")","g")};x.each(["escape","unescape"],function(e){x[e]=function(t){return t==null?"":(""+t).replace(D[e],function(t){return _[e][t]})}}),x.result=function(e,t){if(e==null)return void 0;var n=e[t];return x.isFunction(n)?n.call(e):n},x.mixin=function(e){T(x.functions(e),function(t){var n=x[t]=e[t];x.prototype[t]=function(){var e=[this._wrapped];return o.apply(e,arguments),F.call(this,n.apply(x,e))}})};var P=0;x.uniqueId=function(e){var t=++P+"";return e?e+t:t},x.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var H=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},j=/\\|'|\r|\n|\t|\u2028|\u2029/g;x.template=function(e,t,n){var r;n=x.defaults({},n,x.templateSettings);var i=new RegExp([(n.escape||H).source,(n.interpolate||H).source,(n.evaluate||H).source].join("|")+"|$","g"),s=0,o="__p+='";e.replace(i,function(t,n,r,i,u){return o+=e.slice(s,u).replace(j,function(e){return"\\"+B[e]}),n&&(o+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(o+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),i&&(o+="';\n"+i+"\n__p+='"),s=u+t.length,t}),o+="';\n",n.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{r=new Function(n.variable||"obj","_",o)}catch(u){throw u.source=o,u}if(t)return r(t,x);var a=function(e){return r.call(this,e,x)};return a.source="function("+(n.variable||"obj")+"){\n"+o+"}",a},x.chain=function(e){return x(e).chain()};var F=function(e){return this._chain?x(e).chain():e};x.mixin(x),T(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=r[e];x.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],F.call(this,n)}}),T(["concat","join","slice"],function(e){var t=r[e];x.prototype[e]=function(){return F.call(this,t.apply(this._wrapped,arguments))}}),x.extend(x.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this),define("libs/underscore",function(e){return function(){var t,n;return t||e._}}(this)),define("utils/utils",["libs/underscore"],function(e){function t(e,t,r){n("GET",e,{},t,r)}function n(e,t,n,r,i){if(e=="GET"||e=="DELETE")t.indexOf("?")==-1?t+="?":t+="&",t+=$.param(n);var s=new XMLHttpRequest;s.open(e,t,!0),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Cache-Control","no-cache"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.setRequestHeader("Content-Type","application/json"),s.onloadend=function(){var e=s.status;try{response=jQuery.parseJSON(s.responseText)}catch(t){response=s.responseText}e==200?r&&r(response):i&&i(response)},e=="GET"||e=="DELETE"?s.send():s.send(JSON.stringify(n))}function r(e,t){var n=$('<div class="'+e+'"></div>');n.appendTo(":eq(0)");var r=n.css(t);return n.remove(),r}function i(e){$('link[href^="'+e+'"]').length||$('<link href="'+galaxy_config.root+e+'" rel="stylesheet">').appendTo("head")}function s(t,n){return t?e.defaults(t,n):n}function o(e,t){var n="";if(e>=1e11)e/=1e11,n="TB";else if(e>=1e8)e/=1e8,n="GB";else if(e>=1e5)e/=1e5,n="MB";else if(e>=100)e/=100,n="KB";else{if(!(e>0))return"<strong>-</strong>";e*=10,n="b"}var r=Math.round(e)/10;return t?r+" "+n:"<strong>"+r+"</strong> "+n}function u(){return(new Date).getTime().toString(36)}function a(e){var t=$("<p></p>");return t.append(e),t}function f(){var e=new Date,t=(e.getHours()<10?"0":"")+e.getHours(),n=(e.getMinutes()<10?"0":"")+e.getMinutes(),r=e.getDate()+"/"+(e.getMonth()+1)+"/"+e.getFullYear()+", "+t+":"+n;return r}return{cssLoadFile:i,cssGetAttribute:r,get:t,merge:s,bytesToString:o,uuid:u,time:f,wrap:a,request:n}}),define("mvc/ui/ui-modal",["utils/utils"],function(e){var t=Backbone.View.extend({elMain:"body",optionsDefault:{title:"ui-modal",body:"",backdrop:!0,height:null,width:null,closing_events:!1},buttonList:{},initialize:function(e){e&&this._create(e)},show:function(e){this.initialize(e),this.options.height?(this.$body.css("height",this.options.height),this.$body.css("overflow","hidden")):this.$body.css("max-height",$(window).height()/2),this.options.width&&this.$dialog.css("width",this.options.width),this.visible?this.$el.show():this.$el.fadeIn("fast"),this.visible=!0},hide:function(){this.visible=!1,this.$el.fadeOut("fast")},enableButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).prop("disabled",!1)},disableButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).prop("disabled",!0)},showButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).show()},hideButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).hide()},getButton:function(e){var t=this.buttonList[e];return this.$buttons.find("#"+t)},scrollTop:function(){return this.$body.scrollTop()},_create:function(e){var t=this;this.options=_.defaults(e,this.optionsDefault),this.options.body=="progress"&&(this.options.body=$('<div class="progress progress-striped active"><div class="progress-bar progress-bar-info" style="width:100%"></div></div>')),this.$el&&(this.$el.remove(),$(document).off("keyup.ui-modal")),this.setElement(this._template(this.options.title)),this.$dialog=this.$el.find(".modal-dialog"),this.$body=this.$el.find(".modal-body"),this.$footer=this.$el.find(".modal-footer"),this.$buttons=this.$el.find(".buttons"),this.$backdrop=this.$el.find(".modal-backdrop"),this.$body.html(this.options.body),this.options.backdrop||this.$backdrop.removeClass("in");if(this.options.buttons){this.buttonList={};var n=0;$.each(this.options.buttons,function(e,r){var i="button-"+n++;t.$buttons.append($('<button id="'+i+'"></button>').text(e).click(r)).append(" "),t.buttonList[e]=i})}else this.$footer.hide();$(this.elMain).append($(this.el)),this.options.closing_events&&($(document).on("keyup.ui-modal",function(e){e.keyCode==27&&t.hide()}),this.$el.find(".modal-backdrop").on("click",function(){t.hide()}))},_template:function(e){return'<div class="modal"><div class="modal-backdrop fade in" style="z-index: -1;"></div><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><button type="button" class="close" style="display: none;">×</button><h4 class="title">'+e+"</h4>"+"</div>"+'<div class="modal-body" style="position: static;"></div>'+'<div class="modal-footer">'+'<div class="buttons" style="float: right;"></div>'+"</div>"+"</div"+"</div>"+"</div>"}});return{View:t}}),define("mvc/ui/ui-portlet",["utils/utils"],function(e){var t=Backbone.View.extend({visible:!1,optionsDefault:{title:"",icon:"",buttons:null,body:null,height:null,operations:null,placement:"bottom",overflow:"auto"},$title:null,$content:null,$buttons:null,$operations:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.$content=this.$el.find("#content"),this.$title=this.$el.find("#title-text"),this.options.height&&(this.$el.find("#body").css("height",this.options.height),this.$el.find("#content").css("overflow",this.options.overflow)),this.$buttons=$(this.el).find("#buttons");if(this.options.buttons){var n=this;$.each(this.options.buttons,function(e,t){t.$el.prop("id",e),n.$buttons.append(t.$el)})}else this.$buttons.remove();this.$operations=$(this.el).find("#operations");if(this.options.operations){var n=this;$.each(this.options.operations,function(e,t){t.$el.prop("id",e),n.$operations.append(t.$el)})}this.options.body&&this.append(this.options.body)},append:function(t){this.$content.append(e.wrap(t))},content:function(){return this.$content},show:function(){this.$el.fadeIn("fast"),this.visible=!0},hide:function(){this.$el.fadeOut("fast"),this.visible=!1},enableButton:function(e){this.$buttons.find("#"+e).prop("disabled",!1)},disableButton:function(e){this.$buttons.find("#"+e).prop("disabled",!0)},hideOperation:function(e){this.$operations.find("#"+e).hide()},showOperation:function(e){this.$operations.find("#"+e).show()},setOperation:function(e,t){var n=this.$operations.find("#"+e);n.off("click"),n.on("click",t)},title:function(e){var t=this.$title;return e&&t.html(e),t.html()},_template:function(e){var t='<div class="toolForm portlet-view no-highlight">';if(e.title||e.icon)t+='<div id="title" class="toolFormTitle portlet-title"><div id="operations" class="portlet-operations"/><div style="overflow: hidden;">',e.icon&&(t+='<div class="portlet-title-icon fa '+e.icon+'"> </div>'),t+='<div id="title-text" class="portlet-title-text">'+e.title+"</div>",t+="</div></div>";return t+='<div id="body" class="toolFormBody portlet-body">',e.placement=="top"&&(t+='<div id="buttons" class="portlet-buttons"/>'),t+='<div id="content" class="portlet-content"/>',e.placement=="bottom"&&(t+='<div id="buttons" class="portlet-buttons"/>'),t+="</div></div>",t}});return{View:t}}),define("plugin/library/ui-select",["utils/utils"],function(e){var t=Backbone.View.extend({optionsDefault:{id:"",cls:"",empty:"No data available",visible:!0,wait:!1},selected:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.$select=this.$el.find("#select"),this.$icon=this.$el.find("#icon"),this.selected=this.options.value;var n=this;this.options.onchange&&this.$select.on("change",function(){n.value(n.$select.val())}),this._refresh(),this.options.visible||this.hide(),this.options.wait?this.wait():this.show()},value:function(e){var t=this.selected;e!==undefined&&(this.selected=e,this.$select.val(e));var n=this.selected;return n&&n!=t&&this.options.onchange&&this.options.onchange(n),n},text:function(){return this.$select.find("option:selected").text()},show:function(){this.$icon.removeClass(),this.$icon.addClass("fa fa-caret-down"),this.$select.show(),this.$el.show()},hide:function(){this.$el.hide()},wait:function(){this.$icon.removeClass(),this.$icon.addClass("fa fa-spinner fa-spin"),this.$select.hide()},disabled:function(){return this.$select.is(":disabled")},enable:function(){this.$select.prop("disabled",!1)},disable:function(){this.$select.prop("disabled",!0)},add:function(e){this.$select.append(this._templateOption(e)),this._refresh()},del:function(e){this.$select.find("option[value="+e+"]").remove(),this.$select.trigger("change"),this._refresh()},update:function(e){this.$select.find("option").remove();for(var t in e)this.$select.append(this._templateOption(e[t]));!this.selected&&e.length>0&&this.value(e[0].value),this._refresh()},_refresh:function(){this.$select.find("option[value=null]").remove();var e=this.$select.find("option").length;e==0?(this.$select.append(this._templateOption({value:"null",label:this.options.empty})),this.disable()):(this.enable(),this.selected&&this.$select.val(this.selected))},_exists:function(e){return 0!=this.$select.find("option[value="+e+"]").length},_templateOption:function(e){return'<option value="'+e.value+'">'+e.label+"</option>"},_template:function(e){var t='<div id="'+e.id+'" class="styled-select">'+'<div class="button">'+'<i id="icon"/>'+"</div>"+'<select id="select" class="select '+e.cls+" "+e.id+'">';for(key in e.data){var n=e.data[key],r="";if(n.value==e.value||n.value=="")r="selected";t+='<option value="'+n.value+'" '+r+">"+n.label+"</option>"}return t+="</select></div>",t}});return{View:t}}),define("plugin/library/ui",["utils/utils","plugin/library/ui-select"],function(e,t){var n=Backbone.View.extend({optionsDefault:{title:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options))},title:function(e){this.$el.find("b").html(e)},_template:function(e){return"<label><b>"+e.title+"</b></label>"},value:function(){return options.title}}),r=Backbone.View.extend({optionsDefault:{title:"",cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options))},title:function(e){this.$el.html(e)},_template:function(e){return'<div class="'+e.cls+'">'+e.title+"</div>"},value:function(){return options.title}}),i=Backbone.View.extend({optionsDefault:{id:null,title:"","float":"right",cls:"btn-default",icon:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){var t='<button id="'+e.id+'" type="submit" style="margin-right: 5px; float: '+e.float+';" type="button" class="btn '+e.cls+'">';return e.icon&&(t+='<i class="icon fa '+e.icon+'"></i> '),t+=e.title+"</button>",t}}),s=Backbone.View.extend({optionsDefault:{"float":"right",icon:"",tooltip:"",placement:"bottom",title:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){return'<div><span class="fa '+e.icon+'" style="font-size: 1.2em;"/> '+e.title+"</div>"}}),o=Backbone.View.extend({optionsDefault:{title:"",id:null,"float":"right",cls:"icon-btn",icon:"",tooltip:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){var t="";e.title&&(t="width: auto;");var n='<div id="'+e.id+'" style="margin-right: 5px; float: '+e.float+"; "+t+'" class="'+e.cls+'">';return e.title?n+='<div style="margin-right: 5px; margin-left: 5px;"><i class="icon fa '+e.icon+'"/> '+'<span style="position: relative; font-size: 0.8em; font-weight: normal; top: -1px;">'+e.title+"</span>"+"</div>":n+='<i class="icon fa '+e.icon+'"/>',n+="</div>",n}}),u=Backbone.View.extend({optionsDefault:{title:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick)},_template:function(e){return'<div><a href="javascript:void(0)">'+e.title+"</a></div>"}}),a=Backbone.View.extend({optionsDefault:{message:"",status:"info",persistent:!1},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement("<div></div>")},update:function(t){this.options=e.merge(t,this.optionsDefault);if(t.message!=""){this.$el.html(this._template(this.options)),this.$el.fadeIn();if(!t.persistent){var n=this;window.setTimeout(function(){n.$el.is(":visible")?n.$el.fadeOut():n.$el.hide()},3e3)}}else this.$el.fadeOut()},_template:function(e){return'<div class="alert alert-'+e.status+'" style="padding: 2px 2px 2px 10px;">'+e.message+"</div>"}}),f=Backbone.View.extend({optionsDefault:{onclick:null,searchword:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options));var n=this;this.options.onclick&&this.$el.on("submit",function(e){var t=n.$el.find("#search");n.options.onclick(t.val())})},_template:function(e){return'<div class="search"><form onsubmit="return false;"><input id="search" class="form-control input-sm" type="text" name="search" placeholder="Search..." value="'+e.searchword+'">'+'<button type="submit" class="btn search-btn">'+'<i class="fa fa-search"></i>'+"</button>"+"</form>"+"</div>"}}),l=Backbone.View.extend({optionsDefault:{title:"Unlabeled",body:null},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.body&&this.$el.find(".body").append(this.options.body)},_template:function(e){return'<div id="title" class="title">'+e.title+":"+"</div>"}}),c=Backbone.View.extend({optionsDefault:{id:"",title:"",target:"",href:"",onunload:null,onclick:null,visible:!0,icon:null,tag:""},$menu:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement($(this._template(this.options)));var n=$(this.el).find(".root"),r=this;n.on("click",function(e){e.preventDefault(),r.options.onclick&&r.options.onclick()}),this.options.visible||this.hide()},show:function(){$(this.el).show()},hide:function(){$(this.el).hide()},addMenu:function(t){var n={title:"",target:"",href:"",onclick:null,divider:!1,icon:null};n=e.merge(t,n),this.$menu||($(this.el).append(this._templateMenu()),this.$menu=$(this.el).find(".menu"));var r=$(this._templateMenuItem(n));r.on("click",function(e){e.preventDefault(),n.onclick&&n.onclick()}),this.$menu.append(r),n.divider&&this.$menu.append($(this._templateDivider()))},_templateMenuItem:function(e){var t='<li><a href="'+e.href+'" target="'+e.target+'">';return e.icon&&(t+='<i class="fa '+e.icon+'"></i>'),t+=" "+e.title+"</a>"+"</li>",t},_templateMenu:function(){return'<ul class="menu dropdown-menu pull-right" role="menu"></ul>'},_templateDivider:function(){return'<li class="divider"></li>'},_template:function(e){var t='<div id="'+e.id+'" class="button-menu btn-group">'+'<button type="button" class="root btn btn-default dropdown-toggle" data-toggle="dropdown">';return e.icon&&(t+='<i class="fa '+e.icon+'"></i>'),"</button></div>",t}}),h=Backbone.View.extend({optionsDefault:{value:"",type:"text",placeholder:"",disabled:!1,visible:!0},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.disabled&&this.$el.prop("disabled",!0),this.options.visible||this.$el.hide();var n=this;this.options.onchange&&this.$el.on("input",function(){n.options.onchange()})},value:function(e){return e!==undefined&&this.$el.val(e),this.$el.val()},_template:function(e){return'<input id="'+e.id+'" type="'+e.type+'" value="'+e.value+'" placeholder="'+e.placeholder+'" class="form-control">'}});return{Label:n,Button:i,Icon:s,ButtonIcon:o,Input:h,Anchor:u,Message:a,Searchbox:f,Title:l,Text:r,Select:t,ButtonMenu:c}}),define("plugin/library/jobs",["utils/utils"],function(e){return Backbone.Model.extend({initialize:function(t,n){this.app=t,this.options=e.merge(n,this.optionsDefault)},cleanup:function(t){var n=t.get("dataset_id_job");if(n!=""){var r=this;e.request("PUT",config.root+"api/histories/none/contents/"+n,{deleted:!0},function(){r._refreshHdas()}),t.set("dataset_id_job","")}},submit:function(t,n,r,i,s){var o=this,u=t.id,a=t.get("type"),f=this.app.types.get(a);data={tool_id:"chartskit",inputs:{input:{id:t.get("dataset_id"),src:"hda"},module:f.execute,columns:r,settings:n}},t.state("wait","Sending job request..."),e.request("POST",config.root+"api/tools",data,function(e){if(!e.outputs||e.outputs.length==0)t.state("failed","Job submission failed. No response."),s&&s();else{o._refreshHdas();var n=e.outputs[0];t.state("wait","Job has been queued..."),t.set("dataset_id_job",n.id),this.app.storage.save(),o._loop(n.id,function(e){switch(e.state){case"ok":return t.state("wait","Job completed successfully..."),i(e),!0;case"error":return t.state("failed","Job has failed. Please check the history for details."),s&&s(),!0;case"running":return t.state("wait","Job is running..."),!1}})}},function(e){var n="";e&&e.message&&e.message.data&&e.message.data.input&&(n=e.message.data.input+"."),t.state("failed","This visualization requires the Charts-Kit. Please make sure it is installed. "+n),s&&s()})},_loop:function(t,n){var r=this;e.request("GET",config.root+"api/datasets/"+t,{},function(e){n(e)||setTimeout(function(){r._loop(t,n)},r.app.config.get("query_timeout"))})},_refreshHdas:function(){Galaxy&&Galaxy.currHistoryPanel&&Galaxy.currHistoryPanel.refreshHdas()}})}),define("plugin/library/datasets",["utils/utils"],function(e){return Backbone.Collection.extend({list:{},cache:{},initialize:function(t,n){this.app=t,this.options=e.merge(n,this.optionsDefault)},request:function(t,n,r){var i=this;if(t.groups)this._get(t,n);else{var s=this.list[t.id];if(s){n(s);return}e.request("GET",config.root+"api/datasets/"+t.id,{},function(e){switch(e.state){case"error":r&&r(e);break;default:i.list[t.id]=e,n(e)}})}},_block_id:function(e,t){return e.id+"_"+e.start+"_"+e.end+"_"+t},_get:function(e,t){e.start||(e.start=0),e.end||(e.end=this.app.config.get("query_limit"));var n=[],r={},i=0;for(var s in e.groups){var o=e.groups[s];for(var u in o.columns){var a=o.columns[u].index,f=this._block_id(e,a);if(this.cache[f])continue;!r[a]&&a!==undefined&&(r[a]=i,n.push(a),i++)}}if(n.length==0){this._fill_from_cache(e),t(e);return}var l={dataset_id:e.id,start:e.start,end:e.end,columns:n},c=this;this._fetch(l,function(r){for(var i in r){var s=n[i],o=c._block_id(e,s);c.cache[o]=r[i]}c._fill_from_cache(e),t(e)})},_fill_from_cache:function(e){console.debug("Datasets::_fill_from_cache() - Filling request from cache.");for(var t in e.groups){var n=e.groups[t];n.values=[];for(var r in n.columns){var i=n.columns[r],s=this._block_id(e,i.index),o=this.cache[s];for(k in o){var u=n.values[k];u===undefined&&(u={x:parseInt(k)+e.start},n.values[k]=u);var a=o[k];isNaN(a)&&!i.is_label&&(a=0),u[r]=a}}}},_fetch:function(t,n){var r=t.start?t.start:0,i=Math.abs(t.end-t.start),s=this.app.config.get("query_limit");if(!i||i>s)i=s;var o=0;t.columns&&(o=t.columns.length,console.debug("Datasets::_fetch() - Fetching "+o+" column(s)")),o==0&&console.debug("Datasets::_fetch() - No columns requested");var u="";for(var a in t.columns)u+=t.columns[a]+",";u=u.substring(0,u.length-1);var f=this;e.request("GET",config.root+"api/datasets/"+t.dataset_id,{data_type:"raw_data",provider:"dataset-column",limit:i,offset:r,indeces:u},function(e){var t=new Array(o);for(var r=0;r<o;r++)t[r]=[];for(var r in e.data){var i=e.data[r];for(var s in i){var u=i[s];u!==undefined&&t[s].push(u)}}console.debug("Datasets::_fetch() - Fetching complete."),n(t)})}})}),define("plugin/models/group",[],function(){return Backbone.Model.extend({defaults:{key:"Data label",date:""},reset:function(){this.clear({silent:!0}).set(this.defaults),this.trigger("reset",this)}})}),define("plugin/models/groups",["plugin/models/group"],function(e){return Backbone.Collection.extend({model:e})}),define("plugin/library/deferred",["utils/utils"],function(e){return Backbone.Model.extend({queue:[],process:{},counter:0,initialize:function(){this.on("refresh",function(){if(this.counter==0)for(var e in this.queue)this.queue[e](),this.queue.splice(e,1)})},execute:function(e){this.queue.push(e),this.trigger("refresh")},register:function(){var t=e.uuid();return this.process[t]=!0,this.counter++,console.debug("Deferred:register() - Registering "+t),t},done:function(e){this.process[e]&&(delete this.process[e],this.counter--,console.debug("Deferred:done() - Unregistering "+e),this.trigger("refresh"))},ready:function(){return this.counter==0?!0:!1}})});var Visualization=Backbone.Model.extend({defaults:{config:{}},urlRoot:function(){var e="/api/visualizations";return window.galaxy_config&&galaxy_config.root?galaxy_config.root+e:e},initialize:function(e){_.isObject(e.config)&&_.isObject(this.defaults.config)&&_.defaults(e.config,this.defaults.config),this._setUpListeners()},_setUpListeners:function(){},set:function(e,t){if(e==="config"){var n=this.get("config");_.isObject(n)&&(t=_.extend(_.clone(n),t))}return Backbone.Model.prototype.set.call(this,e,t),this},toString:function(){var e=this.get("id")||"";return this.get("title")&&(e+=":"+this.get("title")),"Visualization("+e+")"}}),VisualizationCollection=Backbone.Collection.extend({model:Visualization,url:function(){return galaxy_config.root+"api/visualizations"},initialize:function(e,t){t=t||{}},set:function(e,t){var n=this;e=_.map(e,function(e){var t=n.get(e.id);if(!t)return e;var r=t.toJSON();return _.extend(r,e),r}),Backbone.Collection.prototype.set.call(this,e,t)},toString:function(){return["VisualizationCollection(",[this.historyId,this.length].join(),")"].join("")}});define("mvc/visualization/visualization-model",function(){}),define("plugin/models/chart",["plugin/models/groups","plugin/library/deferred","mvc/visualization/visualization-model"],function(e,t){return Backbone.Model.extend({defaults:{id:null,title:"",type:"",date:null,state:"",state_info:"",modified:!1,dataset_id:"",dataset_id_job:""},initialize:function(n){this.groups=new e,this.settings=new Backbone.Model,this.deferred=new t},reset:function(){this.clear({silent:!0}).set(this.defaults),this.groups.reset(),this.settings.clear(),this.trigger("reset",this)},copy:function(e){var t=this;t.clear({silent:!0}).set(this.defaults),t.set(e.attributes),t.settings=e.settings.clone(),t.groups.reset(),e.groups.each(function(e){t.groups.add(e.clone())}),t.trigger("change",t)},state:function(e,t){this.set("state",e),this.set("state_info",t),this.trigger("set:state"),console.debug("Chart:state() - "+t+" ("+e+")")}})}),define("plugin/library/storage",["utils/utils","plugin/models/chart","plugin/models/group"],function(e,t,n){return Backbone.Model.extend({vis:null,initialize:function(e){this.app=e,this.chart=this.app.chart,this.options=this.app.options,this.id=this.options.id,this.vis=new Visualization({type:"charts",config:{dataset_id:this.options.config.dataset_id,chart_dict:{}}}),this.id&&(this.vis.id=this.id);var t=this.options.config.chart_dict;t&&(this.vis.get("config").chart_dict=t)},save:function(){var e=this.app.chart;this.vis.get("config").chart_dict={};var t=e.get("title");t!=""&&this.vis.set("title",t);var n={attributes:e.attributes,settings:e.settings.attributes,groups:[]};e.groups.each(function(e){n.groups.push(e.attributes)}),this.vis.get("config").chart_dict=n;var r=this;this.vis.save().fail(function(e,t,n){console.error(e,t,n)}).then(function(e){e&&e.id&&(r.id=e.id)})},load:function(){var e=this.vis.get("config").chart_dict;if(!e.attributes)return!1;this.chart.set(e.attributes),this.chart.state("ok","Loading saved visualization..."),this.chart.settings.set(e.settings);for(var t in e.groups)this.chart.groups.add(new n(e.groups[t]));return this.chart.set("modified",!1),!0}})}),define("plugin/views/viewport",["mvc/ui/ui-portlet","plugin/library/ui","utils/utils"],function(e,t,n){return Backbone.View.extend({initialize:function(e,t){this.app=e,this.chart=this.app.chart,this.options=n.merge(t,this.optionsDefault),this.setElement($(this._template())),this._fullscreen(this.$el,80),this._create_canvas("div");var r=this;this.chart.on("redraw",function(){r._draw(r.chart)}),this.chart.on("set:state",function(){var e=r.$el.find("#info"),t=e.find("#icon");t.removeClass(),e.show(),e.find("#text").html(r.chart.get("state_info"));var n=r.chart.get("state");switch(n){case"ok":e.hide();break;case"failed":t.addClass("fa fa-warning");break;default:t.addClass("fa fa-spinner fa-spin")}})},show:function(){this.$el.show()},hide:function(){this.$el.hide()},_fullscreen:function(e,t){e.css("height",$(window).height()-t),$(window).resize(function(){e.css("height",$(window).height()-t)})},_create_canvas:function(e){this.canvas&&this.canvas.remove(),this.$el.append($(this._template_canvas(e)));var t=this.$el.find(".canvas");e=="svg"?this.canvas=d3.select(t[0]):this.canvas=t},_draw:function(e){var t=this,n=e.deferred.register(),r=e.get("type");this.chart_settings=this.app.types.get(r),this._create_canvas(this.chart_settings.element),e.state("wait","Please wait...");if(!this.chart_settings.execute||this.chart_settings.execute&&e.get("modified"))this.app.jobs.cleanup(e),e.set("modified",!1);var t=this;require(["plugin/charts/"+r+"/"+r],function(r){var i=new r(t.app,{canvas:t.canvas});t.chart_settings.execute?e.get("dataset_id_job")==""?t.app.jobs.submit(e,t._defaultSettingsString(e),t._defaultRequestString(e),function(){i.draw(n,e,t._defaultRequestDictionary(e))},function(){e.deferred.done(n)}):i.draw(n,e,t._defaultRequestDictionary(e)):i.draw(n,e,t._defaultRequestDictionary(e))})},_defaultRequestString:function(e){var t="",n=0,r=this;return e.groups.each(function(e){for(var i in r.chart_settings.columns)t+=i+"_"+ ++n+":"+(parseInt(e.get(i))+1)+", "}),t.substring(0,t.length-2)},_defaultSettingsString:function(e){var t="";for(key in e.settings.attributes)t+=key+":"+e.settings.get(key)+", ";return t.substring(0,t.length-2)},_defaultRequestDictionary:function(e){var t={groups:[]};this.chart_settings.execute?t.id=e.get("dataset_id_job"):t.id=e.get("dataset_id");var n=0,r=this;return e.groups.each(function(e){var i={};for(var s in r.chart_settings.columns){var o=r.chart_settings.columns[s];i[s]={index:e.get(s),is_label:o.is_label}}t.groups.push({key:++n+":"+e.get("key"),columns:i})}),t},_template:function(){return'<div style="height: inherit; min-height: 50px;"><div id="info" style="position: absolute; margin-left: 10px; margin-top: 10px; margin-bottom: 50px;"><span id="icon" style="font-size: 1.2em; display: inline-block;"/><span id="text" style="position: relative; margin-left: 5px; top: -1px; font-size: 1.0em;"/></div></div>'},_template_canvas:function(e){return"<"+e+' class="canvas" style="height: 100%;"/>'}})}),define("plugin/views/viewer",["utils/utils","plugin/library/ui","mvc/ui/ui-portlet","plugin/models/group","plugin/views/viewport"],function(e,t,n,r,i){return Backbone.View.extend({initialize:function(e,r){this.app=e,this.chart=this.app.chart,this.viewport_view=new i(e);var s=this;this.portlet=new n.View({icon:"fa-bar-chart-o",title:"Viewport",operations:{edit_button:new t.ButtonIcon({icon:"fa-edit",tooltip:"Customize this chart",title:"Editor",onclick:function(){s._wait(s.chart,function(){s.app.go("editor")})}})}}),this.portlet.append(this.viewport_view.$el),this.setElement(this.portlet.$el);var s=this;this.chart.on("change:title",function(){s._refreshTitle()})},show:function(){this.$el.show(),$(window).trigger("resize")},hide:function(){this.$el.hide()},_refreshTitle:function(){var e=this.chart.get("title");this.portlet.title(e)},_screenshot:function(){var e=new XMLSerializer,t=e.serializeToString(this.viewport_view.svg.node()),n="data:image/svg+xml;base64,"+btoa(t);window.location.href="data:application/x-download/;charset=utf-8,"+encodeURIComponent(t)},_wait:function(e,t){if(e.deferred.ready())t();else{var n=this;this.app.modal.show({title:"Please wait!",body:"Your chart is currently being processed. Please wait and try again.",buttons:{Close:function(){n.app.modal.hide()},Retry:function(){n.app.modal.hide(),setTimeout(function(){n._wait(e,t)},n.app.config.get("query_timeout"))}}})}}})}),define("mvc/ui/ui-tabs",["utils/utils"],function(e){var t=Backbone.View.extend({visible:!1,list:{},$nav:null,$content:null,first_tab:null,optionsDefault:{title_new:"",operations:null,onnew:null},initialize:function(t){this.options=e.merge(t,this.optionsDefault);var n=$(this._template(this.options));this.$nav=n.find(".tab-navigation"),this.$content=n.find(".tab-content"),this.setElement(n),this.list={};var r=this;this.options.operations&&$.each(this.options.operations,function(e,t){t.$el.prop("id",e),r.$nav.find(".operations").append(t.$el)});if(this.options.onnew){var i=$(this._template_tab_new(this.options));this.$nav.append(i),i.tooltip({title:"Add a new tab",placement:"bottom",container:r.$el}),i.on("click",function(e){i.tooltip("hide"),r.options.onnew()})}},add:function(e){var t=e.id,n={$title:$(this._template_tab(e)),$content:$(this._template_tab_content(e)),removable:e.ondel?!0:!1};this.list[t]=n,this.options.onnew?this.$nav.find("#new-tab").before(n.$title):this.$nav.append(n.$title),n.$content.append(e.$el),this.$content.append(n.$content),_.size(this.list)==1&&(n.$title.addClass("active"),n.$content.addClass("active"),this.first_tab=t);if(e.ondel){var r=this,i=n.$title.find("#delete");i.tooltip({title:"Delete this tab",placement:"bottom",container:r.$el}),i.on("click",function(){return i.tooltip("destroy"),r.$el.find(".tooltip").remove(),e.ondel(),!1})}e.onclick&&n.$title.on("click",function(){e.onclick()})},del:function(e){var t=this.list[e];t.$title.remove(),t.$content.remove(),delete t,this.first_tab==e&&(this.first_tab=null),this.first_tab!=null&&this.show(this.first_tab)},delRemovable:function(){for(var e in this.list){var t=this.list[e];t.removable&&this.del(e)}},show:function(e){this.$el.fadeIn("fast"),this.visible=!0,e&&this.list[e].$title.find("a").tab("show")},hide:function(){this.$el.fadeOut("fast"),this.visible=!1},hideOperation:function(e){this.$nav.find("#"+e).hide()},showOperation:function(e){this.$nav.find("#"+e).show()},setOperation:function(e,t){var n=this.$nav.find("#"+e);n.off("click"),n.on("click",t)},title:function(e,t){var n=this.list[e].$title.find("#text");return t&&n.html(t),n.html()},_template:function(e){return'<div class="tabbable tabs-left"><ul class="tab-navigation nav nav-tabs"><div class="operations" style="float: right; margin-bottom: 4px;"></div></ul><div class="tab-content"/></div>'},_template_tab_new:function(e){return'<li id="new-tab"><a href="javascript:void(0);"><i style="font-size: 0.8em; margin-right: 5px;" class="fa fa-plus-circle"/>'+e.title_new+"</a>"+"</li>"},_template_tab:function(e){var t='<li id="title-'+e.id+'">'+'<a title="" href="#tab-'+e.id+'" data-toggle="tab" data-original-title="">'+'<span id="text">'+e.title+"</span>";return e.ondel&&(t+='<i id="delete" style="font-size: 0.8em; margin-left: 5px; cursor: pointer;" class="fa fa-minus-circle"/>'),t+="</a></li>",t},_template_tab_content:function(e){return'<div id="tab-'+e.id+'" class="tab-pane"/>'}});return{View:t}}),define("plugin/library/ui-table",["utils/utils"],function(e){var t=Backbone.View.extend({row:null,row_count:0,optionsDefault:{content:"No content available.",onchange:null,ondblclick:null,onconfirm:null},events:{click:"_onclick",dblclick:"_ondblclick"},first:!0,initialize:function(t){this.options=e.merge(t,this.optionsDefault);var n=$(this._template(t));this.$thead=n.find("thead"),this.$tbody=n.find("tbody"),this.$tmessage=n.find("tmessage"),this.setElement(n),this.row=$("<tr></tr>")},addHeader:function(e){var t=$("<th></th>");t.append(e),this.row.append(t)},appendHeader:function(){this.$thead.append(this.row),this.row=$("<tr></tr>")},add:function(e,t,n){var r=$("<td></td>");t&&r.css("width",t),n&&r.css("text-align",n),r.append(e),this.row.append(r)},append:function(e){this._commit(e)},prepend:function(e){this._commit(e,!0)},remove:function(e){var t=this.$tbody.find("#"+e);t.length>0&&(t.remove(),this.row_count--,this._refresh())},removeAll:function(){this.$tbody.html(""),this.row_count=0,this._refresh()},value:function(e){this.before=this.$tbody.find(".current").attr("id"),e!==undefined&&(this.$tbody.find("tr").removeClass("current"),e&&this.$tbody.find("#"+e).addClass("current"));var t=this.$tbody.find(".current").attr("id");return t===undefined?null:(t!=this.before&&this.options.onchange&&this.options.onchange(e),t)},size:function(){return this.$tbody.find("tr").length},_commit:function(e,t){this.remove(e),this.row.attr("id",e),t?this.$tbody.prepend(this.row):this.$tbody.append(this.row),this.row=$("<tr></tr>"),this.row_count++,this._refresh()},_onclick:function(e){var t=this.value(),n=$(e.target).closest("tr").attr("id");n&&t!=n&&(this.options.onconfirm?this.options.onconfirm(n):this.value(n))},_ondblclick:function(e){var t=this.value();t&&this.options.ondblclick&&this.options.ondblclick(t)},_refresh:function(){this.row_count==0?this.$tmessage.show():this.$tmessage.hide()},_template:function(e){return'<div><table class="grid"><thead></thead><tbody style="cursor: pointer;"></tbody></table><tmessage>'+e.content+"</tmessage>"+"<div>"}});return{View:t}}),define("plugin/views/group",["plugin/library/ui-table","plugin/library/ui","utils/utils"],function(e,t,n){return Backbone.View.extend({initialize:function(r,i){this.app=r;var s=this;this.chart=this.app.chart,this.group=i.group,this.group_key=new t.Input({placeholder:"Data label",onchange:function(){s.group.set("key",s.group_key.value())}}),this.table=new e.View({content:"No data column."});var o=$("<div/>");o.append(n.wrap((new t.Label({title:"Provide a label:"})).$el)),o.append(n.wrap(this.group_key.$el)),o.append(n.wrap((new t.Label({title:"Select columns:"})).$el)),o.append(n.wrap(this.table.$el)),this.setElement(o);var s=this;this.chart.on("change:dataset_id",function(){s._refreshTable()}),this.chart.on("change:type",function(){s._refreshTable()}),this.group.on("change:key",function(){s._refreshGroupKey()}),this.group.on("change",function(){s._refreshGroup()}),this._refreshTable(),this._refreshGroupKey(),this._refreshGroup()},_refreshTable:function(){var e=this.chart.get("dataset_id"),n=this.chart.get("type");if(!e||!n)return;var r=this,i=this.app.types.get(n);this.table.removeAll();var s={};for(var o in i.columns){var u=this.group.get(o);u||this.group.set(o,0);var a=i.columns[o],f=new t.Select.View({id:"select_"+o,gid:o,onchange:function(e){r.group.set(this.gid,e),r.chart.set("modified",!0)},value:u,wait:!0});this.table.add(a.title,"25%"),this.table.add(f.$el),this.table.append(o),s[o]=f}this.chart.state("wait","Loading metadata...");var l=this.chart.deferred.register();this.app.datasets.request({id:e},function(e){for(var t in s){var n=i.columns[t].is_label,o=[],u=e.metadata_column_types;for(var a in u)(!n&&(u[a]=="int"||u[a]=="float")||n)&&o.push({label:"Column: "+(parseInt(a)+1)+" ["+u[a]+"]",value:a});s[t].update(o),s[t].show()}r.chart.state("wait","Metadata initialized..."),r.chart.deferred.done(l)})},_refreshGroup:function(){this.group.set("date",n.time())},_refreshGroupKey:function(){var e=this.group.get("key");e===undefined&&(e=""),this.group_key.value(e)}})}),define("plugin/library/ui-table-form",["plugin/library/ui-table","plugin/library/ui","utils/utils"],function(e,t,n){var r=Backbone.View.extend({list:[],initialize:function(r){this.table_title=new t.Label({title:r.title}),this.table=new e.View({content:r.content});var i=$("<div/>");i.append(n.wrap(this.table_title.$el)),i.append(n.wrap(this.table.$el)),this.setElement(i)},title:function(e){this.table_title.title(e)},update:function(e,t){this.table.removeAll(),this.list=[];for(var n in e)this._add(n,e[n],t);for(var n in this.list){var r=this.list[n].options.onchange;r&&r()}},_add:function(e,n,r){var i=this,s=null,o=n.type;switch(o){case"text":s=new t.Input({id:e,placeholder:n.placeholder,onchange:function(){r.set(e,s.value())}});break;case"select":s=new t.Select.View({id:e,data:n.data,onchange:function(){var t=s.value();r.set(e,t);var o=_.findWhere(n.data,{value:t});o&&(o.show&&i.$el.find("#"+o.show).fadeIn("fast"),o.hide&&i.$el.find("#"+o.hide).fadeOut("fast"))}});break;case"separator":s=$("<div/>");break;default:console.log("ui-table-form:_add","Unknown setting type ("+n.type+")");return}if(o!="separator"){r.get(e)||r.set(e,n.init),s.value(r.get(e)),this.list[e]=s;var u=$("<div/>");u.append(s.$el),u.append('<div class="toolParamHelp" style="font-size: 0.9em;">'+n.info+"</div>"),this.table.add('<span style="white-space: nowrap;">'+n.title+"</span>","25%"),this.table.add(u)}else this.table.add('<h6 style="white-space: nowrap;">'+n.title+":<h6/>"),this.table.add($("<div/>"));this.table.append(e)}});return{View:r}}),define("plugin/views/settings",["plugin/library/ui","plugin/library/ui-table-form","utils/utils"],function(e,t,n){return Backbone.View.extend({initialize:function(e,n){this.app=e;var r=this;this.chart=this.app.chart,this.form=new t.View({title:"Chart options:",content:"This chart type does not provide any options."}),this.setElement(this.form.$el);var r=this;this.chart.on("change",function(){r._refreshTable()})},_refreshTable:function(){var e=this.chart.get("type");if(!e)return;var t=this.app.types.get(e);this.form.title(t.title+":"),this.form.update(t.settings,this.chart.settings)}})}),define("plugin/views/editor",["mvc/ui/ui-tabs","plugin/library/ui-table","plugin/library/ui","mvc/ui/ui-portlet","utils/utils","plugin/models/chart","plugin/models/group","plugin/views/group","plugin/views/settings"],function(e,t,n,r,i,s,o,u,a){return Backbone.View.extend({optionsDefault:{header:!0,content:"No content available."},initialize:function(s,o){var u=this;this.app=s,this.chart=this.app.chart,this.options=i.merge(o,this.optionsDefault),this.portlet=new r.View({icon:"fa-bar-chart-o",title:"Editor",operations:{save:new n.ButtonIcon({icon:"fa-save",tooltip:"Draw Chart",title:"Draw",onclick:function(){u.app.go("viewer"),u._saveChart()}}),back:new n.ButtonIcon({icon:"fa-caret-left",tooltip:"Return to Viewer",title:"Return",onclick:function(){u.app.go("viewer"),u.app.storage.load()}})}}),this.table=new t.View({header:!1,onchange:function(e){u.chart.settings.clear(),u.chart.set({type:e}),u.chart.set("modified",!0)},ondblclick:function(e){u.tabs.show("settings")},content:"No chart types available"}),this.table.addHeader("No."),this.table.addHeader("Type"),this.table.addHeader("Library"),this.table.addHeader("Processing*"),this.table.appendHeader();var f=0,l=s.types.attributes;for(var c in l){var h=l[c];this.table.add(++f+"."),this.table.add(h.title),this.table.add(h.library,"10%"),h.execute?this.table.add((new n.Icon({icon:"fa-check"})).$el,"10%","center"):this.table.add(""),this.table.append(c)}this.tabs=new e.View({title_new:"Add Data",onnew:function(){var e=u._addGroupModel();u.tabs.show(e.id)}}),this.title=new n.Input({placeholder:"Chart title",onchange:function(){u.chart.set("title",u.title.value())}});var p=$("<div/>");p.append(i.wrap((new n.Label({title:"Provide a chart title:"})).$el)),p.append(i.wrap(this.title.$el)),p.append(i.wrap((new n.Label({title:"Select a chart type:"})).$el)),p.append(i.wrap(this.table.$el)),p.append((new n.Text({title:"*Certain chart types pre-process data before rendering the visualization. The pre-processing is done using the chartskit available in the Toolshed.",cls:"toolParamHelp"})).$el),this.tabs.add({id:"main",title:"Start",$el:p}),this.settings=new a(this.app),this.tabs.add({id:"settings",title:"Configuration",$el:this.settings.$el}),this.portlet.append(this.tabs.$el),this.setElement(this.portlet.$el),this.tabs.hideOperation("back");var u=this;this.chart.on("change:title",function(e){u._refreshTitle()}),this.chart.on("change:type",function(e){u.table.value(e.get("type"))}),this.chart.on("reset",function(e){u._resetChart()}),this.app.chart.on("redraw",function(e){u.portlet.showOperation("back")}),this.app.chart.groups.on("add",function(e){u._addGroup(e)}),this.app.chart.groups.on("remove",function(e){u._removeGroup(e)}),this.app.chart.groups.on("reset",function(e){u._removeAllGroups()}),this.app.chart.groups.on("change:key",function(e){u._refreshGroupKey()}),this._resetChart()},show:function(){this.$el.show()},hide:function(){this.$el.hide()},_refreshTitle:function(){var e=this.chart.get("title");this.portlet.title(e),this.title.value(e)},_refreshGroupKey:function(){var e=this,t=0;this.chart.groups.each(function(n){var r=n.get("key","");r==""&&(r="Chart data"),e.tabs.title(n.id,++t+": "+r)})},_addGroupModel:function(){var e=new o({id:i.uuid()});return this.chart.groups.add(e),e},_addGroup:function(e){var t=this,n=new u(this.app,{group:e}),r=t.chart.groups.length;this.tabs.add({id:e.id,$el:n.$el,ondel:function(){t.chart.groups.remove(e.id)}}),this._refreshGroupKey()},_removeGroup:function(e){this.tabs.del(e.id),this._refreshGroupKey(),this.chart.set("modified",!0)},_removeAllGroups:function(e){this.tabs.delRemovable()},_resetChart:function(){this.chart.set("id",i.uuid()),this.chart.set("type","nvd3_bardiagram"),this.chart.set("dataset_id",this.app.options.config.dataset_id),this.chart.set("title","New Chart"),this.portlet.hideOperation("back")},_saveChart:function(){this.chart.set({type:this.table.value(),title:this.title.value(),date:i.time()}),this.chart.groups.length==0&&this._addGroupModel();var e=this;this.chart.deferred.execute(function(){e.app.storage.save(),e.chart.trigger("redraw")})}})}),define("plugin/models/config",[],function(){return Backbone.Model.extend({defaults:{query_limit:1e3,query_timeout:500}})}),define("plugin/charts/nvd3/config",[],function(){return{title:"",library:"nvd3.js",element:"svg",columns:{y:{title:"Values for y-axis"}},settings:{separator_label:{title:"X axis",type:"separator"},x_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"X-axis",placeholder:"Axis label"},x_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:"x_axis_tick"},{label:"Auto",value:"auto",hide:"x_axis_tick"},{label:"Float",value:"f",show:"x_axis_tick"},{label:"Exponent",value:"e",show:"x_axis_tick"},{label:"Integer",value:"d",hide:"x_axis_tick"},{label:"Percentage",value:"p",show:"x_axis_tick"},{label:"Rounded",value:"r",show:"x_axis_tick"},{label:"SI-prefix",value:"s",show:"x_axis_tick"}]},x_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},separator_tick:{title:"Y axis",type:"separator"},y_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"Y-axis",placeholder:"Axis label"},y_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:"y_axis_tick"},{label:"Auto",value:"auto",hide:"y_axis_tick"},{label:"Float",value:"f",show:"y_axis_tick"},{label:"Exponent",value:"e",show:"y_axis_tick"},{label:"Integer",value:"d",hide:"y_axis_tick"},{label:"Percentage",value:"p",show:"y_axis_tick"},{label:"Rounded",value:"r",show:"y_axis_tick"},{label:"SI-prefix",value:"s",show:"y_axis_tick"}]},y_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},separator_legend:{title:"Others",type:"separator"},show_legend:{title:"Show legend",info:"Would you like to add a legend?",type:"select",init:"true",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]}}}}),define("plugin/charts/nvd3_bardiagram/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Bar diagram"})}),define("plugin/charts/nvd3_histogram/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Histogram",execute:"histogram",columns:{y:{title:"Observations"}},settings:{x_axis_label:{init:"Breaks"},y_axis_label:{init:"Density"}}})}),define("plugin/charts/nvd3_horizontal/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Bar diagram (horizontal)",settings:{x_axis_type:{init:"hide"}}})}),define("plugin/charts/nvd3_line/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Line chart"})}),define("plugin/charts/nvd3_linewithfocus/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Line with focus"})}),define("plugin/charts/nvd3_piechart/config",[],function(){return{title:"Pie chart",library:"nvd3.js",element:"svg",columns:{label:{title:"Labels",is_label:!0},y:{title:"Values"}}}}),define("plugin/charts/nvd3_scatterplot/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Scatter plot",columns:{x:{title:"Values for x-axis"}}})}),define("plugin/charts/nvd3_stackedarea/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Stacked area"})}),define("plugin/charts/highcharts_boxplot/config",[],function(){return{title:"Box plot",library:"highcharts.js",element:"div",execute:"boxplot",columns:{y:{title:"Observations"}},settings:{separator_label:{title:"X axis",type:"separator"},x_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"X-axis",placeholder:"Axis label"},separator_tick:{title:"Y axis",type:"separator"},y_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"Y-axis",placeholder:"Axis label"}}}}),define("plugin/charts/types",["plugin/charts/nvd3_bardiagram/config","plugin/charts/nvd3_histogram/config","plugin/charts/nvd3_horizontal/config","plugin/charts/nvd3_line/config","plugin/charts/nvd3_linewithfocus/config","plugin/charts/nvd3_piechart/config","plugin/charts/nvd3_scatterplot/config","plugin/charts/nvd3_stackedarea/config","plugin/charts/highcharts_boxplot/config"],function(e,t,n,r,i,s,o,u,a){return Backbone.Model.extend({defaults:{nvd3_bardiagram:e,nvd3_horizontal:n,nvd3_histogram:t,nvd3_line:r,nvd3_linewithfocus:i,nvd3_piechart:s,nvd3_scatterplot:o,nvd3_stackedarea:u,highcharts_boxplot:a}})}),define("plugin/app",["mvc/ui/ui-modal","mvc/ui/ui-portlet","plugin/library/ui","utils/utils","plugin/library/jobs","plugin/library/datasets","plugin/library/storage","plugin/views/viewer","plugin/views/editor","plugin/models/config","plugin/models/chart","plugin/charts/types"],function(e,t,n,r,i,s,o,u,a,f,l,c){return Backbone.View.extend({initialize:function(t){this.options=t,Galaxy&&Galaxy.modal?this.modal=Galaxy.modal:this.modal=new e.View,this.config=new f,this.types=new c,this.chart=new l,this.jobs=new i(this),this.datasets=new s(this),this.storage=new o(this),this.viewer_view=new u(this),this.editor_view=new a(this),this.$el.append(this.viewer_view.$el),this.$el.append(this.editor_view.$el);if(!this.storage.load())this.go("editor");else{this.go("viewer");var n=this;this.chart.deferred.execute(function(){n.chart.trigger("redraw")})}},go:function(e){$(".tooltip").hide();switch(e){case"editor":this.editor_view.show(),this.viewer_view.hide();break;case"viewer":this.editor_view.hide(),this.viewer_view.show()}},execute:function(e){},onunload:function(){},log:function(e,t){console.log(e+" "+t)}})});
\ No newline at end of file
+(function(){var e=this,t=e._,n={},r=Array.prototype,i=Object.prototype,s=Function.prototype,o=r.push,u=r.slice,a=r.concat,f=i.toString,l=i.hasOwnProperty,c=r.forEach,h=r.map,p=r.reduce,d=r.reduceRight,v=r.filter,m=r.every,g=r.some,y=r.indexOf,b=r.lastIndexOf,w=Array.isArray,E=Object.keys,S=s.bind,x=function(e){if(e instanceof x)return e;if(!(this instanceof x))return new x(e);this._wrapped=e};typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(exports=module.exports=x),exports._=x):e._=x,x.VERSION="1.4.4";var T=x.each=x.forEach=function(e,t,r){if(e==null)return;if(c&&e.forEach===c)e.forEach(t,r);else if(e.length===+e.length){for(var i=0,s=e.length;i<s;i++)if(t.call(r,e[i],i,e)===n)return}else for(var o in e)if(x.has(e,o)&&t.call(r,e[o],o,e)===n)return};x.map=x.collect=function(e,t,n){var r=[];return e==null?r:h&&e.map===h?e.map(t,n):(T(e,function(e,i,s){r.push(t.call(n,e,i,s))}),r)};var N="Reduce of empty array with no initial value";x.reduce=x.foldl=x.inject=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(p&&e.reduce===p)return r&&(t=x.bind(t,r)),i?e.reduce(t,n):e.reduce(t);T(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(N);return n},x.reduceRight=x.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(d&&e.reduceRight===d)return r&&(t=x.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=x.keys(e);s=o.length}T(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(N);return n},x.find=x.detect=function(e,t,n){var r;return C(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},x.filter=x.select=function(e,t,n){var r=[];return e==null?r:v&&e.filter===v?e.filter(t,n):(T(e,function(e,i,s){t.call(n,e,i,s)&&r.push(e)}),r)},x.reject=function(e,t,n){return x.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},x.every=x.all=function(e,t,r){t||(t=x.identity);var i=!0;return e==null?i:m&&e.every===m?e.every(t,r):(T(e,function(e,s,o){if(!(i=i&&t.call(r,e,s,o)))return n}),!!i)};var C=x.some=x.any=function(e,t,r){t||(t=x.identity);var i=!1;return e==null?i:g&&e.some===g?e.some(t,r):(T(e,function(e,s,o){if(i||(i=t.call(r,e,s,o)))return n}),!!i)};x.contains=x.include=function(e,t){return e==null?!1:y&&e.indexOf===y?e.indexOf(t)!=-1:C(e,function(e){return e===t})},x.invoke=function(e,t){var n=u.call(arguments,2),r=x.isFunction(t);return x.map(e,function(e){return(r?t:e[t]).apply(e,n)})},x.pluck=function(e,t){return x.map(e,function(e){return e[t]})},x.where=function(e,t,n){return x.isEmpty(t)?n?void 0:[]:x[n?"find":"filter"](e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},x.findWhere=function(e,t){return x.where(e,t,!0)},x.max=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&x.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},x.min=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&x.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o<r.computed&&(r={value:e,computed:o})}),r.value},x.shuffle=function(e){var t,n=0,r=[];return T(e,function(e){t=x.random(n++),r[n-1]=r[t],r[t]=e}),r};var k=function(e){return x.isFunction(e)?e:function(t){return t[e]}};x.sortBy=function(e,t,n){var r=k(t);return x.pluck(x.map(e,function(e,t,i){return{value:e,index:t,criteria:r.call(n,e,t,i)}}).sort(function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||n===void 0)return 1;if(n<r||r===void 0)return-1}return e.index<t.index?-1:1}),"value")};var L=function(e,t,n,r){var i={},s=k(t==null?x.identity:t);return T(e,function(t,o){var u=s.call(n,t,o,e);r(i,u,t)}),i};x.groupBy=function(e,t,n){return L(e,t,n,function(e,t,n){(x.has(e,t)?e[t]:e[t]=[]).push(n)})},x.countBy=function(e,t,n){return L(e,t,n,function(e,t){x.has(e,t)||(e[t]=0),e[t]++})},x.sortedIndex=function(e,t,n,r){n=n==null?x.identity:k(n);var i=n.call(r,t),s=0,o=e.length;while(s<o){var u=s+o>>>1;n.call(r,e[u])<i?s=u+1:o=u}return s},x.toArray=function(e){return e?x.isArray(e)?u.call(e):e.length===+e.length?x.map(e,x.identity):x.values(e):[]},x.size=function(e){return e==null?0:e.length===+e.length?e.length:x.keys(e).length},x.first=x.head=x.take=function(e,t,n){return e==null?void 0:t!=null&&!n?u.call(e,0,t):e[0]},x.initial=function(e,t,n){return u.call(e,0,e.length-(t==null||n?1:t))},x.last=function(e,t,n){return e==null?void 0:t!=null&&!n?u.call(e,Math.max(e.length-t,0)):e[e.length-1]},x.rest=x.tail=x.drop=function(e,t,n){return u.call(e,t==null||n?1:t)},x.compact=function(e){return x.filter(e,x.identity)};var A=function(e,t,n){return T(e,function(e){x.isArray(e)?t?o.apply(n,e):A(e,t,n):n.push(e)}),n};x.flatten=function(e,t){return A(e,t,[])},x.without=function(e){return x.difference(e,u.call(arguments,1))},x.uniq=x.unique=function(e,t,n,r){x.isFunction(t)&&(r=n,n=t,t=!1);var i=n?x.map(e,n,r):e,s=[],o=[];return T(i,function(n,r){if(t?!r||o[o.length-1]!==n:!x.contains(o,n))o.push(n),s.push(e[r])}),s},x.union=function(){return x.uniq(a.apply(r,arguments))},x.intersection=function(e){var t=u.call(arguments,1);return x.filter(x.uniq(e),function(e){return x.every(t,function(t){return x.indexOf(t,e)>=0})})},x.difference=function(e){var t=a.apply(r,u.call(arguments,1));return x.filter(e,function(e){return!x.contains(t,e)})},x.zip=function(){var e=u.call(arguments),t=x.max(x.pluck(e,"length")),n=new Array(t);for(var r=0;r<t;r++)n[r]=x.pluck(e,""+r);return n},x.unzip=function(e){var t=[];return x.each(e,function(e,n){x.each(e,function(e,r){t.length<=r&&(t[r]=[]),t[r][n]=e})}),t},x.object=function(e,t){if(e==null)return{};var n={};for(var r=0,i=e.length;r<i;r++)t?n[e[r]]=t[r]:n[e[r][0]]=e[r][1];return n},x.indexOf=function(e,t,n){if(e==null)return-1;var r=0,i=e.length;if(n){if(typeof n!="number")return r=x.sortedIndex(e,t),e[r]===t?r:-1;r=n<0?Math.max(0,i+n):n}if(y&&e.indexOf===y)return e.indexOf(t,n);for(;r<i;r++)if(e[r]===t)return r;return-1},x.lastIndexOf=function(e,t,n){if(e==null)return-1;var r=n!=null;if(b&&e.lastIndexOf===b)return r?e.lastIndexOf(t,n):e.lastIndexOf(t);var i=r?n:e.length;while(i--)if(e[i]===t)return i;return-1},x.range=function(e,t,n){arguments.length<=1&&(t=e||0,e=0),n=arguments[2]||1;var r=Math.max(Math.ceil((t-e)/n),0),i=0,s=new Array(r);while(i<r)s[i++]=e,e+=n;return s};var O=function(){};x.bind=function(e,t){var n,r;if(e.bind===S&&S)return S.apply(e,u.call(arguments,1));if(!x.isFunction(e))throw new TypeError;return n=u.call(arguments,2),r=function(){if(this instanceof r){O.prototype=e.prototype;var i=new O;O.prototype=null;var s=e.apply(i,n.concat(u.call(arguments)));return Object(s)===s?s:i}return e.apply(t,n.concat(u.call(arguments)))}},x.partial=function(e){var t=u.call(arguments,1);return function(){return e.apply(this,t.concat(u.call(arguments)))}},x.bindAll=function(e){var t=u.call(arguments,1);if(t.length===0)throw new Error("bindAll must be passed function names");return T(t,function(t){e[t]=x.bind(e[t],e)}),e},x.memoize=function(e,t){var n={};return t||(t=x.identity),function(){var r=t.apply(this,arguments);return x.has(n,r)?n[r]:n[r]=e.apply(this,arguments)}},x.delay=function(e,t){var n=u.call(arguments,2);return setTimeout(function(){return e.apply(null,n)},t)},x.defer=function(e){return x.delay.apply(x,[e,1].concat(u.call(arguments,1)))},x.throttle=function(e,t,n){var r,i,s,o,u=0,a=function(){u=new Date,s=null,o=e.apply(r,i)};return function(){var f=new Date;!u&&n===!1&&(u=f);var l=t-(f-u);return r=this,i=arguments,l<=0?(clearTimeout(s),s=null,u=f,o=e.apply(r,i)):s||(s=setTimeout(a,l)),o}},x.debounce=function(e,t,n){var r,i;return function(){var s=this,o=arguments,u=function(){r=null,n||(i=e.apply(s,o))},a=n&&!r;return clearTimeout(r),r=setTimeout(u,t),a&&(i=e.apply(s,o)),i}},x.once=function(e){var t=!1,n;return function(){return t?n:(t=!0,n=e.apply(this,arguments),e=null,n)}},x.wrap=function(e,t){return function(){var n=[e];return o.apply(n,arguments),t.apply(this,n)}},x.compose=function(){var e=arguments;return function(){var t=arguments;for(var n=e.length-1;n>=0;n--)t=[e[n].apply(this,t)];return t[0]}},x.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},x.keys=E||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)x.has(e,n)&&t.push(n);return t},x.values=function(e){var t=[];for(var n in e)x.has(e,n)&&t.push(e[n]);return t},x.pairs=function(e){var t=[];for(var n in e)x.has(e,n)&&t.push([n,e[n]]);return t},x.invert=function(e){var t={};for(var n in e)x.has(e,n)&&(t[e[n]]=n);return t},x.functions=x.methods=function(e){var t=[];for(var n in e)x.isFunction(e[n])&&t.push(n);return t.sort()},x.extend=function(e){return T(u.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},x.pick=function(e){var t={},n=a.apply(r,u.call(arguments,1));return T(n,function(n){n in e&&(t[n]=e[n])}),t},x.omit=function(e){var t={},n=a.apply(r,u.call(arguments,1));for(var i in e)x.contains(n,i)||(t[i]=e[i]);return t},x.defaults=function(e){return T(u.call(arguments,1),function(t){if(t)for(var n in t)e[n]===void 0&&(e[n]=t[n])}),e},x.clone=function(e){return x.isObject(e)?x.isArray(e)?e.slice():x.extend({},e):e},x.tap=function(e,t){return t(e),e};var M=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof x&&(e=e._wrapped),t instanceof x&&(t=t._wrapped);var i=f.call(e);if(i!=f.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=M(e[o],t[o],n,r)))break}else{var a=e.constructor,l=t.constructor;if(a!==l&&!(x.isFunction(a)&&a instanceof a&&x.isFunction(l)&&l instanceof l))return!1;for(var c in e)if(x.has(e,c)){o++;if(!(u=x.has(t,c)&&M(e[c],t[c],n,r)))break}if(u){for(c in t)if(x.has(t,c)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};x.isEqual=function(e,t){return M(e,t,[],[])},x.isEmpty=function(e){if(e==null)return!0;if(x.isArray(e)||x.isString(e))return e.length===0;for(var t in e)if(x.has(e,t))return!1;return!0},x.isElement=function(e){return!!e&&e.nodeType===1},x.isArray=w||function(e){return f.call(e)=="[object Array]"},x.isObject=function(e){return e===Object(e)},T(["Arguments","Function","String","Number","Date","RegExp"],function(e){x["is"+e]=function(t){return f.call(t)=="[object "+e+"]"}}),x.isArguments(arguments)||(x.isArguments=function(e){return!!e&&!!x.has(e,"callee")}),typeof /./!="function"&&(x.isFunction=function(e){return typeof e=="function"}),x.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},x.isNaN=function(e){return x.isNumber(e)&&e!=+e},x.isBoolean=function(e){return e===!0||e===!1||f.call(e)=="[object Boolean]"},x.isNull=function(e){return e===null},x.isUndefined=function(e){return e===void 0},x.has=function(e,t){return l.call(e,t)},x.noConflict=function(){return e._=t,this},x.identity=function(e){return e},x.times=function(e,t,n){var r=Array(e);for(var i=0;i<e;i++)r[i]=t.call(n,i);return r},x.random=function(e,t){return t==null&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))};var _={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};_.unescape=x.invert(_.escape);var D={escape:new RegExp("["+x.keys(_.escape).join("")+"]","g"),unescape:new RegExp("("+x.keys(_.unescape).join("|")+")","g")};x.each(["escape","unescape"],function(e){x[e]=function(t){return t==null?"":(""+t).replace(D[e],function(t){return _[e][t]})}}),x.result=function(e,t){if(e==null)return void 0;var n=e[t];return x.isFunction(n)?n.call(e):n},x.mixin=function(e){T(x.functions(e),function(t){var n=x[t]=e[t];x.prototype[t]=function(){var e=[this._wrapped];return o.apply(e,arguments),F.call(this,n.apply(x,e))}})};var P=0;x.uniqueId=function(e){var t=++P+"";return e?e+t:t},x.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var H=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},j=/\\|'|\r|\n|\t|\u2028|\u2029/g;x.template=function(e,t,n){var r;n=x.defaults({},n,x.templateSettings);var i=new RegExp([(n.escape||H).source,(n.interpolate||H).source,(n.evaluate||H).source].join("|")+"|$","g"),s=0,o="__p+='";e.replace(i,function(t,n,r,i,u){return o+=e.slice(s,u).replace(j,function(e){return"\\"+B[e]}),n&&(o+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(o+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),i&&(o+="';\n"+i+"\n__p+='"),s=u+t.length,t}),o+="';\n",n.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{r=new Function(n.variable||"obj","_",o)}catch(u){throw u.source=o,u}if(t)return r(t,x);var a=function(e){return r.call(this,e,x)};return a.source="function("+(n.variable||"obj")+"){\n"+o+"}",a},x.chain=function(e){return x(e).chain()};var F=function(e){return this._chain?x(e).chain():e};x.mixin(x),T(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=r[e];x.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],F.call(this,n)}}),T(["concat","join","slice"],function(e){var t=r[e];x.prototype[e]=function(){return F.call(this,t.apply(this._wrapped,arguments))}}),x.extend(x.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this),define("libs/underscore",function(e){return function(){var t,n;return t||e._}}(this)),define("utils/utils",["libs/underscore"],function(e){function t(e,t,r){n("GET",e,{},t,r)}function n(e,t,n,r,i){if(e=="GET"||e=="DELETE")t.indexOf("?")==-1?t+="?":t+="&",t+=$.param(n);var s=new XMLHttpRequest;s.open(e,t,!0),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Cache-Control","no-cache"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.setRequestHeader("Content-Type","application/json"),s.onloadend=function(){var e=s.status;try{response=jQuery.parseJSON(s.responseText)}catch(t){response=s.responseText}e==200?r&&r(response):i&&i(response)},e=="GET"||e=="DELETE"?s.send():s.send(JSON.stringify(n))}function r(e,t){var n=$('<div class="'+e+'"></div>');n.appendTo(":eq(0)");var r=n.css(t);return n.remove(),r}function i(e){$('link[href^="'+e+'"]').length||$('<link href="'+galaxy_config.root+e+'" rel="stylesheet">').appendTo("head")}function s(t,n){return t?e.defaults(t,n):n}function o(e,t){var n="";if(e>=1e11)e/=1e11,n="TB";else if(e>=1e8)e/=1e8,n="GB";else if(e>=1e5)e/=1e5,n="MB";else if(e>=100)e/=100,n="KB";else{if(!(e>0))return"<strong>-</strong>";e*=10,n="b"}var r=Math.round(e)/10;return t?r+" "+n:"<strong>"+r+"</strong> "+n}function u(){return(new Date).getTime().toString(36)}function a(e){var t=$("<p></p>");return t.append(e),t}function f(){var e=new Date,t=(e.getHours()<10?"0":"")+e.getHours(),n=(e.getMinutes()<10?"0":"")+e.getMinutes(),r=e.getDate()+"/"+(e.getMonth()+1)+"/"+e.getFullYear()+", "+t+":"+n;return r}return{cssLoadFile:i,cssGetAttribute:r,get:t,merge:s,bytesToString:o,uuid:u,time:f,wrap:a,request:n}}),define("mvc/ui/ui-modal",["utils/utils"],function(e){var t=Backbone.View.extend({elMain:"body",optionsDefault:{title:"ui-modal",body:"",backdrop:!0,height:null,width:null,closing_events:!1},buttonList:{},initialize:function(e){e&&this._create(e)},show:function(e){this.initialize(e),this.options.height?(this.$body.css("height",this.options.height),this.$body.css("overflow","hidden")):this.$body.css("max-height",$(window).height()/2),this.options.width&&this.$dialog.css("width",this.options.width),this.visible?this.$el.show():this.$el.fadeIn("fast"),this.visible=!0},hide:function(){this.visible=!1,this.$el.fadeOut("fast")},enableButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).prop("disabled",!1)},disableButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).prop("disabled",!0)},showButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).show()},hideButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).hide()},getButton:function(e){var t=this.buttonList[e];return this.$buttons.find("#"+t)},scrollTop:function(){return this.$body.scrollTop()},_create:function(e){var t=this;this.options=_.defaults(e,this.optionsDefault),this.options.body=="progress"&&(this.options.body=$('<div class="progress progress-striped active"><div class="progress-bar progress-bar-info" style="width:100%"></div></div>')),this.$el&&(this.$el.remove(),$(document).off("keyup.ui-modal")),this.setElement(this._template(this.options.title)),this.$dialog=this.$el.find(".modal-dialog"),this.$body=this.$el.find(".modal-body"),this.$footer=this.$el.find(".modal-footer"),this.$buttons=this.$el.find(".buttons"),this.$backdrop=this.$el.find(".modal-backdrop"),this.$body.html(this.options.body),this.options.backdrop||this.$backdrop.removeClass("in");if(this.options.buttons){this.buttonList={};var n=0;$.each(this.options.buttons,function(e,r){var i="button-"+n++;t.$buttons.append($('<button id="'+i+'"></button>').text(e).click(r)).append(" "),t.buttonList[e]=i})}else this.$footer.hide();$(this.elMain).append($(this.el)),this.options.closing_events&&($(document).on("keyup.ui-modal",function(e){e.keyCode==27&&t.hide()}),this.$el.find(".modal-backdrop").on("click",function(){t.hide()}))},_template:function(e){return'<div class="modal"><div class="modal-backdrop fade in" style="z-index: -1;"></div><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><button type="button" class="close" style="display: none;">×</button><h4 class="title">'+e+"</h4>"+"</div>"+'<div class="modal-body" style="position: static;"></div>'+'<div class="modal-footer">'+'<div class="buttons" style="float: right;"></div>'+"</div>"+"</div"+"</div>"+"</div>"}});return{View:t}}),define("mvc/ui/ui-portlet",["utils/utils"],function(e){var t=Backbone.View.extend({visible:!1,optionsDefault:{title:"",icon:"",buttons:null,body:null,height:null,operations:null,placement:"bottom",overflow:"auto"},$title:null,$content:null,$buttons:null,$operations:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.$content=this.$el.find("#content"),this.$title=this.$el.find("#title-text"),this.options.height&&(this.$el.find("#body").css("height",this.options.height),this.$el.find("#content").css("overflow",this.options.overflow)),this.$buttons=$(this.el).find("#buttons");if(this.options.buttons){var n=this;$.each(this.options.buttons,function(e,t){t.$el.prop("id",e),n.$buttons.append(t.$el)})}else this.$buttons.remove();this.$operations=$(this.el).find("#operations");if(this.options.operations){var n=this;$.each(this.options.operations,function(e,t){t.$el.prop("id",e),n.$operations.append(t.$el)})}this.options.body&&this.append(this.options.body)},append:function(t){this.$content.append(e.wrap(t))},content:function(){return this.$content},show:function(){this.$el.fadeIn("fast"),this.visible=!0},hide:function(){this.$el.fadeOut("fast"),this.visible=!1},enableButton:function(e){this.$buttons.find("#"+e).prop("disabled",!1)},disableButton:function(e){this.$buttons.find("#"+e).prop("disabled",!0)},hideOperation:function(e){this.$operations.find("#"+e).hide()},showOperation:function(e){this.$operations.find("#"+e).show()},setOperation:function(e,t){var n=this.$operations.find("#"+e);n.off("click"),n.on("click",t)},title:function(e){var t=this.$title;return e&&t.html(e),t.html()},_template:function(e){var t='<div class="toolForm portlet-view no-highlight">';if(e.title||e.icon)t+='<div id="title" class="toolFormTitle portlet-title"><div id="operations" class="portlet-operations"/><div style="overflow: hidden;">',e.icon&&(t+='<div class="portlet-title-icon fa '+e.icon+'"> </div>'),t+='<div id="title-text" class="portlet-title-text">'+e.title+"</div>",t+="</div></div>";return t+='<div id="body" class="toolFormBody portlet-body">',e.placement=="top"&&(t+='<div id="buttons" class="portlet-buttons"/>'),t+='<div id="content" class="portlet-content"/>',e.placement=="bottom"&&(t+='<div id="buttons" class="portlet-buttons"/>'),t+="</div></div>",t}});return{View:t}}),define("plugin/library/ui-select",["utils/utils"],function(e){var t=Backbone.View.extend({optionsDefault:{id:"",cls:"",empty:"No data available",visible:!0,wait:!1},selected:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.$select=this.$el.find("#select"),this.$icon=this.$el.find("#icon"),this.selected=this.options.value;var n=this;this.options.onchange&&this.$select.on("change",function(){n.value(n.$select.val())}),this._refresh(),this.options.visible||this.hide(),this.options.wait?this.wait():this.show()},value:function(e){var t=this.selected;e!==undefined&&(this.selected=e,this.$select.val(e));var n=this.selected;return n&&n!=t&&this.options.onchange&&this.options.onchange(n),n},text:function(){return this.$select.find("option:selected").text()},show:function(){this.$icon.removeClass(),this.$icon.addClass("fa fa-caret-down"),this.$select.show(),this.$el.show()},hide:function(){this.$el.hide()},wait:function(){this.$icon.removeClass(),this.$icon.addClass("fa fa-spinner fa-spin"),this.$select.hide()},disabled:function(){return this.$select.is(":disabled")},enable:function(){this.$select.prop("disabled",!1)},disable:function(){this.$select.prop("disabled",!0)},add:function(e){this.$select.append(this._templateOption(e)),this._refresh()},del:function(e){this.$select.find("option[value="+e+"]").remove(),this.$select.trigger("change"),this._refresh()},update:function(e){this.$select.find("option").remove();for(var t in e)this.$select.append(this._templateOption(e[t]));!this.selected&&e.length>0&&this.value(e[0].value),this._refresh()},_refresh:function(){this.$select.find("option[value=null]").remove();var e=this.$select.find("option").length;e==0?(this.$select.append(this._templateOption({value:"null",label:this.options.empty})),this.disable()):(this.enable(),this.selected&&this.$select.val(this.selected))},_exists:function(e){return 0!=this.$select.find("option[value="+e+"]").length},_templateOption:function(e){return'<option value="'+e.value+'">'+e.label+"</option>"},_template:function(e){var t='<div id="'+e.id+'" class="styled-select">'+'<div class="button">'+'<i id="icon"/>'+"</div>"+'<select id="select" class="select '+e.cls+" "+e.id+'">';for(key in e.data){var n=e.data[key],r="";if(n.value==e.value||n.value=="")r="selected";t+='<option value="'+n.value+'" '+r+">"+n.label+"</option>"}return t+="</select></div>",t}});return{View:t}}),define("plugin/library/ui",["utils/utils","plugin/library/ui-select"],function(e,t){var n=Backbone.View.extend({optionsDefault:{title:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options))},title:function(e){this.$el.find("b").html(e)},_template:function(e){return"<label><b>"+e.title+"</b></label>"},value:function(){return options.title}}),r=Backbone.View.extend({optionsDefault:{title:"",cls:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options))},title:function(e){this.$el.html(e)},_template:function(e){return'<div class="'+e.cls+'">'+e.title+"</div>"},value:function(){return options.title}}),i=Backbone.View.extend({optionsDefault:{id:null,title:"","float":"right",cls:"btn-default",icon:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){var t='<button id="'+e.id+'" type="submit" style="margin-right: 5px; float: '+e.float+';" type="button" class="btn '+e.cls+'">';return e.icon&&(t+='<i class="icon fa '+e.icon+'"></i> '),t+=e.title+"</button>",t}}),s=Backbone.View.extend({optionsDefault:{"float":"right",icon:"",tooltip:"",placement:"bottom",title:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){return'<div><span class="fa '+e.icon+'" style="font-size: 1.2em;"/> '+e.title+"</div>"}}),o=Backbone.View.extend({optionsDefault:{title:"",id:null,"float":"right",cls:"icon-btn",icon:"",tooltip:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){var t="";e.title&&(t="width: auto;");var n='<div id="'+e.id+'" style="margin-right: 5px; float: '+e.float+"; "+t+'" class="'+e.cls+'">';return e.title?n+='<div style="margin-right: 5px; margin-left: 5px;"><i class="icon fa '+e.icon+'"/> '+'<span style="position: relative; font-size: 0.8em; font-weight: normal; top: -1px;">'+e.title+"</span>"+"</div>":n+='<i class="icon fa '+e.icon+'"/>',n+="</div>",n}}),u=Backbone.View.extend({optionsDefault:{title:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick)},_template:function(e){return'<div><a href="javascript:void(0)">'+e.title+"</a></div>"}}),a=Backbone.View.extend({optionsDefault:{message:"",status:"info",persistent:!1},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement("<div></div>")},update:function(t){this.options=e.merge(t,this.optionsDefault);if(t.message!=""){this.$el.html(this._template(this.options)),this.$el.fadeIn();if(!t.persistent){var n=this;window.setTimeout(function(){n.$el.is(":visible")?n.$el.fadeOut():n.$el.hide()},3e3)}}else this.$el.fadeOut()},_template:function(e){return'<div class="alert alert-'+e.status+'" style="padding: 2px 2px 2px 10px;">'+e.message+"</div>"}}),f=Backbone.View.extend({optionsDefault:{onclick:null,searchword:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options));var n=this;this.options.onclick&&this.$el.on("submit",function(e){var t=n.$el.find("#search");n.options.onclick(t.val())})},_template:function(e){return'<div class="search"><form onsubmit="return false;"><input id="search" class="form-control input-sm" type="text" name="search" placeholder="Search..." value="'+e.searchword+'">'+'<button type="submit" class="btn search-btn">'+'<i class="fa fa-search"></i>'+"</button>"+"</form>"+"</div>"}}),l=Backbone.View.extend({optionsDefault:{title:"Unlabeled",body:null},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.body&&this.$el.find(".body").append(this.options.body)},_template:function(e){return'<div id="title" class="title">'+e.title+":"+"</div>"}}),c=Backbone.View.extend({optionsDefault:{id:"",title:"",target:"",href:"",onunload:null,onclick:null,visible:!0,icon:null,tag:""},$menu:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement($(this._template(this.options)));var n=$(this.el).find(".root"),r=this;n.on("click",function(e){e.preventDefault(),r.options.onclick&&r.options.onclick()}),this.options.visible||this.hide()},show:function(){$(this.el).show()},hide:function(){$(this.el).hide()},addMenu:function(t){var n={title:"",target:"",href:"",onclick:null,divider:!1,icon:null};n=e.merge(t,n),this.$menu||($(this.el).append(this._templateMenu()),this.$menu=$(this.el).find(".menu"));var r=$(this._templateMenuItem(n));r.on("click",function(e){e.preventDefault(),n.onclick&&n.onclick()}),this.$menu.append(r),n.divider&&this.$menu.append($(this._templateDivider()))},_templateMenuItem:function(e){var t='<li><a href="'+e.href+'" target="'+e.target+'">';return e.icon&&(t+='<i class="fa '+e.icon+'"></i>'),t+=" "+e.title+"</a>"+"</li>",t},_templateMenu:function(){return'<ul class="menu dropdown-menu pull-right" role="menu"></ul>'},_templateDivider:function(){return'<li class="divider"></li>'},_template:function(e){var t='<div id="'+e.id+'" class="button-menu btn-group">'+'<button type="button" class="root btn btn-default dropdown-toggle" data-toggle="dropdown">';return e.icon&&(t+='<i class="fa '+e.icon+'"></i>'),"</button></div>",t}}),h=Backbone.View.extend({optionsDefault:{value:"",type:"text",placeholder:"",disabled:!1,visible:!0},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.disabled&&this.$el.prop("disabled",!0),this.options.visible||this.$el.hide();var n=this;this.options.onchange&&this.$el.on("input",function(){n.options.onchange()})},value:function(e){return e!==undefined&&this.$el.val(e),this.$el.val()},_template:function(e){return'<input id="'+e.id+'" type="'+e.type+'" value="'+e.value+'" placeholder="'+e.placeholder+'" class="form-control">'}});return{Label:n,Button:i,Icon:s,ButtonIcon:o,Input:h,Anchor:u,Message:a,Searchbox:f,Title:l,Text:r,Select:t,ButtonMenu:c}}),define("plugin/library/jobs",["utils/utils"],function(e){return Backbone.Model.extend({initialize:function(t,n){this.app=t,this.options=e.merge(n,this.optionsDefault)},cleanup:function(t){var n=t.get("dataset_id_job");if(n!=""){var r=this;e.request("PUT",config.root+"api/histories/none/contents/"+n,{deleted:!0},function(){r._refreshHdas()}),t.set("dataset_id_job","")}},submit:function(t,n,r,i,s){var o=this,u=t.id,a=t.get("type"),f=this.app.types.get(a);data={tool_id:"chartskit",inputs:{input:{id:t.get("dataset_id"),src:"hda"},module:f.execute,columns:r,settings:n}},t.state("wait","Sending job request..."),e.request("POST",config.root+"api/tools",data,function(e){if(!e.outputs||e.outputs.length==0)t.state("failed","Job submission failed. No response."),s&&s();else{o._refreshHdas();var n=e.outputs[0];t.state("wait","Job has been queued..."),t.set("dataset_id_job",n.id),this.app.storage.save(),o._loop(n.id,function(e){switch(e.state){case"ok":return t.state("wait","Job completed successfully..."),i(e),!0;case"error":return t.state("failed","Job has failed. Please check the history for details."),s&&s(),!0;case"running":return t.state("wait","Job is running..."),!1}})}},function(e){var n="";e&&e.message&&e.message.data&&e.message.data.input&&(n=e.message.data.input+"."),t.state("failed","This visualization requires the Charts-Kit. Please make sure it is installed. "+n),s&&s()})},_loop:function(t,n){var r=this;e.request("GET",config.root+"api/datasets/"+t,{},function(e){n(e)||setTimeout(function(){r._loop(t,n)},r.app.config.get("query_timeout"))})},_refreshHdas:function(){Galaxy&&Galaxy.currHistoryPanel&&Galaxy.currHistoryPanel.refreshHdas()}})}),define("plugin/library/datasets",["utils/utils"],function(e){return Backbone.Collection.extend({list:{},cache:{},initialize:function(t,n){this.app=t,this.options=e.merge(n,this.optionsDefault)},request:function(t,n,r){var i=this;if(t.groups)this._get(t,n);else{var s=this.list[t.id];if(s){n(s);return}e.request("GET",config.root+"api/datasets/"+t.id,{},function(e){switch(e.state){case"error":r&&r(e);break;default:i.list[t.id]=e,n(e)}})}},_block_id:function(e,t){return e.id+"_"+e.start+"_"+e.end+"_"+t},_get:function(e,t){e.start||(e.start=0),e.end||(e.end=this.app.config.get("query_limit"));var n=[],r={},i=0;for(var s in e.groups){var o=e.groups[s];for(var u in o.columns){var a=o.columns[u].index,f=this._block_id(e,a);if(this.cache[f])continue;!r[a]&&a!==undefined&&(r[a]=i,n.push(a),i++)}}if(n.length==0){this._fill_from_cache(e),t(e);return}var l={dataset_id:e.id,start:e.start,end:e.end,columns:n},c=this;this._fetch(l,function(r){for(var i in r){var s=n[i],o=c._block_id(e,s);c.cache[o]=r[i]}c._fill_from_cache(e),t(e)})},_fill_from_cache:function(e){console.debug("Datasets::_fill_from_cache() - Filling request from cache.");for(var t in e.groups){var n=e.groups[t];n.values=[];for(var r in n.columns){var i=n.columns[r],s=this._block_id(e,i.index),o=this.cache[s];for(k in o){var u=n.values[k];u===undefined&&(u={x:parseInt(k)+e.start},n.values[k]=u);var a=o[k];isNaN(a)&&!i.is_label&&(a=0),u[r]=a}}}},_fetch:function(t,n){var r=t.start?t.start:0,i=Math.abs(t.end-t.start),s=this.app.config.get("query_limit");if(!i||i>s)i=s;var o=0;t.columns&&(o=t.columns.length,console.debug("Datasets::_fetch() - Fetching "+o+" column(s)")),o==0&&console.debug("Datasets::_fetch() - No columns requested");var u="";for(var a in t.columns)u+=t.columns[a]+",";u=u.substring(0,u.length-1);var f=this;e.request("GET",config.root+"api/datasets/"+t.dataset_id,{data_type:"raw_data",provider:"dataset-column",limit:i,offset:r,indeces:u},function(e){var t=new Array(o);for(var r=0;r<o;r++)t[r]=[];for(var r in e.data){var i=e.data[r];for(var s in i){var u=i[s];u!==undefined&&t[s].push(u)}}console.debug("Datasets::_fetch() - Fetching complete."),n(t)})}})}),define("plugin/models/group",[],function(){return Backbone.Model.extend({defaults:{key:"Data label",date:""},reset:function(){this.clear({silent:!0}).set(this.defaults),this.trigger("reset",this)}})}),define("plugin/models/groups",["plugin/models/group"],function(e){return Backbone.Collection.extend({model:e})}),define("plugin/library/deferred",["utils/utils"],function(e){return Backbone.Model.extend({queue:[],process:{},counter:0,initialize:function(){this.on("refresh",function(){if(this.counter==0)for(var e in this.queue)this.queue[e](),this.queue.splice(e,1)})},execute:function(e){this.queue.push(e),this.trigger("refresh")},register:function(){var t=e.uuid();return this.process[t]=!0,this.counter++,console.debug("Deferred:register() - Registering "+t),t},done:function(e){this.process[e]&&(delete this.process[e],this.counter--,console.debug("Deferred:done() - Unregistering "+e),this.trigger("refresh"))},ready:function(){return this.counter==0?!0:!1}})});var Visualization=Backbone.Model.extend({defaults:{config:{}},urlRoot:function(){var e="/api/visualizations";return window.galaxy_config&&galaxy_config.root?galaxy_config.root+e:e},initialize:function(e){_.isObject(e.config)&&_.isObject(this.defaults.config)&&_.defaults(e.config,this.defaults.config),this._setUpListeners()},_setUpListeners:function(){},set:function(e,t){if(e==="config"){var n=this.get("config");_.isObject(n)&&(t=_.extend(_.clone(n),t))}return Backbone.Model.prototype.set.call(this,e,t),this},toString:function(){var e=this.get("id")||"";return this.get("title")&&(e+=":"+this.get("title")),"Visualization("+e+")"}}),VisualizationCollection=Backbone.Collection.extend({model:Visualization,url:function(){return galaxy_config.root+"api/visualizations"},initialize:function(e,t){t=t||{}},set:function(e,t){var n=this;e=_.map(e,function(e){var t=n.get(e.id);if(!t)return e;var r=t.toJSON();return _.extend(r,e),r}),Backbone.Collection.prototype.set.call(this,e,t)},toString:function(){return["VisualizationCollection(",[this.historyId,this.length].join(),")"].join("")}});define("mvc/visualization/visualization-model",function(){}),define("plugin/models/chart",["plugin/models/groups","plugin/library/deferred","mvc/visualization/visualization-model"],function(e,t){return Backbone.Model.extend({defaults:{id:null,title:"",type:"",date:null,state:"",state_info:"",modified:!1,dataset_id:"",dataset_id_job:""},initialize:function(n){this.groups=new e,this.settings=new Backbone.Model,this.deferred=new t},reset:function(){this.clear({silent:!0}).set(this.defaults),this.groups.reset(),this.settings.clear(),this.trigger("reset",this)},copy:function(e){var t=this;t.clear({silent:!0}).set(this.defaults),t.set(e.attributes),t.settings=e.settings.clone(),t.groups.reset(),e.groups.each(function(e){t.groups.add(e.clone())}),t.trigger("change",t)},state:function(e,t){this.set("state",e),this.set("state_info",t),this.trigger("set:state"),console.debug("Chart:state() - "+t+" ("+e+")")}})}),define("plugin/library/storage",["utils/utils","plugin/models/chart","plugin/models/group"],function(e,t,n){return Backbone.Model.extend({vis:null,initialize:function(e){this.app=e,this.chart=this.app.chart,this.options=this.app.options,this.id=this.options.id,this.vis=new Visualization({type:"charts",config:{dataset_id:this.options.config.dataset_id,chart_dict:{}}}),this.id&&(this.vis.id=this.id);var t=this.options.config.chart_dict;t&&(this.vis.get("config").chart_dict=t)},save:function(){var e=this.app.chart;this.vis.get("config").chart_dict={};var t=e.get("title");t!=""&&this.vis.set("title",t);var n={attributes:e.attributes,settings:e.settings.attributes,groups:[]};e.groups.each(function(e){n.groups.push(e.attributes)}),this.vis.get("config").chart_dict=n;var r=this;this.vis.save().fail(function(e,t,n){console.error(e,t,n)}).then(function(e){e&&e.id&&(r.id=e.id)})},load:function(){var e=this.vis.get("config").chart_dict;if(!e.attributes)return!1;this.chart.set(e.attributes),this.chart.state("ok","Loading saved visualization..."),this.chart.settings.set(e.settings);for(var t in e.groups)this.chart.groups.add(new n(e.groups[t]));return this.chart.set("modified",!1),!0}})}),define("plugin/views/viewport",["mvc/ui/ui-portlet","plugin/library/ui","utils/utils"],function(e,t,n){return Backbone.View.extend({canvas:[],initialize:function(e,t){this.app=e,this.chart=this.app.chart,this.options=n.merge(t,this.optionsDefault),this.setElement($(this._template())),this._fullscreen(this.$el,80),this._create_canvas("div");var r=this;this.chart.on("redraw",function(){r._draw(r.chart)}),this.chart.on("set:state",function(){var e=r.$el.find("#info"),t=e.find("#icon");t.removeClass(),e.show(),e.find("#text").html(r.chart.get("state_info"));var n=r.chart.get("state");switch(n){case"ok":e.hide();break;case"failed":t.addClass("fa fa-warning");break;default:t.addClass("fa fa-spinner fa-spin")}})},show:function(){this.$el.show()},hide:function(){this.$el.hide()},_fullscreen:function(e,t){e.css("height",$(window).height()-t),$(window).resize(function(){e.css("height",$(window).height()-t)})},_create_canvas:function(e,t){t=t||1;for(var n in this.canvas)this.canvas[n].remove(),this.canvas.slice(n,0);for(var n=0;n<t;n++){var r=$(this._template_canvas(e,parseInt(100/t)));this.$el.append(r),e=="svg"?this.canvas[n]=d3.select(r[0]):this.canvas[n]=r}},_draw:function(e){var t=this,n=e.deferred.register(),r=e.get("type");this.chart_settings=this.app.types.get(r);var i=this.chart_settings.use_panels,s=1;i&&(s=e.groups.length),this._create_canvas(this.chart_settings.tag,s),e.state("wait","Please wait...");if(!this.chart_settings.execute||this.chart_settings.execute&&e.get("modified"))this.app.jobs.cleanup(e),e.set("modified",!1);var t=this;require(["plugin/charts/"+r+"/"+r],function(r){var i=new r(t.app,{canvas:t.canvas});t.chart_settings.execute?e.get("dataset_id_job")==""?t.app.jobs.submit(e,t._defaultSettingsString(e),t._defaultRequestString(e),function(){i.draw(n,e,t._defaultRequestDictionary(e))},function(){e.deferred.done(n)}):i.draw(n,e,t._defaultRequestDictionary(e)):i.draw(n,e,t._defaultRequestDictionary(e))})},_defaultRequestString:function(e){var t="",n=0,r=this;return e.groups.each(function(e){for(var i in r.chart_settings.columns)t+=i+"_"+ ++n+":"+(parseInt(e.get(i))+1)+", "}),t.substring(0,t.length-2)},_defaultSettingsString:function(e){var t="";for(key in e.settings.attributes)t+=key+":"+e.settings.get(key)+", ";return t.substring(0,t.length-2)},_defaultRequestDictionary:function(e){var t={groups:[]};this.chart_settings.execute?t.id=e.get("dataset_id_job"):t.id=e.get("dataset_id");var n=0,r=this;return e.groups.each(function(e){var i={};for(var s in r.chart_settings.columns){var o=r.chart_settings.columns[s];i[s]={index:e.get(s),is_label:o.is_label}}t.groups.push({key:++n+":"+e.get("key"),columns:i})}),t},_template:function(){return'<div style="height: inherit; min-height: 50px;"><div id="info" style="position: absolute; margin-left: 10px; margin-top: 10px; margin-bottom: 50px;"><span id="icon" style="font-size: 1.2em; display: inline-block;"/><span id="text" style="position: relative; margin-left: 5px; top: -1px; font-size: 1.0em;"/></div></div>'},_template_canvas:function(e,t){return"<"+e+' class="canvas" style="float: left; display: block; width:'+t+'%; height: 100%;"/>'}})}),define("plugin/views/viewer",["utils/utils","plugin/library/ui","mvc/ui/ui-portlet","plugin/models/group","plugin/views/viewport"],function(e,t,n,r,i){return Backbone.View.extend({initialize:function(e,r){this.app=e,this.chart=this.app.chart,this.viewport_view=new i(e);var s=this;this.portlet=new n.View({icon:"fa-bar-chart-o",title:"Viewport",operations:{edit_button:new t.ButtonIcon({icon:"fa-edit",tooltip:"Customize this chart",title:"Editor",onclick:function(){s._wait(s.chart,function(){s.app.go("editor")})}})}}),this.portlet.append(this.viewport_view.$el),this.setElement(this.portlet.$el);var s=this;this.chart.on("change:title",function(){s._refreshTitle()})},show:function(){this.$el.show(),$(window).trigger("resize")},hide:function(){this.$el.hide()},_refreshTitle:function(){var e=this.chart.get("title");this.portlet.title(e)},_screenshot:function(){var e=new XMLSerializer,t=e.serializeToString(this.viewport_view.svg.node()),n="data:image/svg+xml;base64,"+btoa(t);window.location.href="data:application/x-download/;charset=utf-8,"+encodeURIComponent(t)},_wait:function(e,t){if(e.deferred.ready())t();else{var n=this;this.app.modal.show({title:"Please wait!",body:"Your chart is currently being processed. Please wait and try again.",buttons:{Close:function(){n.app.modal.hide()},Retry:function(){n.app.modal.hide(),setTimeout(function(){n._wait(e,t)},n.app.config.get("query_timeout"))}}})}}})}),define("mvc/ui/ui-tabs",["utils/utils"],function(e){var t=Backbone.View.extend({visible:!1,list:{},$nav:null,$content:null,first_tab:null,optionsDefault:{title_new:"",operations:null,onnew:null},initialize:function(t){this.options=e.merge(t,this.optionsDefault);var n=$(this._template(this.options));this.$nav=n.find(".tab-navigation"),this.$content=n.find(".tab-content"),this.setElement(n),this.list={};var r=this;this.options.operations&&$.each(this.options.operations,function(e,t){t.$el.prop("id",e),r.$nav.find(".operations").append(t.$el)});if(this.options.onnew){var i=$(this._template_tab_new(this.options));this.$nav.append(i),i.tooltip({title:"Add a new tab",placement:"bottom",container:r.$el}),i.on("click",function(e){i.tooltip("hide"),r.options.onnew()})}},add:function(e){var t=e.id,n={$title:$(this._template_tab(e)),$content:$(this._template_tab_content(e)),removable:e.ondel?!0:!1};this.list[t]=n,this.options.onnew?this.$nav.find("#new-tab").before(n.$title):this.$nav.append(n.$title),n.$content.append(e.$el),this.$content.append(n.$content),_.size(this.list)==1&&(n.$title.addClass("active"),n.$content.addClass("active"),this.first_tab=t);if(e.ondel){var r=this,i=n.$title.find("#delete");i.tooltip({title:"Delete this tab",placement:"bottom",container:r.$el}),i.on("click",function(){return i.tooltip("destroy"),r.$el.find(".tooltip").remove(),e.ondel(),!1})}e.onclick&&n.$title.on("click",function(){e.onclick()})},del:function(e){var t=this.list[e];t.$title.remove(),t.$content.remove(),delete t,this.first_tab==e&&(this.first_tab=null),this.first_tab!=null&&this.show(this.first_tab)},delRemovable:function(){for(var e in this.list){var t=this.list[e];t.removable&&this.del(e)}},show:function(e){this.$el.fadeIn("fast"),this.visible=!0,e&&this.list[e].$title.find("a").tab("show")},hide:function(){this.$el.fadeOut("fast"),this.visible=!1},hideOperation:function(e){this.$nav.find("#"+e).hide()},showOperation:function(e){this.$nav.find("#"+e).show()},setOperation:function(e,t){var n=this.$nav.find("#"+e);n.off("click"),n.on("click",t)},title:function(e,t){var n=this.list[e].$title.find("#text");return t&&n.html(t),n.html()},_template:function(e){return'<div class="tabbable tabs-left"><ul class="tab-navigation nav nav-tabs"><div class="operations" style="float: right; margin-bottom: 4px;"></div></ul><div class="tab-content"/></div>'},_template_tab_new:function(e){return'<li id="new-tab"><a href="javascript:void(0);"><i style="font-size: 0.8em; margin-right: 5px;" class="fa fa-plus-circle"/>'+e.title_new+"</a>"+"</li>"},_template_tab:function(e){var t='<li id="title-'+e.id+'">'+'<a title="" href="#tab-'+e.id+'" data-toggle="tab" data-original-title="">'+'<span id="text">'+e.title+"</span>";return e.ondel&&(t+='<i id="delete" style="font-size: 0.8em; margin-left: 5px; cursor: pointer;" class="fa fa-minus-circle"/>'),t+="</a></li>",t},_template_tab_content:function(e){return'<div id="tab-'+e.id+'" class="tab-pane"/>'}});return{View:t}}),define("plugin/library/ui-table",["utils/utils"],function(e){var t=Backbone.View.extend({row:null,row_count:0,optionsDefault:{content:"No content available.",onchange:null,ondblclick:null,onconfirm:null},events:{click:"_onclick",dblclick:"_ondblclick"},first:!0,initialize:function(t){this.options=e.merge(t,this.optionsDefault);var n=$(this._template(t));this.$thead=n.find("thead"),this.$tbody=n.find("tbody"),this.$tmessage=n.find("tmessage"),this.setElement(n),this.row=$("<tr></tr>")},addHeader:function(e){var t=$("<th></th>");t.append(e),this.row.append(t)},appendHeader:function(){this.$thead.append(this.row),this.row=$("<tr></tr>")},add:function(e,t,n){var r=$("<td></td>");t&&r.css("width",t),n&&r.css("text-align",n),r.append(e),this.row.append(r)},append:function(e){this._commit(e)},prepend:function(e){this._commit(e,!0)},remove:function(e){var t=this.$tbody.find("#"+e);t.length>0&&(t.remove(),this.row_count--,this._refresh())},removeAll:function(){this.$tbody.html(""),this.row_count=0,this._refresh()},value:function(e){this.before=this.$tbody.find(".current").attr("id"),e!==undefined&&(this.$tbody.find("tr").removeClass("current"),e&&this.$tbody.find("#"+e).addClass("current"));var t=this.$tbody.find(".current").attr("id");return t===undefined?null:(t!=this.before&&this.options.onchange&&this.options.onchange(e),t)},size:function(){return this.$tbody.find("tr").length},_commit:function(e,t){this.remove(e),this.row.attr("id",e),t?this.$tbody.prepend(this.row):this.$tbody.append(this.row),this.row=$("<tr></tr>"),this.row_count++,this._refresh()},_onclick:function(e){var t=this.value(),n=$(e.target).closest("tr").attr("id");n&&t!=n&&(this.options.onconfirm?this.options.onconfirm(n):this.value(n))},_ondblclick:function(e){var t=this.value();t&&this.options.ondblclick&&this.options.ondblclick(t)},_refresh:function(){this.row_count==0?this.$tmessage.show():this.$tmessage.hide()},_template:function(e){return'<div><table class="grid"><thead></thead><tbody style="cursor: pointer;"></tbody></table><tmessage>'+e.content+"</tmessage>"+"<div>"}});return{View:t}}),define("plugin/views/group",["plugin/library/ui-table","plugin/library/ui","utils/utils"],function(e,t,n){return Backbone.View.extend({initialize:function(r,i){this.app=r;var s=this;this.chart=this.app.chart,this.group=i.group,this.group_key=new t.Input({placeholder:"Data label",onchange:function(){s.group.set("key",s.group_key.value())}}),this.table=new e.View({content:"No data column."});var o=$("<div/>");o.append(n.wrap((new t.Label({title:"Provide a label:"})).$el)),o.append(n.wrap(this.group_key.$el)),o.append(n.wrap((new t.Label({title:"Select columns:"})).$el)),o.append(n.wrap(this.table.$el)),this.setElement(o);var s=this;this.chart.on("change:dataset_id",function(){s._refreshTable()}),this.chart.on("change:type",function(){s._refreshTable()}),this.group.on("change:key",function(){s._refreshGroupKey()}),this.group.on("change",function(){s._refreshGroup()}),this._refreshTable(),this._refreshGroupKey(),this._refreshGroup()},_refreshTable:function(){var e=this.chart.get("dataset_id"),n=this.chart.get("type");if(!e||!n)return;var r=this,i=this.app.types.get(n);this.table.removeAll();var s={};for(var o in i.columns){var u=this.group.get(o);u||this.group.set(o,0);var a=i.columns[o],f=new t.Select.View({id:"select_"+o,gid:o,onchange:function(e){r.group.set(this.gid,e),r.chart.set("modified",!0)},value:u,wait:!0});this.table.add(a.title,"25%"),this.table.add(f.$el),this.table.append(o),s[o]=f}this.chart.state("wait","Loading metadata...");var l=this.chart.deferred.register();this.app.datasets.request({id:e},function(e){for(var t in s){var n=i.columns[t].is_label,o=[],u=e.metadata_column_types;for(var a in u)(!n&&(u[a]=="int"||u[a]=="float")||n)&&o.push({label:"Column: "+(parseInt(a)+1)+" ["+u[a]+"]",value:a});s[t].update(o),s[t].show()}r.chart.state("wait","Metadata initialized..."),r.chart.deferred.done(l)})},_refreshGroup:function(){this.group.set("date",n.time())},_refreshGroupKey:function(){var e=this.group.get("key");e===undefined&&(e=""),this.group_key.value(e)}})}),define("plugin/library/ui-table-form",["plugin/library/ui-table","plugin/library/ui","utils/utils"],function(e,t,n){var r=Backbone.View.extend({list:[],initialize:function(r){this.table_title=new t.Label({title:r.title}),this.table=new e.View({content:r.content});var i=$("<div/>");i.append(n.wrap(this.table_title.$el)),i.append(n.wrap(this.table.$el)),this.setElement(i)},title:function(e){this.table_title.title(e)},update:function(e,t){this.table.removeAll(),this.list=[];for(var n in e)this._add(n,e[n],t);for(var n in this.list){var r=this.list[n].options.onchange;r&&r()}},_add:function(e,n,r){var i=this,s=null,o=n.type;switch(o){case"text":s=new t.Input({id:e,placeholder:n.placeholder,onchange:function(){r.set(e,s.value())}});break;case"select":s=new t.Select.View({id:e,data:n.data,onchange:function(){var t=s.value();r.set(e,t);var o=_.findWhere(n.data,{value:t});o&&(o.show&&i.$el.find("#"+o.show).fadeIn("fast"),o.hide&&i.$el.find("#"+o.hide).fadeOut("fast"))}});break;case"separator":s=$("<div/>");break;default:console.log("ui-table-form:_add","Unknown setting type ("+n.type+")");return}if(o!="separator"){r.get(e)||r.set(e,n.init),s.value(r.get(e)),this.list[e]=s;var u=$("<div/>");u.append(s.$el),u.append('<div class="toolParamHelp" style="font-size: 0.9em;">'+n.info+"</div>"),this.table.add('<span style="white-space: nowrap;">'+n.title+"</span>","25%"),this.table.add(u)}else this.table.add('<h6 style="white-space: nowrap;">'+n.title+":<h6/>"),this.table.add($("<div/>"));this.table.append(e)}});return{View:r}}),define("plugin/views/settings",["plugin/library/ui","plugin/library/ui-table-form","utils/utils"],function(e,t,n){return Backbone.View.extend({initialize:function(e,n){this.app=e;var r=this;this.chart=this.app.chart,this.form=new t.View({title:"Chart options:",content:"This chart type does not provide any options."}),this.setElement(this.form.$el);var r=this;this.chart.on("change",function(){r._refreshTable()})},_refreshTable:function(){var e=this.chart.get("type");if(!e)return;var t=this.app.types.get(e);this.form.title(t.title+":"),this.form.update(t.settings,this.chart.settings)}})}),define("plugin/views/editor",["mvc/ui/ui-tabs","plugin/library/ui-table","plugin/library/ui","mvc/ui/ui-portlet","utils/utils","plugin/models/chart","plugin/models/group","plugin/views/group","plugin/views/settings"],function(e,t,n,r,i,s,o,u,a){return Backbone.View.extend({optionsDefault:{header:!0,content:"No content available."},initialize:function(s,o){var u=this;this.app=s,this.chart=this.app.chart,this.options=i.merge(o,this.optionsDefault),this.portlet=new r.View({icon:"fa-bar-chart-o",title:"Editor",operations:{save:new n.ButtonIcon({icon:"fa-save",tooltip:"Draw Chart",title:"Draw",onclick:function(){u.app.go("viewer"),u._saveChart()}}),back:new n.ButtonIcon({icon:"fa-caret-left",tooltip:"Return to Viewer",title:"Return",onclick:function(){u.app.go("viewer"),u.app.storage.load()}})}}),this.table=new t.View({header:!1,onchange:function(e){u.chart.settings.clear(),u.chart.set({type:e}),u.chart.set("modified",!0)},ondblclick:function(e){u.tabs.show("settings")},content:"No chart types available"}),this.table.addHeader("No."),this.table.addHeader("Type"),this.table.addHeader("Library"),this.table.addHeader("Processing*"),this.table.appendHeader();var f=0,l=s.types.attributes;for(var c in l){var h=l[c];this.table.add(++f+"."),this.table.add(h.title),this.table.add(h.library,"10%"),h.execute?this.table.add((new n.Icon({icon:"fa-check"})).$el,"10%","center"):this.table.add(""),this.table.append(c)}this.tabs=new e.View({title_new:"Add Data",onnew:function(){var e=u._addGroupModel();u.tabs.show(e.id)}}),this.title=new n.Input({placeholder:"Chart title",onchange:function(){u.chart.set("title",u.title.value())}});var p=$("<div/>");p.append(i.wrap((new n.Label({title:"Provide a chart title:"})).$el)),p.append(i.wrap(this.title.$el)),p.append(i.wrap((new n.Label({title:"Select a chart type:"})).$el)),p.append(i.wrap(this.table.$el)),p.append((new n.Text({title:"*Certain chart types pre-process data before rendering the visualization. The pre-processing is done using the chartskit available in the Toolshed.",cls:"toolParamHelp"})).$el),this.tabs.add({id:"main",title:"Start",$el:p}),this.settings=new a(this.app),this.tabs.add({id:"settings",title:"Configuration",$el:this.settings.$el}),this.portlet.append(this.tabs.$el),this.setElement(this.portlet.$el),this.tabs.hideOperation("back");var u=this;this.chart.on("change:title",function(e){u._refreshTitle()}),this.chart.on("change:type",function(e){u.table.value(e.get("type"))}),this.chart.on("reset",function(e){u._resetChart()}),this.app.chart.on("redraw",function(e){u.portlet.showOperation("back")}),this.app.chart.groups.on("add",function(e){u._addGroup(e)}),this.app.chart.groups.on("remove",function(e){u._removeGroup(e)}),this.app.chart.groups.on("reset",function(e){u._removeAllGroups()}),this.app.chart.groups.on("change:key",function(e){u._refreshGroupKey()}),this._resetChart()},show:function(){this.$el.show()},hide:function(){this.$el.hide()},_refreshTitle:function(){var e=this.chart.get("title");this.portlet.title(e),this.title.value(e)},_refreshGroupKey:function(){var e=this,t=0;this.chart.groups.each(function(n){var r=n.get("key","");r==""&&(r="Chart data"),e.tabs.title(n.id,++t+": "+r)})},_addGroupModel:function(){var e=new o({id:i.uuid()});return this.chart.groups.add(e),e},_addGroup:function(e){var t=this,n=new u(this.app,{group:e}),r=t.chart.groups.length;this.tabs.add({id:e.id,$el:n.$el,ondel:function(){t.chart.groups.remove(e.id)}}),this._refreshGroupKey()},_removeGroup:function(e){this.tabs.del(e.id),this._refreshGroupKey(),this.chart.set("modified",!0)},_removeAllGroups:function(e){this.tabs.delRemovable()},_resetChart:function(){this.chart.set("id",i.uuid()),this.chart.set("type","nvd3_bardiagram"),this.chart.set("dataset_id",this.app.options.config.dataset_id),this.chart.set("title","New Chart"),this.portlet.hideOperation("back")},_saveChart:function(){this.chart.set({type:this.table.value(),title:this.title.value(),date:i.time()}),this.chart.groups.length==0&&this._addGroupModel();var e=this;this.chart.deferred.execute(function(){e.app.storage.save(),e.chart.trigger("redraw")})}})}),define("plugin/models/config",[],function(){return Backbone.Model.extend({defaults:{query_limit:1e3,query_timeout:500}})}),define("plugin/charts/nvd3/config",[],function(){return{title:"",library:"nvd3.js",tag:"svg",columns:{y:{title:"Values for y-axis"}},settings:{separator_label:{title:"X axis",type:"separator"},x_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"X-axis",placeholder:"Axis label"},x_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:"x_axis_tick"},{label:"Auto",value:"auto",hide:"x_axis_tick"},{label:"Float",value:"f",show:"x_axis_tick"},{label:"Exponent",value:"e",show:"x_axis_tick"},{label:"Integer",value:"d",hide:"x_axis_tick"},{label:"Percentage",value:"p",show:"x_axis_tick"},{label:"Rounded",value:"r",show:"x_axis_tick"},{label:"SI-prefix",value:"s",show:"x_axis_tick"}]},x_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},separator_tick:{title:"Y axis",type:"separator"},y_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"Y-axis",placeholder:"Axis label"},y_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:"y_axis_tick"},{label:"Auto",value:"auto",hide:"y_axis_tick"},{label:"Float",value:"f",show:"y_axis_tick"},{label:"Exponent",value:"e",show:"y_axis_tick"},{label:"Integer",value:"d",hide:"y_axis_tick"},{label:"Percentage",value:"p",show:"y_axis_tick"},{label:"Rounded",value:"r",show:"y_axis_tick"},{label:"SI-prefix",value:"s",show:"y_axis_tick"}]},y_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},separator_legend:{title:"Others",type:"separator"},show_legend:{title:"Show legend",info:"Would you like to add a legend?",type:"select",init:"true",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]}}}}),define("plugin/charts/nvd3_bardiagram/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Bar diagram"})}),define("plugin/charts/nvd3_histogram/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Histogram",execute:"histogram",columns:{y:{title:"Observations"}},settings:{x_axis_label:{init:"Breaks"},y_axis_label:{init:"Density"}}})}),define("plugin/charts/nvd3_horizontal/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Bar diagram (horizontal)",settings:{x_axis_type:{init:"hide"}}})}),define("plugin/charts/nvd3_line/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Line chart"})}),define("plugin/charts/nvd3_linewithfocus/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Line with focus"})}),define("plugin/charts/nvd3_piechart/config",[],function(){return{title:"Pie chart",library:"nvd3.js",tag:"svg",use_panels:!0,columns:{label:{title:"Labels",is_label:!0},y:{title:"Values"}},settings:{show_legend:{title:"Show legend",info:"Would you like to add a legend?",type:"select",init:"false",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]},donut_ratio:{title:"Donut ratio",info:"Determine how large the donut hole will be.",type:"select",init:"0.5",data:[{label:"50%",value:"0.5"},{label:"25%",value:"0.25"},{label:"10%",value:"0.10"},{label:"0%",value:"0"}]},label_separator:{type:"separator",title:"Label settings"},label_type:{title:"Donut label",info:"What would you like to show for each slice?",type:"select",init:"percent",data:[{label:"-- Nothing --",value:"hide",hide:"label_outside"},{label:"Label column",value:"key",show:"label_outside"},{label:"Value column",value:"value",show:"label_outside"},{label:"Percentage",value:"percent",show:"label_outside"}]},label_outside:{title:"Show outside",info:"Would you like to show labels outside the donut?",type:"select",init:"false",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]}}}}),define("plugin/charts/nvd3_scatterplot/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Scatter plot",columns:{x:{title:"Values for x-axis"}}})}),define("plugin/charts/nvd3_stackedarea/config",["plugin/charts/nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Stacked area"})}),define("plugin/charts/highcharts_boxplot/config",[],function(){return{title:"Box plot",library:"highcharts.js",element:"div",execute:"boxplot",columns:{y:{title:"Observations"}},settings:{separator_label:{title:"X axis",type:"separator"},x_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"X-axis",placeholder:"Axis label"},separator_tick:{title:"Y axis",type:"separator"},y_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"Y-axis",placeholder:"Axis label"}}}}),define("plugin/charts/types",["plugin/charts/nvd3_bardiagram/config","plugin/charts/nvd3_histogram/config","plugin/charts/nvd3_horizontal/config","plugin/charts/nvd3_line/config","plugin/charts/nvd3_linewithfocus/config","plugin/charts/nvd3_piechart/config","plugin/charts/nvd3_scatterplot/config","plugin/charts/nvd3_stackedarea/config","plugin/charts/highcharts_boxplot/config"],function(e,t,n,r,i,s,o,u,a){return Backbone.Model.extend({defaults:{nvd3_bardiagram:e,nvd3_horizontal:n,nvd3_histogram:t,nvd3_line:r,nvd3_linewithfocus:i,nvd3_piechart:s,nvd3_scatterplot:o,nvd3_stackedarea:u,highcharts_boxplot:a}})}),define("plugin/app",["mvc/ui/ui-modal","mvc/ui/ui-portlet","plugin/library/ui","utils/utils","plugin/library/jobs","plugin/library/datasets","plugin/library/storage","plugin/views/viewer","plugin/views/editor","plugin/models/config","plugin/models/chart","plugin/charts/types"],function(e,t,n,r,i,s,o,u,a,f,l,c){return Backbone.View.extend({initialize:function(t){this.options=t,Galaxy&&Galaxy.modal?this.modal=Galaxy.modal:this.modal=new e.View,this.config=new f,this.types=new c,this.chart=new l,this.jobs=new i(this),this.datasets=new s(this),this.storage=new o(this),this.viewer_view=new u(this),this.editor_view=new a(this),this.$el.append(this.viewer_view.$el),this.$el.append(this.editor_view.$el);if(!this.storage.load())this.go("editor");else{this.go("viewer");var n=this;this.chart.deferred.execute(function(){n.chart.trigger("redraw")})}},go:function(e){$(".tooltip").hide();switch(e){case"editor":this.editor_view.show(),this.viewer_view.hide();break;case"viewer":this.editor_view.hide(),this.viewer_view.show()}},execute:function(e){},onunload:function(){},log:function(e,t){console.log(e+" "+t)}})});
\ No newline at end of file
diff -r 166660f085a51316976df1ffef426997ed393a24 -r 60d37cbc685789f0419cefdad528863b75b88a18 config/plugins/visualizations/charts/static/charts/highcharts_boxplot/highcharts_boxplot.js
--- a/config/plugins/visualizations/charts/static/charts/highcharts_boxplot/highcharts_boxplot.js
+++ b/config/plugins/visualizations/charts/static/charts/highcharts_boxplot/highcharts_boxplot.js
@@ -108,7 +108,7 @@
self.hc_config.series[0].data = data;
// draw plot
- self.options.canvas.highcharts(self.hc_config);
+ self.options.canvas[0].highcharts(self.hc_config);
// set chart state
chart.state('ok', 'Box plot drawn.');
diff -r 166660f085a51316976df1ffef426997ed393a24 -r 60d37cbc685789f0419cefdad528863b75b88a18 config/plugins/visualizations/charts/static/charts/nvd3/config.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/config.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/config.js
@@ -3,7 +3,7 @@
return {
title : '',
library : 'nvd3.js',
- element : 'svg',
+ tag : 'svg',
columns : {
y : {
title : 'Values for y-axis'
@@ -213,7 +213,7 @@
value : 'false'
}
]
- },
+ }
}
};
diff -r 166660f085a51316976df1ffef426997ed393a24 -r 60d37cbc685789f0419cefdad528863b75b88a18 config/plugins/visualizations/charts/static/charts/nvd3/nvd3.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3/nvd3.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3/nvd3.js
@@ -48,8 +48,8 @@
}
// parse data to canvas
- self.options.canvas.datum(request_dictionary.groups)
- .call(nvd3_model);
+ self.options.canvas[0].datum(request_dictionary.groups)
+ .call(nvd3_model);
// refresh on window resize
nv.utils.windowResize(nvd3_model.update);
diff -r 166660f085a51316976df1ffef426997ed393a24 -r 60d37cbc685789f0419cefdad528863b75b88a18 config/plugins/visualizations/charts/static/charts/nvd3_piechart/config.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3_piechart/config.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3_piechart/config.js
@@ -3,7 +3,8 @@
return {
title : 'Pie chart',
library : 'nvd3.js',
- element : 'svg',
+ tag : 'svg',
+ use_panels : true,
columns : {
label : {
title : 'Labels',
@@ -12,6 +13,101 @@
y : {
title : 'Values'
}
+ },
+
+ settings : {
+ show_legend : {
+ title : 'Show legend',
+ info : 'Would you like to add a legend?',
+ type : 'select',
+ init : 'false',
+ data : [
+ {
+ label : 'Yes',
+ value : 'true'
+ },
+ {
+ label : 'No',
+ value : 'false'
+ }
+ ]
+ },
+
+ donut_ratio : {
+ title : 'Donut ratio',
+ info : 'Determine how large the donut hole will be.',
+ type : 'select',
+ init : '0.5',
+ data : [
+ {
+ label : '50%',
+ value : '0.5'
+ },
+ {
+ label : '25%',
+ value : '0.25'
+ },
+ {
+ label : '10%',
+ value : '0.10'
+ },
+ {
+ label : '0%',
+ value : '0'
+ }
+ ]
+ },
+
+ label_separator : {
+ type : 'separator',
+ title : 'Label settings'
+ },
+
+ label_type : {
+ title : 'Donut label',
+ info : 'What would you like to show for each slice?',
+ type : 'select',
+ init : 'percent',
+ data : [
+ {
+ label : '-- Nothing --',
+ value : 'hide',
+ hide : 'label_outside'
+ },
+ {
+ label : 'Label column',
+ value : 'key',
+ show : 'label_outside'
+ },
+ {
+ label : 'Value column',
+ value : 'value',
+ show : 'label_outside'
+ },
+ {
+ label : 'Percentage',
+ value : 'percent',
+ show : 'label_outside'
+ }
+ ],
+ },
+
+ label_outside : {
+ title : 'Show outside',
+ info : 'Would you like to show labels outside the donut?',
+ type : 'select',
+ init : 'false',
+ data : [
+ {
+ label : 'Yes',
+ value : 'true'
+ },
+ {
+ label : 'No',
+ value : 'false'
+ }
+ ]
+ }
}
};
diff -r 166660f085a51316976df1ffef426997ed393a24 -r 60d37cbc685789f0419cefdad528863b75b88a18 config/plugins/visualizations/charts/static/charts/nvd3_piechart/nvd3_piechart.js
--- a/config/plugins/visualizations/charts/static/charts/nvd3_piechart/nvd3_piechart.js
+++ b/config/plugins/visualizations/charts/static/charts/nvd3_piechart/nvd3_piechart.js
@@ -18,39 +18,97 @@
this.app.datasets.request(request_dictionary, function() {
// loop through data groups
- for (var key in request_dictionary.groups) {
+ for (var group_index in request_dictionary.groups) {
// get group
- var group = request_dictionary.groups[key];
-
- // format chart data
- var pie_data = [];
- for (var key in group.values) {
- var value = group.values[key];
- pie_data.push ({
- y : value.y,
- x : value.label
- });
- }
+ var group = request_dictionary.groups[group_index];
+
+ // draw group
+ self._draw_group(chart, group, self.options.canvas[group_index]);
}
- // add graph to screen
- nv.addGraph(function() {
- self.chart_3d = nv.models.pieChart()
- .donut(true)
- .showLegend(false);
+ // set chart state
+ chart.state('ok', 'Pie chart has been drawn.');
+
+ // unregister process
+ chart.deferred.done(process_id);
+ });
+ },
+
+ // draw group
+ _draw_group: function(chart, group, canvas) {
+
+ // add title
+ var title = canvas.append('text');
+
+ // configure title attributes
+ this._fix_title(chart, canvas, title, group.key);
+
+ // format chart data
+ var pie_data = [];
+ for (var key in group.values) {
+ var value = group.values[key];
+ pie_data.push ({
+ y : value.y,
+ x : value.label
+ });
+ }
+
+ // add graph to screen
+ var self = this;
+ nv.addGraph(function() {
+ // legend
+ var legend_visible = true;
+ if (chart.settings.get('show_legend') == 'false') {
+ legend_visible = false;
+ }
+
+ // legend
+ var label_outside = true;
+ if (chart.settings.get('label_outside') == 'false') {
+ label_outside = false;
+ }
+
+ // label type
+ var label_type = chart.settings.get('label_type');
+
+ // ratio
+ var donut_ratio = parseFloat(chart.settings.get('donut_ratio'))
+
+ // create chart model
+ var chart_3d = nv.models.pieChart()
+ .donut(true)
+ .labelThreshold(.05)
+ .showLegend(legend_visible)
+ .labelType(label_type)
+ .donutRatio(donut_ratio)
+ .donutLabelsOutside(label_outside);
+
+ // add data to canvas
+ canvas.datum(pie_data)
+ .call(chart_3d);
+
+ // add resize trigger
+ nv.utils.windowResize(function() {
+ // update chart
+ chart_3d.update();
- self.options.canvas.datum(pie_data)
- .call(self.chart_3d);
-
- nv.utils.windowResize(self.chart_3d.update);
-
- // set chart state
- chart.state('ok', 'Chart has been drawn.');
-
- // unregister process
- chart.deferred.done(process_id);
+ // fix title
+ self._fix_title(chart, canvas, title, group.key);
});
});
+ },
+
+ // fix title
+ _fix_title: function(chart, canvas, title_element, title_text) {
+ // update title
+ var width = parseInt(canvas.style('width'));
+ var height = parseInt(canvas.style('height'));
+
+ // add title
+ title_element.attr('x', width / 2)
+ .attr('y', height)
+ .attr('text-anchor', 'middle')
+ .text(title_text);
}
});
diff -r 166660f085a51316976df1ffef426997ed393a24 -r 60d37cbc685789f0419cefdad528863b75b88a18 config/plugins/visualizations/charts/static/views/viewport.js
--- a/config/plugins/visualizations/charts/static/views/viewport.js
+++ b/config/plugins/visualizations/charts/static/views/viewport.js
@@ -4,6 +4,10 @@
// widget
return Backbone.View.extend({
+
+ // list of canvas elements
+ canvas: [],
+
// initialize
initialize: function(app, options) {
// link app
@@ -81,22 +85,31 @@
});
},
- // create
- _create_canvas: function(element) {
- // clear canvas
- if (this.canvas) {
- this.canvas.remove();
+ // creates n canvas elements
+ _create_canvas: function(tag, n) {
+ // check size of requested canvas elements
+ n = n || 1;
+
+ // clear previous canvas elements
+ for (var i in this.canvas) {
+ this.canvas[i].remove();
+ this.canvas.slice(i, 0);
}
- // create
- this.$el.append($(this._template_canvas(element)));
-
- // find canvas element
- var canvas_el = this.$el.find('.canvas');
- if (element == 'svg') {
- this.canvas = d3.select(canvas_el[0]);
- } else {
- this.canvas = canvas_el;
+ // create requested canvas elements
+ for (var i = 0; i < n; i++) {
+ // create element
+ var canvas_el = $(this._template_canvas(tag, parseInt(100 / n)));
+
+ // add to view
+ this.$el.append(canvas_el);
+
+ // find canvas element
+ if (tag == 'svg') {
+ this.canvas[i] = d3.select(canvas_el[0]);
+ } else {
+ this.canvas[i] = canvas_el;
+ }
}
},
@@ -114,8 +127,17 @@
// load chart settings
this.chart_settings = this.app.types.get(chart_type);
- // create canvas element
- this._create_canvas(this.chart_settings.element);
+ // read settings
+ var use_panels = this.chart_settings.use_panels;
+
+ // determine number of svg/div-elements to create
+ var n_panels = 1;
+ if (use_panels) {
+ n_panels = chart.groups.length;
+ }
+
+ // create canvas element and add to canvas list
+ this._create_canvas(this.chart_settings.tag, n_panels);
// set chart state
chart.state('wait', 'Please wait...');
@@ -247,8 +269,8 @@
},
// template svg/div element
- _template_canvas: function(element) {
- return '<' + element + ' class="canvas" style="height: 100%;"/>';
+ _template_canvas: function(tag, width) {
+ return '<' + tag + ' class="canvas" style="float: left; display: block; width:' + width + '%; height: 100%;"/>';
}
});
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: martenson: data libraries: API improvements; add datasets from history to folder; folder contents sorting; progressive rendering; new error code; new API endpoint; js model comparators; Galaxy.currUser defensive programming;
by commits-noreply@bitbucket.org 16 Apr '14
by commits-noreply@bitbucket.org 16 Apr '14
16 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/166660f085a5/
Changeset: 166660f085a5
User: martenson
Date: 2014-04-16 22:27:13
Summary: data libraries: API improvements; add datasets from history to folder; folder contents sorting; progressive rendering; new error code; new API endpoint; js model comparators; Galaxy.currUser defensive programming;
Affected #: 14 files
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 lib/galaxy/exceptions/__init__.py
--- a/lib/galaxy/exceptions/__init__.py
+++ b/lib/galaxy/exceptions/__init__.py
@@ -89,6 +89,10 @@
status_code = 403
err_code = error_codes.CONFIG_DOES_NOT_ALLOW
+class InsufficientPermissionsException( MessageException ):
+ status_code = 403
+ err_code = error_codes.INSUFFICIENT_PERMISSIONS
+
class ObjectNotFound( MessageException ):
""" Accessed object was not found """
status_code = 404
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 lib/galaxy/exceptions/error_codes.json
--- a/lib/galaxy/exceptions/error_codes.json
+++ b/lib/galaxy/exceptions/error_codes.json
@@ -75,6 +75,11 @@
"message": "The configuration of this Galaxy instance does not allow that operation"
},
{
+ "name": "INSUFFICIENT_PERMISSIONS",
+ "code": 403005,
+ "message": "You don't have proper permissions to perform the requested operation"
+ },
+ {
"name": "USER_OBJECT_NOT_FOUND",
"code": 404001,
"message": "No such object found."
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 lib/galaxy/webapps/galaxy/api/folder_contents.py
--- a/lib/galaxy/webapps/galaxy/api/folder_contents.py
+++ b/lib/galaxy/webapps/galaxy/api/folder_contents.py
@@ -7,12 +7,12 @@
from galaxy.web import _future_expose_api_anonymous as expose_api_anonymous
from sqlalchemy.orm.exc import MultipleResultsFound
from sqlalchemy.orm.exc import NoResultFound
-from galaxy.web.base.controller import BaseAPIController, UsesLibraryMixin, UsesLibraryMixinItems
+from galaxy.web.base.controller import BaseAPIController, UsesLibraryMixin, UsesLibraryMixinItems, UsesHistoryDatasetAssociationMixin
import logging
log = logging.getLogger( __name__ )
-class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibraryMixinItems ):
+class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibraryMixinItems, UsesHistoryDatasetAssociationMixin ):
"""
Class controls retrieval, creation and updating of folder contents.
"""
@@ -146,6 +146,55 @@
content_items.append( dataset )
return content_items
+ @expose_api
+ def create( self, trans, encoded_folder_id, payload, **kwd ):
+ """
+ create( self, trans, library_id, payload, **kwd )
+ * POST /api/folders/{encoded_id}/contents
+ create a new library file from an HDA
+
+ :param payload: dictionary structure containing:
+ :type payload: dict
+
+ * folder_id: the parent folder of the new item
+ * from_hda_id: (optional) the id of an accessible HDA to copy into the library
+ * ldda_message: (optional) the new message attribute of the LDDA created
+ * extended_metadata: (optional) dub-dictionary containing any extended
+ metadata to associate with the item
+
+ :returns: a dictionary containing the id, name, and 'show' url of the new item
+ :rtype: dict
+ """
+ class_name, encoded_folder_id_16 = self.__decode_library_content_id( trans, encoded_folder_id )
+ from_hda_id, ldda_message = ( payload.pop( 'from_hda_id', None ), payload.pop( 'ldda_message', '' ) )
+ if ldda_message:
+ ldda_message = util.sanitize_html.sanitize_html( ldda_message, 'utf-8' )
+ rval = {}
+ try:
+ hda = self.get_dataset( trans, from_hda_id, check_ownership=True, check_accessible=True, check_state=True )
+ folder = self.get_library_folder( trans, encoded_folder_id_16, check_accessible=True )
+
+ if not self.can_current_user_add_to_library_item( trans, folder ):
+ raise exceptions.InsufficientPermissionsException( 'You do not have proper permissions to add a dataset to a folder with id (%s)' % ( encoded_folder_id ) )
+
+ ldda = self.copy_hda_to_library_folder( trans, hda, folder, ldda_message=ldda_message )
+ ldda_dict = ldda.to_dict()
+ rval = trans.security.encode_dict_ids( ldda_dict )
+
+ except Exception, exc:
+ if 'not accessible to the current user' in str( exc ):
+ raise exceptions.ItemAccessibilityException( 'You do not have access to the requested item' )
+ else:
+ log.exception( exc )
+ raise exceptions.InternalServerError( 'An unknown error ocurred. Please try again.' )
+ return rval
+
+ def __decode_library_content_id( self, trans, encoded_folder_id ):
+ if ( len( encoded_folder_id ) == 17 and encoded_folder_id.startswith( 'F' )):
+ return 'LibraryFolder', encoded_folder_id[1:]
+ else:
+ raise exceptions.MalformedId( 'Malformed folder id ( %s ) specified, unable to decode.' % str( encoded_folder_id ) )
+
@web.expose_api
def show( self, trans, id, library_id, **kwd ):
"""
@@ -154,15 +203,6 @@
raise exceptions.NotImplemented( 'Showing the library folder content is not implemented.' )
@web.expose_api
- def create( self, trans, library_id, payload, **kwd ):
- """
- POST /api/folders/{encoded_folder_id}/contents
- Creates a new folder. This should be superseded by the
- LibraryController.
- """
- raise exceptions.NotImplemented( 'Creating the library folder content is not implemented.' )
-
- @web.expose_api
def update( self, trans, id, library_id, payload, **kwd ):
"""
PUT /api/folders/{encoded_folder_id}/contents
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -224,26 +224,9 @@
action='download',
conditions=dict( method=[ "POST", "GET" ] ) )
- webapp.mapper.connect( 'create_folder',
- '/api/folders/:encoded_parent_folder_id',
- controller='folders',
- action='create',
- conditions=dict( method=[ "POST" ] ) )
-
webapp.mapper.resource_with_deleted( 'library',
'libraries',
path_prefix='/api' )
- webapp.mapper.resource( 'folder',
- 'folders',
- path_prefix='/api' )
-
- webapp.mapper.resource( 'content',
- 'contents',
- controller='folder_contents',
- name_prefix='folder_',
- path_prefix='/api/folders/:folder_id',
- parent_resources=dict( member_name='folder', collection_name='folders' ),
- conditions=dict( method=[ "GET" ] ) )
webapp.mapper.resource( 'content',
'contents',
@@ -257,6 +240,38 @@
path_prefix='/api/libraries/:library_id',
parent_resources=dict( member_name='library', collection_name='libraries' ) )
+ _add_item_extended_metadata_controller( webapp,
+ name_prefix="library_dataset_",
+ path_prefix='/api/libraries/:library_id/contents/:library_content_id' )
+
+ # =======================
+ # ===== FOLDERS API =====
+ # =======================
+
+ webapp.mapper.connect( 'add_history_datasets_to_library',
+ '/api/folders/:encoded_folder_id/contents',
+ controller='folder_contents',
+ action='create',
+ conditions=dict( method=[ "POST" ] ) )
+
+ webapp.mapper.connect( 'create_folder',
+ '/api/folders/:encoded_parent_folder_id',
+ controller='folders',
+ action='create',
+ conditions=dict( method=[ "POST" ] ) )
+
+ webapp.mapper.resource( 'folder',
+ 'folders',
+ path_prefix='/api' )
+
+ webapp.mapper.resource( 'content',
+ 'contents',
+ controller='folder_contents',
+ name_prefix='folder_',
+ path_prefix='/api/folders/:folder_id',
+ parent_resources=dict( member_name='folder', collection_name='folders' ),
+ conditions=dict( method=[ "GET" ] ) )
+
webapp.mapper.resource( 'job',
'jobs',
path_prefix='/api' )
@@ -268,12 +283,7 @@
controller="job_files",
name_prefix="job_",
path_prefix='/api/jobs/:job_id',
- parent_resources=dict( member_name="job", collection_name="jobs")
- )
-
- _add_item_extended_metadata_controller( webapp,
- name_prefix="library_dataset_",
- path_prefix='/api/libraries/:library_id/contents/:library_content_id' )
+ parent_resources=dict( member_name="job", collection_name="jobs" ) )
_add_item_extended_metadata_controller( webapp,
name_prefix="history_dataset_",
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 static/scripts/mvc/library/library-folderlist-view.js
--- a/static/scripts/mvc/library/library-folderlist-view.js
+++ b/static/scripts/mvc/library/library-folderlist-view.js
@@ -23,10 +23,13 @@
folderContainer: null,
+ sort: 'asc',
+
// event binding
events: {
- 'click #select-all-checkboxes' : 'selectAll',
- 'click .dataset_row' : 'selectClickedRow'
+ 'click #select-all-checkboxes' : 'selectAll',
+ 'click .dataset_row' : 'selectClickedRow',
+ 'click .sort-folder-link' : 'sort_clicked'
},
// initialize
initialize : function(options){
@@ -34,12 +37,18 @@
this.options = _.defaults(this.options || {}, options);
this.queue = jQuery.Deferred();
this.queue.resolve();
-
+ this.collection = new mod_library_model.Folder();
+ this.listenTo(this.collection, 'add', this.addOne);
+
this.folderContainer = new mod_library_model.FolderContainer({id: this.options.id});
this.folderContainer.url = this.folderContainer.attributes.urlRoot + this.options.id + '/contents';
this.folderContainer.fetch({
- success: function (folderContainer) {
- that.render();
+ success: function (folder_container) {
+ that.render();
+
+ var items = folder_container.get('folder').models;
+ that.addAll(items);
+
},
error: function(){
mod_toastr.error('An error occured :(');
@@ -54,13 +63,13 @@
// TODO move to server
// prepare nice size strings
- for (var i = 0; i < this.folderContainer.attributes.folder.models.length; i++) {
- var model = this.folderContainer.attributes.folder.models[i];
- if (model.get('type') === 'file'){
- contains_file = true;
- model.set('readable_size', this.size_to_string(model.get('file_size')));
- }
- }
+ // for (var i = 0; i < this.collection.models.length; i++) {
+ // var model = this.collection.models[i];
+ // if (model.get('type') === 'file'){
+ // contains_file = true;
+ // model.set('readable_size', this.size_to_string(model.get('file_size')));
+ // }
+ // }
// TODO move to server
// find the upper id in the full path
@@ -73,16 +82,16 @@
}
// TODO add template when folder is empty
- this.$el.html(template({ path: this.folderContainer.attributes.metadata.full_path, id: this.options.id, upper_folder_id: upper_folder_id }));
+ this.$el.html(template({ path: this.folderContainer.attributes.metadata.full_path, id: this.options.id, upper_folder_id: upper_folder_id, order: this.sort}));
// this.$el.html(template({ path: this.folderContainer.attributes.metadata.full_path, items: this.folderContainer.attributes.folder.models, id: this.options.id, upper_folder_id: upper_folder_id }));
- if (this.folderContainer.attributes.folder.models.length > 0){
+ if (this.collection.models.length > 0){
this.renderRows();
}
// if (this.folderContainer.attributes.metadata.can_add_library_item === true){
- var metadata = this.folderContainer.attributes.metadata;
- metadata.contains_file = contains_file;
- Galaxy.libraries.folderToolbarView.configureElements(metadata);
+ var options = this.folderContainer.attributes.metadata;
+ options.contains_file = this.options.contains_file;
+ Galaxy.libraries.folderToolbarView.configureElements(options);
// Galaxy.libraries.folderToolbarView.configureElements({ can_add_library_item: this.folderContainer.attributes.metadata.can_add_library_item, contains_file: contains_file });
// }
@@ -93,92 +102,128 @@
},
renderRows: function(){
- for (var i = 0; i < this.folderContainer.attributes.folder.models.length; i++) {
- var folder_item = this.folderContainer.attributes.folder.models[i];
+ for (var i = 0; i < this.collection.models.length; i++) {
+ var folder_item = this.collection.models[i];
var rowView = new mod_library_folderrow_view.FolderRowView(folder_item);
this.$el.find('#folder_list_body').append(rowView.el);
}
},
- // convert size to nice string
- size_to_string : function (size){
- // identify unit
- var unit = "";
- if (size >= 100000000000) { size = size / 100000000000; unit = "TB"; } else
- if (size >= 100000000) { size = size / 100000000; unit = "GB"; } else
- if (size >= 100000) { size = size / 100000; unit = "MB"; } else
- if (size >= 100) { size = size / 100; unit = "KB"; } else
- { size = size * 10; unit = "b"; }
- // return formatted string
- return (Math.round(size) / 10) + unit;
+ addAll:function(items){
+ _.each(items.reverse(), function(item) {
+ Galaxy.libraries.folderListView.collection.add(item);
+ });
+ },
+
+ addOne: function(model){
+ if (model.get('type') === 'file'){
+ this.options.contains_file = true;
+ model.set('readable_size', this.size_to_string(model.get('file_size')));
+ }
+ var rowView = new mod_library_folderrow_view.FolderRowView(model);
+ this.$el.find('#folder_list_body').prepend(rowView.el);
+ },
+
+ sort_clicked : function(event){
+ event.preventDefault();
+ if (this.sort === 'asc'){
+ this.sortFolder('name','desc');
+ this.sort = 'desc';
+ } else {
+ this.sortFolder('name','asc');
+ this.sort = 'asc';
+ }
+ this.render();
+ },
+
+ /** Sorts the underlying collection according to the parameters received.
+ Currently supports only sorting by name. */
+ sortFolder: function(sort_by, order){
+ if (sort_by === 'name'){
+ if (order === 'asc'){
+ this.collection.sortByNameAsc();
+ } else if (order === 'desc'){
+ this.collection.sortByNameDesc();
+ }
+ }
+ },
+
+ // convert size to nice string
+ size_to_string : function (size){
+ // identify unit
+ var unit = "";
+ if (size >= 100000000000) { size = size / 100000000000; unit = "TB"; } else
+ if (size >= 100000000) { size = size / 100000000; unit = "GB"; } else
+ if (size >= 100000) { size = size / 100000; unit = "MB"; } else
+ if (size >= 100) { size = size / 100; unit = "KB"; } else
+ { size = size * 10; unit = "b"; }
+ // return formatted string
+ return (Math.round(size) / 10) + unit;
+ },
+
+ // select all datasets
+ selectAll : function (event) {
+ var selected = event.target.checked;
+ that = this;
+ // Iterate each checkbox
+ $(':checkbox').each(function() {
+ this.checked = selected;
+ $row = $(this.parentElement.parentElement);
+ // Change color of selected/unselected
+ (selected) ? that.makeDarkRow($row) : that.makeWhiteRow($row);
+ });
+ // Show the tools in menu
+ // this.checkTools();
+ },
+
+ // Check checkbox on row itself or row checkbox click
+ selectClickedRow : function (event) {
+ var checkbox = '';
+ var $row;
+ var source;
+ if (event.target.localName === 'input'){
+ checkbox = event.target;
+ $row = $(event.target.parentElement.parentElement);
+ source = 'input';
+ } else if (event.target.localName === 'td') {
+ checkbox = $("#" + event.target.parentElement.id).find(':checkbox')[0];
+ $row = $(event.target.parentElement);
+ source = 'td';
+ }
+ if (checkbox.checked){
+ if (source==='td'){
+ checkbox.checked = '';
+ this.makeWhiteRow($row);
+ } else if (source==='input') {
+ this.makeDarkRow($row);
+ }
+ } else {
+ if (source==='td'){
+ checkbox.checked = 'selected';
+ this.makeDarkRow($row);
+ } else if (source==='input') {
+ this.makeWhiteRow($row);
+ }
+ }
},
- // select all datasets
- selectAll : function (event) {
- var selected = event.target.checked;
- that = this;
- // Iterate each checkbox
- $(':checkbox').each(function() {
- this.checked = selected;
- $row = $(this.parentElement.parentElement);
- // Change color of selected/unselected
- (selected) ? that.makeDarkRow($row) : that.makeWhiteRow($row);
- });
- // Show the tools in menu
- // this.checkTools();
- },
+ makeDarkRow: function($row){
+ $row.removeClass('light');
+ $row.find('a').removeClass('light');
+ $row.addClass('dark');
+ $row.find('a').addClass('dark');
+ $row.find('span').removeClass('fa-file-o');
+ $row.find('span').addClass('fa-file');
+ },
- // Check checkbox on row itself or row checkbox click
- selectClickedRow : function (event) {
- var checkbox = '';
- var $row;
- var source;
- if (event.target.localName === 'input'){
- checkbox = event.target;
- $row = $(event.target.parentElement.parentElement);
- source = 'input';
- } else if (event.target.localName === 'td') {
- checkbox = $("#" + event.target.parentElement.id).find(':checkbox')[0];
- $row = $(event.target.parentElement);
- source = 'td';
- }
-
- if (checkbox.checked){
- if (source==='td'){
- checkbox.checked = '';
- this.makeWhiteRow($row);
- } else if (source==='input') {
- this.makeDarkRow($row);
- }
- } else {
- if (source==='td'){
- checkbox.checked = 'selected';
- this.makeDarkRow($row);
- } else if (source==='input') {
- this.makeWhiteRow($row);
- }
- }
- // this.checkTools();
- },
-
- makeDarkRow: function($row){
- $row.removeClass('light');
- $row.find('a').removeClass('light');
- $row.addClass('dark');
- $row.find('a').addClass('dark');
- $row.find('span').removeClass('fa-file-o');
- $row.find('span').addClass('fa-file');
-
- },
-
- makeWhiteRow: function($row){
- $row.removeClass('dark');
- $row.find('a').removeClass('dark');
- $row.addClass('light');
- $row.find('a').addClass('light');
- $row.find('span').addClass('fa-file-o');
- $row.find('span').removeClass('fa-file');
- },
+ makeWhiteRow: function($row){
+ $row.removeClass('dark');
+ $row.find('a').removeClass('dark');
+ $row.addClass('light');
+ $row.find('a').addClass('light');
+ $row.find('span').addClass('fa-file-o');
+ $row.find('span').removeClass('fa-file');
+ },
// MMMMMMMMMMMMMMMMMM
// === TEMPLATES ====
@@ -205,20 +250,20 @@
tmpl_array.push(' <thead>');
tmpl_array.push(' <th class="button_heading"></th>');
tmpl_array.push(' <th style="text-align: center; width: 20px; "><input id="select-all-checkboxes" style="margin: 0;" type="checkbox"></th>');
- tmpl_array.push(' <th>name</th>');
+ tmpl_array.push(' <th><a class="sort-folder-link" title="Click to reverse order" href="#">name</a><span title="Sorted alphabetically" class="fa fa-sort-alpha-<%- order %>"></span></th>');
tmpl_array.push(' <th>data type</th>');
tmpl_array.push(' <th>size</th>');
tmpl_array.push(' <th>time updated (UTC)</th>');
tmpl_array.push(' </thead>');
tmpl_array.push(' <tbody id="folder_list_body">');
- tmpl_array.push(' <tr>');
- tmpl_array.push(' <td><a href="#<% if (upper_folder_id !== 0){ print("folders/" + upper_folder_id)} %>" title="Go to parent folder" class="btn_open_folder btn btn-default btn-xs">..<a></td>');
- tmpl_array.push(' <td></td>');
- tmpl_array.push(' <td></td>');
- tmpl_array.push(' <td></td>');
- tmpl_array.push(' <td></td>');
- tmpl_array.push(' <td></td>');
- tmpl_array.push(' </tr>');
+ // tmpl_array.push(' <tr>');
+ // tmpl_array.push(' <td><a href="#<% if (upper_folder_id !== 0){ print("folders/" + upper_folder_id)} %>" title="Go to parent folder" class="btn_open_folder btn btn-default btn-xs">..<a></td>');
+ // tmpl_array.push(' <td></td>');
+ // tmpl_array.push(' <td></td>');
+ // tmpl_array.push(' <td></td>');
+ // tmpl_array.push(' <td></td>');
+ // tmpl_array.push(' <td></td>');
+ // tmpl_array.push(' </tr>');
tmpl_array.push(' </tbody>');
tmpl_array.push('</table>');
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 static/scripts/mvc/library/library-foldertoolbar-view.js
--- a/static/scripts/mvc/library/library-foldertoolbar-view.js
+++ b/static/scripts/mvc/library/library-foldertoolbar-view.js
@@ -1,4 +1,3 @@
-// dependencies
define([
"galaxy.masthead",
"utils/utils",
@@ -36,7 +35,10 @@
render: function(options){
this.options = _.extend(this.options, options);
var toolbar_template = this.templateToolBar();
- var is_admin = Galaxy.currUser.isAdmin();
+ var is_admin = false;
+ if (Galaxy.currUser){
+ is_admin = Galaxy.currUser.isAdmin();
+ }
this.$el.html(toolbar_template({id: this.options.id, admin_user: is_admin}));
},
@@ -87,9 +89,8 @@
success: function (folder) {
self.modal.hide();
mod_toastr.success('Folder created');
- folder.set({'type' : 'folder'})
- Galaxy.libraries.folderListView.folderContainer.attributes.folder.add(folder);
- Galaxy.libraries.folderListView.render({id: current_folder_id});
+ folder.set({'type' : 'folder'});
+ Galaxy.libraries.folderListView.collection.add(folder);
},
error: function(){
mod_toastr.error('An error occured :(');
@@ -163,8 +164,8 @@
dataset_ids.push(this.parentElement.parentElement.id);
}
});
- var progress_bar_tmpl = this.templateProgressBar();
- $(this.modal.elMain).find('.modal-body').html(progress_bar_tmpl({ history_name : history_name }));
+ var progress_bar_tmpl = this.templateImportIntoHistoryProgressBar();
+ this.modal.$el.find('.modal-body').html(progress_bar_tmpl({ history_name : history_name }));
// init the progress bar
var progressStep = 100 / dataset_ids.length;
@@ -254,15 +255,20 @@
title : 'Add datasets from history to ' + self.options.folder_name,
body : template_modal({histories: self.histories.models}),
buttons : {
- 'Add' : function() {self.addFiles();},
+ 'Add' : function() {self.addAllDatasetsFromHistory();},
'Close' : function() {Galaxy.modal.hide();}
}
});
- self.fetchAndDisplayHistoryContents(self.histories.models[0].id);
- $( "#dataset_add_bulk" ).change(function(event) {
- self.fetchAndDisplayHistoryContents(event.target.value);
- });
-
+
+ // user should always have a history, even anonymous user
+ if (self.histories.models.length > 0){
+ self.fetchAndDisplayHistoryContents(self.histories.models[0].id);
+ $( "#dataset_add_bulk" ).change(function(event) {
+ self.fetchAndDisplayHistoryContents(event.target.value);
+ });
+ } else {
+ mod_toastr.error('Unable to retrieve histories. Please report this error.');
+ }
});
},
@@ -282,8 +288,54 @@
});
},
- addFiles: function(){
- alert('adding files');
+ // add all selected datasets from history into current folder
+ addAllDatasetsFromHistory : function (){
+ //disable the button to prevent multiple submission
+ this.modal.disableButton('Add');
+
+ var history_dataset_ids = [];
+ this.modal.$el.find('#selected_history_content').find(':checked').each(function(){
+ var hid = $(this.parentElement).data('id');
+ if (hid) {
+ history_dataset_ids.push(hid);
+ }
+ });
+ var folder_name = this.options.folder_name;
+ var progress_bar_tmpl = this.templateAddingDatasetsProgressBar();
+ this.modal.$el.find('.modal-body').html(progress_bar_tmpl({ folder_name : folder_name }));
+
+ // init the progress bar
+ this.progressStep = 100 / history_dataset_ids.length;
+ this.progress = 0;
+
+ // prepare the dataset items to be added
+ var hdas_to_add = [];
+ for (var i = history_dataset_ids.length - 1; i >= 0; i--) {
+ history_dataset_id = history_dataset_ids[i];
+ var folder_item = new mod_library_model.Item();
+ var self = this;
+ folder_item.url = '/api/folders/' + this.options.id + '/contents';
+ folder_item.set({'from_hda_id':history_dataset_id});
+ hdas_to_add.push(folder_item);
+ }
+ // call the recursive function to call ajax one after each other (request FIFO queue)
+ this.chainCallAddingHdas(hdas_to_add);
+ },
+
+ chainCallAddingHdas: function(hdas_set){
+ var self = this;
+ this.added_hdas = new mod_library_model.Folder();
+ var popped_item = hdas_set.pop();
+ if (typeof popped_item === "undefined") {
+ mod_toastr.success('Selected datasets from history imported');
+ this.modal.hide();
+ return this.added_hdas;
+ }
+ var promise = $.when(popped_item.save({from_hda_id: popped_item.get('from_hda_id')})).done(function(a1){
+ Galaxy.libraries.folderListView.collection.add(a1);
+ self.updateProgress();
+ self.chainCallAddingHdas(hdas_set);
+ });
},
templateToolBar: function(){
@@ -345,7 +397,7 @@
return _.template(tmpl_array.join(''));
},
- templateProgressBar : function (){
+ templateImportIntoHistoryProgressBar : function (){
var tmpl_array = [];
tmpl_array.push('<div class="import_text">');
@@ -361,6 +413,22 @@
return _.template(tmpl_array.join(''));
},
+ templateAddingDatasetsProgressBar : function (){
+ var tmpl_array = [];
+
+ tmpl_array.push('<div class="import_text">');
+ tmpl_array.push('Adding selected datasets from history to library folder <b><%= _.escape(folder_name) %></b>');
+ tmpl_array.push('</div>');
+ tmpl_array.push('<div class="progress">');
+ tmpl_array.push(' <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');
+ tmpl_array.push(' <span class="completion_span">0% Complete</span>');
+ tmpl_array.push(' </div>');
+ tmpl_array.push('</div>');
+ tmpl_array.push('');
+
+ return _.template(tmpl_array.join(''));
+ },
+
templateAddFilesInModal : function (){
var tmpl_array = [];
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 static/scripts/mvc/library/library-librarylist-view.js
--- a/static/scripts/mvc/library/library-librarylist-view.js
+++ b/static/scripts/mvc/library/library-librarylist-view.js
@@ -1,4 +1,3 @@
-// dependencies
define([
"galaxy.masthead",
"mvc/base-mvc",
@@ -13,7 +12,6 @@
mod_library_model,
mod_library_libraryrow_view) {
-// galaxy library view
var LibraryListView = Backbone.View.extend({
el: '#libraries_element',
@@ -23,6 +21,7 @@
modal: null,
+ // collection of {Item}s
collection: null,
// map of library model ids to library views = cache
@@ -115,21 +114,10 @@
sortLibraries: function(sort_by, order){
if (sort_by === 'name'){
if (order === 'asc'){
- // this.collection.sort_order = 'asc';
- this.collection.comparator = function(libraryA, libraryB){
- if (libraryA.get('name').toLowerCase() > libraryB.get('name').toLowerCase()) {return 1;} // after
- if (libraryB.get('name').toLowerCase() > libraryA.get('name').toLowerCase()) {return -1;} // before
- return 0; // equal
- };
+ this.collection.sortByNameAsc();
} else if (order === 'desc'){
- // this.collection.sort_order = 'desc';
- this.collection.comparator = function(libraryA, libraryB){
- if (libraryA.get('name').toLowerCase() > libraryB.get('name').toLowerCase()) {return -1;} // before
- if (libraryB.get('name').toLowerCase() > libraryA.get('name').toLowerCase()) {return 1;} // after
- return 0; // equal
- };
+ this.collection.sortByNameDesc();
}
- this.collection.sort();
}
},
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 static/scripts/mvc/library/library-librarytoolbar-view.js
--- a/static/scripts/mvc/library/library-librarytoolbar-view.js
+++ b/static/scripts/mvc/library/library-librarytoolbar-view.js
@@ -1,4 +1,3 @@
-// dependencies
define([
"galaxy.masthead",
"utils/utils",
@@ -23,10 +22,16 @@
render: function(){
var toolbar_template = this.templateToolBar();
- var is_admin = Galaxy.currUser.isAdmin();
- var is_anonym = Galaxy.currUser.isAnonymous();
+ var is_admin = false;
+ var is_anonym = false;
+ if (Galaxy.currUser){
+ is_admin = Galaxy.currUser.isAdmin();
+ is_anonym = Galaxy.currUser.isAnonymous();
+ } else {
+ is_anonym = true;
+ }
this.$el.html(toolbar_template({admin_user: is_admin, anon_user: is_anonym}));
- if (Galaxy.currUser.isAdmin() === true){
+ if (is_admin){
this.$el.find('#include_deleted_chk')[0].checked = Galaxy.libraries.preferences.get('with_deleted');
}
},
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 static/scripts/mvc/library/library-model.js
--- a/static/scripts/mvc/library/library-model.js
+++ b/static/scripts/mvc/library/library-model.js
@@ -1,13 +1,13 @@
-// dependencies
define([], function() {
- // LIBRARY
+// ============================================================================
+// LIBRARY RELATED MODELS
+
var Library = Backbone.Model.extend({
urlRoot: '/api/libraries/',
- /** based on show_deleted
- * would this lib show in the list of lib's?
- * @param {Boolean} show_deleted are we showing deleted libraries?
+ /** based on show_deleted would this lib show in the list of lib's?
+ * @param {Boolean} show_deleted are we including deleted libraries?
*/
isVisible : function(show_deleted){
var isVisible = true;
@@ -18,12 +18,6 @@
}
});
- // FOLDER AS MODEL
- var FolderAsModel = Backbone.Model.extend({
- urlRoot: '/api/folders'
- });
-
- // LIBRARIES
var Libraries = Backbone.Collection.extend({
url: '/api/libraries',
@@ -38,31 +32,119 @@
},
/** Get every 'shown' library in this collection based on deleted filter
- * @param {Boolean} show_deleted are we showing deleted libraries?
+ * @param {Boolean} show_deleted are we including deleted libraries?
* @returns array of library models
*/
getVisible : function(show_deleted, filters){
filters = filters || [];
- // always filter by show deleted first
var filteredLibraries = new Libraries( this.filter( function( item ){
return item.isVisible(show_deleted);
}));
return filteredLibraries;
+ },
+
+ /** Sort collection by library name (ascending) and return the sorted
+ * collection
+ */
+ sortByNameAsc: function(){
+ this.comparator = function(libraryA, libraryB){
+ if (libraryA.get('name').toLowerCase() > libraryB.get('name').toLowerCase()) {
+ return 1; // after
+ }
+ if (libraryB.get('name').toLowerCase() > libraryA.get('name').toLowerCase()) {
+ return -1; // before
+ }
+ return 0; // equal
+ };
+ this.sort();
+ return this;
+ },
+
+ /** Sort collection by library name (descending) and return the sorted
+ * collection
+ */
+ sortByNameDesc: function(){
+ this.comparator = function(libraryA, libraryB){
+ if (libraryA.get('name').toLowerCase() > libraryB.get('name').toLowerCase()) {
+ return -1; // before
+ }
+ if (libraryB.get('name').toLowerCase() > libraryA.get('name').toLowerCase()) {
+ return 1; // after
+ }
+ return 0; // equal
+ };
+ this.sort();
+ return this;
}
+
});
- // ITEM
+// ============================================================================
+// FOLDER RELATED MODELS
+
var Item = Backbone.Model.extend({
urlRoot : '/api/libraries/datasets'
});
- // FOLDER AS COLLECTION
- var Folder = Backbone.Collection.extend({
- model: Item
+ var FolderAsModel = Backbone.Model.extend({
+ urlRoot: '/api/folders'
});
- // CONTAINER for folder contents (folders, items and metadata).
+ var Folder = Backbone.Collection.extend({
+ model: Item,
+
+ /** Sort collection by item name (ascending) and return the sorted
+ * collection. Folders go before datasets.
+ */
+ sortByNameAsc: function(){
+ this.comparator = function(itemA, itemB){
+ if (itemA.get('type') === itemB.get('type')){
+ if (itemA.get('name').toLowerCase() > itemB.get('name').toLowerCase()) {
+ return 1; // after
+ }
+ if (itemB.get('name').toLowerCase() > itemA.get('name').toLowerCase()) {
+ return -1; // before
+ }
+ return 0; // equal
+ } else {
+ if (itemA.get('type') === 'folder'){
+ return -1; // folder is always before dataset
+ } else {
+ return 1;
+ }
+ }
+ };
+ this.sort();
+ return this;
+ },
+
+ /** Sort collection by item name (descending) and return the sorted
+ * collection. Folders go before datasets.
+ */
+ sortByNameDesc: function(){
+ this.comparator = function(itemA, itemB){
+ if (itemA.get('type') === itemB.get('type')){
+ if (itemA.get('name').toLowerCase() > itemB.get('name').toLowerCase()) {
+ return -1; // after
+ }
+ if (itemB.get('name').toLowerCase() > itemA.get('name').toLowerCase()) {
+ return 1; // before
+ }
+ return 0; // equal
+ } else {
+ if (itemA.get('type') === 'folder'){
+ return -1; // folder is always before dataset
+ } else {
+ return 1;
+ }
+ }
+ };
+ this.sort();
+ return this;
+ }
+ });
+
var FolderContainer = Backbone.Model.extend({
defaults : {
folder : new Folder(),
@@ -77,12 +159,15 @@
}
});
- // HISTORY ITEM
+
+// ============================================================================
+// HISTORY RELATED MODELS
+// TODO UNITE
+
var HistoryItem = Backbone.Model.extend({
urlRoot : '/api/histories/'
});
- // HISTORY CONTENTS
var HistoryContents = Backbone.Collection.extend({
urlRoot : '/api/histories/',
initialize: function(options){
@@ -94,18 +179,15 @@
model : HistoryItem
});
- // HISTORY
var GalaxyHistory = Backbone.Model.extend({
urlRoot : '/api/histories/'
});
- // HISTORIES
var GalaxyHistories = Backbone.Collection.extend({
url : '/api/histories',
model : GalaxyHistory
});
-// return
return {
Library: Library,
FolderAsModel : FolderAsModel,
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 static/scripts/packed/mvc/library/library-folderlist-view.js
--- a/static/scripts/packed/mvc/library/library-folderlist-view.js
+++ b/static/scripts/packed/mvc/library/library-folderlist-view.js
@@ -1,1 +1,1 @@
-define(["galaxy.masthead","utils/utils","libs/toastr","mvc/library/library-model","mvc/library/library-folderrow-view"],function(c,e,f,d,a){var b=Backbone.View.extend({el:"#folder_items_element",progress:0,progressStep:1,modal:null,folderContainer:null,events:{"click #select-all-checkboxes":"selectAll","click .dataset_row":"selectClickedRow"},initialize:function(g){var h=this;this.options=_.defaults(this.options||{},g);this.queue=jQuery.Deferred();this.queue.resolve();this.folderContainer=new d.FolderContainer({id:this.options.id});this.folderContainer.url=this.folderContainer.attributes.urlRoot+this.options.id+"/contents";this.folderContainer.fetch({success:function(i){h.render()},error:function(){f.error("An error occured :(")}})},render:function(h){this.options=_.defaults(this.options||{},h);var l=this.templateFolder();var m=false;for(var k=0;k<this.folderContainer.attributes.folder.models.length;k++){var g=this.folderContainer.attributes.folder.models[k];if(g.get("type")==="file"){m=true;g.set("readable_size",this.size_to_string(g.get("file_size")))}}var n=this.folderContainer.attributes.metadata.full_path;var o;if(n.length===1){o=0}else{o=n[n.length-2][0]}this.$el.html(l({path:this.folderContainer.attributes.metadata.full_path,id:this.options.id,upper_folder_id:o}));if(this.folderContainer.attributes.folder.models.length>0){this.renderRows()}var j=this.folderContainer.attributes.metadata;j.contains_file=m;Galaxy.libraries.folderToolbarView.configureElements(j);$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},renderRows:function(){for(var j=0;j<this.folderContainer.attributes.folder.models.length;j++){var h=this.folderContainer.attributes.folder.models[j];var g=new a.FolderRowView(h);this.$el.find("#folder_list_body").append(g.el)}},size_to_string:function(g){var h="";if(g>=100000000000){g=g/100000000000;h="TB"}else{if(g>=100000000){g=g/100000000;h="GB"}else{if(g>=100000){g=g/100000;h="MB"}else{if(g>=100){g=g/100;h="KB"}else{g=g*10;h="b"}}}}return(Math.round(g)/10)+h},selectAll:function(h){var g=h.target.checked;that=this;$(":checkbox").each(function(){this.checked=g;$row=$(this.parentElement.parentElement);(g)?that.makeDarkRow($row):that.makeWhiteRow($row)})},selectClickedRow:function(h){var j="";var g;var i;if(h.target.localName==="input"){j=h.target;g=$(h.target.parentElement.parentElement);i="input"}else{if(h.target.localName==="td"){j=$("#"+h.target.parentElement.id).find(":checkbox")[0];g=$(h.target.parentElement);i="td"}}if(j.checked){if(i==="td"){j.checked="";this.makeWhiteRow(g)}else{if(i==="input"){this.makeDarkRow(g)}}}else{if(i==="td"){j.checked="selected";this.makeDarkRow(g)}else{if(i==="input"){this.makeWhiteRow(g)}}}},makeDarkRow:function(g){g.removeClass("light");g.find("a").removeClass("light");g.addClass("dark");g.find("a").addClass("dark");g.find("span").removeClass("fa-file-o");g.find("span").addClass("fa-file")},makeWhiteRow:function(g){g.removeClass("dark");g.find("a").removeClass("dark");g.addClass("light");g.find("a").addClass("light");g.find("span").addClass("fa-file-o");g.find("span").removeClass("fa-file")},templateFolder:function(){var g=[];g.push('<ol class="breadcrumb">');g.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');g.push(" <% _.each(path, function(path_item) { %>");g.push(" <% if (path_item[0] != id) { %>");g.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');g.push("<% } else { %>");g.push(' <li class="active"><span title="You are in this folder"><%- path_item[1] %></span></li>');g.push(" <% } %>");g.push(" <% }); %>");g.push("</ol>");g.push('<table id="folder_table" class="grid table table-condensed">');g.push(" <thead>");g.push(' <th class="button_heading"></th>');g.push(' <th style="text-align: center; width: 20px; "><input id="select-all-checkboxes" style="margin: 0;" type="checkbox"></th>');g.push(" <th>name</th>");g.push(" <th>data type</th>");g.push(" <th>size</th>");g.push(" <th>time updated (UTC)</th>");g.push(" </thead>");g.push(' <tbody id="folder_list_body">');g.push(" <tr>");g.push(' <td><a href="#<% if (upper_folder_id !== 0){ print("folders/" + upper_folder_id)} %>" title="Go to parent folder" class="btn_open_folder btn btn-default btn-xs">..<a></td>');g.push(" <td></td>");g.push(" <td></td>");g.push(" <td></td>");g.push(" <td></td>");g.push(" <td></td>");g.push(" </tr>");g.push(" </tbody>");g.push("</table>");return _.template(g.join(""))}});return{FolderListView:b}});
\ No newline at end of file
+define(["galaxy.masthead","utils/utils","libs/toastr","mvc/library/library-model","mvc/library/library-folderrow-view"],function(c,e,f,d,a){var b=Backbone.View.extend({el:"#folder_items_element",progress:0,progressStep:1,modal:null,folderContainer:null,sort:"asc",events:{"click #select-all-checkboxes":"selectAll","click .dataset_row":"selectClickedRow","click .sort-folder-link":"sort_clicked"},initialize:function(g){var h=this;this.options=_.defaults(this.options||{},g);this.queue=jQuery.Deferred();this.queue.resolve();this.collection=new d.Folder();this.listenTo(this.collection,"add",this.addOne);this.folderContainer=new d.FolderContainer({id:this.options.id});this.folderContainer.url=this.folderContainer.attributes.urlRoot+this.options.id+"/contents";this.folderContainer.fetch({success:function(i){h.render();var j=i.get("folder").models;h.addAll(j)},error:function(){f.error("An error occured :(")}})},render:function(g){this.options=_.defaults(this.options||{},g);var h=this.templateFolder();var i=false;var j=this.folderContainer.attributes.metadata.full_path;var k;if(j.length===1){k=0}else{k=j[j.length-2][0]}this.$el.html(h({path:this.folderContainer.attributes.metadata.full_path,id:this.options.id,upper_folder_id:k,order:this.sort}));if(this.collection.models.length>0){this.renderRows()}var g=this.folderContainer.attributes.metadata;g.contains_file=this.options.contains_file;Galaxy.libraries.folderToolbarView.configureElements(g);$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},renderRows:function(){for(var j=0;j<this.collection.models.length;j++){var h=this.collection.models[j];var g=new a.FolderRowView(h);this.$el.find("#folder_list_body").append(g.el)}},addAll:function(g){_.each(g.reverse(),function(h){Galaxy.libraries.folderListView.collection.add(h)})},addOne:function(h){if(h.get("type")==="file"){this.options.contains_file=true;h.set("readable_size",this.size_to_string(h.get("file_size")))}var g=new a.FolderRowView(h);this.$el.find("#folder_list_body").prepend(g.el)},sort_clicked:function(g){g.preventDefault();if(this.sort==="asc"){this.sortFolder("name","desc");this.sort="desc"}else{this.sortFolder("name","asc");this.sort="asc"}this.render()},sortFolder:function(h,g){if(h==="name"){if(g==="asc"){this.collection.sortByNameAsc()}else{if(g==="desc"){this.collection.sortByNameDesc()}}}},size_to_string:function(g){var h="";if(g>=100000000000){g=g/100000000000;h="TB"}else{if(g>=100000000){g=g/100000000;h="GB"}else{if(g>=100000){g=g/100000;h="MB"}else{if(g>=100){g=g/100;h="KB"}else{g=g*10;h="b"}}}}return(Math.round(g)/10)+h},selectAll:function(h){var g=h.target.checked;that=this;$(":checkbox").each(function(){this.checked=g;$row=$(this.parentElement.parentElement);(g)?that.makeDarkRow($row):that.makeWhiteRow($row)})},selectClickedRow:function(h){var j="";var g;var i;if(h.target.localName==="input"){j=h.target;g=$(h.target.parentElement.parentElement);i="input"}else{if(h.target.localName==="td"){j=$("#"+h.target.parentElement.id).find(":checkbox")[0];g=$(h.target.parentElement);i="td"}}if(j.checked){if(i==="td"){j.checked="";this.makeWhiteRow(g)}else{if(i==="input"){this.makeDarkRow(g)}}}else{if(i==="td"){j.checked="selected";this.makeDarkRow(g)}else{if(i==="input"){this.makeWhiteRow(g)}}}},makeDarkRow:function(g){g.removeClass("light");g.find("a").removeClass("light");g.addClass("dark");g.find("a").addClass("dark");g.find("span").removeClass("fa-file-o");g.find("span").addClass("fa-file")},makeWhiteRow:function(g){g.removeClass("dark");g.find("a").removeClass("dark");g.addClass("light");g.find("a").addClass("light");g.find("span").addClass("fa-file-o");g.find("span").removeClass("fa-file")},templateFolder:function(){var g=[];g.push('<ol class="breadcrumb">');g.push(' <li><a title="Return to the list of libraries" href="#">Libraries</a></li>');g.push(" <% _.each(path, function(path_item) { %>");g.push(" <% if (path_item[0] != id) { %>");g.push(' <li><a title="Return to this folder" href="#/folders/<%- path_item[0] %>"><%- path_item[1] %></a></li> ');g.push("<% } else { %>");g.push(' <li class="active"><span title="You are in this folder"><%- path_item[1] %></span></li>');g.push(" <% } %>");g.push(" <% }); %>");g.push("</ol>");g.push('<table id="folder_table" class="grid table table-condensed">');g.push(" <thead>");g.push(' <th class="button_heading"></th>');g.push(' <th style="text-align: center; width: 20px; "><input id="select-all-checkboxes" style="margin: 0;" type="checkbox"></th>');g.push(' <th><a class="sort-folder-link" title="Click to reverse order" href="#">name</a><span title="Sorted alphabetically" class="fa fa-sort-alpha-<%- order %>"></span></th>');g.push(" <th>data type</th>");g.push(" <th>size</th>");g.push(" <th>time updated (UTC)</th>");g.push(" </thead>");g.push(' <tbody id="folder_list_body">');g.push(" </tbody>");g.push("</table>");return _.template(g.join(""))}});return{FolderListView:b}});
\ No newline at end of file
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 static/scripts/packed/mvc/library/library-foldertoolbar-view.js
--- a/static/scripts/packed/mvc/library/library-foldertoolbar-view.js
+++ b/static/scripts/packed/mvc/library/library-foldertoolbar-view.js
@@ -1,1 +1,1 @@
-define(["galaxy.masthead","utils/utils","libs/toastr","mvc/library/library-model"],function(b,d,e,c){var a=Backbone.View.extend({el:"#center",events:{"click #toolbtn_create_folder":"createFolderFromModal","click #toolbtn_bulk_import":"modalBulkImport","click .toolbtn_add_files":"addFilesToFolderModal"},defaults:{can_add_library_item:false,contains_file:false},modal:null,histories:null,initialize:function(f){this.options=_.defaults(f||{},this.defaults);this.render()},render:function(f){this.options=_.extend(this.options,f);var h=this.templateToolBar();var g=Galaxy.currUser.isAdmin();this.$el.html(h({id:this.options.id,admin_user:g}))},configureElements:function(f){this.options=_.extend(this.options,f);if(this.options.can_add_library_item===true){$("#toolbtn_create_folder").show();$(".toolbtn_add_files").show()}if(this.options.contains_file===true){$("#toolbtn_bulk_import").show();$("#toolbtn_dl").show()}this.$el.find("[data-toggle]").tooltip()},createFolderFromModal:function(){event.preventDefault();event.stopPropagation();var f=this;var g=this.templateNewFolderInModal();this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Create New Folder",body:g(),buttons:{Create:function(){f.create_new_folder_event()},Close:function(){Galaxy.modal.hide()}}})},create_new_folder_event:function(){var f=this.serialize_new_folder();if(this.validate_new_folder(f)){var h=new c.FolderAsModel();url_items=Backbone.history.fragment.split("/");current_folder_id=url_items[url_items.length-1];h.url=h.urlRoot+"/"+current_folder_id;var g=this;h.save(f,{success:function(i){g.modal.hide();e.success("Folder created");i.set({type:"folder"});Galaxy.libraries.folderListView.folderContainer.attributes.folder.add(i);Galaxy.libraries.folderListView.render({id:current_folder_id})},error:function(){e.error("An error occured :(")}})}else{e.error("Folder's name is missing")}return false},serialize_new_folder:function(){return{name:$("input[name='Name']").val(),description:$("input[name='Description']").val()}},validate_new_folder:function(f){return f.name!==""},modalBulkImport:function(){var f=$("#folder_table").find(":checked");if(f.length===0){e.info("You have to select some datasets first")}else{this.refreshUserHistoriesList(function(g){var h=g.templateBulkImportInModal();g.modal=Galaxy.modal;g.modal.show({closing_events:true,title:"Import into History",body:h({histories:g.histories.models}),buttons:{Import:function(){g.importAllIntoHistory()},Close:function(){Galaxy.modal.hide()}}})})}},refreshUserHistoriesList:function(g){var f=this;this.histories=new c.GalaxyHistories();this.histories.fetch({success:function(){g(f)},error:function(){}})},importAllIntoHistory:function(){this.modal.disableButton("Import");var h=$("select[name=dataset_import_bulk] option:selected").val();var m=$("select[name=dataset_import_bulk] option:selected").text();var o=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!==""){o.push(this.parentElement.parentElement.id)}});var n=this.templateProgressBar();$(this.modal.elMain).find(".modal-body").html(n({history_name:m}));var j=100/o.length;this.initProgress(j);var f=[];for(var g=o.length-1;g>=0;g--){library_dataset_id=o[g];var k=new c.HistoryItem();var l=this;k.url=k.urlRoot+h+"/contents";k.content=library_dataset_id;k.source="library";f.push(k)}this.chainCall(f)},chainCall:function(g){var f=this;var h=g.pop();if(typeof h==="undefined"){e.success("All datasets imported");this.modal.hide();return}var i=$.when(h.save({content:h.content,source:h.source})).done(function(j){f.updateProgress();f.chainCall(g)})},initProgress:function(f){this.progress=0;this.progressStep=f},updateProgress:function(){this.progress+=this.progressStep;$(".progress-bar-import").width(Math.round(this.progress)+"%");txt_representation=Math.round(this.progress)+"% Complete";$(".completion_span").text(txt_representation)},download:function(f,j){var h=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!==""){h.push(this.parentElement.parentElement.id)}});var g="/api/libraries/datasets/download/"+j;var i={ldda_ids:h};this.processDownload(g,i,"get")},processDownload:function(g,h,i){if(g&&h){h=typeof h=="string"?h:$.param(h);var f="";$.each(h.split("&"),function(){var j=this.split("=");f+='<input type="hidden" name="'+j[0]+'" value="'+j[1]+'" />'});$('<form action="'+g+'" method="'+(i||"post")+'">'+f+"</form>").appendTo("body").submit().remove();e.info("Your download will begin soon")}},addFilesToFolderModal:function(){this.refreshUserHistoriesList(function(f){f.modal=Galaxy.modal;var g=f.templateAddFilesInModal();f.modal.show({closing_events:true,title:"Add datasets from history to "+f.options.folder_name,body:g({histories:f.histories.models}),buttons:{Add:function(){f.addFiles()},Close:function(){Galaxy.modal.hide()}}});f.fetchAndDisplayHistoryContents(f.histories.models[0].id);$("#dataset_add_bulk").change(function(h){f.fetchAndDisplayHistoryContents(h.target.value)})})},fetchAndDisplayHistoryContents:function(h){var g=new c.HistoryContents({id:h});var f=this;g.fetch({success:function(j){var i=f.templateHistoryContents();e.success("history contents fetched");f.histories.get(h).set({contents:j});f.modal.$el.find("#selected_history_content").html(i({history_contents:j.models.reverse()}))},error:function(){e.error("history contents fetch failed")}})},addFiles:function(){alert("adding files")},templateToolBar:function(){tmpl_array=[];tmpl_array.push('<div class="library_style_container">');tmpl_array.push('<h3>Data Libraries Beta Test. This is work in progress. Please report problems & ideas via <a href="mailto:galaxy-bugs@bx.psu.edu?Subject=DataLibrariesBeta_Feedback" target="_blank">email</a> and <a href="https://trello.com/c/nwYQNFPK/56-data-library-ui-progressive-display-of-fol…" target="_blank">Trello</a>.</h3>');tmpl_array.push('<div id="library_folder_toolbar" >');tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Create New Folder" id="toolbtn_create_folder" class="primary-button" type="button" style="display:none;"><span class="fa fa-plus"></span><span class="fa fa-folder"></span></button>');tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Add Datasets to Current Folder" id="toolbtn_add_files" class="toolbtn_add_files primary-button" type="button" style="display:none;"><span class="fa fa-plus"></span><span class="fa fa-file"></span></span></button>');tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Import selected datasets into history" id="toolbtn_bulk_import" class="primary-button" style="margin-left: 0.5em; display:none;" type="button"><span class="fa fa-book"></span> to history</button>');tmpl_array.push(' <div id="toolbtn_dl" class="btn-group" style="margin-left: 0.5em; display:none; ">');tmpl_array.push(' <button title="Download selected datasets" id="drop_toggle" type="button" class="primary-button dropdown-toggle" data-toggle="dropdown">');tmpl_array.push(' <span class="fa fa-download"></span> download <span class="caret"></span>');tmpl_array.push(" </button>");tmpl_array.push(' <ul class="dropdown-menu" role="menu">');tmpl_array.push(' <li id="download_archive"><a href="#/folders/<%= id %>/download/tgz">.tar.gz</a></li>');tmpl_array.push(' <li id="download_archive"><a href="#/folders/<%= id %>/download/tbz">.tar.bz</a></li>');tmpl_array.push(' <li id="download_archive"><a href="#/folders/<%= id %>/download/zip">.zip</a></li>');tmpl_array.push(" </ul>");tmpl_array.push(" </div>");tmpl_array.push(" </div>");tmpl_array.push(' <div id="folder_items_element">');tmpl_array.push(" </div>");tmpl_array.push("</div>");return _.template(tmpl_array.join(""))},templateNewFolderInModal:function(){tmpl_array=[];tmpl_array.push('<div id="new_folder_modal">');tmpl_array.push("<form>");tmpl_array.push('<input type="text" name="Name" value="" placeholder="Name">');tmpl_array.push('<input type="text" name="Description" value="" placeholder="Description">');tmpl_array.push("</form>");tmpl_array.push("</div>");return _.template(tmpl_array.join(""))},templateBulkImportInModal:function(){var f=[];f.push('<span id="history_modal_combo_bulk" style="width:90%; margin-left: 1em; margin-right: 1em; ">');f.push("Select history: ");f.push('<select id="dataset_import_bulk" name="dataset_import_bulk" style="width:50%; margin-bottom: 1em; "> ');f.push(" <% _.each(histories, function(history) { %>");f.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');f.push(" <% }); %>");f.push("</select>");f.push("</span>");return _.template(f.join(""))},templateProgressBar:function(){var f=[];f.push('<div class="import_text">');f.push("Importing selected datasets to history <b><%= _.escape(history_name) %></b>");f.push("</div>");f.push('<div class="progress">');f.push(' <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');f.push(' <span class="completion_span">0% Complete</span>');f.push(" </div>");f.push("</div>");f.push("");return _.template(f.join(""))},templateAddFilesInModal:function(){var f=[];f.push('<div id="add_files_modal">');f.push('<div id="history_modal_combo_bulk">');f.push("Select history: ");f.push('<select id="dataset_add_bulk" name="dataset_add_bulk" style="width:66%; "> ');f.push(" <% _.each(histories, function(history) { %>");f.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');f.push(" <% }); %>");f.push("</select>");f.push("</div>");f.push('<div id="selected_history_content">');f.push("</div>");f.push("</div>");return _.template(f.join(""))},templateHistoryContents:function(){var f=[];f.push("Choose the datasets to import:");f.push("<ul>");f.push(" <% _.each(history_contents, function(history_item) { %>");f.push(' <li data-id="<%= _.escape(history_item.get("id")) %>">');f.push(' <input style="margin: 0;" type="checkbox"><%= _.escape(history_item.get("hid")) %>: <%= _.escape(history_item.get("name")) %>');f.push(" </li>");f.push(" <% }); %>");f.push("</ul>");return _.template(f.join(""))}});return{FolderToolbarView:a}});
\ No newline at end of file
+define(["galaxy.masthead","utils/utils","libs/toastr","mvc/library/library-model"],function(b,d,e,c){var a=Backbone.View.extend({el:"#center",events:{"click #toolbtn_create_folder":"createFolderFromModal","click #toolbtn_bulk_import":"modalBulkImport","click .toolbtn_add_files":"addFilesToFolderModal"},defaults:{can_add_library_item:false,contains_file:false},modal:null,histories:null,initialize:function(f){this.options=_.defaults(f||{},this.defaults);this.render()},render:function(f){this.options=_.extend(this.options,f);var h=this.templateToolBar();var g=false;if(Galaxy.currUser){g=Galaxy.currUser.isAdmin()}this.$el.html(h({id:this.options.id,admin_user:g}))},configureElements:function(f){this.options=_.extend(this.options,f);if(this.options.can_add_library_item===true){$("#toolbtn_create_folder").show();$(".toolbtn_add_files").show()}if(this.options.contains_file===true){$("#toolbtn_bulk_import").show();$("#toolbtn_dl").show()}this.$el.find("[data-toggle]").tooltip()},createFolderFromModal:function(){event.preventDefault();event.stopPropagation();var f=this;var g=this.templateNewFolderInModal();this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Create New Folder",body:g(),buttons:{Create:function(){f.create_new_folder_event()},Close:function(){Galaxy.modal.hide()}}})},create_new_folder_event:function(){var f=this.serialize_new_folder();if(this.validate_new_folder(f)){var h=new c.FolderAsModel();url_items=Backbone.history.fragment.split("/");current_folder_id=url_items[url_items.length-1];h.url=h.urlRoot+"/"+current_folder_id;var g=this;h.save(f,{success:function(i){g.modal.hide();e.success("Folder created");i.set({type:"folder"});Galaxy.libraries.folderListView.collection.add(i)},error:function(){e.error("An error occured :(")}})}else{e.error("Folder's name is missing")}return false},serialize_new_folder:function(){return{name:$("input[name='Name']").val(),description:$("input[name='Description']").val()}},validate_new_folder:function(f){return f.name!==""},modalBulkImport:function(){var f=$("#folder_table").find(":checked");if(f.length===0){e.info("You have to select some datasets first")}else{this.refreshUserHistoriesList(function(g){var h=g.templateBulkImportInModal();g.modal=Galaxy.modal;g.modal.show({closing_events:true,title:"Import into History",body:h({histories:g.histories.models}),buttons:{Import:function(){g.importAllIntoHistory()},Close:function(){Galaxy.modal.hide()}}})})}},refreshUserHistoriesList:function(g){var f=this;this.histories=new c.GalaxyHistories();this.histories.fetch({success:function(){g(f)},error:function(){}})},importAllIntoHistory:function(){this.modal.disableButton("Import");var h=$("select[name=dataset_import_bulk] option:selected").val();var m=$("select[name=dataset_import_bulk] option:selected").text();var o=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!==""){o.push(this.parentElement.parentElement.id)}});var n=this.templateImportIntoHistoryProgressBar();this.modal.$el.find(".modal-body").html(n({history_name:m}));var j=100/o.length;this.initProgress(j);var f=[];for(var g=o.length-1;g>=0;g--){library_dataset_id=o[g];var k=new c.HistoryItem();var l=this;k.url=k.urlRoot+h+"/contents";k.content=library_dataset_id;k.source="library";f.push(k)}this.chainCall(f)},chainCall:function(g){var f=this;var h=g.pop();if(typeof h==="undefined"){e.success("All datasets imported");this.modal.hide();return}var i=$.when(h.save({content:h.content,source:h.source})).done(function(j){f.updateProgress();f.chainCall(g)})},initProgress:function(f){this.progress=0;this.progressStep=f},updateProgress:function(){this.progress+=this.progressStep;$(".progress-bar-import").width(Math.round(this.progress)+"%");txt_representation=Math.round(this.progress)+"% Complete";$(".completion_span").text(txt_representation)},download:function(f,j){var h=[];$("#folder_table").find(":checked").each(function(){if(this.parentElement.parentElement.id!==""){h.push(this.parentElement.parentElement.id)}});var g="/api/libraries/datasets/download/"+j;var i={ldda_ids:h};this.processDownload(g,i,"get")},processDownload:function(g,h,i){if(g&&h){h=typeof h=="string"?h:$.param(h);var f="";$.each(h.split("&"),function(){var j=this.split("=");f+='<input type="hidden" name="'+j[0]+'" value="'+j[1]+'" />'});$('<form action="'+g+'" method="'+(i||"post")+'">'+f+"</form>").appendTo("body").submit().remove();e.info("Your download will begin soon")}},addFilesToFolderModal:function(){this.refreshUserHistoriesList(function(f){f.modal=Galaxy.modal;var g=f.templateAddFilesInModal();f.modal.show({closing_events:true,title:"Add datasets from history to "+f.options.folder_name,body:g({histories:f.histories.models}),buttons:{Add:function(){f.addAllDatasetsFromHistory()},Close:function(){Galaxy.modal.hide()}}});if(f.histories.models.length>0){f.fetchAndDisplayHistoryContents(f.histories.models[0].id);$("#dataset_add_bulk").change(function(h){f.fetchAndDisplayHistoryContents(h.target.value)})}else{e.error("Unable to retrieve histories. Please report this error.")}})},fetchAndDisplayHistoryContents:function(h){var g=new c.HistoryContents({id:h});var f=this;g.fetch({success:function(j){var i=f.templateHistoryContents();e.success("history contents fetched");f.histories.get(h).set({contents:j});f.modal.$el.find("#selected_history_content").html(i({history_contents:j.models.reverse()}))},error:function(){e.error("history contents fetch failed")}})},addAllDatasetsFromHistory:function(){this.modal.disableButton("Add");var f=[];this.modal.$el.find("#selected_history_content").find(":checked").each(function(){var i=$(this.parentElement).data("id");if(i){f.push(i)}});var m=this.options.folder_name;var l=this.templateAddingDatasetsProgressBar();this.modal.$el.find(".modal-body").html(l({folder_name:m}));this.progressStep=100/f.length;this.progress=0;var k=[];for(var j=f.length-1;j>=0;j--){history_dataset_id=f[j];var h=new c.Item();var g=this;h.url="/api/folders/"+this.options.id+"/contents";h.set({from_hda_id:history_dataset_id});k.push(h)}this.chainCallAddingHdas(k)},chainCallAddingHdas:function(g){var f=this;this.added_hdas=new c.Folder();var h=g.pop();if(typeof h==="undefined"){e.success("Selected datasets from history imported");this.modal.hide();return this.added_hdas}var i=$.when(h.save({from_hda_id:h.get("from_hda_id")})).done(function(j){Galaxy.libraries.folderListView.collection.add(j);f.updateProgress();f.chainCallAddingHdas(g)})},templateToolBar:function(){tmpl_array=[];tmpl_array.push('<div class="library_style_container">');tmpl_array.push('<h3>Data Libraries Beta Test. This is work in progress. Please report problems & ideas via <a href="mailto:galaxy-bugs@bx.psu.edu?Subject=DataLibrariesBeta_Feedback" target="_blank">email</a> and <a href="https://trello.com/c/nwYQNFPK/56-data-library-ui-progressive-display-of-fol…" target="_blank">Trello</a>.</h3>');tmpl_array.push('<div id="library_folder_toolbar" >');tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Create New Folder" id="toolbtn_create_folder" class="primary-button" type="button" style="display:none;"><span class="fa fa-plus"></span><span class="fa fa-folder"></span></button>');tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Add Datasets to Current Folder" id="toolbtn_add_files" class="toolbtn_add_files primary-button" type="button" style="display:none;"><span class="fa fa-plus"></span><span class="fa fa-file"></span></span></button>');tmpl_array.push(' <button data-toggle="tooltip" data-placement="top" title="Import selected datasets into history" id="toolbtn_bulk_import" class="primary-button" style="margin-left: 0.5em; display:none;" type="button"><span class="fa fa-book"></span> to history</button>');tmpl_array.push(' <div id="toolbtn_dl" class="btn-group" style="margin-left: 0.5em; display:none; ">');tmpl_array.push(' <button title="Download selected datasets" id="drop_toggle" type="button" class="primary-button dropdown-toggle" data-toggle="dropdown">');tmpl_array.push(' <span class="fa fa-download"></span> download <span class="caret"></span>');tmpl_array.push(" </button>");tmpl_array.push(' <ul class="dropdown-menu" role="menu">');tmpl_array.push(' <li id="download_archive"><a href="#/folders/<%= id %>/download/tgz">.tar.gz</a></li>');tmpl_array.push(' <li id="download_archive"><a href="#/folders/<%= id %>/download/tbz">.tar.bz</a></li>');tmpl_array.push(' <li id="download_archive"><a href="#/folders/<%= id %>/download/zip">.zip</a></li>');tmpl_array.push(" </ul>");tmpl_array.push(" </div>");tmpl_array.push(" </div>");tmpl_array.push(' <div id="folder_items_element">');tmpl_array.push(" </div>");tmpl_array.push("</div>");return _.template(tmpl_array.join(""))},templateNewFolderInModal:function(){tmpl_array=[];tmpl_array.push('<div id="new_folder_modal">');tmpl_array.push("<form>");tmpl_array.push('<input type="text" name="Name" value="" placeholder="Name">');tmpl_array.push('<input type="text" name="Description" value="" placeholder="Description">');tmpl_array.push("</form>");tmpl_array.push("</div>");return _.template(tmpl_array.join(""))},templateBulkImportInModal:function(){var f=[];f.push('<span id="history_modal_combo_bulk" style="width:90%; margin-left: 1em; margin-right: 1em; ">');f.push("Select history: ");f.push('<select id="dataset_import_bulk" name="dataset_import_bulk" style="width:50%; margin-bottom: 1em; "> ');f.push(" <% _.each(histories, function(history) { %>");f.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');f.push(" <% }); %>");f.push("</select>");f.push("</span>");return _.template(f.join(""))},templateImportIntoHistoryProgressBar:function(){var f=[];f.push('<div class="import_text">');f.push("Importing selected datasets to history <b><%= _.escape(history_name) %></b>");f.push("</div>");f.push('<div class="progress">');f.push(' <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');f.push(' <span class="completion_span">0% Complete</span>');f.push(" </div>");f.push("</div>");f.push("");return _.template(f.join(""))},templateAddingDatasetsProgressBar:function(){var f=[];f.push('<div class="import_text">');f.push("Adding selected datasets from history to library folder <b><%= _.escape(folder_name) %></b>");f.push("</div>");f.push('<div class="progress">');f.push(' <div class="progress-bar progress-bar-import" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 00%;">');f.push(' <span class="completion_span">0% Complete</span>');f.push(" </div>");f.push("</div>");f.push("");return _.template(f.join(""))},templateAddFilesInModal:function(){var f=[];f.push('<div id="add_files_modal">');f.push('<div id="history_modal_combo_bulk">');f.push("Select history: ");f.push('<select id="dataset_add_bulk" name="dataset_add_bulk" style="width:66%; "> ');f.push(" <% _.each(histories, function(history) { %>");f.push(' <option value="<%= _.escape(history.get("id")) %>"><%= _.escape(history.get("name")) %></option>');f.push(" <% }); %>");f.push("</select>");f.push("</div>");f.push('<div id="selected_history_content">');f.push("</div>");f.push("</div>");return _.template(f.join(""))},templateHistoryContents:function(){var f=[];f.push("Choose the datasets to import:");f.push("<ul>");f.push(" <% _.each(history_contents, function(history_item) { %>");f.push(' <li data-id="<%= _.escape(history_item.get("id")) %>">');f.push(' <input style="margin: 0;" type="checkbox"><%= _.escape(history_item.get("hid")) %>: <%= _.escape(history_item.get("name")) %>');f.push(" </li>");f.push(" <% }); %>");f.push("</ul>");return _.template(f.join(""))}});return{FolderToolbarView:a}});
\ No newline at end of file
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 static/scripts/packed/mvc/library/library-librarylist-view.js
--- a/static/scripts/packed/mvc/library/library-librarylist-view.js
+++ b/static/scripts/packed/mvc/library/library-librarylist-view.js
@@ -1,1 +1,1 @@
-define(["galaxy.masthead","mvc/base-mvc","utils/utils","libs/toastr","mvc/library/library-model","mvc/library/library-libraryrow-view"],function(b,g,d,e,c,a){var f=Backbone.View.extend({el:"#libraries_element",events:{"click .sort-libraries-link":"sort_clicked"},modal:null,collection:null,rowViews:{},initialize:function(i){this.options=_.defaults(this.options||{},i);var h=this;this.rowViews={};this.collection=new c.Libraries();this.collection.fetch({success:function(j){h.render()},error:function(k,j){e.error("An error occured. Please try again.")}})},render:function(i){var j=this.templateLibraryList();var k=null;var h=Galaxy.libraries.preferences.get("with_deleted");var l=null;if(typeof i!=="undefined"){h=typeof i.with_deleted!=="undefined"?i.with_deleted:false;l=typeof i.models!=="undefined"?i.models:null}if(this.collection!==null&&l===null){if(h){k=this.collection.models}else{k=this.collection.where({deleted:false})}}else{if(l!==null){k=l}else{k=[]}}this.$el.html(j({length:k.length,order:Galaxy.libraries.preferences.get("sort_order")}));if(k.length>0){this.renderRows(k)}$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},renderRows:function(m){for(var l=0;l<m.length;l++){var k=m[l];var j=_.findWhere(this.rowViews,{id:k.get("id")});if(j!==undefined&&this instanceof Backbone.View){j.delegateEvents();this.$el.find("#library_list_body").append(j.el)}else{var h=new a.LibraryRowView(k);this.$el.find("#library_list_body").append(h.el);this.rowViews[k.get("id")]=h}}},sort_clicked:function(){if(Galaxy.libraries.preferences.get("sort_order")==="asc"){this.sortLibraries("name","desc");Galaxy.libraries.preferences.set({sort_order:"desc"})}else{this.sortLibraries("name","asc");Galaxy.libraries.preferences.set({sort_order:"asc"})}this.render()},sortLibraries:function(i,h){if(i==="name"){if(h==="asc"){this.collection.comparator=function(k,j){if(k.get("name").toLowerCase()>j.get("name").toLowerCase()){return 1}if(j.get("name").toLowerCase()>k.get("name").toLowerCase()){return -1}return 0}}else{if(h==="desc"){this.collection.comparator=function(k,j){if(k.get("name").toLowerCase()>j.get("name").toLowerCase()){return -1}if(j.get("name").toLowerCase()>k.get("name").toLowerCase()){return 1}return 0}}}this.collection.sort()}},templateLibraryList:function(){tmpl_array=[];tmpl_array.push('<div class="library_container table-responsive">');tmpl_array.push("<% if(length === 0) { %>");tmpl_array.push('<div>There are no libraries visible to you. If you expected some to show up please consult the <a href="https://wiki.galaxyproject.org/Admin/DataLibraries/LibrarySecurity">library security wikipage</a>.</div>');tmpl_array.push("<% } else{ %>");tmpl_array.push('<table class="grid table table-condensed">');tmpl_array.push(" <thead>");tmpl_array.push(' <th style="width:30%;"><a class="sort-libraries-link" title="Click to reverse order" href="#">name</a><span title="Sorted alphabetically" class="fa fa-sort-alpha-<%- order %>"></span></th>');tmpl_array.push(' <th style="width:22%;">description</th>');tmpl_array.push(' <th style="width:22%;">synopsis</th> ');tmpl_array.push(' <th style="width:26%;"></th> ');tmpl_array.push(" </thead>");tmpl_array.push(' <tbody id="library_list_body">');tmpl_array.push(" </tbody>");tmpl_array.push("</table>");tmpl_array.push("<% }%>");tmpl_array.push("</div>");return _.template(tmpl_array.join(""))},templateNewLibraryInModal:function(){tmpl_array=[];tmpl_array.push('<div id="new_library_modal">');tmpl_array.push(" <form>");tmpl_array.push(' <input type="text" name="Name" value="" placeholder="Name">');tmpl_array.push(' <input type="text" name="Description" value="" placeholder="Description">');tmpl_array.push(' <input type="text" name="Synopsis" value="" placeholder="Synopsis">');tmpl_array.push(" </form>");tmpl_array.push("</div>");return tmpl_array.join("")},redirectToHome:function(){window.location="../"},redirectToLogin:function(){window.location="/user/login"},show_library_modal:function(i){i.preventDefault();i.stopPropagation();var h=this;this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Create New Library",body:this.templateNewLibraryInModal(),buttons:{Create:function(){h.create_new_library_event()},Close:function(){h.modal.hide()}}})},create_new_library_event:function(){var j=this.serialize_new_library();if(this.validate_new_library(j)){var i=new c.Library();var h=this;i.save(j,{success:function(k){h.collection.add(k);h.modal.hide();h.clear_library_modal();h.render();e.success("Library created")},error:function(){e.error("An error occured :(")}})}else{e.error("Library's name is missing")}return false},clear_library_modal:function(){$("input[name='Name']").val("");$("input[name='Description']").val("");$("input[name='Synopsis']").val("")},serialize_new_library:function(){return{name:$("input[name='Name']").val(),description:$("input[name='Description']").val(),synopsis:$("input[name='Synopsis']").val()}},validate_new_library:function(h){return h.name!==""}});return{LibraryListView:f}});
\ No newline at end of file
+define(["galaxy.masthead","mvc/base-mvc","utils/utils","libs/toastr","mvc/library/library-model","mvc/library/library-libraryrow-view"],function(b,g,d,e,c,a){var f=Backbone.View.extend({el:"#libraries_element",events:{"click .sort-libraries-link":"sort_clicked"},modal:null,collection:null,rowViews:{},initialize:function(i){this.options=_.defaults(this.options||{},i);var h=this;this.rowViews={};this.collection=new c.Libraries();this.collection.fetch({success:function(j){h.render()},error:function(k,j){e.error("An error occured. Please try again.")}})},render:function(i){var j=this.templateLibraryList();var k=null;var h=Galaxy.libraries.preferences.get("with_deleted");var l=null;if(typeof i!=="undefined"){h=typeof i.with_deleted!=="undefined"?i.with_deleted:false;l=typeof i.models!=="undefined"?i.models:null}if(this.collection!==null&&l===null){if(h){k=this.collection.models}else{k=this.collection.where({deleted:false})}}else{if(l!==null){k=l}else{k=[]}}this.$el.html(j({length:k.length,order:Galaxy.libraries.preferences.get("sort_order")}));if(k.length>0){this.renderRows(k)}$("#center [data-toggle]").tooltip();$("#center").css("overflow","auto")},renderRows:function(m){for(var l=0;l<m.length;l++){var k=m[l];var j=_.findWhere(this.rowViews,{id:k.get("id")});if(j!==undefined&&this instanceof Backbone.View){j.delegateEvents();this.$el.find("#library_list_body").append(j.el)}else{var h=new a.LibraryRowView(k);this.$el.find("#library_list_body").append(h.el);this.rowViews[k.get("id")]=h}}},sort_clicked:function(){if(Galaxy.libraries.preferences.get("sort_order")==="asc"){this.sortLibraries("name","desc");Galaxy.libraries.preferences.set({sort_order:"desc"})}else{this.sortLibraries("name","asc");Galaxy.libraries.preferences.set({sort_order:"asc"})}this.render()},sortLibraries:function(i,h){if(i==="name"){if(h==="asc"){this.collection.sortByNameAsc()}else{if(h==="desc"){this.collection.sortByNameDesc()}}}},templateLibraryList:function(){tmpl_array=[];tmpl_array.push('<div class="library_container table-responsive">');tmpl_array.push("<% if(length === 0) { %>");tmpl_array.push('<div>There are no libraries visible to you. If you expected some to show up please consult the <a href="https://wiki.galaxyproject.org/Admin/DataLibraries/LibrarySecurity">library security wikipage</a>.</div>');tmpl_array.push("<% } else{ %>");tmpl_array.push('<table class="grid table table-condensed">');tmpl_array.push(" <thead>");tmpl_array.push(' <th style="width:30%;"><a class="sort-libraries-link" title="Click to reverse order" href="#">name</a><span title="Sorted alphabetically" class="fa fa-sort-alpha-<%- order %>"></span></th>');tmpl_array.push(' <th style="width:22%;">description</th>');tmpl_array.push(' <th style="width:22%;">synopsis</th> ');tmpl_array.push(' <th style="width:26%;"></th> ');tmpl_array.push(" </thead>");tmpl_array.push(' <tbody id="library_list_body">');tmpl_array.push(" </tbody>");tmpl_array.push("</table>");tmpl_array.push("<% }%>");tmpl_array.push("</div>");return _.template(tmpl_array.join(""))},templateNewLibraryInModal:function(){tmpl_array=[];tmpl_array.push('<div id="new_library_modal">');tmpl_array.push(" <form>");tmpl_array.push(' <input type="text" name="Name" value="" placeholder="Name">');tmpl_array.push(' <input type="text" name="Description" value="" placeholder="Description">');tmpl_array.push(' <input type="text" name="Synopsis" value="" placeholder="Synopsis">');tmpl_array.push(" </form>");tmpl_array.push("</div>");return tmpl_array.join("")},redirectToHome:function(){window.location="../"},redirectToLogin:function(){window.location="/user/login"},show_library_modal:function(i){i.preventDefault();i.stopPropagation();var h=this;this.modal=Galaxy.modal;this.modal.show({closing_events:true,title:"Create New Library",body:this.templateNewLibraryInModal(),buttons:{Create:function(){h.create_new_library_event()},Close:function(){h.modal.hide()}}})},create_new_library_event:function(){var j=this.serialize_new_library();if(this.validate_new_library(j)){var i=new c.Library();var h=this;i.save(j,{success:function(k){h.collection.add(k);h.modal.hide();h.clear_library_modal();h.render();e.success("Library created")},error:function(){e.error("An error occured :(")}})}else{e.error("Library's name is missing")}return false},clear_library_modal:function(){$("input[name='Name']").val("");$("input[name='Description']").val("");$("input[name='Synopsis']").val("")},serialize_new_library:function(){return{name:$("input[name='Name']").val(),description:$("input[name='Description']").val(),synopsis:$("input[name='Synopsis']").val()}},validate_new_library:function(h){return h.name!==""}});return{LibraryListView:f}});
\ No newline at end of file
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 static/scripts/packed/mvc/library/library-librarytoolbar-view.js
--- a/static/scripts/packed/mvc/library/library-librarytoolbar-view.js
+++ b/static/scripts/packed/mvc/library/library-librarytoolbar-view.js
@@ -1,1 +1,1 @@
-define(["galaxy.masthead","utils/utils","libs/toastr","mvc/library/library-model"],function(a,c,d,b){var e=Backbone.View.extend({el:"#center",events:{"click #create_new_library_btn":"delegate_modal","click #include_deleted_chk":"check_include_deleted"},initialize:function(){this.render()},render:function(){var h=this.templateToolBar();var g=Galaxy.currUser.isAdmin();var f=Galaxy.currUser.isAnonymous();this.$el.html(h({admin_user:g,anon_user:f}));if(Galaxy.currUser.isAdmin()===true){this.$el.find("#include_deleted_chk")[0].checked=Galaxy.libraries.preferences.get("with_deleted")}},delegate_modal:function(f){Galaxy.libraries.libraryListView.show_library_modal(f)},check_include_deleted:function(f){if(f.target.checked){Galaxy.libraries.preferences.set({with_deleted:true});Galaxy.libraries.libraryListView.render()}else{Galaxy.libraries.preferences.set({with_deleted:false});Galaxy.libraries.libraryListView.render()}},templateToolBar:function(){tmpl_array=[];tmpl_array.push('<div class="library_style_container">');tmpl_array.push(' <div id="toolbar_form" margin-top:0.5em; ">');tmpl_array.push(' <h3>Data Libraries Beta Test. This is work in progress. Please report problems & ideas via <a href="mailto:galaxy-bugs@bx.psu.edu?Subject=DataLibrariesBeta_Feedback" target="_blank">email</a> and <a href="https://trello.com/c/nwYQNFPK/56-data-library-ui-progressive-display-of-fol…" target="_blank">Trello</a>.</h3>');tmpl_array.push(" <% if(admin_user === true) { %>");tmpl_array.push(' <div id="library_toolbar">');tmpl_array.push(' <span data-toggle="tooltip" data-placement="top" title="Include deleted libraries"><input id="include_deleted_chk" style="margin: 0;" type="checkbox"><span class="fa fa-trash-o fa-lg"></span></input></span>');tmpl_array.push(' <span data-toggle="tooltip" data-placement="top" title="Create New Library"><button id="create_new_library_btn" class="primary-button btn-xs" type="button"><span class="fa fa-plus"></span> New Library</button><span>');tmpl_array.push(" </div>");tmpl_array.push(" <% } %>");tmpl_array.push(" </div>");tmpl_array.push(' <div id="libraries_element">');tmpl_array.push(" </div>");tmpl_array.push("</div>");return _.template(tmpl_array.join(""))}});return{LibraryToolbarView:e}});
\ No newline at end of file
+define(["galaxy.masthead","utils/utils","libs/toastr","mvc/library/library-model"],function(a,c,d,b){var e=Backbone.View.extend({el:"#center",events:{"click #create_new_library_btn":"delegate_modal","click #include_deleted_chk":"check_include_deleted"},initialize:function(){this.render()},render:function(){var h=this.templateToolBar();var g=false;var f=false;if(Galaxy.currUser){g=Galaxy.currUser.isAdmin();f=Galaxy.currUser.isAnonymous()}else{f=true}this.$el.html(h({admin_user:g,anon_user:f}));if(g){this.$el.find("#include_deleted_chk")[0].checked=Galaxy.libraries.preferences.get("with_deleted")}},delegate_modal:function(f){Galaxy.libraries.libraryListView.show_library_modal(f)},check_include_deleted:function(f){if(f.target.checked){Galaxy.libraries.preferences.set({with_deleted:true});Galaxy.libraries.libraryListView.render()}else{Galaxy.libraries.preferences.set({with_deleted:false});Galaxy.libraries.libraryListView.render()}},templateToolBar:function(){tmpl_array=[];tmpl_array.push('<div class="library_style_container">');tmpl_array.push(' <div id="toolbar_form" margin-top:0.5em; ">');tmpl_array.push(' <h3>Data Libraries Beta Test. This is work in progress. Please report problems & ideas via <a href="mailto:galaxy-bugs@bx.psu.edu?Subject=DataLibrariesBeta_Feedback" target="_blank">email</a> and <a href="https://trello.com/c/nwYQNFPK/56-data-library-ui-progressive-display-of-fol…" target="_blank">Trello</a>.</h3>');tmpl_array.push(" <% if(admin_user === true) { %>");tmpl_array.push(' <div id="library_toolbar">');tmpl_array.push(' <span data-toggle="tooltip" data-placement="top" title="Include deleted libraries"><input id="include_deleted_chk" style="margin: 0;" type="checkbox"><span class="fa fa-trash-o fa-lg"></span></input></span>');tmpl_array.push(' <span data-toggle="tooltip" data-placement="top" title="Create New Library"><button id="create_new_library_btn" class="primary-button btn-xs" type="button"><span class="fa fa-plus"></span> New Library</button><span>');tmpl_array.push(" </div>");tmpl_array.push(" <% } %>");tmpl_array.push(" </div>");tmpl_array.push(' <div id="libraries_element">');tmpl_array.push(" </div>");tmpl_array.push("</div>");return _.template(tmpl_array.join(""))}});return{LibraryToolbarView:e}});
\ No newline at end of file
diff -r ed5f15df397e839a285b77797fcfc0ebcdef90ab -r 166660f085a51316976df1ffef426997ed393a24 static/scripts/packed/mvc/library/library-model.js
--- a/static/scripts/packed/mvc/library/library-model.js
+++ b/static/scripts/packed/mvc/library/library-model.js
@@ -1,1 +1,1 @@
-define([],function(){var f=Backbone.Model.extend({urlRoot:"/api/libraries/",isVisible:function(l){var k=true;if((!show_delete)&&(this.get("deleted"))){k=false}return k}});var a=Backbone.Model.extend({urlRoot:"/api/folders"});var i=Backbone.Collection.extend({url:"/api/libraries",model:f,sort_key:"name",sort_order:null,initialize:function(k){k=k||{}},getVisible:function(l,m){m=m||[];var k=new i(this.filter(function(n){return n.isVisible(l)}));return k}});var g=Backbone.Model.extend({urlRoot:"/api/libraries/datasets"});var c=Backbone.Collection.extend({model:g});var e=Backbone.Model.extend({defaults:{folder:new c(),urlRoot:"/api/folders/",id:"unknown"},parse:function(k){this.get("folder").reset(k.folder_contents);return k}});var b=Backbone.Model.extend({urlRoot:"/api/histories/"});var d=Backbone.Collection.extend({urlRoot:"/api/histories/",initialize:function(k){this.id=k.id},url:function(){return this.urlRoot+this.id+"/contents"},model:b});var h=Backbone.Model.extend({urlRoot:"/api/histories/"});var j=Backbone.Collection.extend({url:"/api/histories",model:h});return{Library:f,FolderAsModel:a,Libraries:i,Item:g,Folder:c,FolderContainer:e,HistoryItem:b,HistoryContents:d,GalaxyHistory:h,GalaxyHistories:j}});
\ No newline at end of file
+define([],function(){var f=Backbone.Model.extend({urlRoot:"/api/libraries/",isVisible:function(l){var k=true;if((!show_delete)&&(this.get("deleted"))){k=false}return k}});var i=Backbone.Collection.extend({url:"/api/libraries",model:f,sort_key:"name",sort_order:null,initialize:function(k){k=k||{}},getVisible:function(l,m){m=m||[];var k=new i(this.filter(function(n){return n.isVisible(l)}));return k},sortByNameAsc:function(){this.comparator=function(l,k){if(l.get("name").toLowerCase()>k.get("name").toLowerCase()){return 1}if(k.get("name").toLowerCase()>l.get("name").toLowerCase()){return -1}return 0};this.sort();return this},sortByNameDesc:function(){this.comparator=function(l,k){if(l.get("name").toLowerCase()>k.get("name").toLowerCase()){return -1}if(k.get("name").toLowerCase()>l.get("name").toLowerCase()){return 1}return 0};this.sort();return this}});var g=Backbone.Model.extend({urlRoot:"/api/libraries/datasets"});var a=Backbone.Model.extend({urlRoot:"/api/folders"});var c=Backbone.Collection.extend({model:g,sortByNameAsc:function(){this.comparator=function(l,k){if(l.get("type")===k.get("type")){if(l.get("name").toLowerCase()>k.get("name").toLowerCase()){return 1}if(k.get("name").toLowerCase()>l.get("name").toLowerCase()){return -1}return 0}else{if(l.get("type")==="folder"){return -1}else{return 1}}};this.sort();return this},sortByNameDesc:function(){this.comparator=function(l,k){if(l.get("type")===k.get("type")){if(l.get("name").toLowerCase()>k.get("name").toLowerCase()){return -1}if(k.get("name").toLowerCase()>l.get("name").toLowerCase()){return 1}return 0}else{if(l.get("type")==="folder"){return -1}else{return 1}}};this.sort();return this}});var e=Backbone.Model.extend({defaults:{folder:new c(),urlRoot:"/api/folders/",id:"unknown"},parse:function(k){this.get("folder").reset(k.folder_contents);return k}});var b=Backbone.Model.extend({urlRoot:"/api/histories/"});var d=Backbone.Collection.extend({urlRoot:"/api/histories/",initialize:function(k){this.id=k.id},url:function(){return this.urlRoot+this.id+"/contents"},model:b});var h=Backbone.Model.extend({urlRoot:"/api/histories/"});var j=Backbone.Collection.extend({url:"/api/histories",model:h});return{Library:f,FolderAsModel:a,Libraries:i,Item:g,Folder:c,FolderContainer:e,HistoryItem:b,HistoryContents:d,GalaxyHistory:h,GalaxyHistories:j}});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: davebgx: Fix certain failing functional tests.
by commits-noreply@bitbucket.org 16 Apr '14
by commits-noreply@bitbucket.org 16 Apr '14
16 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/ed5f15df397e/
Changeset: ed5f15df397e
User: davebgx
Date: 2014-04-16 22:13:11
Summary: Fix certain failing functional tests.
Affected #: 3 files
diff -r aafe686858916d0191a29c9bd7252525769cea21 -r ed5f15df397e839a285b77797fcfc0ebcdef90ab test-data/users/test1(a)bx.psu.edu/1.fasta
--- /dev/null
+++ b/test-data/users/test1(a)bx.psu.edu/1.fasta
@@ -0,0 +1,2 @@
+>hg17
+gtttgccatcttttgctgctctagggaatccagcagctgtcaccatgtaaacaagcccaggctagaccaGTTACCCTCATCATCTTAGCTGATAGCCAGCCAGCCACCACAGGCAtgagtcaggccatattgctggacccacagaattatgagctaaataaatagtcttgggttaagccactaagttttaggcatagtgtgttatgtaTCTCACAAACATATAAGACTGTGTGTTTGTTGACTGGAGGAAGAGATGCTATAAAGACCACCTTTTAAAACTTCCC-------------------------------AAATACT-GCCACTGATGTCCTG-----ATGGAGGTA-------TGAA-------------------AACATCCACTAAAATTTGTGGTTTATTCATTTTTCATTATTTTGTTTAAGGAGGTCTATAGTGGAAGAGGGAGATATTTGGggaaatt---ttgtatagactagctttcacgatgttagggaattattattgtgtgataatggtcttgcagttaca-cagaaattcttccttattttttgggaa---gcaccaaag----tagggat---aaaatgtcatgatgtgtgcaatacactttaaaatgtttttg-----ccaaaataatt----------------aatgaagc--aaatatggaaa-ataataattattaaatctaggtgatgggtatattgtagttcactatagtattgcacacttttctgtatgtttaaatttttcatttaaaaaaaaactttgagc-----tagacaccaggctatgagctaggagcatagcaatgaccaa----------------------------------------------------------------------------------------------atagactcctaccaa--------------------------------------------------ctc-aaagaatgcacattctCTGGGAAACATGTTTCCATTAGGAAGCCTCGAATGCAATGTGACTGTGGTCTCCAGGACCTG-TGTGATCCTGGCTTTTCCTGTTCCCTCCG---CATCATCACTGCAGGTGTGTTTTCCCAAGTTTTAAACATTTA------CCTTCCCAGTGGCCTTGCGTCTAGAGGAATCCCTGTATAGTGGT-ACATGAATATAACACATAACAAA-AATCATCTCTATGGTGTGTGTTGTTCCTGGGGTTCAattcagcaaattttccctg-ggcacccatgtgttcttggcactggaaaagtaccgggactgaaacagttgatggccca-atccctgtcctct---taaaacctaagggaggagaTGGAAAGGGG-CACCCAACCCAGACTGAGAGACAGGAATTAGCTGCAAGGGGAACTAGGAAAAGCTTCTTTA---AGGATGGAGAGGCCCTAGTGGAAT-GGGGAGATTCTTCCGGGAGAAGCGATGGATGCACAGTTGGGCATCCCCACAGACGGACTGGAAAGAAAAAAGGCCTGGAGGAATCAATGTG-------CAATGTATGTGTGTTCCCTGGTTcaagggctgg-gaactttctcta-aagggccaggtagaaaacattttaggctttctaagccaag--gcaaaat-tgaggatattacatgggtacttatacaacaagaataaacaatt---tacacaattttttgttgacagaattcaaaactttat----agacacagaaatgcaaatttcctgtaattttcccat-gagaactattcttct--tttgttttgttttgcgacAGGGTTGCGCtgatcctcccgcctcagtctccctaagtgctgagatgttgcaggaagtcagggaccccgaacagagagatcggctggagccgtggcagaggaacataaattttgaagatttcattttaatatggacacttatcagttcccaaataatacttttataattttttatgcctgtctttgctttaatctcttaatcctgttatcttcataagctaaggatgtacgtcacctcaggaccactgtgataattgtgttaactgtacagattgattgcaaaacatgtgtgtttgaacaatatgaaatcagtgcaccttgaaaaagagcagaataacagcaatttttagggaacaagggaagacaactataaggtctgactgcctgcggggtcgggcaaagggagccatatttttcttcttgcagagagcctataaatagacctgcaagtaggagagatattgctaatttcttttgctagcatggaatattaatattaacaccctgggaaaggaatgcattcctggggggaggtctataaatggccgctctgggaatgtctatcctacgcaatggagataaggactgagatacgccctggtctcctgcagtaccctcaggcttactagggtggtgaaaaactccgccctggtaaatttgtggtcagaccagttttctgctctcgaacactgttttctgttgtttaagatgtttatcaagacaatacgtgcaccgctgaacacagacccttatcagtagttctcctttttgccctttgaagcatgtgatctactccctgttttacaccccctcaccttttgaaacccttaataaaaaacttgctggttt-gaggctcaggtgggcatcacagtactaccgatatgtgatgtcacccccggcggcccagctgtaaaattcctctctttgtactctctctctttatttctcagccagctgacacttatggaaaatagaaagaacctacgttgaaatattgggggcaggttcccccaataTCTGGTGCCCAACGTGGGAtactgagattacaagcatgagccactgcatctggcctcttcttttgatttttttttttcaaacttttacaaatgtagaaaccattcttagcttttgggcattaccaaacccggcagtgg-caggctcggttcaccaacgtcatttgcagttccccgCTTTATGTTATGGgttttgttttgttttgtttttttt-attgagacagagtttcactcttgttgcccaggctgtagtgcaatggtctgatcttggctcactgcaacctccacttcccaggttcaagccattctcctgcctcagcctctcaagtagctgggattacagacactcaccaccacacctggctaattttgtatttttagtagagatgaggtttcaccatgttggccaggctggtctcgaaatcctgacctcaggtgatccacccaccttggcctcccaaagtgctgggattacaggcttgagctaccacgcctggctGGGTTGGTTCTCAATGGAGTGGTTTGTTTTTGGAGCTGCTCT-GCGCAGtggggaccagaataggcctg-------------------ggttcctagcccattgctattcctt----accagctgtggattctaaggaaagtcatttaacctcgctggaccttag-attcctcatccctgaaGCCCAAGGGTaaaacaaaacaaaacaaaacaaaacaaaccaaCCCATCATGTAAAGCGGGGAACTACAAACGATACAGGTGAAACATGCCTACCACACCACTCACAGGCT--ATGATGACAAAAACGTGGCTACATCTGGGACCACCCCCCAACCCCCACTTTGTACGTAGGAAATACGGAGTTGAGGATGGAGACCCACAGTATGTCCAGAGTGTCCCCAAAGGCCACAGTGCCCGCCTGGAGCCCTCCAGAGAGCGTGCACTCCCTGGGGTGCCAGCCAGAGACAACTTGCCCTGAGGCTTGGAACTCGATTCTCCGCGTGCCAGAGAAGGGGTGGGACTTCAGAACCCCCAACCCCGCAATCTGGGTCGGGGAGCCTGGCGCACTGCGGGCCGCTCCCTCTAACCCTGGGCTTCCCTG------GCGTCCAGGGCCGTCGG-----------GGCCGAGTCCCGATTCGCTCCCACCCCGAAGCCGCGCCAGGACCAACGAGGGCGCAGCCGTATGCCCCAGCCCGCTCCGCGGAGCCCCTCACAGCCAcccccgccccgaccgcgccccgcgcggcTCGAAGCACCTTCCCAAGGGGCTGGTCCTTGC----------GCCATAGTCGCGCCGGAGCCTCTGGAGGGACATCAAGGATTTCTC-GCTCCTACCAGCCACCCCCAAATTTTTGGGAGGTACCCAAGGGTGCGCGCGTGGCTCCTGGCGCGCCGAGGCCCTCCCTCGAGGCCCCGCGAGGTGCACACTGC---------GGGCCCAGGGCTAGCAGCCGCCCGGCACGTCGCTACCCTGAGGGGCGGGGCGGGAGCTGGCGCTAGAAATGCGCCGGGGCCTGCGGGGCAGTTGCGCAAGTTGTGATCGGGCCGCTATAAGAGGGGCGGGCAGGCATGGAGCCCCGTAGGAATCGCAGCGCCAGCGGTTGCAAGGTAAGGCCC-CGGCGCGCTCCTTCCTCCTTCTCTGCTGGTCTTTCTTGGCAGGCCACAGGGCCCCACACAACTCTGGATCCCGGGGAAACTGAGTCAGG-AGGGATGCAGGGCGGATGGCTTAGTTCTGGACTATGATAGCTTTGTACCGAG-----TTCTAGCCAGATAGAAGGTTACCGGGAGCTGGGGAGCGTTGGATTTGCTGCTGGGCTGTGCCGGTGCCCAGAAGGCA------GGACCTTGCAGAACCAGCCAGGTCCCTGGGAGACTGTCAGACCCACCAACCTGGTGGCATTCGCAGAGCTGAGATGCATTGGAAATTGCCTTGGGCACATCCCCAAAGATCAGGATGTCCCACCCCAGTCTGAAGGAGA---TAAAGTTGGGGGTAGGAGAGACGCAG-ATGCAAGTGATCAGTCTC---AGTCCCAGACATTGCCTTGCTCTGCGGGTAGGAATTCAGGATTCATTTTCCAGGGAAG--------TTCCTGACCTCTGAATGAGAGGGGCTGTGTAAGGCCAATGCCTGGG-AGGAAGGCAAGGATGAGTAGAGGTGGGGGGAAACAAGTGTCAGGAAGA--------------------------------------------CTCAAA---------ATCTTC--------------------------------------------------------------CAGAGAAATTGT-----GCAGGGTCTTACCAGATCTGTCCTCAAAGCCATGCAAATTGCCTTCTTTGCAATGCAT-ACAATGAGGTGTCTCTGGGGGTCAGAACTGG-----------------------TTATTAGGGAACTTCTAGCCAGGACTGCTAAATACGCGCTGTTGG---------CCCACCAGGCTCACCTATAGCCT-TCCTTCAGTCTGGGCTTGGTTTGGATTTCACTGTGGGTGCCATCGCCTTTACACTCCTGTTTCTATAGTTTAAAGATAGTGGTGCTTTGGGAAAG---TGACTCCTTAAATACAGTTAGGTCCAAGTGA-GACAAGTGGCCTGGCTGTCATTTCAGAATAGCAGCTTCCAAGAGG----------TGATTAATTTCTGTTGGAAGGGTGAT-CTTTGGGGAGGT--GGGTGAAGAGCAGAGACTTGGTGGTACCGTTCCAGGAGCACAGGCTCTCT-----TCCTTTGCA--GTGCAGAATGACCTCTGGCAGCCGGAGTTGTGTTTGTT--------CTGTAGGATTCTGAGGTGGGCCATGGGCAGCTGGAACTGGG-----GAATTTTGCCAATCTCTTTCATATTAGGATTGTCTGCAGAACCAGATATGGAGG------CTTCTAGCAACGTGAGTGCTCCTGTTCTAATGCCCTTAGAAACAAGAAGGCCACACTGATCATTTCTCTCACTTAGGCAGGGAGACAAGGCAAGAGAGAAACAGT-----------------GGATGC--TTTTAGGTTCTTTCCCTTCCCAAGCAGTTGTGGACATTGGGCTGA-GGGGAACATTTCCACATTGGCTAAAGGAGCGTCCTCCTCATATTTTGTACATTTTATACCCAA--AATAA-CTCTTCTTGGTATTT-GGGGAAATATTTTCCTCCCCGTCC------------ATTCCAGGAAATGGCTCCAAGTGCCAAGGACAGAGCCAGGGAAGTTGCAATGAATTCCTGCCCGTCAGCCCCAGGCAGATGCCTTGCACGTCTGAGTGGCCCATGCAGAGCGTGGAGGTGGCCGCC----------------ACGGAACC-TGGGTCAATGT-CCCACCCCCG----CTTAGATGCCA-CCAGGGG--CGTGGGAGCCAAGGAG--AGAAGAGGGGCTCCAGGAAGGTAGAGTCCTTGTGTCTTGTGCATCTGTGAACAGCACTGGTATGATTTAAAGGAAAATTGAGCCAAATTTTCCGGCAGTCAGTT-----ACCCCATCCCCACCGGGGTAGGAGTCTGGCAGCCGCAGCTCCATTCTGGCCAGTCGGCAGAGAGCCTTGAAATTCTTCTTTGTCCACACAGTTGTCTCAGAGAAACAG--AGAGGTT-GTTTCTGCTTAAAAACAACACACTTGGTGTCTGGGCCCACAGACTCCTTTGCACTTATTCCACGTGTGACAGCCAATGTGCCTCGTTGCTTAGCAGACAGCATGTTACCGTCTTTCCTGCTCAGTTTGTTAG--------------CTCTATGGAATGGAATTTATAATCAATGCCCATACCAACATTTCACTAATATCATAGGAGATTTAGTCTCCATCTGGGTGTACATTACATTTGC--TCTGGGG-TGCTCCAGGC--TGGGGGGTTGCCAAGGAAGAGAAGAGAAACCGCAGAGAAGAC---GGGAGGGCAGGGCAGGGGTCTCTGAGAAGGGGAGGGGTCCCAGAGTGCAGGAGCAGGAGCCAGGCTC---------ATGAAAGGGGCCACGGGCGGGAGTATCCAGGGACGGCAGTCAAGATGGAGCACAGCTTAGG--AAGCTGAAGGGAATCCTGGCCCACCTGGGTGCTAGAGGGCACATAGGAAGTGCAGGAAGCAGACCAAGGTCCCCAAGAGAGGGAGACCTGGACGCTGAAGCATTTTCTGTCTTTATTAAG-------------ACAACTCCGTAAGAATTCCTGCTGGGCCAAAGTGAATTCTAGGATGCGACTTTAAGATGGGAGCAAGCGAACCATTGAGGAGGCAGGTTACCCTAGTTAGCCAATGCAGATCGAGAATGGGAAATCTTTCatttattcatgcaacagatatttaacgaagccctgccgtgttccaggcctgtgatagatgctggaacaggtacagaga----------tAc-------aggtgtcattaattgatcaggg--caacctctc---cttctgagt--cttgctggagcttcagatgc-ccctcacacagagctcgagggagcctc-aacaattgatcagaagtcaggcaccatggctcacgcatataatcccagcactttgggaggccaaggcaggtggatcactggagcccaggagttccagatcagctggggcaacatggcaaaaccccatctctattaaaaaaaaaaaaagtaactggatgtgatggtacacacctgtagtcccagctacttgggaggctgagaggtgggagaattgcttgagcccgggaagtcgggggtccagtgagccttgatcacaccactgcactccagcctgagtgacagagcaagaccctgacacacacacacacacacacacacacacacacacagattagagctgaaacaggagtagaaacctatctg-tatctctgATGA-GATCAGATC---------TTTCTGATGAACAGAAAGAATGTAACCCCTGTACTCACACCCTCTCTGCTGGTTACATATGTTAACACGATTTCTCAAATGAGGCTTTTGGTTGCAAATAAGAGAAAATCACTCACGCT-GGCCCTGTG--TTTTTCAAATTGTTTATTGTGATCAACATTTGAAAAAAGAGCCGAGACTCTCAAGAGTGCATTACCCACGGTAAGGGTGAATTTT-ACTTCTTGACACTTATTTCTCTTACATGTATCTATCTGTCTC-----AAATGAAAAATATATTTAGAAAGTTGAAAGCTATCCAAGTGAGTATAAGAAAAGAGTATCTCACCCTGAAGGCTAAGGACAGGGAGGGC---------------------------CACCAGGCCTCACGAGGACCCAGGAACCACAAAGAAGGCT-AGGAAGGAGCACAGGCGGTGACCATACTCTGGCTCAGTGGCTATGTGGGCTCTGGTCTCTCTCAGCTGTTCCATGCATATGAGGCCAAATGTGGCTACCCTAGAGCTTCTGAGCCCTCAACAGAGATGAACTGGACTCTCTGCAGCCCCACTCTAAATTCCTAAGAGAGAAGTTGATTGACCCAATCAGGGTCAGGAGAAGGAAGGGAGGAGGAAAGGGAGGAGAGAAGAGCCTCTTCGTCTCTTGCCTACCACTGGCCAGGCAATTGTAGCCAAGGGGGCTGGAGTGTAAATGCAAACATAGCCATCAAGGGTtgtgtatgtgtgtgtgtgtgtctgtgtgtgtgtatgtgtgtCTCTTGGGTAGGTTAGA-TCTCCCAGGAGGTCCCTACTAAACAGACTTAAGCCCGCAAAATTTTAGCTCTCCAGCCTCACACACTCCACCCCTCTACCATATTGAATCTTCCCAAACCAACTATGGCTTTCCCTAACTCCGGAGc------ttggcctggaatgccctgcttcccctctttcccctggggaacgcctgtccttcaggcctcagttcacacactgcctcccttgcaaagctctccTCCCATCCCCGGAGTCCCT--CTTCCCCTTTGTTCTTTGGGTTCTATGCTTCTTCCCTCATAACTCCCACCAGGTTGTGTTAAAATGAGTTGTTCAAGGTCCTGTCTGTTCCACTAGATTCTGAGCAACTTGGAGAACGAAGATCCAAACTTCGCTGCCTTTATTTCCTCCTTTGTTCTTTTCTCATCCCCAAGTCCCTTCCAACTTGGAGTTATgaagaaaggaaggaaggaagggtgggagggaagaaCAGGAGGGGATCCCACAGG-AGAATGTGTATAGGGAGAGGACTCAGACTAGCTAAAGCTTTTCCCTCATAATTAATAGCAAATACCATGTTACCTGAATTTAATTCACAGTAGCATACAAAAGACTCGCTTTGTTCT-------CCCCA---------TTGATGTCATCAGAGG--------------------GCTGTGGG--------------CAGGCCTAATCTTGGCTCAGGAGGCCCTCCAGCCTGGATCTAAAGAGCAGCAGATGggccaggctcggtggctcatgcctgtaatcccagcattttgggaggccgaggcgggtggatcacgaggtcaggagtttgagaccagcctggccaagatggtgaagcctcgtctctactaaaaatacaaaaattagccaggtgcggtggtgggcgcctgtatttccagctacccgggaggctgaggaggctgaggcaggagaatcgcttgaacccgggaggcggaggttgcagtgagccgaggtcacgccactgcactctagcctgggcaacagagcaagactccgtcaaaaaaaaaataaaaaaataaaaaaataaaaaaaataaaGAGGAGCACACATCTCTGCCCATCCTAACTCCCACTTTGACATTGAGGTCCCCAGGATGGAGGGTCTGCCTCCATCTGCCTTGTCCCCTG-CAATGGTGGGAAGGTGATGGAGCTCAAGTCTAGAGGCCACCAGCTTCTTAGGGAGG--TAGGAGGTG---------------GAGGGTGGGGTGC-GGGCCCTGCACACAACTGCCAAGTGAGGATGGGGGTGGG-GTCCACCTGAGGATAAGTAACAGTGAGGCTGGTGCAGAGGACCCAGGTGGAGGTAGACAGCAGAATTTGTGGTGGGGT--GGATGGCAC-ATTATATAAGCCTCTCTTGC------TGCCCTGT---TTACTGAGATTGTTTCAttatcttttttggcttttgtttttaagagatggggtcttgctgtgtcacacaggctggagtgcactgtgtgatcatacctcactgcagcctcgacatcctgggctcaggcaaacctcccaccttggcctcccaagtagctgggaccacaagcgtttgccaccacactcagctatttttatttttattttta--ttttttttagagatggggtcttgctgtgtcgcccaggctggtcttgaactcctgggctcaagcgatcctcctgccttggcctcccaaagccctgggattataggctgagccaccacacccagccACATTTCATCTGTGCAGCTCCAGGGGCTCCACATTCT-ACTCTTCTCATTTCTTCTCCAGGGTACCC----------ATGGCAAGGGATGAGGGT--AGAAGATGGGGCA--GCCAGGCCTTGATTAAAGGAGAAGGAAGGCAGCCTGTGGAGAGG---GCAGCC---C---AGGGAG---TGCAGAGAGAAGTGGGCCATGAGGGAGA---CAGCAGAGTGCAGGCTGCGTCC---CAAATGAGCATACAGCCCACTGTGAGCCCACC--ATCTTCCTAGA-GA--CCCCTCTCCTCTCC-AGGAGCTGCTTCAGTAGCACTCA---------GAGGAAAGAATGATGC--------TGTATCAACATTTCAGCAGCTCATCTTTTAACTCTAAGAAAATGGCAGCTCCTAAATGTTCAA--AACTGCTTTGGAAACTTCT---GGAGAGAGGTTTTGCAGCTCAGGCAGACAGCTGATCGCGGCCTTTCTTCCACCCCAACCCATGCTCTCCCCATGCT--CTCCTGCCACAGCTGCAGCGGGCCCCTGGGTCCTACATTTGCAG-CCCTTTGTCTCTGAGCT-----CAGACTTCCAATTCCAAGCGGCAGCTGGGCAGGCTCACCAGCATGT---CCAGCCAGTACTAGGACATCAGCAGGAGC----CCAACCACCTCTTTCCAAAATCTCTCCTCATGTCTCTCCTAGTTTCCATCTCCATCCTTCTAGTCAGCCAGGCTGAAAACATT-----------------TGCTCCTCAGGGTGCAGAAGGGAAAGCTTTGCCTCCCTTCCTGGTGCTCACTGCCCCTGCGATTCCAGCCCAAGCCCTCCCCGGCTCCTCACC----------CTGGTGTCAGCTGGAAGCCACCATCTCCTAAACCCACCTGtgttcttccacctctgc--------cagggctgc-cctctcctccaccttcacaaactcaattcctacccattctcaggtcccttatcaaatgccatctcctccatgatgcctccctgattccccTGCTGGAaataatggtgataacagctaag--gcattggggttggctacgtgccaggcaaggagttggcactttacatgctttatctcatttcagccacataacatcgacaggt-ggcattatgattcatatcatccccatctgatagccaggaaaactgagtcccagagaggttagc-cactttcctagggccCTGTGCTCTGACTCAAGCATAGCTCTGAGGAACTCTAGCATTCATCAGTTTAAGCACCATGACTTTCTTTGCTGAGTCACCCAAGGCAT-TTCTTCATTTAAATGTTCTTCCTTGGCCAGGCGCAGTGGCTCAggcccaatgcggtggctcacgcctgtaatctcaacactttgggaggccgaggtgggcagataatctgaggtcaggagttcaagaccagcctggccaacatggtgaaaccccatctctactaaaaatacaaaaaaatgaggctgggcgtgatgactcacacctgtaatcccagcactttgggaggccaaggcaggtggattacatgaggtcaggagttcgagaccagcctggccaacatggtgaaatcctatctctattaaaaatacaaaaaattagccaggcatggtggcaggcacctgtaatcccagctacttgggaggctgaggcaggaaaatggcttgaacccgggaggtggaggttgcagtgagccaaggttgcaccattgcactccagcctgggcaaaaagagggaaacatcgtctaaaaaagaaaaaaaaaaaattagccaggctgggtggtgcatgcccgtaattccagctactcaggaggatgaagcaagagaattgcttgaacccaggaggcagagattacagtgagctgagatcacaacactgcactccagcctaggtaaagaacaagactccatctcaaaaataaataaataaaaataaaTGTTCTTCCTTGCAATGAAGTTAAATATGTAAATTCTCAAACCAGTTGCTTAAGGGCACAGTTTTGTTCTTTACCTATATTTTTAACAAATATTTTATGTAAGTAGTTGAC-AAAATCAAATACTGT-GTACACTACCGAGGCTTCCCTGGGAAAGCCATCAG-CCTCTGCCCCATCCCTTCCCACTCCTGATT-CCACTTTCCTGTGTTTCCATATCTTTTTCATGTCTGTTTCTGGCCCACAGTGGGCGATCAATACATGTTAGCCACCAACCATCAAACCTATATTGAGTAATTATGGTATGTCAGGCACTATGCTCAATGAAATTGTAttaggcttgtacaaaagtaattgtggtttttaagagtaatggcaaaaacggcagttactttcgcaccaacTATTTGCTGCCTTGAATTATTCCTCCTCTC-CTCATCCCTAAACCCTGCTCCTCCCAGCCATTCTTCCTCCCCTTCTTGGGCCATGGCCAGGCCCCACCCAGGTACTAAGACTCAGGTGAACCAAGGAAGACTTAATGCCCACTCTTTTCTGATGCCCATGTT--GGCATGTGTTAAGtcggttagcattaagtttggctgcatttagcagagacccaaaagaacagtgccttttaaaaggcagaggttatgtctctcacacacacccagcacaagtccaag-------------------------accagcatggcatctcagctccatcaa--cctcaggaaccgagctcctgcagctccctgccctgcagttgataaggtgaggtctttgtcctcctggttcaagatggtgctagaatgttggctaccatatctatagtccaggcatcagaatggagcaagggatgaaaaaggaagagatgaaggcacacgacaggttcctgagagctggcacaggacacttctgcttatatttcactggccagaacttagtcacatggtcacacctagttgggagactctgagaagtaa----agtatttattctagatggccatatccctacc-taagacttggagttttctatgactggggaagaacggaagacaagatattgggaaagactagcagcctctactaAAAGGGTGATCtgtgttgatgtgcgtgtgtgtgtgatgtttgtatg---agcatgtgtgt-tatgtgttgt--gtgtTGGTGGGGCA--GATTCTTGCGAGCACTTTGGTCTCAGATGGACCTGCTACCAGTTCTCTCTGCAGACCCCCATAGGTTTCTCCTAAACCTGGCCT-CTCCTATTAGGCAGCCTTACTCAGCGGCAGCTTCTCAGCTCCATGTTTTCAAGGAACCACAATTTATTTCCAGCATCCACTGAAGCATATTATCAGTGGTGATAGAGGGGGCTTGTAAAACTGTTTTTCCACTTAGGTATTAGAGGGTGGCCATTATTTGAGAGTGAC-----TATGACCACAGTTAATCTGGTAATAAATTCTCTTGGGTAGGAGGGGGAAAGGAAAGGATGCTTTAAGGAAGCATCTTGCCAGGAGACACAAAGCTAACAAGAGTGGAGCCTGCAG----------------------------CTGGAGCCGCAGAGCCTAATCACTACACCCGCCCATCTCTGCTAGGGTTTCATGACTTCGTATCGGGGATTAGCAGTATTTAACTCTGTTGCACAAACATTTGGTGTA-----TTATTCAGGTAACAAGTAGCTAATAGAGGAAGTTTTACTTTTTTAAGACATAA--------------------ATTTGCCTTTTCCCAAATTACTTGGTACATAGTAC-TTTTCATGTTTGAAGTTGAGATGTGGGTACAATACCATAGCTTTATTCCAGAGCAGGGTATTTGTTTCCAAATGCCATGTTCCCAGCAGCTGCCCTTGACTGGGAATTGGGGTG-----TGATTTGGGCTTTTCCTTAAATCCTTGA-----GGAGCTGGA---GGGGTGGGTGGCTCGCACTCCTGCTTTctgg---------atctgaatc--------------ctgactctgtcatggacctgtt-tgactttgggcaagttgactcctattcctgagccccatat-ttttctcttctgtgaaattcagattaaaaA-AACATGGCTTTGATCAAACATTATAAATAATATATAGACAGACTGCTTGTTTTTATTGTATTGCCAG-AAATGAATCCTACTAATATTGCCATCTATGGACAGAAAATGTATTACCTGTCTTCATCAAGACCCAGACGAGGAAGAACACGAAAAGCGGAGATTAATTTTACTGCCATCTCCAGAACCGTCATCCTAATATTTACTTACAT-TTTATTATTATTTCAGGCTCATGCACATATACTTAGCATGGATCATTGGCCACAGACTCGCATACATTTAACTTTATTACCTTT-TGCCTCATGTATCTCATTAAAATTTTGCTGCTTAATCAAGGATCTGCATATTATTTTAATTTTAGAATTCACAGTTCCAAGACTTTGAAAGTTTCAAGCGTTCTGGGTGaatgtgttatgc--tctctcccgccaccatgtctttataccccctgatttctcagccact-atggcaaccactttctactcttagtagcccatatttag--tccaatccccagctcaggagacacttcttccaggg--agccccctgtgccttccagtagtatcttgtacctgccctttttgcaaagctctttcctcctggcttagaatggcccattgacctgtttgtttctcctattaaactgtaagccactcgagggtagagagcatctgttgttcaccattgcatcctcggtgctgagcactgcgtctgacatattatttagaaggtcagtaagtgctagtgggatTCAGGCTCCCAGTGGGTGGGAGAGAAAGGACGTAAGGAAGCAAGTGGTAAAGGCCCTCACAGA-GTATCAGCAGGCTGGTGTGA-GGGAGAAATGCAGAGGATGGGTGAGTAGCA-----TAATCGCTAATGAT-AGGGTAATGATAGAGCACATTTCACAACACCTTt-aagccctttcacgtgcatcagataatttgatcctcataaaagcctagagatagatatattacagg-gatgaaggtggagtattttgtggttatgtgatatg-tttaaaattatgcagtgagtaaatgactgggttcaaaccagaccttaaaagtctgttatctttccCTCG-AGCATGCAATGAAGTCTACATCATCCCTACCATGTCCATTTGATCACACCCTGGCCTCACAGCTCTGTGGTCTACAGGATACCTCATGGTGGTTTTATTGACCAGACAATAATCCTCTTTCTAAGGGGATGCATTTCATTAATACATATGTAGATCATGAATTGTCTTTGACTTTGAGGGGATGGTAGC----CAGAGCAGAAAGCAAAGCTGATTTTCATCCCCGTCTGGTAATGTGGTTGGTAATGTGAAGA-TGGGTGTATTCTGAGATACCGGCTCCTTGCAGTGTGTGGTTCCTTCTGTTTTCAGGCCC------AAGAAGCCCATCCTGGGAAGGAAAATGCATTGGGGAACCCTGTGCGGATTCTTGTGGCTTTGGCCCTATCTTTTCTATGTCCAAGCTGTGCCCATCCAAAAAGTCCAAGATGACACCAAAACCCTCATCAAGACAATTGTCACCAGGATCAATGACATTTCACACACGGTAAGGAG---AGTATGCGGGGACAAA---GTAGAACTGCAGCCAGCCCAGCACTGGCTCCTAGTGGCACT-GGACC-CAGATAGtccaagaaacatttattgaacgcctcctgaatgccaggcacctactggaagctgagaaGGATTTGAAAGCACAGGGC-TCCACTCTTTCTGGTTGTTTCTTTTGGCCCCTCTGCCTGCTGAGATTCCAGGGGTTAGTGG--------------------------------------------------------TTCTAATTCTAAACCACTCCAAGAACATTTGATTTTGCTACATGTTTCCATTTAAAAATCATAGGATTTGggctgggtgtggtggcttgtacctgtcatcccagcactttgggaggccaaagcaggaggatcattcgagcccaagagttcgagaccagcctgggcagcatagggagaccccatctctacaaaaataataaaaaatgttagctgggcatggtggtgtgtacctgtggtcccagctaggggaggctgagatggaaggatcacctgagcctgggaggttgaggctgcagtgggccctgatcatgccaccgtgctccagcctgggtgacagagtgagaccttgtctcaaaataaataaataaataaataaaAGTCATAGGATTTgatcaggcatgatgggtcacatctgtaagcccattgctttaggaggccaaggtaggaggatcagttgaggccaggagttcaagaccagcctgggcaacatggcaagacctctctctctaatttttaaaaaaataaaaaTTAAAGATAAGAAAAAAATCATAGGATTCTCATGAGGCCTCACGTGCTTATTTTCAACCTACCAAGGGGAAACCCAGGCCTCAGCGATTAGCTGAGC----------CACATGCAGGCACAG------------------------CCACTG-----TCTCTTTCCTTCCTGTCCCCTCTGTCCCCACCTTCTGCGCTCGCCTTCCTCCCTGACTTCACTTCCTTGAATCTTAGTGCCTACGACCAGAGGGAGCTGTGAAGTTCCTTG----TGTCCCATTGGCAGGAA-CAAGACCCCCAGAAGCATCTCCTCAGGGC------CTCTA-----TCCCATCTC-TAGATGTGCTTGTCATTAGG-Gttct-------------tgtagttccagctgatctctggccctgccgctcaaagatacccaaaagagcgagtctaccctttttcacattcaaccctctactgatttgcaaatagcagtcagtgcccaccctggtcttttctctggggtccagcaggcctagaccttcagccattttcctgatgaGGTCTGTAtttgaaattaggaagattaagtttgaatcttcacacttctgat----gtctgtgagatcttcagcaagttccttact--gtctttaagccttgt-tttcatcatctggataatggggatatcacacacta-ttcacaaggttgttatgaggcctaaattagctaaagcaATTGAATCCTCCTTACCCCCTGCATGGAGCTCTCTGGAGACTTCCACGTCTCCTGGTCATTGTGGGTGTCTTATGGTA-GTCTTGGGCAGTTAGGGAGAAGTTAGGTGTCTGGAAGCAAAGATGGCTCAGAACTAGATAGAGTC-TTGGGCATTTTATA-GATAAAAACTCTT--GTCTCCtttaaaaataataaaaaaaaattaGCTGGGCATATTAGCCACTCAGCAAGACTGCACGTGATAGATCCCGAGTGCCCCACCTTGGGTGGTGTAATACACAATATCACGGGAGCCCCGGGTAGTAACCACGGAGGTGTCAGCCTCAGTGCTGTGGGCAGATG-GATGGGGAGAGCC--TCCCGG-AACTGGAGTCACTGGAGCA----------------------------GGGTTGGGGGGCCTCACTGAGGGTACGGCCTTGATCTCTAAGGAGGAGGGACTGCCTGGAAAAGC-TGACTGGGAGGGAGGACTCGGCTGGGGGTAGAAGGGA----------CTAGGGAAGGCTGGGGGTGGGGGTGCTTATGGAGGACCTCAGATGCCTGGGGAACAGACTCCACTAAATAAAACATATGAAACCATGGCTGGTTCTTCAGCAGAGGCCATGTAGAGAAAGGAATGACCTAGGAAAGTTGGCCTGGAAGTGGAGGGAAGGATGGTGTGGGAAAAGCAGGAA--------TCTCGGAGACCAGCTTAGAGGCTTGGCAGTCACCTGGGTGCAGG-ATACAAGGGCCTGAGCCAAAGTGGTGAGGGAGGGTGGAAGGAGGCAGCCCAGAGAATGACCCTCCATGCCCACGGGGAAGGCAGAGGGCTCT-GAGAGCGA--TTCCTCCCACATG-CT-GAGCACTTGTTCTCCCTCTTCCTCCTGCATAGCAGTCAGTCTCCTCCAAACAGAAAGTCACCGGTTTGGACTTCATTCCTGGGCTCCACCCCATCCTGACCTTATCCAAGATGGACCAGACACTGGCAGTCTACCAACAGATCCTCACCAGTATGCCTTCCAGAAACGTGATCCAAATATCCAACGACCTGGAGAACCTCCGGGATCTTCTTCACGTGCTGGCCTTCTCTAAGAGCTGCCACTTGCCCTGGGCCAGTGGCCTGGAGACCTTGGACAGCCTGGGGGGTGTCCTGGAAGCTTCAGGCTACTCCACAGAGGTGGTGGCCCTGAGCAGGCTGCAGGGGTCTCTGCAGGACATGCTGTGGCAGCTGGACCTCAGCCCTGGGTGCTGAGGCCTTGAAGGTCACTCTTCCTGCAAGGACTACGTTAAGGGAAGGAACTCTGGCTTCCAGGTATCTCCAGGATTGAAGAGCATTGCATGGACACCCCTTATCCAGGACTCTGTCAATT--TCCCTGACTCCTCTAAGCCACTCTTCCAAAGGCATAAGACCCTAAGCCTCCTTTTGCTTGAAACCAAAGATATATACACAGGATCCTATTCTCACCAGGAAGGGGG-TCCACCC-AGCAAAGAGTGGGCTGCATCTGGGATTCCCACCAAGGTCTTCAGCCATCA---ACAAGAGTTGTCTTGTCCCCTCT-TGACCCATCT-----------------CCCCCTCACTGAATGCCTCAATGTGACCAGGGGTGATTTCAGAGAGGGCAGAGGGGTAGGCAGAGCCTTTGGATGACCA--GAACAAGGTTCCCTCTGAGAATTCCAAGGAGTTCCATGAAGACCACATCCACACACG--CAGGAACTCCC--AGCAACACAAGCTGGAA---GCACATGTTTATTTATTCTGCATTTTATTCTGGATGGATTTGAAGCAAAGCACCAGCTTCTCCAGGCTCTTTGGGGTCAGCCAGGGCCAGGGGTCTCCCTGGAGTGCAGTTTCCAATCCCATAGATGGGTC-TGGCTGAGCTGAACCCA---TTTTGAGTGACT----CGAGGGTTGGG-TTCATCTGAGCAAGAGCTGGCAAAGGTGGCTCTCCAGTTAGTTCTCTCGTAACTGGTTTCATTTCTACTGTGACTGATGTTACATCACAGTGTTTGCAATGGTGTTGCCCTGAGTGGATCTCCAAGGACCAGGTTATTTTAAAA---AGATTTGTTTTGTCAAGTGTCATATGTAGGTGTCTGCACCCAGGGGTGGG-GAATGTTTGGGCAGAAGGGAGAAGGATCTAGAATGTGTTTTCTGAATAACATTTGTGTGGTGGGTTCTTTGGAAGGAGTGAGA-TCATTTTCTTATCTTCTGCAATTGCTTAGGATGTTTTTCATGAAAA------------TAGCTCTTTCAG-GGGGGTTGTGAGGCCTGGCCAGGCACCCCCTGGAGAGAAGTTTCTGGCCCTGGCTGACCCCAAAGAGCCTGGAGAAGCTGATGCTTTGCTTCAAATCCATCCAGAATAAAACGCAAAGGGCTGAAAGCCATTTGTTGGGGCAGTGGTAAGCTCTGGCTTTCTCCGACTGCTAGGGAGTGGTCTTTCCTATCATGGAGTGACGGTCCCACACTGGTGACTGCGATCTTCAGAGCAGGGGTCCTTGGTGT-GACCCTCTGAATGGTCCAGGGTTGATCACACTCTGGGTTTATTACATGGCAG-----TGTTCCTATTTGGGGCTTGCATGCCAAATTGTAGTTCTTGTCTGATTGGCTCACCC-AAGCAAGGCCAAAATTACCAAAAATCTTGGGGGG--TTTTTACTC-CAGTGGTGAAGAAAACTCCTTTAGCAGG-TGGTCCTGAGACCT-GACAAGCACTGCTAGGCGAGTGCCAGGACTCCCCAGGCCAGGCCACCAGGATGGCCCTTCCCACTGGAGGTCACATTCAGGAAGATGAAAGAGGAGGTTTGGGGTCTGCCACCATCCTGCTGCTGTGTTTTTGCTATCACACAGTGGGTGGTGGATCTGTCCAAGGAAACTTGAATCAAAGCAGTTAAC-TTTAAGactgagcacctgcttcatgctcagccctgactggtgctataggctggagaagctcacccaataaacattaagatt-gaggcctgccctcagggatcttgcattcccagtggTCAAACC-GCACTCACCCATGTGCCAAGGTGGGGTA-TTTACCACAGCAG--CTGAACAGCCAAATGCATGGTGCAGTTGACAGCAGGTGGGAAATGGTATGAGCTGAGGGGGGCCGTGCCCAGGGGCCCACAGG-GAACCCTGCTTGCACTTTGTAACATGTTTA-----CTTTTCagggcatcttagctt---ctatta-----tagccacatccctttga---aacaagataactgagaatttaaaaataagaa-----aata--TGACCCCAAAGAGCCTGGAGAAGCTGATGCTTTGCTTCAAATCCATCCAGAATAAAACGCAGACCCCAAAGAGCCTGGAGAAGCTGATGCTTTGCTTCAAATCCATCCAGAATAAAACGCAGATGCTTTGCTTCAAATCCATCCAGAATAAAACGCAAATGACCCCAAAGAGCCTGGAGAAGCTGATGCTTTGCTTCAAATCCATCCAGAATAAAACGCATGACCCCAAAGAGCCTGGAGAAGCTGATGCTTTGCTTCAAATCCATCCAGAATAAAACGCAGACCCCAAAGAGCCTGGAGAAGCTGATGCTTTGCTTCAAATCCATCCAGAATAAAACGCAGATGCTTTGCTTCAAATCCATCCAGAATAAAACGCAGACCCCAAAGAGCCTGGAGAAGCTGATGCTTTGCTTCAAATCCATCCAGAATAAAACGCAGACCCCAAAGAGCCTGGAGAAGCTGATGCTTTGCTTCAAATCCATCCAGAATAAAACGCAGACCCCAAAGAGCCTGGAGAAGCTGATGCTTTGCTTCAAATCCATCCAGAATAAAACGCAGATGCTTTGCTTCAAATCCATCCAGAATAAAACGCA
diff -r aafe686858916d0191a29c9bd7252525769cea21 -r ed5f15df397e839a285b77797fcfc0ebcdef90ab test-data/users/test3(a)bx.psu.edu/run1/2.fasta
--- /dev/null
+++ b/test-data/users/test3(a)bx.psu.edu/run1/2.fasta
@@ -0,0 +1,11 @@
+>Sequence 561 BP; 135 A; 106 C; 98 G; 222 T; 0 other;
+gttcgatgcc taaaatacct tcttttgtcc ctacacagac cacagttttc ctaatggctt
+tacaccgact agaaattctt gtgcaagcac taattgaaag cggttggcct agagtgttac
+cggtttgtat agctgagcgc gtctcttgcc ctgatcaaag gttcattttc tctactttgg
+aagacgttgt ggaagaatac aacaagtacg agtctctccc ccctggtttg ctgattactg
+gatacagttg taataccctt cgcaacaccg cgtaactatc tatatgaatt attttccctt
+tattatatgt agtaggttcg tctttaatct tcctttagca agtcttttac tgttttcgac
+ctcaatgttc atgttcttag gttgttttgg ataatatgcg gtcagtttaa tcttcgttgt
+ttcttcttaa aatatttatt catggtttaa tttttggttt gtacttgttc aggggccagt
+tcattattta ctctgtttgt atacagcagt tcttttattt ttagtatgat tttaatttaa
+aacaattcta atggtcaaaa a
diff -r aafe686858916d0191a29c9bd7252525769cea21 -r ed5f15df397e839a285b77797fcfc0ebcdef90ab test/functional/test_library_features.py
--- a/test/functional/test_library_features.py
+++ b/test/functional/test_library_features.py
@@ -2,8 +2,8 @@
from base.test_db_util import *
-# TODO: Functional tests start failing at 070, fix or eliminate rest of tests.
class TestLibraryFeatures( TwillTestCase ):
+
def test_000_initiate_users( self ):
"""Ensuring all required user accounts exist"""
self.logout()
@@ -34,6 +34,7 @@
assert admin_user is not None, 'Problem retrieving user with email "test(a)bx.psu.edu" from the database'
global admin_user_private_role
admin_user_private_role = get_private_role( admin_user )
+
def test_005_create_libraries( self ):
"""Testing creating libraries used in this script, then renaming one of them"""
# Logged in as admin_user
@@ -72,6 +73,7 @@
new_description='library1 description',
new_synopsis='library1 synopsis' )
refresh( library1 )
+
def test_030_add_folder_to_library1( self ):
"""Testing adding a folder to a library1"""
# logged in as admin_user
@@ -89,6 +91,7 @@
self.browse_library( cntrller='library_admin',
library_id=self.security.encode_id( library1.id ),
strings_displayed=[ folder1.name, folder1.description ] )
+
def test_035_add_subfolder_to_folder( self ):
"""Testing adding a folder to a folder"""
# logged in as admin_user
@@ -105,6 +108,7 @@
self.browse_library( cntrller='library_admin',
library_id=self.security.encode_id( library1.id ),
strings_displayed=[ subfolder1.name, subfolder1.description ] )
+
def test_040_add_2nd_folder_to_library1( self ):
"""Testing adding a 2nd folder to a library1"""
# logged in as admin_user
@@ -121,6 +125,7 @@
self.browse_library( cntrller='library_admin',
library_id=self.security.encode_id( library1.id ),
strings_displayed=[ folder2.name, folder2.description ] )
+
def test_045_add_public_dataset_to_folder2( self ):
"""Testing adding a public dataset to folder2"""
# Logged in as admin_user
@@ -140,6 +145,7 @@
self.browse_library( cntrller='library_admin',
library_id=self.security.encode_id( library1.id ),
strings_displayed=[ ldda2.name, ldda2.message, 'bed' ] )
+
def test_050_add_2nd_public_dataset_to_folder2( self ):
"""Testing adding a 2nd public dataset folder2"""
# Logged in as admin_user
@@ -159,6 +165,7 @@
self.browse_library( cntrller='library_admin',
library_id=self.security.encode_id( library1.id ),
strings_displayed=[ ldda3.name, ldda3.message, 'bed' ] )
+
def test_055_copy_dataset_from_history_to_subfolder( self ):
"""Testing copying a dataset from the current history to a subfolder"""
# logged in as admin_user
@@ -179,6 +186,7 @@
self.browse_library( cntrller='library_admin',
library_id=self.security.encode_id( library1.id ),
strings_displayed=[ ldda4.name, ldda4.message, 'bed' ] )
+
def test_060_editing_dataset_attribute_info( self ):
"""Testing editing a library dataset's attribute information"""
# logged in as admin_user
@@ -193,6 +201,7 @@
self.browse_library( cntrller='library_admin',
library_id=self.security.encode_id( library1.id ),
strings_displayed=[ new_ldda_name, ldda4.message ] )
+
def test_065_uploading_new_dataset_version( self ):
"""Testing uploading a new version of a library dataset"""
# logged in as admin_user
@@ -227,6 +236,7 @@
self.browse_library( cntrller='library_admin',
library_id=self.security.encode_id( library1.id ),
strings_not_displayed=[ ldda4.name, ldda4.message ] )
+
def test_070_upload_directory_of_files_from_libraries_view( self ):
"""Testing uploading a directory of files to a root folder from the Data Libraries view"""
# logged in as admin_user
@@ -269,6 +279,7 @@
server_dir='run1',
ldda_message=ldda_message,
strings_displayed=[ 'Upload a directory of files', '<option>None</option>' ] )
+
def test_075_download_archive_of_library_files( self ):
"""Testing downloading an archive of files from library1"""
# logged in as regular_user3
@@ -292,6 +303,7 @@
format=format )
self.check_archive_contents( archive, ( ldda1, ldda2 ) )
os.remove( archive )
+
def test_080_check_libraries_for_uploaded_directories_of_files( self ):
"""Testing the results of uploading directories of files to library1"""
# We'll make sure the directories of files were uploaded in test_070... above.
@@ -306,6 +318,7 @@
self.browse_library( 'library',
self.security.encode_id( library1.id ),
strings_displayed=[ 'fasta', ldda_message, '2.fasta' ] )
+
def test_085_mark_ldda2_deleted( self ):
"""Testing marking ldda2 as deleted"""
# Logged in as admin_user
@@ -317,6 +330,7 @@
self.browse_library( cntrller='library_admin',
library_id=self.security.encode_id( library1.id ),
strings_not_displayed=[ ldda2.name, ldda2.message ] )
+
def test_090_display_and_hide_deleted_ldda2( self ):
"""Testing displaying and hiding a deleted ldda2"""
# Logged in as admin_user
@@ -327,6 +341,7 @@
self.browse_library( 'library_admin',
self.security.encode_id( library1.id ),
strings_not_displayed=[ ldda2.name, ldda2.message ] )
+
def test_095_mark_folder2_deleted( self ):
"""Testing marking folder2 as deleted"""
# Logged in as admin_user
@@ -338,6 +353,7 @@
self.browse_library( cntrller='library_admin',
library_id=self.security.encode_id( library1.id ),
strings_not_displayed=[ folder2.name ] )
+
def test_100_mark_folder_undeleted( self ):
"""Testing marking a library folder as undeleted"""
# Logged in as admin_user
@@ -352,6 +368,7 @@
library_id=self.security.encode_id( library1.id ),
strings_displayed=[ folder2.name ],
strings_not_displayed=[ ldda2.name ] )
+
def test_105_mark_library_deleted( self ):
"""Testing marking a library as deleted"""
# Logged in as admin_user
@@ -368,6 +385,7 @@
item_type='library' )
self.browse_libraries_admin( strings_not_displayed=[ library1.name ] )
self.browse_libraries_admin( deleted=True, strings_displayed=[ library1.name ] )
+
def test_110_mark_library_undeleted( self ):
"""Testing marking a library as undeleted"""
# Logged in as admin_user
@@ -381,6 +399,7 @@
library_id=self.security.encode_id( library1.id ),
strings_displayed=[ library1.name ],
strings_not_displayed=[ folder2.name ] )
+
def test_115_purge_library( self ):
"""Testing purging a library"""
# Logged in as admin_user
@@ -394,6 +413,7 @@
refresh( library1 )
if not ( library1.deleted and library1.purged ):
raise AssertionError( 'The library id %s named "%s" has not been marked as deleted and purged.' % ( str( library1.id ), library1.name ) )
+
def check_folder( library_folder ):
for folder in library_folder.folders:
refresh( folder )
@@ -421,6 +441,7 @@
raise AssertionError( 'The library_dataset id %s named "%s" has not been marked as deleted.' % \
( str( library_dataset.id ), library_dataset.name ) )
check_folder( library1.root_folder )
+
def test_120_populate_public_library2( self ):
"""Testing library datasets within a library"""
# Logged in as admin_user
@@ -500,6 +521,7 @@
global ldda7
ldda7 = get_latest_ldda_by_name( filename )
assert ldda7 is not None, 'Problem retrieving LibraryDatasetDatasetAssociation ldda7 from the database'
+
def test_125_move_dataset_within_library2( self ):
"""Testing moving a dataset within library2"""
# Logged in as admin_user
@@ -513,6 +535,7 @@
strings_displayed=[ 'Move data library items',
'3.bed' ],
strings_displayed_after_submit=[ '1 dataset moved to folder (Three) within data library (library2)' ] )
+
def test_130_move_folder_to_another_library( self ):
"""Testing moving a folder to another library"""
# Logged in as admin_user
@@ -536,6 +559,7 @@
self.browse_library( cntrller='library_admin',
library_id=self.security.encode_id( library3.id ),
strings_displayed=[ folder5.name, folder5.description, ldda7.name ] )
+
def test_135_upload_unsorted_bam_to_library_using_file_path_with_link_to_file( self ):
"""Test uploading 3unsorted.bam, using filesystem_paths option in combination with link_to_files"""
filename = '3unsorted.bam'
@@ -555,6 +579,7 @@
folder_id=self.security.encode_id( library2.root_folder.id ),
ldda_id=self.security.encode_id( ldda8.id ),
strings_displayed=[ 'The uploaded files need grooming, so change your <b>Copy data into Galaxy?</b> selection to be' ] )
+
def test_999_reset_data_for_later_test_runs( self ):
"""Reseting data to enable later test runs to pass"""
# Logged in as admin_user
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c05752549163/
Changeset: c05752549163
Branch: stable
User: dan
Date: 2014-04-16 19:28:22
Summary: Fix for bug reporting in Chrome (webkit), due to it not properly handling forms with disabled submit buttons.
Affected #: 1 file
diff -r aab39d3344e2fbe83c209f33d7e69fea2350709d -r c05752549163e2b3b6aeddbab8019af06443c461 templates/webapps/galaxy/dataset/errors.mako
--- a/templates/webapps/galaxy/dataset/errors.mako
+++ b/templates/webapps/galaxy/dataset/errors.mako
@@ -39,7 +39,8 @@
hiddenInput.name = button.name;
hiddenInput.value = button.value;
form.appendChild( hiddenInput );
- return true;
+ form.submit();
+ return false;
}
return false;
}
https://bitbucket.org/galaxy/galaxy-central/commits/aafe68685891/
Changeset: aafe68685891
User: dan
Date: 2014-04-16 19:31:00
Summary: merge stable
Affected #: 0 files
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Fix for bug reporting in Chrome (webkit), due to it not properly handling forms with disabled submit buttons.
by commits-noreply@bitbucket.org 16 Apr '14
by commits-noreply@bitbucket.org 16 Apr '14
16 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/2d8ab92940fb/
Changeset: 2d8ab92940fb
User: dan
Date: 2014-04-16 19:28:22
Summary: Fix for bug reporting in Chrome (webkit), due to it not properly handling forms with disabled submit buttons.
Affected #: 1 file
diff -r bd1abde45a4132a9d8297a76731245062be14440 -r 2d8ab92940fb7f7ee42b8a7478fd9f4406d401d3 templates/webapps/galaxy/dataset/errors.mako
--- a/templates/webapps/galaxy/dataset/errors.mako
+++ b/templates/webapps/galaxy/dataset/errors.mako
@@ -39,7 +39,8 @@
hiddenInput.name = button.name;
hiddenInput.value = button.value;
form.appendChild( hiddenInput );
- return true;
+ form.submit();
+ return false;
}
return false;
}
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/aab39d3344e2/
Changeset: aab39d3344e2
Branch: stable
User: dan
Date: 2014-04-16 16:50:23
Summary: Manually graft IGB updates to stable, since the old display applications now no longer work properly.
Affected #: 8 files
diff -r 1ad62c7727285084e46ee3572835483e34c551a5 -r aab39d3344e2fbe83c209f33d7e69fea2350709d datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample
+++ b/datatypes_conf.xml.sample
@@ -26,6 +26,7 @@
</datatype><datatype extension="bedgraph" type="galaxy.datatypes.interval:BedGraph" display_in_upload="true"><converter file="bedgraph_to_bigwig_converter.xml" target_datatype="bigwig"/>
+ <display file="igb/bedgraph.xml" /></datatype><datatype extension="bedstrict" type="galaxy.datatypes.interval:BedStrict" /><datatype extension="bed6" type="galaxy.datatypes.interval:Bed6">
@@ -98,6 +99,7 @@
<datatype extension="gtf" type="galaxy.datatypes.interval:Gtf" display_in_upload="true"><converter file="gff_to_interval_index_converter.xml" target_datatype="interval_index"/><converter file="bed_gff_or_vcf_to_bigwig_converter.xml" target_datatype="bigwig"/>
+ <display file="igb/gtf.xml" /></datatype><datatype extension="toolshed.gz" type="galaxy.datatypes.binary:Binary" mimetype="multipart/x-gzip" subclass="True" /><datatype extension="h5" type="galaxy.datatypes.binary:Binary" mimetype="application/octet-stream" subclass="True" />
diff -r 1ad62c7727285084e46ee3572835483e34c551a5 -r aab39d3344e2fbe83c209f33d7e69fea2350709d display_applications/igb/bam.xml
--- a/display_applications/igb/bam.xml
+++ b/display_applications/igb/bam.xml
@@ -1,58 +1,14 @@
<display id="igb_bam" version="0.0.0" name="display in IGB">
- <link id="Local" name="Local">
- <url>http://localhost:7085/UnibrowControl?version=${bam_file.dbkey}&feature_…</url>
- <param type="data" name="bam_file_for_name" viewable="False"/>
- <param type="template" name="thenicename" viewable="False" strip="True">
- #import re
- #set nm=$bam_file_for_name.name
- ${re.sub('\W',"_",nm)}
- </param>
- <param type="data" name="bai_file" url="${thenicename}_${DATASET_HASH}.bam.bai" metadata="bam_index" strip_https="True" />
- <param type="data" name="bam_file" url="${thenicename}_${DATASET_HASH}.bam" strip_https="True" />
- </link>
+ <link id="View" name="View">
+ <url>http://bioviz.org/igb/galaxy.html?version=${bam_file.dbkey}&feature_url…</url>
+ <param type="data" name="bam_file_for_name" viewable="False"/>
+ <param type="template" name="niceName" viewable="False" strip="True">
+ #import re
+ #set nm=$bam_file_for_name.name
+ ${re.sub('\W',"_",nm)}
+ </param>
+ <param type="data" name="bai_file" url="${niceName}.bam.bai" metadata="bam_index" strip_https="True" />
+ <param type="data" name="bam_file" url="${niceName}.bam" strip_https="True" />
+ </link>
- <link id="Web" name="Web">
- <url>$jnlp.url</url>
- <param type="data" name="bam_file_for_name" viewable="False"/>
- <param type="template" name="thenicename" viewable="False" strip="True">
- #import re
- #set nm=$bam_file_for_name.name
- ${re.sub('\W',"_",nm)}
- </param>
- <param type="data" name="bai_file" url="${thenicename}_${DATASET_HASH}.bam.bai" metadata="bam_index" strip_https="True" />
- <param type="data" name="bam_file" url="${thenicename}_${DATASET_HASH}.bam" strip_https="True" />
- <param type="template" name="jnlp" url="${thenicename}_${DATASET_HASH}.jnlp" viewable="True" strip_https="True" mimetype="application/x-java-jnlp-file">
-<?xml version="1.0" encoding="utf-8"?>
-<jnlp spec="6.0+" version="" codebase="http://www.bioviz.org/igb/releases/current/" >
- <information>
- <title>IGB</title>
- <vendor>Genoviz Project</vendor>
- <homepage href="http://genoviz.sourceforge.net/" />
- <description>Integrated Genome Browser</description>
- <icon href="igb.gif"/>
- <offline-allowed/>
- <shortcut online="true">
- <desktop/>
- <menu submenu="IGB" />
- </shortcut>
- </information>
- <security>
- <all-permissions/>
- </security>
- <resources>
- <java version="1.6+" initial-heap-size="32m" max-heap-size="1024m"/>
- <jar href="igb_exe.jar" main="true" />
- <jar href="igb-i18n.jar" />
- <property name="apple.laf.useScreenMenuBar" value="true" />
- <property name="http.agent" value="IGB (Webstart)" />
- </resources>
- <application-desc main-class="com.affymetrix.main.Main">
- <argument>-prefs</argument>
- <argument>http://www.bioviz.org/igb/releases/current/igb_prefs.xml</argument>
- <argument>-href</argument>
- <argument>http://localhost:7085/UnibrowControl?version=${bam_file.dbkey}&feature_url_0=${bam_file.url}&sym_name_0=${thenicename}&sym_method_0=${bam_file.url}&query_url=${bam_file.url}&server_url=galaxy </argument>
- </application-desc>
-</jnlp>
- </param>
- </link></display>
diff -r 1ad62c7727285084e46ee3572835483e34c551a5 -r aab39d3344e2fbe83c209f33d7e69fea2350709d display_applications/igb/bb.xml
--- a/display_applications/igb/bb.xml
+++ b/display_applications/igb/bb.xml
@@ -1,58 +1,14 @@
<display id="igb_bb" version="1.0.0" name="display in IGB">
- <link id="Local" name="Local">
- <url>http://localhost:7085/UnibrowControl?version=${bigbed_file.dbkey}&loadr…</url>
+ <link id="View" name="View">
+ <url>http://bioviz.org/igb/galaxy.html?version=${bigbed_file.dbkey}&loadresi…</url><param type="data" name="bigbed_file_for_name" viewable="False"/>
- <param type="template" name="thenicename" viewable="False" strip="True">
+ <param type="template" name="niceName" viewable="False" strip="True">
#import re
#set nm=$bigbed_file_for_name.name
${re.sub('\W',"_",nm)}
</param>
- <param type="data" name="bigbed_file" url="${thenicename}_${DATASET_HASH}.bigbed" strip_https="True" />
- </link>
-
- <link id="Web" name="Web">
- <url>$jnlp.url</url>
- <param type="data" name="bigbed_file_for_name" viewable="False"/>
- <param type="template" name="thenicename" viewable="False" strip="True">
- #import re
- #set nm=$bigbed_file_for_name.name
- ${re.sub('\W',"_",nm)}
- </param>
- <param type="data" name="bigbed_file" url="${thenicename}_${DATASET_HASH}.bigbed" strip_https="True" />
- <param type="template" name="jnlp" url="${thenicename}_${DATASET_HASH}.jnlp" viewable="True" strip_https="True" mimetype="application/x-java-jnlp-file">
-<?xml version="1.0" encoding="utf-8"?>
-<jnlp spec="6.0+" version="" codebase="http://www.bioviz.org/igb/releases/current/" >
- <information>
- <title>IGB</title>
- <vendor>Genoviz Project</vendor>
- <homepage href="http://genoviz.sourceforge.net/" />
- <description>Integrated Genome Browser</description>
- <icon href="igb.gif"/>
- <offline-allowed/>
- <shortcut online="true">
- <desktop/>
- <menu submenu="IGB" />
- </shortcut>
- </information>
- <security>
- <all-permissions/>
- </security>
- <resources>
- <java version="1.6+" initial-heap-size="32m" max-heap-size="1024m"/>
- <jar href="igb_exe.jar" main="true" />
- <jar href="igb-i18n.jar" />
- <property name="apple.laf.useScreenMenuBar" value="true" />
- <property name="http.agent" value="IGB (Webstart)" />
- </resources>
- <application-desc main-class="com.affymetrix.main.Main">
- <argument>-prefs</argument>
- <argument>http://www.bioviz.org/igb/releases/current/igb_prefs.xml</argument>
- <argument>-href</argument>
- <argument>http://localhost:7085/UnibrowControl?version=${bigbed_file.dbkey}&loadresidues=false&feature_url_0=${bigbed_file.url}&sym_name_0=${thenicename}&sym_method_0=${bigbed_file.url}&query_url=${bigbed_file.url}&server_url=galaxy </argument>
- </application-desc>
-</jnlp>
- </param>
+ <param type="data" name="bigbed_file" url="${niceName}.bigbed" strip_https="True" /></link></display>
diff -r 1ad62c7727285084e46ee3572835483e34c551a5 -r aab39d3344e2fbe83c209f33d7e69fea2350709d display_applications/igb/bed.xml
--- a/display_applications/igb/bed.xml
+++ b/display_applications/igb/bed.xml
@@ -1,73 +1,17 @@
<display id="igb_bed" version="1.0.0" name="display in IGB">
- <link id="Local" name="Local">
- <url>http://localhost:7085/UnibrowControl?version=${bed_file.dbkey}&${positi…</url>
- <param type="data" name="bed_file_for_name" viewable="False"/>
- <param type="template" name="thenicename" viewable="False" strip="True">
- #import re
- #set nm=$bed_file_for_name.name
- ${re.sub('\W',"_",nm)}
+ <link id="View" name="View">
+ <url>$bioviz</url>
+ <param type="data" name="bed_file_for_name" viewable="False"/>
+ <param type="template" name="niceName" viewable="False" strip="True">
+ #import re
+ #set nm=$bed_file_for_name.name
+ ${re.sub('\W',"_",nm)}
+ </param>
+ <param type="data" name="bed_file" url="${niceName}.bed" strip_https="True" />
+
+ <param type="template" name="bioviz" strip="True" >
+ http://bioviz.org/igb/galaxy.html?version=${bed_file.dbkey}&loadresidue…
</param>
- <param type="data" name="bed_file" url="${thenicename}_${DATASET_HASH}.bed" strip_https="True" />
- <param type="template" name="position" strip="True" >
- #set chrom, start, end = $bed_file.datatype.get_estimated_display_viewport( $bed_file )
- #if $chrom is not None:
- seqid=${chrom}&start=${start}&end=${int(end) + 1}
- #else:
- seqid=&start=&end=
- #end if
- </param>
- </link>
-
- <link id="Web" name="Web">
- <url>$jnlp.url</url>
- <param type="data" name="bed_file_for_name" viewable="False"/>
- <param type="template" name="thenicename" viewable="False" strip="True">
- #import re
- #set nm=$bed_file_for_name.name
- ${re.sub('\W',"_",nm)}
- </param>
- <param type="data" name="bed_file" url="${thenicename}_${DATASET_HASH}.bed" strip_https="True" />
- <param type="template" name="position" strip="True" >
- #set chrom, start, end = $bed_file.datatype.get_estimated_display_viewport( $bed_file )
- #if $chrom is not None:
- seqid=${chrom}&start=${start}&end=${int(end) + 1}
- #else:
- seqid=&start=&end=
- #end if
- </param>
- <param type="template" name="jnlp" url="${thenicename}_${DATASET_HASH}.jnlp" viewable="True" strip_https="True" mimetype="application/x-java-jnlp-file">
-<?xml version="1.0" encoding="utf-8"?>
-<jnlp spec="6.0+" version="" codebase="http://www.bioviz.org/igb/releases/current/" >
- <information>
- <title>IGB</title>
- <vendor>Genoviz Project</vendor>
- <homepage href="http://genoviz.sourceforge.net/" />
- <description>Integrated Genome Browser</description>
- <icon href="igb.gif"/>
- <offline-allowed/>
- <shortcut online="true">
- <desktop/>
- <menu submenu="IGB" />
- </shortcut>
- </information>
- <security>
- <all-permissions/>
- </security>
- <resources>
- <java version="1.6+" initial-heap-size="32m" max-heap-size="1024m"/>
- <jar href="igb_exe.jar" main="true" />
- <jar href="igb-i18n.jar" />
- <property name="apple.laf.useScreenMenuBar" value="true" />
- <property name="http.agent" value="IGB (Webstart)" />
- </resources>
- <application-desc main-class="com.affymetrix.main.Main">
- <argument>-prefs</argument>
- <argument>http://www.bioviz.org/igb/releases/current/igb_prefs.xml</argument>
- <argument>-href</argument>
- <argument>http://localhost:7085/UnibrowControl?version=${bed_file.dbkey}&${position}&loadresidues=false&feature_url_0=${bed_file.url}&sym_name_0=${thenicename}&sym_method_0=${bed_file.url}&query_url=${bed_file.url}&server_url=galaxy </argument>
- </application-desc>
-</jnlp>
- </param>
- </link>
+ </link></display>
diff -r 1ad62c7727285084e46ee3572835483e34c551a5 -r aab39d3344e2fbe83c209f33d7e69fea2350709d display_applications/igb/bedgraph.xml
--- /dev/null
+++ b/display_applications/igb/bedgraph.xml
@@ -0,0 +1,17 @@
+<display id="igb_bedgraph" version="1.0.0" name="display in IGB">
+
+ <link id="View" name="View">
+ <url>$bioviz</url>
+ <param type="data" name="bedgraph_file_for_name" viewable="False"/>
+ <param type="template" name="niceName" viewable="False" strip="True">
+ #import re
+ #set nm=$bedgraph_file_for_name.name
+ ${re.sub('\W',"_",nm)}
+ </param>
+ <param type="data" name="bedgraph_file" url="${niceName}.bed.bedgraph" strip_https="True" />
+
+ <param type="template" name="bioviz" strip="True" >
+ http://bioviz.org/igb/galaxy.html?version=${bedgraph_file.dbkey}&loadre…
+ </param>
+ </link>
+</display>
diff -r 1ad62c7727285084e46ee3572835483e34c551a5 -r aab39d3344e2fbe83c209f33d7e69fea2350709d display_applications/igb/bigwig.xml
--- a/display_applications/igb/bigwig.xml
+++ b/display_applications/igb/bigwig.xml
@@ -1,14 +1,14 @@
<display id="igb_bigwig" version="1.0.0" name="display in IGB">
- <link id="Local" name="Local">
- <url>http://localhost:7085/UnibrowControl?version=${bigwig_file.dbkey}&loadr…</url>
+ <link id="View" name="View">
+ <url>http://bioviz.org/igb/galaxy.html?version=${bigwig_file.dbkey}&loadresi…</url><param type="data" name="bigwig_file_for_name" viewable="False"/>
- <param type="template" name="thenicename" viewable="False" strip="True">
+ <param type="template" name="niceName" viewable="False" strip="True">
#import re
#set nm=$bigwig_file_for_name.name
${re.sub('\W',"_",nm)}
</param>
- <param type="data" name="bigwig_file" url="${thenicename}_${DATASET_HASH}.bigwig" strip_https="True" />
+ <param type="data" name="bigwig_file" url="${niceName}.bigwig" strip_https="True" /><!--<param type="template" name="position" strip="True" >
#set chrom, start, end = $bigwig_file.datatype.get_estimated_display_viewport( $bigwig_file )
#if $chrom is not None:
@@ -19,47 +19,4 @@
</param>--></link>
- <link id="Web" name="Web">
- <url>$jnlp.url</url>
- <param type="data" name="bigwig_file_for_name" viewable="False"/>
- <param type="template" name="thenicename" viewable="False" strip="True">
- #import re
- #set nm=$bigwig_file_for_name.name
- ${re.sub('\W',"_",nm)}
- </param>
- <param type="data" name="bigwig_file" url="${thenicename}_${DATASET_HASH}.bigwig" strip_https="True" />
- <param type="template" name="jnlp" url="${thenicename}_${DATASET_HASH}.jnlp" viewable="True" strip_https="True" mimetype="application/x-java-jnlp-file">
-<?xml version="1.0" encoding="utf-8"?>
-<jnlp spec="6.0+" version="" codebase="http://www.bioviz.org/igb/releases/current/" >
- <information>
- <title>IGB</title>
- <vendor>Genoviz Project</vendor>
- <homepage href="http://genoviz.sourceforge.net/" />
- <description>Integrated Genome Browser</description>
- <icon href="igb.gif"/>
- <offline-allowed/>
- <shortcut online="true">
- <desktop/>
- <menu submenu="IGB" />
- </shortcut>
- </information>
- <security>
- <all-permissions/>
- </security>
- <resources>
- <java version="1.6+" initial-heap-size="32m" max-heap-size="1024m"/>
- <jar href="igb_exe.jar" main="true" />
- <jar href="igb-i18n.jar" />
- <property name="apple.laf.useScreenMenuBar" value="true" />
- <property name="http.agent" value="IGB (Webstart)" />
- </resources>
- <application-desc main-class="com.affymetrix.main.Main">
- <argument>-prefs</argument>
- <argument>http://www.bioviz.org/igb/releases/current/igb_prefs.xml</argument>
- <argument>-href</argument>
- <argument>http://localhost:7085/UnibrowControl?version=${bigwig_file.dbkey}&loadresidues=false&feature_url_0=${bigwig_file.url}&sym_name_0=${thenicename}&sym_method_0=${bigwig_file.url}&query_url=${bigwig_file.url}&server_url=galaxy </argument>
- </application-desc>
-</jnlp>
- </param>
- </link></display>
diff -r 1ad62c7727285084e46ee3572835483e34c551a5 -r aab39d3344e2fbe83c209f33d7e69fea2350709d display_applications/igb/gtf.xml
--- /dev/null
+++ b/display_applications/igb/gtf.xml
@@ -0,0 +1,17 @@
+<display id="igb_gtf" version="1.0.0" name="display in IGB">
+
+ <link id="View" name="View">
+ <url>$bioviz</url>
+ <param type="data" name="gtf_file_for_name" viewable="False"/>
+ <param type="template" name="niceName" viewable="False" strip="True">
+ #import re
+ #set nm=$gtf_file_for_name.name
+ ${re.sub('\W',"_",nm)}
+ </param>
+ <param type="data" name="gtf_file" url="${niceName}.gtf" strip_https="True" />
+
+ <param type="template" name="bioviz" strip="True" >
+ http://bioviz.org/igb/galaxy.html?version=${gtf_file.dbkey}&loadresidue…
+ </param>
+ </link>
+</display>
\ No newline at end of file
diff -r 1ad62c7727285084e46ee3572835483e34c551a5 -r aab39d3344e2fbe83c209f33d7e69fea2350709d display_applications/igb/wig.xml
--- a/display_applications/igb/wig.xml
+++ b/display_applications/igb/wig.xml
@@ -1,14 +1,14 @@
<display id="igb_wig" version="1.0.0" name="display in IGB">
- <link id="Local" name="Local">
- <url>http://localhost:7085/UnibrowControl?version=${wig_file.dbkey}&${positi…</url>
+ <link id="View" name="View">
+ <url>http://bioviz.org/igb/galaxy.html?version=${wig_file.dbkey}&${position}…</url><param type="data" name="wig_file_for_name" viewable="False"/>
- <param type="template" name="thenicename" viewable="False" strip="True">
+ <param type="template" name="niceName" viewable="False" strip="True">
#import re
#set nm=$wig_file_for_name.name
${re.sub('\W',"_",nm)}
</param>
- <param type="data" name="wig_file" url="${thenicename}_${DATASET_HASH}.wig" strip_https="True" />
+ <param type="data" name="wig_file" url="${niceName}.wig" strip_https="True" /><param type="template" name="position" strip="True" >
#set chrom, start, end = $wig_file.datatype.get_estimated_display_viewport( $wig_file )
#if $chrom is not None:
@@ -18,57 +18,5 @@
#end if
</param></link>
-
- <link id="Web" name="Web">
- <url>$jnlp.url</url>
- <param type="data" name="wig_file_for_name" viewable="False"/>
- <param type="template" name="thenicename" viewable="False" strip="True">
- #import re
- #set nm=$wig_file_for_name.name
- ${re.sub('\W',"_",nm)}
- </param>
- <param type="data" name="wig_file" url="${thenicename}_${DATASET_HASH}.wig" strip_https="True" />
- <param type="template" name="position" strip="True" >
- #set chrom, start, end = $wig_file.datatype.get_estimated_display_viewport( $wig_file )
- #if $chrom is not None:
- seqid=${chrom}&start=${start}&end=${int(end) + 1}
- #else:
- seqid=&start=&end=
- #end if
- </param>
- <param type="template" name="jnlp" url="${thenicename}_${DATASET_HASH}.jnlp" viewable="True" strip_https="True" mimetype="application/x-java-jnlp-file">
-<?xml version="1.0" encoding="utf-8"?>
-<jnlp spec="6.0+" version="" codebase="http://www.bioviz.org/igb/releases/current/" >
- <information>
- <title>IGB</title>
- <vendor>Genoviz Project</vendor>
- <homepage href="http://genoviz.sourceforge.net/" />
- <description>Integrated Genome Browser</description>
- <icon href="igb.gif"/>
- <offline-allowed/>
- <shortcut online="true">
- <desktop/>
- <menu submenu="IGB" />
- </shortcut>
- </information>
- <security>
- <all-permissions/>
- </security>
- <resources>
- <java version="1.6+" initial-heap-size="32m" max-heap-size="1024m"/>
- <jar href="igb_exe.jar" main="true" />
- <jar href="igb-i18n.jar" />
- <property name="apple.laf.useScreenMenuBar" value="true" />
- <property name="http.agent" value="IGB (Webstart)" />
- </resources>
- <application-desc main-class="com.affymetrix.main.Main">
- <argument>-prefs</argument>
- <argument>http://www.bioviz.org/igb/releases/current/igb_prefs.xml</argument>
- <argument>-href</argument>
- <argument>http://localhost:7085/UnibrowControl?version=${wig_file.dbkey}&${position}&loadresidues=false&feature_url_0=${wig_file.url}&sym_name_0=${thenicename}&sym_method_0=${wig_file.url}&query_url=${wig_file.url}&server_url=galaxy </argument>
- </application-desc>
-</jnlp>
- </param>
- </link></display>
https://bitbucket.org/galaxy/galaxy-central/commits/bd1abde45a41/
Changeset: bd1abde45a41
User: dan
Date: 2014-04-16 16:51:00
Summary: merge stable
Affected #: 8 files
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jmchilton: If 'populating' state from tool API request - stop processing tree on conditional test param error.
by commits-noreply@bitbucket.org 16 Apr '14
by commits-noreply@bitbucket.org 16 Apr '14
16 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/7c6fce1fd9e7/
Changeset: 7c6fce1fd9e7
User: jmchilton
Date: 2014-04-16 16:11:31
Summary: If 'populating' state from tool API request - stop processing tree on conditional test param error.
Attempting to populate the state below the conditional parameter can result in uncaught exceptions in some cases. See Peter's post here - http://dev.list.galaxyproject.org/Unclear-API-and-Twill-test-failure-for-un… for example.
Affected #: 1 file
diff -r cd73af9c02e7f94d76239c010da12fcf1f91d1d4 -r 7c6fce1fd9e7f7adb4811cd92a56cdff05ea748d lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -2133,28 +2133,31 @@
context,
source )
- current_case = input.get_current_case( value, trans )
- # Current case has changed, throw away old state
- group_state = state[input.name] = {}
- # TODO: we should try to preserve values if we can
- self.fill_in_new_state( trans, input.cases[current_case].inputs, group_state, context, history=history )
- group_errors = self.populate_state( trans,
- input.cases[current_case].inputs,
- group_state,
- incoming,
- history,
- source,
- prefix=group_prefix,
- context=context,
- )
if test_param_error:
- group_errors[ input.test_param.name ] = test_param_error
- if group_errors:
- errors[ input.name ] = group_errors
- # Store the current case in a special value
- group_state['__current_case__'] = current_case
- # Store the value of the test element
- group_state[ input.test_param.name ] = value
+ errors[ input.name ] = [ test_param_error ]
+ # Store the value of the test element
+ group_state[ input.test_param.name ] = value
+ else:
+ current_case = input.get_current_case( value, trans )
+ # Current case has changed, throw away old state
+ group_state = state[input.name] = {}
+ # TODO: we should try to preserve values if we can
+ self.fill_in_new_state( trans, input.cases[current_case].inputs, group_state, context, history=history )
+ group_errors = self.populate_state( trans,
+ input.cases[current_case].inputs,
+ group_state,
+ incoming,
+ history,
+ source,
+ prefix=group_prefix,
+ context=context,
+ )
+ if group_errors:
+ errors[ input.name ] = group_errors
+ # Store the current case in a special value
+ group_state['__current_case__'] = current_case
+ # Store the value of the test element
+ group_state[ input.test_param.name ] = value
elif isinstance( input, UploadDataset ):
group_state = state[input.name]
group_errors = []
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: davebgx: Remove stray debug output.
by commits-noreply@bitbucket.org 16 Apr '14
by commits-noreply@bitbucket.org 16 Apr '14
16 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/cd73af9c02e7/
Changeset: cd73af9c02e7
User: davebgx
Date: 2014-04-16 15:23:09
Summary: Remove stray debug output.
Affected #: 1 file
diff -r f3c5d9a5ed95956442dbd39e9ce97367cdc0d93b -r cd73af9c02e7f94d76239c010da12fcf1f91d1d4 lib/galaxy/datatypes/metadata.py
--- a/lib/galaxy/datatypes/metadata.py
+++ b/lib/galaxy/datatypes/metadata.py
@@ -637,7 +637,6 @@
# for the compute server.
def metadata_path_on_compute(path):
compute_path = path
- log.info(compute_tmp_dir)
if compute_tmp_dir and tmp_dir and in_directory(path, tmp_dir):
path_relative = os.path.relpath(path, tmp_dir)
compute_path = os.path.join(compute_tmp_dir, path_relative)
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: davebgx: Modify test framework to account for recent UI changes.
by commits-noreply@bitbucket.org 16 Apr '14
by commits-noreply@bitbucket.org 16 Apr '14
16 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f3c5d9a5ed95/
Changeset: f3c5d9a5ed95
User: davebgx
Date: 2014-04-16 15:18:56
Summary: Modify test framework to account for recent UI changes.
Affected #: 2 files
diff -r 6f698dec58950f0f56421a13474df0359c0777d7 -r f3c5d9a5ed95956442dbd39e9ce97367cdc0d93b test/base/twilltestcase.py
--- a/test/base/twilltestcase.py
+++ b/test/base/twilltestcase.py
@@ -385,12 +385,6 @@
return value == hda[ key ]
return False
- def clear_history( self ):
- """Empties a history of all datasets"""
- self.visit_page( "clear_history" )
- self.check_history_for_string( 'Your history is empty' )
- self.home()
-
def delete_history( self, id ):
"""Deletes one or more histories"""
history_list = self.get_histories_as_data_list()
@@ -466,7 +460,8 @@
self.visit_url( "%s/history_new?name=%s" % ( self.url, name ) )
else:
self.visit_url( "%s/history_new" % self.url )
- self.check_history_for_string('Your history is empty')
+ self.check_page_for_string( 'New history created' )
+ assert self.is_history_empty(), 'Creating new history did not result in an empty history.'
self.home()
def rename_history( self, id, old_name, new_name ):
diff -r 6f698dec58950f0f56421a13474df0359c0777d7 -r f3c5d9a5ed95956442dbd39e9ce97367cdc0d93b test/functional/test_history_functions.py
--- a/test/functional/test_history_functions.py
+++ b/test/functional/test_history_functions.py
@@ -98,7 +98,7 @@
if not historyB.deleted:
raise AssertionError( "Problem deleting history id %d" % historyB.id )
# Since we deleted the current history, make sure the history frame was refreshed
- self.check_history_for_string( 'Your history is empty.' )
+ assert self.is_history_empty(), 'Deleting active history did not result in a new empty history being created.'
# We'll now test deleting a list of histories
# After deleting the current history, a new one should have been created
global history1
@@ -121,7 +121,7 @@
ids = '%s,%s' % ( self.security.encode_id( history1.id ), self.security.encode_id( history2.id ) )
self.delete_history( ids )
# Since we deleted the current history, make sure the history frame was refreshed
- self.check_history_for_string( 'Your history is empty.' )
+ assert self.is_history_empty(), 'Deleting active history did not result in a new empty history being created.'
try:
self.view_stored_active_histories( strings_displayed=[ history1.name ] )
raise AssertionError( "History %s is displayed in the active history list after it was deleted" % history1.name )
@@ -790,7 +790,7 @@
self.check_page_for_string( 'hg15' )
self.assertEqual( len( self.get_history_as_data_list() ), 1 )
# Delete the history item
- self.delete_history_item( str( latest_hda.id ), strings_displayed=[ "Your history is empty" ] )
+ self.delete_history_item( str( latest_hda.id ), strings_displayed=[] )
self.assertEqual( len( self.get_history_as_data_list() ), 0 )
# Try deleting an invalid hid
try:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: Client App: factor out config serializer, move defensive programming
by commits-noreply@bitbucket.org 15 Apr '14
by commits-noreply@bitbucket.org 15 Apr '14
15 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/6f698dec5895/
Changeset: 6f698dec5895
User: carlfeberhard
Date: 2014-04-15 22:06:26
Summary: Client App: factor out config serializer, move defensive programming
Affected #: 1 file
diff -r 1da9460ee1d0d5f3f89a767e41c40b5188af988c -r 6f698dec58950f0f56421a13474df0359c0777d7 templates/galaxy_client_app.mako
--- a/templates/galaxy_client_app.mako
+++ b/templates/galaxy_client_app.mako
@@ -3,27 +3,10 @@
<%def name="bootstrap()">
## Bootstap dictionaries for GalaxyApp object's JSON, create GalaxyApp,
## and steal existing attributes from plain objects already created
- <%
- config_dict = {}
- user_dict = {}
- try:
- if 'configuration' in trans.webapp.api_controllers:
- config_dict = ( trans.webapp.api_controllers[ 'configuration' ]
- .get_config_dict( trans.app.config, trans.user_is_admin() ) )
-
- if 'users' in trans.webapp.api_controllers:
- user_dict = self.get_user_dict()
-
- except Exception, exc:
- pass
-
- # genomes
- # datatypes
- %><script type="text/javascript">
require([ 'galaxy-app-base' ], function( app ){
galaxy = new app.GalaxyApp({
- config : ${ h.to_json_string( config_dict ) },
+ config : ${ get_config_json() },
userJSON : ${ get_user_json() },
root : '${h.url_for( "/" )}',
//TODO: get these options from the server
@@ -48,34 +31,64 @@
</script></%def>
+
+## ----------------------------------------------------------------------------
+<%def name="get_config_dict()">
+ ## Return a dictionary of universe_wsgi.ini settings
+ <%
+ config_dict = {}
+ try:
+ if 'configuration' in trans.webapp.api_controllers:
+ config_dict = ( trans.webapp.api_controllers[ 'configuration' ]
+ .get_config_dict( trans.app.config, trans.user_is_admin() ) )
+ except Exception, exc:
+ pass
+
+ return config_dict
+ %>
+</%def>
+
+<%def name="get_config_json()">
+ ## Conv. fn to write as JSON
+${ h.to_json_string( get_config_dict() )}
+</%def>
+
+
## ----------------------------------------------------------------------------
<%def name="get_user_dict()">
## Return a dictionary of user or anonymous user data including:
## email, id, disk space used, quota percent, and tags used
<%
- if trans.user:
- user_dict = trans.user.to_dict( view='element',
- value_mapper={ 'id': trans.security.encode_id, 'total_disk_usage': float } )
- user_dict[ 'quota_percent' ] = trans.app.quota_agent.get_percent( trans=trans )
+ user_dict = {}
+ try:
+ if trans.user:
+ user_dict = trans.user.to_dict( view='element',
+ value_mapper={ 'id': trans.security.encode_id, 'total_disk_usage': float } )
+ user_dict[ 'quota_percent' ] = trans.app.quota_agent.get_percent( trans=trans )
- # tags used
- users_api_controller = trans.webapp.api_controllers[ 'users' ]
- user_dict[ 'tags_used' ] = users_api_controller.get_user_tags_used( trans, user=trans.user )
- return user_dict
+ # tags used
+ users_api_controller = trans.webapp.api_controllers[ 'users' ]
+ user_dict[ 'tags_used' ] = users_api_controller.get_user_tags_used( trans, user=trans.user )
+ return user_dict
- usage = 0
- percent = None
- try:
- usage = trans.app.quota_agent.get_usage( trans, history=trans.history )
- percent = trans.app.quota_agent.get_percent( trans=trans, usage=usage )
- except AssertionError, assertion:
- # no history for quota_agent.get_usage assertion
+ usage = 0
+ percent = None
+ try:
+ usage = trans.app.quota_agent.get_usage( trans, history=trans.history )
+ percent = trans.app.quota_agent.get_percent( trans=trans, usage=usage )
+ except AssertionError, assertion:
+ # no history for quota_agent.get_usage assertion
+ pass
+ return {
+ 'total_disk_usage' : int( usage ),
+ 'nice_total_disk_usage' : util.nice_size( usage ),
+ 'quota_percent' : percent
+ }
+
+ except Exception, exc:
pass
- return {
- 'total_disk_usage' : int( usage ),
- 'nice_total_disk_usage' : util.nice_size( usage ),
- 'quota_percent' : percent
- }
+
+ return user_dict
%></%def>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: Fix to dcc0c19 when user controller isn't present, gen. defensive programming
by commits-noreply@bitbucket.org 15 Apr '14
by commits-noreply@bitbucket.org 15 Apr '14
15 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/1da9460ee1d0/
Changeset: 1da9460ee1d0
User: carlfeberhard
Date: 2014-04-15 21:40:48
Summary: Fix to dcc0c19 when user controller isn't present, gen. defensive programming
Affected #: 1 file
diff -r 5e079414e9f9ca489229816553e5133f5b3d5c0e -r 1da9460ee1d0d5f3f89a767e41c40b5188af988c templates/galaxy_client_app.mako
--- a/templates/galaxy_client_app.mako
+++ b/templates/galaxy_client_app.mako
@@ -5,11 +5,17 @@
## and steal existing attributes from plain objects already created
<%
config_dict = {}
- if 'configuration' in trans.webapp.api_controllers:
- config_dict = ( trans.webapp.api_controllers[ 'configuration' ]
- .get_config_dict( trans.app.config, trans.user_is_admin() ) )
+ user_dict = {}
+ try:
+ if 'configuration' in trans.webapp.api_controllers:
+ config_dict = ( trans.webapp.api_controllers[ 'configuration' ]
+ .get_config_dict( trans.app.config, trans.user_is_admin() ) )
- user_dict = self.get_user_dict()
+ if 'users' in trans.webapp.api_controllers:
+ user_dict = self.get_user_dict()
+
+ except Exception, exc:
+ pass
# genomes
# datatypes
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: Fix to dcc0c19 when configuration controller isn't present
by commits-noreply@bitbucket.org 15 Apr '14
by commits-noreply@bitbucket.org 15 Apr '14
15 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/5e079414e9f9/
Changeset: 5e079414e9f9
User: carlfeberhard
Date: 2014-04-15 21:27:18
Summary: Fix to dcc0c19 when configuration controller isn't present
Affected #: 1 file
diff -r b8c2e002769773350c8bc729f099110cc26d9d01 -r 5e079414e9f9ca489229816553e5133f5b3d5c0e templates/galaxy_client_app.mako
--- a/templates/galaxy_client_app.mako
+++ b/templates/galaxy_client_app.mako
@@ -4,13 +4,12 @@
## Bootstap dictionaries for GalaxyApp object's JSON, create GalaxyApp,
## and steal existing attributes from plain objects already created
<%
- config_dict = ( trans.webapp.api_controllers[ 'configuration' ]
- .get_config_dict( trans.app.config, trans.user_is_admin() ) )
- #import pprint
- #pprint.pprint( config_dict )
+ config_dict = {}
+ if 'configuration' in trans.webapp.api_controllers:
+ config_dict = ( trans.webapp.api_controllers[ 'configuration' ]
+ .get_config_dict( trans.app.config, trans.user_is_admin() ) )
user_dict = self.get_user_dict()
- #pprint.pprint( user_dict )
# genomes
# datatypes
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: Temporary fix to galaxy.panels.mako to ensure AMD order
by commits-noreply@bitbucket.org 15 Apr '14
by commits-noreply@bitbucket.org 15 Apr '14
15 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/b8c2e0027697/
Changeset: b8c2e0027697
User: carlfeberhard
Date: 2014-04-15 21:06:40
Summary: Temporary fix to galaxy.panels.mako to ensure AMD order
Affected #: 5 files
diff -r a03ea4880a7117156cead39eecb658ca1da301b3 -r b8c2e002769773350c8bc729f099110cc26d9d01 static/scripts/galaxy-app-base.js
--- a/static/scripts/galaxy-app-base.js
+++ b/static/scripts/galaxy-app-base.js
@@ -46,6 +46,11 @@
self._initUser( options.userJSON || {} );
self.debug( 'GalaxyApp.user: ', self.user );
+ //TODO: temp
+ if( typeof options.onload === 'function' ){
+ options.onload();
+ }
+
return self;
};
@@ -69,6 +74,8 @@
var self = this;
self.debug( '_initUser:', userJSON );
self.user = new userModel.User( userJSON );
+ //TODO: temp
+ self.currUser = self.user;
return self;
};
diff -r a03ea4880a7117156cead39eecb658ca1da301b3 -r b8c2e002769773350c8bc729f099110cc26d9d01 static/scripts/packed/galaxy-app-base.js
--- a/static/scripts/packed/galaxy-app-base.js
+++ b/static/scripts/packed/galaxy-app-base.js
@@ -1,1 +1,1 @@
-define(["mvc/user/user-model","utils/metrics-logger","utils/add-logging","utils/localization"],function(a,c,f,d){function g(m){var l=this;return l._init(m||{})}f(g,"GalaxyApp");g.defaultOptions={root:"/"};g.prototype._init=function j(m){var l=this;l._processOptions(m);l.debug("GalaxyApp.options: ",l.options);l._initLogger(m.loggerOptions||{});l.debug("GalaxyApp.logger: ",l.logger);l._initLocale();l.debug("GalaxyApp.localize: ",l.localize);l.config=m.config||{};l.debug("GalaxyApp.config: ",l.config);l._initUser(m.userJSON||{});l.debug("GalaxyApp.user: ",l.user);return l};g.prototype._processOptions=function e(n){var m=this,o=g.defaultOptions;m.debug("_processOptions: ",n);m.options={};for(var l in o){if(o.hasOwnProperty(l)){m.options[l]=(n.hasOwnProperty(l))?(n[l]):(o[l])}}return m};g.prototype._initUser=function i(m){var l=this;l.debug("_initUser:",m);l.user=new a.User(m);return l};g.prototype._initLogger=function k(m){var l=this;l.debug("_initLogger:",m);l.logger=new c.MetricsLogger(m);return l};g.prototype._initLocale=function h(m){var l=this;l.debug("_initLocale:",m);l.localize=d;window._l=l.localize;return l};g.prototype.toString=function b(){var l=this.user.get("email")||"(anonymous)";return"GalaxyApp("+l+")"};return{GalaxyApp:g}});
\ No newline at end of file
+define(["mvc/user/user-model","utils/metrics-logger","utils/add-logging","utils/localization"],function(a,c,f,d){function g(m){var l=this;return l._init(m||{})}f(g,"GalaxyApp");g.defaultOptions={root:"/"};g.prototype._init=function j(m){var l=this;l._processOptions(m);l.debug("GalaxyApp.options: ",l.options);l._initLogger(m.loggerOptions||{});l.debug("GalaxyApp.logger: ",l.logger);l._initLocale();l.debug("GalaxyApp.localize: ",l.localize);l.config=m.config||{};l.debug("GalaxyApp.config: ",l.config);l._initUser(m.userJSON||{});l.debug("GalaxyApp.user: ",l.user);if(typeof m.onload==="function"){m.onload()}return l};g.prototype._processOptions=function e(n){var m=this,o=g.defaultOptions;m.debug("_processOptions: ",n);m.options={};for(var l in o){if(o.hasOwnProperty(l)){m.options[l]=(n.hasOwnProperty(l))?(n[l]):(o[l])}}return m};g.prototype._initUser=function i(m){var l=this;l.debug("_initUser:",m);l.user=new a.User(m);l.currUser=l.user;return l};g.prototype._initLogger=function k(m){var l=this;l.debug("_initLogger:",m);l.logger=new c.MetricsLogger(m);return l};g.prototype._initLocale=function h(m){var l=this;l.debug("_initLocale:",m);l.localize=d;window._l=l.localize;return l};g.prototype.toString=function b(){var l=this.user.get("email")||"(anonymous)";return"GalaxyApp("+l+")"};return{GalaxyApp:g}});
\ No newline at end of file
diff -r a03ea4880a7117156cead39eecb658ca1da301b3 -r b8c2e002769773350c8bc729f099110cc26d9d01 templates/galaxy_client_app.mako
--- a/templates/galaxy_client_app.mako
+++ b/templates/galaxy_client_app.mako
@@ -22,6 +22,7 @@
userJSON : ${ get_user_json() },
root : '${h.url_for( "/" )}',
//TODO: get these options from the server
+ onload : window.Galaxy? window.Galaxy.onload: null,
loggerOptions : {
}
});
diff -r a03ea4880a7117156cead39eecb658ca1da301b3 -r b8c2e002769773350c8bc729f099110cc26d9d01 templates/webapps/galaxy/galaxy.masthead.mako
--- a/templates/webapps/galaxy/galaxy.masthead.mako
+++ b/templates/webapps/galaxy/galaxy.masthead.mako
@@ -85,33 +85,36 @@
'mvc/user/user-model',
'mvc/user/user-quotameter'
], function( mod_masthead, mod_menu, mod_modal, mod_frame, GalaxyUpload, user, quotameter ){
+ if( !Galaxy.currUser ){
+ // this doesn't need to wait for the page being readied
+ Galaxy.currUser = new user.User(${ h.to_json_string( get_user_json(), indent=2 ) });
+ }
+
$(function() {
- ## check if masthead is available
- if (Galaxy.masthead)
+ // check if masthead is available
+ if (Galaxy.masthead){
return;
+ }
- ## get configuration
+ // get configuration
var masthead_config = ${ h.to_json_string( masthead_config ) };
- ## load global galaxy objects
+ // load global galaxy objects
Galaxy.masthead = new mod_masthead.GalaxyMasthead(masthead_config);
Galaxy.modal = new mod_modal.View();
Galaxy.frame = new mod_frame.GalaxyFrame();
- ## construct default menu options
+ // construct default menu options
Galaxy.menu = new mod_menu.GalaxyMenu({
masthead: Galaxy.masthead,
config: masthead_config
});
- ## add upload plugin
+ // add upload plugin
Galaxy.upload = new GalaxyUpload(masthead_config);
- if( !Galaxy.currUser ){
- Galaxy.currUser = new user.User(${ h.to_json_string( get_user_json(), indent=2 ) });
- }
- ## set up the quota meter (And fetch the current user data from trans)
- ## add quota meter to masthead
+ // set up the quota meter (And fetch the current user data from trans)
+ // add quota meter to masthead
Galaxy.quotaMeter = new quotameter.UserQuotaMeter({
model : Galaxy.currUser,
el : Galaxy.masthead.$('.quota-meter-container')
diff -r a03ea4880a7117156cead39eecb658ca1da301b3 -r b8c2e002769773350c8bc729f099110cc26d9d01 templates/webapps/galaxy/galaxy.panels.mako
--- a/templates/webapps/galaxy/galaxy.panels.mako
+++ b/templates/webapps/galaxy/galaxy.panels.mako
@@ -1,4 +1,5 @@
<%namespace name="masthead" file="/webapps/galaxy/galaxy.masthead.mako"/>
+<%namespace name="galaxy_client" file="../../galaxy_client_app.mako" /><!DOCTYPE HTML>
@@ -93,6 +94,7 @@
%endif
</style>
+
## default script wrapper
<script type="text/javascript">
## configure require
@@ -104,27 +106,25 @@
"libs/backbone/backbone": { exports: "Backbone" },
}
});
-
- ## get configuration
+
+ // load any app configured
var galaxy_config = ${ h.to_json_string( self.galaxy_config ) };
-
- ## on page load
- $(function()
- {
- ## check if script is defined
+ Galaxy.onload = function(){
var jscript = galaxy_config.app.jscript;
- if (jscript)
- {
- ## load galaxy app
- require([jscript], function(js_lib)
- {
- ## load galaxy module application
- var module = new js_lib.GalaxyApp();
+ if( jscript ){
+ $( function(){
+ require([ jscript ], function( js_lib ){
+ ## load galaxy module application
+ var module = new js_lib.GalaxyApp();
+ });
});
- } else
+ } else {
console.log("'galaxy_config.app.jscript' missing.");
- });
+ }
+ }
</script>
+ ${ galaxy_client.bootstrap() }
+
</%def>
## default late-load javascripts
@@ -229,4 +229,4 @@
## Scripts can be loaded later since they progressively add features to
## the panels, but do not change layout
${self.late_javascripts()}
-</html>
\ No newline at end of file
+</html>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Allow copying Histories directly from the list of Saved Histories.
by commits-noreply@bitbucket.org 15 Apr '14
by commits-noreply@bitbucket.org 15 Apr '14
15 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a03ea4880a71/
Changeset: a03ea4880a71
User: dan
Date: 2014-04-15 20:24:14
Summary: Allow copying Histories directly from the list of Saved Histories.
Affected #: 1 file
diff -r f7983ecf5ea7c15e5c4235f079e86943576fbdba -r a03ea4880a7117156cead39eecb658ca1da301b3 lib/galaxy/webapps/galaxy/controllers/history.py
--- a/lib/galaxy/webapps/galaxy/controllers/history.py
+++ b/lib/galaxy/webapps/galaxy/controllers/history.py
@@ -91,6 +91,7 @@
grids.GridOperation( "Switch", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=True ),
grids.GridOperation( "View", allow_multiple=False ),
grids.GridOperation( "Share or Publish", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ),
+ grids.GridOperation( "Copy", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ),
grids.GridOperation( "Rename", condition=( lambda item: not item.deleted ), async_compatible=False, inbound=True ),
grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ), async_compatible=True ),
grids.GridOperation( "Delete Permanently", condition=( lambda item: not item.purged ), confirm="History contents will be removed from disk, this cannot be undone. Continue?", async_compatible=True ),
@@ -237,6 +238,8 @@
show_deleted=history.deleted,
use_panels=False ) )
#return self.view( trans, id=kwargs['id'], show_deleted=history.deleted, use_panels=False )
+ if operation == 'copy' and kwargs.get( 'id', None ):
+ return self.copy( trans, id=kwargs.get( 'id', None ) )
history_ids = galaxy.util.listify( kwargs.get( 'id', [] ) )
# Display no message by default
status, message = None, None
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Provide run and edit links for workflows after extraction from history.
by commits-noreply@bitbucket.org 15 Apr '14
by commits-noreply@bitbucket.org 15 Apr '14
15 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f7983ecf5ea7/
Changeset: f7983ecf5ea7
User: dan
Date: 2014-04-15 20:01:21
Summary: Provide run and edit links for workflows after extraction from history.
Affected #: 1 file
diff -r 3a154b52090316dee61f42993eaa5a1fa40116d3 -r f7983ecf5ea7c15e5c4235f079e86943576fbdba lib/galaxy/webapps/galaxy/controllers/workflow.py
--- a/lib/galaxy/webapps/galaxy/controllers/workflow.py
+++ b/lib/galaxy/webapps/galaxy/controllers/workflow.py
@@ -1201,7 +1201,7 @@
history=history
)
else:
- extract_workflow(
+ stored_workflow = extract_workflow(
trans,
user=user,
job_ids=job_ids,
@@ -1209,9 +1209,10 @@
workflow_name=workflow_name
)
# Index page with message
- return trans.show_message( "Workflow '%s' created from current history." % workflow_name )
- ## return trans.show_ok_message( "<p>Workflow '%s' created.</p><p><a target='_top' href='%s'>Click to load in workflow editor</a></p>"
- ## % ( workflow_name, web.url_for(controller='workflow', action='editor', id=trans.security.encode_id(stored.id) ) ) )
+ workflow_id = trans.security.encode_id( stored_workflow.id )
+ return trans.show_message( 'Workflow "%s" created from current history. You can <a href="%s" target="_parent">edit</a> or <a href="%s">run</a> the workflow.' %
+ ( workflow_name, url_for( controller='workflow', action='editor', id=workflow_id ),
+ url_for( controller='workflow', action='run', id=workflow_id ) ) )
@web.expose
def run( self, trans, id, history_id=None, multiple_input_mode="product", hide_fixed_params=False, **kwargs ):
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/5813b1de27ae/
Changeset: 5813b1de27ae
User: natefoo
Date: 2014-04-15 19:32:01
Summary: Update build platforms for dist-scrambling.
Affected #: 1 file
diff -r 9ea6c8749ab13e8a4e0d917bf3b49d09b43f55e1 -r 5813b1de27ae8bfb0f31db3215162d563ad2becb dist-eggs.ini
--- a/dist-eggs.ini
+++ b/dist-eggs.ini
@@ -8,22 +8,20 @@
;
[hosts]
-py2.6-linux-i686-ucs2 = stegmaier.bx.psu.edu /afs/bx.psu.edu/project/pythons/linux-i686-ucs2/bin/python2.6
-py2.6-linux-i686-ucs4 = stegmaier.bx.psu.edu /afs/bx.psu.edu/project/pythons/linux-i686-ucs4/bin/python2.6
-py2.7-linux-i686-ucs2 = stegmaier.bx.psu.edu /afs/bx.psu.edu/project/pythons/linux-i686-ucs2/bin/python2.7
-py2.7-linux-i686-ucs4 = stegmaier.bx.psu.edu /afs/bx.psu.edu/project/pythons/linux-i686-ucs4/bin/python2.7
-py2.6-linux-x86_64-ucs2 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/linux-x86_64-ucs2/bin/python2.6
-py2.6-linux-x86_64-ucs4 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.6
-py2.7-linux-x86_64-ucs2 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/linux-x86_64-ucs2/bin/python2.7
-py2.7-linux-x86_64-ucs4 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.7
-py2.6-macosx-10.3-fat-ucs2 = weyerbacher.bx.psu.edu /Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6
-py2.7-macosx-10.3-fat-ucs2 = weyerbacher.bx.psu.edu /Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
-py2.6-macosx-10.6-universal-ucs2 = lion.bx.psu.edu /usr/bin/python2.6
+py2.6-linux-i686-ucs2 = stegmaier.bx.psu.edu /afs/bx.psu.edu/project/pythons/py2.6-linux-i686-ucs2/bin/python2.6
+py2.6-linux-i686-ucs4 = stegmaier.bx.psu.edu /afs/bx.psu.edu/project/pythons/py2.6-linux-i686-ucs4/bin/python2.6
+py2.6-linux-x86_64-ucs2 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/py2.6-linux-x86_64-ucs2/bin/python2.6
+py2.6-linux-x86_64-ucs4 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/py2.6-linux-x86_64-ucs4/bin/python2.6
+py2.7-linux-i686-ucs2 = stegmaier.bx.psu.edu /afs/bx.psu.edu/project/pythons/py2.7-linux-i686-ucs2/bin/python2.7
+py2.7-linux-i686-ucs4 = stegmaier.bx.psu.edu /afs/bx.psu.edu/project/pythons/py2.7-linux-i686-ucs4/bin/python2.7
+py2.7-linux-x86_64-ucs2 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/py2.7-linux-x86_64-ucs2/bin/python2.7
+py2.7-linux-x86_64-ucs4 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/py2.7-linux-x86_64-ucs4/bin/python2.7
+py2.6-macosx-10.6-intel-ucs2 = lion.bx.psu.edu /usr/local/bin/python2.6
py2.7-macosx-10.6-intel-ucs2 = lion.bx.psu.edu /usr/local/bin/python2.7
;
; these hosts are used to build eggs with no C extensions
-py2.6 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.6
-py2.7 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/linux-x86_64-ucs4/bin/python2.7
+py2.6 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/py2.6-linux-x86_64-ucs4/bin/python2.6
+py2.7 = straub.bx.psu.edu /afs/bx.psu.edu/project/pythons/py2.7-linux-x86_64-ucs4/bin/python2.7
[groups]
py2.6-linux-i686 = py2.6-linux-i686-ucs2 py2.6-linux-i686-ucs4
@@ -35,8 +33,8 @@
linux-i686 = py2.6-linux-i686 py2.7-linux-i686
linux-x86_64 = py2.6-linux-x86_64 py2.7-linux-x86_64
linux = linux-i686 linux-x86_64
-py2.6-macosx = py2.6-macosx-10.3-fat-ucs2 py2.6-macosx-10.6-universal-ucs2
-py2.7-macosx = py2.7-macosx-10.3-fat-ucs2 py2.7-macosx-10.6-intel-ucs2
+py2.6-macosx = py2.6-macosx-10.6-intel-ucs2
+py2.7-macosx = py2.7-macosx-10.6-intel-ucs2
macosx = py2.6-macosx py2.7-macosx
py2.6-all = py2.6-linux py2.6-macosx
py2.7-all = py2.7-linux py2.7-macosx
https://bitbucket.org/galaxy/galaxy-central/commits/3a154b520903/
Changeset: 3a154b520903
User: natefoo
Date: 2014-04-15 19:32:31
Summary: Update bx-python to 0.7.2
Affected #: 1 file
diff -r 5813b1de27ae8bfb0f31db3215162d563ad2becb -r 3a154b52090316dee61f42993eaa5a1fa40116d3 eggs.ini
--- a/eggs.ini
+++ b/eggs.ini
@@ -12,7 +12,7 @@
no_auto = pbs_python
[eggs:platform]
-bx_python = 0.7.1
+bx_python = 0.7.2
Cheetah = 2.2.2
MarkupSafe = 0.12
mercurial = 2.2.3
@@ -78,7 +78,6 @@
psycopg2 = _9.2.4_static
pysqlite = _3.6.17_static
MySQL_python = _5.1.41_static
-bx_python = _7b95ff194725
GeneTrack = _dev_48da9e998f0caf01c5be731e926f4b0481f658f0
pysam = _kanwei_b10f6e722e9a
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: natefoo: Remove old platforms and versions from platform string manipulation. Egg compatibility enhancements for OS X. Galaxy's prepackaged OS X eggs should now work on any Python interpreter on Intel versions of OS X 10.6 and newer.
by commits-noreply@bitbucket.org 15 Apr '14
by commits-noreply@bitbucket.org 15 Apr '14
15 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/9ea6c8749ab1/
Changeset: 9ea6c8749ab1
User: natefoo
Date: 2014-04-15 19:27:36
Summary: Remove old platforms and versions from platform string manipulation. Egg compatibility enhancements for OS X. Galaxy's prepackaged OS X eggs should now work on any Python interpreter on Intel versions of OS X 10.6 and newer.
Affected #: 1 file
diff -r dcc0c19147ead86c6e357c739e0513addfe02cb2 -r 9ea6c8749ab13e8a4e0d917bf3b49d09b43f55e1 lib/galaxy/__init__.py
--- a/lib/galaxy/__init__.py
+++ b/lib/galaxy/__init__.py
@@ -4,24 +4,36 @@
__import__( "pkg_resources" ).declare_namespace( __name__ )
-import os, sys, re
-from distutils.sysconfig import get_config_var, get_config_vars
+import re
+import os
+import sys
+import platform
import pkg_resources
# patch get_platform() for better ABI recognition
def _get_build_platform():
plat = pkg_resources._get_build_platform()
- if sys.version_info[:2] == ( 2, 5 ) and \
- ( ( os.uname()[-1] in ( 'x86_64', 'i386', 'ppc' ) and sys.platform == 'darwin' and os.path.abspath( sys.prefix ).startswith( '/System' ) ) or \
- ( sys.platform == 'darwin' and get_config_vars().get('UNIVERSALSDK', '').strip() ) ):
- plat = 'macosx-10.3-fat'
- if sys.platform == "sunos5" and not (plat.endswith('_32') or plat.endswith('_64')):
- if sys.maxint > 2**31:
- plat += '_64'
- else:
- plat += '_32'
- if sys.platform == "linux2" and sys.maxint < 2**31 and plat.endswith( '-x86_64' ):
+ if sys.platform == 'darwin':
+ # Assert OS X version is new enough
+ current_minor_ver = int( platform.mac_ver()[0].split( '.' )[1] )
+ assert current_minor_ver >= 6, 'Galaxy is not compatible with Mac OS X < 10.6 (your version is %s)' % platform.mac_ver()[0]
+ # Python build target may be even older, but this will prevent it from
+ # fetching our 10.6+ eggs, so fix if necessary (newer versions will be
+ # fine)
+ plat_split = plat.split( '-' )
+ build_minor_ver = int( plat_split[1].split( '.' )[1] )
+ if build_minor_ver < 6:
+ plat_split[1] = '10.6'
+ # Our intel (dual arch) eggs will work fine on single-arch builds
+ if plat_split[-1] in ( 'i386', 'x86_64' ):
+ plat_split[-1] = 'intel'
+ # Ditto universal (if you're not on PPC)
+ if plat_split[-1] == 'universal' and platform.processor() != 'powerpc':
+ plat_split[-1] = 'intel'
+ plat = '-'.join( plat_split )
+ elif sys.platform == "linux2" and sys.maxint < 2**31 and plat.endswith( '-x86_64' ):
+ # 32 bit Python on 64 bit Linux
plat = plat.replace( '-x86_64', '-i686' )
if not (plat.endswith('-ucs2') or plat.endswith('-ucs4')):
if sys.maxunicode > 2**16:
@@ -36,34 +48,6 @@
pkg_resources.get_build_platform = _get_build_platform
pkg_resources.get_platform = _get_build_platform
-# patch compatible_platforms() to allow for Solaris binary compatibility
-solarisVersionString = re.compile(r"solaris-(\d)\.(\d+)-(.*)")
-def _compatible_platforms(provided,required):
- # this is a bit kludgey since we need to know a bit about what happened in
- # the original method
- if provided is None or required is None or provided==required:
- return True # easy case
- reqMac = pkg_resources.macosVersionString.match(required)
- if reqMac:
- return pkg_resources._compatible_platforms(provided,required)
- reqSol = solarisVersionString.match(required)
- if reqSol:
- provSol = solarisVersionString.match(provided)
- if not provSol:
- return False
- if provSol.group(1) != reqSol.group(1) or \
- provSol.group(3) != reqSol.group(3):
- return False
- if int(provSol.group(2)) > int(reqSol.group(2)):
- return False
- return True
- return False
-try:
- assert pkg_resources._compatible_platforms
-except:
- pkg_resources._compatible_platforms = pkg_resources.compatible_platforms
- pkg_resources.compatible_platforms = _compatible_platforms
-
# patch to insert eggs at the beginning of sys.path instead of at the end
def _insert_on(self, path, loc = None):
"""Insert self.location in path before its nearest parent directory"""
@@ -108,4 +92,4 @@
pass
logging.NullHandler = NullHandler
-import galaxy.eggs
\ No newline at end of file
+import galaxy.eggs
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: UI: add GalaxyApp to base_panels.mako; add requirejs i18n plugin and nls/zh, nls/ja locale files, wire into _l client localizer, remove previous localization cruft; remove reliance on history_panel.mako
by commits-noreply@bitbucket.org 15 Apr '14
by commits-noreply@bitbucket.org 15 Apr '14
15 Apr '14
MSBuZXcgY29tbWl0IGluIGdhbGF4eS1jZW50cmFsOgoKaHR0cHM6Ly9iaXRidWNrZXQub3JnL2dh
bGF4eS9nYWxheHktY2VudHJhbC9jb21taXRzL2RjYzBjMTkxNDdlYS8KQ2hhbmdlc2V0OiAgIGRj
YzBjMTkxNDdlYQpVc2VyOiAgICAgICAgY2FybGZlYmVyaGFyZApEYXRlOiAgICAgICAgMjAxNC0w
NC0xNSAxODozMTozMwpTdW1tYXJ5OiAgICAgVUk6IGFkZCBHYWxheHlBcHAgdG8gYmFzZV9wYW5l
bHMubWFrbzsgYWRkIHJlcXVpcmVqcyBpMThuIHBsdWc9CmluIGFuZCBubHMvemgsIG5scy9qYSBs
b2NhbGUgZmlsZXMsIHdpcmUgaW50byBfbCBjbGllbnQgbG9jYWxpemVyLCByZW1vdmUgcD0KcmV2
aW91cyBsb2NhbGl6YXRpb24gY3J1ZnQ7IHJlbW92ZSByZWxpYW5jZSBvbiBoaXN0b3J5X3BhbmVs
Lm1ha28KQWZmZWN0ZWQgIzogIDQxIGZpbGVzCgpkaWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAx
NjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNh
ZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL2dhbGF4eS1hcHAtYmFzZS5qcwotLS0gYS9zdGF0aWMv
c2NyaXB0cy9nYWxheHktYXBwLWJhc2UuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvZ2FsYXh5LWFw
cC1iYXNlLmpzCkBAIC0xLDMzICsxLDQ0IEBACiBkZWZpbmUoWwogICAgICdtdmMvdXNlci91c2Vy
LW1vZGVsJywKICAgICAndXRpbHMvbWV0cmljcy1sb2dnZXInLAotICAgICd1dGlscy9hZGQtbG9n
Z2luZycKLV0sIGZ1bmN0aW9uKCB1c2VyTW9kZWwsIG1ldHJpY3NMb2dnZXIsIGFkZExvZ2dpbmcg
KXsKKyAgICAndXRpbHMvYWRkLWxvZ2dpbmcnLAorICAgICd1dGlscy9sb2NhbGl6YXRpb24nCitd
LCBmdW5jdGlvbiggdXNlck1vZGVsLCBtZXRyaWNzTG9nZ2VyLCBhZGRMb2dnaW5nLCBsb2NhbGl6
ZSApewogLy8gPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0KPTNEPTNEPTNECi0vKioKLSAqCisvKiogQmFzZSBnYWxheHkgY2xpZW50LXNpZGUgYXBw
bGljYXRpb24uCisgKiAgICAgIEluaWl0aWFsaXplczoKKyAqICAgICAgICAgIGxvZ2dlciAgICAg
IDogdGhlIGxvZ2dlci9tZXRyaWNzLWxvZ2dlcgorICogICAgICAgICAgbG9jYWxpemUgICAgOiB0
aGUgc3RyaW5nIGxvY2FsaXplcgorICogICAgICAgICAgY29uZmlnICAgICAgOiB0aGUgY3VycmVu
dCBjb25maWd1cmF0aW9uIChhbnkgay92IGluCisgKiAgICAgICAgICAgICAgdW5pdmVyc2Vfd3Nn
aS5pbmkgYXZhaWxhYmxlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gQVBJKQorICogICAgICAgICAg
dXNlciAgICAgICAgOiB0aGUgY3VycmVudCB1c2VyIChhcyBhIG12Yy91c2VyL3VzZXItbW9kZWwp
CiAgKi8KIGZ1bmN0aW9uIEdhbGF4eUFwcCggb3B0aW9ucyApewogICAgIHZhciBzZWxmID0zRCB0
aGlzOwogICAgIHJldHVybiBzZWxmLl9pbml0KCBvcHRpb25zIHx8IHt9ICk7CiB9CisvLyBhZGQg
bG9nZ2luZyBzaG9ydGN1dHMgZm9yIHRoaXMgb2JqZWN0CiBhZGRMb2dnaW5nKCBHYWxheHlBcHAs
ICdHYWxheHlBcHAnICk7Cj0yMAotLyoqICAqLworLyoqIGRlZmF1bHQgb3B0aW9ucyAqLwogR2Fs
YXh5QXBwLmRlZmF1bHRPcHRpb25zID0zRCB7CisgICAgLyoqIHJvb3QgdXJsIG9mIHRoaXMgYXBw
ICovCiAgICAgLy8gbW92ZSB0byBzZWxmLnJvb3Q/CiAgICAgcm9vdCAgICAgICAgOiAnLycKIH07
Cj0yMAotLyoqICAqLworLyoqIGluaXRhbGl6ZSBvcHRpb25zIGFuZCBzdWItY29tcG9uZW50cyAq
LwogR2FsYXh5QXBwLnByb3RvdHlwZS5faW5pdCA9M0QgZnVuY3Rpb24gaW5pdCggb3B0aW9ucyAp
ewogICAgIHZhciBzZWxmID0zRCB0aGlzOwo9MjAKKyAgICBzZWxmLl9wcm9jZXNzT3B0aW9ucygg
b3B0aW9ucyApOworICAgIHNlbGYuZGVidWcoICdHYWxheHlBcHAub3B0aW9uczogJywgc2VsZi5v
cHRpb25zICk7CisKICAgICBzZWxmLl9pbml0TG9nZ2VyKCBvcHRpb25zLmxvZ2dlck9wdGlvbnMg
fHwge30gKTsKICAgICBzZWxmLmRlYnVnKCAnR2FsYXh5QXBwLmxvZ2dlcjogJywgc2VsZi5sb2dn
ZXIgKTsKPTIwCi0gICAgc2VsZi5fcHJvY2Vzc09wdGlvbnMoIG9wdGlvbnMgKTsKLSAgICBzZWxm
LmRlYnVnKCAnR2FsYXh5QXBwLm9wdGlvbnM6ICcsIHNlbGYub3B0aW9ucyApOworICAgIHNlbGYu
X2luaXRMb2NhbGUoKTsKKyAgICBzZWxmLmRlYnVnKCAnR2FsYXh5QXBwLmxvY2FsaXplOiAnLCBz
ZWxmLmxvY2FsaXplICk7Cj0yMAogICAgIHNlbGYuY29uZmlnID0zRCBvcHRpb25zLmNvbmZpZyB8
fCB7fTsKICAgICBzZWxmLmRlYnVnKCAnR2FsYXh5QXBwLmNvbmZpZzogJywgc2VsZi5jb25maWcg
KTsKQEAgLTM4LDcgKzQ5LDcgQEAKICAgICByZXR1cm4gc2VsZjsKIH07Cj0yMAotLyoqICAqLwor
LyoqIGFkZCBhbiBvcHRpb24gZnJvbSBvcHRpb25zIGlmIHRoZSBrZXkgbWF0Y2hlcyBhbiBvcHRp
b24gaW4gZGVmYXVsdE9wdGk9Cm9ucyAqLwogR2FsYXh5QXBwLnByb3RvdHlwZS5fcHJvY2Vzc09w
dGlvbnMgPTNEIGZ1bmN0aW9uIF9wcm9jZXNzT3B0aW9ucyggb3B0aW9ucyA9Cil7CiAgICAgdmFy
IHNlbGYgPTNEIHRoaXMsCiAgICAgICAgIGRlZmF1bHRzID0zRCBHYWxheHlBcHAuZGVmYXVsdE9w
dGlvbnM7CkBAIC01Myw3ICs2NCw3IEBACiAgICAgcmV0dXJuIHNlbGY7CiB9Owo9MjAKLS8qKiAg
Ki8KKy8qKiBzZXQgdXAgdGhlIGN1cnJlbnQgdXNlciBhcyBhIEJhY2tib25lIG1vZGVsIChtdmMv
dXNlci91c2VyLW1vZGVsKSAqLwogR2FsYXh5QXBwLnByb3RvdHlwZS5faW5pdFVzZXIgPTNEIGZ1
bmN0aW9uIF9pbml0VXNlciggdXNlckpTT04gKXsKICAgICB2YXIgc2VsZiA9M0QgdGhpczsKICAg
ICBzZWxmLmRlYnVnKCAnX2luaXRVc2VyOicsIHVzZXJKU09OICk7CkBAIC02MSw3ICs3Miw3IEBA
CiAgICAgcmV0dXJuIHNlbGY7CiB9Owo9MjAKLS8qKiAgKi8KKy8qKiBzZXQgdXAgdGhlIG1ldHJp
Y3MgbG9nZ2VyICh1dGlscy9tZXRyaWNzLWxvZ2dlcikgYW5kIHBhc3MgbG9nZ2VyT3B0aW9uPQpz
ICovCiBHYWxheHlBcHAucHJvdG90eXBlLl9pbml0TG9nZ2VyID0zRCBmdW5jdGlvbiBfaW5pdExv
Z2dlciggbG9nZ2VyT3B0aW9ucyApewogICAgIHZhciBzZWxmID0zRCB0aGlzOwogICAgIHNlbGYu
ZGVidWcoICdfaW5pdExvZ2dlcjonLCBsb2dnZXJPcHRpb25zICk7CkBAIC02OSw3ICs4MCwxNyBA
QAogICAgIHJldHVybiBzZWxmOwogfTsKPTIwCi0vKiogICovCisvKiogYWRkIHRoZSBsb2NhbGl6
ZSBmbiB0byB0aGlzIG9iamVjdCBhbmQgdGhlIHdpbmRvdyBuYW1lc3BhY2UgKGFzICdfbCcpID0K
Ki8KK0dhbGF4eUFwcC5wcm90b3R5cGUuX2luaXRMb2NhbGUgPTNEIGZ1bmN0aW9uIF9pbml0TG9j
YWxlKCBvcHRpb25zICl7CisgICAgdmFyIHNlbGYgPTNEIHRoaXM7CisgICAgc2VsZi5kZWJ1Zygg
J19pbml0TG9jYWxlOicsIG9wdGlvbnMgKTsKKyAgICBzZWxmLmxvY2FsaXplID0zRCBsb2NhbGl6
ZTsKKyAgICAvLyBhZGQgdG8gd2luZG93IGFzIGdsb2JhbCBzaG9ydGVuZWQgYWxpYXMKKyAgICB3
aW5kb3cuX2wgPTNEIHNlbGYubG9jYWxpemU7CisgICAgcmV0dXJuIHNlbGY7Cit9OworCisvKiog
c3RyaW5nIHJlcCAqLwogR2FsYXh5QXBwLnByb3RvdHlwZS50b1N0cmluZyA9M0QgZnVuY3Rpb24g
dG9TdHJpbmcoKXsKICAgICB2YXIgdXNlckVtYWlsID0zRCB0aGlzLnVzZXIuZ2V0KCAnZW1haWwn
ICkgfHwgJyhhbm9ueW1vdXMpJzsKICAgICByZXR1cm4gJ0dhbGF4eUFwcCgnICsgdXNlckVtYWls
ICsgJyknOwoKZGlmZiAtciA4MzQ2ZWM0YmFhMzk5MmY0ZGMwMTYxZjBmYzc5YTBiYTg5M2MwYTYz
IC1yIGRjYzBjMTkxNDdlYWQ4NmM2ZTM1N2M3PQozOWUwNTEzYWRkZmUwMmNiMiBzdGF0aWMvc2Ny
aXB0cy9pMThuLmpzCi0tLSAvZGV2L251bGwKKysrIGIvc3RhdGljL3NjcmlwdHMvaTE4bi5qcwpA
QCAtMCwwICsxLDE4MyBAQAorLyoqCisgKiBAbGljZW5zZSBSZXF1aXJlSlMgaTE4biAyLjAuNCBD
b3B5cmlnaHQgKGMpIDIwMTAtMjAxMiwgVGhlIERvam8gRm91bmRhdD0KaW9uIEFsbCBSaWdodHMg
UmVzZXJ2ZWQuCisgKiBBdmFpbGFibGUgdmlhIHRoZSBNSVQgb3IgbmV3IEJTRCBsaWNlbnNlLgor
ICogc2VlOiBodHRwOi8vZ2l0aHViLmNvbS9yZXF1aXJlanMvaTE4biBmb3IgZGV0YWlscworICov
CisvKmpzbGludCByZWdleHA6IHRydWUgKi8KKy8qZ2xvYmFsIHJlcXVpcmU6IGZhbHNlLCBuYXZp
Z2F0b3I6IGZhbHNlLCBkZWZpbmU6IGZhbHNlICovCisKKy8qKgorICogVGhpcyBwbHVnaW4gaGFu
ZGxlcyBpMThuISBwcmVmaXhlZCBtb2R1bGVzLiBJdCBkb2VzIHRoZSBmb2xsb3dpbmc6CisgKgor
ICogMSkgQSByZWd1bGFyIG1vZHVsZSBjYW4gaGF2ZSBhIGRlcGVuZGVuY3kgb24gYW4gaTE4biBi
dW5kbGUsIGJ1dCB0aGUgcmU9Cmd1bGFyCisgKiBtb2R1bGUgZG9lcyBub3Qgd2FudCB0byBzcGVj
aWZ5IHdoYXQgbG9jYWxlIHRvIGxvYWQuIFNvIGl0IGp1c3Qgc3BlY2lmaT0KZXMKKyAqIHRoZSB0
b3AtbGV2ZWwgYnVuZGxlLCBsaWtlICJpMThuIW5scy9jb2xvcnMiLgorICoKKyAqIFRoaXMgcGx1
Z2luIHdpbGwgbG9hZCB0aGUgaTE4biBidW5kbGUgYXQgbmxzL2NvbG9ycywgc2VlIHRoYXQgaXQg
aXMgYSByPQpvb3QvbWFzdGVyCisgKiBidW5kbGUgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBhIGxv
Y2FsZSBpbiBpdHMgbmFtZS4gSXQgd2lsbCB0aGVuIHRyeSB0bz0KIGZpbmQKKyAqIHRoZSBiZXN0
IG1hdGNoIGxvY2FsZSBhdmFpbGFibGUgaW4gdGhhdCBtYXN0ZXIgYnVuZGxlLCB0aGVuIHJlcXVl
c3QgYWxsPQogdGhlCisgKiBsb2NhbGUgcGllY2VzIGZvciB0aGF0IGJlc3QgbWF0Y2ggbG9jYWxl
LiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBsb2NhbGUgaT0KcyAiZW4tdXMiLAorICogdGhlbiB0aGUg
cGx1Z2luIHdpbGwgYXNrIGZvciB0aGUgImVuLXVzIiwgImVuIiBhbmQgInJvb3QiIGJ1bmRsZXMg
dG8gYmU9CiBsb2FkZWQKKyAqIChidXQgb25seSBpZiB0aGV5IGFyZSBzcGVjaWZpZWQgb24gdGhl
IG1hc3RlciBidW5kbGUpLgorICoKKyAqIE9uY2UgYWxsIHRoZSBidW5kbGVzIGZvciB0aGUgbG9j
YWxlIHBpZWNlcyBsb2FkLCB0aGVuIGl0IG1peGVzIGluIGFsbCB0PQpob3NlCisgKiBsb2NhbGUg
cGllY2VzIGludG8gZWFjaCBvdGhlciwgdGhlbiBmaW5hbGx5IHNldHMgdGhlIGNvbnRleHQuZGVm
aW5lZCB2YT0KbHVlCisgKiBmb3IgdGhlIG5scy9jb2xvcnMgYnVuZGxlIHRvIGJlIHRoYXQgbWl4
ZWQgaW4gbG9jYWxlLgorICoKKyAqIDIpIEEgcmVndWxhciBtb2R1bGUgc3BlY2lmaWVzIGEgc3Bl
Y2lmaWMgbG9jYWxlIHRvIGxvYWQuIEZvciBpbnN0YW5jZSwKKyAqIGkxOG4hbmxzL2ZyLWZyL2Nv
bG9ycy4gSW4gdGhpcyBjYXNlLCB0aGUgcGx1Z2luIG5lZWRzIHRvIGxvYWQgdGhlIG1hc3RlPQpy
IGJ1bmRsZQorICogZmlyc3QsIGF0IG5scy9jb2xvcnMsIHRoZW4gZmlndXJlIG91dCB3aGF0IHRo
ZSBiZXN0IG1hdGNoIGxvY2FsZSBpcyBmb3I9CiBmci1mciwKKyAqIHNpbmNlIG1heWJlIG9ubHkg
ZnIgb3IganVzdCByb290IGlzIGRlZmluZWQgZm9yIHRoYXQgbG9jYWxlLiBPbmNlIHRoYXQgPQpi
ZXN0CisgKiBmaXQgaXMgZm91bmQsIGFsbCBvZiBpdHMgbG9jYWxlIHBpZWNlcyBuZWVkIHRvIGhh
dmUgdGhlaXIgYnVuZGxlcyBsb2FkZT0KZC4KKyAqCisgKiBPbmNlIGFsbCB0aGUgYnVuZGxlcyBm
b3IgdGhlIGxvY2FsZSBwaWVjZXMgbG9hZCwgdGhlbiBpdCBtaXhlcyBpbiBhbGwgdD0KaG9zZQor
ICogbG9jYWxlIHBpZWNlcyBpbnRvIGVhY2ggb3RoZXIsIHRoZW4gZmluYWxseSBzZXRzIHRoZSBj
b250ZXh0LmRlZmluZWQgdmE9Cmx1ZQorICogZm9yIHRoZSBubHMvZnItZnIvY29sb3JzIGJ1bmRs
ZSB0byBiZSB0aGF0IG1peGVkIGluIGxvY2FsZS4KKyAqLworKGZ1bmN0aW9uICgpIHsKKyAgICAn
dXNlIHN0cmljdCc7CisKKyAgICAvL3JlZ2V4cCBmb3IgcmVjb25zdHJ1Y3RpbmcgdGhlIG1hc3Rl
ciBidW5kbGUgbmFtZSBmcm9tIHBhcnRzIG9mIHRoZSByPQplZ2V4cCBtYXRjaAorICAgIC8vbmxz
UmVnRXhwLmV4ZWMoImZvby9iYXIvYmF6L25scy9lbi1jYS9mb28iKSBnaXZlczoKKyAgICAvL1si
Zm9vL2Jhci9iYXovbmxzL2VuLWNhL2ZvbyIsICJmb28vYmFyL2Jhei9ubHMvIiwgIi8iLCAiLyIs
ICJlbi1jYSIsPQogImZvbyJdCisgICAgLy9ubHNSZWdFeHAuZXhlYygiZm9vL2Jhci9iYXovbmxz
L2ZvbyIpIGdpdmVzOgorICAgIC8vWyJmb28vYmFyL2Jhei9ubHMvZm9vIiwgImZvby9iYXIvYmF6
L25scy8iLCAiLyIsICIvIiwgImZvbyIsICIiXQorICAgIC8vc28sIGlmIG1hdGNoWzVdIGlzIGJs
YW5rLCBpdCBtZWFucyB0aGlzIGlzIHRoZSB0b3AgYnVuZGxlIGRlZmluaXRpb24uCisgICAgdmFy
IG5sc1JlZ0V4cCA9M0QgLyheLiooXnxcLylubHMoXC98JCkpKFteXC9dKilcLz8oW15cL10qKS87
CisKKyAgICAvL0hlbHBlciBmdW5jdGlvbiB0byBhdm9pZCByZXBlYXRpbmcgY29kZS4gTG90cyBv
ZiBhcmd1bWVudHMgaW4gdGhlCisgICAgLy9kZXNpcmUgdG8gc3RheSBmdW5jdGlvbmFsIGFuZCBz
dXBwb3J0IFJlcXVpcmVKUyBjb250ZXh0cyB3aXRob3V0IGhhdj0KaW5nCisgICAgLy90byBrbm93
IGFib3V0IHRoZSBSZXF1aXJlSlMgY29udGV4dHMuCisgICAgZnVuY3Rpb24gYWRkUGFydChsb2Nh
bGUsIG1hc3RlciwgbmVlZGVkLCB0b0xvYWQsIHByZWZpeCwgc3VmZml4KSB7CisgICAgICAgIGlm
IChtYXN0ZXJbbG9jYWxlXSkgeworICAgICAgICAgICAgbmVlZGVkLnB1c2gobG9jYWxlKTsKKyAg
ICAgICAgICAgIGlmIChtYXN0ZXJbbG9jYWxlXSA9M0Q9M0Q9M0QgdHJ1ZSB8fCBtYXN0ZXJbbG9j
YWxlXSA9M0Q9M0Q9M0QgPQoxKSB7CisgICAgICAgICAgICAgICAgdG9Mb2FkLnB1c2gocHJlZml4
ICsgbG9jYWxlICsgJy8nICsgc3VmZml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAg
IH0KKworICAgIGZ1bmN0aW9uIGFkZElmRXhpc3RzKHJlcSwgbG9jYWxlLCB0b0xvYWQsIHByZWZp
eCwgc3VmZml4KSB7CisgICAgICAgIHZhciBmdWxsTmFtZSA9M0QgcHJlZml4ICsgbG9jYWxlICsg
Jy8nICsgc3VmZml4OworICAgICAgICBpZiAocmVxdWlyZS5fZmlsZUV4aXN0cyhyZXEudG9Vcmwo
ZnVsbE5hbWUgKyAnLmpzJykpKSB7CisgICAgICAgICAgICB0b0xvYWQucHVzaChmdWxsTmFtZSk7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgZnVuY3Rpb24gdG8g
bWl4IGluIHByb3BlcnRpZXMgZnJvbSBzb3VyY2UgaW50byB0YXJnZXQsCisgICAgICogYnV0IG9u
bHkgaWYgdGFyZ2V0IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhIHByb3BlcnR5IG9mIHRoZSBzYW1l
IG5hbT0KZS4KKyAgICAgKiBUaGlzIGlzIG5vdCByb2J1c3QgaW4gSUUgZm9yIHRyYW5zZmVycmlu
ZyBtZXRob2RzIHRoYXQgbWF0Y2gKKyAgICAgKiBPYmplY3QucHJvdG90eXBlIG5hbWVzLCBidXQg
dGhlIHVzZXMgb2YgbWl4aW4gaGVyZSBzZWVtIHVubGlrZWx5IHRvCisgICAgICogdHJpZ2dlciBh
IHByb2JsZW0gcmVsYXRlZCB0byB0aGF0LgorICAgICAqLworICAgIGZ1bmN0aW9uIG1peGluKHRh
cmdldCwgc291cmNlLCBmb3JjZSkgeworICAgICAgICB2YXIgcHJvcDsKKyAgICAgICAgZm9yIChw
cm9wIGluIHNvdXJjZSkgeworICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShw
cm9wKSAmJiAoIXRhcmdldC5oYXNPd25Qcm9wZXJ0eShwcm89CnApIHx8IGZvcmNlKSkgeworICAg
ICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9M0Qgc291cmNlW3Byb3BdOworICAgICAgICAgICAg
fSBlbHNlIGlmICh0eXBlb2Ygc291cmNlW3Byb3BdID0zRD0zRD0zRCAnb2JqZWN0JykgeworICAg
ICAgICAgICAgICAgIGlmICghdGFyZ2V0W3Byb3BdICYmIHNvdXJjZVtwcm9wXSkgeworICAgICAg
ICAgICAgICAgICAgICB0YXJnZXRbcHJvcF0gPTNEIHt9OworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICBtaXhpbih0YXJnZXRbcHJvcF0sIHNvdXJjZVtwcm9wXSwgZm9yY2UpOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZGVmaW5lKFsnbW9kdWxlJ10s
IGZ1bmN0aW9uIChtb2R1bGUpIHsKKyAgICAgICAgdmFyIG1hc3RlckNvbmZpZyA9M0QgbW9kdWxl
LmNvbmZpZyA/IG1vZHVsZS5jb25maWcoKSA6IHt9OworCisgICAgICAgIHJldHVybiB7CisgICAg
ICAgICAgICB2ZXJzaW9uOiAnMi4wLjQnLAorICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAg
KiBDYWxsZWQgd2hlbiBhIGRlcGVuZGVuY3kgbmVlZHMgdG8gYmUgbG9hZGVkLgorICAgICAgICAg
ICAgICovCisgICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAobmFtZSwgcmVxLCBvbkxvYWQsIGNv
bmZpZykgeworICAgICAgICAgICAgICAgIGNvbmZpZyA9M0QgY29uZmlnIHx8IHt9OworCisgICAg
ICAgICAgICAgICAgaWYgKGNvbmZpZy5sb2NhbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFz
dGVyQ29uZmlnLmxvY2FsZSA9M0QgY29uZmlnLmxvY2FsZTsKKyAgICAgICAgICAgICAgICB9CisK
KyAgICAgICAgICAgICAgICB2YXIgbWFzdGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgbWF0
Y2ggPTNEIG5sc1JlZ0V4cC5leGVjKG5hbWUpLAorICAgICAgICAgICAgICAgICAgICBwcmVmaXgg
PTNEIG1hdGNoWzFdLAorICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPTNEIG1hdGNoWzRdLAor
ICAgICAgICAgICAgICAgICAgICBzdWZmaXggPTNEIG1hdGNoWzVdLAorICAgICAgICAgICAgICAg
ICAgICBwYXJ0cyA9M0QgbG9jYWxlLnNwbGl0KCItIiksCisgICAgICAgICAgICAgICAgICAgIHRv
TG9hZCA9M0QgW10sCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0zRCB7fSwKKyAgICAgICAg
ICAgICAgICAgICAgaSwgcGFydCwgY3VycmVudCA9M0QgIiI7CisKKyAgICAgICAgICAgICAgICAv
L0lmIG1hdGNoWzVdIGlzIGJsYW5rLCBpdCBtZWFucyB0aGlzIGlzIHRoZSB0b3AgYnVuZGxlIGRl
PQpmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAvL3NvIGl0IGRvZXMgbm90IGhhdmUgdG8gYmUg
aGFuZGxlZC4gTG9jYWxlLXNwZWNpZmljIHJlcXVlPQpzdHMKKyAgICAgICAgICAgICAgICAvL3dp
bGwgaGF2ZSBhIG1hdGNoWzRdIHZhbHVlIGJ1dCBubyBtYXRjaFs1XQorICAgICAgICAgICAgICAg
IGlmIChtYXRjaFs1XSkgeworICAgICAgICAgICAgICAgICAgICAvL2xvY2FsZS1zcGVjaWZpYyBi
dW5kbGUKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0zRCBtYXRjaFsxXTsKKyAgICAgICAg
ICAgICAgICAgICAgbWFzdGVyTmFtZSA9M0QgcHJlZml4ICsgc3VmZml4OworICAgICAgICAgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vVG9wLWxldmVsIGJ1bmRsZS4KKyAg
ICAgICAgICAgICAgICAgICAgbWFzdGVyTmFtZSA9M0QgbmFtZTsKKyAgICAgICAgICAgICAgICAg
ICAgc3VmZml4ID0zRCBtYXRjaFs0XTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0zRCBt
YXN0ZXJDb25maWcubG9jYWxlOworICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0zRCBtYXN0ZXJDb25maWcubG9jYWxlID0z
RAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBuYXZpZ2F0b3IgPTNEPTNEPTNE
ICJ1bmRlZmluZWQiID8gInJvb3Q9CiIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChu
YXZpZ2F0b3IubGFuZ3VhZ2UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdh
dG9yLnVzZXJMYW5ndWFnZSB8fCAicm9vdCIpLnRvTG93ZXJDYXNlPQooKTsKKyAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9M0QgbG9jYWxlLnNwbGl0KCIt
Iik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5pc0J1
aWxkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBhbGwg
bG9jYWxlIHBvc3NpYmxlIGZpbGVzIGFuZAorICAgICAgICAgICAgICAgICAgICAvL3JlcXVpcmUg
dGhlbSBpZiBleGlzdC4KKyAgICAgICAgICAgICAgICAgICAgdG9Mb2FkLnB1c2gobWFzdGVyTmFt
ZSk7CisgICAgICAgICAgICAgICAgICAgIGFkZElmRXhpc3RzKHJlcSwgInJvb3QiLCB0b0xvYWQs
IHByZWZpeCwgc3VmZml4KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0zRCAwOyBpIDwg
cGFydHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPTNEIHBh
cnRzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCArPTNEIChjdXJyZW50ID8g
Ii0iIDogIiIpICsgcGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZElmRXhpc3RzKHJl
cSwgY3VycmVudCwgdG9Mb2FkLCBwcmVmaXgsIHN1ZmZpeCk7CisgICAgICAgICAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgICAgICAgICByZXEodG9Mb2FkLCBmdW5jdGlvbiAoKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBvbkxvYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7Cisg
ICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy9GaXJzdCwgZmV0
Y2ggdGhlIG1hc3RlciBidW5kbGUsIGl0IGtub3dzIHdoYXQgbG9jYWxlPQpzIGFyZSBhdmFpbGFi
bGUuCisgICAgICAgICAgICAgICAgICAgIHJlcShbbWFzdGVyTmFtZV0sIGZ1bmN0aW9uIChtYXN0
ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vRmlndXJlIG91dCB0aGUgYmVzdCBmaXQK
KyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZWVkZWQgPTNEIFtdLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHBhcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vQWx3YXlz
IGFsbG93IGZvciByb290LCB0aGVuIGRvIHRoZSByZXN0IG9mIHRoZSBsPQpvY2FsZSBwYXJ0cy4K
KyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFBhcnQoInJvb3QiLCBtYXN0ZXIsIG5lZWRlZCwg
dG9Mb2FkLCBwcmVmaXgsIHN1PQpmZml4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAo
aSA9M0QgMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgcGFydCA9M0QgcGFydHNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vy
cmVudCArPTNEIChjdXJyZW50ID8gIi0iIDogIiIpICsgcGFydDsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBhZGRQYXJ0KGN1cnJlbnQsIG1hc3RlciwgbmVlZGVkLCB0b0xvYWQsIHByZWZp
PQp4LCBzdWZmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgICAgICAgICAvL0xvYWQgYWxsIHRoZSBwYXJ0cyBtaXNzaW5nLgorICAgICAgICAgICAgICAg
ICAgICAgICAgcmVxKHRvTG9hZCwgZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHZhciBpLCBwYXJ0QnVuZGxlLCBwYXJ0OworICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGZvciAoaSA9M0QgbmVlZGVkLmxlbmd0aCAtIDE7IGkgPiAtMSAmJiBuZWVkZWQ9CltpXTsg
aS0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPTNEIG5lZWRlZFtp
XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydEJ1bmRsZSA9M0QgbWFzdGVy
W3BhcnRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFydEJ1bmRsZSA9
M0Q9M0Q9M0QgdHJ1ZSB8fCBwYXJ0QnVuZGw9CmUgPTNEPTNEPTNEIDEpIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRCdW5kbGUgPTNEIHJlcShwcmVmaXggKyBwYXJ0
ICsgJy8nPQogKyBzdWZmaXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peGluKHZhbHVlLCBwYXJ0QnVuZGxlKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvL0FsbCBkb25lLCBub3RpZnkgdGhlIGxvYWRlci4KKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBvbkxvYWQodmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAg
ICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfTsKKyAgICB9KTsKK30oKSk7CgpkaWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFm
MGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRm
ZTAyY2IyIHN0YXRpYy9zY3JpcHRzL212Yy9kYXRhc2V0L2hkYS1iYXNlLmpzCi0tLSBhL3N0YXRp
Yy9zY3JpcHRzL212Yy9kYXRhc2V0L2hkYS1iYXNlLmpzCisrKyBiL3N0YXRpYy9zY3JpcHRzL212
Yy9kYXRhc2V0L2hkYS1iYXNlLmpzCkBAIC0xLDcgKzEsOCBAQAogZGVmaW5lKFsKICAgICAibXZj
L2RhdGFzZXQvaGRhLW1vZGVsIiwKLSAgICAibXZjL2Jhc2UtbXZjIgotXSwgZnVuY3Rpb24oIGhk
YU1vZGVsLCBiYXNlTVZDICl7CisgICAgIm12Yy9iYXNlLW12YyIsCisgICAgInV0aWxzL2xvY2Fs
aXphdGlvbiIKK10sIGZ1bmN0aW9uKCBoZGFNb2RlbCwgYmFzZU1WQywgX2wgKXsKIC8qIGdsb2Jh
bCBCYWNrYm9uZSAqLwogLy89M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0QKIC8qKiBAY2xhc3MgUmVhZCBvbmx5IHZpZXcg
Zm9yIEhpc3RvcnlEYXRhc2V0QXNzb2NpYXRpb24uCgpkaWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRk
YzAxNjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1
MTNhZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL212Yy9kYXRhc2V0L2hkYS1lZGl0LmpzCi0tLSBh
L3N0YXRpYy9zY3JpcHRzL212Yy9kYXRhc2V0L2hkYS1lZGl0LmpzCisrKyBiL3N0YXRpYy9zY3Jp
cHRzL212Yy9kYXRhc2V0L2hkYS1lZGl0LmpzCkBAIC0yLDggKzIsOSBAQAogICAgICJtdmMvZGF0
YXNldC9oZGEtbW9kZWwiLAogICAgICJtdmMvZGF0YXNldC9oZGEtYmFzZSIsCiAgICAgIm12Yy90
YWdzIiwKLSAgICAibXZjL2Fubm90YXRpb25zIgotXSwgZnVuY3Rpb24oIGhkYU1vZGVsLCBoZGFC
YXNlLCB0YWdzTW9kLCBhbm5vdGF0aW9uc01vZCApeworICAgICJtdmMvYW5ub3RhdGlvbnMiLAor
ICAgICJ1dGlscy9sb2NhbGl6YXRpb24iCitdLCBmdW5jdGlvbiggaGRhTW9kZWwsIGhkYUJhc2Us
IHRhZ3NNb2QsIGFubm90YXRpb25zTW9kLCBfbCApewogLy89M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0QKIC8qKiBAY2xh
c3MgRWRpdGluZyB2aWV3IGZvciBIaXN0b3J5RGF0YXNldEFzc29jaWF0aW9uLgogICogIEBuYW1l
IEhEQUVkaXRWaWV3CgpkaWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFmMGZjNzlhMGJhODkz
YzBhNjMgLXIgZGNjMGMxOTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRmZTAyY2IyIHN0YXRp
Yy9zY3JpcHRzL212Yy9kYXRhc2V0L2hkYS1tb2RlbC5qcwotLS0gYS9zdGF0aWMvc2NyaXB0cy9t
dmMvZGF0YXNldC9oZGEtbW9kZWwuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvbXZjL2RhdGFzZXQv
aGRhLW1vZGVsLmpzCkBAIC0xLDYgKzEsNyBAQAogZGVmaW5lKFsKLSAgICAibXZjL2Jhc2UtbXZj
IgotXSwgZnVuY3Rpb24oIGJhc2VNVkMgKXsKKyAgICAibXZjL2Jhc2UtbXZjIiwKKyAgICAidXRp
bHMvbG9jYWxpemF0aW9uIgorXSwgZnVuY3Rpb24oIGJhc2VNVkMsIF9sICl7CiAvLz0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0KPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0z
RD0zRAogLyoqIEBjbGFzcyAoSERBKSBtb2RlbCBmb3IgYSBHYWxheHkgZGF0YXNldAogICogICAg
ICByZWxhdGVkIHRvIGEgaGlzdG9yeS4KCmRpZmYgLXIgODM0NmVjNGJhYTM5OTJmNGRjMDE2MWYw
ZmM3OWEwYmE4OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdjNz0KMzllMDUxM2FkZGZl
MDJjYjIgc3RhdGljL3NjcmlwdHMvbXZjL2hpc3RvcnkvYW5ub3RhdGVkLWhpc3RvcnktcGFuZWwu
anMKLS0tIGEvc3RhdGljL3NjcmlwdHMvbXZjL2hpc3RvcnkvYW5ub3RhdGVkLWhpc3RvcnktcGFu
ZWwuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvbXZjL2hpc3RvcnkvYW5ub3RhdGVkLWhpc3Rvcnkt
cGFuZWwuanMKQEAgLTEsOCArMSw5IEBACiBkZWZpbmUoWwogICAgICJtdmMvZGF0YXNldC9oZGEt
bW9kZWwiLAogICAgICJtdmMvZGF0YXNldC9oZGEtYmFzZSIsCi0gICAgIm12Yy9oaXN0b3J5L3Jl
YWRvbmx5LWhpc3RvcnktcGFuZWwiCi1dLCBmdW5jdGlvbiggaGRhTW9kZWwsIGhkYUJhc2UsIHJl
YWRvbmx5UGFuZWwgKXsKKyAgICAibXZjL2hpc3RvcnkvcmVhZG9ubHktaGlzdG9yeS1wYW5lbCIs
CisgICAgInV0aWxzL2xvY2FsaXphdGlvbiIKK10sIGZ1bmN0aW9uKCBoZGFNb2RlbCwgaGRhQmFz
ZSwgcmVhZG9ubHlQYW5lbCwgX2wgKXsKIC8qID0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPQo9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRAogVE9ETzoKPTIwCgpkaWZmIC1y
IDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2Vh
ZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL212Yy9oaXN0b3J5
L2N1cnJlbnQtaGlzdG9yeS1wYW5lbC5qcwotLS0gYS9zdGF0aWMvc2NyaXB0cy9tdmMvaGlzdG9y
eS9jdXJyZW50LWhpc3RvcnktcGFuZWwuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvbXZjL2hpc3Rv
cnkvY3VycmVudC1oaXN0b3J5LXBhbmVsLmpzCkBAIC0xLDggKzEsOSBAQAogZGVmaW5lKFsKICAg
ICAibXZjL2RhdGFzZXQvaGRhLWVkaXQiLAogICAgICJtdmMvaGlzdG9yeS9oaXN0b3J5LXBhbmVs
IiwKLSAgICAibXZjL2Jhc2UtbXZjIgotXSwgZnVuY3Rpb24oIGhkYUVkaXQsIGhwYW5lbCwgYmFz
ZU1WQyApeworICAgICJtdmMvYmFzZS1tdmMiLAorICAgICJ1dGlscy9sb2NhbGl6YXRpb24iCitd
LCBmdW5jdGlvbiggaGRhRWRpdCwgaHBhbmVsLCBiYXNlTVZDLCBfbCApewogLy8gPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPQo9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNECiAv
Kiogc2Vzc2lvbiBzdG9yYWdlIGZvciBoaXN0b3J5IHBhbmVsIHByZWZlcmVuY2VzIChhbmQgdG8g
bWFpbnRhaW4gc3RhdGUpCiAgKi8KCmRpZmYgLXIgODM0NmVjNGJhYTM5OTJmNGRjMDE2MWYwZmM3
OWEwYmE4OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdjNz0KMzllMDUxM2FkZGZlMDJj
YjIgc3RhdGljL3NjcmlwdHMvbXZjL2hpc3RvcnkvaGlzdG9yeS1tb2RlbC5qcwotLS0gYS9zdGF0
aWMvc2NyaXB0cy9tdmMvaGlzdG9yeS9oaXN0b3J5LW1vZGVsLmpzCisrKyBiL3N0YXRpYy9zY3Jp
cHRzL212Yy9oaXN0b3J5L2hpc3RvcnktbW9kZWwuanMKQEAgLTEsNyArMSw4IEBACiBkZWZpbmUo
WwogICAgICJtdmMvZGF0YXNldC9oZGEtbW9kZWwiLAotICAgICJtdmMvYmFzZS1tdmMiCi1dLCBm
dW5jdGlvbiggaGRhTW9kZWwsIGJhc2VNVkMgKXsKKyAgICAibXZjL2Jhc2UtbXZjIiwKKyAgICAi
dXRpbHMvbG9jYWxpemF0aW9uIgorXSwgZnVuY3Rpb24oIGhkYU1vZGVsLCBiYXNlTVZDLCBfbCAp
ewogLy89M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPQo9M0Q9M0Q9M0Q9M0QKIC8qKiBAY2xhc3MgTW9kZWwgZm9yIGEgR2FsYXh5IGhpc3Rvcnkg
cmVzb3VyY2UgLSBib3RoIGEgcmVjb3JkIG9mIHVzZXIKICAqICAgICAgdG9vbCB1c2UgYW5kIGEg
Y29sbGVjdGlvbiBvZiB0aGUgZGF0YXNldHMgdGhvc2UgdG9vbHMgcHJvZHVjZWQuCgpkaWZmIC1y
IDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2Vh
ZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL212Yy9oaXN0b3J5
L2hpc3RvcnktcGFuZWwuanMKLS0tIGEvc3RhdGljL3NjcmlwdHMvbXZjL2hpc3RvcnkvaGlzdG9y
eS1wYW5lbC5qcworKysgYi9zdGF0aWMvc2NyaXB0cy9tdmMvaGlzdG9yeS9oaXN0b3J5LXBhbmVs
LmpzCkBAIC0zLDggKzMsOSBAQAogICAgICJtdmMvZGF0YXNldC9oZGEtZWRpdCIsCiAgICAgIm12
Yy9oaXN0b3J5L3JlYWRvbmx5LWhpc3RvcnktcGFuZWwiLAogICAgICJtdmMvdGFncyIsCi0gICAg
Im12Yy9hbm5vdGF0aW9ucyIKLV0sIGZ1bmN0aW9uKCBoZGFNb2RlbCwgaGRhRWRpdCwgcmVhZG9u
bHlQYW5lbCwgdGFnc01vZCwgYW5ub3RhdGlvbnNNb2QgKXsKKyAgICAibXZjL2Fubm90YXRpb25z
IiwKKyAgICAidXRpbHMvbG9jYWxpemF0aW9uIgorXSwgZnVuY3Rpb24oIGhkYU1vZGVsLCBoZGFF
ZGl0LCByZWFkb25seVBhbmVsLCB0YWdzTW9kLCBhbm5vdGF0aW9uc01vZCwgX2w9CiApewogLyog
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNE
PTNEPTNEPTNECiBUT0RPOgo9MjAKCmRpZmYgLXIgODM0NmVjNGJhYTM5OTJmNGRjMDE2MWYwZmM3
OWEwYmE4OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdjNz0KMzllMDUxM2FkZGZlMDJj
YjIgc3RhdGljL3NjcmlwdHMvbXZjL2hpc3RvcnkvcmVhZG9ubHktaGlzdG9yeS1wYW5lbC5qcwot
LS0gYS9zdGF0aWMvc2NyaXB0cy9tdmMvaGlzdG9yeS9yZWFkb25seS1oaXN0b3J5LXBhbmVsLmpz
CisrKyBiL3N0YXRpYy9zY3JpcHRzL212Yy9oaXN0b3J5L3JlYWRvbmx5LWhpc3RvcnktcGFuZWwu
anMKQEAgLTIsOCArMiw5IEBACiAgICAgIm12Yy9oaXN0b3J5L2hpc3RvcnktbW9kZWwiLAogICAg
ICJtdmMvZGF0YXNldC9oZGEtYmFzZSIsCiAgICAgIm12Yy91c2VyL3VzZXItbW9kZWwiLAotICAg
ICJtdmMvYmFzZS1tdmMiCi1dLCBmdW5jdGlvbiggaGlzdG9yeU1vZGVsLCBoZGFCYXNlLCB1c2Vy
TW9kZWwsIGJhc2VNVkMgKXsKKyAgICAibXZjL2Jhc2UtbXZjIiwKKyAgICAidXRpbHMvbG9jYWxp
emF0aW9uIgorXSwgZnVuY3Rpb24oIGhpc3RvcnlNb2RlbCwgaGRhQmFzZSwgdXNlck1vZGVsLCBi
YXNlTVZDLCBfbCApewogLy8gPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNECiAvKiogc2Vzc2lvbiBzdG9yYWdlIGZvciBpbmRpdmlk
dWFsIGhpc3RvcnkgcHJlZmVyZW5jZXMgKi8KIHZhciBIaXN0b3J5UHJlZnMgPTNEIGJhc2VNVkMu
U2Vzc2lvblN0b3JhZ2VNb2RlbC5leHRlbmQoewoKZGlmZiAtciA4MzQ2ZWM0YmFhMzk5MmY0ZGMw
MTYxZjBmYzc5YTBiYTg5M2MwYTYzIC1yIGRjYzBjMTkxNDdlYWQ4NmM2ZTM1N2M3PQozOWUwNTEz
YWRkZmUwMmNiMiBzdGF0aWMvc2NyaXB0cy9tdmMvdXNlci91c2VyLW1vZGVsLmpzCi0tLSBhL3N0
YXRpYy9zY3JpcHRzL212Yy91c2VyL3VzZXItbW9kZWwuanMKKysrIGIvc3RhdGljL3NjcmlwdHMv
bXZjL3VzZXIvdXNlci1tb2RlbC5qcwpAQCAtMSw2ICsxLDcgQEAKIGRlZmluZShbCi0gICAgIm12
Yy9iYXNlLW12YyIKLV0sIGZ1bmN0aW9uKCBiYXNlTVZDICl7CisgICAgIm12Yy9iYXNlLW12YyIs
CisgICAgInV0aWxzL2xvY2FsaXphdGlvbiIKK10sIGZ1bmN0aW9uKCBiYXNlTVZDLCBfbCApewog
Ly89M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PQo9M0Q9M0Q9M0Q9M0QKIC8qKiBAY2xhc3MgTW9kZWwgZm9yIGEgR2FsYXh5IHVzZXIgKGluY2x1
ZGluZyBhbm9ueW1vdXMgdXNlcnMpLgogICogIEBuYW1lIFVzZXIKCmRpZmYgLXIgODM0NmVjNGJh
YTM5OTJmNGRjMDE2MWYwZmM3OWEwYmE4OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdj
Nz0KMzllMDUxM2FkZGZlMDJjYjIgc3RhdGljL3NjcmlwdHMvbXZjL3VzZXIvdXNlci1xdW90YW1l
dGVyLmpzCi0tLSBhL3N0YXRpYy9zY3JpcHRzL212Yy91c2VyL3VzZXItcXVvdGFtZXRlci5qcwor
KysgYi9zdGF0aWMvc2NyaXB0cy9tdmMvdXNlci91c2VyLXF1b3RhbWV0ZXIuanMKQEAgLTEsNiAr
MSw3IEBACiBkZWZpbmUoWwotICAgICJtdmMvYmFzZS1tdmMiCi1dLCBmdW5jdGlvbiggYmFzZU1W
QyApeworICAgICJtdmMvYmFzZS1tdmMiLAorICAgICJ1dGlscy9sb2NhbGl6YXRpb24iCitdLCBm
dW5jdGlvbiggYmFzZU1WQywgX2wgKXsKIC8vPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNE
PTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPTNEPQo9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9M0Q9
M0Q9M0Q9Cj0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0z
RD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0zRD0KPTNEPTNEPTNEPTNECiAvKiogQGNsYXNzIFZpZXcg
dG8gZGlzcGxheSBhIHVzZXIncyBkaXNrL3N0b3JhZ2UgdXNhZ2UKICAqICAgICAgZWl0aGVyIGFz
IGEgcHJvZ3Jlc3MgYmFyIHJlcHJlc2VudGluZyB0aGUgcGVyY2VudGFnZSBvZiBhIHF1b3RhIHVz
PQplZAoKZGlmZiAtciA4MzQ2ZWM0YmFhMzk5MmY0ZGMwMTYxZjBmYzc5YTBiYTg5M2MwYTYzIC1y
IGRjYzBjMTkxNDdlYWQ4NmM2ZTM1N2M3PQozOWUwNTEzYWRkZmUwMmNiMiBzdGF0aWMvc2NyaXB0
cy9ubHMvamEvbG9jYWxlLmpzCi0tLSAvZGV2L251bGwKKysrIGIvc3RhdGljL3NjcmlwdHMvbmxz
L2phL2xvY2FsZS5qcwpAQCAtMCwwICsxLDM4OSBAQAorLyoqIGphIGxvY2FsaXphdGlvbiAqLwor
ZGVmaW5lKHsKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjI0CisiQXJlIHlv
dSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGUgY3VycmVudCBoaXN0b3J5PyIgOgorIj1FNz04
Rj1CRT1FNT05Qz1BOD1FMz04MT1BRT1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1B
QT1FMz04Mz1CQz0KPUUzPTgyPTkyPUU2PUI2PTg4PUUzPTgxPTk5PUUzPTgxPTkzPUUzPTgxPUE4
PUUzPTgxPUFCPUU1PTkwPThDPUU2PTg0PThGPUUzPQo9ODE9OTc9RTM9ODE9QkU9RTM9ODE9OTk9
RTM9ODE9OEI9RUY9QkM9OUYiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5Lm1ha286MzgK
KyJjb2xsYXBzZSBhbGwiIDoKKyI9RTM9ODE9OTk9RTM9ODE9Qjk9RTM9ODE9QTY9RTM9ODI9OTI9
RTM9ODE9OEE9RTM9ODI9OEE9RTM9ODE9OUY9RTM9ODE9OUY9Cj1FMz04Mj04MCIsCisKKy8vIHRl
bXBsYXRlcy9kYXRhc2V0L2VkaXRfYXR0cmlidXRlcy5tYWtvOjIKKyJIaXN0b3J5IEl0ZW0gQXR0
cmlidXRlcyIgOgorIj1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1C
Qz1FMz04Mj1BMj1FMz04Mj1BND1FMz04Mz04Nj0KPUUzPTgzPUEwPUU1PUE0PTg5PUU2PTk1PUIw
IiwKKworLy8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTkKKyJFZGl0
IEF0dHJpYnV0ZXMiIDoKKyI9RTU9QTQ9ODk9RTY9OTU9QjA9RTM9ODI9OTI9RTc9Qjc9QTg9RTk9
OUI9ODY9RTM9ODE9OTk9RTM9ODI9OEIiLAorCisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0
dHJpYnV0ZXMubWFrbzo2NAorIlRoaXMgd2lsbCBpbnNwZWN0IHRoZSBkYXRhc2V0IGFuZCBhdHRl
bXB0IHRvIGNvcnJlY3QgdGhlIGFib3ZlIGNvbHVtbiB2YWw9CnVlcyBpZiB0aGV5IGFyZSBub3Qg
YWNjdXJhdGUuIiA6CisiPUUzPTgxPTkzPUUzPTgyPThDPUUzPTgxPUFGPUUzPTgzPTg3PUUzPTgz
PUJDPUUzPTgyPUJGPUUzPTgyPUJCPUUzPTgzPTgzPQo9RTM9ODM9ODg9RTM9ODI9OTI9RTg9QUE9
QkY9RTY9OUY9QkI9RTM9ODE9OTc9RTM9ODE9QTY9RTQ9Qjg9OEE9RTg9QTg9OTg9RTM9Cj04MT1B
RT1FMz04Mj1BQj1FMz04Mz1BOT1FMz04Mz1BMD1FMz04MT1BRT1FNT04MD1BND1FMz04Mj05Mj1F
ND1CRj1BRT1FNj1BRD0KPUEzPUUzPTgxPTk5PUUzPTgyPThCPUUzPTgxPTkzPUUzPTgxPUE4PUUz
PTgyPTkyPUU4PUE5PUE2PUUzPTgxPUJGPUUzPTgxPUJFPQo9RTM9ODE9OTk9RTM9ODA9ODIiLAor
CisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0dHJpYnV0ZXMubWFrbzo2OAorIlJlcXVpcmVk
IG1ldGFkYXRhIHZhbHVlcyBhcmUgbWlzc2luZy4gU29tZSBvZiB0aGVzZSB2YWx1ZXMgbWF5IG5v
dCBiZSBlZGk9CnRhYmxlIGJ5IHRoZSB1c2VyLiBTZWxlY3RpbmcgXCJBdXRvLWRldGVjdFwiIHdp
bGwgYXR0ZW1wdCB0byBmaXggdGhlc2UgdmFsdT0KZXMuIiA6CisiPUU1PUJGPTg1PUU4PUE2PTgx
PUUzPTgxPUFBPUUzPTgzPUExPUUzPTgyPUJGPUUzPTgzPTg3PUUzPTgzPUJDPUUzPTgyPUJGPQo9
RTM9ODE9QUU9RTU9ODA9QTQ9RTM9ODE9OEM9RTQ9Qjg9OEQ9RTY9OTg9OEU9RTM9ODE9QTc9RTM9
ODE9OTk9RTM9ODA9ODI9RTM9Cj04MT05RD1FMz04Mj04Qz1FMz04Mj04OT1FMz04MT1BRT1FMz04
MT04ND1FMz04MT04Rj1FMz04MT1BND1FMz04MT04Qj1FMz04MT0KPUFFPUU1PTgwPUE0PUUzPTgx
PUFGPUUzPTgzPUE2PUUzPTgzPUJDPUUzPTgyPUI2PUUzPTgxPUFCPUUzPTgyPTg4PUUzPTgxPUEz
PQo9RTM9ODE9QTY9RTc9Qjc9QTg9RTk9OUI9ODY9RTU9OEY9QUY9RTg9ODM9QkQ9RTM9ODE9QUI9
RTM9ODE9QUY9RTM9ODE9QUE9RTM9Cj04MT1BMz1FMz04MT1BNj1FMz04MT04ND1FMz04MT1CRT1F
Mz04MT05Qj1FMz04Mj05Mz1FMz04MD04Mj1FMz04MD04Qz1FOD04Nz0KPUFBPUU1PThCPTk1PUU1
PTg4PUE0PUU1PUFFPTlBPUUzPTgwPThEPUUzPTgyPTkyPUU5PTgxPUI4PUU2PThBPTlFPUUzPTgx
PTk5PQo9RTM9ODI9OEI9RTM9ODE9QTg9RTM9ODE9OUQ9RTM9ODI9OEM9RTM9ODI9ODk9RTM9ODE9
QUU9RTU9ODA9QTQ9RTM9ODI9OTI9RTM9Cj04MT05Rj1FMz04MT1BMD1FMz04MT05Nz1FMz04MT04
Rj1FMz04MT1BNz1FMz04MT04RD1FMz04Mj04Qj1FMz04MT04Qj1FMz04Mj0KPTgyPUUzPTgxPTk3
PUUzPTgyPThDPUUzPTgxPUJFPUUzPTgxPTlCPUUzPTgyPTkzPUUzPTgwPTgyIiwKKworLy8gdGVt
cGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286NzgKKyJDb252ZXJ0IHRvIG5ldyBm
b3JtYXQiIDoKKyI9RTY9OTY9QjA9RTM9ODE9OTc9RTM9ODE9ODQ9RTM9ODM9OTU9RTM9ODI9QTk9
RTM9ODM9QkM9RTM9ODM9OUU9RTM9ODM9ODM9Cj1FMz04Mz04OD1FMz04MT1BQj1FNT1BND04OT1F
Nj04Rj05Qj1FMz04MT05OT1FMz04Mj04QiIsCisKKy8vIHRlbXBsYXRlcy9kYXRhc2V0L2VkaXRf
YXR0cmlidXRlcy5tYWtvOjg0CisiQ29udmVydCB0byIgOgorIj1FNT1BND04OT1FNj04Rj05Qj1F
Mz04MT05OT1FMz04Mj04QiIsCisKKy8vIHRlbXBsYXRlcy9kYXRhc2V0L2VkaXRfYXR0cmlidXRl
cy5tYWtvOjk1CisiVGhpcyB3aWxsIGNyZWF0ZSBhIG5ldyBkYXRhc2V0IHdpdGggdGhlIGNvbnRl
bnRzIG9mIHRoaXMgZGF0YXNldCBjb252ZXJ0ZT0KZCB0byBhIG5ldyBmb3JtYXQuIiA6CisiPUU2
PTk2PUIwPUUzPTgxPTk3PUUzPTgxPTg0PUUzPTgzPTk1PUUzPTgyPUE5PUUzPTgzPUJDPUUzPTgz
PTlFPUUzPTgzPTgzPQo9RTM9ODM9ODg9RTM9ODE9QUI9RTU9QTQ9ODk9RTY9OEY9OUI9RTM9ODE9
OTc9RTM9ODE9OUY9RTM9ODM9ODc9RTM9ODM9QkM9RTM9Cj04Mj1CRj1FMz04Mj1CQj1FMz04Mz04
Mz1FMz04Mz04OD1FMz04Mj05Mj1FNj05Nj1CMD1FOD1BNj04Rj1FND1CRD05Qz1FNj04OD0KPTkw
PUUzPTgxPTk3PUUzPTgxPUJFPUUzPTgxPTk5PUUzPTgwPTgyIiwKKworLy8gdGVtcGxhdGVzL2Rh
dGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTExCisiQ2hhbmdlIGRhdGEgdHlwZSIgOgorIj1F
Mz04Mz04Nz1FMz04Mz1CQz1FMz04Mj1CRj1FMz04Mj1CRj1FMz04Mj1BND1FMz04Mz05Nz1FMz04
Mj05Mj1FNT1BND04OT0KPUU2PTlCPUI0PUUzPTgxPTk5PUUzPTgyPThCIiwKKworLy8gdGVtcGxh
dGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTE3CisiTmV3IFR5cGUiIDoKKyI9RTY9
OTY9QjA9RTM9ODE9OTc9RTM9ODE9ODQ9RTM9ODI9QkY9RTM9ODI9QTQ9RTM9ODM9OTciLAorCisv
LyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0dHJpYnV0ZXMubWFrbzoxMjQKKyJUaGlzIHdpbGwg
Y2hhbmdlIHRoZSBkYXRhdHlwZSBvZiB0aGUgZXhpc3RpbmcgZGF0YXNldCBidXQgPGk+bm90PC9p
PiBtb2RpPQpmeSBpdHMgY29udGVudHMuIFVzZSB0aGlzIGlmIEdhbGF4eSBoYXMgaW5jb3JyZWN0
bHkgZ3Vlc3NlZCB0aGUgdHlwZSBvZiB5b3U9CnIgZGF0YXNldC4iIDoKKyI9RTM9ODE9OTM9RTM9
ODI9OEM9RTM9ODE9QUY9RTY9OTc9QTI9RTU9QUQ9OTg9RTM9ODE9QUU9RTM9ODM9ODc9RTM9ODM9
QkM9Cj1FMz04Mj1CRj1FMz04Mj1CQj1FMz04Mz04Mz1FMz04Mz04OD1FMz04MT1BRT1FMz04Mz04
Nz1FMz04Mz1CQz1FMz04Mj1CRj1FMz0KPTgyPUJGPUUzPTgyPUE0PUUzPTgzPTk3PUUzPTgyPTky
PUU1PUE0PTg5PUU2PTlCPUI0PUUzPTgxPTk3PUUzPTgxPUJFPUUzPTgxPQo9OTk9RTM9ODA9ODI9
RTM9ODE9OTc9RTM9ODE9OEI9RTM9ODE9OTc9RTM9ODM9ODc9RTM9ODM9QkM9RTM9ODI9QkY9RTM9
ODI9QkI9Cj1FMz04Mz04Mz1FMz04Mz04OD1FMz04MT1BRT1FND1COD1BRD1FOD1CQT1BQj1FMz04
MT1BRj1FNT1BND04OT1FNj05Qj1CND1FMz0KPTgxPTk3PUUzPTgxPUJFPUUzPTgxPTlCPUUzPTgy
PTkzPUUzPTgwPTgyPUUzPTgzPTg3PUUzPTgzPUJDPUUzPTgyPUJGPUUzPTgyPQo9QkI9RTM9ODM9
ODM9RTM9ODM9ODg9RTM9ODE9QUU9RTM9ODI9QkY9RTM9ODI9QTQ9RTM9ODM9OTc9RTM9ODE9QUU9
RTg9QUE9QTQ9Cj1FNT04OD1BND1FNT1BRT05QT1FMz04MT04Qz1FMz04MT04Mj1FMz04MT1BMz1F
Mz04MT05Rj1FMz04MT1BOD1FMz04MT04RD1FMz0KPTgxPUFCPUU0PUJEPUJGPUU3PTk0PUE4PUUz
PTgxPTk3PUUzPTgxPUJFPUUzPTgxPTk5PUUzPTgwPTgyIiwKKworLy8gdGVtcGxhdGVzL2RhdGFz
ZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTM3CisiQ29weSBIaXN0b3J5IEl0ZW0iIDoKKyI9RTM9
ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9ODM9QUE9RTM9ODM9QkM9RTM9ODI9QTI9RTM9ODI9
QTQ9RTM9ODM9ODY9Cj1FMz04Mz1BMD1FMz04Mj05Mj1FMz04Mj1CMz1FMz04Mz05ND1FMz04Mz1C
Qz1FMz04MT05OT1FMz04Mj04QiIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzoz
CisiWW91ciBzYXZlZCBoaXN0b3JpZXMiIDoKKyI9RTQ9QkY9OUQ9RTU9QUQ9OTg9RTM9ODE9OTc9
RTM9ODE9OUY9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9ODM9QUE9Cj1FMz04Mz1CQyIs
CisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzoxOQorIlN0b3JlZCBIaXN0b3JpZXMi
IDoKKyI9RTY9QTA9QkM9RTc9QjQ9OEQ9RTM9ODE9OTc9RTM9ODE9QTY9RTM9ODE9ODI9RTM9ODI9
OEI9RTM9ODM9OTI9RTM9ODI9Qjk9Cj1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1CQyIsCisKKy8v
IHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzoyMSB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5Lm1h
a286MjM5CisiaGlkZSBkZWxldGVkIiA6CisiPUU1PTg5PThBPUU5PTk5PUE0PUUzPTgxPTk3PUUz
PTgxPTlGPUUzPTgzPTkyPUUzPTgyPUI5PUUzPTgzPTg4PUUzPTgzPUFBPQo9RTM9ODM9QkM9RTM9
ODI9OTI9RTk9OUE9QTA9RTM9ODE9OTkiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1h
a286MjMKKyJzaG93IGRlbGV0ZWQiIDoKKyI9RTU9ODk9OEE9RTk9OTk9QTQ9RTM9ODE9OTc9RTM9
ODE9OUY9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9ODM9QUE9Cj1FMz04Mz1CQz1FMz04
Mj05Mj1FOD1BMT1BOD1FNz1BND1CQT1FMz04MT05OT1FMz04Mj04QiIsCisKKy8vIHRlbXBsYXRl
cy9oaXN0b3J5L2xpc3QubWFrbzoyNworIk5hbWUiIDoKKyI9RTU9OTA9OEQ9RTU9ODk9OEQiLAor
CisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286MjcKKyJTaXplIiA6CisiPUUzPTgyPUI1
PUUzPTgyPUE0PUUzPTgyPUJBIiwKKworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjI3
CisiTGFzdCBtb2RpZmllZCIgOgorIj1FNj05Qz04MD1FNz1CNT04Mj1FNj05Qj1CND1FNj05Nj1C
MD1FNj05Nz1BNSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzoyNworIkFjdGlv
bnMiIDoKKyI9RTY9OTM9OEQ9RTQ9QkQ9OUMiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0
Lm1ha286NDUKKyJyZW5hbWUiIDoKKyI9RTU9OTA9OEQ9RTc9QTc9QjA9RTU9QTQ9ODk9RTY9OUI9
QjQ9RTM9ODE9OTk9RTM9ODI9OEIiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286
NDYKKyJzd2l0Y2ggdG8iIDoKKyI9RTU9QTQ9ODk9RTY9OUI9QjQ9RTM9ODE9OTk9RTM9ODI9OEIi
LAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NDcKKyJkZWxldGUiIDoKKyI9RTU9
ODk9OEE9RTk9OTk9QTQ9RTM9ODE9OTk9RTM9ODI9OEIiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9y
eS9saXN0Lm1ha286NDkKKyJ1bmRlbGV0ZSIgOgorIj1FNT04OT04QT1FOT05OT1BND1FMz04MT04
Qj1FMz04Mj04OT1FNj04OD1CQj1FMz04MT05OSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xp
c3QubWFrbzo1NQorIkFjdGlvbiIgOgorIj1FNj05Mz04RD1FND1CRD05QyIsCisKKy8vIHRlbXBs
YXRlcy9oaXN0b3J5L2xpc3QubWFrbzo1NiB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286
MjEKKyJTaGFyZSIgOgorIj1FNT04NT1CMT1FNj05Qz04OSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0
b3J5L2xpc3QubWFrbzo1NiB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MTUKKyJSZW5h
bWUiIDoKKyI9RTU9OTA9OEQ9RTc9QTc9QjA9RTU9QTQ9ODk9RTY9OUI9QjQ9RTM9ODE9OTk9RTM9
ODI9OEIiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NTYgdGVtcGxhdGVzL2hp
c3Rvcnkvb3B0aW9ucy5tYWtvOjI0CisiRGVsZXRlIiA6CisiPUU1PTg5PThBPUU5PTk5PUE0PUUz
PTgxPTk5PUUzPTgyPThCIiwKKworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjU4Cisi
VW5kZWxldGUiIDoKKyI9RTU9ODk9OEE9RTk9OTk9QTQ9RTM9ODE9OEI9RTM9ODI9ODk9RTY9ODg9
QkI9RTM9ODE9OTkiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NjUKKyJZb3Ug
aGF2ZSBubyBzdG9yZWQgaGlzdG9yaWVzIiA6CisiPUU0PUJGPTlEPUU3PUFFPUExPUUzPTgxPTk3
PUUzPTgxPUE2PUUzPTgxPTgyPUUzPTgyPThCPUUzPTgzPTkyPUUzPTgyPUI5PQo9RTM9ODM9ODg9
RTM9ODM9QUE9RTM9ODM9QkM9RTM9ODE9QUY9RTM9ODE9ODI9RTM9ODI9OEE9RTM9ODE9QkU9RTM9
ODE9OUI9RTM9Cj04Mj05MyIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzo1
CisiSGlzdG9yeSBPcHRpb25zIiA6CisiPUUzPTgzPTkyPUUzPTgyPUI5PUUzPTgzPTg4PUUzPTgz
PUFBPUUzPTgzPUJDPUUzPTgyPUFBPUUzPTgzPTk3PUUzPTgyPUI3PQo9RTM9ODM9QTc9RTM9ODM9
QjMiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286OQorIllvdSBtdXN0IGJl
ICIgOgorIj1FMz04MT04Mj1FMz04MT1BQT1FMz04MT05Rj1FMz04MT1BRiIsCisKKy8vIHRlbXBs
YXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzo5CisibG9nZ2VkIGluIiA6CisiPUUzPTgzPUFEPUUz
PTgyPUIwPUUzPTgyPUE0PUUzPTgzPUIzIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9u
cy5tYWtvOjkKKyIgdG8gc3RvcmUgb3Igc3dpdGNoIGhpc3Rvcmllcy4iIDoKKyI9RTM9ODE9OTc9
RTM9ODE9QUE9RTM9ODE9ODQ9RTM9ODE9QTg9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9
ODM9QUE9Cj1FMz04Mz1CQz1FMz04MT1BRT1FND1CRj05RD1FNz1BRT1BMT1FMz04Mj04ND1FNT1B
ND04OT1FNj05Qj1CND1FMz04MT04Qz1FMz0KPTgxPUE3PUUzPTgxPThEPUUzPTgxPUJFPUUzPTgx
PTlCPUUzPTgyPTkzPUUzPTgwPTgyIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5t
YWtvOjE1CisvLyBweXRob24tZm9ybWF0CisiIGN1cnJlbnQgaGlzdG9yeSAoc3RvcmVkIGFzIFwi
JXNcIikiIDoKKyIgPUU3PThGPUJFPUU1PTlDPUE4PUUzPTgxPUFFPUUzPTgzPTkyPUUzPTgyPUI5
PUUzPTgzPTg4PUUzPTgzPUFBPUUzPTgzPUJDPQo9RUY9QkM9ODhcIiVzXCIgPUUzPTgxPUE4PUUz
PTgxPTk3PUUzPTgxPUE2PUU0PUJGPTlEPUU3PUFFPUExPUUzPTgxPTk1PUUzPQo9ODI9OEM9RTM9
ODE9QTY9RTM9ODE9ODQ9RTM9ODE9QkU9RTM9ODE9OTk9RUY9QkM9ODkiLAorCisvLyB0ZW1wbGF0
ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MTYKKyJMaXN0IiA6CisiPUUzPTgzPUFBPUUzPTgyPUI5
PUUzPTgzPTg4PUUzPTgxPTk5PUUzPTgyPThCIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0
aW9ucy5tYWtvOjE2CisiIHByZXZpb3VzbHkgc3RvcmVkIGhpc3RvcmllcyIgOgorIiA9RTQ9QkI9
QTU9RTU9ODk9OEQ9RTM9ODE9QUI9RTQ9QkY9OUQ9RTc9QUU9QTE9RTM9ODE9OTc9RTM9ODE9OUY9
RTM9ODM9OTI9Cj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1CQyIsCisKKy8vIHRl
bXBsYXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzoxOAorIkNyZWF0ZSIgOgorIj1FND1CRD05Qz1F
Nj04OD05MD1FMz04MT05OT1FMz04Mj04QiIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlv
bnMubWFrbzoxOAorIiBhIG5ldyBlbXB0eSBoaXN0b3J5IiA6CisiID1FNj05Nj1CMD1FOD1BNj04
Rj1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1CQyIsCisKKy8vIHRl
bXBsYXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzoyMAorIkNvbnN0cnVjdCB3b3JrZmxvdyIgOgor
Ij1FMz04Mz1BRj1FMz04Mz1CQz1FMz04Mj1BRj1FMz04Mz05NT1FMz04Mz1BRD1FMz04Mz1CQz1F
Mz04Mj05Mj1FNj1BNz04Qj0KPUU3PUFGPTg5PUUzPTgxPTk5PUUzPTgyPThCIiwKKworLy8gdGVt
cGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjIwCisiIGZyb20gdGhlIGN1cnJlbnQgaGlzdG9y
eSIgOgorIiA9RTc9OEY9QkU9RTU9OUM9QTg9RTM9ODE9QUU9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9
ODM9ODg9RTM9ODM9QUE9RTM9ODM9QkM9Cj1FMz04MT04Qj1FMz04Mj04OSIsCisKKy8vIHRlbXBs
YXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzoyMSB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1h
a286MjQKKyIgY3VycmVudCBoaXN0b3J5IiA6CisiID1FNz04Rj1CRT1FNT05Qz1BOD1FMz04MT1B
RT1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1CQz0KIiwKKworLy8g
dGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjIzCisiU2hvdyBkZWxldGVkIiA6CisiPUU1
PTg5PThBPUU5PTk5PUE0PUUzPTgxPTk3PUUzPTgxPTlGPUUzPTgzPTkyPUUzPTgyPUI5PUUzPTgz
PTg4PUUzPTgzPUFBPQo9RTM9ODM9QkM9RTM9ODI9OTI9RTg9QTE9QTg9RTc9QTQ9QkE9RTM9ODE9
OTk9RTM9ODI9OEIiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MjMKKyIg
ZGF0YXNldHMgaW4gaGlzdG9yeSIgOgorIiA9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9
ODM9QUE9RTM9ODM9QkM9RTM9ODE9QUU9RTM9ODM9ODc9RTM9ODM9QkM9Cj1FMz04Mj1CRj1FMz04
Mj1CQj1FMz04Mz04Mz1FMz04Mz04OCIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L3JlbmFtZS5t
YWtvOjMgdGVtcGxhdGVzL2hpc3RvcnkvcmVuYW1lLm1ha286NgorIlJlbmFtZSBIaXN0b3J5IiA6
CisiPUUzPTgzPTkyPUUzPTgyPUI5PUUzPTgzPTg4PUUzPTgzPUFBPUUzPTgzPUJDPUUzPTgxPUFF
PUU1PTkwPThEPUU3PUE3PUIwPQo9RTU9QTQ9ODk9RTY9OUI9QjQ9RTM9ODI9OTI9RTM9ODE9OTk9
RTM9ODI9OEIiLAorCisKKyJSZW5hbWUgSGlzdG9yaWVzIiA6CisiPUU1PTkwPThEPUU3PUE3PUIw
PUU1PUE0PTg5PUU2PTlCPUI0PUUzPTgxPTk5PUUzPTgyPThCIiwKKworIlBlcmZvcm0gQWN0aW9u
IiA6CisiPUU2PTkzPThEPUU0PUJEPTlDPUUzPTgyPTkyPUU1PUFFPTlGPUU4PUExPThDPUUzPTgx
PTk5PUUzPTgyPThCIiwKKworIlN1Ym1pdCIgOgorIj1FNz05OT1CQj1FOT04Qz1CMj1FMz04MT05
OT1FMz04Mj04QiIsCisKKworCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9yZW5hbWUubWFrbzoxMAor
IkN1cnJlbnQgTmFtZSIgOgorIj1FNz04Rj1CRT1FNT05Qz1BOD1FMz04MT1BRT1FNT05MD04RD1F
Nz1BNz1CMCIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L3JlbmFtZS5tYWtvOjEwCisiTmV3IE5h
bWUiIDoKKyI9RTY9OTY9QjA9RTM9ODE9OTc9RTM9ODE9ODQ9RTU9OTA9OEQ9RTc9QTc9QjAiLAor
CisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9zaGFyZS5tYWtvOjMKKyJTaGFyZSBoaXN0b3JpZXMiIDoK
KyI9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9ODM9QUE9RTM9ODM9QkM9RTM9ODI9OTI9
RTU9ODU9QjE9RTY9OUM9ODk9Cj1FMz04MT05OT1FMz04Mj04QiIsCisKKy8vIHRlbXBsYXRlcy9o
aXN0b3J5L3NoYXJlLm1ha286NgorIlNoYXJlIEhpc3RvcmllcyIgOgorIj1FMz04Mz05Mj1FMz04
Mj1COT1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1CQz1FMz04Mj05Mj1FNT04NT1CMT1FNj05Qz04
OT0KPUUzPTgxPTk5PUUzPTgyPThCIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvc2hhcmUubWFr
bzo5CisiSGlzdG9yeSBOYW1lOiIgOgorIj1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04
Mz1BQT1FMz04Mz1CQz1FNT05MD04RCIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1h
a286OQorIk51bWJlciBvZiBEYXRhc2V0czoiIDoKKyI9RTM9ODM9ODc9RTM9ODM9QkM9RTM9ODI9
QkY9RTM9ODI9QkI9RTM9ODM9ODM9RTM9ODM9ODg9RTY9OTU9QjAiLAorCisvLyB0ZW1wbGF0ZXMv
aGlzdG9yeS9zaGFyZS5tYWtvOjkKKyJTaGFyZSBMaW5rIiA6CisiPUU1PTg1PUIxPUU2PTlDPTg5
PUUzPTgzPUFBPUUzPTgzPUIzPUUzPTgyPUFGIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvc2hh
cmUubWFrbzoxNQorIlRoaXMgaGlzdG9yeSBjb250YWlucyBubyBkYXRhLiIgOgorIj1FMz04MT05
Mz1FMz04MT1BRT1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1BQT1FMz04Mz1CQz1F
Mz04MT1BQj0KPUUzPTgxPUFGPUUzPTgzPTg3PUUzPTgzPUJDPUUzPTgyPUJGPUUzPTgxPThDPUUz
PTgxPTgyPUUzPTgyPThBPUUzPTgxPUJFPUUzPQo9ODE9OUI9RTM9ODI9OTM9RTM9ODA9ODIiLAor
CisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9zaGFyZS5tYWtvOjIxCisiY29weSBsaW5rIHRvIHNoYXJl
IiA6CisiPUU1PTg1PUIxPUU2PTlDPTg5PUUzPTgzPUFBPUUzPTgzPUIzPUUzPTgyPUFGPUUzPTgy
PTkyPUUzPTgyPUIzPUUzPTgzPTk0PQo9RTM9ODM9QkM9RTM9ODE9OTk9RTM9ODI9OEIiLAorCisv
LyB0ZW1wbGF0ZXMvaGlzdG9yeS9zaGFyZS5tYWtvOjI0CisiRW1haWwgb2YgVXNlciB0byBzaGFy
ZSB3aXRoOiIgOgorIj1FNT04NT1CMT1FNj05Qz04OT1FMz04MT05Nz1FMz04MT05Rj1FMz04MT04
ND1FMz04Mz1BNj1FMz04Mz1CQz1FMz04Mj1CNj0KPUUzPTgxPUFFRT1FMz04Mz1BMT1FMz04Mz1C
Qz1FMz04Mz1BQjoiLAorLy8iPUUzPTgxPUE0PUUzPTgxPThFPUUzPTgxPUFFPUUzPTgzPTkyPUUz
PTgyPUI5PUUzPTgzPTg4PUUzPTgzPUFBPUUzPTgzPQo9QkM9RTM9ODI9OTI9RTU9ODU9QjE9RTY9
OUM9ODk9RTM9ODE9OTk9RTM9ODI9OEI9RTM9ODM9QTY9RTM9ODM9QkM9RTM9ODI9QjY9Cj1FMz04
MT1BRUU9RTM9ODM9QTE9RTM9ODM9QkM9RTM9ODM9QUI9RTM9ODI9QTI9RTM9ODM9ODk9RTM9ODM9
QUM9RTM9ODI9Qjk6IgorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5Lm1ha286NworIkdhbGF4
eSBIaXN0b3J5IiA6CisiR2FsYXh5ID1FMz04Mz05Mj1FMz04Mj1COT1FMz04Mz04OD1FMz04Mz1B
QT1FMz04Mz1CQyIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnkubWFrbzoyMzcKKyJyZWZy
ZXNoIiA6CisiPUUzPTgzPUFBPUUzPTgzPTk1PUUzPTgzPUFDPUUzPTgzPTgzPUUzPTgyPUI3PUUz
PTgzPUE1IiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvaGlzdG9yeS5tYWtvOjI0NQorIllvdSBhcmUg
Y3VycmVudGx5IHZpZXdpbmcgYSBkZWxldGVkIGhpc3RvcnkhIiA6CisiPUU2PUI2PTg4PUU1PThF
PUJCPUUzPTgxPTk3PUUzPTgxPTlGPUUzPTgzPTkyPUUzPTgyPUI5PUUzPTgzPTg4PUUzPTgzPUFB
PQo9RTM9ODM9QkM9RTM9ODI9OTI9RTM9ODE9QkY9RTM9ODE9QTY9RTM9ODE9ODQ9RTM9ODE9QkU9
RTM9ODE9OTk9RTM9ODA9ODIiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5Lm1ha286Mjg5
CisiWW91ciBoaXN0b3J5IGlzIGVtcHR5LiBDbGljayAnR2V0IERhdGEnIG9uIHRoZSBsZWZ0IHBh
bmUgdG8gc3RhcnQiIDoKKyI9RTM9ODM9OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9ODM9QUE9RTM9
ODM9QkM9RTM9ODE9QUY9RTc9QTk9QkE9RTM9ODE9QTc9Cj1FMz04MT05OT1FMz04MD04Mj1FOD1B
Nz1BMz1FNj05RT05MD1FMz04Mj05Mj1FMz04MT1BRj1FMz04MT05OD1FMz04Mj04MT1FMz0KPTgy
PThCPUUzPTgxPUFCPUUzPTgxPUFGPUUzPTgwPTgxPUU1PUI3PUE2PUUzPTgzPTkxPUUzPTgzPThE
PUUzPTgzPUFCPUUzPTgxPQo9QUUgJz1FMz04Mz04Nz1FMz04Mz1CQz1FMz04Mj1CRj1FNT04Rj05
Nj1FNT1CRT05NycgPUUzPTgyPTkyPUUzPTgyPUFGPUUzPQo9ODM9QUE9RTM9ODM9ODM9RTM9ODI9
QUYiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjQxCisiSm9iIGlz
IHdhaXRpbmcgdG8gcnVuIiA6CisiPUUzPTgyPUI4PUUzPTgzPUE3PUUzPTgzPTk2PUUzPTgxPUFG
PUU1PUFFPTlGPUU4PUExPThDPUU1PUJFPTg1PUUzPTgxPUExPQo9RTM9ODE9QTc9RTM9ODE9OTki
LAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjQzCisiSm9iIGlzIGN1
cnJlbnRseSBydW5uaW5nIiA6CisiPUUzPTgyPUI4PUUzPTgzPUE3PUUzPTgzPTk2PUUzPTgxPUFG
PUU1PUFFPTlGPUU4PUExPThDPUU0PUI4PUFEPUUzPTgxPUE3PQo9RTM9ODE9OTkiLAorCisvLyB0
ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjQ2CisiQW4gZXJyb3Igb2NjdXJyZWQg
cnVubmluZyB0aGlzIGpvYjogIiA6CisiPUUzPTgxPTkzPUUzPTgxPUFFPUUzPTgyPUI4PUUzPTgz
PUE3PUUzPTgzPTk2PUUzPTgxPUFFPUU1PUFFPTlGPUU4PUExPThDPQo9RTQ9Qjg9QUQ9RTM9ODE9
QUI9RTc9OTk9QkE9RTc9OTQ9OUY9RTM9ODE9OTc9RTM9ODE9OUY9RTM9ODI9QTg9RTM9ODM9QTk9
RTM9Cj04Mz1CQzogIiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvaGlzdG9yeV9jb21tb24ubWFrbzo0
NworInJlcG9ydCB0aGlzIGVycm9yIiA6CisiPUUzPTgxPTkzPUUzPTgxPUFFPUUzPTgyPUE4PUUz
PTgzPUE5PUUzPTgzPUJDPUUzPTgyPTkyPUU1PUEwPUIxPUU1PTkxPThBPQo9RTM9ODE9OTk9RTM9
ODI9OEIiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjU0CisiTm8g
ZGF0YTogIiA6CisiPUUzPTgzPTg3PUUzPTgzPUJDPUUzPTgyPUJGPUU3PTg0PUExPUUzPTgxPTk3
OiAiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjU4CisiZm9ybWF0
OiAiIDoKKyI9RTM9ODM9OTU9RTM9ODI9QTk9RTM9ODM9QkM9RTM9ODM9OUU9RTM9ODM9ODM9RTM9
ODM9ODg6ICIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286NTkKKyJk
YXRhYmFzZTogIiA6CisiPUUzPTgzPTg3PUUzPTgzPUJDPUUzPTgyPUJGPUUzPTgzPTk5PUUzPTgz
PUJDPUUzPTgyPUI5OiAiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtv
OjY2IHRlbXBsYXRlcy9yb290L21hc3RoZWFkLm1ha286MjAKKyJJbmZvOiAiIDoKKyI9RTY9ODM9
ODU9RTU9QTA9QjE6ICIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286
ODUKKy8vIHB5dGhvbi1mb3JtYXQKKyJFcnJvcjogdW5rbm93biBkYXRhc2V0IHN0YXRlIFwiJXNc
Ii4iIDoKKyI9RTM9ODI9QTg9RTM9ODM9QTk9RTM9ODM9QkM6ID1FND1COD04RD1FNj05OD04RT1F
Mz04MT1BQT1FMz04Mz04Nz1FMz04Mz0KPUJDPUUzPTgyPUJGPUU3PThBPUI2PUU2PTg1PThCIFwi
JXNcIj1FMz04MD04MiIsCisKKy8vIHRlbXBsYXRlcy9yb290L2luZGV4Lm1ha286MzIKKyJPcHRp
b25zIiA6CisiPUUzPTgyPUFBPUUzPTgzPTk3PUUzPTgyPUI3PUUzPTgzPUE3PUUzPTgzPUIzIiwK
KworLy8gdGVtcGxhdGVzL3Jvb3QvaW5kZXgubWFrbzozNAorIkhpc3RvcnkiIDoKKyI9RTM9ODM9
OTI9RTM9ODI9Qjk9RTM9ODM9ODg9RTM9ODM9QUE9RTM9ODM9QkMiLAorCisvLyB0ZW1wbGF0ZXMv
cm9vdC9tYXN0aGVhZC5tYWtvOjIwCisicmVwb3J0IGJ1Z3MiIDoKKyI9RTM9ODM9OTA9RTM9ODI9
QjA9RTM9ODI9OTI9RTU9QTA9QjE9RTU9OTE9OEE9RTM9ODE9OTk9RTM9ODI9OEIiLAorCisvLyB0
ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtvOjIxCisid2lraSIgOgorIndpa2kiLAorCisvLyB0
ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtvOjIyCisic2NyZWVuY2FzdHMiIDoKKyI9RTM9ODI9
Qjk9RTM9ODI9QUY9RTM9ODM9QUE9RTM9ODM9QkM9RTM9ODM9QjM9RTM9ODI9QUQ9RTM9ODM9QTM9
RTM9ODI9Qjk9Cj1FMz04Mz04OCIsCisKKy8vIHRlbXBsYXRlcy9yb290L21hc3RoZWFkLm1ha286
MjMKKyJibG9nIiA6CisiPUUzPTgzPTk2PUUzPTgzPUFEPUUzPTgyPUIwIiwKKworLy8gdGVtcGxh
dGVzL3Jvb3QvbWFzdGhlYWQubWFrbzozMQorLy8gcHl0aG9uLWZvcm1hdAorIkxvZ2dlZCBpbiBh
cyAlczogIiA6CisiJXMgPUUzPTgxPUE4PUUzPTgxPTk3PUUzPTgxPUE2PUUzPTgzPUFEPUUzPTgy
PUIwPUUzPTgyPUE0PUUzPTgzPUIzPUU0PUI4PQo9QUQ6ICIsCisKKy8vIHRlbXBsYXRlcy9yb290
L21hc3RoZWFkLm1ha286MzEKKyJtYW5hZ2UiIDoKKyI9RTc9QUU9QTE9RTc9OTA9ODYiLAorCisv
LyB0ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtvOjMyCisibG9nb3V0IiA6CisiPUUzPTgzPUFE
PUUzPTgyPUIwPUUzPTgyPUEyPUUzPTgyPUE2PUUzPTgzPTg4IiwKKworLy8gdGVtcGxhdGVzL3Jv
b3QvbWFzdGhlYWQubWFrbzozNAorIkFjY291bnQ6ICIgOgorIj1FMz04Mj1BMj1FMz04Mj1BQj1F
Mz04Mj1BNj1FMz04Mz1CMz1FMz04Mz04ODogIiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvbWFzdGhl
YWQubWFrbzozNAorImNyZWF0ZSIgOgorIj1FND1CRD05Qz1FNj04OD05MCIsCisKKy8vIHRlbXBs
YXRlcy9yb290L21hc3RoZWFkLm1ha286MzUKKyJsb2dpbiIgOgorIj1FMz04Mz1BRD1FMz04Mj1C
MD1FMz04Mj1BND1FMz04Mz1CMyIsCisKKy8vIHRlbXBsYXRlcy9yb290L3Rvb2xfbWVudS5tYWtv
OjUyCisiR2FsYXh5IFRvb2xzIiA6CisiR2FsYXh5ID1FMz04Mz04ND1FMz04Mz1CQz1FMz04Mz1B
Qj1FNz1CRT1BNCIsCisKKy8vIHRlbXBsYXRlcy9yb290L3Rvb2xfbWVudS5tYWtvOjEyOQorIldv
cmtmbG93IiA6CisiPUUzPTgzPUFGPUUzPTgzPUJDPUUzPTgyPUFGPUUzPTgzPTk1PUUzPTgzPUFE
PUUzPTgzPUJDIiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvdG9vbF9tZW51Lm1ha286MTM0CisiTWFu
YWdlIiA6CisiPUU3PUFFPUExPUU3PTkwPTg2IiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvdG9vbF9t
ZW51Lm1ha286MTM0Cisid29ya2Zsb3dzIiA6CisiPUUzPTgzPUFGPUUzPTgzPUJDPUUzPTgyPUFG
PUUzPTgzPTk1PUUzPTgzPUFEPUUzPTgzPUJDIiwKKworLy8gdGVtcGxhdGVzL3VzZXIvaW5kZXgu
bWFrbzoyIHRlbXBsYXRlcy91c2VyL2luZGV4Lm1ha286NAorIkFjY291bnQgc2V0dGluZ3MiIDoK
KyI9RTM9ODI9QTI9RTM9ODI9QUI9RTM9ODI9QTY9RTM9ODM9QjM9RTM9ODM9ODg9RTg9QTg9QUQ9
RTU9QUU9OUEiLAorCisvLyB0ZW1wbGF0ZXMvdXNlci9pbmRleC5tYWtvOjcKKy8vIHB5dGhvbi1m
b3JtYXQKKyJZb3UgYXJlIGN1cnJlbnRseSBsb2dnZWQgaW4gYXMgJXMuIiA6CisiJXMgPUUzPTgx
PUE4PUUzPTgxPTk3PUUzPTgxPUE2PUUzPTgzPUFEPUUzPTgyPUIwPUUzPTgyPUE0PUUzPTgzPUIz
PUU0PUI4PQo9QUQ9RTM9ODA9ODIiLAorCisvLyB0ZW1wbGF0ZXMvdXNlci9pbmRleC5tYWtvOjkK
KyJDaGFuZ2UgeW91ciBwYXNzd29yZCIgOgorIj1FMz04Mz05MT1FMz04Mj1COT1FMz04Mz1BRj1F
Mz04Mz1CQz1FMz04Mz04OT1FNT1BND04OT1FNj05Qj1CNCIsCisKKy8vIHRlbXBsYXRlcy91c2Vy
L2luZGV4Lm1ha286MTAKKyJVcGRhdGUgeW91ciBlbWFpbCBhZGRyZXNzIiA6CisiPUUzPTgzPUEx
PUUzPTgzPUJDPUUzPTgzPUFCPUUzPTgyPUEyPUUzPTgzPTg5PUUzPTgzPUFDPUUzPTgyPUI5PUU1
PUE0PTg5PQo9RTY9OUI9QjQiLAorCisvLyB0ZW1wbGF0ZXMvdXNlci9pbmRleC5tYWtvOjExCisi
TG9nb3V0IiA6CisiPUUzPTgzPUFEPUUzPTgyPUIwPUUzPTgyPUEyPUUzPTgyPUE2PUUzPTgzPTg4
IiwKKworLy8gdGVtcGxhdGVzL3VzZXIvaW5kZXgubWFrbzoxNgorIkxvZ2luIiA6CisiPUUzPTgz
PUFEPUUzPTgyPUIwPUUzPTgyPUE0PUUzPTgzPUIzIiwKKworLy8gdGVtcGxhdGVzL3VzZXIvaW5k
ZXgubWFrbzoxNworIkNyZWF0ZSBuZXcgYWNjb3VudCIgOgorIj1FNj05Nj1CMD1FOD1BNj04Rj1F
Mz04Mj1BMj1FMz04Mj1BQj1FMz04Mj1BNj1FMz04Mz1CMz1FMz04Mz04OD1FMz04Mj05Mj0KPUU0
PUJEPTlDPUU2PTg4PTkwPUUzPTgxPTk5PUUzPTgyPThCIgorCit9KQoKZGlmZiAtciA4MzQ2ZWM0
YmFhMzk5MmY0ZGMwMTYxZjBmYzc5YTBiYTg5M2MwYTYzIC1yIGRjYzBjMTkxNDdlYWQ4NmM2ZTM1
N2M3PQozOWUwNTEzYWRkZmUwMmNiMiBzdGF0aWMvc2NyaXB0cy9ubHMvbG9jYWxlLmpzCi0tLSAv
ZGV2L251bGwKKysrIGIvc3RhdGljL3NjcmlwdHMvbmxzL2xvY2FsZS5qcwpAQCAtMCwwICsxLDUx
NyBAQAorLyoqIGVuL21haW4gbG9jYWxpemF0aW9uIGhhc2ggLSBmb3IgdXNlIHdpdGggcmVxdWly
ZWpzJyBpMThuIHBsdWdpbiAqLworZGVmaW5lKHsKKyAgICByb290IDogeworLy8gLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS09Ci0tLS0tIGxvY2FsaXplZAorImhpc3RvcnkiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0
ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MjQKKyJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVs
ZXRlIHRoZSBjdXJyZW50IGhpc3Rvcnk/IiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL3Jvb3Qv
aGlzdG9yeS5tYWtvOjM4CisiY29sbGFwc2UgYWxsIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVz
L2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MgorIkhpc3RvcnkgSXRlbSBBdHRyaWJ1dGVz
IiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286
MTkKKyJFZGl0IEF0dHJpYnV0ZXMiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9l
ZGl0X2F0dHJpYnV0ZXMubWFrbzo2NAorIlRoaXMgd2lsbCBpbnNwZWN0IHRoZSBkYXRhc2V0IGFu
ZCBhdHRlbXB0IHRvIGNvcnJlY3QgdGhlIGFib3ZlIGNvbHVtbiB2YWw9CnVlcyBpZiB0aGV5IGFy
ZSBub3QgYWNjdXJhdGUuIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9h
dHRyaWJ1dGVzLm1ha286NjgKKyJSZXF1aXJlZCBtZXRhZGF0YSB2YWx1ZXMgYXJlIG1pc3Npbmcu
IFNvbWUgb2YgdGhlc2UgdmFsdWVzIG1heSBub3QgYmUgZWRpPQp0YWJsZSBieSB0aGUgdXNlci4g
U2VsZWN0aW5nIFwiQXV0by1kZXRlY3RcIiB3aWxsIGF0dGVtcHQgdG8gZml4IHRoZXNlIHZhbHU9
CmVzLiIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9kYXRhc2V0L2VkaXRfYXR0cmlidXRlcy5t
YWtvOjc4CisiQ29udmVydCB0byBuZXcgZm9ybWF0IiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVz
L2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286ODQKKyJDb252ZXJ0IHRvIiA6CitmYWxzZSwK
KworLy8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286OTUKKyJUaGlzIHdp
bGwgY3JlYXRlIGEgbmV3IGRhdGFzZXQgd2l0aCB0aGUgY29udGVudHMgb2YgdGhpcyBkYXRhc2V0
IGNvbnZlcnRlPQpkIHRvIGEgbmV3IGZvcm1hdC4iIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMv
ZGF0YXNldC9lZGl0X2F0dHJpYnV0ZXMubWFrbzoxMTEKKyJDaGFuZ2UgZGF0YSB0eXBlIiA6Citm
YWxzZSwKKworLy8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTE3Cisi
TmV3IFR5cGUiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0dHJpYnV0
ZXMubWFrbzoxMjQKKyJUaGlzIHdpbGwgY2hhbmdlIHRoZSBkYXRhdHlwZSBvZiB0aGUgZXhpc3Rp
bmcgZGF0YXNldCBidXQgPGk+bm90PC9pPiBtb2RpPQpmeSBpdHMgY29udGVudHMuIFVzZSB0aGlz
IGlmIEdhbGF4eSBoYXMgaW5jb3JyZWN0bHkgZ3Vlc3NlZCB0aGUgdHlwZSBvZiB5b3U9CnIgZGF0
YXNldC4iIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0dHJpYnV0ZXMu
bWFrbzoxMzcKKyJDb3B5IEhpc3RvcnkgSXRlbSIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9o
aXN0b3J5L2xpc3QubWFrbzozCisiWW91ciBzYXZlZCBoaXN0b3JpZXMiIDoKK2ZhbHNlLAorCisv
LyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286MTkKKyJTdG9yZWQgSGlzdG9yaWVzIiA6Citm
YWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjIxIHRlbXBsYXRlcy9yb290
L2hpc3RvcnkubWFrbzoyMzkKKyJoaWRlIGRlbGV0ZWQiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0
ZXMvaGlzdG9yeS9saXN0Lm1ha286MjMKKyJzaG93IGRlbGV0ZWQiIDoKK2ZhbHNlLAorCisvLyB0
ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286MjcKKyJOYW1lIiA6CitmYWxzZSwKKworLy8gdGVt
cGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjI3CisiU2l6ZSIgOgorZmFsc2UsCisKKy8vIHRlbXBs
YXRlcy9oaXN0b3J5L2xpc3QubWFrbzoyNworIkxhc3QgbW9kaWZpZWQiIDoKK2ZhbHNlLAorCisv
LyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286MjcKKyJBY3Rpb25zIiA6CitmYWxzZSwKKwor
Ly8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjQ1CisicmVuYW1lIiA6CitmYWxzZSwKKwor
Ly8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjQ2Cisic3dpdGNoIHRvIiA6CitmYWxzZSwK
KworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjQ3CisiZGVsZXRlIiA6CitmYWxzZSwK
KworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjQ5CisidW5kZWxldGUiIDoKK2ZhbHNl
LAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NTUKKyJBY3Rpb24iIDoKK2ZhbHNl
LAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NTYgdGVtcGxhdGVzL2hpc3Rvcnkv
b3B0aW9ucy5tYWtvOjIxCisiU2hhcmUiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9y
eS9saXN0Lm1ha286NTYgdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjE1CisiUmVuYW1l
IiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjU2IHRlbXBsYXRl
cy9oaXN0b3J5L29wdGlvbnMubWFrbzoyNAorIkRlbGV0ZSIgOgorZmFsc2UsCisKKy8vIHRlbXBs
YXRlcy9oaXN0b3J5L2xpc3QubWFrbzo1OAorIlVuZGVsZXRlIiA6CitmYWxzZSwKKworLy8gdGVt
cGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjY1CisiWW91IGhhdmUgbm8gc3RvcmVkIGhpc3Rvcmll
cyIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzo1CisiSGlz
dG9yeSBPcHRpb25zIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5t
YWtvOjkKKyJZb3UgbXVzdCBiZSAiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9v
cHRpb25zLm1ha286OQorImxvZ2dlZCBpbiIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0
b3J5L29wdGlvbnMubWFrbzo5CisiIHRvIHN0b3JlIG9yIHN3aXRjaCBoaXN0b3JpZXMuIiA6Citm
YWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjE1CisvLyBweXRob24t
Zm9ybWF0CisiIGN1cnJlbnQgaGlzdG9yeSAoc3RvcmVkIGFzIFwiJXNcIikiIDoKK2ZhbHNlLAor
CisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MTYKKyJMaXN0IiA6CitmYWxzZSwK
KworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjE2CisiIHByZXZpb3VzbHkgc3Rv
cmVkIGhpc3RvcmllcyIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlvbnMu
bWFrbzoxOAorIkNyZWF0ZSIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlv
bnMubWFrbzoxOAorIiBhIG5ldyBlbXB0eSBoaXN0b3J5IiA6CitmYWxzZSwKKworLy8gdGVtcGxh
dGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjIwCisiQ29uc3RydWN0IHdvcmtmbG93IiA6CitmYWxz
ZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjIwCisiIGZyb20gdGhlIGN1
cnJlbnQgaGlzdG9yeSIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlvbnMu
bWFrbzoyMSB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MjQKKyIgY3VycmVudCBoaXN0
b3J5IiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjIzCisi
U2hvdyBkZWxldGVkIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5t
YWtvOjIzCisiIGRhdGFzZXRzIGluIGhpc3RvcnkiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMv
aGlzdG9yeS9yZW5hbWUubWFrbzozIHRlbXBsYXRlcy9oaXN0b3J5L3JlbmFtZS5tYWtvOjYKKyJS
ZW5hbWUgSGlzdG9yeSIgOgorZmFsc2UsCisKKworIlJlbmFtZSBIaXN0b3JpZXMiIDoKK2ZhbHNl
LAorCisiUGVyZm9ybSBBY3Rpb24iIDoKK2ZhbHNlLAorCisiU3VibWl0IiA6CitmYWxzZSwKKwor
Ly8gdGVtcGxhdGVzL2hpc3RvcnkvcmVuYW1lLm1ha286MTAKKyJDdXJyZW50IE5hbWUiIDoKK2Zh
bHNlLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9yZW5hbWUubWFrbzoxMAorIk5ldyBOYW1lIiA6
CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvc2hhcmUubWFrbzozCisiU2hhcmUgaGlz
dG9yaWVzIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvc2hhcmUubWFrbzo2Cisi
U2hhcmUgSGlzdG9yaWVzIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvc2hhcmUu
bWFrbzo5CisiSGlzdG9yeSBOYW1lOiIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5
L3NoYXJlLm1ha286OQorIk51bWJlciBvZiBEYXRhc2V0czoiIDoKK2ZhbHNlLAorCisvLyB0ZW1w
bGF0ZXMvaGlzdG9yeS9zaGFyZS5tYWtvOjkKKyJTaGFyZSBMaW5rIiA6CitmYWxzZSwKKworLy8g
dGVtcGxhdGVzL2hpc3Rvcnkvc2hhcmUubWFrbzoxNQorIlRoaXMgaGlzdG9yeSBjb250YWlucyBu
byBkYXRhLiIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1ha286MjEK
KyJjb3B5IGxpbmsgdG8gc2hhcmUiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9z
aGFyZS5tYWtvOjI0CisiRW1haWwgb2YgVXNlciB0byBzaGFyZSB3aXRoOiIgOgorZmFsc2UsCisK
Ky8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnkubWFrbzo3CisiR2FsYXh5IEhpc3RvcnkiIDoKK2Zh
bHNlLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5Lm1ha286MjM3CisicmVmcmVzaCIgOgor
ZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnkubWFrbzoyNDUKKyJZb3UgYXJlIGN1
cnJlbnRseSB2aWV3aW5nIGEgZGVsZXRlZCBoaXN0b3J5ISIgOgorZmFsc2UsCisKKy8vIHRlbXBs
YXRlcy9yb290L2hpc3RvcnkubWFrbzoyODkKKyJZb3VyIGhpc3RvcnkgaXMgZW1wdHkuIENsaWNr
ICdHZXQgRGF0YScgb24gdGhlIGxlZnQgcGFuZSB0byBzdGFydCIgOgorZmFsc2UsCisKKy8vIHRl
bXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286NDEKKyJKb2IgaXMgd2FpdGluZyB0byBy
dW4iIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjQz
CisiSm9iIGlzIGN1cnJlbnRseSBydW5uaW5nIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL3Jv
b3QvaGlzdG9yeV9jb21tb24ubWFrbzo0NgorIkFuIGVycm9yIG9jY3VycmVkIHJ1bm5pbmcgdGhp
cyBqb2I6ICIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1h
a286NDcKKyJyZXBvcnQgdGhpcyBlcnJvciIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9yb290
L2hpc3RvcnlfY29tbW9uLm1ha286NTQKKyJObyBkYXRhOiAiIDoKK2ZhbHNlLAorCisvLyB0ZW1w
bGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjU4CisiZm9ybWF0OiAiIDoKK2ZhbHNlLAor
CisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjU5CisiZGF0YWJhc2U6ICIg
OgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286NjYgdGVt
cGxhdGVzL3Jvb3QvbWFzdGhlYWQubWFrbzoyMAorIkluZm86ICIgOgorZmFsc2UsCisKKy8vIHRl
bXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286ODUKKy8vIHB5dGhvbi1mb3JtYXQKKyJF
cnJvcjogdW5rbm93biBkYXRhc2V0IHN0YXRlIFwiJXNcIi4iIDoKK2ZhbHNlLAorCisvLyB0ZW1w
bGF0ZXMvcm9vdC9pbmRleC5tYWtvOjMyCisiT3B0aW9ucyIgOgorZmFsc2UsCisKKy8vIHRlbXBs
YXRlcy9yb290L2luZGV4Lm1ha286MzQKKyJIaXN0b3J5IiA6CitmYWxzZSwKKworLy8gdGVtcGxh
dGVzL3Jvb3QvbWFzdGhlYWQubWFrbzoyMAorInJlcG9ydCBidWdzIiA6CitmYWxzZSwKKworLy8g
dGVtcGxhdGVzL3Jvb3QvbWFzdGhlYWQubWFrbzoyMQorIndpa2kiIDoKK2ZhbHNlLAorCisvLyB0
ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtvOjIyCisic2NyZWVuY2FzdHMiIDoKK2ZhbHNlLAor
CisvLyB0ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtvOjIzCisiYmxvZyIgOgorZmFsc2UsCisK
Ky8vIHRlbXBsYXRlcy9yb290L21hc3RoZWFkLm1ha286MzEKKy8vIHB5dGhvbi1mb3JtYXQKKyJM
b2dnZWQgaW4gYXMgJXM6ICIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9yb290L21hc3RoZWFk
Lm1ha286MzEKKyJtYW5hZ2UiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9tYXN0aGVh
ZC5tYWtvOjMyCisibG9nb3V0IiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL3Jvb3QvbWFzdGhl
YWQubWFrbzozNAorIkFjY291bnQ6ICIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRlcy9yb290L21h
c3RoZWFkLm1ha286MzQKKyJjcmVhdGUiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9t
YXN0aGVhZC5tYWtvOjM1CisibG9naW4iIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC90
b29sX21lbnUubWFrbzo1MgorIkdhbGF4eSBUb29scyIgOgorZmFsc2UsCisKKy8vIHRlbXBsYXRl
cy9yb290L3Rvb2xfbWVudS5tYWtvOjEyOQorIldvcmtmbG93IiA6CitmYWxzZSwKKworLy8gdGVt
cGxhdGVzL3Jvb3QvdG9vbF9tZW51Lm1ha286MTM0CisiTWFuYWdlIiA6CitmYWxzZSwKKworLy8g
dGVtcGxhdGVzL3Jvb3QvdG9vbF9tZW51Lm1ha286MTM0Cisid29ya2Zsb3dzIiA6CitmYWxzZSwK
KworLy8gdGVtcGxhdGVzL3VzZXIvaW5kZXgubWFrbzoyIHRlbXBsYXRlcy91c2VyL2luZGV4Lm1h
a286NAorIkFjY291bnQgc2V0dGluZ3MiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvdXNlci9p
bmRleC5tYWtvOjcKKy8vIHB5dGhvbi1mb3JtYXQKKyJZb3UgYXJlIGN1cnJlbnRseSBsb2dnZWQg
aW4gYXMgJXMuIiA6CitmYWxzZSwKKworLy8gdGVtcGxhdGVzL3VzZXIvaW5kZXgubWFrbzo5Cisi
Q2hhbmdlIHlvdXIgcGFzc3dvcmQiIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0ZXMvdXNlci9pbmRl
eC5tYWtvOjEwCisiVXBkYXRlIHlvdXIgZW1haWwgYWRkcmVzcyIgOgorZmFsc2UsCisKKy8vIHRl
bXBsYXRlcy91c2VyL2luZGV4Lm1ha286MTEKKyJMb2dvdXQiIDoKK2ZhbHNlLAorCisvLyB0ZW1w
bGF0ZXMvdXNlci9pbmRleC5tYWtvOjE2CisiTG9naW4iIDoKK2ZhbHNlLAorCisvLyB0ZW1wbGF0
ZXMvdXNlci9pbmRleC5tYWtvOjE3CisiQ3JlYXRlIG5ldyBhY2NvdW50IiA6CitmYWxzZSwKKwor
CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLT0KLS0tLS0gbmVlZCB0byBiZSBsb2NhbGl6ZWQKKyJhbm9ueW1v
dXMgdXNlciIgOgorZmFsc2UsCisKKyJVc2luZyAiIDoKK2ZhbHNlLAorCisiVGhlcmUgd2FzIGFu
IGVycm9yIGdldHRpbmcgdGhlIGRhdGEgZm9yIHRoaXMgZGF0YXNldCIgOgorZmFsc2UsCisKKyJU
aGlzIGRhdGFzZXQgaGFzIGJlZW4gZGVsZXRlZCBhbmQgcmVtb3ZlZCBmcm9tIGRpc2suIiA6Citm
YWxzZSwKKworIlRoaXMgZGF0YXNldCBoYXMgYmVlbiBkZWxldGVkLiIgOgorZmFsc2UsCisKKyJU
aGlzIGRhdGFzZXQgaGFzIGJlZW4gaGlkZGVuLiIgOgorZmFsc2UsCisKKyJmb3JtYXQiIDoKK2Zh
bHNlLAorCisiZGF0YWJhc2UiIDoKK2ZhbHNlLAorCisiVGhpcyBoaXN0b3J5IGlzIGVtcHR5IiA6
CitmYWxzZSwKKworIk5vIG1hdGNoaW5nIGRhdGFzZXRzIGZvdW5kIiA6CitmYWxzZSwKKworIllv
dSBhcmUgb3ZlciB5b3VyIGRpc2sgcXVvdGEuIiA6CitmYWxzZSwKKworIlRvb2wgZXhlY3V0aW9u
IGlzIG9uIGhvbGQgdW50aWwgeW91ciBkaXNrIHVzYWdlIGRyb3BzIGJlbG93IHlvdXIgYWxsb2Nh
dGU9CmQgcXVvdGEuIiA6CitmYWxzZSwKKworIkFsbCIgOgorZmFsc2UsCisKKyJOb25lIiA6Citm
YWxzZSwKKworIkZvciBhbGwgc2VsZWN0ZWQiIDoKK2ZhbHNlLAorCisiVGhpcyBoaXN0b3J5IGlz
IGVtcHR5LiBDbGljayAnR2V0IERhdGEnIG9uIHRoZSBsZWZ0IHRvb2wgbWVudSB0byBzdGFydCIg
OgorZmFsc2UsCisKKyJJbmNsdWRlIERlbGV0ZWQgRGF0YXNldHMiIDoKK2ZhbHNlLAorCisiSW5j
bHVkZSBIaWRkZW4gRGF0YXNldHMiIDoKK2ZhbHNlLAorCisiRWRpdCBoaXN0b3J5IHRhZ3MiIDoK
K2ZhbHNlLAorCisiRWRpdCBoaXN0b3J5IEFubm90YXRpb24iIDoKK2ZhbHNlLAorCisiT3BlcmF0
aW9ucyBvbiBtdWx0aXBsZSBkYXRhc2V0cyIgOgorZmFsc2UsCisKKyJTZWFyY2ggZGF0YXNldHMi
IDoKK2ZhbHNlLAorCisiY2xlYXIgc2VhcmNoIChlc2MpIiA6CitmYWxzZSwKKworImxvYWRpbmcu
Li4iIDoKK2ZhbHNlLAorCisiSGlkZSBkYXRhc2V0cyIgOgorZmFsc2UsCisKKyJVbmhpZGUgZGF0
YXNldHMiIDoKK2ZhbHNlLAorCisiRGVsZXRlIGRhdGFzZXRzIiA6CitmYWxzZSwKKworIlVuZGVs
ZXRlIGRhdGFzZXRzIiA6CitmYWxzZSwKKworIlBlcm1hbmVudGx5IGRlbGV0ZSBkYXRhc2V0cyIg
OgorZmFsc2UsCisKKyJDbGljayB0byByZW5hbWUgaGlzdG9yeSIgOgorZmFsc2UsCisKKyJWaWV3
IGRhdGEiIDoKK2ZhbHNlLAorCisiRWRpdCBhdHRyaWJ1dGVzIiA6CitmYWxzZSwKKworIlZpZXcg
ZGV0YWlscyIgOgorZmFsc2UsCisKKyJSdW4gdGhpcyBqb2IgYWdhaW4iIDoKK2ZhbHNlLAorCisi
RWRpdCBkYXRhc2V0IHRhZ3MiIDoKK2ZhbHNlLAorCisiRWRpdCBkYXRhc2V0IGFubm90YXRpb24i
IDoKK2ZhbHNlLAorCisiIENsaWNrIDxhIGhyZWY9M0RcImphdmFzY3JpcHQ6dm9pZCgwKTtcIiBj
bGFzcz0zRFwiZGF0YXNldC11bmRlbGV0ZVwiPmhlcj0KZTwvYT4gdG8gdW5kZWxldGUgaXQgb3Ig
PGEgaHJlZj0zRFwiamF2YXNjcmlwdDp2b2lkKDApO1wiIGNsYXNzPTNEXCJkYXRhc2V0PQotcHVy
Z2VcIj5oZXJlPC9hPiB0byBpbW1lZGlhdGVseSByZW1vdmUgaXQgZnJvbSBkaXNrIiA6CitmYWxz
ZSwKKworIiBDbGljayA8YSBocmVmPTNEXCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgY2xhc3M9M0Rc
ImRhdGFzZXQtdW5oaWRlXCI+aGVyZTw9Ci9hPiB0byB1bmhpZGUgaXQiIDoKK2ZhbHNlLAorCisi
RG93bmxvYWQiIDoKK2ZhbHNlLAorCisiVmlzdWFsaXplIiA6CitmYWxzZQorCisKKy8vIC0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tPQotLS0tLQorfSwKKyAgICAnamEnICA6IHRydWUsCisgICAgJ3poJyAgOiB0cnVl
Cit9KTsKCmRpZmYgLXIgODM0NmVjNGJhYTM5OTJmNGRjMDE2MWYwZmM3OWEwYmE4OTNjMGE2MyAt
ciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdjNz0KMzllMDUxM2FkZGZlMDJjYjIgc3RhdGljL3Njcmlw
dHMvbmxzL3poL2xvY2FsZS5qcwotLS0gL2Rldi9udWxsCisrKyBiL3N0YXRpYy9zY3JpcHRzL25s
cy96aC9sb2NhbGUuanMKQEAgLTAsMCArMSw1NzAgQEAKKy8qKiB6aCBsb2NhbGl6YXRpb24gKi8K
K2RlZmluZSh7CisKKy8vIHRlbXBsYXRlcy9iYXNlX3BhbmVscy5tYWtvOjUKKyJHYWxheHkiIDoK
KyJHYWxheHkiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MjQKKyJBcmUg
eW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoZSBjdXJyZW50IGhpc3Rvcnk/IiA6CisiPUU3
PUExPUFFPUU4PUFFPUE0PUU4PUE2PTgxPUU1PTg4PUEwPUU5PTk5PUE0PUU1PUJEPTkzPUU1PTg5
PThEPUU3PTlBPTg0PQo9RTU9OEU9ODY9RTU9OEY9QjI9RTg9QUU9QjA9RTU9QkQ9OTU9RTU9OTA9
OTc9RUY9QkM9OUYiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9oaXN0b3J5Lm1ha286MzgKKyJjb2xs
YXBzZSBhbGwiIDoKKyI9RTU9ODU9QTg9RTk9ODM9QTg9RTY9OTQ9QjY9RTc9QkM9QTkiLAorCisv
LyB0ZW1wbGF0ZXMvcm9vdC9pbmRleC5tYWtvOjUKKyJUb29scyIgOgorIj1FNT1CNz1BNT1FNT04
NT1CNyIsCisKKworLy8gdG9vbHMvKioueG1sCisiR2V0IERhdGEiIDoKKyI9RTg9OEU9Qjc9RTU9
OEY9OTY9RTY9OTU9QjA9RTY9OEQ9QUUiLAorCisiR2V0IEVOQ09ERSBEYXRhIiA6CisiPUU4PThF
PUI3PUU1PThGPTk2RU5DT0RFPUU2PTk1PUIwPUU2PThEPUFFIiwKKworIkVOQ09ERSBUb29scyIg
OgorIkVOQ09ERT1FNT1CNz1BNT1FNT04NT1CNyIsCisKKyJMaWZ0LU92ZXIiIDoKKyI9RTc9ODk9
ODg9RTY9OUM9QUM9RTg9QkQ9QUM9RTY9OEQ9QTIiLAorCisiVGV4dCBNYW5pcHVsYXRpb24iIDoK
KyI9RTY9OTY9ODc9RTY9OUM9QUM9RTY9OTM9OEQ9RTQ9QkQ9OUMiLAorCisiRmlsdGVyIGFuZCBT
b3J0IiA6CisiPUU4PUJGPTg3PUU2PUJCPUE0PUU1PTkyPThDPUU2PThFPTkyPUU1PUJBPThGIiwK
KworIkpvaW4sIFN1YnRyYWN0IGFuZCBHcm91cCIgOgorIj1FNz1CQj05Mz1FNT05MD04OD1FRj1C
Qz04Qz1FNT1CNz1BRT1FOT05Qj04Nj1FND1COD04RT1FNT04OD04Nj1FNz1CQj04NCIsCisKKyJD
b252ZXJ0IEZvcm1hdHMiIDoKKyI9RTY9QTA9QkM9RTU9QkM9OEY9RTg9QkQ9QUM9RTY9OEQ9QTIi
LAorCisiRXh0cmFjdCBGZWF0dXJlcyIgOgorIj1FNz04OT1COT1FNT1CRT04MT1FNj04Rj05MD1F
NT04Rj05NiIsCisKKyJGZXRjaCBTZXF1ZW5jZXMiIDoKKyI9RTg9OEU9Qjc9RTU9OEY9OTY9RTU9
QkE9OEY9RTU9ODg9OTciLAorCisiRmV0Y2ggQWxpZ25tZW50cyIgOgorIj1FOD04RT1CNz1FNT04
Rj05Nj1FNj1BRj05ND1FNT1BRj1COT1FND1COD04QT1FNz05QT04ND1FNT1CQT04Rj1FNT04OD05
NyIsCisKKyJHZXQgR2Vub21pYyBTY29yZXMiIDoKKyI9RTg9OEU9Qjc9RTU9QkU9OTc9RTU9OUY9
QkE9RTU9OUI9QTA9RTc9QkI9ODQ9RTU9ODg9ODY9RTY9OTU9QjAiLAorCisiT3BlcmF0ZSBvbiBH
ZW5vbWljIEludGVydmFscyIgOgorIj1FNT05Rj1CQT1FNT05Qj1BMD1FNz1CQj04ND1FNT04Qz1C
QT1FOT05Nz1CND1FNj05Mz04RD1FND1CRD05QyIsCisKKyJTdGF0aXN0aWNzIiA6CisiPUU3PUJC
PTlGPUU4PUFFPUExPUU5PTg3PThGIiwKKworIkdyYXBoL0Rpc3BsYXkgRGF0YSIgOgorIj1FNT05
Qj1CRT1FNT1CRD1BMj1FRj1CQz04Rj1FNj05NT1CMD1FNj04RD1BRSIsCisKKyJSZWdpb25hbCBW
YXJpYXRpb24iIDoKKyI9RTU9OEM9QkE9RTU9OUY9OUY9RTU9QTQ9OUE9RTY9ODA9ODE9RTY9ODA9
QTciLAorCisiRXZvbHV0aW9uOiBIeVBoeSIgOgorIj1FOD1CRj05Qj1FNT04Qz05NjogSHlQaHki
LAorCisiVGF4b25vbXkgbWFuaXB1bGF0aW9uIiA6CisiPUU1PTg4PTg2PUU3PUIxPUJCPUU1PUE0
PTg0PUU3PTkwPTg2IiwKKworIlNvbGV4YSB0b29scyIgOgorIlNvbGV4YT1FNT1CNz1BNT1FNT04
NT1CNyIsCisKKyJGQVNUQSBtYW5pcHVsYXRpb24iIDoKKyJGQVNUQT1FNT1BND04ND1FNz05MD04
NiIsCisKKyJTaG9ydCBSZWFkIFFDIGFuZCBNYW5pcHVsYXRpb24iIDoKKyI9RTc9OUY9QUQ9RTc9
ODk9ODc9RTY9QUU9QjU9RTY9OTU9QjA9RTY9OEQ9QUU9RTg9QjQ9QTg9RTk9ODc9OEY9RTY9OEU9
QTc9Cj1FNT04OD1CNj1FNT04Rj04QT1FNT1BND04ND1FNz05MD04NiIsCisKKyJTaG9ydCBSZWFk
IE1hcHBpbmciIDoKKyI9RTc9OUY9QUQ9RTc9ODk9ODc9RTY9QUU9QjU9RTU9OUI9OUU9RTg9QjQ9
QjQiLAorCisKKy8vIHRlbXBsYXRlcy9hZG1pbl9tYWluLm1ha286MyB0ZW1wbGF0ZXMvYWRtaW5f
bWFpbi5tYWtvOjgKKyJHYWxheHkgQWRtaW5pc3RyYXRpb24iIDoKKyJHYWxheHkgPUU3PUFFPUEx
PUU3PTkwPTg2IiwKKworLy8gdGVtcGxhdGVzL2FkbWluX21haW4ubWFrbzoxNworIkFkbWluIHBh
c3N3b3JkOiAiIDoKKyI9RTc9QUU9QTE9RTc9OTA9ODY9RTU9OTE9OTg9RTU9QUY9ODY9RTc9QTA9
ODE6ICIsCisKKy8vIHRlbXBsYXRlcy9hZG1pbl9tYWluLm1ha286MTkKKyJSZWxvYWQgdG9vbDog
IiA6CisiPUU5PTg3PThEPUU2PTk2PUIwPUU4PUJEPUJEPUU1PTg1PUE1PUU1PUI3PUE1PUU1PTg1
PUI3IiwKKworLy8gdGVtcGxhdGVzL2FkbWluX21haW4ubWFrbzozNQorIlJlbG9hZCIgOgorIj1F
OT04Nz04RD1FNj05Nj1CMD1FOD1CRD1CRD1FNT04NT1BNSIsCisKKy8vIHRlbXBsYXRlcy9kYXRh
c2V0L2VkaXRfYXR0cmlidXRlcy5tYWtvOjIKKyJIaXN0b3J5IEl0ZW0gQXR0cmlidXRlcyIgOgor
Ij1FNT04RT04Nj1FNT04Rj1CMj1FOT1BMT1COT1FNz05Qj1BRT1FNT1CMT05RT1FNj04MD1BNyIs
CisKKy8vIHRlbXBsYXRlcy9kYXRhc2V0L2VkaXRfYXR0cmlidXRlcy5tYWtvOjE5CisiRWRpdCBh
dHRyaWJ1dGVzIiA6CisiPUU3PUJDPTk2PUU4PUJFPTkxPUU1PUIxPTlFPUU2PTgwPUE3IiwKKwor
Ly8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286NjQKKyJUaGlzIHdpbGwg
aW5zcGVjdCB0aGUgZGF0YXNldCBhbmQgYXR0ZW1wdCB0byBjb3JyZWN0IHRoZSBhYm92ZSBjb2x1
bW4gdmFsPQp1ZXMgaWYgdGhleSBhcmUgbm90IGFjY3VyYXRlLiIgOgorIj1FNj05NT1CMD1FNj04
RD1BRT1FOT05Qj04Nj1FNj1BMz04MD1FNj05Rj1BNT1FRj1CQz04Qz1FOD04Qj1BNT1FNj05Qz04
OT0KPUU5PTk0PTk5PUU4PUFGPUFGPUVGPUJDPThDPUU2PTlCPUI0PUU2PUFEPUEzPUU0PUI4PThB
PUU4PUJGPUIwPUU2PUEwPThGPUU0PQo9Qjg9QUQ9RTc9OUE9ODQ9RTU9ODA9QkM9RTM9ODA9ODIi
LAorCisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0dHJpYnV0ZXMubWFrbzo2OAorIlJlcXVp
cmVkIG1ldGFkYXRhIHZhbHVlcyBhcmUgbWlzc2luZy4gU29tZSBvZiB0aGVzZSB2YWx1ZXMgbWF5
IG5vdCBiZSBlZGk9CnRhYmxlIGJ5IHRoZSB1c2VyLiBTZWxlY3RpbmcgXCJBdXRvLWRldGVjdFwi
IHdpbGwgYXR0ZW1wdCB0byBmaXggdGhlc2UgdmFsdT0KZXMuIiA6CisiPUU3PUJDPUJBPUU1PUIw
PTkxPUU2PTg5PTgwPUU5PTlDPTgwPUU3PTlBPTg0bWV0YWRhdGE9RTc9OUE9ODQ9RTU9ODA9QkM9
Cj1FMz04MD04Mj1FNz05ND1BOD1FNj04OD1CNz1FNT04Rj1BRj1FOD04Mz1CRD1FNj05Nz1BMD1F
Nj1CMz05NT1FNT1BRj1COT1FOD0KPUJGPTk5PUU0PUJBPTlCPUU1PTgwPUJDPUU4PUJGPTlCPUU4
PUExPThDPUU3PUJDPTk2PUU4PUJFPTkxPUUzPTgwPTgyPUU5PTgwPQo9ODk9RTY9OEI9QTk9RTI9
ODA9OUM9RTg9ODc9QUE9RTU9OEE9QTg9RTY9QTM9ODA9RTY9QjU9OEI9RTI9ODA9OUQ9RTY9OUQ9
QTU9Cj1FNT1CMD05RD1FOD1BRj05NT1FND1CRj1BRT1FNj1BRD1BMz1FOD1CRj05OT1FND1CQT05
Qj1FNT04MD1CQz1FMz04MD04MiIsCisKKy8vIHRlbXBsYXRlcy9kYXRhc2V0L2VkaXRfYXR0cmli
dXRlcy5tYWtvOjc4CisiQ29udmVydCB0byBuZXcgZm9ybWF0IiA6CisiPUU4PUJEPUFDPUU2PThE
PUEyPUU0PUI4PUJBPUU2PTk2PUIwPUU2PUEwPUJDPUU1PUJDPThGIiwKKworLy8gdGVtcGxhdGVz
L2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286ODQKKyJDb252ZXJ0IHRvIiA6CisiPUU4PUJE
PUFDPUU2PThEPUEyPUU0PUI4PUJBIiwKKworLy8gdGVtcGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRy
aWJ1dGVzLm1ha286OTUKKyJUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IGRhdGFzZXQgd2l0aCB0aGUg
Y29udGVudHMgb2YgdGhpcyBkYXRhc2V0IGNvbnZlcnRlPQpkIHRvIGEgbmV3IGZvcm1hdC4iIDoK
KyI9RTg9QkY9OTk9RTU9QjA9ODY9RTQ9QkE9QTc9RTc9OTQ9OUY9RTQ9Qjg9ODA9RTQ9Qjg9QUE9
RTg9QkQ9QUM9RTY9OEQ9QTI9Cj1FNj1BMD1CQz1FNT1CQz04Rj1FNT05MD04RT1FNz05QT04ND1F
Nj05Nj1CMD1FNj05NT1CMD1FNj04RD1BRT1FOT05Qj04Nj1FRj0KPUJDPThDIiwKKworLy8gdGVt
cGxhdGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTExCisiQ2hhbmdlIGRhdGEgdHlw
ZSIgOgorIj1FNj05ND1COT1FNT04Rj05OD1FNj05NT1CMD1FNj04RD1BRT1FNz1CMT1CQj1FNT05
RT04QiIsCisKKy8vIHRlbXBsYXRlcy9kYXRhc2V0L2VkaXRfYXR0cmlidXRlcy5tYWtvOjExNwor
Ik5ldyBUeXBlIiA6CisiPUU2PTk2PUIwPUU3PUIxPUJCPUU1PTlFPThCIiwKKworLy8gdGVtcGxh
dGVzL2RhdGFzZXQvZWRpdF9hdHRyaWJ1dGVzLm1ha286MTI0CisiVGhpcyB3aWxsIGNoYW5nZSB0
aGUgZGF0YXR5cGUgb2YgdGhlIGV4aXN0aW5nIGRhdGFzZXQgYnV0IDxpPm5vdDwvaT4gbW9kaT0K
ZnkgaXRzIGNvbnRlbnRzLiBVc2UgdGhpcyBpZiBHYWxheHkgaGFzIGluY29ycmVjdGx5IGd1ZXNz
ZWQgdGhlIHR5cGUgb2YgeW91PQpyIGRhdGFzZXQuIiA6CisiPUU4PUJGPTk5PUU1PUIwPTg2PUU2
PTk0PUI5PUU1PThGPTk4PUU1PUI3PUIyPUU2PTlDPTg5PUU2PTk1PUIwPUU2PThEPUFFPQo9RTk9
OUI9ODY9RTc9OUE9ODQ9RTY9OTU9QjA9RTY9OEQ9QUU9RTc9QjE9QkI9RTU9OUU9OEI9RUY9QkM9
OEM9RTQ9QkQ9ODY8aT49Cj1FND1COD04RDwvaT49RTY9OTQ9Qjk9RTU9OEY9OTg9RTU9ODU9QjY9
RTU9ODY9ODU9RTU9QUU9Qjk9RTM9ODA9ODI9RTU9QkQ9Cj05M0dhbGF4eT1FND1COD04RD1FOD04
Mz1CRD1FNj1BRD1BMz1FNz1BMT1BRT1FNT04OD1BND1FNj05Nj1BRD1FND1CRD1BMD1FNz0KPTlB
PTg0PUU2PTk1PUIwPUU2PThEPUFFPUU3PUIxPUJCPUU1PTlFPThCPUU2PTk3PUI2PUVGPUJDPThD
PUU4PUFFPUJFPUU3PUJEPQo9QUU9RTg9QUY9QTU9RTU9OEY9ODI9RTY9OTU9QjA9RTM9ODA9ODIi
LAorCisvLyB0ZW1wbGF0ZXMvZGF0YXNldC9lZGl0X2F0dHJpYnV0ZXMubWFrbzoxMzcKKyJDb3B5
IEhpc3RvcnkgSXRlbSIgOgorIj1FNT1BND04RD1FNT04OD1CNj1FNT04RT04Nj1FNT04Rj1CMj1F
OD1BRT1CMD1FNT1CRD05NT1FOT1BMT1COSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3Qu
bWFrbzozCisiU2F2ZWQgSGlzdG9yaWVzIiA6CisiPUU1PUI3PUIyPUU0PUJGPTlEPUU1PUFEPTk4
PUU3PTlBPTg0PUU1PThFPTg2PUU1PThGPUIyIiwKKworCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9s
aXN0Lm1ha286MjEgdGVtcGxhdGVzL3Jvb3QvaGlzdG9yeS5tYWtvOjIzOQorImhpZGUgZGVsZXRl
ZCIgOgorIj1FOT05QT05MD1FOD05Nz04Rj1FNT1CNz1CMj1FNT04OD1BMD1FOT05OT1BND1FNz05
QT04ND1FNj05NT1CMD1FNj04RD1BRSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFr
bzoyMworInNob3cgZGVsZXRlZCIgOgorIj1FNj05OD1CRT1FNz1BND1CQT1FNT1CNz1CMj1FNT04
OD1BMD1FOT05OT1BND1FNz05QT04ND1FNj05NT1CMD1FNj04RD1BRSIsCisKKy8vIHRlbXBsYXRl
cy9oaXN0b3J5L2xpc3QubWFrbzoyNworIk5hbWUiIDoKKyI9RTU9OTA9OEQ9RTc9QTc9QjAiLAor
CisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286MjcKKyJTaXplIiA6CisiPUU1PUE0PUE3
PUU1PUIwPThGIiwKKworLy8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjI3CisiTGFzdCBt
b2RpZmllZCIgOgorIj1FNj05Qz04MD1FNT05MD04RT1FND1CRj1BRT1FNj05ND1COT1FNj05Nz1C
Nj1FOT05Nz1CNCIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzoyNworIkFjdGlv
bnMiIDoKKyI9RTY9OTM9OEQ9RTQ9QkQ9OUMiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0
Lm1ha286NDUKKyJyZW5hbWUiIDoKKyI9RTk9ODc9OEQ9RTU9OTE9QkQ9RTU9OTA9OEQiLAorCisv
LyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NDYKKyJzd2l0Y2ggdG8iIDoKKyI9RTU9ODg9
ODc9RTY9OEQ9QTI9RTU9ODg9QjAiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286
NDcKKyJkZWxldGUiIDoKKyI9RTU9ODg9QTA9RTk9OTk9QTQiLAorCisvLyB0ZW1wbGF0ZXMvaGlz
dG9yeS9saXN0Lm1ha286NDkKKyJ1bmRlbGV0ZSIgOgorIj1FOD1CRj05OD1FNT04RT05RiIsCisK
Ky8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzo1NQorIkFjdGlvbiIgOgorIj1FNj05Mz04
RD1FND1CRD05QyIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzo1NiB0ZW1wbGF0
ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MjEKKyJTaGFyZSIgOgorIj1FNT04NT1CMT1FND1CQT1B
QiIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L2xpc3QubWFrbzo1NiB0ZW1wbGF0ZXMvaGlzdG9y
eS9vcHRpb25zLm1ha286MTUKKyJSZW5hbWUiIDoKKyI9RTk9ODc9OEQ9RTU9OTE9QkQ9RTU9OTA9
OEQiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NTYgdGVtcGxhdGVzL2hpc3Rv
cnkvb3B0aW9ucy5tYWtvOjI0CisiRGVsZXRlIiA6CisiPUU1PTg4PUEwPUU5PTk5PUE0IiwKKwor
Ly8gdGVtcGxhdGVzL2hpc3RvcnkvbGlzdC5tYWtvOjU4CisiVW5kZWxldGUiIDoKKyI9RTg9QkY9
OTg9RTU9OEU9OUYiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9saXN0Lm1ha286NjUKKyJZb3Ug
aGF2ZSBubyBzdG9yZWQgaGlzdG9yaWVzIiA6CisiPUU2PUIyPUExPUU2PTlDPTg5PUU1PUFEPTk4
PUU1PTgyPUE4PUU3PTlBPTg0PUU1PThFPTg2PUU1PThGPUIyPUU4PUFFPUIwPQo9RTU9QkQ9OTUi
LAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286NQorIkhpc3RvcnkgT3B0aW9u
cyIgOgorIj1FNT04RT04Nj1FNT04Rj1CMj1FOD1BRT1CMD1FNT1CRD05NT1FOT04MD04OT1FOT1B
MT1COSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzo5CisiWW91IG11c3Qg
YmUgIiA6CisiPUU0PUJEPUEwPUU1PUJGPTg1PUU5PUExPUJCPUU2PTg4PTkwPUU0PUI4PUJBIiwK
KworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtvOjkKKyJsb2dnZWQgaW4iIDoKKyI9
RTc9OTk9QkI9RTU9QkQ9OTUiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286
OQorIiB0byBzdG9yZSBvciBzd2l0Y2ggaGlzdG9yaWVzLiIgOgorIj1FND1CQj1BNT1FNT1BRD05
OD1FNT04Mj1BOD1FNj04OD05Nj1FNT04OD04Nz1FNj04RD1BMj1FNT04RT04Nj1FNT04Rj1CMj0K
PUU4PUFFPUIwPUU1PUJEPTk1IiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtv
OjE1CisvLyBweXRob24tZm9ybWF0CisiIGN1cnJlbnQgaGlzdG9yeSAoc3RvcmVkIGFzIFwiJXNc
IikiIDoKKyIgPUU1PUJEPTkzPUU1PTg5PThEPUU1PThFPTg2PUU1PThGPUIyPUVGPUJDPTg4PUU0
PUJCPUE1XCIlc1wiPUU1PUJEPUEyPUU1PQo9QkM9OEY9RTU9QUQ9OTg9RTU9ODI9QTg9RUY9QkM9
ODkiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MTYKKyJMaXN0IiA6Cisi
PUU1PTg4PTk3PUU4PUExPUE4IiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5tYWtv
OjE2CisiIHByZXZpb3VzbHkgc3RvcmVkIGhpc3RvcmllcyIgOgorIiA9RTQ9QkI9QTU9RTU9ODk9
OEQ9RTU9QUQ9OTg9RTU9ODI9QTg9RTc9OUE9ODQ9RTU9OEU9ODY9RTU9OEY9QjI9RTg9QUU9QjA9
Cj1FNT1CRD05NSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29wdGlvbnMubWFrbzoxOAorIkNy
ZWF0ZSIgOgorIj1FNT04OD05Qj1FNT1CQj1CQSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L29w
dGlvbnMubWFrbzoxOAorIiBhIG5ldyBlbXB0eSBoaXN0b3J5IiA6CisiID1FND1COD04MD1FND1C
OD1BQT1FNj05Nj1CMD1FNz05QT04ND1FNz1BOT1CQT1FNz05OT1CRD1FNT04RT04Nj1FNT04Rj1C
Mj0KPUU4PUFFPUIwPUU1PUJEPTk1IiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkvb3B0aW9ucy5t
YWtvOjIwCisiQ29uc3RydWN0IHdvcmtmbG93IiA6CisiPUU2PTlFPTg0PUU1PUJCPUJBPUU1PUI3
PUE1PUU0PUJEPTlDPUU2PUI1PTgxPUU3PUE4PThCIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rvcnkv
b3B0aW9ucy5tYWtvOjIwCisiIGZyb20gdGhlIGN1cnJlbnQgaGlzdG9yeSIgOgorIiA9RTY9OUQ9
QTU9RTY9QkE9OTA9RTQ9QkE9OEU9RTU9QkQ9OTM9RTU9ODk9OEQ9RTU9OEU9ODY9RTU9OEY9QjIi
LAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286MjEgdGVtcGxhdGVzL2hpc3Rv
cnkvb3B0aW9ucy5tYWtvOjI0CisiIGN1cnJlbnQgaGlzdG9yeSIgOgorIiA9RTU9QkQ9OTM9RTU9
ODk9OEQ9RTU9OEU9ODY9RTU9OEY9QjIiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25z
Lm1ha286MjMKKyJTaG93IGRlbGV0ZWQiIDoKKyI9RTY9OTg9QkU9RTc9QTQ9QkE9RTU9Qjc9QjI9
RTU9ODg9QTA9RTk9OTk9QTQiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9vcHRpb25zLm1ha286
MjMKKyIgZGF0YXNldHMgaW4gaGlzdG9yeSIgOgorIiA9RTU9OEU9ODY9RTU9OEY9QjI9RTQ9Qjg9
QUQ9RTc9OUE9ODQ9RTY9OTU9QjA9RTY9OEQ9QUU9RTk9OUI9ODYiLAorCisvLyB0ZW1wbGF0ZXMv
aGlzdG9yeS9yZW5hbWUubWFrbzozIHRlbXBsYXRlcy9oaXN0b3J5L3JlbmFtZS5tYWtvOjYKKyJS
ZW5hbWUgSGlzdG9yeSIgOgorIj1FOT04Nz04RD1FNT05MT1CRD1FNT05MD04RD1FNT04RT04Nj1F
NT04Rj1CMiIsCisKKworIlJlbmFtZSBIaXN0b3JpZXMiIDoKKyI9RTk9ODc9OEQ9RTU9OTE9QkQ9
RTU9OTA9OEQ9RTU9OEU9ODY9RTU9OEY9QjI9RTg9QUU9QjA9RTU9QkQ9OTUiLAorCisiUGVyZm9y
bSBBY3Rpb24iIDoKKyI9RTg9QkY9OTA9RTg9QTE9OEM9RTY9OTM9OEQ9RTQ9QkQ9OUMiLAorCisi
U3VibWl0IiA6CisiPUU2PThGPTkwPUU0PUJBPUE0IiwKKworCisKKy8vIHRlbXBsYXRlcy9oaXN0
b3J5L3JlbmFtZS5tYWtvOjEwCisiQ3VycmVudCBOYW1lIiA6CisiPUU1PUJEPTkzPUU1PTg5PThE
PUU1PTkwPThEPUU3PUE3PUIwIiwKKworLy8gdGVtcGxhdGVzL2hpc3RvcnkvcmVuYW1lLm1ha286
MTAKKyJOZXcgTmFtZSIgOgorIj1FNj05Nj1CMD1FNT05MD04RD1FNz1BNz1CMCIsCisKKy8vIHRl
bXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1ha286MworIlNoYXJlIGhpc3RvcmllcyIgOgorIj1FNT04
NT1CMT1FND1CQT1BQj1FNT04RT04Nj1FNT04Rj1CMj1FOD1BRT1CMD1FNT1CRD05NSIsCisKKy8v
IHRlbXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1ha286NgorIlNoYXJlIEhpc3RvcmllcyIgOgorIj1F
NT04NT1CMT1FND1CQT1BQj1FNT04RT04Nj1FNT04Rj1CMj1FOD1BRT1CMD1FNT1CRD05NSIsCisK
Ky8vIHRlbXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1ha286OQorIkhpc3RvcnkgTmFtZToiIDoKKyI9
RTU9OEU9ODY9RTU9OEY9QjI9RTU9OTA9OEQ9RTc9QTc9QjAiLAorCisvLyB0ZW1wbGF0ZXMvaGlz
dG9yeS9zaGFyZS5tYWtvOjkKKyJOdW1iZXIgb2YgRGF0YXNldHM6IiA6CisiPUU2PTk1PUIwPUU2
PThEPUFFPUU5PTlCPTg2PUU2PTk1PUIwPUU5PTg3PThGIiwKKworLy8gdGVtcGxhdGVzL2hpc3Rv
cnkvc2hhcmUubWFrbzo5CisiU2hhcmUgTGluayIgOgorIj1FNT04NT1CMT1FND1CQT1BQj1FOT05
Mz1CRT1FNj04RT1BNSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1ha286MTUKKyJU
aGlzIGhpc3RvcnkgY29udGFpbnMgbm8gZGF0YS4iIDoKKyI9RTg9QkY9OTk9RTk9QTE9Qjk9RTU9
OEU9ODY9RTU9OEY9QjI9RTQ9Qjg9QUQ9RTY9QjI9QTE9RTY9OUM9ODk9RTY9OTU9QjA9Cj1FNj04
RD1BRSIsCisKKy8vIHRlbXBsYXRlcy9oaXN0b3J5L3NoYXJlLm1ha286MjEKKyJjb3B5IGxpbmsg
dG8gc2hhcmUiIDoKKyI9RTU9QTQ9OEQ9RTU9ODg9QjY9RTk9OTM9QkU9RTY9OEU9QTU9RTQ9QkI9
QTU9RTU9ODU9QjE9RTQ9QkE9QUIiLAorCisvLyB0ZW1wbGF0ZXMvaGlzdG9yeS9zaGFyZS5tYWtv
OjI0CisiRW1haWwgb2YgVXNlciB0byBzaGFyZSB3aXRoOiIgOgorIj1FNT04Rj05MT1FOT04MD04
MT1FNT04OD1CMD1FOD1CRj05OT1FND1CQT05QkVtYWlsPUU1PTlDPUIwPUU1PTlEPTgwPUU4PQo9
QkY9OUI9RTg9QTE9OEM9RTU9ODg9ODY9RTQ9QkE9QUIiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9o
aXN0b3J5Lm1ha286NworIkdhbGF4eSBIaXN0b3J5IiA6CisiR2FsYXh5ID1FNT04RT04Nj1FNT04
Rj1CMiIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnkubWFrbzoyMzcKKyJyZWZyZXNoIiA6
CisiPUU1PTg4PUI3PUU2PTk2PUIwIiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvaGlzdG9yeS5tYWtv
OjI0NQorIllvdSBhcmUgY3VycmVudGx5IHZpZXdpbmcgYSBkZWxldGVkIGhpc3RvcnkhIiA6Cisi
PUU2PUFEPUEzPUU1PTlDPUE4PUU2PTlGPUE1PUU3PTlDPThCPUU1PUI3PUIyPUU1PTg4PUEwPUU5
PTk5PUE0PUU3PTlBPTg0PQo9RTU9OEU9ODY9RTU9OEY9QjIiLAorCisvLyB0ZW1wbGF0ZXMvcm9v
dC9oaXN0b3J5Lm1ha286Mjg5CisiWW91ciBoaXN0b3J5IGlzIGVtcHR5LiBDbGljayAnR2V0IERh
dGEnIG9uIHRoZSBsZWZ0IHBhbmUgdG8gc3RhcnQiIDoKKyI9RTU9OEU9ODY9RTU9OEY9QjI9RTU9
Qjc9QjI9RTc9QTk9QkE9RUY9QkM9OEM9RTg9QUY9Qjc9RTU9OEQ9OTU9RTU9ODc9QkI9Cj1FNT1C
Nz1BNj1FOD1CRT1COT1FNz1BQT05Nz1FNj1BMD1CQz1FND1COD1BRD1FMj04MD05OD1FOD04RT1C
Nz1FNT04Rj05Nj1FNj0KPTk1PUIwPUU2PThEPUFFPUUyPTgwPTk5IiwKKworLy8gdGVtcGxhdGVz
L3Jvb3QvaGlzdG9yeV9jb21tb24ubWFrbzo0MQorIkpvYiBpcyB3YWl0aW5nIHRvIHJ1biIgOgor
Ij1FNz1BRD04OT1FNT1CRT04NT1FOD1CRj05MD1FOD1BMT04Qz1FNz05QT04ND1FOD1CRj05Qj1F
Nz1BOD04QiIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286NDMKKyJK
b2IgaXMgY3VycmVudGx5IHJ1bm5pbmciIDoKKyI9RTY9QUQ9QTM9RTU9OUM9QTg9RTg9QkY9OTA9
RTg9QTE9OEM9RTc9OUE9ODQ9RTg9QkY9OUI9RTc9QTg9OEIiLAorCisvLyB0ZW1wbGF0ZXMvcm9v
dC9oaXN0b3J5X2NvbW1vbi5tYWtvOjQ2CisiQW4gZXJyb3Igb2NjdXJyZWQgcnVubmluZyB0aGlz
IGpvYjogIiA6CisiPUU4PUJGPTlCPUU3PUE4PThCPUU4PUJGPTkwPUU4PUExPThDPUU2PTk3PUI2
PUU1PTg3PUJBPUU5PTk0PTk5ICIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9u
Lm1ha286NDcKKyJyZXBvcnQgdGhpcyBlcnJvciIgOgorIj1FNj04QT1BNT1FNT05MT04QT1FOT05
ND05OT1FOD1BRj1BRiIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286
NTQKKyJObyBkYXRhOiAiIDoKKyI9RTY9QjI9QTE9RTY9OUM9ODk9RTY9OTU9QjA9RTY9OEQ9QUU9
RUY9QkM9OUEgIiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvaGlzdG9yeV9jb21tb24ubWFrbzo1OAor
ImZvcm1hdDogIiA6CisiPUU2PUEwPUJDPUU1PUJDPThGPUVGPUJDPTlBICIsCisKKy8vIHRlbXBs
YXRlcy9yb290L2hpc3RvcnlfY29tbW9uLm1ha286NTkKKyJkYXRhYmFzZTogIiA6CisiPUU2PTk1
PUIwPUU2PThEPUFFPUU1PUJBPTkzPUVGPUJDPTlBICIsCisKKy8vIHRlbXBsYXRlcy9yb290L2hp
c3RvcnlfY29tbW9uLm1ha286NjYgdGVtcGxhdGVzL3Jvb3QvbWFzdGhlYWQubWFrbzoyMAorIklu
Zm86ICIgOgorIj1FND1CRj1BMT1FNj04MT1BRj1FRj1CQz05QSAiLAorCisvLyB0ZW1wbGF0ZXMv
cm9vdC9oaXN0b3J5X2NvbW1vbi5tYWtvOjg1CisvLyBweXRob24tZm9ybWF0CisiRXJyb3I6IHVu
a25vd24gZGF0YXNldCBzdGF0ZSBcIiVzXCIuIiA6CisiPUU5PTk0PTk5PUU4PUFGPUFGPUVGPUJD
PTlBPUU2PTlDPUFBPUU3PTlGPUE1PUU3PTlBPTg0PUU2PTk1PUIwPUU2PThEPUFFPQo9RTk9OUI9
ODY9RTc9OEE9QjY9RTY9ODA9ODEgXCIlc1wiPUUzPTgwPTgyIiwKKworCisiT3B0aW9ucyIgOgor
Ij1FOT04MD04OT1FOT1BMT1COSIsCisKKyJIaXN0b3J5IiA6CisiPUU1PThFPTg2PUU1PThGPUIy
IiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvbWFzdGhlYWQubWFrbzoyMAorInJlcG9ydCBidWdzIiA6
CisiPUU5PTk0PTk5PUU4PUFGPUFGPUU2PThBPUE1PUU1PTkxPThBIiwKKworLy8gdGVtcGxhdGVz
L3Jvb3QvbWFzdGhlYWQubWFrbzoyMQorIndpa2kiIDoKKyJ3aWtpIiwKKworLy8gdGVtcGxhdGVz
L3Jvb3QvbWFzdGhlYWQubWFrbzoyMgorInNjcmVlbmNhc3RzIiA6CisiPUU2PUJDPTk0PUU3PUE0
PUJBPUU4PUE3PTg2PUU5PUEyPTkxIiwKKworCisvLyB0ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5t
YWtvOjIzCisiYmxvZyIgOgorIj1FNT04RD05QT1FNT1BRT1BMiIsCisKKy8vIHRlbXBsYXRlcy9y
b290L21hc3RoZWFkLm1ha286MzEKKy8vIHB5dGhvbi1mb3JtYXQKKyJMb2dnZWQgaW4gYXMgJXM6
ICIgOgorIj1FND1CQj1BNSVzPUU3PTlBPTg0PUU4PUJBPUFCPUU0PUJCPUJEPUU3PTk5PUJCPUU1
PUJEPTk1OiAiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtvOjMxCisibWFuYWdl
IiA6CisiPUU3PUFFPUExPUU3PTkwPTg2IiwKKworLy8gdGVtcGxhdGVzL3Jvb3QvbWFzdGhlYWQu
bWFrbzozMgorImxvZ291dCIgOgorIj1FNj1CMz1BOD1FOT05ND04MCIsCisKKy8vIHRlbXBsYXRl
cy9yb290L21hc3RoZWFkLm1ha286MzQKKyJBY2NvdW50OiAiIDoKKyI9RTU9Qjg9OTA9RTY9ODg9
Qjc6ICIsCisKKy8vIHRlbXBsYXRlcy9yb290L21hc3RoZWFkLm1ha286MzQKKyJjcmVhdGUiIDoK
KyI9RTU9ODg9OUI9RTU9QkI9QkEiLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC9tYXN0aGVhZC5tYWtv
OjM1CisibG9naW4iIDoKKyI9RTc9OTk9QkI9RTU9QkQ9OTUiLAorCisvLyB0ZW1wbGF0ZXMvcm9v
dC90b29sX21lbnUubWFrbzo1MgorIkdhbGF4eSBUb29scyIgOgorIkdhbGF4eSA9RTU9Qjc9QTU9
RTU9ODU9QjciLAorCisvLyB0ZW1wbGF0ZXMvcm9vdC90b29sX21lbnUubWFrbzoxMjkKKyJXb3Jr
ZmxvdyIgOgorIj1FNT1CNz1BNT1FND1CRD05Qz1FNj1CNT04MT1FNz1BOD04QiIsCisKKy8vIHRl
bXBsYXRlcy9yb290L3Rvb2xfbWVudS5tYWtvOjEzNAorIk1hbmFnZSIgOgorIj1FNz1BRT1BMT1F
Nz05MD04NiIsCisKKy8vIHRlbXBsYXRlcy9yb290L3Rvb2xfbWVudS5tYWtvOjEzNAorIndvcmtm
bG93cyIgOgorIj1FNT1CNz1BNT1FND1CRD05Qz1FNj1CNT04MT1FNz1BOD04QiIsCisKKy8vIHRl
bXBsYXRlcy91c2VyL2luZGV4Lm1ha286MiB0ZW1wbGF0ZXMvdXNlci9pbmRleC5tYWtvOjQKKyJB
Y2NvdW50IHNldHRpbmdzIiA6CisiPUU1PUI4PTkwPUU2PTg4PUI3PUU4PUFFPUJFPUU3PUJEPUFF
IiwKKworLy8gdGVtcGxhdGVzL3VzZXIvaW5kZXgubWFrbzo3CisvLyBweXRob24tZm9ybWF0Cisi
WW91IGFyZSBjdXJyZW50bHkgbG9nZ2VkIGluIGFzICVzLiIgOgorIj1FNT1CRD05Mz1FNT04OT04
RD1FND1CQj1BNSVzPUU3PTlBPTg0PUU4PUJBPUFCPUU0PUJCPUJEPUU3PTk5PUJCPUU1PUJEPQo9
OTUiLAorCisvLyB0ZW1wbGF0ZXMvdXNlci9pbmRleC5tYWtvOjkKKyJDaGFuZ2UgeW91ciBwYXNz
d29yZCIgOgorIj1FND1CRj1BRT1FNj05ND1COT1FNT1BRj04Nj1FNz1BMD04MSIsCisKKy8vIHRl
bXBsYXRlcy91c2VyL2luZGV4Lm1ha286MTAKKyJVcGRhdGUgeW91ciBlbWFpbCBhZGRyZXNzIiA6
CisiPUU2PTlCPUI0PUU2PTk2PUIwPUU3PTk0PUI1PUU1PUFEPTkwPUU5PTgyPUFFPUU0PUJCPUI2
PUU1PTlDPUIwPUU1PTlEPTgwIiwKKworLy8gdGVtcGxhdGVzL3VzZXIvaW5kZXgubWFrbzoxMQor
IkxvZ291dCIgOgorIj1FNj1CMz1BOD1FOT05ND04MCIsCisKKy8vIHRlbXBsYXRlcy91c2VyL2lu
ZGV4Lm1ha286MTYKKyJMb2dpbiIgOgorIj1FNz05OT1CQj1FNT1CRD05NSIsCisKKy8vIHRlbXBs
YXRlcy91c2VyL2luZGV4Lm1ha286MTcKKyJDcmVhdGUgbmV3IGFjY291bnQiIDoKKyI9RTU9ODg9
OUI9RTU9QkI9QkE9RTY9OTY9QjA9RTU9Qjg9OTA9RTY9ODg9QjciLAorCisiU2hvdyBUb29sIFNl
YXJjaCIgOgorIj1FNj05OD1CRT1FNz1BND1CQT1FNT1CNz1BNT1FNT04NT1CNz1FNj05MD05Qz1F
Nz1CND1BMiIsCisKKyJBbmFseXplIERhdGEiIDoKKyI9RTU9ODg9ODY9RTY9OUU9OTA9RTY9OTU9
QjA9RTY9OEQ9QUUiLAorCisiYW5hbHlzaXMiIDoKKyI9RTU9ODg9ODY9RTY9OUU9OTAiLAorCisi
SGlzdG9yeSBMaXN0cyIgOgorIj1FNT04RT04Nj1FNT04Rj1CMj1FOD1BRT1CMD1FNT1CRD05NT1F
Nj1COD04NT1FNT04RD05NSIsCisKKyJIaXN0b3JpZXMgU2hhcmVkIHdpdGggTWUiIDoKKyI9RTU9
ODU9QjE9RTQ9QkE9QUI9RTc9OUE9ODQ9RTY9OTU9QjA9RTY9OEQ9QUUiLAorCisiQ3VycmVudCBI
aXN0b3J5IiA6CisiPUU1PUJEPTkzPUU1PTg5PThEPUU1PThFPTg2PUU1PThGPUIyPUU4PUFFPUIw
PUU1PUJEPTk1IiwKKworIkNyZWF0ZSBOZXciIDoKKyI9RTU9ODg9OUI9RTU9QkI9QkEiLAorCisi
Q2xvbmUiIDoKKyI9RTU9QTQ9OEQ9RTU9ODg9QjYiLAorCisiU2hhcmUgb3IgUHVibGlzaCIgOgor
Ij1FNT04NT1CMT1FND1CQT1BQj1FNj04OD05Nj1FNT04Rj05MT1FNT1COD04MyIsCisKKyJFeHRy
YWN0IFdvcmtmbG93IiA6CisiPUU2PThGPTkwPUU1PThGPTk2PUU1PUI3PUE1PUU0PUJEPTlDPUU2
PUI1PTgxPUU3PUE4PThCIiwKKworIkRhdGFzZXQgU2VjdXJpdHkiIDoKKyI9RTY9OTU9QjA9RTY9
OEQ9QUU9RTU9QUU9ODk9RTU9ODU9QTg9RTY9ODA9QTciLAorCisKKyJTaG93IERlbGV0ZWQgRGF0
YXNldHMiIDoKKyI9RTY9OTg9QkU9RTc9QTQ9QkE9RTU9Qjc9QjI9RTU9ODg9QTA9RTk9OTk9QTQ9
RTc9OUE9ODQ9RTY9OTU9QjA9RTY9OEQ9QUUiLAorCisiU2hvdyBIaWRkZW4gRGF0YXNldHMiIDoK
KyI9RTY9OTg9QkU9RTc9QTQ9QkE9RTk9OUE9OTA9RTg9OTc9OEY9RTc9OUE9ODQ9RTY9OTU9QjA9
RTY9OEQ9QUUiLAorCisiU2hvdyBTdHJ1Y3R1cmUiIDoKKyI9RTY9OTg9QkU9RTc9QTQ9QkE9RTc9
QkI9OTM9RTY9OUU9ODQiLAorCisiRXhwb3J0IHRvIEZpbGUiIDoKKyI9RTU9QUY9QkM9RTU9ODc9
QkE9RTQ9Qjg9QkE9RTY9OTY9ODc9RTQ9QkI9QjYiLAorCisiT3RoZXIgQWN0aW9ucyIgOgorIj1F
NT04NT1CNj1FND1CQj05NiIsCisKKyJJbXBvcnQgZnJvbSBGaWxlIiA6CisiPUU1PUFGPUJDPUU1
PTg1PUE1PUU2PTk2PTg3PUU0PUJCPUI2IiwKKworIlNoYXJlZCBEYXRhIiA6CisiPUU2PTk1PUIw
PUU2PThEPUFFPUU1PTg1PUIxPUU0PUJBPUFCIiwKKworIkRhdGEgTGlicmFyaWVzIiA6CisiPUU2
PTk1PUIwPUU2PThEPUFFPUU0PUJCPTkzPUU1PUJBPTkzIiwKKworIlB1Ymxpc2hlZCBIaXN0b3Jp
ZXMiIDoKKyI9RTU9Qjc9QjI9RTU9OEY9OTE9RTU9Qjg9ODM9RTc9OUE9ODQ9RTU9OEU9ODY9RTU9
OEY9QjI9RTg9QUU9QjA9RTU9QkQ9OTUiLAorCisiUHVibGlzaGVkIFdvcmtmbG93cyIgOgorIj1F
NT1CNz1CMj1FNT04Rj05MT1FNT1COD04Mz1FNz05QT04ND1FNT1CNz1BNT1FND1CRD05Qz1FNj1C
NT04MT1FNz1BOD04QiIsCisKKyJQdWJsaXNoZWQgUGFnZXMiIDoKKyI9RTU9Qjc9QjI9RTU9OEY9
OTE9RTU9Qjg9ODM9RTc9OUE9ODQ9RTk9QTE9QjU9RTk9OUQ9QTIiLAorCisiSGVscCIgOgorIj1F
NT1COD1BRT1FNT04QT1BOSIsCisKKyJFbWFpbCBjb21tZW50cywgYnVnIHJlcG9ydHMsIG9yIHN1
Z2dlc3Rpb25zIiA6CisiPUU1PThGPTkxPUU5PTgyPUFFPUU0PUJCPUI2PUU4PUJGPTlCPUU4PUEx
PThDPUU2PTg0PThGPUU4PUE3PTgxPUU1PThGPThEPQo9RTk9QTY9ODg9RTY9ODg9OTY9RTk9OTQ9
OTk9RTg9QUY9QUY9RTY9OEE9QTU9RTU9OTE9OEEiLAorCisKKyJVc2VyIiA6CisiPUU3PTk0PUE4
PUU2PTg4PUI3IiwKKworCisiUmVnaXN0ZXIiIDoKKyI9RTY9QjM9QTg9RTU9ODY9OEMiLAorCisi
U3VwcG9ydCIgOgorIj1FNj04QT04MD1FNj05Qz1BRj1FNj05ND1BRj1FNj04Qz04MSIsCisKKyJH
YWxheHkgV2lraSIgOgorIkdhbGF4eT1FNz05OT1CRT1FNz1BNz05MSIsCisKKyJWaWRlbyB0dXRv
cmlhbHMgKHNjcmVlbmNhc3RzKSIgOgorIj1FOD1BNz04Nj1FOT1BMj05MT1FNj05NT05OT1FNz1B
OD04Qj1FRj1CQz04OD1FNT04QT1BOD1FNz05ND1CQj1FNj1CQz05ND0KPUU3PUE0PUJBPUVGPUJD
PTg5IiwKKworIkhvdyB0byBDaXRlIEdhbGF4eSIgOgorIj1FNT1BNj04Mj1FND1CRD05NT1FNT1C
Qz05NT1FNz05ND1BOEdhbGF4eSIsCit9KQoKZGlmZiAtciA4MzQ2ZWM0YmFhMzk5MmY0ZGMwMTYx
ZjBmYzc5YTBiYTg5M2MwYTYzIC1yIGRjYzBjMTkxNDdlYWQ4NmM2ZTM1N2M3PQozOWUwNTEzYWRk
ZmUwMmNiMiBzdGF0aWMvc2NyaXB0cy9wYWNrZWQvZ2FsYXh5LWFwcC1iYXNlLmpzCi0tLSBhL3N0
YXRpYy9zY3JpcHRzL3BhY2tlZC9nYWxheHktYXBwLWJhc2UuanMKKysrIGIvc3RhdGljL3Njcmlw
dHMvcGFja2VkL2dhbGF4eS1hcHAtYmFzZS5qcwpAQCAtMSwxICsxLDEgQEAKLWRlZmluZShbIm12
Yy91c2VyL3VzZXItbW9kZWwiLCJ1dGlscy9tZXRyaWNzLWxvZ2dlciIsInV0aWxzL2FkZC1sb2dn
aW5nIl0sPQpmdW5jdGlvbihhLGMsZSl7ZnVuY3Rpb24gZihrKXt2YXIgaj0zRHRoaXM7cmV0dXJu
IGouX2luaXQoa3x8e30pfWUoZiwiR2FsYXg9CnlBcHAiKTtmLmRlZmF1bHRPcHRpb25zPTNEe3Jv
b3Q6Ii8ifTtmLnByb3RvdHlwZS5faW5pdD0zRGZ1bmN0aW9uIGgoayl7dmFyID0Kaj0zRHRoaXM7
ai5faW5pdExvZ2dlcihrLmxvZ2dlck9wdGlvbnN8fHt9KTtqLmRlYnVnKCJHYWxheHlBcHAubG9n
Z2VyOiAiLGouPQpsb2dnZXIpO2ouX3Byb2Nlc3NPcHRpb25zKGspO2ouZGVidWcoIkdhbGF4eUFw
cC5vcHRpb25zOiAiLGoub3B0aW9ucyk7ai5jb249CmZpZz0zRGsuY29uZmlnfHx7fTtqLmRlYnVn
KCJHYWxheHlBcHAuY29uZmlnOiAiLGouY29uZmlnKTtqLl9pbml0VXNlcihrLnVzZT0KckpTT058
fHt9KTtqLmRlYnVnKCJHYWxheHlBcHAudXNlcjogIixqLnVzZXIpO3JldHVybiBqfTtmLnByb3Rv
dHlwZS5fcHJvY2VzPQpzT3B0aW9ucz0zRGZ1bmN0aW9uIGQobSl7dmFyIGw9M0R0aGlzLG49M0Rm
LmRlZmF1bHRPcHRpb25zO2wuZGVidWcoIl9wcm9jZXM9CnNPcHRpb25zOiAiLG0pO2wub3B0aW9u
cz0zRHt9O2Zvcih2YXIgaiBpbiBuKXtpZihuLmhhc093blByb3BlcnR5KGopKXtsLm9wdD0KaW9u
c1tqXT0zRChtLmhhc093blByb3BlcnR5KGopKT8obVtqXSk6KG5bal0pfX1yZXR1cm4gbH07Zi5w
cm90b3R5cGUuX2luaXRVPQpzZXI9M0RmdW5jdGlvbiBnKGspe3ZhciBqPTNEdGhpcztqLmRlYnVn
KCJfaW5pdFVzZXI6IixrKTtqLnVzZXI9M0RuZXcgYS5Vc2U9CnIoayk7cmV0dXJuIGp9O2YucHJv
dG90eXBlLl9pbml0TG9nZ2VyPTNEZnVuY3Rpb24gaShrKXt2YXIgaj0zRHRoaXM7ai5kZWJ1Zz0K
KCJfaW5pdExvZ2dlcjoiLGspO2oubG9nZ2VyPTNEbmV3IGMuTWV0cmljc0xvZ2dlcihrKTtyZXR1
cm4gan07Zi5wcm90b3R5cGUuPQp0b1N0cmluZz0zRGZ1bmN0aW9uIGIoKXt2YXIgaj0zRHRoaXMu
dXNlci5nZXQoImVtYWlsIil8fCIoYW5vbnltb3VzKSI7cmV0dXI9Cm4iR2FsYXh5QXBwKCIraisi
KSJ9O3JldHVybntHYWxheHlBcHA6Zn19KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitk
ZWZpbmUoWyJtdmMvdXNlci91c2VyLW1vZGVsIiwidXRpbHMvbWV0cmljcy1sb2dnZXIiLCJ1dGls
cy9hZGQtbG9nZ2luZyIsIj0KdXRpbHMvbG9jYWxpemF0aW9uIl0sZnVuY3Rpb24oYSxjLGYsZCl7
ZnVuY3Rpb24gZyhtKXt2YXIgbD0zRHRoaXM7cmV0dXJuIGwuPQpfaW5pdChtfHx7fSl9ZihnLCJH
YWxheHlBcHAiKTtnLmRlZmF1bHRPcHRpb25zPTNEe3Jvb3Q6Ii8ifTtnLnByb3RvdHlwZS5faW49
Cml0PTNEZnVuY3Rpb24gaihtKXt2YXIgbD0zRHRoaXM7bC5fcHJvY2Vzc09wdGlvbnMobSk7bC5k
ZWJ1ZygiR2FsYXh5QXBwLm9wdD0KaW9uczogIixsLm9wdGlvbnMpO2wuX2luaXRMb2dnZXIobS5s
b2dnZXJPcHRpb25zfHx7fSk7bC5kZWJ1ZygiR2FsYXh5QXBwLmxvPQpnZ2VyOiAiLGwubG9nZ2Vy
KTtsLl9pbml0TG9jYWxlKCk7bC5kZWJ1ZygiR2FsYXh5QXBwLmxvY2FsaXplOiAiLGwubG9jYWxp
emU9Cik7bC5jb25maWc9M0RtLmNvbmZpZ3x8e307bC5kZWJ1ZygiR2FsYXh5QXBwLmNvbmZpZzog
IixsLmNvbmZpZyk7bC5faW5pdFVzZT0KcihtLnVzZXJKU09OfHx7fSk7bC5kZWJ1ZygiR2FsYXh5
QXBwLnVzZXI6ICIsbC51c2VyKTtyZXR1cm4gbH07Zy5wcm90b3R5cGUuPQpfcHJvY2Vzc09wdGlv
bnM9M0RmdW5jdGlvbiBlKG4pe3ZhciBtPTNEdGhpcyxvPTNEZy5kZWZhdWx0T3B0aW9uczttLmRl
YnVnKCI9Cl9wcm9jZXNzT3B0aW9uczogIixuKTttLm9wdGlvbnM9M0R7fTtmb3IodmFyIGwgaW4g
byl7aWYoby5oYXNPd25Qcm9wZXJ0eShsKT0KKXttLm9wdGlvbnNbbF09M0Qobi5oYXNPd25Qcm9w
ZXJ0eShsKSk/KG5bbF0pOihvW2xdKX19cmV0dXJuIG19O2cucHJvdG90eXBlPQouX2luaXRVc2Vy
PTNEZnVuY3Rpb24gaShtKXt2YXIgbD0zRHRoaXM7bC5kZWJ1ZygiX2luaXRVc2VyOiIsbSk7bC51
c2VyPTNEbmU9CncgYS5Vc2VyKG0pO3JldHVybiBsfTtnLnByb3RvdHlwZS5faW5pdExvZ2dlcj0z
RGZ1bmN0aW9uIGsobSl7dmFyIGw9M0R0aGlzOz0KbC5kZWJ1ZygiX2luaXRMb2dnZXI6IixtKTts
LmxvZ2dlcj0zRG5ldyBjLk1ldHJpY3NMb2dnZXIobSk7cmV0dXJuIGx9O2cucHJvPQp0b3R5cGUu
X2luaXRMb2NhbGU9M0RmdW5jdGlvbiBoKG0pe3ZhciBsPTNEdGhpcztsLmRlYnVnKCJfaW5pdExv
Y2FsZToiLG0pO2w9Ci5sb2NhbGl6ZT0zRGQ7d2luZG93Ll9sPTNEbC5sb2NhbGl6ZTtyZXR1cm4g
bH07Zy5wcm90b3R5cGUudG9TdHJpbmc9M0RmdW5jdD0KaW9uIGIoKXt2YXIgbD0zRHRoaXMudXNl
ci5nZXQoImVtYWlsIil8fCIoYW5vbnltb3VzKSI7cmV0dXJuIkdhbGF4eUFwcCgiK2wrPQoiKSJ9
O3JldHVybntHYWxheHlBcHA6Z319KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCgpkaWZm
IC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0
N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL3BhY2tlZC9p
MThuLmpzCi0tLSAvZGV2L251bGwKKysrIGIvc3RhdGljL3NjcmlwdHMvcGFja2VkL2kxOG4uanMK
QEAgLTAsMCArMSwxIEBACisoZnVuY3Rpb24oKXt2YXIgYT0zRC8oXi4qKF58XC8pbmxzKFwvfCQp
KShbXlwvXSopXC8/KFteXC9dKikvO2Z1bmN0aW9uIGQoZT0KLGgsZyxmLGksail7aWYoaFtlXSl7
Zy5wdXNoKGUpO2lmKGhbZV09M0Q9M0Q9M0R0cnVlfHxoW2VdPTNEPTNEPTNEMSl7Zi5wdXNoPQoo
aStlKyIvIitqKX19fWZ1bmN0aW9uIGMoZyxlLGYsaCxpKXt2YXIgaj0zRGgrZSsiLyIraTtpZihy
ZXF1aXJlLl9maWxlRXhpc3Q9CnMoZy50b1VybChqKyIuanMiKSkpe2YucHVzaChqKX19ZnVuY3Rp
b24gYihnLGYsZSl7dmFyIGg7Zm9yKGggaW4gZil7aWYoZi5oYT0Kc093blByb3BlcnR5KGgpJiYo
IWcuaGFzT3duUHJvcGVydHkoaCl8fGUpKXtnW2hdPTNEZltoXX1lbHNle2lmKHR5cGVvZiBmW2hd
PQo9M0Q9M0Q9M0Qib2JqZWN0Iil7aWYoIWdbaF0mJmZbaF0pe2dbaF09M0R7fX1iKGdbaF0sZlto
XSxlKX19fX1kZWZpbmUoWyJtb2Q9CnVsZSJdLGZ1bmN0aW9uKGUpe3ZhciBmPTNEZS5jb25maWc/
ZS5jb25maWcoKTp7fTtyZXR1cm57dmVyc2lvbjoiMi4wLjQiLGxvYT0KZDpmdW5jdGlvbihnLHMs
cixrKXtrPTNEa3x8e307aWYoay5sb2NhbGUpe2YubG9jYWxlPTNEay5sb2NhbGV9dmFyIHEsbj0z
RGEuPQpleGVjKGcpLG89M0RuWzFdLHQ9M0RuWzRdLHY9M0RuWzVdLGw9M0R0LnNwbGl0KCItIiks
aD0zRFtdLHU9M0R7fSxtLGoscD0zRCI9CiI7aWYobls1XSl7bz0zRG5bMV07cT0zRG8rdn1lbHNl
e3E9M0RnO3Y9M0RuWzRdO3Q9M0RmLmxvY2FsZTtpZighdCl7dD0zRGYubD0Kb2NhbGU9M0R0eXBl
b2YgbmF2aWdhdG9yPTNEPTNEPTNEInVuZGVmaW5lZCI/InJvb3QiOihuYXZpZ2F0b3IubGFuZ3Vh
Z2V8fG5hPQp2aWdhdG9yLnVzZXJMYW5ndWFnZXx8InJvb3QiKS50b0xvd2VyQ2FzZSgpfWw9M0R0
LnNwbGl0KCItIil9aWYoay5pc0J1aWxkKXs9CmgucHVzaChxKTtjKHMsInJvb3QiLGgsbyx2KTtm
b3IobT0zRDA7bTxsLmxlbmd0aDttKyspe2o9M0RsW21dO3ArPTNEKHA/Ii0iOj0KIiIpK2o7Yyhz
LHAsaCxvLHYpfXMoaCxmdW5jdGlvbigpe3IoKX0pfWVsc2V7cyhbcV0sZnVuY3Rpb24oeCl7dmFy
IHc9M0RbXSxpPQo7ZCgicm9vdCIseCx3LGgsbyx2KTtmb3IobT0zRDA7bTxsLmxlbmd0aDttKysp
e2k9M0RsW21dO3ArPTNEKHA/Ii0iOiIiKStpO2Q9CihwLHgsdyxoLG8sdil9cyhoLGZ1bmN0aW9u
KCl7dmFyIEEseSx6O2ZvcihBPTNEdy5sZW5ndGgtMTtBPi0xJiZ3W0FdO0EtLSl7ej0KPTNEd1tB
XTt5PTNEeFt6XTtpZih5PTNEPTNEPTNEdHJ1ZXx8eT0zRD0zRD0zRDEpe3k9M0RzKG8reisiLyIr
dil9Yih1LHkpfXIoPQp1KX0pfSl9fX19KX0oKSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmls
ZQoKZGlmZiAtciA4MzQ2ZWM0YmFhMzk5MmY0ZGMwMTYxZjBmYzc5YTBiYTg5M2MwYTYzIC1yIGRj
YzBjMTkxNDdlYWQ4NmM2ZTM1N2M3PQozOWUwNTEzYWRkZmUwMmNiMiBzdGF0aWMvc2NyaXB0cy9w
YWNrZWQvbXZjL2RhdGFzZXQvaGRhLWJhc2UuanMKLS0tIGEvc3RhdGljL3NjcmlwdHMvcGFja2Vk
L212Yy9kYXRhc2V0L2hkYS1iYXNlLmpzCisrKyBiL3N0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMv
ZGF0YXNldC9oZGEtYmFzZS5qcwpAQCAtMSwxICsxLDEgQEAKLWRlZmluZShbIm12Yy9kYXRhc2V0
L2hkYS1tb2RlbCIsIm12Yy9iYXNlLW12YyJdLGZ1bmN0aW9uKGQsYil7dmFyIGM9M0RCYWNrPQpi
b25lLlZpZXcuZXh0ZW5kKGIuTG9nZ2FibGVNaXhpbikuZXh0ZW5kKHt0YWdOYW1lOiJkaXYiLGNs
YXNzTmFtZToiZGF0YXNldCA9CmhkYSBoaXN0b3J5LXBhbmVsLWhkYSIsaWQ6ZnVuY3Rpb24oKXty
ZXR1cm4iaGRhLSIrdGhpcy5tb2RlbC5nZXQoImlkIil9LGZ4Uz0KcGVlZDoiZmFzdCIsaW5pdGlh
bGl6ZTpmdW5jdGlvbihmKXtpZihmLmxvZ2dlcil7dGhpcy5sb2dnZXI9M0R0aGlzLm1vZGVsLmxv
PQpnZ2VyPTNEZi5sb2dnZXJ9dGhpcy5sb2codGhpcysiLmluaXRpYWxpemU6IixmKTt0aGlzLmRl
ZmF1bHRQcmltYXJ5QWN0aW9uQnU9CnR0b25SZW5kZXJlcnM9M0RbdGhpcy5fcmVuZGVyX3Nob3dQ
YXJhbXNCdXR0b25dO3RoaXMubGlua1RhcmdldD0zRGYubGlua1Rhcj0KZ2V0fHwiX2JsYW5rIjt0
aGlzLnNlbGVjdGFibGU9M0RmLnNlbGVjdGFibGV8fGZhbHNlO3RoaXMuc2VsZWN0ZWQ9M0RmLnNl
bGVjPQp0ZWR8fGZhbHNlO3RoaXMuZXhwYW5kZWQ9M0RmLmV4cGFuZGVkfHxmYWxzZTt0aGlzLmRy
YWdnYWJsZT0zRGYuZHJhZ2dhYmxlfHw9CmZhbHNlO3RoaXMuX3NldFVwTGlzdGVuZXJzKCl9LF9z
ZXRVcExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMubW9kZWwub24oImNoYT0KbmdlIixmdW5jdGlv
bihnLGYpe2lmKHRoaXMubW9kZWwuY2hhbmdlZEF0dHJpYnV0ZXMoKS5zdGF0ZSYmdGhpcy5tb2Rl
bC5pblJlPQphZHlTdGF0ZSgpJiZ0aGlzLmV4cGFuZGVkJiYhdGhpcy5tb2RlbC5oYXNEZXRhaWxz
KCkpe3RoaXMubW9kZWwuZmV0Y2goKX1lbHM9CmV7dGhpcy5yZW5kZXIoKX19LHRoaXMpfSxyZW5k
ZXI6ZnVuY3Rpb24oaCl7aD0zRChoPTNEPTNEPTNEdW5kZWZpbmVkKT8odHJ1ZT0KKTooaCk7dmFy
IGY9M0R0aGlzO3RoaXMuJGVsLmZpbmQoIlt0aXRsZV0iKS50b29sdGlwKCJkZXN0cm95Iik7dGhp
cy51cmxzPTNEPQp0aGlzLm1vZGVsLnVybHMoKTt2YXIgZz0zRHRoaXMuX2J1aWxkTmV3UmVuZGVy
KCk7aWYoaCl7JChmKS5xdWV1ZShmdW5jdGlvbig9Cmkpe3RoaXMuJGVsLmZhZGVPdXQoZi5meFNw
ZWVkLGkpfSl9JChmKS5xdWV1ZShmdW5jdGlvbihpKXt0aGlzLiRlbC5lbXB0eSgpLj0KYXR0cigi
Y2xhc3MiLGYuY2xhc3NOYW1lKS5hZGRDbGFzcygic3RhdGUtIitmLm1vZGVsLmdldCgic3RhdGUi
KSkuYXBwZW5kKGcuPQpjaGlsZHJlbigpKTtpZih0aGlzLnNlbGVjdGFibGUpe3RoaXMuc2hvd1Nl
bGVjdG9yKDApfWkoKX0pO2lmKGgpeyQoZikucXVldWU9CihmdW5jdGlvbihpKXt0aGlzLiRlbC5m
YWRlSW4oZi5meFNwZWVkLGkpfSl9JChmKS5xdWV1ZShmdW5jdGlvbihpKXt0aGlzLnRyaT0KZ2dl
cigicmVuZGVyZWQiLGYpO2lmKHRoaXMubW9kZWwuaW5SZWFkeVN0YXRlKCkpe3RoaXMudHJpZ2dl
cigicmVuZGVyZWQ6cmVhPQpkeSIsZil9aWYodGhpcy5kcmFnZ2FibGUpe3RoaXMuZHJhZ2dhYmxl
T24oKX1pKCl9KTtyZXR1cm4gdGhpc30sX2J1aWxkTmV3UmU9Cm5kZXI6ZnVuY3Rpb24oKXt2YXIg
Zj0zRCQoYy50ZW1wbGF0ZXMuc2tlbGV0b24odGhpcy5tb2RlbC50b0pTT04oKSkpO2YuZmluZD0K
KCIuZGF0YXNldC1wcmltYXJ5LWFjdGlvbnMiKS5hcHBlbmQodGhpcy5fcmVuZGVyX3RpdGxlQnV0
dG9ucygpKTtmLmNoaWxkcmVuPQooIi5kYXRhc2V0LWJvZHkiKS5yZXBsYWNlV2l0aCh0aGlzLl9y
ZW5kZXJfYm9keSgpKTt0aGlzLl9zZXRVcEJlaGF2aW9ycyhmKTs9CnJldHVybiBmfSxfc2V0VXBC
ZWhhdmlvcnM6ZnVuY3Rpb24oZil7Zj0zRGZ8fHRoaXMuJGVsO21ha2VfcG9wdXBfbWVudXMoZik7
Zj0KLmZpbmQoIlt0aXRsZV0iKS50b29sdGlwKHtwbGFjZW1lbnQ6ImJvdHRvbSJ9KX0sX3JlbmRl
cl90aXRsZUJ1dHRvbnM6ZnVuY3RpPQpvbigpe3JldHVyblt0aGlzLl9yZW5kZXJfZGlzcGxheUJ1
dHRvbigpXX0sX3JlbmRlcl9kaXNwbGF5QnV0dG9uOmZ1bmN0aW9uKCk9CntpZigodGhpcy5tb2Rl
bC5nZXQoInN0YXRlIik9M0Q9M0Q9M0RkLkhpc3RvcnlEYXRhc2V0QXNzb2NpYXRpb24uU1RBVEVT
Lk5PVD0KX1ZJRVdBQkxFKXx8KHRoaXMubW9kZWwuZ2V0KCJzdGF0ZSIpPTNEPTNEPTNEZC5IaXN0
b3J5RGF0YXNldEFzc29jaWF0aW9uLlNUPQpBVEVTLkRJU0NBUkRFRCl8fCghdGhpcy5tb2RlbC5n
ZXQoImFjY2Vzc2libGUiKSkpe3JldHVybiBudWxsfXZhciBnPTNEe3Rhcmc9CmV0OnRoaXMubGlu
a1RhcmdldCxjbGFzc2VzOiJkYXRhc2V0LWRpc3BsYXkifTtpZih0aGlzLm1vZGVsLmdldCgicHVy
Z2VkIikpez0KZy5kaXNhYmxlZD0zRHRydWU7Zy50aXRsZT0zRF9sKCJDYW5ub3QgZGlzcGxheSBk
YXRhc2V0cyByZW1vdmVkIGZyb20gZGlzayIpPQp9ZWxzZXtpZih0aGlzLm1vZGVsLmdldCgic3Rh
dGUiKT0zRD0zRD0zRGQuSGlzdG9yeURhdGFzZXRBc3NvY2lhdGlvbi5TVEFURVM9Ci5VUExPQUQp
e2cuZGlzYWJsZWQ9M0R0cnVlO2cudGl0bGU9M0RfbCgiVGhpcyBkYXRhc2V0IG11c3QgZmluaXNo
IHVwbG9hZGluZz0KIGJlZm9yZSBpdCBjYW4gYmUgdmlld2VkIil9ZWxzZXtpZih0aGlzLm1vZGVs
LmdldCgic3RhdGUiKT0zRD0zRD0zRGQuSGlzdG9yPQp5RGF0YXNldEFzc29jaWF0aW9uLlNUQVRF
Uy5ORVcpe2cuZGlzYWJsZWQ9M0R0cnVlO2cudGl0bGU9M0RfbCgiVGhpcyBkYXRhc2U9CnQgaXMg
bm90IHlldCB2aWV3YWJsZSIpfWVsc2V7Zy50aXRsZT0zRF9sKCJWaWV3IGRhdGEiKTtnLmhyZWY9
M0R0aGlzLnVybHMuZD0KaXNwbGF5O3ZhciBmPTNEdGhpcztnLm9uY2xpY2s9M0RmdW5jdGlvbiho
KXtpZihHYWxheHkuZnJhbWUmJkdhbGF4eS5mcmFtZS5hPQpjdGl2ZSl7R2FsYXh5LmZyYW1lLmFk
ZCh7dGl0bGU6IkRhdGEgVmlld2VyOiAiK2YubW9kZWwuZ2V0KCJuYW1lIiksdHlwZToidXI9Cmwi
LGNvbnRlbnQ6Zi51cmxzLmRpc3BsYXl9KTtoLnByZXZlbnREZWZhdWx0KCl9fX19fWcuZmFJY29u
PTNEImZhLWV5ZSI7cmV0dT0Kcm4gZmFJY29uQnV0dG9uKGcpfSxfcmVuZGVyX2Rvd25sb2FkQnV0
dG9uOmZ1bmN0aW9uKCl7aWYodGhpcy5tb2RlbC5nZXQoInB1PQpyZ2VkIil8fCF0aGlzLm1vZGVs
Lmhhc0RhdGEoKSl7cmV0dXJuIG51bGx9dmFyIGc9M0R0aGlzLnVybHMsaD0zRHRoaXMubW9kZWw9
Ci5nZXQoIm1ldGFfZmlsZXMiKTtpZihfLmlzRW1wdHkoaCkpe3JldHVybiAkKFsnPGEgaHJlZj0z
RCInK2cuZG93bmxvYWQrJyIgdD0KaXRsZT0zRCInK19sKCJEb3dubG9hZCIpKyciICcsJ2NsYXNz
PTNEImljb24tYnRuIGRhdGFzZXQtZG93bmxvYWQtYnRuIj4nLCc8PQpzcGFuIGNsYXNzPTNEImZh
IGZhLWZsb3BweS1vIj48L3NwYW4+JywiPC9hPiJdLmpvaW4oIiIpKX12YXIgaT0zRCJkYXRhc2V0
LSI9Cit0aGlzLm1vZGVsLmdldCgiaWQiKSsiLXBvcHVwIixmPTNEWyc8ZGl2IHBvcHVwbWVudT0z
RCInK2krJyI+JywnPGEgaHJlZj0zRD0KIicrZy5kb3dubG9hZCsnIj4nLF9sKCJEb3dubG9hZCBE
YXRhc2V0IiksIjwvYT4iLCI8YT4iK19sKCJBZGRpdGlvbmFsIEZpbGVzPQoiKSsiPC9hPiIsXy5t
YXAoaCxmdW5jdGlvbihqKXtyZXR1cm5bJzxhIGNsYXNzPTNEImFjdGlvbi1idXR0b24iIGhyZWY9
M0QiJyw9CmcubWV0YV9kb3dubG9hZCtqLmZpbGVfdHlwZSwnIj4nLF9sKCJEb3dubG9hZCIpLCIg
IixqLmZpbGVfdHlwZSwiPC9hPiJdLmpvaT0KbigiIil9KS5qb2luKCJcbiIpLCI8L2Rpdj4iLCc8
ZGl2IGNsYXNzPTNEImljb24tYnRuLWdyb3VwIj4nLCc8YSBocmVmPTNEIicrPQpnLmRvd25sb2Fk
KyciIHRpdGxlPTNEIicrX2woIkRvd25sb2FkIikrJyIgJywnY2xhc3M9M0QiaWNvbi1idG4gZGF0
YXNldC1kb3c9Cm5sb2FkLWJ0biI+JywnPHNwYW4gY2xhc3M9M0QiZmEgZmEtZmxvcHB5LW8iPjwv
c3Bhbj4nLCc8L2E+PGEgY2xhc3M9M0QiaWNvbj0KLWJ0biBwb3B1cCIgaWQ9M0QiJytpKyciPics
JzxzcGFuIGNsYXNzPTNEImZhIGZhLWNhcmV0LWRvd24iPjwvc3Bhbj4nLCI8L2E+PQoiLCI8L2Rp
dj4iXS5qb2luKCJcbiIpO3JldHVybiAkKGYpfSxfcmVuZGVyX3Nob3dQYXJhbXNCdXR0b246ZnVu
Y3Rpb24oKXtyZXQ9CnVybiBmYUljb25CdXR0b24oe3RpdGxlOl9sKCJWaWV3IGRldGFpbHMiKSxj
bGFzc2VzOiJkYXRhc2V0LXBhcmFtcy1idG4iLGhyZT0KZjp0aGlzLnVybHMuc2hvd19wYXJhbXMs
dGFyZ2V0OnRoaXMubGlua1RhcmdldCxmYUljb246ImZhLWluZm8tY2lyY2xlIn0pfSxfPQpyZW5k
ZXJfYm9keTpmdW5jdGlvbigpe3ZhciBnPTNEJCgnPGRpdj5FcnJvcjogdW5rbm93biBkYXRhc2V0
IHN0YXRlICInK3RoaXM9Ci5tb2RlbC5nZXQoInN0YXRlIikrJyIuPC9kaXY+JyksZj0zRHRoaXNb
Il9yZW5kZXJfYm9keV8iK3RoaXMubW9kZWwuZ2V0KCJzdD0KYXRlIildO2lmKF8uaXNGdW5jdGlv
bihmKSl7Zz0zRGYuY2FsbCh0aGlzKX10aGlzLl9zZXRVcEJlaGF2aW9ycyhnKTtpZih0aGlzPQou
ZXhwYW5kZWQpe2cuc2hvdygpfXJldHVybiBnfSxfcmVuZGVyX3N0YXRlQm9keUhlbHBlcjpmdW5j
dGlvbihmLGkpe2k9M0RpfHw9CltdO3ZhciBnPTNEdGhpcyxoPTNEJChjLnRlbXBsYXRlcy5ib2R5
KF8uZXh0ZW5kKHRoaXMubW9kZWwudG9KU09OKCkse2JvZHk6Zj0KfSkpKTtoLmZpbmQoIi5kYXRh
c2V0LWFjdGlvbnMgLmxlZnQiKS5hcHBlbmQoXy5tYXAoaSxmdW5jdGlvbihqKXtyZXR1cm4gai5j
PQphbGwoZyl9KSk7cmV0dXJuIGh9LF9yZW5kZXJfYm9keV9uZXc6ZnVuY3Rpb24oKXtyZXR1cm4g
dGhpcy5fcmVuZGVyX3N0YXRlQm89CmR5SGVscGVyKCI8ZGl2PiIrX2woIlRoaXMgaXMgYSBuZXcg
ZGF0YXNldCBhbmQgbm90IGFsbCBvZiBpdHMgZGF0YSBhcmUgYXZhaT0KbGFibGUgeWV0IikrIjwv
ZGl2PiIsdGhpcy5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVycyl9LF9yZW5kZXJf
Ym9kPQp5X25vUGVybWlzc2lvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZW5kZXJfc3RhdGVC
b2R5SGVscGVyKCI8ZGl2PiIrX2woIlk9Cm91IGRvIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gdmll
dyB0aGlzIGRhdGFzZXQiKSsiPC9kaXY+Iil9LF9yZW5kZXJfYm9keV9kaT0Kc2NhcmRlZDpmdW5j
dGlvbigpe3JldHVybiB0aGlzLl9yZW5kZXJfc3RhdGVCb2R5SGVscGVyKCI8ZGl2PiIrX2woIlRo
ZSBqb2IgPQpjcmVhdGluZyB0aGlzIGRhdGFzZXQgd2FzIGNhbmNlbGxlZCBiZWZvcmUgY29tcGxl
dGlvbiIpKyI8L2Rpdj4iLHRoaXMuZGVmYXU9Cmx0UHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVy
cyl9LF9yZW5kZXJfYm9keV9xdWV1ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz0KLl9yZW5kZXJf
c3RhdGVCb2R5SGVscGVyKCI8ZGl2PiIrX2woIlRoaXMgam9iIGlzIHdhaXRpbmcgdG8gcnVuIikr
IjwvZGl2PiIsPQp0aGlzLmRlZmF1bHRQcmltYXJ5QWN0aW9uQnV0dG9uUmVuZGVyZXJzKX0sX3Jl
bmRlcl9ib2R5X3VwbG9hZDpmdW5jdGlvbigpe3I9CmV0dXJuIHRoaXMuX3JlbmRlcl9zdGF0ZUJv
ZHlIZWxwZXIoIjxkaXY+IitfbCgiVGhpcyBkYXRhc2V0IGlzIGN1cnJlbnRseSB1cD0KbG9hZGlu
ZyIpKyI8L2Rpdj4iKX0sX3JlbmRlcl9ib2R5X3NldHRpbmdfbWV0YWRhdGE6ZnVuY3Rpb24oKXty
ZXR1cm4gdGhpcy5fPQpyZW5kZXJfc3RhdGVCb2R5SGVscGVyKCI8ZGl2PiIrX2woIk1ldGFkYXRh
IGlzIGJlaW5nIGF1dG8tZGV0ZWN0ZWQiKSsiPC9kaXY9Cj4iKX0sX3JlbmRlcl9ib2R5X3J1bm5p
bmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVuZGVyX3N0YXRlQm9keUhlbHBlcigiPD0KZGl2
PiIrX2woIlRoaXMgam9iIGlzIGN1cnJlbnRseSBydW5uaW5nIikrIjwvZGl2PiIsdGhpcy5kZWZh
dWx0UHJpbWFyeUFjdGlvPQpuQnV0dG9uUmVuZGVyZXJzKX0sX3JlbmRlcl9ib2R5X3BhdXNlZDpm
dW5jdGlvbigpe3JldHVybiB0aGlzLl9yZW5kZXJfc3RhdGU9CkJvZHlIZWxwZXIoIjxkaXY+Iitf
bCgnVGhpcyBqb2IgaXMgcGF1c2VkLiBVc2UgdGhlICJSZXN1bWUgUGF1c2VkIEpvYnMiIGluID0K
dGhlIGhpc3RvcnkgbWVudSB0byByZXN1bWUnKSsiPC9kaXY+Iix0aGlzLmRlZmF1bHRQcmltYXJ5
QWN0aW9uQnV0dG9uUmVuZGVyPQplcnMpfSxfcmVuZGVyX2JvZHlfZXJyb3I6ZnVuY3Rpb24oKXt2
YXIgZj0zRFsnPHNwYW4gY2xhc3M9M0QiaGVscC10ZXh0Ij4nLF89CmwoIkFuIGVycm9yIG9jY3Vy
cmVkIHdpdGggdGhpcyBkYXRhc2V0IiksIjo8L3NwYW4+IiwnPGRpdiBjbGFzcz0zRCJqb2ItZXJy
bz0Kci10ZXh0Ij4nLCQudHJpbSh0aGlzLm1vZGVsLmdldCgibWlzY19pbmZvIikpLCI8L2Rpdj4i
XS5qb2luKCIiKTtpZighdGhpcy5tPQpvZGVsLmdldCgicHVyZ2VkIikpe2Y9M0QiPGRpdj4iK3Ro
aXMubW9kZWwuZ2V0KCJtaXNjX2JsdXJiIikrIjwvZGl2PiIrZn1yZXQ9CnVybiB0aGlzLl9yZW5k
ZXJfc3RhdGVCb2R5SGVscGVyKGYsW3RoaXMuX3JlbmRlcl9kb3dubG9hZEJ1dHRvbl0uY29uY2F0
KHRoaT0Kcy5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVycykpfSxfcmVuZGVyX2Jv
ZHlfZW1wdHk6ZnVuY3Rpb24oKXtyZXR1PQpybiB0aGlzLl9yZW5kZXJfc3RhdGVCb2R5SGVscGVy
KCI8ZGl2PiIrX2woIk5vIGRhdGEiKSsiOiA8aT4iK3RoaXMubW9kZWwuZ2U9CnQoIm1pc2NfYmx1
cmIiKSsiPC9pPjwvZGl2PiIsdGhpcy5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVy
cyl9LF9yZT0KbmRlcl9ib2R5X2ZhaWxlZF9tZXRhZGF0YTpmdW5jdGlvbigpe3ZhciBmPTNEJCgn
PGRpdiBjbGFzcz0zRCJ3YXJuaW5nbWVzc2FnPQplc21hbGwiPjwvZGl2PicpLmFwcGVuZCgkKCI8
c3Ryb25nLz4iKS50ZXh0KF9sKCJBbiBlcnJvciBvY2N1cnJlZCBzZXR0aW5nIHQ9CmhlIG1ldGFk
YXRhIGZvciB0aGlzIGRhdGFzZXQiKSkpLGc9M0R0aGlzLl9yZW5kZXJfYm9keV9vaygpO2cucHJl
cGVuZChmKTtyZT0KdHVybiBnfSxfcmVuZGVyX2JvZHlfb2s6ZnVuY3Rpb24oKXt2YXIgZj0zRHRo
aXMsaD0zRCQoYy50ZW1wbGF0ZXMuYm9keSh0aGlzPQoubW9kZWwudG9KU09OKCkpKSxnPTNEW3Ro
aXMuX3JlbmRlcl9kb3dubG9hZEJ1dHRvbl0uY29uY2F0KHRoaXMuZGVmYXVsdFByaW09CmFyeUFj
dGlvbkJ1dHRvblJlbmRlcmVycyk7aC5maW5kKCIuZGF0YXNldC1hY3Rpb25zIC5sZWZ0IikuYXBw
ZW5kKF8ubWFwKGcsZj0KdW5jdGlvbihpKXtyZXR1cm4gaS5jYWxsKGYpfSkpO2lmKHRoaXMubW9k
ZWwuaXNEZWxldGVkT3JQdXJnZWQoKSl7cmV0dXJuIGh9PQpyZXR1cm4gaH0sZXZlbnRzOnsiY2xp
Y2sgLmRhdGFzZXQtdGl0bGUtYmFyIjoidG9nZ2xlQm9keVZpc2liaWxpdHkiLCJrZXlkb3c9Cm4g
LmRhdGFzZXQtdGl0bGUtYmFyIjoidG9nZ2xlQm9keVZpc2liaWxpdHkiLCJjbGljayAuZGF0YXNl
dC1zZWxlY3RvciI6InRvZz0KZ2xlU2VsZWN0In0sdG9nZ2xlQm9keVZpc2liaWxpdHk6ZnVuY3Rp
b24oaSxnKXt2YXIgZj0zRDMyLGg9M0QxMztpZihpJiYoaS50PQp5cGU9M0Q9M0Q9M0Qia2V5ZG93
biIpJiYhKGkua2V5Q29kZT0zRD0zRD0zRGZ8fGkua2V5Q29kZT0zRD0zRD0zRGgpKXtyZXR1cm49
CiB0cnVlfXZhciBqPTNEdGhpcy4kZWwuZmluZCgiLmRhdGFzZXQtYm9keSIpO2c9M0QoZz0zRD0z
RD0zRHVuZGVmaW5lZCk/KCFqLj0KaXMoIjp2aXNpYmxlIikpOihnKTtpZihnKXt0aGlzLmV4cGFu
ZEJvZHkoKX1lbHNle3RoaXMuY29sbGFwc2VCb2R5KCl9cmV0dXJuPQogZmFsc2V9LGV4cGFuZEJv
ZHk6ZnVuY3Rpb24oKXt2YXIgZj0zRHRoaXM7ZnVuY3Rpb24gZygpe2YuJGVsLmNoaWxkcmVuKCIu
ZGE9CnRhc2V0LWJvZHkiKS5yZXBsYWNlV2l0aChmLl9yZW5kZXJfYm9keSgpKTtmLiRlbC5jaGls
ZHJlbigiLmRhdGFzZXQtYm9keSIpLj0Kc2xpZGVEb3duKGYuZnhTcGVlZCxmdW5jdGlvbigpe2Yu
ZXhwYW5kZWQ9M0R0cnVlO2YudHJpZ2dlcigiYm9keS1leHBhbmRlZCIsPQpmLm1vZGVsLmdldCgi
aWQiKSl9KX1pZih0aGlzLm1vZGVsLmluUmVhZHlTdGF0ZSgpJiYhdGhpcy5tb2RlbC5oYXNEZXRh
aWxzKCk9Cil7dGhpcy5tb2RlbC5mZXRjaCh7c2lsZW50OnRydWV9KS5hbHdheXMoZnVuY3Rpb24o
aCl7Zi51cmxzPTNEZi5tb2RlbC51cmxzKD0KKTtnKCl9KX1lbHNle2coKX19LGNvbGxhcHNlQm9k
eTpmdW5jdGlvbigpe3ZhciBmPTNEdGhpczt0aGlzLiRlbC5jaGlsZHJlbigiPQouZGF0YXNldC1i
b2R5Iikuc2xpZGVVcChmLmZ4U3BlZWQsZnVuY3Rpb24oKXtmLmV4cGFuZGVkPTNEZmFsc2U7Zi50
cmlnZ2VyKCI9CmJvZHktY29sbGFwc2VkIixmLm1vZGVsLmdldCgiaWQiKSl9KX0sc2hvd1NlbGVj
dG9yOmZ1bmN0aW9uKCl7aWYodGhpcy5zZWxlYz0KdGVkKXt0aGlzLnNlbGVjdChudWxsLHRydWUp
fXRoaXMuc2VsZWN0YWJsZT0zRHRydWU7dGhpcy50cmlnZ2VyKCJzZWxlY3RhYmxlPQoiLHRydWUs
dGhpcyk7dGhpcy4kKCIuZGF0YXNldC1wcmltYXJ5LWFjdGlvbnMiKS5oaWRlKCk7dGhpcy4kKCIu
ZGF0YXNldC1zZWw9CmVjdG9yIikuc2hvdygpfSxoaWRlU2VsZWN0b3I6ZnVuY3Rpb24oKXt0aGlz
LnNlbGVjdGFibGU9M0RmYWxzZTt0aGlzLnRyaWdnZT0Kcigic2VsZWN0YWJsZSIsZmFsc2UsdGhp
cyk7dGhpcy4kKCIuZGF0YXNldC1zZWxlY3RvciIpLmhpZGUoKTt0aGlzLiQoIi5kYXRhPQpzZXQt
cHJpbWFyeS1hY3Rpb25zIikuc2hvdygpfSx0b2dnbGVTZWxlY3RvcjpmdW5jdGlvbigpe2lmKCF0
aGlzLiRlbC5maW5kKCI9Ci5kYXRhc2V0LXNlbGVjdG9yIikuaXMoIjp2aXNpYmxlIikpe3RoaXMu
c2hvd1NlbGVjdG9yKCl9ZWxzZXt0aGlzLmhpZGVTZWxlYz0KdG9yKCl9fSxzZWxlY3Q6ZnVuY3Rp
b24oZil7dGhpcy4kZWwuZmluZCgiLmRhdGFzZXQtc2VsZWN0b3Igc3BhbiIpLnJlbW92ZUNsPQph
c3MoImZhLXNxdWFyZS1vIikuYWRkQ2xhc3MoImZhLWNoZWNrLXNxdWFyZS1vIik7aWYoIXRoaXMu
c2VsZWN0ZWQpe3RoaXMudHI9CmlnZ2VyKCJzZWxlY3RlZCIsdGhpcyk7dGhpcy5zZWxlY3RlZD0z
RHRydWV9cmV0dXJuIGZhbHNlfSxkZXNlbGVjdDpmdW5jdGlvbj0KKGYpe3RoaXMuJGVsLmZpbmQo
Ii5kYXRhc2V0LXNlbGVjdG9yIHNwYW4iKS5yZW1vdmVDbGFzcygiZmEtY2hlY2stc3F1YXJlLW8i
PQopLmFkZENsYXNzKCJmYS1zcXVhcmUtbyIpO2lmKHRoaXMuc2VsZWN0ZWQpe3RoaXMudHJpZ2dl
cigiZGUtc2VsZWN0ZWQiLHRoaXM9Cik7dGhpcy5zZWxlY3RlZD0zRGZhbHNlfXJldHVybiBmYWxz
ZX0sdG9nZ2xlU2VsZWN0OmZ1bmN0aW9uKGYpe2lmKHRoaXMuc2VsZT0KY3RlZCl7dGhpcy5kZXNl
bGVjdChmKX1lbHNle3RoaXMuc2VsZWN0KGYpfX0sZHJhZ2dhYmxlT246ZnVuY3Rpb24oKXt0aGlz
LmRyPQphZ2dhYmxlPTNEdHJ1ZTt0aGlzLmRyYWdTdGFydEhhbmRsZXI9M0RfLmJpbmQodGhpcy5f
ZHJhZ1N0YXJ0SGFuZGxlcix0aGlzKTs9CnRoaXMuZHJhZ0VuZEhhbmRsZXI9M0RfLmJpbmQodGhp
cy5fZHJhZ0VuZEhhbmRsZXIsdGhpcyk7dmFyIGY9M0R0aGlzLiRlbC5maT0KbmQoIi5kYXRhc2V0
LXRpdGxlLWJhciIpLmF0dHIoImRyYWdnYWJsZSIsdHJ1ZSkuZ2V0KDApO2YuYWRkRXZlbnRMaXN0
ZW5lcigiPQpkcmFnc3RhcnQiLHRoaXMuZHJhZ1N0YXJ0SGFuZGxlcixmYWxzZSk7Zi5hZGRFdmVu
dExpc3RlbmVyKCJkcmFnZW5kIix0aGlzLmQ9CnJhZ0VuZEhhbmRsZXIsZmFsc2UpfSxkcmFnZ2Fi
bGVPZmY6ZnVuY3Rpb24oKXt0aGlzLmRyYWdnYWJsZT0zRGZhbHNlO3ZhciBmPQo9M0R0aGlzLiRl
bC5maW5kKCIuZGF0YXNldC10aXRsZS1iYXIiKS5hdHRyKCJkcmFnZ2FibGUiLGZhbHNlKS5nZXQo
MCk7Zi5yZW09Cm92ZUV2ZW50TGlzdGVuZXIoImRyYWdzdGFydCIsdGhpcy5kcmFnU3RhcnRIYW5k
bGVyLGZhbHNlKTtmLnJlbW92ZUV2ZW50TGlzdD0KZW5lcigiZHJhZ2VuZCIsdGhpcy5kcmFnRW5k
SGFuZGxlcixmYWxzZSl9LHRvZ2dsZURyYWdnYWJsZTpmdW5jdGlvbigpe2lmKHRoPQppcy5kcmFn
Z2FibGUpe3RoaXMuZHJhZ2dhYmxlT2ZmKCl9ZWxzZXt0aGlzLmRyYWdnYWJsZU9uKCl9fSxfZHJh
Z1N0YXJ0SGFuZGw9CmVyOmZ1bmN0aW9uKGYpe3RoaXMudHJpZ2dlcigiZHJhZ3N0YXJ0Iix0aGlz
KTtmLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkPQo9M0QibW92ZSI7Zi5kYXRhVHJhbnNmZXIu
c2V0RGF0YSgidGV4dCIsSlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbC50b0pTT04oKSk9Cik7cmV0
dXJuIGZhbHNlfSxfZHJhZ0VuZEhhbmRsZXI6ZnVuY3Rpb24oZil7dGhpcy50cmlnZ2VyKCJkcmFn
ZW5kIix0aGlzKTtyZT0KdHVybiBmYWxzZX0scmVtb3ZlOmZ1bmN0aW9uKGcpe3ZhciBmPTNEdGhp
czt0aGlzLiRlbC5mYWRlT3V0KGYuZnhTcGVlZCxmdW5jPQp0aW9uKCl7Zi4kZWwucmVtb3ZlKCk7
Zi5vZmYoKTtpZihnKXtnKCl9fSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGY9M0QodGg9Cmlz
Lm1vZGVsKT8odGhpcy5tb2RlbCsiIik6KCIobm8gbW9kZWwpIik7cmV0dXJuIkhEQUJhc2VWaWV3
KCIrZisiKSJ9fSk7dmFyID0KYT0zRFsnPGRpdiBjbGFzcz0zRCJkYXRhc2V0IGhkYSI+JywnPGRp
diBjbGFzcz0zRCJkYXRhc2V0LXdhcm5pbmdzIj4nLCI8JSBpPQpmKCBoZGEuZXJyb3IgKXsgJT4i
LCc8ZGl2IGNsYXNzPTNEImVycm9ybWVzc2FnZXNtYWxsIj4nLF9sKCJUaGVyZSB3YXMgYW4gZXI9
CnJvciBnZXR0aW5nIHRoZSBkYXRhIGZvciB0aGlzIGRhdGFzZXQiKSwiOjwlLSBoZGEuZXJyb3Ig
JT4iLCI8L2Rpdj4iLCI8JSB9ID0KJT4iLCI8JSBpZiggaGRhLmRlbGV0ZWQgKXsgJT4iLCI8JSBp
ZiggaGRhLnB1cmdlZCApeyAlPiIsJzxkaXYgY2xhc3M9M0QiZGF0PQphc2V0LXB1cmdlZC1tc2cg
d2FybmluZ21lc3NhZ2VzbWFsbCI+PHN0cm9uZz4nLF9sKCJUaGlzIGRhdGFzZXQgaGFzIGJlZW4g
ZGU9CmxldGVkIGFuZCByZW1vdmVkIGZyb20gZGlzay4iKSwiPC9zdHJvbmc+PC9kaXY+IiwiPCUg
fSBlbHNlIHsgJT4iLCc8ZGl2IGNsYT0Kc3M9M0QiZGF0YXNldC1kZWxldGVkLW1zZyB3YXJuaW5n
bWVzc2FnZXNtYWxsIj48c3Ryb25nPicsX2woIlRoaXMgZGF0YXNldCBoPQphcyBiZWVuIGRlbGV0
ZWQuIiksIjwvc3Ryb25nPjwvZGl2PiIsIjwlIH0gJT4iLCI8JSB9ICU+IiwiPCUgaWYoICFoZGEu
dmlzaWI9CmxlICl7ICU+IiwnPGRpdiBjbGFzcz0zRCJkYXRhc2V0LWhpZGRlbi1tc2cgd2Fybmlu
Z21lc3NhZ2VzbWFsbCI+PHN0cm9uZz4nLD0KX2woIlRoaXMgZGF0YXNldCBoYXMgYmVlbiBoaWRk
ZW4uIiksIjwvc3Ryb25nPjwvZGl2PiIsIjwlIH0gJT4iLCI8L2Rpdj4iLCc8PQpkaXYgY2xhc3M9
M0QiZGF0YXNldC1zZWxlY3RvciI+JywnPHNwYW4gY2xhc3M9M0QiZmEgZmEtMnggZmEtc3F1YXJl
LW8iPjwvc3A9CmFuPicsIjwvZGl2PiIsJzxkaXYgY2xhc3M9M0QiZGF0YXNldC1wcmltYXJ5LWFj
dGlvbnMiPjwvZGl2PicsJzxkaXYgY2xhc3M9Cj0zRCJkYXRhc2V0LXRpdGxlLWJhciBjbGVhciIg
dGFiaW5kZXg9M0QiMCI+JywnPHNwYW4gY2xhc3M9M0QiZGF0YXNldC1zdGF0ZT0KLWljb24gc3Rh
dGUtaWNvbiI+PC9zcGFuPicsJzxkaXYgY2xhc3M9M0QiZGF0YXNldC10aXRsZSI+JywnPHNwYW4g
Y2xhc3M9M0QiPQpoZGEtaGlkIj48JS0gaGRhLmhpZCAlPjwvc3Bhbj4gJywnPHNwYW4gY2xhc3M9
M0QiZGF0YXNldC1uYW1lIj48JS0gaGRhLm5hbWU9CiAlPjwvc3Bhbj4nLCI8L2Rpdj4iLCI8L2Rp
dj4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtYm9keSI+PC9kaXY+JywiPC9kaXY+Ij0KXS5qb2lu
KCIiKTt2YXIgZT0zRFsnPGRpdiBjbGFzcz0zRCJkYXRhc2V0LWJvZHkiPicsIjwlIGlmKCBoZGEu
Ym9keSApeyAlPiIsPQonPGRpdiBjbGFzcz0zRCJkYXRhc2V0LXN1bW1hcnkiPicsIjwlPTNEIGhk
YS5ib2R5ICU+IiwiPC9kaXY+IiwnPGRpdiBjbGFzcz0KPTNEImRhdGFzZXQtYWN0aW9ucyBjbGVh
ciI+JywnPGRpdiBjbGFzcz0zRCJsZWZ0Ij48L2Rpdj4nLCc8ZGl2IGNsYXNzPTNEInJpPQpnaHQi
PjwvZGl2PicsIjwvZGl2PiIsIjwlIH0gZWxzZSB7ICU+IiwnPGRpdiBjbGFzcz0zRCJkYXRhc2V0
LXN1bW1hcnkiPicsIjw9CiUgaWYoIGhkYS5taXNjX2JsdXJiICl7ICU+IiwnPGRpdiBjbGFzcz0z
RCJkYXRhc2V0LWJsdXJiIj4nLCc8c3BhbiBjbGFzcz0zRD0KInZhbHVlIj48JS0gaGRhLm1pc2Nf
Ymx1cmIgJT48L3NwYW4+JywiPC9kaXY+IiwiPCUgfSAlPiIsIjwlIGlmKCBoZGEuZGF0YV90PQp5
cGUgKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtZGF0YXR5cGUiPicsJzxsYWJlbCBjbGFz
cz0zRCJwcm9tcHQiPicsX2w9CigiZm9ybWF0IiksIjwvbGFiZWw+IiwnPHNwYW4gY2xhc3M9M0Qi
dmFsdWUiPjwlLSBoZGEuZGF0YV90eXBlICU+PC9zcGFuPicsIj0KPC9kaXY+IiwiPCUgfSAlPiIs
IjwlIGlmKCBoZGEubWV0YWRhdGFfZGJrZXkgKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQt
PQpkYmtleSI+JywnPGxhYmVsIGNsYXNzPTNEInByb21wdCI+JyxfbCgiZGF0YWJhc2UiKSwiPC9s
YWJlbD4iLCc8c3BhbiBjbGFzcz0KPTNEInZhbHVlIj4nLCI8JS0gaGRhLm1ldGFkYXRhX2Ria2V5
ICU+IiwiPC9zcGFuPiIsIjwvZGl2PiIsIjwlIH0gJT4iLCI8JSBpPQpmKCBoZGEubWlzY19pbmZv
ICl7ICU+IiwnPGRpdiBjbGFzcz0zRCJkYXRhc2V0LWluZm8iPicsJzxzcGFuIGNsYXNzPTNEInZh
bHU9CmUiPjwlLSBoZGEubWlzY19pbmZvICU+PC9zcGFuPicsIjwvZGl2PiIsIjwlIH0gJT4iLCI8
L2Rpdj4iLCc8ZGl2IGNsYXNzPTNEIj0KZGF0YXNldC1hY3Rpb25zIGNsZWFyIj4nLCc8ZGl2IGNs
YXNzPTNEImxlZnQiPjwvZGl2PicsJzxkaXYgY2xhc3M9M0QicmlnaHQiPQo+PC9kaXY+JywiPC9k
aXY+IiwiPCUgaWYoICFoZGEuZGVsZXRlZCApeyAlPiIsJzxkaXYgY2xhc3M9M0QidGFncy1kaXNw
bGF5Ij49CjwvZGl2PicsJzxkaXYgY2xhc3M9M0QiYW5ub3RhdGlvbi1kaXNwbGF5Ij48L2Rpdj4n
LCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtZD0KaXNwbGF5LWFwcGxpY2F0aW9ucyI+JywiPCUgXy5l
YWNoKCBoZGEuZGlzcGxheV9hcHBzLCBmdW5jdGlvbiggYXBwICl7ICU+IiwnPQo8ZGl2IGNsYXNz
PTNEImRpc3BsYXktYXBwbGljYXRpb24iPicsJzxzcGFuIGNsYXNzPTNEImRpc3BsYXktYXBwbGlj
YXRpb24tbG89CmNhdGlvbiI+PCUtIGFwcC5sYWJlbCAlPjwvc3Bhbj4gJywnPHNwYW4gY2xhc3M9
M0QiZGlzcGxheS1hcHBsaWNhdGlvbi1saW5rcz0KIj4nLCI8JSBfLmVhY2goIGFwcC5saW5rcywg
ZnVuY3Rpb24oIGxpbmsgKXsgJT4iLCc8YSB0YXJnZXQ9M0QiPCU9M0QgbGluay50PQphcmdldCAl
PiIgaHJlZj0zRCI8JT0zRCBsaW5rLmhyZWYgJT4iPicsIjwlIHByaW50KCBfbCggbGluay50ZXh0
ICkgKTsgJT4iLCI9CjwvYT4gIiwiPCUgfSk7ICU+IiwiPC9zcGFuPiIsIjwvZGl2PiIsIjwlIH0p
OyAlPiIsIjwlIF8uZWFjaCggaGRhLmRpc3BsYXlfdD0KeXBlcywgZnVuY3Rpb24oIGFwcCApeyAl
PiIsJzxkaXYgY2xhc3M9M0QiZGlzcGxheS1hcHBsaWNhdGlvbiI+JywnPHNwYW4gY2xhPQpzcz0z
RCJkaXNwbGF5LWFwcGxpY2F0aW9uLWxvY2F0aW9uIj48JS0gYXBwLmxhYmVsICU+PC9zcGFuPiAn
LCc8c3BhbiBjbGFzcz0KPTNEImRpc3BsYXktYXBwbGljYXRpb24tbGlua3MiPicsIjwlIF8uZWFj
aCggYXBwLmxpbmtzLCBmdW5jdGlvbiggbGluayApeyAlPQo+IiwnPGEgdGFyZ2V0PTNEIjwlPTNE
IGxpbmsudGFyZ2V0ICU+IiBocmVmPTNEIjwlPTNEIGxpbmsuaHJlZiAlPiI+JywiPCUgcHI9Cmlu
dCggX2woIGxpbmsudGV4dCApICk7ICU+IiwiPC9hPiAiLCI8JSB9KTsgJT4iLCI8L3NwYW4+Iiwi
PC9kaXY+IiwiPCUgfSk7ID0KJT4iLCI8L2Rpdj4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtcGVl
ayI+JywiPCUgaWYoIGhkYS5wZWVrICl7ICU+IiwnPHByZSBjPQpsYXNzPTNEInBlZWsiPjwlPTNE
IGhkYS5wZWVrICU+PC9wcmU+JywiPCUgfSAlPiIsIjwvZGl2PiIsIjwlIH0gJT4iLCI8JSB9ICU9
Cj4iLCI8L2Rpdj4iXS5qb2luKCIiKTtjLnRlbXBsYXRlcz0zRHtza2VsZXRvbjpmdW5jdGlvbihm
KXtyZXR1cm4gXy50ZW1wbGF0ZT0KKGEsZix7dmFyaWFibGU6ImhkYSJ9KX0sYm9keTpmdW5jdGlv
bihmKXtyZXR1cm4gXy50ZW1wbGF0ZShlLGYse3ZhcmlhYmxlOiJoPQpkYSJ9KX19O3JldHVybntI
REFCYXNlVmlldzpjfX0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2RlZmluZShbIm12
Yy9kYXRhc2V0L2hkYS1tb2RlbCIsIm12Yy9iYXNlLW12YyIsInV0aWxzL2xvY2FsaXphdGlvbiJd
LGZ1bmN0PQppb24oZSxiLGQpe3ZhciBjPTNEQmFja2JvbmUuVmlldy5leHRlbmQoYi5Mb2dnYWJs
ZU1peGluKS5leHRlbmQoe3RhZ05hbWU6ImQ9Cml2IixjbGFzc05hbWU6ImRhdGFzZXQgaGRhIGhp
c3RvcnktcGFuZWwtaGRhIixpZDpmdW5jdGlvbigpe3JldHVybiJoZGEtIit0aD0KaXMubW9kZWwu
Z2V0KCJpZCIpfSxmeFNwZWVkOiJmYXN0Iixpbml0aWFsaXplOmZ1bmN0aW9uKGcpe2lmKGcubG9n
Z2VyKXt0aGlzPQoubG9nZ2VyPTNEdGhpcy5tb2RlbC5sb2dnZXI9M0RnLmxvZ2dlcn10aGlzLmxv
Zyh0aGlzKyIuaW5pdGlhbGl6ZToiLGcpO3RoaXM9Ci5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1dHRv
blJlbmRlcmVycz0zRFt0aGlzLl9yZW5kZXJfc2hvd1BhcmFtc0J1dHRvbl07dGhpcz0KLmxpbmtU
YXJnZXQ9M0RnLmxpbmtUYXJnZXR8fCJfYmxhbmsiO3RoaXMuc2VsZWN0YWJsZT0zRGcuc2VsZWN0
YWJsZXx8ZmFsc2U7PQp0aGlzLnNlbGVjdGVkPTNEZy5zZWxlY3RlZHx8ZmFsc2U7dGhpcy5leHBh
bmRlZD0zRGcuZXhwYW5kZWR8fGZhbHNlO3RoaXMuZHI9CmFnZ2FibGU9M0RnLmRyYWdnYWJsZXx8
ZmFsc2U7dGhpcy5fc2V0VXBMaXN0ZW5lcnMoKX0sX3NldFVwTGlzdGVuZXJzOmZ1bmN0aT0Kb24o
KXt0aGlzLm1vZGVsLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKGgsZyl7aWYodGhpcy5tb2RlbC5jaGFu
Z2VkQXR0cmlidXRlcygpPQouc3RhdGUmJnRoaXMubW9kZWwuaW5SZWFkeVN0YXRlKCkmJnRoaXMu
ZXhwYW5kZWQmJiF0aGlzLm1vZGVsLmhhc0RldGFpbHMoKSk9Cnt0aGlzLm1vZGVsLmZldGNoKCl9
ZWxzZXt0aGlzLnJlbmRlcigpfX0sdGhpcyl9LHJlbmRlcjpmdW5jdGlvbihpKXtpPTNEKGk9Cj0z
RD0zRD0zRHVuZGVmaW5lZCk/KHRydWUpOihpKTt2YXIgZz0zRHRoaXM7dGhpcy4kZWwuZmluZCgi
W3RpdGxlXSIpLnRvb2x0aT0KcCgiZGVzdHJveSIpO3RoaXMudXJscz0zRHRoaXMubW9kZWwudXJs
cygpO3ZhciBoPTNEdGhpcy5fYnVpbGROZXdSZW5kZXIoKTtpPQpmKGkpeyQoZykucXVldWUoZnVu
Y3Rpb24oail7dGhpcy4kZWwuZmFkZU91dChnLmZ4U3BlZWQsail9KX0kKGcpLnF1ZXVlKGZ1bmM9
CnRpb24oail7dGhpcy4kZWwuZW1wdHkoKS5hdHRyKCJjbGFzcyIsZy5jbGFzc05hbWUpLmFkZENs
YXNzKCJzdGF0ZS0iK2cubW9kZT0KbC5nZXQoInN0YXRlIikpLmFwcGVuZChoLmNoaWxkcmVuKCkp
O2lmKHRoaXMuc2VsZWN0YWJsZSl7dGhpcy5zaG93U2VsZWN0b3IoPQowKX1qKCl9KTtpZihpKXsk
KGcpLnF1ZXVlKGZ1bmN0aW9uKGope3RoaXMuJGVsLmZhZGVJbihnLmZ4U3BlZWQsail9KX0kKGcp
LnE9CnVldWUoZnVuY3Rpb24oail7dGhpcy50cmlnZ2VyKCJyZW5kZXJlZCIsZyk7aWYodGhpcy5t
b2RlbC5pblJlYWR5U3RhdGUoKSl7dD0KaGlzLnRyaWdnZXIoInJlbmRlcmVkOnJlYWR5IixnKX1p
Zih0aGlzLmRyYWdnYWJsZSl7dGhpcy5kcmFnZ2FibGVPbigpfWooKX0pPQo7cmV0dXJuIHRoaXN9
LF9idWlsZE5ld1JlbmRlcjpmdW5jdGlvbigpe3ZhciBnPTNEJChjLnRlbXBsYXRlcy5za2VsZXRv
bih0aGk9CnMubW9kZWwudG9KU09OKCkpKTtnLmZpbmQoIi5kYXRhc2V0LXByaW1hcnktYWN0aW9u
cyIpLmFwcGVuZCh0aGlzLl9yZW5kZXJfdD0KaXRsZUJ1dHRvbnMoKSk7Zy5jaGlsZHJlbigiLmRh
dGFzZXQtYm9keSIpLnJlcGxhY2VXaXRoKHRoaXMuX3JlbmRlcl9ib2R5KCkpPQo7dGhpcy5fc2V0
VXBCZWhhdmlvcnMoZyk7cmV0dXJuIGd9LF9zZXRVcEJlaGF2aW9yczpmdW5jdGlvbihnKXtnPTNE
Z3x8dGhpcy49CiRlbDttYWtlX3BvcHVwX21lbnVzKGcpO2cuZmluZCgiW3RpdGxlXSIpLnRvb2x0
aXAoe3BsYWNlbWVudDoiYm90dG9tIn0pfSxfcj0KZW5kZXJfdGl0bGVCdXR0b25zOmZ1bmN0aW9u
KCl7cmV0dXJuW3RoaXMuX3JlbmRlcl9kaXNwbGF5QnV0dG9uKCldfSxfcmVuZGVyPQpfZGlzcGxh
eUJ1dHRvbjpmdW5jdGlvbigpe2lmKCh0aGlzLm1vZGVsLmdldCgic3RhdGUiKT0zRD0zRD0zRGUu
SGlzdG9yeURhdGE9CnNldEFzc29jaWF0aW9uLlNUQVRFUy5OT1RfVklFV0FCTEUpfHwodGhpcy5t
b2RlbC5nZXQoInN0YXRlIik9M0Q9M0Q9M0RlLkhpcz0KdG9yeURhdGFzZXRBc3NvY2lhdGlvbi5T
VEFURVMuRElTQ0FSREVEKXx8KCF0aGlzLm1vZGVsLmdldCgiYWNjZXNzaWJsZSIpKSl7PQpyZXR1
cm4gbnVsbH12YXIgaD0zRHt0YXJnZXQ6dGhpcy5saW5rVGFyZ2V0LGNsYXNzZXM6ImRhdGFzZXQt
ZGlzcGxheSJ9O2lmKHQ9Cmhpcy5tb2RlbC5nZXQoInB1cmdlZCIpKXtoLmRpc2FibGVkPTNEdHJ1
ZTtoLnRpdGxlPTNEZCgiQ2Fubm90IGRpc3BsYXkgZGF0YT0Kc2V0cyByZW1vdmVkIGZyb20gZGlz
ayIpfWVsc2V7aWYodGhpcy5tb2RlbC5nZXQoInN0YXRlIik9M0Q9M0Q9M0RlLkhpc3RvcnlEPQph
dGFzZXRBc3NvY2lhdGlvbi5TVEFURVMuVVBMT0FEKXtoLmRpc2FibGVkPTNEdHJ1ZTtoLnRpdGxl
PTNEZCgiVGhpcyBkYXRhc2U9CnQgbXVzdCBmaW5pc2ggdXBsb2FkaW5nIGJlZm9yZSBpdCBjYW4g
YmUgdmlld2VkIil9ZWxzZXtpZih0aGlzLm1vZGVsLmdldCgicz0KdGF0ZSIpPTNEPTNEPTNEZS5I
aXN0b3J5RGF0YXNldEFzc29jaWF0aW9uLlNUQVRFUy5ORVcpe2guZGlzYWJsZWQ9M0R0cnVlO2gu
PQp0aXRsZT0zRGQoIlRoaXMgZGF0YXNldCBpcyBub3QgeWV0IHZpZXdhYmxlIil9ZWxzZXtoLnRp
dGxlPTNEZCgiVmlldyBkYXRhIik9CjtoLmhyZWY9M0R0aGlzLnVybHMuZGlzcGxheTt2YXIgZz0z
RHRoaXM7aC5vbmNsaWNrPTNEZnVuY3Rpb24oaSl7aWYoR2FsYXh5Lj0KZnJhbWUmJkdhbGF4eS5m
cmFtZS5hY3RpdmUpe0dhbGF4eS5mcmFtZS5hZGQoe3RpdGxlOiJEYXRhIFZpZXdlcjogIitnLm1v
ZGVsPQouZ2V0KCJuYW1lIiksdHlwZToidXJsIixjb250ZW50OmcudXJscy5kaXNwbGF5fSk7aS5w
cmV2ZW50RGVmYXVsdCgpfX19fX1oLmY9CmFJY29uPTNEImZhLWV5ZSI7cmV0dXJuIGZhSWNvbkJ1
dHRvbihoKX0sX3JlbmRlcl9kb3dubG9hZEJ1dHRvbjpmdW5jdGlvbigpez0KaWYodGhpcy5tb2Rl
bC5nZXQoInB1cmdlZCIpfHwhdGhpcy5tb2RlbC5oYXNEYXRhKCkpe3JldHVybiBudWxsfXZhciBo
PTNEdGhpPQpzLnVybHMsaT0zRHRoaXMubW9kZWwuZ2V0KCJtZXRhX2ZpbGVzIik7aWYoXy5pc0Vt
cHR5KGkpKXtyZXR1cm4gJChbJzxhIGhyZWY9Cj0zRCInK2guZG93bmxvYWQrJyIgdGl0bGU9M0Qi
JytkKCJEb3dubG9hZCIpKyciICcsJ2NsYXNzPTNEImljb24tYnRuIGRhdGFzZT0KdC1kb3dubG9h
ZC1idG4iPicsJzxzcGFuIGNsYXNzPTNEImZhIGZhLWZsb3BweS1vIj48L3NwYW4+JywiPC9hPiJd
LmpvaW4oIiIpPQopfXZhciBqPTNEImRhdGFzZXQtIit0aGlzLm1vZGVsLmdldCgiaWQiKSsiLXBv
cHVwIixnPTNEWyc8ZGl2IHBvcHVwbWVudT0zRCI9CicraisnIj4nLCc8YSBocmVmPTNEIicraC5k
b3dubG9hZCsnIj4nLGQoIkRvd25sb2FkIERhdGFzZXQiKSwiPC9hPiIsIjxhPiIrZD0KKCJBZGRp
dGlvbmFsIEZpbGVzIikrIjwvYT4iLF8ubWFwKGksZnVuY3Rpb24oayl7cmV0dXJuWyc8YSBjbGFz
cz0zRCJhY3Rpb24tPQpidXR0b24iIGhyZWY9M0QiJyxoLm1ldGFfZG93bmxvYWQray5maWxlX3R5
cGUsJyI+JyxkKCJEb3dubG9hZCIpLCIgIixrLmZpbGU9Cl90eXBlLCI8L2E+Il0uam9pbigiIil9
KS5qb2luKCJcbiIpLCI8L2Rpdj4iLCc8ZGl2IGNsYXNzPTNEImljb24tYnRuLWdyb3VwIj0KPics
JzxhIGhyZWY9M0QiJytoLmRvd25sb2FkKyciIHRpdGxlPTNEIicrZCgiRG93bmxvYWQiKSsnIiAn
LCdjbGFzcz0zRCJpY29uPQotYnRuIGRhdGFzZXQtZG93bmxvYWQtYnRuIj4nLCc8c3BhbiBjbGFz
cz0zRCJmYSBmYS1mbG9wcHktbyI+PC9zcGFuPicsJzwvYT49CjxhIGNsYXNzPTNEImljb24tYnRu
IHBvcHVwIiBpZD0zRCInK2orJyI+JywnPHNwYW4gY2xhc3M9M0QiZmEgZmEtY2FyZXQtZG93bj0K
Ij48L3NwYW4+JywiPC9hPiIsIjwvZGl2PiJdLmpvaW4oIlxuIik7cmV0dXJuICQoZyl9LF9yZW5k
ZXJfc2hvd1BhcmFtc0J1dHRvPQpuOmZ1bmN0aW9uKCl7cmV0dXJuIGZhSWNvbkJ1dHRvbih7dGl0
bGU6ZCgiVmlldyBkZXRhaWxzIiksY2xhc3NlczoiZGF0YXNldC09CnBhcmFtcy1idG4iLGhyZWY6
dGhpcy51cmxzLnNob3dfcGFyYW1zLHRhcmdldDp0aGlzLmxpbmtUYXJnZXQsZmFJY29uOiJmYS1p
bj0KZm8tY2lyY2xlIn0pfSxfcmVuZGVyX2JvZHk6ZnVuY3Rpb24oKXt2YXIgaD0zRCQoJzxkaXY+
RXJyb3I6IHVua25vd24gZGF0YXNlPQp0IHN0YXRlICInK3RoaXMubW9kZWwuZ2V0KCJzdGF0ZSIp
KyciLjwvZGl2PicpLGc9M0R0aGlzWyJfcmVuZGVyX2JvZHlfIit0aGk9CnMubW9kZWwuZ2V0KCJz
dGF0ZSIpXTtpZihfLmlzRnVuY3Rpb24oZykpe2g9M0RnLmNhbGwodGhpcyl9dGhpcy5fc2V0VXBC
ZWhhdj0KaW9ycyhoKTtpZih0aGlzLmV4cGFuZGVkKXtoLnNob3coKX1yZXR1cm4gaH0sX3JlbmRl
cl9zdGF0ZUJvZHlIZWxwZXI6ZnVuY3RpPQpvbihnLGope2o9M0RqfHxbXTt2YXIgaD0zRHRoaXMs
aT0zRCQoYy50ZW1wbGF0ZXMuYm9keShfLmV4dGVuZCh0aGlzLm1vZGVsLnQ9Cm9KU09OKCkse2Jv
ZHk6Z30pKSk7aS5maW5kKCIuZGF0YXNldC1hY3Rpb25zIC5sZWZ0IikuYXBwZW5kKF8ubWFwKGos
ZnVuY3Rpbz0KbihrKXtyZXR1cm4gay5jYWxsKGgpfSkpO3JldHVybiBpfSxfcmVuZGVyX2JvZHlf
bmV3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuPQpfcmVuZGVyX3N0YXRlQm9keUhlbHBlcigiPGRp
dj4iK2QoIlRoaXMgaXMgYSBuZXcgZGF0YXNldCBhbmQgbm90IGFsbCBvZiBpdHM9CiBkYXRhIGFy
ZSBhdmFpbGFibGUgeWV0IikrIjwvZGl2PiIsdGhpcy5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1dHRv
blJlbmRlcmVycz0KKX0sX3JlbmRlcl9ib2R5X25vUGVybWlzc2lvbjpmdW5jdGlvbigpe3JldHVy
biB0aGlzLl9yZW5kZXJfc3RhdGVCb2R5SGVscGVyPQooIjxkaXY+IitkKCJZb3UgZG8gbm90IGhh
dmUgcGVybWlzc2lvbiB0byB2aWV3IHRoaXMgZGF0YXNldCIpKyI8L2Rpdj4iKX0sX3I9CmVuZGVy
X2JvZHlfZGlzY2FyZGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbmRlcl9zdGF0ZUJvZHlI
ZWxwZXIoIjxkaXY+Ij0KK2QoIlRoZSBqb2IgY3JlYXRpbmcgdGhpcyBkYXRhc2V0IHdhcyBjYW5j
ZWxsZWQgYmVmb3JlIGNvbXBsZXRpb24iKSsiPC9kaXY+PQoiLHRoaXMuZGVmYXVsdFByaW1hcnlB
Y3Rpb25CdXR0b25SZW5kZXJlcnMpfSxfcmVuZGVyX2JvZHlfcXVldWVkOmZ1bmN0aW9uKCk9Cnty
ZXR1cm4gdGhpcy5fcmVuZGVyX3N0YXRlQm9keUhlbHBlcigiPGRpdj4iK2QoIlRoaXMgam9iIGlz
IHdhaXRpbmcgdG8gcnVuIj0KKSsiPC9kaXY+Iix0aGlzLmRlZmF1bHRQcmltYXJ5QWN0aW9uQnV0
dG9uUmVuZGVyZXJzKX0sX3JlbmRlcl9ib2R5X3VwbG9hZDpmPQp1bmN0aW9uKCl7cmV0dXJuIHRo
aXMuX3JlbmRlcl9zdGF0ZUJvZHlIZWxwZXIoIjxkaXY+IitkKCJUaGlzIGRhdGFzZXQgaXMgY3U9
CnJyZW50bHkgdXBsb2FkaW5nIikrIjwvZGl2PiIpfSxfcmVuZGVyX2JvZHlfc2V0dGluZ19tZXRh
ZGF0YTpmdW5jdGlvbigpe3JldD0KdXJuIHRoaXMuX3JlbmRlcl9zdGF0ZUJvZHlIZWxwZXIoIjxk
aXY+IitkKCJNZXRhZGF0YSBpcyBiZWluZyBhdXRvLWRldGVjdGVkPQoiKSsiPC9kaXY+Iil9LF9y
ZW5kZXJfYm9keV9ydW5uaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JlbmRlcl9zdGF0ZUJv
ZHk9CkhlbHBlcigiPGRpdj4iK2QoIlRoaXMgam9iIGlzIGN1cnJlbnRseSBydW5uaW5nIikrIjwv
ZGl2PiIsdGhpcy5kZWZhdWx0UHJpbT0KYXJ5QWN0aW9uQnV0dG9uUmVuZGVyZXJzKX0sX3JlbmRl
cl9ib2R5X3BhdXNlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZW5kPQplcl9zdGF0ZUJvZHlI
ZWxwZXIoIjxkaXY+IitkKCdUaGlzIGpvYiBpcyBwYXVzZWQuIFVzZSB0aGUgIlJlc3VtZSBQYXVz
ZWQgSm89CmJzIiBpbiB0aGUgaGlzdG9yeSBtZW51IHRvIHJlc3VtZScpKyI8L2Rpdj4iLHRoaXMu
ZGVmYXVsdFByaW1hcnlBY3Rpb25CdXR0bz0KblJlbmRlcmVycyl9LF9yZW5kZXJfYm9keV9lcnJv
cjpmdW5jdGlvbigpe3ZhciBnPTNEWyc8c3BhbiBjbGFzcz0zRCJoZWxwLXRlPQp4dCI+JyxkKCJB
biBlcnJvciBvY2N1cnJlZCB3aXRoIHRoaXMgZGF0YXNldCIpLCI6PC9zcGFuPiIsJzxkaXYgY2xh
c3M9M0Qiam89CmItZXJyb3ItdGV4dCI+JywkLnRyaW0odGhpcy5tb2RlbC5nZXQoIm1pc2NfaW5m
byIpKSwiPC9kaXY+Il0uam9pbigiIik7aWYoIT0KdGhpcy5tb2RlbC5nZXQoInB1cmdlZCIpKXtn
PTNEIjxkaXY+Iit0aGlzLm1vZGVsLmdldCgibWlzY19ibHVyYiIpKyI8L2Rpdj4iPQorZ31yZXR1
cm4gdGhpcy5fcmVuZGVyX3N0YXRlQm9keUhlbHBlcihnLFt0aGlzLl9yZW5kZXJfZG93bmxvYWRC
dXR0b25dLmNvbmM9CmF0KHRoaXMuZGVmYXVsdFByaW1hcnlBY3Rpb25CdXR0b25SZW5kZXJlcnMp
KX0sX3JlbmRlcl9ib2R5X2VtcHR5OmZ1bmN0aW9uKD0KKXtyZXR1cm4gdGhpcy5fcmVuZGVyX3N0
YXRlQm9keUhlbHBlcigiPGRpdj4iK2QoIk5vIGRhdGEiKSsiOiA8aT4iK3RoaXMubW9kPQplbC5n
ZXQoIm1pc2NfYmx1cmIiKSsiPC9pPjwvZGl2PiIsdGhpcy5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1
dHRvblJlbmRlcmVycyk9Cn0sX3JlbmRlcl9ib2R5X2ZhaWxlZF9tZXRhZGF0YTpmdW5jdGlvbigp
e3ZhciBnPTNEJCgnPGRpdiBjbGFzcz0zRCJ3YXJuaW5nbT0KZXNzYWdlc21hbGwiPjwvZGl2Picp
LmFwcGVuZCgkKCI8c3Ryb25nLz4iKS50ZXh0KGQoIkFuIGVycm9yIG9jY3VycmVkIHNldHRpPQpu
ZyB0aGUgbWV0YWRhdGEgZm9yIHRoaXMgZGF0YXNldCIpKSksaD0zRHRoaXMuX3JlbmRlcl9ib2R5
X29rKCk7aC5wcmVwZW5kKGc9Cik7cmV0dXJuIGh9LF9yZW5kZXJfYm9keV9vazpmdW5jdGlvbigp
e3ZhciBnPTNEdGhpcyxpPTNEJChjLnRlbXBsYXRlcy5ib2R5KD0KdGhpcy5tb2RlbC50b0pTT04o
KSkpLGg9M0RbdGhpcy5fcmVuZGVyX2Rvd25sb2FkQnV0dG9uXS5jb25jYXQodGhpcy5kZWZhdWx0
PQpQcmltYXJ5QWN0aW9uQnV0dG9uUmVuZGVyZXJzKTtpLmZpbmQoIi5kYXRhc2V0LWFjdGlvbnMg
LmxlZnQiKS5hcHBlbmQoXy5tYXA9CihoLGZ1bmN0aW9uKGope3JldHVybiBqLmNhbGwoZyl9KSk7
aWYodGhpcy5tb2RlbC5pc0RlbGV0ZWRPclB1cmdlZCgpKXtyZXR1cj0KbiBpfXJldHVybiBpfSxl
dmVudHM6eyJjbGljayAuZGF0YXNldC10aXRsZS1iYXIiOiJ0b2dnbGVCb2R5VmlzaWJpbGl0eSIs
ImtlPQp5ZG93biAuZGF0YXNldC10aXRsZS1iYXIiOiJ0b2dnbGVCb2R5VmlzaWJpbGl0eSIsImNs
aWNrIC5kYXRhc2V0LXNlbGVjdG9yIjo9CiJ0b2dnbGVTZWxlY3QifSx0b2dnbGVCb2R5VmlzaWJp
bGl0eTpmdW5jdGlvbihqLGgpe3ZhciBnPTNEMzIsaT0zRDEzO2lmKGomJj0KKGoudHlwZT0zRD0z
RD0zRCJrZXlkb3duIikmJiEoai5rZXlDb2RlPTNEPTNEPTNEZ3x8ai5rZXlDb2RlPTNEPTNEPTNE
aSkpe3JlPQp0dXJuIHRydWV9dmFyIGs9M0R0aGlzLiRlbC5maW5kKCIuZGF0YXNldC1ib2R5Iik7
aD0zRChoPTNEPTNEPTNEdW5kZWZpbmVkKT89Cighay5pcygiOnZpc2libGUiKSk6KGgpO2lmKGgp
e3RoaXMuZXhwYW5kQm9keSgpfWVsc2V7dGhpcy5jb2xsYXBzZUJvZHkoKX1yZT0KdHVybiBmYWxz
ZX0sZXhwYW5kQm9keTpmdW5jdGlvbigpe3ZhciBnPTNEdGhpcztmdW5jdGlvbiBoKCl7Zy4kZWwu
Y2hpbGRyZW4oPQoiLmRhdGFzZXQtYm9keSIpLnJlcGxhY2VXaXRoKGcuX3JlbmRlcl9ib2R5KCkp
O2cuJGVsLmNoaWxkcmVuKCIuZGF0YXNldC1ib2Q9CnkiKS5zbGlkZURvd24oZy5meFNwZWVkLGZ1
bmN0aW9uKCl7Zy5leHBhbmRlZD0zRHRydWU7Zy50cmlnZ2VyKCJib2R5LWV4cGFuZD0KZWQiLGcu
bW9kZWwuZ2V0KCJpZCIpKX0pfWlmKHRoaXMubW9kZWwuaW5SZWFkeVN0YXRlKCkmJiF0aGlzLm1v
ZGVsLmhhc0RldGFpPQpscygpKXt0aGlzLm1vZGVsLmZldGNoKHtzaWxlbnQ6dHJ1ZX0pLmFsd2F5
cyhmdW5jdGlvbihpKXtnLnVybHM9M0RnLm1vZGVsLnU9CnJscygpO2goKX0pfWVsc2V7aCgpfX0s
Y29sbGFwc2VCb2R5OmZ1bmN0aW9uKCl7dmFyIGc9M0R0aGlzO3RoaXMuJGVsLmNoaWxkcj0KZW4o
Ii5kYXRhc2V0LWJvZHkiKS5zbGlkZVVwKGcuZnhTcGVlZCxmdW5jdGlvbigpe2cuZXhwYW5kZWQ9
M0RmYWxzZTtnLnRyaWdnPQplcigiYm9keS1jb2xsYXBzZWQiLGcubW9kZWwuZ2V0KCJpZCIpKX0p
fSxzaG93U2VsZWN0b3I6ZnVuY3Rpb24oKXtpZih0aGlzLnM9CmVsZWN0ZWQpe3RoaXMuc2VsZWN0
KG51bGwsdHJ1ZSl9dGhpcy5zZWxlY3RhYmxlPTNEdHJ1ZTt0aGlzLnRyaWdnZXIoInNlbGVjdD0K
YWJsZSIsdHJ1ZSx0aGlzKTt0aGlzLiQoIi5kYXRhc2V0LXByaW1hcnktYWN0aW9ucyIpLmhpZGUo
KTt0aGlzLiQoIi5kYXRhc2V0PQotc2VsZWN0b3IiKS5zaG93KCl9LGhpZGVTZWxlY3RvcjpmdW5j
dGlvbigpe3RoaXMuc2VsZWN0YWJsZT0zRGZhbHNlO3RoaXMudHI9CmlnZ2VyKCJzZWxlY3RhYmxl
IixmYWxzZSx0aGlzKTt0aGlzLiQoIi5kYXRhc2V0LXNlbGVjdG9yIikuaGlkZSgpO3RoaXMuJCgi
Lj0KZGF0YXNldC1wcmltYXJ5LWFjdGlvbnMiKS5zaG93KCl9LHRvZ2dsZVNlbGVjdG9yOmZ1bmN0
aW9uKCl7aWYoIXRoaXMuJGVsLmZpPQpuZCgiLmRhdGFzZXQtc2VsZWN0b3IiKS5pcygiOnZpc2li
bGUiKSl7dGhpcy5zaG93U2VsZWN0b3IoKX1lbHNle3RoaXMuaGlkZVM9CmVsZWN0b3IoKX19LHNl
bGVjdDpmdW5jdGlvbihnKXt0aGlzLiRlbC5maW5kKCIuZGF0YXNldC1zZWxlY3RvciBzcGFuIiku
cmVtbz0KdmVDbGFzcygiZmEtc3F1YXJlLW8iKS5hZGRDbGFzcygiZmEtY2hlY2stc3F1YXJlLW8i
KTtpZighdGhpcy5zZWxlY3RlZCl7dGhpPQpzLnRyaWdnZXIoInNlbGVjdGVkIix0aGlzKTt0aGlz
LnNlbGVjdGVkPTNEdHJ1ZX1yZXR1cm4gZmFsc2V9LGRlc2VsZWN0OmZ1bmM9CnRpb24oZyl7dGhp
cy4kZWwuZmluZCgiLmRhdGFzZXQtc2VsZWN0b3Igc3BhbiIpLnJlbW92ZUNsYXNzKCJmYS1jaGVj
ay1zcXVhcj0KZS1vIikuYWRkQ2xhc3MoImZhLXNxdWFyZS1vIik7aWYodGhpcy5zZWxlY3RlZCl7
dGhpcy50cmlnZ2VyKCJkZS1zZWxlY3RlZCIsPQp0aGlzKTt0aGlzLnNlbGVjdGVkPTNEZmFsc2V9
cmV0dXJuIGZhbHNlfSx0b2dnbGVTZWxlY3Q6ZnVuY3Rpb24oZyl7aWYodGhpcy49CnNlbGVjdGVk
KXt0aGlzLmRlc2VsZWN0KGcpfWVsc2V7dGhpcy5zZWxlY3QoZyl9fSxkcmFnZ2FibGVPbjpmdW5j
dGlvbigpe3RoaT0Kcy5kcmFnZ2FibGU9M0R0cnVlO3RoaXMuZHJhZ1N0YXJ0SGFuZGxlcj0zRF8u
YmluZCh0aGlzLl9kcmFnU3RhcnRIYW5kbGVyLHRoPQppcyk7dGhpcy5kcmFnRW5kSGFuZGxlcj0z
RF8uYmluZCh0aGlzLl9kcmFnRW5kSGFuZGxlcix0aGlzKTt2YXIgZz0zRHRoaXMuJGU9CmwuZmlu
ZCgiLmRhdGFzZXQtdGl0bGUtYmFyIikuYXR0cigiZHJhZ2dhYmxlIix0cnVlKS5nZXQoMCk7Zy5h
ZGRFdmVudExpc3Rlbj0KZXIoImRyYWdzdGFydCIsdGhpcy5kcmFnU3RhcnRIYW5kbGVyLGZhbHNl
KTtnLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdlbmQiLHRoPQppcy5kcmFnRW5kSGFuZGxlcixmYWxz
ZSl9LGRyYWdnYWJsZU9mZjpmdW5jdGlvbigpe3RoaXMuZHJhZ2dhYmxlPTNEZmFsc2U7dmE9CnIg
Zz0zRHRoaXMuJGVsLmZpbmQoIi5kYXRhc2V0LXRpdGxlLWJhciIpLmF0dHIoImRyYWdnYWJsZSIs
ZmFsc2UpLmdldCgwKTtnLj0KcmVtb3ZlRXZlbnRMaXN0ZW5lcigiZHJhZ3N0YXJ0Iix0aGlzLmRy
YWdTdGFydEhhbmRsZXIsZmFsc2UpO2cucmVtb3ZlRXZlbnRMPQppc3RlbmVyKCJkcmFnZW5kIix0
aGlzLmRyYWdFbmRIYW5kbGVyLGZhbHNlKX0sdG9nZ2xlRHJhZ2dhYmxlOmZ1bmN0aW9uKCl7aWY9
Cih0aGlzLmRyYWdnYWJsZSl7dGhpcy5kcmFnZ2FibGVPZmYoKX1lbHNle3RoaXMuZHJhZ2dhYmxl
T24oKX19LF9kcmFnU3RhcnRIYT0KbmRsZXI6ZnVuY3Rpb24oZyl7dGhpcy50cmlnZ2VyKCJkcmFn
c3RhcnQiLHRoaXMpO2cuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93PQplZD0zRCJtb3ZlIjtnLmRh
dGFUcmFuc2Zlci5zZXREYXRhKCJ0ZXh0IixKU09OLnN0cmluZ2lmeSh0aGlzLm1vZGVsLnRvSlNP
Tig9CikpKTtyZXR1cm4gZmFsc2V9LF9kcmFnRW5kSGFuZGxlcjpmdW5jdGlvbihnKXt0aGlzLnRy
aWdnZXIoImRyYWdlbmQiLHRoaXMpOz0KcmV0dXJuIGZhbHNlfSxyZW1vdmU6ZnVuY3Rpb24oaCl7
dmFyIGc9M0R0aGlzO3RoaXMuJGVsLmZhZGVPdXQoZy5meFNwZWVkLGZ1PQpuY3Rpb24oKXtnLiRl
bC5yZW1vdmUoKTtnLm9mZigpO2lmKGgpe2goKX19KX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIg
Zz0zRCg9CnRoaXMubW9kZWwpPyh0aGlzLm1vZGVsKyIiKTooIihubyBtb2RlbCkiKTtyZXR1cm4i
SERBQmFzZVZpZXcoIitnKyIpIn19KTt2YT0KciBhPTNEWyc8ZGl2IGNsYXNzPTNEImRhdGFzZXQg
aGRhIj4nLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtd2FybmluZ3MiPicsIjwlPQogaWYoIGhkYS5l
cnJvciApeyAlPiIsJzxkaXYgY2xhc3M9M0QiZXJyb3JtZXNzYWdlc21hbGwiPicsZCgiVGhlcmUg
d2FzIGFuIGU9CnJyb3IgZ2V0dGluZyB0aGUgZGF0YSBmb3IgdGhpcyBkYXRhc2V0IiksIjo8JS0g
aGRhLmVycm9yICU+IiwiPC9kaXY+IiwiPCUgfT0KICU+IiwiPCUgaWYoIGhkYS5kZWxldGVkICl7
ICU+IiwiPCUgaWYoIGhkYS5wdXJnZWQgKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImRhPQp0YXNldC1w
dXJnZWQtbXNnIHdhcm5pbmdtZXNzYWdlc21hbGwiPjxzdHJvbmc+JyxkKCJUaGlzIGRhdGFzZXQg
aGFzIGJlZW4gZGU9CmxldGVkIGFuZCByZW1vdmVkIGZyb20gZGlzay4iKSwiPC9zdHJvbmc+PC9k
aXY+IiwiPCUgfSBlbHNlIHsgJT4iLCc8ZGl2IGNsYT0Kc3M9M0QiZGF0YXNldC1kZWxldGVkLW1z
ZyB3YXJuaW5nbWVzc2FnZXNtYWxsIj48c3Ryb25nPicsZCgiVGhpcyBkYXRhc2V0IGhhPQpzIGJl
ZW4gZGVsZXRlZC4iKSwiPC9zdHJvbmc+PC9kaXY+IiwiPCUgfSAlPiIsIjwlIH0gJT4iLCI8JSBp
ZiggIWhkYS52aXNpYmw9CmUgKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtaGlkZGVuLW1z
ZyB3YXJuaW5nbWVzc2FnZXNtYWxsIj48c3Ryb25nPicsZD0KKCJUaGlzIGRhdGFzZXQgaGFzIGJl
ZW4gaGlkZGVuLiIpLCI8L3N0cm9uZz48L2Rpdj4iLCI8JSB9ICU+IiwiPC9kaXY+IiwnPGRpPQp2
IGNsYXNzPTNEImRhdGFzZXQtc2VsZWN0b3IiPicsJzxzcGFuIGNsYXNzPTNEImZhIGZhLTJ4IGZh
LXNxdWFyZS1vIj48L3NwYW49Cj4nLCI8L2Rpdj4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtcHJp
bWFyeS1hY3Rpb25zIj48L2Rpdj4nLCc8ZGl2IGNsYXNzPTNEIj0KZGF0YXNldC10aXRsZS1iYXIg
Y2xlYXIiIHRhYmluZGV4PTNEIjAiPicsJzxzcGFuIGNsYXNzPTNEImRhdGFzZXQtc3RhdGUtaWNv
PQpuIHN0YXRlLWljb24iPjwvc3Bhbj4nLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtdGl0bGUiPics
JzxzcGFuIGNsYXNzPTNEImhkYS09CmhpZCI+PCUtIGhkYS5oaWQgJT48L3NwYW4+ICcsJzxzcGFu
IGNsYXNzPTNEImRhdGFzZXQtbmFtZSI+PCUtIGhkYS5uYW1lICU+PD0KL3NwYW4+JywiPC9kaXY+
IiwiPC9kaXY+IiwnPGRpdiBjbGFzcz0zRCJkYXRhc2V0LWJvZHkiPjwvZGl2PicsIjwvZGl2PiJd
LmpvPQppbigiIik7dmFyIGY9M0RbJzxkaXYgY2xhc3M9M0QiZGF0YXNldC1ib2R5Ij4nLCI8JSBp
ZiggaGRhLmJvZHkgKXsgJT4iLCc8ZGk9CnYgY2xhc3M9M0QiZGF0YXNldC1zdW1tYXJ5Ij4nLCI8
JT0zRCBoZGEuYm9keSAlPiIsIjwvZGl2PiIsJzxkaXYgY2xhc3M9M0QiZD0KYXRhc2V0LWFjdGlv
bnMgY2xlYXIiPicsJzxkaXYgY2xhc3M9M0QibGVmdCI+PC9kaXY+JywnPGRpdiBjbGFzcz0zRCJy
aWdodCI+PQo8L2Rpdj4nLCI8L2Rpdj4iLCI8JSB9IGVsc2UgeyAlPiIsJzxkaXYgY2xhc3M9M0Qi
ZGF0YXNldC1zdW1tYXJ5Ij4nLCI8JSBpZig9CiBoZGEubWlzY19ibHVyYiApeyAlPiIsJzxkaXYg
Y2xhc3M9M0QiZGF0YXNldC1ibHVyYiI+JywnPHNwYW4gY2xhc3M9M0QidmFsdT0KZSI+PCUtIGhk
YS5taXNjX2JsdXJiICU+PC9zcGFuPicsIjwvZGl2PiIsIjwlIH0gJT4iLCI8JSBpZiggaGRhLmRh
dGFfdHlwZSApPQp7ICU+IiwnPGRpdiBjbGFzcz0zRCJkYXRhc2V0LWRhdGF0eXBlIj4nLCc8bGFi
ZWwgY2xhc3M9M0QicHJvbXB0Ij4nLGQoImZvcm09CmF0IiksIjwvbGFiZWw+IiwnPHNwYW4gY2xh
c3M9M0QidmFsdWUiPjwlLSBoZGEuZGF0YV90eXBlICU+PC9zcGFuPicsIjwvZGl2Pj0KIiwiPCUg
fSAlPiIsIjwlIGlmKCBoZGEubWV0YWRhdGFfZGJrZXkgKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImRh
dGFzZXQtZGJrZXkiPQo+JywnPGxhYmVsIGNsYXNzPTNEInByb21wdCI+JyxkKCJkYXRhYmFzZSIp
LCI8L2xhYmVsPiIsJzxzcGFuIGNsYXNzPTNEInZhbHU9CmUiPicsIjwlLSBoZGEubWV0YWRhdGFf
ZGJrZXkgJT4iLCI8L3NwYW4+IiwiPC9kaXY+IiwiPCUgfSAlPiIsIjwlIGlmKCBoZGEubT0KaXNj
X2luZm8gKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImRhdGFzZXQtaW5mbyI+JywnPHNwYW4gY2xhc3M9
M0QidmFsdWUiPjwlLSBoPQpkYS5taXNjX2luZm8gJT48L3NwYW4+JywiPC9kaXY+IiwiPCUgfSAl
PiIsIjwvZGl2PiIsJzxkaXYgY2xhc3M9M0QiZGF0YXNldC09CmFjdGlvbnMgY2xlYXIiPicsJzxk
aXYgY2xhc3M9M0QibGVmdCI+PC9kaXY+JywnPGRpdiBjbGFzcz0zRCJyaWdodCI+PC9kaXY+Jz0K
LCI8L2Rpdj4iLCI8JSBpZiggIWhkYS5kZWxldGVkICl7ICU+IiwnPGRpdiBjbGFzcz0zRCJ0YWdz
LWRpc3BsYXkiPjwvZGl2PicsPQonPGRpdiBjbGFzcz0zRCJhbm5vdGF0aW9uLWRpc3BsYXkiPjwv
ZGl2PicsJzxkaXYgY2xhc3M9M0QiZGF0YXNldC1kaXNwbGF5LWE9CnBwbGljYXRpb25zIj4nLCI8
JSBfLmVhY2goIGhkYS5kaXNwbGF5X2FwcHMsIGZ1bmN0aW9uKCBhcHAgKXsgJT4iLCc8ZGl2IGNs
YT0Kc3M9M0QiZGlzcGxheS1hcHBsaWNhdGlvbiI+JywnPHNwYW4gY2xhc3M9M0QiZGlzcGxheS1h
cHBsaWNhdGlvbi1sb2NhdGlvbiI+PQo8JS0gYXBwLmxhYmVsICU+PC9zcGFuPiAnLCc8c3BhbiBj
bGFzcz0zRCJkaXNwbGF5LWFwcGxpY2F0aW9uLWxpbmtzIj4nLCI8JSA9Cl8uZWFjaCggYXBwLmxp
bmtzLCBmdW5jdGlvbiggbGluayApeyAlPiIsJzxhIHRhcmdldD0zRCI8JT0zRCBsaW5rLnRhcmdl
dCAlPj0KIiBocmVmPTNEIjwlPTNEIGxpbmsuaHJlZiAlPiI+JywiPCUgcHJpbnQoIF9sKCBsaW5r
LnRleHQgKSApOyAlPiIsIjwvYT4gIiwiPQo8JSB9KTsgJT4iLCI8L3NwYW4+IiwiPC9kaXY+Iiwi
PCUgfSk7ICU+IiwiPCUgXy5lYWNoKCBoZGEuZGlzcGxheV90eXBlcywgZnU9Cm5jdGlvbiggYXBw
ICl7ICU+IiwnPGRpdiBjbGFzcz0zRCJkaXNwbGF5LWFwcGxpY2F0aW9uIj4nLCc8c3BhbiBjbGFz
cz0zRCJkaT0Kc3BsYXktYXBwbGljYXRpb24tbG9jYXRpb24iPjwlLSBhcHAubGFiZWwgJT48L3Nw
YW4+ICcsJzxzcGFuIGNsYXNzPTNEImRpc3BsPQpheS1hcHBsaWNhdGlvbi1saW5rcyI+JywiPCUg
Xy5lYWNoKCBhcHAubGlua3MsIGZ1bmN0aW9uKCBsaW5rICl7ICU+IiwnPGEgdGE9CnJnZXQ9M0Qi
PCU9M0QgbGluay50YXJnZXQgJT4iIGhyZWY9M0QiPCU9M0QgbGluay5ocmVmICU+Ij4nLCI8JSBw
cmludCggX2woID0KbGluay50ZXh0ICkgKTsgJT4iLCI8L2E+ICIsIjwlIH0pOyAlPiIsIjwvc3Bh
bj4iLCI8L2Rpdj4iLCI8JSB9KTsgJT4iLCI8L2RpPQp2PiIsJzxkaXYgY2xhc3M9M0QiZGF0YXNl
dC1wZWVrIj4nLCI8JSBpZiggaGRhLnBlZWsgKXsgJT4iLCc8cHJlIGNsYXNzPTNEInA9CmVlayI+
PCU9M0QgaGRhLnBlZWsgJT48L3ByZT4nLCI8JSB9ICU+IiwiPC9kaXY+IiwiPCUgfSAlPiIsIjwl
IH0gJT4iLCI8L2Rpdj0KPiJdLmpvaW4oIiIpO2MudGVtcGxhdGVzPTNEe3NrZWxldG9uOmZ1bmN0
aW9uKGcpe3JldHVybiBfLnRlbXBsYXRlKGEsZyx7dmFyPQppYWJsZToiaGRhIn0pfSxib2R5OmZ1
bmN0aW9uKGcpe3JldHVybiBfLnRlbXBsYXRlKGYsZyx7dmFyaWFibGU6ImhkYSJ9KX19O3I9CmV0
dXJue0hEQUJhc2VWaWV3OmN9fSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQoKZGlmZiAt
ciA4MzQ2ZWM0YmFhMzk5MmY0ZGMwMTYxZjBmYzc5YTBiYTg5M2MwYTYzIC1yIGRjYzBjMTkxNDdl
YWQ4NmM2ZTM1N2M3PQozOWUwNTEzYWRkZmUwMmNiMiBzdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZj
L2RhdGFzZXQvaGRhLWVkaXQuanMKLS0tIGEvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9kYXRh
c2V0L2hkYS1lZGl0LmpzCisrKyBiL3N0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMvZGF0YXNldC9o
ZGEtZWRpdC5qcwpAQCAtMSwxICsxLDEgQEAKLWRlZmluZShbIm12Yy9kYXRhc2V0L2hkYS1tb2Rl
bCIsIm12Yy9kYXRhc2V0L2hkYS1iYXNlIiwibXZjL3RhZ3MiLCJtdmMvYW5uPQpvdGF0aW9ucyJd
LGZ1bmN0aW9uKGYsYixhLGUpe3ZhciBnPTNEYi5IREFCYXNlVmlldy5leHRlbmQoe2luaXRpYWxp
emU6ZnVuY3Q9CmlvbihoKXtiLkhEQUJhc2VWaWV3LnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwo
dGhpcyxoKTt0aGlzLmhhc1VzZXI9M0RoLmhhcz0KVXNlcjt0aGlzLmRlZmF1bHRQcmltYXJ5QWN0
aW9uQnV0dG9uUmVuZGVyZXJzPTNEW3RoaXMuX3JlbmRlcl9zaG93UGFyYW1zQnV0PQp0b24sdGhp
cy5fcmVuZGVyX3JlcnVuQnV0dG9uXTt0aGlzLnRhZ3NFZGl0b3JTaG93bj0zRGgudGFnc0VkaXRv
clNob3dufHxmYWw9CnNlO3RoaXMuYW5ub3RhdGlvbkVkaXRvclNob3duPTNEaC5hbm5vdGF0aW9u
RWRpdG9yU2hvd258fGZhbHNlfSxfcmVuZGVyX3RpdD0KbGVCdXR0b25zOmZ1bmN0aW9uKCl7cmV0
dXJuIGIuSERBQmFzZVZpZXcucHJvdG90eXBlLl9yZW5kZXJfdGl0bGVCdXR0b25zLmNhPQpsbCh0
aGlzKS5jb25jYXQoW3RoaXMuX3JlbmRlcl9lZGl0QnV0dG9uKCksdGhpcy5fcmVuZGVyX2RlbGV0
ZUJ1dHRvbigpXSl9LF89CnJlbmRlcl9lZGl0QnV0dG9uOmZ1bmN0aW9uKCl7aWYoKHRoaXMubW9k
ZWwuZ2V0KCJzdGF0ZSIpPTNEPTNEPTNEZi5IaXN0b3J5RD0KYXRhc2V0QXNzb2NpYXRpb24uU1RB
VEVTLkRJU0NBUkRFRCl8fCh0aGlzLm1vZGVsLmdldCgic3RhdGUiKT0zRD0zRD0zRGYuSGlzPQp0
b3J5RGF0YXNldEFzc29jaWF0aW9uLlNUQVRFUy5OT1RfVklFV0FCTEUpfHwoIXRoaXMubW9kZWwu
Z2V0KCJhY2Nlc3NpYmxlIik9Cikpe3JldHVybiBudWxsfXZhciBqPTNEdGhpcy5tb2RlbC5nZXQo
InB1cmdlZCIpLGg9M0R0aGlzLm1vZGVsLmdldCgiZGVsZXRlZD0KIiksaT0zRHt0aXRsZTpfbCgi
RWRpdCBhdHRyaWJ1dGVzIiksaHJlZjp0aGlzLnVybHMuZWRpdCx0YXJnZXQ6dGhpcy5saW5rVGFy
PQpnZXQsY2xhc3NlczoiZGF0YXNldC1lZGl0In07aWYoaHx8ail7aS5kaXNhYmxlZD0zRHRydWU7
aWYoail7aS50aXRsZT0zRF9sKCI9CkNhbm5vdCBlZGl0IGF0dHJpYnV0ZXMgb2YgZGF0YXNldHMg
cmVtb3ZlZCBmcm9tIGRpc2siKX1lbHNle2lmKGgpe2kudGl0bGU9Cj0zRF9sKCJVbmRlbGV0ZSBk
YXRhc2V0IHRvIGVkaXQgYXR0cmlidXRlcyIpfX19ZWxzZXtpZih0aGlzLm1vZGVsLmdldCgic3Rh
dD0KZSIpPTNEPTNEPTNEZi5IaXN0b3J5RGF0YXNldEFzc29jaWF0aW9uLlNUQVRFUy5VUExPQUQp
e2kuZGlzYWJsZWQ9M0R0cnVlO2kuPQp0aXRsZT0zRF9sKCJUaGlzIGRhdGFzZXQgbXVzdCBmaW5p
c2ggdXBsb2FkaW5nIGJlZm9yZSBpdCBjYW4gYmUgZWRpdGVkIil9ZWw9CnNle2lmKHRoaXMubW9k
ZWwuZ2V0KCJzdGF0ZSIpPTNEPTNEPTNEZi5IaXN0b3J5RGF0YXNldEFzc29jaWF0aW9uLlNUQVRF
Uy5ORT0KVyl7aS5kaXNhYmxlZD0zRHRydWU7aS50aXRsZT0zRF9sKCJUaGlzIGRhdGFzZXQgaXMg
bm90IHlldCBlZGl0YWJsZSIpfX19aS5mPQphSWNvbj0zRCJmYS1wZW5jaWwiO3JldHVybiBmYUlj
b25CdXR0b24oaSl9LF9yZW5kZXJfZGVsZXRlQnV0dG9uOmZ1bmN0aW9uKCk9CntpZigodGhpcy5t
b2RlbC5nZXQoInN0YXRlIik9M0Q9M0Q9M0RmLkhpc3RvcnlEYXRhc2V0QXNzb2NpYXRpb24uU1RB
VEVTLk5PVD0KX1ZJRVdBQkxFKXx8KCF0aGlzLm1vZGVsLmdldCgiYWNjZXNzaWJsZSIpKSl7cmV0
dXJuIG51bGx9dmFyIGg9M0R0aGlzLGk9M0R7PQp0aXRsZTpfbCgiRGVsZXRlIiksY2xhc3Nlczoi
ZGF0YXNldC1kZWxldGUiLG9uY2xpY2s6ZnVuY3Rpb24oKXtoLiRlbC5maW5kKCI9Ci5pY29uLWJ0
bi5kYXRhc2V0LWRlbGV0ZSIpLnRyaWdnZXIoIm1vdXNlb3V0Iik7aC5tb2RlbFsiZGVsZXRlIl0o
KX19O2lmKHRoaT0Kcy5tb2RlbC5nZXQoImRlbGV0ZWQiKXx8dGhpcy5tb2RlbC5nZXQoInB1cmdl
ZCIpKXtpPTNEe3RpdGxlOl9sKCJEYXRhc2V0IGlzPQogYWxyZWFkeSBkZWxldGVkIiksZGlzYWJs
ZWQ6dHJ1ZX19aS5mYUljb249M0QiZmEtdGltZXMiO3JldHVybiBmYUljb25CdXR0b249CihpKX0s
X3JlbmRlcl9lcnJCdXR0b246ZnVuY3Rpb24oKXtpZih0aGlzLm1vZGVsLmdldCgic3RhdGUiKSE9
M0Q9M0RmLkhpc3Rvcj0KeURhdGFzZXRBc3NvY2lhdGlvbi5TVEFURVMuRVJST1Ipe3JldHVybiBu
dWxsfXJldHVybiBmYUljb25CdXR0b24oe3RpdGxlOl9sPQooIlZpZXcgb3IgcmVwb3J0IHRoaXMg
ZXJyb3IiKSxocmVmOnRoaXMudXJscy5yZXBvcnRfZXJyb3IsY2xhc3NlczoiZGF0YXNldC09CnJl
cG9ydC1lcnJvci1idG4iLHRhcmdldDp0aGlzLmxpbmtUYXJnZXQsZmFJY29uOiJmYS1idWcifSl9
LF9yZW5kZXJfcmVydW5CdT0KdHRvbjpmdW5jdGlvbigpe3JldHVybiBmYUljb25CdXR0b24oe3Rp
dGxlOl9sKCJSdW4gdGhpcyBqb2IgYWdhaW4iKSxocmVmOnRoPQppcy51cmxzLnJlcnVuLGNsYXNz
ZXM6ImRhdGFzZXQtcmVydW4tYnRuIix0YXJnZXQ6dGhpcy5saW5rVGFyZ2V0LGZhSWNvbjoiZmE9
Ci1yZWZyZXNoIn0pfSxfcmVuZGVyX3Zpc3VhbGl6YXRpb25zQnV0dG9uOmZ1bmN0aW9uKCl7dmFy
IGg9M0R0aGlzLm1vZGVsLmdldD0KKCJ2aXN1YWxpemF0aW9ucyIpO2lmKCghdGhpcy5oYXNVc2Vy
KXx8KCF0aGlzLm1vZGVsLmhhc0RhdGEoKSl8fChfLmlzRW1wdHkoPQpoKSkpe3JldHVybiBudWxs
fWlmKF8uaXNPYmplY3QoaFswXSkpe3JldHVybiB0aGlzLl9yZW5kZXJfdmlzdWFsaXphdGlvbnNG
cmE9Cm1ld29ya0J1dHRvbihoKX1pZighdGhpcy51cmxzLnZpc3VhbGl6YXRpb24pe3JldHVybiBu
dWxsfXZhciBqPTNEdGhpcy5tb2RlbD0KLmdldCgiZGJrZXkiKSxuPTNEdGhpcy51cmxzLnZpc3Vh
bGl6YXRpb24saz0zRHt9LG89M0R7ZGF0YXNldF9pZDp0aGlzLm1vZGVsPQouZ2V0KCJpZCIpLGhk
YV9sZGRhOiJoZGEifTtpZihqKXtvLmRia2V5PTNEan12YXIgaT0zRGZhSWNvbkJ1dHRvbih7dGl0
bGU6X2w9CigiVmlzdWFsaXplIiksY2xhc3NlczoiZGF0YXNldC12aXN1YWxpemUtYnRuIixmYUlj
b246ImZhLWJhci1jaGFydC1vIn0pO2Z1bj0KY3Rpb24gbChwKXtpZihwPTNEPTNEPTNEInRyYWNr
c3RlciIpe3JldHVybiBjKG4sbyxqKX1yZXR1cm4gZnVuY3Rpb24oKXtHYWxhPQp4eS5mcmFtZS5h
ZGQoe3RpdGxlOiJWaXN1YWxpemF0aW9uIix0eXBlOiJ1cmwiLGNvbnRlbnQ6bisiLyIrcCsiPyIr
JC5wYXJhbSg9Cm8pfSl9fWZ1bmN0aW9uIG0ocCl7cmV0dXJuIHAuY2hhckF0KDApLnRvVXBwZXJD
YXNlKCkrcC5zbGljZSgxKX1pZihoLmxlbmd0aD0KPTNEPTNEPTNEMSl7aS5hdHRyKCJkYXRhLW9y
aWdpbmFsLXRpdGxlIixfbCgiVmlzdWFsaXplIGluICIpK19sKG0oaFswXSkpKTtpPQouY2xpY2so
bChoWzBdKSl9ZWxzZXtfLmVhY2goaCxmdW5jdGlvbihwKXtrW19sKG0ocCkpXT0zRGwocCl9KTtt
YWtlX3BvcHVwbWU9Cm51KGksayl9cmV0dXJuIGl9LF9yZW5kZXJfdmlzdWFsaXphdGlvbnNGcmFt
ZXdvcmtCdXR0b246ZnVuY3Rpb24oaCl7aWYoISh0aD0KaXMubW9kZWwuaGFzRGF0YSgpKXx8ISho
JiYhXy5pc0VtcHR5KGgpKSl7cmV0dXJuIG51bGx9dmFyIGo9M0RmYUljb25CdXR0b24oPQp7dGl0
bGU6X2woIlZpc3VhbGl6ZSIpLGNsYXNzZXM6ImRhdGFzZXQtdmlzdWFsaXplLWJ0biIsZmFJY29u
OiJmYS1iYXItY2hhcnQ9Ci1vIn0pO2lmKGgubGVuZ3RoPTNEPTNEPTNEMSl7dmFyIGk9M0RoWzBd
O2ouYXR0cigiZGF0YS1vcmlnaW5hbC10aXRsZSIsX2woIj0KVmlzdWFsaXplIGluICIpK2kuaHRt
bCk7ai5hdHRyKCJocmVmIixpLmhyZWYpfWVsc2V7dmFyIGs9M0RbXTtfLmVhY2goaCxmdW5jPQp0
aW9uKGwpe2wuZnVuYz0zRGZ1bmN0aW9uKG0pe2lmKEdhbGF4eS5mcmFtZSYmR2FsYXh5LmZyYW1l
LmFjdGl2ZSl7R2FsYXh5LmY9CnJhbWUuYWRkKHt0aXRsZToiVmlzdWFsaXphdGlvbiIsdHlwZToi
dXJsIixjb250ZW50OmwuaHJlZn0pO20ucHJldmVudERlZmF1bD0KdCgpO3JldHVybiBmYWxzZX1y
ZXR1cm4gdHJ1ZX07ay5wdXNoKGwpO3JldHVybiBmYWxzZX0pO1BvcHVwTWVudS5jcmVhdGUoaixr
PQopfXJldHVybiBqfSxfYnVpbGROZXdSZW5kZXI6ZnVuY3Rpb24oKXt2YXIgaD0zRGIuSERBQmFz
ZVZpZXcucHJvdG90eXBlLl9idWk9CmxkTmV3UmVuZGVyLmNhbGwodGhpcyk7aC5maW5kKCIuZGF0
YXNldC1kZWxldGVkLW1zZyIpLmFwcGVuZChfbCgnIENsaWNrIDxhID0KaHJlZj0zRCJqYXZhc2Ny
aXB0OnZvaWQoMCk7IiBjbGFzcz0zRCJkYXRhc2V0LXVuZGVsZXRlIj5oZXJlPC9hPiB0byB1bmRl
bGV0PQplIGl0IG9yIDxhIGhyZWY9M0QiamF2YXNjcmlwdDp2b2lkKDApOyIgY2xhc3M9M0QiZGF0
YXNldC1wdXJnZSI+aGVyZTwvYT4gdG89CiBpbW1lZGlhdGVseSByZW1vdmUgaXQgZnJvbSBkaXNr
JykpO2guZmluZCgiLmRhdGFzZXQtaGlkZGVuLW1zZyIpLmFwcGVuZChfbD0KKCcgQ2xpY2sgPGEg
aHJlZj0zRCJqYXZhc2NyaXB0OnZvaWQoMCk7IiBjbGFzcz0zRCJkYXRhc2V0LXVuaGlkZSI+aGVy
ZTwvYT4gPQp0byB1bmhpZGUgaXQnKSk7cmV0dXJuIGh9LF9yZW5kZXJfYm9keV9mYWlsZWRfbWV0
YWRhdGE6ZnVuY3Rpb24oKXt2YXIgaT0zRCQ9CigiPGEvPiIpLmF0dHIoe2hyZWY6dGhpcy51cmxz
LmVkaXQsdGFyZ2V0OnRoaXMubGlua1RhcmdldH0pLnRleHQoX2woInNldCBpdD0KIG1hbnVhbGx5
IG9yIHJldHJ5IGF1dG8tZGV0ZWN0aW9uIikpLGg9M0QkKCI8c3Bhbi8+IikudGV4dCgiLiAiK19s
KCJZb3UgbWF5PQogYmUgYWJsZSB0byIpKyIgIikuYXBwZW5kKGkpLGo9M0RiLkhEQUJhc2VWaWV3
LnByb3RvdHlwZS5fcmVuZGVyX2JvZHlfZmFpbGU9CmRfbWV0YWRhdGEuY2FsbCh0aGlzKTtqLmZp
bmQoIi53YXJuaW5nbWVzc2FnZXNtYWxsIHN0cm9uZyIpLmFwcGVuZChoKTtyZXR1cj0KbiBqfSxf
cmVuZGVyX2JvZHlfZXJyb3I6ZnVuY3Rpb24oKXt2YXIgaD0zRGIuSERBQmFzZVZpZXcucHJvdG90
eXBlLl9yZW5kZXJfPQpib2R5X2Vycm9yLmNhbGwodGhpcyk7aC5maW5kKCIuZGF0YXNldC1hY3Rp
b25zIC5sZWZ0IikucHJlcGVuZCh0aGlzLl9yZW5kZXI9Cl9lcnJCdXR0b24oKSk7cmV0dXJuIGh9
LF9yZW5kZXJfYm9keV9vazpmdW5jdGlvbigpe3ZhciBoPTNEYi5IREFCYXNlVmlldy5wcj0Kb3Rv
dHlwZS5fcmVuZGVyX2JvZHlfb2suY2FsbCh0aGlzKTtpZih0aGlzLm1vZGVsLmlzRGVsZXRlZE9y
UHVyZ2VkKCkpe3JldHVyPQpuIGh9dGhpcy5tYWtlRGJrZXlFZGl0TGluayhoKTtpZih0aGlzLmhh
c1VzZXIpe2guZmluZCgiLmRhdGFzZXQtYWN0aW9ucyAubGU9CmZ0IikuYXBwZW5kKHRoaXMuX3Jl
bmRlcl92aXN1YWxpemF0aW9uc0J1dHRvbigpKTt0aGlzLl9yZW5kZXJUYWdzKGgpO3RoaXMuXz0K
cmVuZGVyQW5ub3RhdGlvbihoKX1yZXR1cm4gaH0sX3JlbmRlclRhZ3M6ZnVuY3Rpb24oaCl7dmFy
IGk9M0R0aGlzO3RoaXMudGFnPQpzRWRpdG9yPTNEbmV3IGEuVGFnc0VkaXRvcih7bW9kZWw6dGhp
cy5tb2RlbCxlbDpoLmZpbmQoIi50YWdzLWRpc3BsYXkiKSxvbnM9Cmhvd0ZpcnN0VGltZTpmdW5j
dGlvbigpe3RoaXMucmVuZGVyKCl9LG9uc2hvdzpmdW5jdGlvbigpe2kudGFnc0VkaXRvclNob3du
PQo9M0R0cnVlfSxvbmhpZGU6ZnVuY3Rpb24oKXtpLnRhZ3NFZGl0b3JTaG93bj0zRGZhbHNlfSwk
YWN0aXZhdG9yOmZhSWNvbkJ1dHQ9Cm9uKHt0aXRsZTpfbCgiRWRpdCBkYXRhc2V0IHRhZ3MiKSxj
bGFzc2VzOiJkYXRhc2V0LXRhZy1idG4iLGZhSWNvbjoiZmEtdGFncz0KIn0pLmFwcGVuZFRvKGgu
ZmluZCgiLmRhdGFzZXQtYWN0aW9ucyAucmlnaHQiKSl9KTtpZih0aGlzLnRhZ3NFZGl0b3JTaG93
bil7PQp0aGlzLnRhZ3NFZGl0b3IudG9nZ2xlKHRydWUpfX0sX3JlbmRlckFubm90YXRpb246ZnVu
Y3Rpb24oaCl7dmFyIGk9M0R0aGlzO3Q9Cmhpcy5hbm5vdGF0aW9uRWRpdG9yPTNEbmV3IGUuQW5u
b3RhdGlvbkVkaXRvcih7bW9kZWw6dGhpcy5tb2RlbCxlbDpoLmZpbmQoIj0KLmFubm90YXRpb24t
ZGlzcGxheSIpLG9uc2hvd0ZpcnN0VGltZTpmdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9LG9uc2hv
dzpmdW5jPQp0aW9uKCl7aS5hbm5vdGF0aW9uRWRpdG9yU2hvd249M0R0cnVlfSxvbmhpZGU6ZnVu
Y3Rpb24oKXtpLmFubm90YXRpb25FZGl0b3I9ClNob3duPTNEZmFsc2V9LCRhY3RpdmF0b3I6ZmFJ
Y29uQnV0dG9uKHt0aXRsZTpfbCgiRWRpdCBkYXRhc2V0IGFubm90YXRpb24iKT0KLGNsYXNzZXM6
ImRhdGFzZXQtYW5ub3RhdGUtYnRuIixmYUljb246ImZhLWNvbW1lbnQifSkuYXBwZW5kVG8oaC5m
aW5kKCIuZGF0PQphc2V0LWFjdGlvbnMgLnJpZ2h0IikpfSk7aWYodGhpcy5hbm5vdGF0aW9uRWRp
dG9yU2hvd24pe3RoaXMuYW5ub3RhdGlvbkVkaXQ9Cm9yLnRvZ2dsZSh0cnVlKX19LG1ha2VEYmtl
eUVkaXRMaW5rOmZ1bmN0aW9uKGkpe2lmKHRoaXMubW9kZWwuZ2V0KCJtZXRhZGF0YT0KX2Ria2V5
Iik9M0Q9M0Q9M0QiPyImJiF0aGlzLm1vZGVsLmlzRGVsZXRlZE9yUHVyZ2VkKCkpe3ZhciBoPTNE
JCgnPGEgY2xhc3M9Cj0zRCJ2YWx1ZSI+PzwvYT4nKS5hdHRyKCJocmVmIix0aGlzLnVybHMuZWRp
dCkuYXR0cigidGFyZ2V0Iix0aGlzLmxpbmtUYXJnZT0KdCk7aS5maW5kKCIuZGF0YXNldC1kYmtl
eSAudmFsdWUiKS5yZXBsYWNlV2l0aChoKX19LGV2ZW50czpfLmV4dGVuZChfLmNsb25lPQooYi5I
REFCYXNlVmlldy5wcm90b3R5cGUuZXZlbnRzKSx7ImNsaWNrIC5kYXRhc2V0LXVuZGVsZXRlIjpm
dW5jdGlvbihoKXt0aGk9CnMubW9kZWwudW5kZWxldGUoKTtyZXR1cm4gZmFsc2V9LCJjbGljayAu
ZGF0YXNldC11bmhpZGUiOmZ1bmN0aW9uKGgpe3RoaXMubT0Kb2RlbC51bmhpZGUoKTtyZXR1cm4g
ZmFsc2V9LCJjbGljayAuZGF0YXNldC1wdXJnZSI6ImNvbmZpcm1QdXJnZSJ9KSxjb25maXJtPQpQ
dXJnZTpmdW5jdGlvbiBkKGgpe3RoaXMubW9kZWwucHVyZ2UoKTtyZXR1cm4gZmFsc2V9LHRvU3Ry
aW5nOmZ1bmN0aW9uKCl7dmE9CnIgaD0zRCh0aGlzLm1vZGVsKT8odGhpcy5tb2RlbCsiIik6KCIo
bm8gbW9kZWwpIik7cmV0dXJuIkhEQVZpZXcoIitoKyIpIn19KT0KO2Z1bmN0aW9uIGMoaCxqLGkp
e3JldHVybiBmdW5jdGlvbigpe3ZhciBrPTNEe307aWYoaSl7a1siZi1kYmtleSJdPTNEaX0kLmFq
PQpheCh7dXJsOmgrIi9saXN0X3RyYWNrcz8iKyQucGFyYW0oayksZGF0YVR5cGU6Imh0bWwiLGVy
cm9yOmZ1bmN0aW9uKCl7YWxlcnQ9CigoIkNvdWxkIG5vdCBhZGQgdGhpcyBkYXRhc2V0IHRvIGJy
b3dzZXIiKSsiLiIpfSxzdWNjZXNzOmZ1bmN0aW9uKGwpe3ZhciBtPQo9M0R3aW5kb3cucGFyZW50
O20uR2FsYXh5Lm1vZGFsLnNob3coe3RpdGxlOiJWaWV3IERhdGEgaW4gYSBOZXcgb3IgU2F2ZWQg
Vmk9CnN1YWxpemF0aW9uIixidXR0b25zOntDYW5jZWw6ZnVuY3Rpb24oKXttLkdhbGF4eS5tb2Rh
bC5oaWRlKCl9LCJWaWV3IGluIHNhdj0KZWQgdmlzdWFsaXphdGlvbiI6ZnVuY3Rpb24oKXttLkdh
bGF4eS5tb2RhbC5zaG93KHt0aXRsZToiQWRkIERhdGEgdG8gU2F2ZWQgPQpWaXN1YWxpemF0aW9u
Iixib2R5OmwsYnV0dG9uczp7Q2FuY2VsOmZ1bmN0aW9uKCl7bS5HYWxheHkubW9kYWwuaGlkZSgp
fSwiQWQ9CmQgdG8gdmlzdWFsaXphdGlvbiI6ZnVuY3Rpb24oKXskKG0uZG9jdW1lbnQpLmZpbmQo
ImlucHV0W25hbWU9M0RpZF06Y2hlY2tlZD0KIikuZWFjaChmdW5jdGlvbigpe20uR2FsYXh5Lm1v
ZGFsLmhpZGUoKTt2YXIgbj0zRCQodGhpcykudmFsKCk7ai5pZD0zRG47bS5HPQphbGF4eS5mcmFt
ZS5hZGQoe3RpdGxlOiJUcmFja3N0ZXIiLHR5cGU6InVybCIsY29udGVudDpoKyIvdHJhY2tzdGVy
PyIrJC5wYXI9CmFtKGopfSl9KX19fSl9LCJWaWV3IGluIG5ldyB2aXN1YWxpemF0aW9uIjpmdW5j
dGlvbigpe20uR2FsYXh5Lm1vZGFsLmhpZGUoKT0KO3ZhciBuPTNEaCsiL3RyYWNrc3Rlcj8iKyQu
cGFyYW0oaik7bS5HYWxheHkuZnJhbWUuYWRkKHt0aXRsZToiVHJhY2tzdGVyIix0PQp5cGU6InVy
bCIsY29udGVudDpufSl9fX0pfX0pO3JldHVybiBmYWxzZX19cmV0dXJue0hEQUVkaXRWaWV3Omd9
fSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZGVmaW5lKFsibXZjL2RhdGFzZXQvaGRh
LW1vZGVsIiwibXZjL2RhdGFzZXQvaGRhLWJhc2UiLCJtdmMvdGFncyIsIm12Yy9hbm49Cm90YXRp
b25zIiwidXRpbHMvbG9jYWxpemF0aW9uIl0sZnVuY3Rpb24oZyxiLGEsZSxmKXt2YXIgaD0zRGIu
SERBQmFzZVZpZXcuZT0KeHRlbmQoe2luaXRpYWxpemU6ZnVuY3Rpb24oaSl7Yi5IREFCYXNlVmll
dy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5jYWxsKHRoaXMsPQppKTt0aGlzLmhhc1VzZXI9M0RpLmhh
c1VzZXI7dGhpcy5kZWZhdWx0UHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVycz0zRFt0aGk9CnMu
X3JlbmRlcl9zaG93UGFyYW1zQnV0dG9uLHRoaXMuX3JlbmRlcl9yZXJ1bkJ1dHRvbl07dGhpcy50
YWdzRWRpdG9yU2hvd249Cj0zRGkudGFnc0VkaXRvclNob3dufHxmYWxzZTt0aGlzLmFubm90YXRp
b25FZGl0b3JTaG93bj0zRGkuYW5ub3RhdGlvbkVkaXRvcj0KU2hvd258fGZhbHNlfSxfcmVuZGVy
X3RpdGxlQnV0dG9uczpmdW5jdGlvbigpe3JldHVybiBiLkhEQUJhc2VWaWV3LnByb3RvdHlwPQpl
Ll9yZW5kZXJfdGl0bGVCdXR0b25zLmNhbGwodGhpcykuY29uY2F0KFt0aGlzLl9yZW5kZXJfZWRp
dEJ1dHRvbigpLHRoaXMuX3I9CmVuZGVyX2RlbGV0ZUJ1dHRvbigpXSl9LF9yZW5kZXJfZWRpdEJ1
dHRvbjpmdW5jdGlvbigpe2lmKCh0aGlzLm1vZGVsLmdldCgicz0KdGF0ZSIpPTNEPTNEPTNEZy5I
aXN0b3J5RGF0YXNldEFzc29jaWF0aW9uLlNUQVRFUy5ESVNDQVJERUQpfHwodGhpcy5tb2RlbC5n
PQpldCgic3RhdGUiKT0zRD0zRD0zRGcuSGlzdG9yeURhdGFzZXRBc3NvY2lhdGlvbi5TVEFURVMu
Tk9UX1ZJRVdBQkxFKXx8KCF0aGk9CnMubW9kZWwuZ2V0KCJhY2Nlc3NpYmxlIikpKXtyZXR1cm4g
bnVsbH12YXIgaz0zRHRoaXMubW9kZWwuZ2V0KCJwdXJnZWQiKSxpPQo9M0R0aGlzLm1vZGVsLmdl
dCgiZGVsZXRlZCIpLGo9M0R7dGl0bGU6ZigiRWRpdCBhdHRyaWJ1dGVzIiksaHJlZjp0aGlzLnVy
bHM9Ci5lZGl0LHRhcmdldDp0aGlzLmxpbmtUYXJnZXQsY2xhc3NlczoiZGF0YXNldC1lZGl0In07
aWYoaXx8ayl7ai5kaXNhYmxlZD0zRD0KdHJ1ZTtpZihrKXtqLnRpdGxlPTNEZigiQ2Fubm90IGVk
aXQgYXR0cmlidXRlcyBvZiBkYXRhc2V0cyByZW1vdmVkIGZyb20gZGlzPQprIil9ZWxzZXtpZihp
KXtqLnRpdGxlPTNEZigiVW5kZWxldGUgZGF0YXNldCB0byBlZGl0IGF0dHJpYnV0ZXMiKX19fWVs
c2V7aWY9Cih0aGlzLm1vZGVsLmdldCgic3RhdGUiKT0zRD0zRD0zRGcuSGlzdG9yeURhdGFzZXRB
c3NvY2lhdGlvbi5TVEFURVMuVVBMT0FEKT0Ke2ouZGlzYWJsZWQ9M0R0cnVlO2oudGl0bGU9M0Rm
KCJUaGlzIGRhdGFzZXQgbXVzdCBmaW5pc2ggdXBsb2FkaW5nIGJlZm9yZSBpPQp0IGNhbiBiZSBl
ZGl0ZWQiKX1lbHNle2lmKHRoaXMubW9kZWwuZ2V0KCJzdGF0ZSIpPTNEPTNEPTNEZy5IaXN0b3J5
RGF0YXNldEE9CnNzb2NpYXRpb24uU1RBVEVTLk5FVyl7ai5kaXNhYmxlZD0zRHRydWU7ai50aXRs
ZT0zRGYoIlRoaXMgZGF0YXNldCBpcyBub3QgeT0KZXQgZWRpdGFibGUiKX19fWouZmFJY29uPTNE
ImZhLXBlbmNpbCI7cmV0dXJuIGZhSWNvbkJ1dHRvbihqKX0sX3JlbmRlcl9kZWxlPQp0ZUJ1dHRv
bjpmdW5jdGlvbigpe2lmKCh0aGlzLm1vZGVsLmdldCgic3RhdGUiKT0zRD0zRD0zRGcuSGlzdG9y
eURhdGFzZXRBc3M9Cm9jaWF0aW9uLlNUQVRFUy5OT1RfVklFV0FCTEUpfHwoIXRoaXMubW9kZWwu
Z2V0KCJhY2Nlc3NpYmxlIikpKXtyZXR1cm4gbnVsbD0KfXZhciBpPTNEdGhpcyxqPTNEe3RpdGxl
OmYoIkRlbGV0ZSIpLGNsYXNzZXM6ImRhdGFzZXQtZGVsZXRlIixvbmNsaWNrOmZ1bmN0PQppb24o
KXtpLiRlbC5maW5kKCIuaWNvbi1idG4uZGF0YXNldC1kZWxldGUiKS50cmlnZ2VyKCJtb3VzZW91
dCIpO2kubW9kZWxbImQ9CmVsZXRlIl0oKX19O2lmKHRoaXMubW9kZWwuZ2V0KCJkZWxldGVkIil8
fHRoaXMubW9kZWwuZ2V0KCJwdXJnZWQiKSl7aj0zRHt0aT0KdGxlOmYoIkRhdGFzZXQgaXMgYWxy
ZWFkeSBkZWxldGVkIiksZGlzYWJsZWQ6dHJ1ZX19ai5mYUljb249M0QiZmEtdGltZXMiO3JlPQp0
dXJuIGZhSWNvbkJ1dHRvbihqKX0sX3JlbmRlcl9lcnJCdXR0b246ZnVuY3Rpb24oKXtpZih0aGlz
Lm1vZGVsLmdldCgic3RhdGU9CiIpIT0zRD0zRGcuSGlzdG9yeURhdGFzZXRBc3NvY2lhdGlvbi5T
VEFURVMuRVJST1Ipe3JldHVybiBudWxsfXJldHVybiBmYUljbz0KbkJ1dHRvbih7dGl0bGU6Zigi
VmlldyBvciByZXBvcnQgdGhpcyBlcnJvciIpLGhyZWY6dGhpcy51cmxzLnJlcG9ydF9lcnJvcixj
PQpsYXNzZXM6ImRhdGFzZXQtcmVwb3J0LWVycm9yLWJ0biIsdGFyZ2V0OnRoaXMubGlua1Rhcmdl
dCxmYUljb246ImZhLWJ1ZyJ9KX09CixfcmVuZGVyX3JlcnVuQnV0dG9uOmZ1bmN0aW9uKCl7cmV0
dXJuIGZhSWNvbkJ1dHRvbih7dGl0bGU6ZigiUnVuIHRoaXMgam9iID0KYWdhaW4iKSxocmVmOnRo
aXMudXJscy5yZXJ1bixjbGFzc2VzOiJkYXRhc2V0LXJlcnVuLWJ0biIsdGFyZ2V0OnRoaXMubGlu
a1RhPQpyZ2V0LGZhSWNvbjoiZmEtcmVmcmVzaCJ9KX0sX3JlbmRlcl92aXN1YWxpemF0aW9uc0J1
dHRvbjpmdW5jdGlvbigpe3ZhciBpPQo9M0R0aGlzLm1vZGVsLmdldCgidmlzdWFsaXphdGlvbnMi
KTtpZigoIXRoaXMuaGFzVXNlcil8fCghdGhpcy5tb2RlbC5oYXNEYXQ9CmEoKSl8fChfLmlzRW1w
dHkoaSkpKXtyZXR1cm4gbnVsbH1pZihfLmlzT2JqZWN0KGlbMF0pKXtyZXR1cm4gdGhpcy5fcmVu
ZGVyXz0KdmlzdWFsaXphdGlvbnNGcmFtZXdvcmtCdXR0b24oaSl9aWYoIXRoaXMudXJscy52aXN1
YWxpemF0aW9uKXtyZXR1cm4gbnVsbH12PQphciBrPTNEdGhpcy5tb2RlbC5nZXQoImRia2V5Iiks
bz0zRHRoaXMudXJscy52aXN1YWxpemF0aW9uLGw9M0R7fSxwPTNEe2RhdGE9CnNldF9pZDp0aGlz
Lm1vZGVsLmdldCgiaWQiKSxoZGFfbGRkYToiaGRhIn07aWYoayl7cC5kYmtleT0zRGt9dmFyIGo9
M0RmYUljbz0KbkJ1dHRvbih7dGl0bGU6ZigiVmlzdWFsaXplIiksY2xhc3NlczoiZGF0YXNldC12
aXN1YWxpemUtYnRuIixmYUljb246ImZhLWJhPQpyLWNoYXJ0LW8ifSk7ZnVuY3Rpb24gbShxKXtp
ZihxPTNEPTNEPTNEInRyYWNrc3RlciIpe3JldHVybiBjKG8scCxrKX1yZXR1cm49CiBmdW5jdGlv
bigpe0dhbGF4eS5mcmFtZS5hZGQoe3RpdGxlOiJWaXN1YWxpemF0aW9uIix0eXBlOiJ1cmwiLGNv
bnRlbnQ6bysiLz0KIitxKyI/IiskLnBhcmFtKHApfSl9fWZ1bmN0aW9uIG4ocSl7cmV0dXJuIHEu
Y2hhckF0KDApLnRvVXBwZXJDYXNlKCkrcS5zbGljPQplKDEpfWlmKGkubGVuZ3RoPTNEPTNEPTNE
MSl7ai5hdHRyKCJkYXRhLW9yaWdpbmFsLXRpdGxlIixmKCJWaXN1YWxpemUgaW4gIik9CitmKG4o
aVswXSkpKTtqLmNsaWNrKG0oaVswXSkpfWVsc2V7Xy5lYWNoKGksZnVuY3Rpb24ocSl7bFtmKG4o
cSkpXT0zRG0ocSl9KT0KO21ha2VfcG9wdXBtZW51KGosbCl9cmV0dXJuIGp9LF9yZW5kZXJfdmlz
dWFsaXphdGlvbnNGcmFtZXdvcmtCdXR0b246ZnVuY3RpPQpvbihpKXtpZighKHRoaXMubW9kZWwu
aGFzRGF0YSgpKXx8IShpJiYhXy5pc0VtcHR5KGkpKSl7cmV0dXJuIG51bGx9dmFyIGs9M0Q9CmZh
SWNvbkJ1dHRvbih7dGl0bGU6ZigiVmlzdWFsaXplIiksY2xhc3NlczoiZGF0YXNldC12aXN1YWxp
emUtYnRuIixmYUljb246Ij0KZmEtYmFyLWNoYXJ0LW8ifSk7aWYoaS5sZW5ndGg9M0Q9M0Q9M0Qx
KXt2YXIgaj0zRGlbMF07ay5hdHRyKCJkYXRhLW9yaWdpbmFsPQotdGl0bGUiLGYoIlZpc3VhbGl6
ZSBpbiAiKStqLmh0bWwpO2suYXR0cigiaHJlZiIsai5ocmVmKX1lbHNle3ZhciBsPTNEW107Xy49
CmVhY2goaSxmdW5jdGlvbihtKXttLmZ1bmM9M0RmdW5jdGlvbihuKXtpZihHYWxheHkuZnJhbWUm
JkdhbGF4eS5mcmFtZS5hY3Rpdj0KZSl7R2FsYXh5LmZyYW1lLmFkZCh7dGl0bGU6IlZpc3VhbGl6
YXRpb24iLHR5cGU6InVybCIsY29udGVudDptLmhyZWZ9KTtuLnByPQpldmVudERlZmF1bHQoKTty
ZXR1cm4gZmFsc2V9cmV0dXJuIHRydWV9O2wucHVzaChtKTtyZXR1cm4gZmFsc2V9KTtQb3B1cE1l
bnU9Ci5jcmVhdGUoayxsKX1yZXR1cm4ga30sX2J1aWxkTmV3UmVuZGVyOmZ1bmN0aW9uKCl7dmFy
IGk9M0RiLkhEQUJhc2VWaWV3LnBybz0KdG90eXBlLl9idWlsZE5ld1JlbmRlci5jYWxsKHRoaXMp
O2kuZmluZCgiLmRhdGFzZXQtZGVsZXRlZC1tc2ciKS5hcHBlbmQoZignPQogQ2xpY2sgPGEgaHJl
Zj0zRCJqYXZhc2NyaXB0OnZvaWQoMCk7IiBjbGFzcz0zRCJkYXRhc2V0LXVuZGVsZXRlIj5oZXJl
PC9hPiA9CnRvIHVuZGVsZXRlIGl0IG9yIDxhIGhyZWY9M0QiamF2YXNjcmlwdDp2b2lkKDApOyIg
Y2xhc3M9M0QiZGF0YXNldC1wdXJnZSI+aD0KZXJlPC9hPiB0byBpbW1lZGlhdGVseSByZW1vdmUg
aXQgZnJvbSBkaXNrJykpO2kuZmluZCgiLmRhdGFzZXQtaGlkZGVuLW1zZyIpPQouYXBwZW5kKGYo
JyBDbGljayA8YSBocmVmPTNEImphdmFzY3JpcHQ6dm9pZCgwKTsiIGNsYXNzPTNEImRhdGFzZXQt
dW5oaWRlIj49CmhlcmU8L2E+IHRvIHVuaGlkZSBpdCcpKTtyZXR1cm4gaX0sX3JlbmRlcl9ib2R5
X2ZhaWxlZF9tZXRhZGF0YTpmdW5jdGlvbigpez0KdmFyIGo9M0QkKCI8YS8+IikuYXR0cih7aHJl
Zjp0aGlzLnVybHMuZWRpdCx0YXJnZXQ6dGhpcy5saW5rVGFyZ2V0fSkudGV4dChmPQooInNldCBp
dCBtYW51YWxseSBvciByZXRyeSBhdXRvLWRldGVjdGlvbiIpKSxpPTNEJCgiPHNwYW4vPiIpLnRl
eHQoIi4gIitmKCI9CllvdSBtYXkgYmUgYWJsZSB0byIpKyIgIikuYXBwZW5kKGopLGs9M0RiLkhE
QUJhc2VWaWV3LnByb3RvdHlwZS5fcmVuZGVyX2JvZD0KeV9mYWlsZWRfbWV0YWRhdGEuY2FsbCh0
aGlzKTtrLmZpbmQoIi53YXJuaW5nbWVzc2FnZXNtYWxsIHN0cm9uZyIpLmFwcGVuZChpPQopO3Jl
dHVybiBrfSxfcmVuZGVyX2JvZHlfZXJyb3I6ZnVuY3Rpb24oKXt2YXIgaT0zRGIuSERBQmFzZVZp
ZXcucHJvdG90eXBlLl89CnJlbmRlcl9ib2R5X2Vycm9yLmNhbGwodGhpcyk7aS5maW5kKCIuZGF0
YXNldC1hY3Rpb25zIC5sZWZ0IikucHJlcGVuZCh0aGlzLj0KX3JlbmRlcl9lcnJCdXR0b24oKSk7
cmV0dXJuIGl9LF9yZW5kZXJfYm9keV9vazpmdW5jdGlvbigpe3ZhciBpPTNEYi5IREFCYXNlPQpW
aWV3LnByb3RvdHlwZS5fcmVuZGVyX2JvZHlfb2suY2FsbCh0aGlzKTtpZih0aGlzLm1vZGVsLmlz
RGVsZXRlZE9yUHVyZ2VkKCk9Cil7cmV0dXJuIGl9dGhpcy5tYWtlRGJrZXlFZGl0TGluayhpKTtp
Zih0aGlzLmhhc1VzZXIpe2kuZmluZCgiLmRhdGFzZXQtYWN0aT0Kb25zIC5sZWZ0IikuYXBwZW5k
KHRoaXMuX3JlbmRlcl92aXN1YWxpemF0aW9uc0J1dHRvbigpKTt0aGlzLl9yZW5kZXJUYWdzKGkp
PQo7dGhpcy5fcmVuZGVyQW5ub3RhdGlvbihpKX1yZXR1cm4gaX0sX3JlbmRlclRhZ3M6ZnVuY3Rp
b24oaSl7dmFyIGo9M0R0aGlzO3Q9Cmhpcy50YWdzRWRpdG9yPTNEbmV3IGEuVGFnc0VkaXRvcih7
bW9kZWw6dGhpcy5tb2RlbCxlbDppLmZpbmQoIi50YWdzLWRpc3BsYT0KeSIpLG9uc2hvd0ZpcnN0
VGltZTpmdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9LG9uc2hvdzpmdW5jdGlvbigpe2oudGFnc0Vk
aXRvPQpyU2hvd249M0R0cnVlfSxvbmhpZGU6ZnVuY3Rpb24oKXtqLnRhZ3NFZGl0b3JTaG93bj0z
RGZhbHNlfSwkYWN0aXZhdG9yOmZhSWM9Cm9uQnV0dG9uKHt0aXRsZTpmKCJFZGl0IGRhdGFzZXQg
dGFncyIpLGNsYXNzZXM6ImRhdGFzZXQtdGFnLWJ0biIsZmFJY29uOiJmYT0KLXRhZ3MifSkuYXBw
ZW5kVG8oaS5maW5kKCIuZGF0YXNldC1hY3Rpb25zIC5yaWdodCIpKX0pO2lmKHRoaXMudGFnc0Vk
aXRvclNoPQpvd24pe3RoaXMudGFnc0VkaXRvci50b2dnbGUodHJ1ZSl9fSxfcmVuZGVyQW5ub3Rh
dGlvbjpmdW5jdGlvbihpKXt2YXIgaj0zRHQ9Cmhpczt0aGlzLmFubm90YXRpb25FZGl0b3I9M0Ru
ZXcgZS5Bbm5vdGF0aW9uRWRpdG9yKHttb2RlbDp0aGlzLm1vZGVsLGVsOmkuZj0KaW5kKCIuYW5u
b3RhdGlvbi1kaXNwbGF5Iiksb25zaG93Rmlyc3RUaW1lOmZ1bmN0aW9uKCl7dGhpcy5yZW5kZXIo
KX0sb25zaG93PQo6ZnVuY3Rpb24oKXtqLmFubm90YXRpb25FZGl0b3JTaG93bj0zRHRydWV9LG9u
aGlkZTpmdW5jdGlvbigpe2ouYW5ub3RhdGlvbkU9CmRpdG9yU2hvd249M0RmYWxzZX0sJGFjdGl2
YXRvcjpmYUljb25CdXR0b24oe3RpdGxlOmYoIkVkaXQgZGF0YXNldCBhbm5vdGF0aT0Kb24iKSxj
bGFzc2VzOiJkYXRhc2V0LWFubm90YXRlLWJ0biIsZmFJY29uOiJmYS1jb21tZW50In0pLmFwcGVu
ZFRvKGkuZmluZCgiPQouZGF0YXNldC1hY3Rpb25zIC5yaWdodCIpKX0pO2lmKHRoaXMuYW5ub3Rh
dGlvbkVkaXRvclNob3duKXt0aGlzLmFubm90YXRpb249CkVkaXRvci50b2dnbGUodHJ1ZSl9fSxt
YWtlRGJrZXlFZGl0TGluazpmdW5jdGlvbihqKXtpZih0aGlzLm1vZGVsLmdldCgibWV0YT0KZGF0
YV9kYmtleSIpPTNEPTNEPTNEIj8iJiYhdGhpcy5tb2RlbC5pc0RlbGV0ZWRPclB1cmdlZCgpKXt2
YXIgaT0zRCQoJzxhIGNsPQphc3M9M0QidmFsdWUiPj88L2E+JykuYXR0cigiaHJlZiIsdGhpcy51
cmxzLmVkaXQpLmF0dHIoInRhcmdldCIsdGhpcy5saW5rVGE9CnJnZXQpO2ouZmluZCgiLmRhdGFz
ZXQtZGJrZXkgLnZhbHVlIikucmVwbGFjZVdpdGgoaSl9fSxldmVudHM6Xy5leHRlbmQoXy5jbD0K
b25lKGIuSERBQmFzZVZpZXcucHJvdG90eXBlLmV2ZW50cykseyJjbGljayAuZGF0YXNldC11bmRl
bGV0ZSI6ZnVuY3Rpb24oaSl7PQp0aGlzLm1vZGVsLnVuZGVsZXRlKCk7cmV0dXJuIGZhbHNlfSwi
Y2xpY2sgLmRhdGFzZXQtdW5oaWRlIjpmdW5jdGlvbihpKXt0aGk9CnMubW9kZWwudW5oaWRlKCk7
cmV0dXJuIGZhbHNlfSwiY2xpY2sgLmRhdGFzZXQtcHVyZ2UiOiJjb25maXJtUHVyZ2UifSksY29u
Zj0KaXJtUHVyZ2U6ZnVuY3Rpb24gZChpKXt0aGlzLm1vZGVsLnB1cmdlKCk7cmV0dXJuIGZhbHNl
fSx0b1N0cmluZzpmdW5jdGlvbigpPQp7dmFyIGk9M0QodGhpcy5tb2RlbCk/KHRoaXMubW9kZWwr
IiIpOigiKG5vIG1vZGVsKSIpO3JldHVybiJIREFWaWV3KCIraSsiKSI9Cn19KTtmdW5jdGlvbiBj
KGksayxqKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbD0zRHt9O2lmKGope2xbImYtZGJrZXkiXT0z
RGp9JD0KLmFqYXgoe3VybDppKyIvbGlzdF90cmFja3M/IiskLnBhcmFtKGwpLGRhdGFUeXBlOiJo
dG1sIixlcnJvcjpmdW5jdGlvbigpe2FsPQplcnQoKCJDb3VsZCBub3QgYWRkIHRoaXMgZGF0YXNl
dCB0byBicm93c2VyIikrIi4iKX0sc3VjY2VzczpmdW5jdGlvbihtKXt2YXI9CiBuPTNEd2luZG93
LnBhcmVudDtuLkdhbGF4eS5tb2RhbC5zaG93KHt0aXRsZToiVmlldyBEYXRhIGluIGEgTmV3IG9y
IFNhdmVkID0KVmlzdWFsaXphdGlvbiIsYnV0dG9uczp7Q2FuY2VsOmZ1bmN0aW9uKCl7bi5HYWxh
eHkubW9kYWwuaGlkZSgpfSwiVmlldyBpbiBzPQphdmVkIHZpc3VhbGl6YXRpb24iOmZ1bmN0aW9u
KCl7bi5HYWxheHkubW9kYWwuc2hvdyh7dGl0bGU6IkFkZCBEYXRhIHRvIFNhdmU9CmQgVmlzdWFs
aXphdGlvbiIsYm9keTptLGJ1dHRvbnM6e0NhbmNlbDpmdW5jdGlvbigpe24uR2FsYXh5Lm1vZGFs
LmhpZGUoKX0sIj0KQWRkIHRvIHZpc3VhbGl6YXRpb24iOmZ1bmN0aW9uKCl7JChuLmRvY3VtZW50
KS5maW5kKCJpbnB1dFtuYW1lPTNEaWRdOmNoZWNrPQplZCIpLmVhY2goZnVuY3Rpb24oKXtuLkdh
bGF4eS5tb2RhbC5oaWRlKCk7dmFyIG89M0QkKHRoaXMpLnZhbCgpO2suaWQ9M0RvO249Ci5HYWxh
eHkuZnJhbWUuYWRkKHt0aXRsZToiVHJhY2tzdGVyIix0eXBlOiJ1cmwiLGNvbnRlbnQ6aSsiL3Ry
YWNrc3Rlcj8iKyQucD0KYXJhbShrKX0pfSl9fX0pfSwiVmlldyBpbiBuZXcgdmlzdWFsaXphdGlv
biI6ZnVuY3Rpb24oKXtuLkdhbGF4eS5tb2RhbC5oaWRlPQooKTt2YXIgbz0zRGkrIi90cmFja3N0
ZXI/IiskLnBhcmFtKGspO24uR2FsYXh5LmZyYW1lLmFkZCh7dGl0bGU6IlRyYWNrc3RlciI9Cix0
eXBlOiJ1cmwiLGNvbnRlbnQ6b30pfX19KX19KTtyZXR1cm4gZmFsc2V9fXJldHVybntIREFFZGl0
VmlldzpofX0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKCmRpZmYgLXIgODM0NmVjNGJh
YTM5OTJmNGRjMDE2MWYwZmM3OWEwYmE4OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdj
Nz0KMzllMDUxM2FkZGZlMDJjYjIgc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9kYXRhc2V0L2hk
YS1tb2RlbC5qcwotLS0gYS9zdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL2RhdGFzZXQvaGRhLW1v
ZGVsLmpzCisrKyBiL3N0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMvZGF0YXNldC9oZGEtbW9kZWwu
anMKQEAgLTEsMSArMSwxIEBACi1kZWZpbmUoWyJtdmMvYmFzZS1tdmMiXSxmdW5jdGlvbihiKXt2
YXIgZT0zREJhY2tib25lLk1vZGVsLmV4dGVuZChiLkxvZ2dhYj0KbGVNaXhpbikuZXh0ZW5kKHtk
ZWZhdWx0czp7aGlzdG9yeV9pZDpudWxsLG1vZGVsX2NsYXNzOiJIaXN0b3J5RGF0YXNldEFzc29j
PQppYXRpb24iLGhpZDowLGlkOm51bGwsbmFtZToiKHVubmFtZWQgZGF0YXNldCkiLHN0YXRlOiJu
ZXciLGRlbGV0ZWQ6ZmFsc2Usdmk9CnNpYmxlOnRydWUsYWNjZXNzaWJsZTp0cnVlLHB1cmdlZDpm
YWxzZSxkYXRhX3R5cGU6IiIsZmlsZV9zaXplOjAsZmlsZV9leHQ6Ij0KIixtZXRhX2ZpbGVzOltd
LG1pc2NfYmx1cmI6IiIsbWlzY19pbmZvOiIiLHRhZ3M6W10sYW5ub3RhdGlvbjoiIn0sdXJsUm9v
dDpnPQphbGF4eV9jb25maWcucm9vdCsiYXBpL2hpc3Rvcmllcy8iLHVybDpmdW5jdGlvbigpe3Jl
dHVybiB0aGlzLnVybFJvb3QrdGhpcy49CmdldCgiaGlzdG9yeV9pZCIpKyIvY29udGVudHMvIit0
aGlzLmdldCgiaWQiKX0sdXJsczpmdW5jdGlvbigpe3ZhciBqPTNEdGhpcz0KLmdldCgiaWQiKTtp
Zighail7cmV0dXJue319dmFyIGk9M0R7cHVyZ2U6Z2FsYXh5X2NvbmZpZy5yb290KyJkYXRhc2V0
cy8iK2orPQoiL3B1cmdlX2FzeW5jIixkaXNwbGF5OmdhbGF4eV9jb25maWcucm9vdCsiZGF0YXNl
dHMvIitqKyIvZGlzcGxheS8/cHJldmlldz0KPTNEVHJ1ZSIsZWRpdDpnYWxheHlfY29uZmlnLnJv
b3QrImRhdGFzZXRzLyIraisiL2VkaXQiLGRvd25sb2FkOmdhbGF4eV9jb25mPQppZy5yb290KyJk
YXRhc2V0cy8iK2orIi9kaXNwbGF5P3RvX2V4dD0zRCIrdGhpcy5nZXQoImZpbGVfZXh0IikscmVw
b3J0X2Vycm89CnI6Z2FsYXh5X2NvbmZpZy5yb290KyJkYXRhc2V0L2Vycm9ycz9pZD0zRCIraixy
ZXJ1bjpnYWxheHlfY29uZmlnLnJvb3QrInRvbz0KbF9ydW5uZXIvcmVydW4/aWQ9M0QiK2osc2hv
d19wYXJhbXM6Z2FsYXh5X2NvbmZpZy5yb290KyJkYXRhc2V0cy8iK2orIi9zaG93PQpfcGFyYW1z
Iix2aXN1YWxpemF0aW9uOmdhbGF4eV9jb25maWcucm9vdCsidmlzdWFsaXphdGlvbiIsYW5ub3Rh
dGlvbjp7Z2V0Omc9CmFsYXh5X2NvbmZpZy5yb290KyJkYXRhc2V0L2dldF9hbm5vdGF0aW9uX2Fz
eW5jP2lkPTNEIitqLHNldDpnYWxheHlfY29uZmlnLj0Kcm9vdCsiZGF0YXNldC9hbm5vdGF0ZV9h
c3luYz9pZD0zRCIran0sbWV0YV9kb3dubG9hZDpnYWxheHlfY29uZmlnLnJvb3QrImRhPQp0YXNl
dC9nZXRfbWV0YWRhdGFfZmlsZT9oZGFfaWQ9M0QiK2orIiZtZXRhZGF0YV9uYW1lPTNEIn07cmV0
dXJuIGl9LGluaXRpYWw9Cml6ZTpmdW5jdGlvbihpKXt0aGlzLmxvZyh0aGlzKyIuaW5pdGlhbGl6
ZSIsdGhpcy5hdHRyaWJ1dGVzKTt0aGlzLmxvZygiXHRwYT0KcmVudCBoaXN0b3J5X2lkOiAiK3Ro
aXMuZ2V0KCJoaXN0b3J5X2lkIikpO2lmKCF0aGlzLmdldCgiYWNjZXNzaWJsZSIpKXt0aGlzPQou
c2V0KCJzdGF0ZSIsZS5TVEFURVMuTk9UX1ZJRVdBQkxFKX10aGlzLl9zZXRVcExpc3RlbmVycygp
fSxfc2V0VXBMaXN0ZW5lcnM9CjpmdW5jdGlvbigpe3RoaXMub24oImNoYW5nZTpzdGF0ZSIsZnVu
Y3Rpb24oaixpKXt0aGlzLmxvZyh0aGlzKyIgaGFzIGNoYW5nZT0KZCBzdGF0ZToiLGosaSk7aWYo
dGhpcy5pblJlYWR5U3RhdGUoKSl7dGhpcy50cmlnZ2VyKCJzdGF0ZTpyZWFkeSIsaixpLHRoaXMu
PQpwcmV2aW91cygic3RhdGUiKSl9fSl9LGlzRGVsZXRlZE9yUHVyZ2VkOmZ1bmN0aW9uKCl7cmV0
dXJuKHRoaXMuZ2V0KCJkZWxldGU9CmQiKXx8dGhpcy5nZXQoInB1cmdlZCIpKX0saXNWaXNpYmxl
OmZ1bmN0aW9uKGosayl7dmFyIGk9M0R0cnVlO2lmKCghaikmJih0aD0KaXMuZ2V0KCJkZWxldGVk
Iil8fHRoaXMuZ2V0KCJwdXJnZWQiKSkpe2k9M0RmYWxzZX1pZigoIWspJiYoIXRoaXMuZ2V0KCJ2
aXNpPQpibGUiKSkpe2k9M0RmYWxzZX1yZXR1cm4gaX0saGlkZGVuOmZ1bmN0aW9uKCl7cmV0dXJu
ICF0aGlzLmdldCgidmlzaWJsZSIpfSw9CmluUmVhZHlTdGF0ZTpmdW5jdGlvbigpe3ZhciBpPTNE
Xy5jb250YWlucyhlLlJFQURZX1NUQVRFUyx0aGlzLmdldCgic3RhdGUiKT0KKTtyZXR1cm4odGhp
cy5pc0RlbGV0ZWRPclB1cmdlZCgpfHxpKX0saGFzRGV0YWlsczpmdW5jdGlvbigpe3JldHVybiBf
Lmhhcyh0PQpoaXMuYXR0cmlidXRlcywiZ2Vub21lX2J1aWxkIil9LGhhc0RhdGE6ZnVuY3Rpb24o
KXtyZXR1cm4odGhpcy5nZXQoImZpbGVfc2k9CnplIik+MCl9LCJkZWxldGUiOmZ1bmN0aW9uIGQo
aSl7aWYodGhpcy5nZXQoImRlbGV0ZWQiKSl7cmV0dXJuIGpRdWVyeS53aGVuKD0KKX1yZXR1cm4g
dGhpcy5zYXZlKHtkZWxldGVkOnRydWV9LGkpfSx1bmRlbGV0ZTpmdW5jdGlvbiBhKGkpe2lmKCF0
aGlzLmdldCgiPQpkZWxldGVkIil8fHRoaXMuZ2V0KCJwdXJnZWQiKSl7cmV0dXJuIGpRdWVyeS53
aGVuKCl9cmV0dXJuIHRoaXMuc2F2ZSh7ZGVsZXQ9CmVkOmZhbHNlfSxpKX0saGlkZTpmdW5jdGlv
biBjKGkpe2lmKCF0aGlzLmdldCgidmlzaWJsZSIpKXtyZXR1cm4galF1ZXJ5LndoZT0KbigpfXJl
dHVybiB0aGlzLnNhdmUoe3Zpc2libGU6ZmFsc2V9LGkpfSx1bmhpZGU6ZnVuY3Rpb24gaChpKXtp
Zih0aGlzLmdldCgiPQp2aXNpYmxlIikpe3JldHVybiBqUXVlcnkud2hlbigpfXJldHVybiB0aGlz
LnNhdmUoe3Zpc2libGU6dHJ1ZX0saSl9LHB1cmdlOmY9CnVuY3Rpb24gZyhpKXtpZih0aGlzLmdl
dCgicHVyZ2VkIikpe3JldHVybiBqUXVlcnkud2hlbigpfWk9M0RpfHx7fTtpLnVybD0zRD0KZ2Fs
YXh5X2NvbmZpZy5yb290KyJkYXRhc2V0cy8iK3RoaXMuZ2V0KCJpZCIpKyIvcHVyZ2VfYXN5bmMi
O3ZhciBqPTNEdGhpcyxrPQo9M0RqUXVlcnkuYWpheChpKTtrLmRvbmUoZnVuY3Rpb24obixsLG0p
e2ouc2V0KHtkZWxldGVkOnRydWUscHVyZ2VkOnRydWV9KX09Cik7ay5mYWlsKGZ1bmN0aW9uKHAs
bCxvKXt2YXIgbT0zRF9sKCJVbmFibGUgdG8gcHVyZ2UgZGF0YXNldCIpO3ZhciBuPTNEKCJSZT0K
bW92YWwgb2YgZGF0YXNldHMgYnkgdXNlcnMgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBHYWxheHkg
aW5zdGFuY2UiKTtpZihwLnJlPQpzcG9uc2VKU09OJiZwLnJlc3BvbnNlSlNPTi5lcnJvcil7bT0z
RHAucmVzcG9uc2VKU09OLmVycm9yfWVsc2V7aWYocC5yZXNwb249CnNlVGV4dC5pbmRleE9mKG4p
IT0zRD0zRC0xKXttPTNEbn19cC5yZXNwb25zZVRleHQ9M0RtO2oudHJpZ2dlcigiZXJyb3IiLGos
cD0KLGksX2wobSkse2Vycm9yOm19KX0pO3JldHVybiBrfSxzZWFyY2hBdHRyaWJ1dGVzOlsibmFt
ZSIsImZpbGVfZXh0IiwiZ2Vub21lPQpfYnVpbGQiLCJtaXNjX2JsdXJiIiwibWlzY19pbmZvIiwi
YW5ub3RhdGlvbiIsInRhZ3MiXSxzZWFyY2hBbGlhc2VzOnt0aXRsZTo9CiJuYW1lIixmb3JtYXQ6
ImZpbGVfZXh0IixkYXRhYmFzZToiZ2Vub21lX2J1aWxkIixibHVyYjoibWlzY19ibHVyYiIsZGVz
Y3JpcD0KdGlvbjoibWlzY19ibHVyYiIsaW5mbzoibWlzY19pbmZvIix0YWc6InRhZ3MifSxzZWFy
Y2hBdHRyaWJ1dGU6ZnVuY3Rpb24oayxpPQope3ZhciBqPTNEdGhpcy5nZXQoayk7aWYoIWl8fChq
PTNEPTNEPTNEdW5kZWZpbmVkfHxqPTNEPTNEPTNEbnVsbCkpe3JldHVybiA9CmZhbHNlfWlmKF8u
aXNBcnJheShqKSl7cmV0dXJuIHRoaXMuX3NlYXJjaEFycmF5QXR0cmlidXRlKGosaSl9cmV0dXJu
KGoudG9TdD0KcmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihpLnRvTG93ZXJDYXNlKCkpIT0z
RD0zRC0xKX0sX3NlYXJjaEFycmF5QXR0cmliPQp1dGU6ZnVuY3Rpb24oaixpKXtpPTNEaS50b0xv
d2VyQ2FzZSgpO3JldHVybiBfLmFueShqLGZ1bmN0aW9uKGspe3JldHVybihrLnQ9Cm9TdHJpbmco
KS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoaS50b0xvd2VyQ2FzZSgpKSE9M0Q9M0QtMSl9KX0sc2Vh
cmNoOmZ1bmN0aT0Kb24oaSl7dmFyIGo9M0R0aGlzO3JldHVybiBfLmZpbHRlcih0aGlzLnNlYXJj
aEF0dHJpYnV0ZXMsZnVuY3Rpb24oayl7cmV0dXJuPQogai5zZWFyY2hBdHRyaWJ1dGUoayxpKX0p
fSxtYXRjaGVzOmZ1bmN0aW9uKGope3ZhciBsPTNEIj0zRCIsaT0zRGouc3BsaXQobCk9CjtpZihp
Lmxlbmd0aD49M0QyKXt2YXIgaz0zRGlbMF07az0zRHRoaXMuc2VhcmNoQWxpYXNlc1trXXx8azty
ZXR1cm4gdGhpcy5zZT0KYXJjaEF0dHJpYnV0ZShrLGlbMV0pfXJldHVybiAhIXRoaXMuc2VhcmNo
KGopLmxlbmd0aH0sbWF0Y2hlc0FsbDpmdW5jdGlvbihqPQope3ZhciBpPTNEdGhpcztqPTNEai5t
YXRjaCgvKCIuKiJ8XHcqPTNEIi4qInxcUyopL2cpLmZpbHRlcihmdW5jdGlvbihrKXtyZXQ9CnVy
biAhIWt9KTtyZXR1cm4gXy5hbGwoaixmdW5jdGlvbihrKXtrPTNEay5yZXBsYWNlKC8iL2csIiIp
O3JldHVybiBpLm1hdGNoZT0KcyhrKX0pfSx0b1N0cmluZzpmdW5jdGlvbigpe3ZhciBpPTNEdGhp
cy5nZXQoImlkIil8fCIiO2lmKHRoaXMuZ2V0KCJuYW1lIikpPQp7aT0zRHRoaXMuZ2V0KCJoaWQi
KSsnIDoiJyt0aGlzLmdldCgibmFtZSIpKyciLCcraX1yZXR1cm4iSERBKCIraSsiKSJ9fSk7ZS49
ClNUQVRFUz0zRHtVUExPQUQ6InVwbG9hZCIsUVVFVUVEOiJxdWV1ZWQiLFJVTk5JTkc6InJ1bm5p
bmciLFNFVFRJTkdfTUVUQURBVD0KQToic2V0dGluZ19tZXRhZGF0YSIsTkVXOiJuZXciLEVNUFRZ
OiJlbXB0eSIsT0s6Im9rIixQQVVTRUQ6InBhdXNlZCIsRkFJTEVEPQpfTUVUQURBVEE6ImZhaWxl
ZF9tZXRhZGF0YSIsTk9UX1ZJRVdBQkxFOiJub1Blcm1pc3Npb24iLERJU0NBUkRFRDoiZGlzY2Fy
ZGU9CmQiLEVSUk9SOiJlcnJvciJ9O2UuUkVBRFlfU1RBVEVTPTNEW2UuU1RBVEVTLk9LLGUuU1RB
VEVTLkVNUFRZLGUuU1RBVEVTLlBBVT0KU0VELGUuU1RBVEVTLkZBSUxFRF9NRVRBREFUQSxlLlNU
QVRFUy5OT1RfVklFV0FCTEUsZS5TVEFURVMuRElTQ0FSREVELGUuU1RBPQpURVMuRVJST1JdO2Uu
Tk9UX1JFQURZX1NUQVRFUz0zRFtlLlNUQVRFUy5VUExPQUQsZS5TVEFURVMuUVVFVUVELGUuU1RB
VEVTLlI9ClVOTklORyxlLlNUQVRFUy5TRVRUSU5HX01FVEFEQVRBLGUuU1RBVEVTLk5FV107dmFy
IGY9M0RCYWNrYm9uZS5Db2xsZWN0aW9uLj0KZXh0ZW5kKGIuTG9nZ2FibGVNaXhpbikuZXh0ZW5k
KHttb2RlbDplLHVybFJvb3Q6Z2FsYXh5X2NvbmZpZy5yb290KyJhcGkvaGlzPQp0b3JpZXMiLHVy
bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVybFJvb3QrIi8iK3RoaXMuaGlzdG9yeUlkKyIvY29u
dGVudHMifSw9CmluaXRpYWxpemU6ZnVuY3Rpb24oaixpKXtpPTNEaXx8e307dGhpcy5oaXN0b3J5
SWQ9M0RpLmhpc3RvcnlJZH0saWRzOmZ1bmN0aT0Kb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rp
b24oaSl7cmV0dXJuIGkuaWR9KX0sbm90UmVhZHk6ZnVuY3Rpb24oKXtyZXR1cm4gPQp0aGlzLmZp
bHRlcihmdW5jdGlvbihpKXtyZXR1cm4gIWkuaW5SZWFkeVN0YXRlKCl9KX0scnVubmluZzpmdW5j
dGlvbigpe3ZhciA9Cmk9M0RbXTt0aGlzLmVhY2goZnVuY3Rpb24oail7aWYoIWouaW5SZWFkeVN0
YXRlKCkpe2kucHVzaChqLmdldCgiaWQiKSl9fSk7cj0KZXR1cm4gaX0sZ2V0QnlIaWQ6ZnVuY3Rp
b24oaSl7cmV0dXJuIF8uZmlyc3QodGhpcy5maWx0ZXIoZnVuY3Rpb24oail7cmV0dXJuPQogai5n
ZXQoImhpZCIpPTNEPTNEPTNEaX0pKX0sZ2V0VmlzaWJsZTpmdW5jdGlvbihpLGwsayl7az0zRGt8
fFtdO3ZhciBqPTNEbmU9CncgZih0aGlzLmZpbHRlcihmdW5jdGlvbihtKXtyZXR1cm4gbS5pc1Zp
c2libGUoaSxsKX0pKTtfLmVhY2goayxmdW5jdGlvbihtKT0Ke2lmKCFfLmlzRnVuY3Rpb24obSkp
e3JldHVybn1qPTNEbmV3IGYoai5maWx0ZXIobSkpfSk7cmV0dXJuIGp9LGhhdmVEZXRhaWxzPQo6
ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbGwoZnVuY3Rpb24oaSl7cmV0dXJuIGkuaGFzRGV0YWls
cygpfSl9LGZldGNoQWxsRGU9CnRhaWxzOmZ1bmN0aW9uKGope2o9M0RqfHx7fTt2YXIgaT0zRHtk
ZXRhaWxzOiJhbGwifTtqLmRhdGE9M0Qoai5kYXRhKT8oXy5leD0KdGVuZChqLmRhdGEsaSkpOihp
KTtyZXR1cm4gdGhpcy5mZXRjaChqKX0sYWpheFF1ZXVlOmZ1bmN0aW9uKGwsayl7dmFyIGo9M0Rq
PQpRdWVyeS5EZWZlcnJlZCgpLGk9M0R0aGlzLmxlbmd0aCxuPTNEW107aWYoIWkpe2oucmVzb2x2
ZShbXSk7cmV0dXJuIGp9dmFyIG09Cj0zRHRoaXMuY2hhaW4oKS5yZXZlcnNlKCkubWFwKGZ1bmN0
aW9uKHAsbyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHE9M0RsLmNhbD0KbChwLGspO3EuZG9uZShm
dW5jdGlvbihyKXtqLm5vdGlmeSh7Y3VycjpvLHRvdGFsOmkscmVzcG9uc2U6cixtb2RlbDpwfSl9
KTtxPQouYWx3YXlzKGZ1bmN0aW9uKHIpe24ucHVzaChyKTtpZihtLmxlbmd0aCl7bS5zaGlmdCgp
KCl9ZWxzZXtqLnJlc29sdmUobil9fSk9Cn19KS52YWx1ZSgpO20uc2hpZnQoKSgpO3JldHVybiBq
fSxtYXRjaGVzOmZ1bmN0aW9uKGkpe3JldHVybiB0aGlzLmZpbHRlcihmdT0KbmN0aW9uKGope3Jl
dHVybiBqLm1hdGNoZXMoaSl9KX0sc2V0OmZ1bmN0aW9uKGssaSl7dmFyIGo9M0R0aGlzO2s9M0Rf
Lm1hcChrPQosZnVuY3Rpb24obSl7dmFyIG49M0RqLmdldChtLmlkKTtpZighbil7cmV0dXJuIG19
dmFyIGw9M0RuLnRvSlNPTigpO18uZXh0ZW49CmQobCxtKTtyZXR1cm4gbH0pO0JhY2tib25lLkNv
bGxlY3Rpb24ucHJvdG90eXBlLnNldC5jYWxsKHRoaXMsayxpKX0sdG9TdHJpbj0KZzpmdW5jdGlv
bigpe3JldHVybihbIkhEQUNvbGxlY3Rpb24oIixbdGhpcy5oaXN0b3J5SWQsdGhpcy5sZW5ndGhd
LmpvaW4oKSwiPQopIl0uam9pbigiIikpfX0pO3JldHVybntIaXN0b3J5RGF0YXNldEFzc29jaWF0
aW9uOmUsSERBQ29sbGVjdGlvbjpmfX0pOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2Rl
ZmluZShbIm12Yy9iYXNlLW12YyIsInV0aWxzL2xvY2FsaXphdGlvbiJdLGZ1bmN0aW9uKGQsYil7
dmFyIGk9M0RCYWNrYm9uPQplLk1vZGVsLmV4dGVuZChkLkxvZ2dhYmxlTWl4aW4pLmV4dGVuZCh7
ZGVmYXVsdHM6e2hpc3RvcnlfaWQ6bnVsbCxtb2RlbF9jbGE9CnNzOiJIaXN0b3J5RGF0YXNldEFz
c29jaWF0aW9uIixoaWQ6MCxpZDpudWxsLG5hbWU6Iih1bm5hbWVkIGRhdGFzZXQpIixzdGF0ZT0K
OiJuZXciLGRlbGV0ZWQ6ZmFsc2UsdmlzaWJsZTp0cnVlLGFjY2Vzc2libGU6dHJ1ZSxwdXJnZWQ6
ZmFsc2UsZGF0YV90eXBlOiIiPQosZmlsZV9zaXplOjAsZmlsZV9leHQ6IiIsbWV0YV9maWxlczpb
XSxtaXNjX2JsdXJiOiIiLG1pc2NfaW5mbzoiIix0YWdzOltdLGE9Cm5ub3RhdGlvbjoiIn0sdXJs
Um9vdDpnYWxheHlfY29uZmlnLnJvb3QrImFwaS9oaXN0b3JpZXMvIix1cmw6ZnVuY3Rpb24oKXty
ZT0KdHVybiB0aGlzLnVybFJvb3QrdGhpcy5nZXQoImhpc3RvcnlfaWQiKSsiL2NvbnRlbnRzLyIr
dGhpcy5nZXQoImlkIil9LHVybHM6PQpmdW5jdGlvbigpe3ZhciBrPTNEdGhpcy5nZXQoImlkIik7
aWYoIWspe3JldHVybnt9fXZhciBqPTNEe3B1cmdlOmdhbGF4eV9jb249CmZpZy5yb290KyJkYXRh
c2V0cy8iK2srIi9wdXJnZV9hc3luYyIsZGlzcGxheTpnYWxheHlfY29uZmlnLnJvb3QrImRhdGFz
ZXRzLz0KIitrKyIvZGlzcGxheS8/cHJldmlldz0zRFRydWUiLGVkaXQ6Z2FsYXh5X2NvbmZpZy5y
b290KyJkYXRhc2V0cy8iK2srIi9lZGl0PQoiLGRvd25sb2FkOmdhbGF4eV9jb25maWcucm9vdCsi
ZGF0YXNldHMvIitrKyIvZGlzcGxheT90b19leHQ9M0QiK3RoaXMuZ2V0KCI9CmZpbGVfZXh0Iiks
cmVwb3J0X2Vycm9yOmdhbGF4eV9jb25maWcucm9vdCsiZGF0YXNldC9lcnJvcnM/aWQ9M0QiK2ss
cmVydW46Zz0KYWxheHlfY29uZmlnLnJvb3QrInRvb2xfcnVubmVyL3JlcnVuP2lkPTNEIitrLHNo
b3dfcGFyYW1zOmdhbGF4eV9jb25maWcucm9vPQp0KyJkYXRhc2V0cy8iK2srIi9zaG93X3BhcmFt
cyIsdmlzdWFsaXphdGlvbjpnYWxheHlfY29uZmlnLnJvb3QrInZpc3VhbGl6YXQ9CmlvbiIsYW5u
b3RhdGlvbjp7Z2V0OmdhbGF4eV9jb25maWcucm9vdCsiZGF0YXNldC9nZXRfYW5ub3RhdGlvbl9h
c3luYz9pZD0zRD0KIitrLHNldDpnYWxheHlfY29uZmlnLnJvb3QrImRhdGFzZXQvYW5ub3RhdGVf
YXN5bmM/aWQ9M0QiK2t9LG1ldGFfZG93bmxvYWQ6PQpnYWxheHlfY29uZmlnLnJvb3QrImRhdGFz
ZXQvZ2V0X21ldGFkYXRhX2ZpbGU/aGRhX2lkPTNEIitrKyImbWV0YWRhdGFfbmFtZT0KPTNEIn07
cmV0dXJuIGp9LGluaXRpYWxpemU6ZnVuY3Rpb24oail7dGhpcy5sb2codGhpcysiLmluaXRpYWxp
emUiLHRoaXMuYXR0PQpyaWJ1dGVzKTt0aGlzLmxvZygiXHRwYXJlbnQgaGlzdG9yeV9pZDogIit0
aGlzLmdldCgiaGlzdG9yeV9pZCIpKTtpZighdGhpcy49CmdldCgiYWNjZXNzaWJsZSIpKXt0aGlz
LnNldCgic3RhdGUiLGkuU1RBVEVTLk5PVF9WSUVXQUJMRSl9dGhpcy5fc2V0VXBMaXN0ZT0KbmVy
cygpfSxfc2V0VXBMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlzLm9uKCJjaGFuZ2U6c3RhdGUiLGZ1
bmN0aW9uKGssail7dGhpPQpzLmxvZyh0aGlzKyIgaGFzIGNoYW5nZWQgc3RhdGU6IixrLGopO2lm
KHRoaXMuaW5SZWFkeVN0YXRlKCkpe3RoaXMudHJpZ2dlcig9CiJzdGF0ZTpyZWFkeSIsayxqLHRo
aXMucHJldmlvdXMoInN0YXRlIikpfX0pfSxpc0RlbGV0ZWRPclB1cmdlZDpmdW5jdGlvbigpez0K
cmV0dXJuKHRoaXMuZ2V0KCJkZWxldGVkIil8fHRoaXMuZ2V0KCJwdXJnZWQiKSl9LGlzVmlzaWJs
ZTpmdW5jdGlvbihrLGwpe3ZhPQpyIGo9M0R0cnVlO2lmKCghaykmJih0aGlzLmdldCgiZGVsZXRl
ZCIpfHx0aGlzLmdldCgicHVyZ2VkIikpKXtqPTNEZmFsc2V9aWY9CigoIWwpJiYoIXRoaXMuZ2V0
KCJ2aXNpYmxlIikpKXtqPTNEZmFsc2V9cmV0dXJuIGp9LGhpZGRlbjpmdW5jdGlvbigpe3JldHVy
bj0KICF0aGlzLmdldCgidmlzaWJsZSIpfSxpblJlYWR5U3RhdGU6ZnVuY3Rpb24oKXt2YXIgaj0z
RF8uY29udGFpbnMoaS5SRUFEWV9TPQpUQVRFUyx0aGlzLmdldCgic3RhdGUiKSk7cmV0dXJuKHRo
aXMuaXNEZWxldGVkT3JQdXJnZWQoKXx8ail9LGhhc0RldGFpbHM6ZnU9Cm5jdGlvbigpe3JldHVy
biBfLmhhcyh0aGlzLmF0dHJpYnV0ZXMsImdlbm9tZV9idWlsZCIpfSxoYXNEYXRhOmZ1bmN0aW9u
KCl7cj0KZXR1cm4odGhpcy5nZXQoImZpbGVfc2l6ZSIpPjApfSwiZGVsZXRlIjpmdW5jdGlvbiBl
KGope2lmKHRoaXMuZ2V0KCJkZWxldGVkPQoiKSl7cmV0dXJuIGpRdWVyeS53aGVuKCl9cmV0dXJu
IHRoaXMuc2F2ZSh7ZGVsZXRlZDp0cnVlfSxqKX0sdW5kZWxldGU6ZnVuY3Q9CmlvbiBoKGope2lm
KCF0aGlzLmdldCgiZGVsZXRlZCIpfHx0aGlzLmdldCgicHVyZ2VkIikpe3JldHVybiBqUXVlcnku
d2hlbigpfT0KcmV0dXJuIHRoaXMuc2F2ZSh7ZGVsZXRlZDpmYWxzZX0sail9LGhpZGU6ZnVuY3Rp
b24gYyhqKXtpZighdGhpcy5nZXQoInZpc2liPQpsZSIpKXtyZXR1cm4galF1ZXJ5LndoZW4oKX1y
ZXR1cm4gdGhpcy5zYXZlKHt2aXNpYmxlOmZhbHNlfSxqKX0sdW5oaWRlOmZ1bmM9CnRpb24gZyhq
KXtpZih0aGlzLmdldCgidmlzaWJsZSIpKXtyZXR1cm4galF1ZXJ5LndoZW4oKX1yZXR1cm4gdGhp
cy5zYXZlKHt2aT0Kc2libGU6dHJ1ZX0sail9LHB1cmdlOmZ1bmN0aW9uIGYoail7aWYodGhpcy5n
ZXQoInB1cmdlZCIpKXtyZXR1cm4galF1ZXJ5LndoPQplbigpfWo9M0RqfHx7fTtqLnVybD0zRGdh
bGF4eV9jb25maWcucm9vdCsiZGF0YXNldHMvIit0aGlzLmdldCgiaWQiKSsiL3B1cmc9CmVfYXN5
bmMiO3ZhciBrPTNEdGhpcyxsPTNEalF1ZXJ5LmFqYXgoaik7bC5kb25lKGZ1bmN0aW9uKG8sbSxu
KXtrLnNldCh7ZGVsZT0KdGVkOnRydWUscHVyZ2VkOnRydWV9KX0pO2wuZmFpbChmdW5jdGlvbihx
LG0scCl7dmFyIG49M0RiKCJVbmFibGUgdG8gcHVyZ2UgPQpkYXRhc2V0Iik7dmFyIG89M0QoIlJl
bW92YWwgb2YgZGF0YXNldHMgYnkgdXNlcnMgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBHYWw9CmF4
eSBpbnN0YW5jZSIpO2lmKHEucmVzcG9uc2VKU09OJiZxLnJlc3BvbnNlSlNPTi5lcnJvcil7bj0z
RHEucmVzcG9uc2VKU09OLj0KZXJyb3J9ZWxzZXtpZihxLnJlc3BvbnNlVGV4dC5pbmRleE9mKG8p
IT0zRD0zRC0xKXtuPTNEb319cS5yZXNwb25zZVRleHQ9M0RuPQo7ay50cmlnZ2VyKCJlcnJvciIs
ayxxLGosYihuKSx7ZXJyb3I6bn0pfSk7cmV0dXJuIGx9LHNlYXJjaEF0dHJpYnV0ZXM6WyJuYW09
CmUiLCJmaWxlX2V4dCIsImdlbm9tZV9idWlsZCIsIm1pc2NfYmx1cmIiLCJtaXNjX2luZm8iLCJh
bm5vdGF0aW9uIiwidGFncyJdLD0Kc2VhcmNoQWxpYXNlczp7dGl0bGU6Im5hbWUiLGZvcm1hdDoi
ZmlsZV9leHQiLGRhdGFiYXNlOiJnZW5vbWVfYnVpbGQiLGJsdXJiPQo6Im1pc2NfYmx1cmIiLGRl
c2NyaXB0aW9uOiJtaXNjX2JsdXJiIixpbmZvOiJtaXNjX2luZm8iLHRhZzoidGFncyJ9LHNlYXJj
aEE9CnR0cmlidXRlOmZ1bmN0aW9uKGwsail7dmFyIGs9M0R0aGlzLmdldChsKTtpZighanx8KGs9
M0Q9M0Q9M0R1bmRlZmluZWR8fGs9Cj0zRD0zRD0zRG51bGwpKXtyZXR1cm4gZmFsc2V9aWYoXy5p
c0FycmF5KGspKXtyZXR1cm4gdGhpcy5fc2VhcmNoQXJyYXlBdHRyaT0KYnV0ZShrLGopfXJldHVy
bihrLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGoudG9Mb3dlckNhc2UoKSkhPTNE
PTNEPQotMSl9LF9zZWFyY2hBcnJheUF0dHJpYnV0ZTpmdW5jdGlvbihrLGope2o9M0RqLnRvTG93
ZXJDYXNlKCk7cmV0dXJuIF8uYW55KGs9CixmdW5jdGlvbihsKXtyZXR1cm4obC50b1N0cmluZygp
LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihqLnRvTG93ZXJDYXNlKCkpIT0zRD0KPTNELTEpfSl9LHNl
YXJjaDpmdW5jdGlvbihqKXt2YXIgaz0zRHRoaXM7cmV0dXJuIF8uZmlsdGVyKHRoaXMuc2VhcmNo
QXR0cmliPQp1dGVzLGZ1bmN0aW9uKGwpe3JldHVybiBrLnNlYXJjaEF0dHJpYnV0ZShsLGopfSl9
LG1hdGNoZXM6ZnVuY3Rpb24oayl7dmFyIG09Cj0zRCI9M0QiLGo9M0RrLnNwbGl0KG0pO2lmKGou
bGVuZ3RoPj0zRDIpe3ZhciBsPTNEalswXTtsPTNEdGhpcy5zZWFyY2hBbGlhcz0KZXNbbF18fGw7
cmV0dXJuIHRoaXMuc2VhcmNoQXR0cmlidXRlKGwsalsxXSl9cmV0dXJuICEhdGhpcy5zZWFyY2go
aykubGVuZ3RoPQp9LG1hdGNoZXNBbGw6ZnVuY3Rpb24oayl7dmFyIGo9M0R0aGlzO2s9M0RrLm1h
dGNoKC8oIi4qInxcdyo9M0QiLioifFxTKikvZyk9Ci5maWx0ZXIoZnVuY3Rpb24obCl7cmV0dXJu
ICEhbH0pO3JldHVybiBfLmFsbChrLGZ1bmN0aW9uKGwpe2w9M0RsLnJlcGxhY2UoLz0KIi9nLCIi
KTtyZXR1cm4gai5tYXRjaGVzKGwpfSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGo9M0R0aGlz
LmdldCgiaWQiKXx8PQoiIjtpZih0aGlzLmdldCgibmFtZSIpKXtqPTNEdGhpcy5nZXQoImhpZCIp
KycgOiInK3RoaXMuZ2V0KCJuYW1lIikrJyIsJytqfXI9CmV0dXJuIkhEQSgiK2orIikifX0pO2ku
U1RBVEVTPTNEe1VQTE9BRDoidXBsb2FkIixRVUVVRUQ6InF1ZXVlZCIsUlVOTklORzoicj0KdW5u
aW5nIixTRVRUSU5HX01FVEFEQVRBOiJzZXR0aW5nX21ldGFkYXRhIixORVc6Im5ldyIsRU1QVFk6
ImVtcHR5IixPSzoib2siPQosUEFVU0VEOiJwYXVzZWQiLEZBSUxFRF9NRVRBREFUQToiZmFpbGVk
X21ldGFkYXRhIixOT1RfVklFV0FCTEU6Im5vUGVybWlzc2k9Cm9uIixESVNDQVJERUQ6ImRpc2Nh
cmRlZCIsRVJST1I6ImVycm9yIn07aS5SRUFEWV9TVEFURVM9M0RbaS5TVEFURVMuT0ssaS5TVD0K
QVRFUy5FTVBUWSxpLlNUQVRFUy5QQVVTRUQsaS5TVEFURVMuRkFJTEVEX01FVEFEQVRBLGkuU1RB
VEVTLk5PVF9WSUVXQUJMRSxpPQouU1RBVEVTLkRJU0NBUkRFRCxpLlNUQVRFUy5FUlJPUl07aS5O
T1RfUkVBRFlfU1RBVEVTPTNEW2kuU1RBVEVTLlVQTE9BRCxpLlM9ClRBVEVTLlFVRVVFRCxpLlNU
QVRFUy5SVU5OSU5HLGkuU1RBVEVTLlNFVFRJTkdfTUVUQURBVEEsaS5TVEFURVMuTkVXXTt2YXIg
YT0KPTNEQmFja2JvbmUuQ29sbGVjdGlvbi5leHRlbmQoZC5Mb2dnYWJsZU1peGluKS5leHRlbmQo
e21vZGVsOmksdXJsUm9vdDpnYWxhPQp4eV9jb25maWcucm9vdCsiYXBpL2hpc3RvcmllcyIsdXJs
OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXJsUm9vdCsiLyIrdGhpcy49Cmhpc3RvcnlJZCsiL2Nv
bnRlbnRzIn0saW5pdGlhbGl6ZTpmdW5jdGlvbihrLGope2o9M0RqfHx7fTt0aGlzLmhpc3RvcnlJ
ZD0zRD0Kai5oaXN0b3J5SWR9LGlkczpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlv
bihqKXtyZXR1cm4gai5pZH0pfSxub3RSPQplYWR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmls
dGVyKGZ1bmN0aW9uKGope3JldHVybiAhai5pblJlYWR5U3RhdGUoKX0pfSw9CnJ1bm5pbmc6ZnVu
Y3Rpb24oKXt2YXIgaj0zRFtdO3RoaXMuZWFjaChmdW5jdGlvbihrKXtpZighay5pblJlYWR5U3Rh
dGUoKSl7aj0KLnB1c2goay5nZXQoImlkIikpfX0pO3JldHVybiBqfSxnZXRCeUhpZDpmdW5jdGlv
bihqKXtyZXR1cm4gXy5maXJzdCh0aGlzLmZpPQpsdGVyKGZ1bmN0aW9uKGspe3JldHVybiBrLmdl
dCgiaGlkIik9M0Q9M0Q9M0RqfSkpfSxnZXRWaXNpYmxlOmZ1bmN0aW9uKGosbSw9Cmwpe2w9M0Rs
fHxbXTt2YXIgaz0zRG5ldyBhKHRoaXMuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBuLmlzVmlz
aWJsZShqLG0pfT0KKSk7Xy5lYWNoKGwsZnVuY3Rpb24obil7aWYoIV8uaXNGdW5jdGlvbihuKSl7
cmV0dXJufWs9M0RuZXcgYShrLmZpbHRlcihuKSl9PQopO3JldHVybiBrfSxoYXZlRGV0YWlsczpm
dW5jdGlvbigpe3JldHVybiB0aGlzLmFsbChmdW5jdGlvbihqKXtyZXR1cm4gai5oYXM9CkRldGFp
bHMoKX0pfSxmZXRjaEFsbERldGFpbHM6ZnVuY3Rpb24oayl7az0zRGt8fHt9O3ZhciBqPTNEe2Rl
dGFpbHM6ImFsbCJ9Oz0Kay5kYXRhPTNEKGsuZGF0YSk/KF8uZXh0ZW5kKGsuZGF0YSxqKSk6KGop
O3JldHVybiB0aGlzLmZldGNoKGspfSxhamF4UXVldWU6PQpmdW5jdGlvbihtLGwpe3ZhciBrPTNE
alF1ZXJ5LkRlZmVycmVkKCksaj0zRHRoaXMubGVuZ3RoLG89M0RbXTtpZighail7ay5yZXM9Cm9s
dmUoW10pO3JldHVybiBrfXZhciBuPTNEdGhpcy5jaGFpbigpLnJldmVyc2UoKS5tYXAoZnVuY3Rp
b24ocSxwKXtyZXR1cm4gZj0KdW5jdGlvbigpe3ZhciByPTNEbS5jYWxsKHEsbCk7ci5kb25lKGZ1
bmN0aW9uKHMpe2subm90aWZ5KHtjdXJyOnAsdG90YWw6aixyPQplc3BvbnNlOnMsbW9kZWw6cX0p
fSk7ci5hbHdheXMoZnVuY3Rpb24ocyl7by5wdXNoKHMpO2lmKG4ubGVuZ3RoKXtuLnNoaWZ0KCk9
CigpfWVsc2V7ay5yZXNvbHZlKG8pfX0pfX0pLnZhbHVlKCk7bi5zaGlmdCgpKCk7cmV0dXJuIGt9
LG1hdGNoZXM6ZnVuY3Rpb24oaj0KKXtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oayl7cmV0
dXJuIGsubWF0Y2hlcyhqKX0pfSxzZXQ6ZnVuY3Rpb24obCxqKXt2PQphciBrPTNEdGhpcztsPTNE
Xy5tYXAobCxmdW5jdGlvbihuKXt2YXIgbz0zRGsuZ2V0KG4uaWQpO2lmKCFvKXtyZXR1cm4gbn12
YXI9CiBtPTNEby50b0pTT04oKTtfLmV4dGVuZChtLG4pO3JldHVybiBtfSk7QmFja2JvbmUuQ29s
bGVjdGlvbi5wcm90b3R5cGUuc2V0Lj0KY2FsbCh0aGlzLGwsail9LHRvU3RyaW5nOmZ1bmN0aW9u
KCl7cmV0dXJuKFsiSERBQ29sbGVjdGlvbigiLFt0aGlzLmhpc3RvcnlJPQpkLHRoaXMubGVuZ3Ro
XS5qb2luKCksIikiXS5qb2luKCIiKSl9fSk7cmV0dXJue0hpc3RvcnlEYXRhc2V0QXNzb2NpYXRp
b246aSw9CkhEQUNvbGxlY3Rpb246YX19KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCgpk
aWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMx
OTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL3BhY2tl
ZC9tdmMvaGlzdG9yeS9hbm5vdGF0ZWQtaGlzdG9yeS1wYW5lbD0KLmpzCi0tLSBhL3N0YXRpYy9z
Y3JpcHRzL3BhY2tlZC9tdmMvaGlzdG9yeS9hbm5vdGF0ZWQtaGlzdG9yeS1wYW5lbC5qcworKysg
Yi9zdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL2hpc3RvcnkvYW5ub3RhdGVkLWhpc3RvcnktcGFu
ZWwuanMKQEAgLTEsMSArMSwxIEBACi1kZWZpbmUoWyJtdmMvZGF0YXNldC9oZGEtbW9kZWwiLCJt
dmMvZGF0YXNldC9oZGEtYmFzZSIsIm12Yy9oaXN0b3J5L3JlYWRvbj0KbHktaGlzdG9yeS1wYW5l
bCJdLGZ1bmN0aW9uKGMsYSxiKXt2YXIgZD0zRGIuUmVhZE9ubHlIaXN0b3J5UGFuZWwuZXh0ZW5k
KHtjPQpsYXNzTmFtZToiYW5ub3RhdGVkLWhpc3RvcnktcGFuZWwiLEhEQVZpZXdDbGFzczphLkhE
QUJhc2VWaWV3LHJlbmRlck1vZGVsOmY9CnVuY3Rpb24oKXt0aGlzLiRlbC5hZGRDbGFzcyh0aGlz
LmNsYXNzTmFtZSk7dmFyIGc9M0RiLlJlYWRPbmx5SGlzdG9yeVBhbmVsLj0KcHJvdG90eXBlLnJl
bmRlck1vZGVsLmNhbGwodGhpcyksZT0zRHRoaXMuJGRhdGFzZXRzTGlzdChnKSxmPTNEJCgiPHRh
YmxlLz4iPQopLmFkZENsYXNzKCJkYXRhc2V0cy1saXN0IGRhdGFzZXRzLXRhYmxlIik7Zi5hcHBl
bmQoZS5jaGlsZHJlbigpKTtlLnJlcGxhY2U9CldpdGgoZik7Zy5maW5kKCIuaGlzdG9yeS1zdWJ0
aXRsZSIpLmFmdGVyKHRoaXMucmVuZGVySGlzdG9yeUFubm90YXRpb24oKSk7Zz0KLmZpbmQoIi5o
aXN0b3J5LXNlYXJjaC1idG4iKS5oaWRlKCk7Zy5maW5kKCIuaGlzdG9yeS1jb250cm9scyIpLmFm
dGVyKGcuZmluPQpkKCIuaGlzdG9yeS1zZWFyY2gtY29udHJvbHMiKS5zaG93KCkpO3JldHVybiBn
fSxyZW5kZXJIaXN0b3J5QW5ub3RhdGlvbjpmdW49CmN0aW9uKCl7dmFyIGU9M0R0aGlzLm1vZGVs
LmdldCgiYW5ub3RhdGlvbiIpO2lmKCFlKXtyZXR1cm4gbnVsbH1yZXR1cm4gJChbJz0KPGRpdiBj
bGFzcz0zRCJoaXN0b3J5LWFubm90YXRpb24iPicsZSwiPC9kaXY+Il0uam9pbigiIikpfSxyZW5k
ZXJIZGFzOmZ1bmN0PQppb24oZil7Zj0zRGZ8fHRoaXMuJGVsO3ZhciBlPTNEYi5SZWFkT25seUhp
c3RvcnlQYW5lbC5wcm90b3R5cGUucmVuZGVySGRhcy49CmNhbGwodGhpcyxmKTt0aGlzLiRkYXRh
c2V0c0xpc3QoZikucHJlcGVuZCgkKCI8dHIvPiIpLmFkZENsYXNzKCJoZWFkZXJzIikuYT0KcHBl
bmQoWyQoIjx0aC8+IikudGV4dChfbCgiRGF0YXNldCIpKSwkKCI8dGgvPiIpLnRleHQoX2woIkFu
bm90YXRpb24iKSldKSk7PQpyZXR1cm4gZX0sYXR0YWNoSGRhVmlldzpmdW5jdGlvbihoLGYpe2Y9
M0RmfHx0aGlzLiRlbDt2YXIgaT0zRF8uZmluZChoLmVsLmM9Cmxhc3NMaXN0LGZ1bmN0aW9uKGop
e3JldHVybigvXnN0YXRlXC0vKS50ZXN0KGopfSksZT0zRGgubW9kZWwuZ2V0KCJhbm5vdGF0aT0K
b24iKXx8IiIsZz0zRCQoIjx0ci8+IikuYWRkQ2xhc3MoImRhdGFzZXQtcm93IikuYXBwZW5kKFsk
KCI8dGQvPiIpLmFkZENsYXNzPQooImRhdGFzZXQtY29udGFpbmVyIikuYXBwZW5kKGguJGVsKS5h
ZGRDbGFzcyhpP2kucmVwbGFjZSgiLSIsIi1jb2xvci0iKToiIik9CiwkKCI8dGQvPiIpLmFkZENs
YXNzKCJhZGRpdGlvbmFsLWluZm8iKS50ZXh0KGUpXSk7dGhpcy4kZGF0YXNldHNMaXN0KGYpLmFw
cD0KZW5kKGcpfSxldmVudHM6Xy5leHRlbmQoXy5jbG9uZShiLlJlYWRPbmx5SGlzdG9yeVBhbmVs
LnByb3RvdHlwZS5ldmVudHMpLHsiPQpjbGljayB0ciI6ZnVuY3Rpb24oZSl7JChlLmN1cnJlbnRU
YXJnZXQpLmZpbmQoIi5kYXRhc2V0LXRpdGxlLWJhciIpLmNsaWNrKCk9Cn0sImNsaWNrIC5pY29u
LWJ0biI6ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKX19KSx0b1N0cmluZzpmdW5jdGlv
bigpez0KcmV0dXJuIkFubm90YXRlZEhpc3RvcnlQYW5lbCgiKygodGhpcy5tb2RlbCk/KHRoaXMu
bW9kZWwuZ2V0KCJuYW1lIikpOigiIikpPQorIikifX0pO3JldHVybntBbm5vdGF0ZWRIaXN0b3J5
UGFuZWw6ZH19KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitkZWZpbmUoWyJtdmMvZGF0
YXNldC9oZGEtbW9kZWwiLCJtdmMvZGF0YXNldC9oZGEtYmFzZSIsIm12Yy9oaXN0b3J5L3JlYWRv
bj0KbHktaGlzdG9yeS1wYW5lbCIsInV0aWxzL2xvY2FsaXphdGlvbiJdLGZ1bmN0aW9uKGQsYSxi
LGMpe3ZhciBlPTNEYi5SZWFkT25sPQp5SGlzdG9yeVBhbmVsLmV4dGVuZCh7Y2xhc3NOYW1lOiJh
bm5vdGF0ZWQtaGlzdG9yeS1wYW5lbCIsSERBVmlld0NsYXNzOmEuSEQ9CkFCYXNlVmlldyxyZW5k
ZXJNb2RlbDpmdW5jdGlvbigpe3RoaXMuJGVsLmFkZENsYXNzKHRoaXMuY2xhc3NOYW1lKTt2YXIg
aD0zRD0KYi5SZWFkT25seUhpc3RvcnlQYW5lbC5wcm90b3R5cGUucmVuZGVyTW9kZWwuY2FsbCh0
aGlzKSxmPTNEdGhpcy4kZGF0YXNldHNMPQppc3QoaCksZz0zRCQoIjx0YWJsZS8+IikuYWRkQ2xh
c3MoImRhdGFzZXRzLWxpc3QgZGF0YXNldHMtdGFibGUiKTtnLmFwcGVuZCg9CmYuY2hpbGRyZW4o
KSk7Zi5yZXBsYWNlV2l0aChnKTtoLmZpbmQoIi5oaXN0b3J5LXN1YnRpdGxlIikuYWZ0ZXIodGhp
cy5yZW5kZT0Kckhpc3RvcnlBbm5vdGF0aW9uKCkpO2guZmluZCgiLmhpc3Rvcnktc2VhcmNoLWJ0
biIpLmhpZGUoKTtoLmZpbmQoIi5oaXN0b3J5PQotY29udHJvbHMiKS5hZnRlcihoLmZpbmQoIi5o
aXN0b3J5LXNlYXJjaC1jb250cm9scyIpLnNob3coKSk7cmV0dXJuIGh9LHJlbmQ9CmVySGlzdG9y
eUFubm90YXRpb246ZnVuY3Rpb24oKXt2YXIgZj0zRHRoaXMubW9kZWwuZ2V0KCJhbm5vdGF0aW9u
Iik7aWYoIWYpez0KcmV0dXJuIG51bGx9cmV0dXJuICQoWyc8ZGl2IGNsYXNzPTNEImhpc3Rvcnkt
YW5ub3RhdGlvbiI+JyxmLCI8L2Rpdj4iXS5qb2luPQooIiIpKX0scmVuZGVySGRhczpmdW5jdGlv
bihnKXtnPTNEZ3x8dGhpcy4kZWw7dmFyIGY9M0RiLlJlYWRPbmx5SGlzdG9yeVBhbmU9CmwucHJv
dG90eXBlLnJlbmRlckhkYXMuY2FsbCh0aGlzLGcpO3RoaXMuJGRhdGFzZXRzTGlzdChnKS5wcmVw
ZW5kKCQoIjx0ci8+Ij0KKS5hZGRDbGFzcygiaGVhZGVycyIpLmFwcGVuZChbJCgiPHRoLz4iKS50
ZXh0KGMoIkRhdGFzZXQiKSksJCgiPHRoLz4iKS50ZXh0PQooYygiQW5ub3RhdGlvbiIpKV0pKTty
ZXR1cm4gZn0sYXR0YWNoSGRhVmlldzpmdW5jdGlvbihpLGcpe2c9M0RnfHx0aGlzLiRlbDs9CnZh
ciBqPTNEXy5maW5kKGkuZWwuY2xhc3NMaXN0LGZ1bmN0aW9uKGspe3JldHVybigvXnN0YXRlXC0v
KS50ZXN0KGspfSksZj0zRD0KaS5tb2RlbC5nZXQoImFubm90YXRpb24iKXx8IiIsaD0zRCQoIjx0
ci8+IikuYWRkQ2xhc3MoImRhdGFzZXQtcm93IikuYXBwZW5kPQooWyQoIjx0ZC8+IikuYWRkQ2xh
c3MoImRhdGFzZXQtY29udGFpbmVyIikuYXBwZW5kKGkuJGVsKS5hZGRDbGFzcyhqP2oucmVwbGE9
CmNlKCItIiwiLWNvbG9yLSIpOiIiKSwkKCI8dGQvPiIpLmFkZENsYXNzKCJhZGRpdGlvbmFsLWlu
Zm8iKS50ZXh0KGYpXSk7dGhpcz0KLiRkYXRhc2V0c0xpc3QoZykuYXBwZW5kKGgpfSxldmVudHM6
Xy5leHRlbmQoXy5jbG9uZShiLlJlYWRPbmx5SGlzdG9yeVBhbmVsPQoucHJvdG90eXBlLmV2ZW50
cykseyJjbGljayB0ciI6ZnVuY3Rpb24oZil7JChmLmN1cnJlbnRUYXJnZXQpLmZpbmQoIi5kYXRh
c2U9CnQtdGl0bGUtYmFyIikuY2xpY2soKX0sImNsaWNrIC5pY29uLWJ0biI6ZnVuY3Rpb24oZil7
Zi5zdG9wUHJvcGFnYXRpb24oKX19KT0KLHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIkFubm90
YXRlZEhpc3RvcnlQYW5lbCgiKygodGhpcy5tb2RlbCk/KHRoaXMubW9kPQplbC5nZXQoIm5hbWUi
KSk6KCIiKSkrIikifX0pO3JldHVybntBbm5vdGF0ZWRIaXN0b3J5UGFuZWw6ZX19KTsKXCBObyBu
ZXdsaW5lIGF0IGVuZCBvZiBmaWxlCgpkaWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAxNjFmMGZj
NzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNhZGRmZTAy
Y2IyIHN0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMvaGlzdG9yeS9jdXJyZW50LWhpc3RvcnktcGFu
ZWwuanMKLS0tIGEvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2N1cnJlbnQtaGlz
dG9yeS1wYW5lbC5qcworKysgYi9zdGF0aWMvc2NyaXB0cy9wYWNrZWQvbXZjL2hpc3RvcnkvY3Vy
cmVudC1oaXN0b3J5LXBhbmVsLmpzCkBAIC0xLDEgKzEsMSBAQAotZGVmaW5lKFsibXZjL2RhdGFz
ZXQvaGRhLWVkaXQiLCJtdmMvaGlzdG9yeS9oaXN0b3J5LXBhbmVsIiwibXZjL2Jhc2UtbXZjIl09
CixmdW5jdGlvbihiLGYsYyl7dmFyIGQ9M0RjLlNlc3Npb25TdG9yYWdlTW9kZWwuZXh0ZW5kKHtk
ZWZhdWx0czp7c2VhcmNoaW5nOj0KZmFsc2UsdGFnc0VkaXRvclNob3duOmZhbHNlLGFubm90YXRp
b25FZGl0b3JTaG93bjpmYWxzZX0sdG9TdHJpbmc6ZnVuY3Rpb24oPQope3JldHVybiJIaXN0b3J5
UGFuZWxQcmVmcygiK0pTT04uc3RyaW5naWZ5KHRoaXMudG9KU09OKCkpKyIpIn19KTtkLnN0b3Jh
Z2U9CktleT0zRGZ1bmN0aW9uIGUoKXtyZXR1cm4oImhpc3RvcnktcGFuZWwiKX07dmFyIGE9M0Rm
Lkhpc3RvcnlQYW5lbC5leHRlbmQoez0KSERBVmlld0NsYXNzOmIuSERBRWRpdFZpZXcsZW1wdHlN
c2c6X2woIlRoaXMgaGlzdG9yeSBpcyBlbXB0eS4gQ2xpY2sgJ0dldCBEPQphdGEnIG9uIHRoZSBs
ZWZ0IHRvb2wgbWVudSB0byBzdGFydCIpLG5vbmVGb3VuZE1zZzpfbCgiTm8gbWF0Y2hpbmcgZGF0
YXNldHM9CiBmb3VuZCIpLGluaXRpYWxpemU6ZnVuY3Rpb24oZyl7Zz0zRGd8fHt9O3RoaXMucHJl
ZmVyZW5jZXM9M0RuZXcgZChfLmV4dGVuZD0KKHtpZDpkLnN0b3JhZ2VLZXkoKX0sXy5waWNrKGcs
Xy5rZXlzKGQucHJvdG90eXBlLmRlZmF1bHRzKSkpKTtmLkhpc3RvcnlQYW5lPQpsLnByb3RvdHlw
ZS5pbml0aWFsaXplLmNhbGwodGhpcyxnKX0sbG9hZEN1cnJlbnRIaXN0b3J5OmZ1bmN0aW9uKGgp
e3ZhciBnPQo9M0R0aGlzO3JldHVybiB0aGlzLmxvYWRIaXN0b3J5V2l0aEhEQURldGFpbHMoImN1
cnJlbnQiLGgpLnRoZW4oZnVuY3Rpb24oaiw9Cmkpe2cudHJpZ2dlcigiY3VycmVudC1oaXN0b3J5
IixnKX0pfSxzd2l0Y2hUb0hpc3Rvcnk6ZnVuY3Rpb24oaixpKXt2YXIgZz0zRD0KdGhpcyxoPTNE
ZnVuY3Rpb24oKXtyZXR1cm4galF1ZXJ5LmFqYXgoe3VybDpnYWxheHlfY29uZmlnLnJvb3QrImFw
aS9oaXN0b3JpPQplcy8iK2orIi9zZXRfYXNfY3VycmVudCIsbWV0aG9kOiJQVVQifSl9O3JldHVy
biB0aGlzLmxvYWRIaXN0b3J5V2l0aEhEQURldGE9CmlscyhqLGksaCkudGhlbihmdW5jdGlvbihs
LGspe2cudHJpZ2dlcigic3dpdGNoZWQtaGlzdG9yeSIsZyl9KX0sY3JlYXRlTmV3SD0KaXN0b3J5
OmZ1bmN0aW9uKGkpe2lmKCFHYWxheHl8fCFHYWxheHkuY3VyclVzZXJ8fEdhbGF4eS5jdXJyVXNl
ci5pc0Fub255bW91PQpzKCkpe3RoaXMuZGlzcGxheU1lc3NhZ2UoImVycm9yIixfbCgiWW91IG11
c3QgYmUgbG9nZ2VkIGluIHRvIGNyZWF0ZSBoaXN0b3I9CmllcyIpKTtyZXR1cm4gJC53aGVuKCl9
dmFyIGc9M0R0aGlzLGg9M0RmdW5jdGlvbigpe3JldHVybiBqUXVlcnkucG9zdChnYWxheD0KeV9j
b25maWcucm9vdCsiYXBpL2hpc3RvcmllcyIse2N1cnJlbnQ6dHJ1ZX0pfTtyZXR1cm4gdGhpcy5s
b2FkSGlzdG9yeSh1bmRlPQpmaW5lZCxpLGgpLnRoZW4oZnVuY3Rpb24oayxqKXtnLnRyaWdnZXIo
Im5ldy1oaXN0b3J5IixnKX0pfSxzZXRNb2RlbDpmdW5jdGk9Cm9uKGgsZyxpKXtmLkhpc3RvcnlQ
YW5lbC5wcm90b3R5cGUuc2V0TW9kZWwuY2FsbCh0aGlzLGgsZyxpKTtpZih0aGlzLm1vZGVsKT0K
e3RoaXMubG9nKCJjaGVja2luZyBmb3IgdXBkYXRlcyIpO3RoaXMubW9kZWwuY2hlY2tGb3JVcGRh
dGVzKCl9cmV0dXJuIHRoaXN9PQosX3NldFVwTW9kZWxFdmVudEhhbmRsZXJzOmZ1bmN0aW9uKCl7
Zi5IaXN0b3J5UGFuZWwucHJvdG90eXBlLl9zZXRVcE1vZGVsRXY9CmVudEhhbmRsZXJzLmNhbGwo
dGhpcyk7aWYoR2FsYXh5JiZHYWxheHkucXVvdGFNZXRlcil7dGhpcy5saXN0ZW5Ubyh0aGlzLm1v
ZD0KZWwsImNoYW5nZTpuaWNlX3NpemUiLGZ1bmN0aW9uKCl7R2FsYXh5LnF1b3RhTWV0ZXIudXBk
YXRlKCl9KX10aGlzLm1vZGVsLmhkPQphcy5vbigic3RhdGU6cmVhZHkiLGZ1bmN0aW9uKGgsaSxn
KXtpZigoIWguZ2V0KCJ2aXNpYmxlIikpJiYoIXRoaXMuc3RvcmFnZS49CmdldCgic2hvd19oaWRk
ZW4iKSkpe3RoaXMucmVtb3ZlSGRhVmlldyh0aGlzLmhkYVZpZXdzW2guaWRdKX19LHRoaXMpfSxy
ZW5kZT0KcjpmdW5jdGlvbihpLGope3RoaXMubG9nKCJyZW5kZXI6IixpLGopO2k9M0QoaT0zRD0z
RD0zRHVuZGVmaW5lZCk/KHRoaXMuZnhTPQpwZWVkKTooaSk7dmFyIGc9M0R0aGlzLGg7aWYodGhp
cy5tb2RlbCl7aD0zRHRoaXMucmVuZGVyTW9kZWwoKX1lbHNle2g9M0R0aGk9CnMucmVuZGVyV2l0
aG91dE1vZGVsKCl9JChnKS5xdWV1ZSgiZngiLFtmdW5jdGlvbihrKXtpZihpJiZnLiRlbC5pcygi
OnZpc2libD0KZSIpKXtnLiRlbC5mYWRlT3V0KGksayl9ZWxzZXtrKCl9fSxmdW5jdGlvbihrKXtn
LiRlbC5lbXB0eSgpO2lmKGgpe2cuJGVsLmFwPQpwZW5kKGguY2hpbGRyZW4oKSk7Zy5yZW5kZXJC
YXNlZE9uUHJlZnMoKX1rKCl9LGZ1bmN0aW9uKGspe2lmKGkmJiFnLiRlbC5pcyg9CiI6dmlzaWJs
ZSIpKXtnLiRlbC5mYWRlSW4oaSxrKX1lbHNle2soKX19LGZ1bmN0aW9uKGspe2lmKGope2ouY2Fs
bCh0aGlzKX1nLj0KdHJpZ2dlcigicmVuZGVyZWQiLHRoaXMpO2soKX1dKTtyZXR1cm4gdGhpc30s
cmVuZGVyQmFzZWRPblByZWZzOmZ1bmN0aW9uKCl7PQppZih0aGlzLnByZWZlcmVuY2VzLmdldCgi
c2VhcmNoaW5nIikpe3RoaXMudG9nZ2xlU2VhcmNoQ29udHJvbHMoMCx0cnVlKX19LF89CnJlbmRl
ckVtcHR5TXNnOmZ1bmN0aW9uKGkpe3ZhciBoPTNEdGhpcyxnPTNEaC4kZW1wdHlNZXNzYWdlKGkp
LGo9M0QkKCIudG9vbD0KTWVudUNvbnRhaW5lciIpO2lmKChfLmlzRW1wdHkoaC5oZGFWaWV3cykm
JiFoLnNlYXJjaEZvcikmJihHYWxheHkmJkdhbGF4eS51PQpwbG9hZCYmai5zaXplKCkpKXtnLmVt
cHR5KCk7Zy5odG1sKFtfbCgiVGhpcyBoaXN0b3J5IGlzIGVtcHR5LiAiKSxfbCgiWW91IGM9CmFu
ICIpLCc8YSBjbGFzcz0zRCJ1cGxvYWRlci1saW5rIiBocmVmPTNEImphdmFzY3JpcHQ6dm9pZCgw
KSI+JyxfbCgibG9hZCB5bz0KdXIgb3duIGRhdGEiKSwiPC9hPiIsX2woIiBvciAiKSwnPGEgY2xh
c3M9M0QiZ2V0LWRhdGEtbGluayIgaHJlZj0zRCJqYXZhc2NyPQppcHQ6dm9pZCgwKSI+JyxfbCgi
Z2V0IGRhdGEgZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UiKSwiPC9hPiJdLmpvaW4oIiIpKTtnLmY9
CmluZCgiLnVwbG9hZGVyLWxpbmsiKS5jbGljayhmdW5jdGlvbihrKXtHYWxheHkudXBsb2FkLl9l
dmVudFNob3coayl9KTtnLmZpbj0KZCgiLmdldC1kYXRhLWxpbmsiKS5jbGljayhmdW5jdGlvbihr
KXtqLnBhcmVudCgpLnNjcm9sbFRvcCgwKTtqLmZpbmQoJ3NwYW46PQpjb250YWlucygiR2V0IERh
dGEiKScpLmNsaWNrKCl9KTtnLnNob3coKX1lbHNle2YuSGlzdG9yeVBhbmVsLnByb3RvdHlwZS5f
cmU9Cm5kZXJFbXB0eU1zZy5jYWxsKHRoaXMsaSl9cmV0dXJuIHRoaXN9LHRvZ2dsZVNlYXJjaENv
bnRyb2xzOmZ1bmN0aW9uKGgsZyl7dj0KYXIgaT0zRGYuSGlzdG9yeVBhbmVsLnByb3RvdHlwZS50
b2dnbGVTZWFyY2hDb250cm9scy5jYWxsKHRoaXMsaCxnKTt0aGlzLnByPQplZmVyZW5jZXMuc2V0
KCJzZWFyY2hpbmciLGkpfSxfcmVuZGVyVGFnczpmdW5jdGlvbihnKXt2YXIgaD0zRHRoaXM7Zi5I
aXN0b3I9CnlQYW5lbC5wcm90b3R5cGUuX3JlbmRlclRhZ3MuY2FsbCh0aGlzLGcpO2lmKHRoaXMu
cHJlZmVyZW5jZXMuZ2V0KCJ0YWdzRWRpdD0Kb3JTaG93biIpKXt0aGlzLnRhZ3NFZGl0b3IudG9n
Z2xlKHRydWUpfXRoaXMudGFnc0VkaXRvci5vbigiaGlkZGVuVW50aWxBY3RpPQp2YXRlZDpzaG93
biBoaWRkZW5VbnRpbEFjdGl2YXRlZDpoaWRkZW4iLGZ1bmN0aW9uKGkpe2gucHJlZmVyZW5jZXMu
c2V0KCJ0YWc9CnNFZGl0b3JTaG93biIsaS5oaWRkZW4pfSl9LF9yZW5kZXJBbm5vdGF0aW9uOmZ1
bmN0aW9uKGcpe3ZhciBoPTNEdGhpcztmLkhpcz0KdG9yeVBhbmVsLnByb3RvdHlwZS5fcmVuZGVy
QW5ub3RhdGlvbi5jYWxsKHRoaXMsZyk7aWYodGhpcy5wcmVmZXJlbmNlcy5nZXQoPQoiYW5ub3Rh
dGlvbkVkaXRvclNob3duIikpe3RoaXMuYW5ub3RhdGlvbkVkaXRvci50b2dnbGUodHJ1ZSl9dGhp
cy5hbm5vdGF0aW89Cm5FZGl0b3Iub24oImhpZGRlblVudGlsQWN0aXZhdGVkOnNob3duIGhpZGRl
blVudGlsQWN0aXZhdGVkOmhpZGRlbiIsZnVuY3Rpbz0KbihpKXtoLnByZWZlcmVuY2VzLnNldCgi
YW5ub3RhdGlvbkVkaXRvclNob3duIixpLmhpZGRlbil9KX0sY29ubmVjdFRvUXVvdGFNPQpldGVy
OmZ1bmN0aW9uKGcpe2lmKCFnKXtyZXR1cm4gdGhpc310aGlzLmxpc3RlblRvKGcsInF1b3RhOm92
ZXIiLHRoaXMuc2hvd1E9CnVvdGFNZXNzYWdlKTt0aGlzLmxpc3RlblRvKGcsInF1b3RhOnVuZGVy
Iix0aGlzLmhpZGVRdW90YU1lc3NhZ2UpO3RoaXMub24oIj0KcmVuZGVyZWQgcmVuZGVyZWQ6aW5p
dGlhbCIsZnVuY3Rpb24oKXtpZihnJiZnLmlzT3ZlclF1b3RhKCkpe3RoaXMuc2hvd1F1b3RhPQpN
ZXNzYWdlKCl9fSk7cmV0dXJuIHRoaXN9LHNob3dRdW90YU1lc3NhZ2U6ZnVuY3Rpb24oKXt2YXIg
Zz0zRHRoaXMuJGVsLmZpbmQ9CigiLnF1b3RhLW1lc3NhZ2UiKTtpZihnLmlzKCI6aGlkZGVuIikp
e2cuc2xpZGVEb3duKHRoaXMuZnhTcGVlZCl9fSxoaWRlUXVvdD0KYU1lc3NhZ2U6ZnVuY3Rpb24o
KXt2YXIgZz0zRHRoaXMuJGVsLmZpbmQoIi5xdW90YS1tZXNzYWdlIik7aWYoIWcuaXMoIjpoaWRk
PQplbiIpKXtnLnNsaWRlVXAodGhpcy5meFNwZWVkKX19LGNvbm5lY3RUb09wdGlvbnNNZW51OmZ1
bmN0aW9uKGcpe2lmKCFnKXtyZXQ9CnVybiB0aGlzfXRoaXMub24oIm5ldy1zdG9yYWdlIixmdW5j
dGlvbihpLGgpe2lmKGcmJmkpe2cuZmluZEl0ZW1CeUh0bWwoX2woIj0KSW5jbHVkZSBEZWxldGVk
IERhdGFzZXRzIikpLmNoZWNrZWQ9M0RpLmdldCgic2hvd19kZWxldGVkIik7Zy5maW5kSXRlbUJ5
SHRtPQpsKF9sKCJJbmNsdWRlIEhpZGRlbiBEYXRhc2V0cyIpKS5jaGVja2VkPTNEaS5nZXQoInNo
b3dfaGlkZGVuIil9fSk7cmV0dXJuIHQ9Cmhpc30sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4i
Q3VycmVudEhpc3RvcnlQYW5lbCgiKygodGhpcy5tb2RlbCk/KHRoaXMubT0Kb2RlbC5nZXQoIm5h
bWUiKSk6KCIiKSkrIikifX0pO3JldHVybntDdXJyZW50SGlzdG9yeVBhbmVsOmF9fSk7ClwgTm8g
bmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZGVmaW5lKFsibXZjL2RhdGFzZXQvaGRhLWVkaXQiLCJt
dmMvaGlzdG9yeS9oaXN0b3J5LXBhbmVsIiwibXZjL2Jhc2UtbXZjIiw9CiJ1dGlscy9sb2NhbGl6
YXRpb24iXSxmdW5jdGlvbihiLGcsYyxlKXt2YXIgZD0zRGMuU2Vzc2lvblN0b3JhZ2VNb2RlbC5l
eHRlbj0KZCh7ZGVmYXVsdHM6e3NlYXJjaGluZzpmYWxzZSx0YWdzRWRpdG9yU2hvd246ZmFsc2Us
YW5ub3RhdGlvbkVkaXRvclNob3duOmZhPQpsc2V9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJu
Ikhpc3RvcnlQYW5lbFByZWZzKCIrSlNPTi5zdHJpbmdpZnkodGhpcy50b0o9ClNPTigpKSsiKSJ9
fSk7ZC5zdG9yYWdlS2V5PTNEZnVuY3Rpb24gZigpe3JldHVybigiaGlzdG9yeS1wYW5lbCIpfTt2
YXIgYT0zRD0KZy5IaXN0b3J5UGFuZWwuZXh0ZW5kKHtIREFWaWV3Q2xhc3M6Yi5IREFFZGl0Vmll
dyxlbXB0eU1zZzplKCJUaGlzIGhpc3RvcnkgPQppcyBlbXB0eS4gQ2xpY2sgJ0dldCBEYXRhJyBv
biB0aGUgbGVmdCB0b29sIG1lbnUgdG8gc3RhcnQiKSxub25lRm91bmRNc2c6ZSg9CiJObyBtYXRj
aGluZyBkYXRhc2V0cyBmb3VuZCIpLGluaXRpYWxpemU6ZnVuY3Rpb24oaCl7aD0zRGh8fHt9O3Ro
aXMucHJlZmVyZT0KbmNlcz0zRG5ldyBkKF8uZXh0ZW5kKHtpZDpkLnN0b3JhZ2VLZXkoKX0sXy5w
aWNrKGgsXy5rZXlzKGQucHJvdG90eXBlLmRlZmF1PQpsdHMpKSkpO2cuSGlzdG9yeVBhbmVsLnBy
b3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcyxoKX0sbG9hZEN1cnJlbnRIaXN0b3I9Cnk6ZnVu
Y3Rpb24oaSl7dmFyIGg9M0R0aGlzO3JldHVybiB0aGlzLmxvYWRIaXN0b3J5V2l0aEhEQURldGFp
bHMoImN1cnJlbnQiLD0KaSkudGhlbihmdW5jdGlvbihrLGope2gudHJpZ2dlcigiY3VycmVudC1o
aXN0b3J5IixoKX0pfSxzd2l0Y2hUb0hpc3Rvcnk6ZnVuPQpjdGlvbihrLGope3ZhciBoPTNEdGhp
cyxpPTNEZnVuY3Rpb24oKXtyZXR1cm4galF1ZXJ5LmFqYXgoe3VybDpnYWxheHlfY29uZmk9Cmcu
cm9vdCsiYXBpL2hpc3Rvcmllcy8iK2srIi9zZXRfYXNfY3VycmVudCIsbWV0aG9kOiJQVVQifSl9
O3JldHVybiB0aGlzLmxvYT0KZEhpc3RvcnlXaXRoSERBRGV0YWlscyhrLGosaSkudGhlbihmdW5j
dGlvbihtLGwpe2gudHJpZ2dlcigic3dpdGNoZWQtaGlzdG9yPQp5IixoKX0pfSxjcmVhdGVOZXdI
aXN0b3J5OmZ1bmN0aW9uKGope2lmKCFHYWxheHl8fCFHYWxheHkuY3VyclVzZXJ8fEdhbGF4eS49
CmN1cnJVc2VyLmlzQW5vbnltb3VzKCkpe3RoaXMuZGlzcGxheU1lc3NhZ2UoImVycm9yIixlKCJZ
b3UgbXVzdCBiZSBsb2dnZWQgaT0KbiB0byBjcmVhdGUgaGlzdG9yaWVzIikpO3JldHVybiAkLndo
ZW4oKX12YXIgaD0zRHRoaXMsaT0zRGZ1bmN0aW9uKCl7cmV0dXJuPQogalF1ZXJ5LnBvc3QoZ2Fs
YXh5X2NvbmZpZy5yb290KyJhcGkvaGlzdG9yaWVzIix7Y3VycmVudDp0cnVlfSl9O3JldHVybiB0
aGk9CnMubG9hZEhpc3RvcnkodW5kZWZpbmVkLGosaSkudGhlbihmdW5jdGlvbihsLGspe2gudHJp
Z2dlcigibmV3LWhpc3RvcnkiLGgpfT0KKX0sc2V0TW9kZWw6ZnVuY3Rpb24oaSxoLGope2cuSGlz
dG9yeVBhbmVsLnByb3RvdHlwZS5zZXRNb2RlbC5jYWxsKHRoaXMsaSxoPQosaik7aWYodGhpcy5t
b2RlbCl7dGhpcy5sb2coImNoZWNraW5nIGZvciB1cGRhdGVzIik7dGhpcy5tb2RlbC5jaGVja0Zv
clVwZGE9CnRlcygpfXJldHVybiB0aGlzfSxfc2V0VXBNb2RlbEV2ZW50SGFuZGxlcnM6ZnVuY3Rp
b24oKXtnLkhpc3RvcnlQYW5lbC5wcm90bz0KdHlwZS5fc2V0VXBNb2RlbEV2ZW50SGFuZGxlcnMu
Y2FsbCh0aGlzKTtpZihHYWxheHkmJkdhbGF4eS5xdW90YU1ldGVyKXt0aGlzPQoubGlzdGVuVG8o
dGhpcy5tb2RlbCwiY2hhbmdlOm5pY2Vfc2l6ZSIsZnVuY3Rpb24oKXtHYWxheHkucXVvdGFNZXRl
ci51cGRhdGU9CigpfSl9dGhpcy5tb2RlbC5oZGFzLm9uKCJzdGF0ZTpyZWFkeSIsZnVuY3Rpb24o
aSxqLGgpe2lmKCghaS5nZXQoInZpc2libGUiKT0KKSYmKCF0aGlzLnN0b3JhZ2UuZ2V0KCJzaG93
X2hpZGRlbiIpKSl7dGhpcy5yZW1vdmVIZGFWaWV3KHRoaXMuaGRhVmlld3NbaS5pPQpkXSl9fSx0
aGlzKX0scmVuZGVyOmZ1bmN0aW9uKGosayl7dGhpcy5sb2coInJlbmRlcjoiLGosayk7aj0zRChq
PTNEPTNEPTNEdW49CmRlZmluZWQpPyh0aGlzLmZ4U3BlZWQpOihqKTt2YXIgaD0zRHRoaXMsaTtp
Zih0aGlzLm1vZGVsKXtpPTNEdGhpcy5yZW5kZXJNbz0KZGVsKCl9ZWxzZXtpPTNEdGhpcy5yZW5k
ZXJXaXRob3V0TW9kZWwoKX0kKGgpLnF1ZXVlKCJmeCIsW2Z1bmN0aW9uKGwpe2lmKGomPQomaC4k
ZWwuaXMoIjp2aXNpYmxlIikpe2guJGVsLmZhZGVPdXQoaixsKX1lbHNle2woKX19LGZ1bmN0aW9u
KGwpe2guJGVsLmVtcHQ9CnkoKTtpZihpKXtoLiRlbC5hcHBlbmQoaS5jaGlsZHJlbigpKTtoLnJl
bmRlckJhc2VkT25QcmVmcygpfWwoKX0sZnVuY3Rpb24obD0KKXtpZihqJiYhaC4kZWwuaXMoIjp2
aXNpYmxlIikpe2guJGVsLmZhZGVJbihqLGwpfWVsc2V7bCgpfX0sZnVuY3Rpb24obCl7aWYoPQpr
KXtrLmNhbGwodGhpcyl9aC50cmlnZ2VyKCJyZW5kZXJlZCIsdGhpcyk7bCgpfV0pO3JldHVybiB0
aGlzfSxyZW5kZXJCYXNlZE89Cm5QcmVmczpmdW5jdGlvbigpe2lmKHRoaXMucHJlZmVyZW5jZXMu
Z2V0KCJzZWFyY2hpbmciKSl7dGhpcy50b2dnbGVTZWFyY2hDbz0KbnRyb2xzKDAsdHJ1ZSl9fSxf
cmVuZGVyRW1wdHlNc2c6ZnVuY3Rpb24oail7dmFyIGk9M0R0aGlzLGg9M0RpLiRlbXB0eU1lc3Nh
PQpnZShqKSxrPTNEJCgiLnRvb2xNZW51Q29udGFpbmVyIik7aWYoKF8uaXNFbXB0eShpLmhkYVZp
ZXdzKSYmIWkuc2VhcmNoRm9yKSY9CiYoR2FsYXh5JiZHYWxheHkudXBsb2FkJiZrLnNpemUoKSkp
e2guZW1wdHkoKTtoLmh0bWwoW2UoIlRoaXMgaGlzdG9yeSBpcyBlbT0KcHR5LiAiKSxlKCJZb3Ug
Y2FuICIpLCc8YSBjbGFzcz0zRCJ1cGxvYWRlci1saW5rIiBocmVmPTNEImphdmFzY3JpcHQ6dm9p
ZCgwPQopIj4nLGUoImxvYWQgeW91ciBvd24gZGF0YSIpLCI8L2E+IixlKCIgb3IgIiksJzxhIGNs
YXNzPTNEImdldC1kYXRhLWxpbmsiIGg9CnJlZj0zRCJqYXZhc2NyaXB0OnZvaWQoMCkiPicsZSgi
Z2V0IGRhdGEgZnJvbSBhbiBleHRlcm5hbCBzb3VyY2UiKSwiPC9hPiJdLj0Kam9pbigiIikpO2gu
ZmluZCgiLnVwbG9hZGVyLWxpbmsiKS5jbGljayhmdW5jdGlvbihsKXtHYWxheHkudXBsb2FkLl9l
dmVudFNoPQpvdyhsKX0pO2guZmluZCgiLmdldC1kYXRhLWxpbmsiKS5jbGljayhmdW5jdGlvbihs
KXtrLnBhcmVudCgpLnNjcm9sbFRvcCgwKTs9CmsuZmluZCgnc3Bhbjpjb250YWlucygiR2V0IERh
dGEiKScpLmNsaWNrKCl9KTtoLnNob3coKX1lbHNle2cuSGlzdG9yeVBhbmVsLj0KcHJvdG90eXBl
Ll9yZW5kZXJFbXB0eU1zZy5jYWxsKHRoaXMsail9cmV0dXJuIHRoaXN9LHRvZ2dsZVNlYXJjaENv
bnRyb2xzOmZ1PQpuY3Rpb24oaSxoKXt2YXIgaj0zRGcuSGlzdG9yeVBhbmVsLnByb3RvdHlwZS50
b2dnbGVTZWFyY2hDb250cm9scy5jYWxsKHRoaXM9CixpLGgpO3RoaXMucHJlZmVyZW5jZXMuc2V0
KCJzZWFyY2hpbmciLGopfSxfcmVuZGVyVGFnczpmdW5jdGlvbihoKXt2YXIgaT0zRD0KdGhpcztn
Lkhpc3RvcnlQYW5lbC5wcm90b3R5cGUuX3JlbmRlclRhZ3MuY2FsbCh0aGlzLGgpO2lmKHRoaXMu
cHJlZmVyZW5jZXMuPQpnZXQoInRhZ3NFZGl0b3JTaG93biIpKXt0aGlzLnRhZ3NFZGl0b3IudG9n
Z2xlKHRydWUpfXRoaXMudGFnc0VkaXRvci5vbigiaGk9CmRkZW5VbnRpbEFjdGl2YXRlZDpzaG93
biBoaWRkZW5VbnRpbEFjdGl2YXRlZDpoaWRkZW4iLGZ1bmN0aW9uKGope2kucHJlZmVyZT0KbmNl
cy5zZXQoInRhZ3NFZGl0b3JTaG93biIsai5oaWRkZW4pfSl9LF9yZW5kZXJBbm5vdGF0aW9uOmZ1
bmN0aW9uKGgpe3ZhciBpPQo9M0R0aGlzO2cuSGlzdG9yeVBhbmVsLnByb3RvdHlwZS5fcmVuZGVy
QW5ub3RhdGlvbi5jYWxsKHRoaXMsaCk7aWYodGhpcy5wcmU9CmZlcmVuY2VzLmdldCgiYW5ub3Rh
dGlvbkVkaXRvclNob3duIikpe3RoaXMuYW5ub3RhdGlvbkVkaXRvci50b2dnbGUodHJ1ZSl9dD0K
aGlzLmFubm90YXRpb25FZGl0b3Iub24oImhpZGRlblVudGlsQWN0aXZhdGVkOnNob3duIGhpZGRl
blVudGlsQWN0aXZhdGVkOmhpPQpkZGVuIixmdW5jdGlvbihqKXtpLnByZWZlcmVuY2VzLnNldCgi
YW5ub3RhdGlvbkVkaXRvclNob3duIixqLmhpZGRlbil9KX0sY289Cm5uZWN0VG9RdW90YU1ldGVy
OmZ1bmN0aW9uKGgpe2lmKCFoKXtyZXR1cm4gdGhpc310aGlzLmxpc3RlblRvKGgsInF1b3RhOm92
ZT0KciIsdGhpcy5zaG93UXVvdGFNZXNzYWdlKTt0aGlzLmxpc3RlblRvKGgsInF1b3RhOnVuZGVy
Iix0aGlzLmhpZGVRdW90YU1lc3NhPQpnZSk7dGhpcy5vbigicmVuZGVyZWQgcmVuZGVyZWQ6aW5p
dGlhbCIsZnVuY3Rpb24oKXtpZihoJiZoLmlzT3ZlclF1b3RhKCkpe3Q9Cmhpcy5zaG93UXVvdGFN
ZXNzYWdlKCl9fSk7cmV0dXJuIHRoaXN9LHNob3dRdW90YU1lc3NhZ2U6ZnVuY3Rpb24oKXt2YXIg
aD0zRD0KdGhpcy4kZWwuZmluZCgiLnF1b3RhLW1lc3NhZ2UiKTtpZihoLmlzKCI6aGlkZGVuIikp
e2guc2xpZGVEb3duKHRoaXMuZnhTcGVlPQpkKX19LGhpZGVRdW90YU1lc3NhZ2U6ZnVuY3Rpb24o
KXt2YXIgaD0zRHRoaXMuJGVsLmZpbmQoIi5xdW90YS1tZXNzYWdlIik7aWY9CighaC5pcygiOmhp
ZGRlbiIpKXtoLnNsaWRlVXAodGhpcy5meFNwZWVkKX19LGNvbm5lY3RUb09wdGlvbnNNZW51OmZ1
bmN0aW9uKD0KaCl7aWYoIWgpe3JldHVybiB0aGlzfXRoaXMub24oIm5ldy1zdG9yYWdlIixmdW5j
dGlvbihqLGkpe2lmKGgmJmope2guZmluZEl0PQplbUJ5SHRtbChlKCJJbmNsdWRlIERlbGV0ZWQg
RGF0YXNldHMiKSkuY2hlY2tlZD0zRGouZ2V0KCJzaG93X2RlbGV0ZWQiKTtoLmY9CmluZEl0ZW1C
eUh0bWwoZSgiSW5jbHVkZSBIaWRkZW4gRGF0YXNldHMiKSkuY2hlY2tlZD0zRGouZ2V0KCJzaG93
X2hpZGRlbiIpfT0KfSk7cmV0dXJuIHRoaXN9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIkN1
cnJlbnRIaXN0b3J5UGFuZWwoIisoKHRoaXMubW9kPQplbCk/KHRoaXMubW9kZWwuZ2V0KCJuYW1l
IikpOigiIikpKyIpIn19KTtyZXR1cm57Q3VycmVudEhpc3RvcnlQYW5lbDphfX0pOwpcIE5vIG5l
d2xpbmUgYXQgZW5kIG9mIGZpbGUKCmRpZmYgLXIgODM0NmVjNGJhYTM5OTJmNGRjMDE2MWYwZmM3
OWEwYmE4OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdjNz0KMzllMDUxM2FkZGZlMDJj
YjIgc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2hpc3RvcnktbW9kZWwuanMKLS0t
IGEvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2hpc3RvcnktbW9kZWwuanMKKysr
IGIvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2hpc3RvcnktbW9kZWwuanMKQEAg
LTEsMSArMSwxIEBACi1kZWZpbmUoWyJtdmMvZGF0YXNldC9oZGEtbW9kZWwiLCJtdmMvYmFzZS1t
dmMiXSxmdW5jdGlvbihiLGEpe3ZhciBkPTNEQmFjaz0KYm9uZS5Nb2RlbC5leHRlbmQoYS5Mb2dn
YWJsZU1peGluKS5leHRlbmQoe2RlZmF1bHRzOnttb2RlbF9jbGFzczoiSGlzdG9yeSIsPQppZDpu
dWxsLG5hbWU6IlVubmFtZWQgSGlzdG9yeSIsc3RhdGU6Im5ldyIsZGlza1NpemU6MCxkZWxldGVk
OmZhbHNlfSx1cmxSb289CnQ6Z2FsYXh5X2NvbmZpZy5yb290KyJhcGkvaGlzdG9yaWVzIixyZW5h
bWVVcmw6ZnVuY3Rpb24oKXt2YXIgZj0zRHRoaXMuZ2V0KD0KImlkIik7aWYoIWYpe3JldHVybiB1
bmRlZmluZWR9cmV0dXJuIGdhbGF4eV9jb25maWcucm9vdCsiaGlzdG9yeS9yZW5hbWVfYXN5PQpu
Yz9pZD0zRCIrdGhpcy5nZXQoImlkIil9LGFubm90YXRlVXJsOmZ1bmN0aW9uKCl7dmFyIGY9M0R0
aGlzLmdldCgiaWQiKTtpZig9CiFmKXtyZXR1cm4gdW5kZWZpbmVkfXJldHVybiBnYWxheHlfY29u
ZmlnLnJvb3QrImhpc3RvcnkvYW5ub3RhdGVfYXN5bmM/aWQ9Cj0zRCIrdGhpcy5nZXQoImlkIil9
LHRhZ1VybDpmdW5jdGlvbigpe3ZhciBmPTNEdGhpcy5nZXQoImlkIik7aWYoIWYpe3JldHVybj0K
IHVuZGVmaW5lZH1yZXR1cm4gZ2FsYXh5X2NvbmZpZy5yb290KyJ0YWcvZ2V0X3RhZ2dpbmdfZWx0
X2FzeW5jP2l0ZW1faWQ9M0QiPQordGhpcy5nZXQoImlkIikrIiZpdGVtX2NsYXNzPTNESGlzdG9y
eSJ9LGluaXRpYWxpemU6ZnVuY3Rpb24oZyxoLGYpe2Y9M0RmfHw9Cnt9O3RoaXMubG9nZ2VyPTNE
Zi5sb2dnZXJ8fG51bGw7dGhpcy5sb2codGhpcysiLmluaXRpYWxpemU6IixnLGgsZik7dGhpcy5o
ZD0KYXM9M0RuZXcgYi5IREFDb2xsZWN0aW9uKGh8fFtdLHtoaXN0b3J5SWQ6dGhpcy5nZXQoImlk
Iil9KTtpZihoJiZfLmlzQXJyYXkoPQpoKSl7dGhpcy5oZGFzLnJlc2V0KGgpfXRoaXMuX3NldFVw
TGlzdGVuZXJzKCk7dGhpcy51cGRhdGVUaW1lb3V0SWQ9M0RudWxsfSw9Cl9zZXRVcExpc3RlbmVy
czpmdW5jdGlvbigpe3RoaXMub24oImVycm9yIixmdW5jdGlvbihnLGosZixpLGgpe3RoaXMuZXJy
b3JIYT0KbmRsZXIoZyxqLGYsaSxoKX0pO2lmKHRoaXMuaGRhcyl7dGhpcy5saXN0ZW5Ubyh0aGlz
LmhkYXMsImVycm9yIixmdW5jdGlvbigpPQp7dGhpcy50cmlnZ2VyLmFwcGx5KHRoaXMsWyJlcnJv
cjpoZGFzIl0uY29uY2F0KGpRdWVyeS5tYWtlQXJyYXkoYXJndW1lbnRzKSk9Cil9KX10aGlzLm9u
KCJjaGFuZ2U6aWQiLGZ1bmN0aW9uKGcsZil7aWYodGhpcy5oZGFzKXt0aGlzLmhkYXMuaGlzdG9y
eUlkPTNEZj0KfX0sdGhpcyl9LGVycm9ySGFuZGxlcjpmdW5jdGlvbihnLGosZixpLGgpe3RoaXMu
Y2xlYXJVcGRhdGVUaW1lb3V0KCl9LG93bmVkPQpCeUN1cnJVc2VyOmZ1bmN0aW9uKCl7aWYoIUdh
bGF4eXx8IUdhbGF4eS5jdXJyVXNlcil7cmV0dXJuIGZhbHNlfWlmKEdhbGF4eS49CmN1cnJVc2Vy
LmlzQW5vbnltb3VzKCl8fEdhbGF4eS5jdXJyVXNlci5pZCE9M0Q9M0R0aGlzLmdldCgidXNlcl9p
ZCIpKXtyZXR1cj0KbiBmYWxzZX1yZXR1cm4gdHJ1ZX0saGRhQ291bnQ6ZnVuY3Rpb24oKXtyZXR1
cm4gXy5yZWR1Y2UoXy52YWx1ZXModGhpcy5nZXQoPQoic3RhdGVfZGV0YWlscyIpKSxmdW5jdGlv
bihmLGcpe3JldHVybiBmK2d9LDApfSxjaGVja0ZvclVwZGF0ZXM6ZnVuY3Rpb24oZik9CntpZih0
aGlzLmhkYXMucnVubmluZygpLmxlbmd0aCl7dGhpcy5zZXRVcGRhdGVUaW1lb3V0KCl9ZWxzZXt0
aGlzLnRyaWdnZXIoIj0KcmVhZHkiKTtpZihfLmlzRnVuY3Rpb24oZikpe2YuY2FsbCh0aGlzKX19
cmV0dXJuIHRoaXN9LHNldFVwZGF0ZVRpbWVvdXQ6ZnVuPQpjdGlvbihmKXtmPTNEZnx8ZC5VUERB
VEVfREVMQVk7dmFyIGc9M0R0aGlzO3RoaXMuY2xlYXJVcGRhdGVUaW1lb3V0KCk7dGhpcy49CnVw
ZGF0ZVRpbWVvdXRJZD0zRHNldFRpbWVvdXQoZnVuY3Rpb24oKXtnLnJlZnJlc2goKX0sZik7cmV0
dXJuIHRoaXMudXBkYXRlVD0KaW1lb3V0SWR9LGNsZWFyVXBkYXRlVGltZW91dDpmdW5jdGlvbigp
e2lmKHRoaXMudXBkYXRlVGltZW91dElkKXtjbGVhclRpbWVvPQp1dCh0aGlzLnVwZGF0ZVRpbWVv
dXRJZCk7dGhpcy51cGRhdGVUaW1lb3V0SWQ9M0RudWxsfX0scmVmcmVzaDpmdW5jdGlvbihnLGY9
Cil7Zz0zRGd8fFtdO2Y9M0RmfHx7fTt2YXIgaD0zRHRoaXM7Zi5kYXRhPTNEZi5kYXRhfHx7fTtp
ZihnLmxlbmd0aCl7Zi5kYXRhLj0KZGV0YWlscz0zRGcuam9pbigiLCIpfXZhciBpPTNEdGhpcy5o
ZGFzLmZldGNoKGYpO2kuZG9uZShmdW5jdGlvbihqKXtoLmNoZWNrPQpGb3JVcGRhdGVzKGZ1bmN0
aW9uKCl7dGhpcy5mZXRjaCgpfSl9KTtyZXR1cm4gaX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1
cm49CiJIaXN0b3J5KCIrdGhpcy5nZXQoImlkIikrIiwiK3RoaXMuZ2V0KCJuYW1lIikrIikifX0p
O2QuVVBEQVRFX0RFTEFZPTNENDAwMD0KO2QuZ2V0SGlzdG9yeURhdGE9M0RmdW5jdGlvbiBlKGcs
cSl7cT0zRHF8fHt9O3ZhciBrPTNEcS5oZGFEZXRhaWxJZHN8fFtdO3ZhPQpyIG09M0RqUXVlcnku
RGVmZXJyZWQoKSxsPTNEbnVsbDtmdW5jdGlvbiBoKHIpe3JldHVybiBqUXVlcnkuYWpheChnYWxh
eHlfY289Cm5maWcucm9vdCsiYXBpL2hpc3Rvcmllcy8iK2cpfWZ1bmN0aW9uIGYocil7aWYoIXJ8
fCFyLnN0YXRlX2lkcyl7cmV0dXJuIDB9cj0KZXR1cm4gXy5yZWR1Y2Uoci5zdGF0ZV9pZHMsZnVu
Y3Rpb24ocyx1LHQpe3JldHVybiBzK3UubGVuZ3RofSwwKX1mdW5jdGlvbiBwPQoocyl7aWYoIWYo
cykpe3JldHVybltdfWlmKF8uaXNGdW5jdGlvbihrKSl7az0zRGsocyl9dmFyIHI9M0Qoay5sZW5n
dGgpPyh7ZGU9CnRhaWxzOmsuam9pbigiLCIpfSk6KHt9KTtyZXR1cm4galF1ZXJ5LmFqYXgoZ2Fs
YXh5X2NvbmZpZy5yb290KyJhcGkvaGlzdG9yaT0KZXMvIitzLmlkKyIvY29udGVudHMiLHtkYXRh
OnJ9KX12YXIgbz0zRHEuaGlzdG9yeUZufHxoLG49M0RxLmhkYUZufHxwO3ZhciBqPQo9M0RvKGcp
O2ouZG9uZShmdW5jdGlvbihyKXtsPTNEcjttLm5vdGlmeSh7c3RhdHVzOiJoaXN0b3J5IGRhdGEg
cmV0cmlldmVkIiw9Cmhpc3RvcnlKU09OOmx9KX0pO2ouZmFpbChmdW5jdGlvbih0LHIscyl7bS5y
ZWplY3QodCwibG9hZGluZyB0aGUgaGlzdG9yeSIpfT0KKTt2YXIgaT0zRGoudGhlbihuKTtpLnRo
ZW4oZnVuY3Rpb24ocil7bS5ub3RpZnkoe3N0YXR1czoiZGF0YXNldCBkYXRhIHJldHJpPQpldmVk
IixoaXN0b3J5SlNPTjpsLGhkYUpTT046cn0pO20ucmVzb2x2ZShsLHIpfSk7aS5mYWlsKGZ1bmN0
aW9uKHQscixzKXttLnI9CmVqZWN0KHQsImxvYWRpbmcgdGhlIGRhdGFzZXRzIix7aGlzdG9yeTps
fSl9KTtyZXR1cm4gbX07dmFyIGM9M0RCYWNrYm9uZS5Dbz0KbGxlY3Rpb24uZXh0ZW5kKGEuTG9n
Z2FibGVNaXhpbikuZXh0ZW5kKHttb2RlbDpkLHVybFJvb3Q6Z2FsYXh5X2NvbmZpZy5yb290PQor
ImFwaS9oaXN0b3JpZXMifSk7cmV0dXJue0hpc3Rvcnk6ZCxIaXN0b3J5Q29sbGVjdGlvbjpjfX0p
OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2RlZmluZShbIm12Yy9kYXRhc2V0L2hkYS1t
b2RlbCIsIm12Yy9iYXNlLW12YyIsInV0aWxzL2xvY2FsaXphdGlvbiJdLGZ1bmN0PQppb24oYyxh
LGIpe3ZhciBlPTNEQmFja2JvbmUuTW9kZWwuZXh0ZW5kKGEuTG9nZ2FibGVNaXhpbikuZXh0ZW5k
KHtkZWZhdWx0czo9Cnttb2RlbF9jbGFzczoiSGlzdG9yeSIsaWQ6bnVsbCxuYW1lOiJVbm5hbWVk
IEhpc3RvcnkiLHN0YXRlOiJuZXciLGRpc2tTaXplOj0KMCxkZWxldGVkOmZhbHNlfSx1cmxSb290
OmdhbGF4eV9jb25maWcucm9vdCsiYXBpL2hpc3RvcmllcyIscmVuYW1lVXJsOmZ1bmN0PQppb24o
KXt2YXIgZz0zRHRoaXMuZ2V0KCJpZCIpO2lmKCFnKXtyZXR1cm4gdW5kZWZpbmVkfXJldHVybiBn
YWxheHlfY29uZmlnLnI9Cm9vdCsiaGlzdG9yeS9yZW5hbWVfYXN5bmM/aWQ9M0QiK3RoaXMuZ2V0
KCJpZCIpfSxhbm5vdGF0ZVVybDpmdW5jdGlvbigpe3Zhcj0KIGc9M0R0aGlzLmdldCgiaWQiKTtp
ZighZyl7cmV0dXJuIHVuZGVmaW5lZH1yZXR1cm4gZ2FsYXh5X2NvbmZpZy5yb290KyJoaXN0PQpv
cnkvYW5ub3RhdGVfYXN5bmM/aWQ9M0QiK3RoaXMuZ2V0KCJpZCIpfSx0YWdVcmw6ZnVuY3Rpb24o
KXt2YXIgZz0zRHRoaXMuZ2U9CnQoImlkIik7aWYoIWcpe3JldHVybiB1bmRlZmluZWR9cmV0dXJu
IGdhbGF4eV9jb25maWcucm9vdCsidGFnL2dldF90YWdnaW5nXz0KZWx0X2FzeW5jP2l0ZW1faWQ9
M0QiK3RoaXMuZ2V0KCJpZCIpKyImaXRlbV9jbGFzcz0zREhpc3RvcnkifSxpbml0aWFsaXplOmZ1
PQpuY3Rpb24oaCxpLGcpe2c9M0RnfHx7fTt0aGlzLmxvZ2dlcj0zRGcubG9nZ2VyfHxudWxsO3Ro
aXMubG9nKHRoaXMrIi5pbml0aWE9CmxpemU6IixoLGksZyk7dGhpcy5oZGFzPTNEbmV3IGMuSERB
Q29sbGVjdGlvbihpfHxbXSx7aGlzdG9yeUlkOnRoaXMuZ2V0KCJpZD0KIil9KTtpZihpJiZfLmlz
QXJyYXkoaSkpe3RoaXMuaGRhcy5yZXNldChpKX10aGlzLl9zZXRVcExpc3RlbmVycygpO3RoaXMu
dXBkPQphdGVUaW1lb3V0SWQ9M0RudWxsfSxfc2V0VXBMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt0aGlz
Lm9uKCJlcnJvciIsZnVuY3Rpb24oaCw9CmssZyxqLGkpe3RoaXMuZXJyb3JIYW5kbGVyKGgsayxn
LGosaSl9KTtpZih0aGlzLmhkYXMpe3RoaXMubGlzdGVuVG8odGhpcy5oZD0KYXMsImVycm9yIixm
dW5jdGlvbigpe3RoaXMudHJpZ2dlci5hcHBseSh0aGlzLFsiZXJyb3I6aGRhcyJdLmNvbmNhdChq
UXVlcnkuPQptYWtlQXJyYXkoYXJndW1lbnRzKSkpfSl9dGhpcy5vbigiY2hhbmdlOmlkIixmdW5j
dGlvbihoLGcpe2lmKHRoaXMuaGRhcyl7dGg9CmlzLmhkYXMuaGlzdG9yeUlkPTNEZ319LHRoaXMp
fSxlcnJvckhhbmRsZXI6ZnVuY3Rpb24oaCxrLGcsaixpKXt0aGlzLmNsZWFyVT0KcGRhdGVUaW1l
b3V0KCl9LG93bmVkQnlDdXJyVXNlcjpmdW5jdGlvbigpe2lmKCFHYWxheHl8fCFHYWxheHkuY3Vy
clVzZXIpe3JlPQp0dXJuIGZhbHNlfWlmKEdhbGF4eS5jdXJyVXNlci5pc0Fub255bW91cygpfHxH
YWxheHkuY3VyclVzZXIuaWQhPTNEPTNEdGhpcy49CmdldCgidXNlcl9pZCIpKXtyZXR1cm4gZmFs
c2V9cmV0dXJuIHRydWV9LGhkYUNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIF8ucmVkdT0KY2UoXy52
YWx1ZXModGhpcy5nZXQoInN0YXRlX2RldGFpbHMiKSksZnVuY3Rpb24oZyxoKXtyZXR1cm4gZyto
fSwwKX0sY2hlY2tGPQpvclVwZGF0ZXM6ZnVuY3Rpb24oZyl7aWYodGhpcy5oZGFzLnJ1bm5pbmco
KS5sZW5ndGgpe3RoaXMuc2V0VXBkYXRlVGltZW91dCg9Cil9ZWxzZXt0aGlzLnRyaWdnZXIoInJl
YWR5Iik7aWYoXy5pc0Z1bmN0aW9uKGcpKXtnLmNhbGwodGhpcyl9fXJldHVybiB0aGlzfT0KLHNl
dFVwZGF0ZVRpbWVvdXQ6ZnVuY3Rpb24oZyl7Zz0zRGd8fGUuVVBEQVRFX0RFTEFZO3ZhciBoPTNE
dGhpczt0aGlzLmNsZWFyPQpVcGRhdGVUaW1lb3V0KCk7dGhpcy51cGRhdGVUaW1lb3V0SWQ9M0Rz
ZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aC5yZWZyZXNoKCl9LGc9Cik7cmV0dXJuIHRoaXMudXBkYXRl
VGltZW91dElkfSxjbGVhclVwZGF0ZVRpbWVvdXQ6ZnVuY3Rpb24oKXtpZih0aGlzLnVwZGF0ZT0K
VGltZW91dElkKXtjbGVhclRpbWVvdXQodGhpcy51cGRhdGVUaW1lb3V0SWQpO3RoaXMudXBkYXRl
VGltZW91dElkPTNEbnVsbH19PQoscmVmcmVzaDpmdW5jdGlvbihoLGcpe2g9M0RofHxbXTtnPTNE
Z3x8e307dmFyIGk9M0R0aGlzO2cuZGF0YT0zRGcuZGF0YXx8e309CjtpZihoLmxlbmd0aCl7Zy5k
YXRhLmRldGFpbHM9M0RoLmpvaW4oIiwiKX12YXIgaj0zRHRoaXMuaGRhcy5mZXRjaChnKTtqLmRv
bj0KZShmdW5jdGlvbihrKXtpLmNoZWNrRm9yVXBkYXRlcyhmdW5jdGlvbigpe3RoaXMuZmV0Y2go
KX0pfSk7cmV0dXJuIGp9LHRvU3RyPQppbmc6ZnVuY3Rpb24oKXtyZXR1cm4iSGlzdG9yeSgiK3Ro
aXMuZ2V0KCJpZCIpKyIsIit0aGlzLmdldCgibmFtZSIpKyIpIn19KTs9CmUuVVBEQVRFX0RFTEFZ
PTNENDAwMDtlLmdldEhpc3RvcnlEYXRhPTNEZnVuY3Rpb24gZihoLHIpe3I9M0RyfHx7fTt2YXIg
bD0zRD0Kci5oZGFEZXRhaWxJZHN8fFtdO3ZhciBuPTNEalF1ZXJ5LkRlZmVycmVkKCksbT0zRG51
bGw7ZnVuY3Rpb24gaShzKXtyZXR1cm4gPQpqUXVlcnkuYWpheChnYWxheHlfY29uZmlnLnJvb3Qr
ImFwaS9oaXN0b3JpZXMvIitoKX1mdW5jdGlvbiBnKHMpe2lmKCFzfHwhcy49CnN0YXRlX2lkcyl7
cmV0dXJuIDB9cmV0dXJuIF8ucmVkdWNlKHMuc3RhdGVfaWRzLGZ1bmN0aW9uKHQsdix1KXtyZXR1
cm4gdCt2Lj0KbGVuZ3RofSwwKX1mdW5jdGlvbiBxKHQpe2lmKCFnKHQpKXtyZXR1cm5bXX1pZihf
LmlzRnVuY3Rpb24obCkpe2w9M0RsKHQpfXZhPQpyIHM9M0QobC5sZW5ndGgpPyh7ZGV0YWlsczps
LmpvaW4oIiwiKX0pOih7fSk7cmV0dXJuIGpRdWVyeS5hamF4KGdhbGF4eV9jb249CmZpZy5yb290
KyJhcGkvaGlzdG9yaWVzLyIrdC5pZCsiL2NvbnRlbnRzIix7ZGF0YTpzfSl9dmFyIHA9M0RyLmhp
c3RvcnlGbnx8aT0KLG89M0RyLmhkYUZufHxxO3ZhciBrPTNEcChoKTtrLmRvbmUoZnVuY3Rpb24o
cyl7bT0zRHM7bi5ub3RpZnkoe3N0YXR1czoiaGlzPQp0b3J5IGRhdGEgcmV0cmlldmVkIixoaXN0
b3J5SlNPTjptfSl9KTtrLmZhaWwoZnVuY3Rpb24odSxzLHQpe24ucmVqZWN0KHUsImw9Cm9hZGlu
ZyB0aGUgaGlzdG9yeSIpfSk7dmFyIGo9M0RrLnRoZW4obyk7ai50aGVuKGZ1bmN0aW9uKHMpe24u
bm90aWZ5KHtzdGF0dT0KczoiZGF0YXNldCBkYXRhIHJldHJpZXZlZCIsaGlzdG9yeUpTT046bSxo
ZGFKU09OOnN9KTtuLnJlc29sdmUobSxzKX0pO2ouZmFpPQpsKGZ1bmN0aW9uKHUscyx0KXtuLnJl
amVjdCh1LCJsb2FkaW5nIHRoZSBkYXRhc2V0cyIse2hpc3Rvcnk6bX0pfSk7cmV0dXJuIG49Cn07
dmFyIGQ9M0RCYWNrYm9uZS5Db2xsZWN0aW9uLmV4dGVuZChhLkxvZ2dhYmxlTWl4aW4pLmV4dGVu
ZCh7bW9kZWw6ZSx1cmxSbz0Kb3Q6Z2FsYXh5X2NvbmZpZy5yb290KyJhcGkvaGlzdG9yaWVzIn0p
O3JldHVybntIaXN0b3J5OmUsSGlzdG9yeUNvbGxlY3Rpb246PQpkfX0pOwpcIE5vIG5ld2xpbmUg
YXQgZW5kIG9mIGZpbGUKCmRpZmYgLXIgODM0NmVjNGJhYTM5OTJmNGRjMDE2MWYwZmM3OWEwYmE4
OTNjMGE2MyAtciBkY2MwYzE5MTQ3ZWFkODZjNmUzNTdjNz0KMzllMDUxM2FkZGZlMDJjYjIgc3Rh
dGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2hpc3RvcnktcGFuZWwuanMKLS0tIGEvc3Rh
dGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2hpc3RvcnktcGFuZWwuanMKKysrIGIvc3Rh
dGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L2hpc3RvcnktcGFuZWwuanMKQEAgLTEsMSAr
MSwxIEBACi1kZWZpbmUoWyJtdmMvZGF0YXNldC9oZGEtbW9kZWwiLCJtdmMvZGF0YXNldC9oZGEt
ZWRpdCIsIm12Yy9oaXN0b3J5L3JlYWRvbj0KbHktaGlzdG9yeS1wYW5lbCIsIm12Yy90YWdzIiwi
bXZjL2Fubm90YXRpb25zIl0sZnVuY3Rpb24oZSxiLGQsYSxjKXt2YXIgZj0KPTNEZC5SZWFkT25s
eUhpc3RvcnlQYW5lbC5leHRlbmQoe0hEQVZpZXdDbGFzczpiLkhEQUVkaXRWaWV3LGluaXRpYWxp
emU6ZnVuPQpjdGlvbihnKXtnPTNEZ3x8e307dGhpcy5zZWxlY3RlZEhkYUlkcz0zRFtdO3RoaXMu
dGFnc0VkaXRvcj0zRG51bGw7dGhpcy5hbm49Cm90YXRpb25FZGl0b3I9M0RudWxsO3RoaXMuc2Vs
ZWN0aW5nPTNEZy5zZWxlY3Rpbmd8fGZhbHNlO3RoaXMuYW5ub3RhdGlvbkVkaT0KdG9yU2hvd249
M0RnLmFubm90YXRpb25FZGl0b3JTaG93bnx8ZmFsc2U7dGhpcy50YWdzRWRpdG9yU2hvd249M0Rn
LnRhZ3NFZGl0PQpvclNob3dufHxmYWxzZTtkLlJlYWRPbmx5SGlzdG9yeVBhbmVsLnByb3RvdHlw
ZS5pbml0aWFsaXplLmNhbGwodGhpcyxnKX0sX3M9CmV0VXBNb2RlbEV2ZW50SGFuZGxlcnM6ZnVu
Y3Rpb24oKXtkLlJlYWRPbmx5SGlzdG9yeVBhbmVsLnByb3RvdHlwZS5fc2V0VXBNbz0KZGVsRXZl
bnRIYW5kbGVycy5jYWxsKHRoaXMpO3RoaXMubW9kZWwub24oImNoYW5nZTpuaWNlX3NpemUiLHRo
aXMudXBkYXRlSGlzPQp0b3J5RGlza1NpemUsdGhpcyk7dGhpcy5tb2RlbC5oZGFzLm9uKCJjaGFu
Z2U6ZGVsZXRlZCIsdGhpcy5faGFuZGxlSGRhRGVsZXQ9CmlvbkNoYW5nZSx0aGlzKTt0aGlzLm1v
ZGVsLmhkYXMub24oImNoYW5nZTp2aXNpYmxlIix0aGlzLl9oYW5kbGVIZGFWaXNpYmxlQz0KaGFu
Z2UsdGhpcyk7dGhpcy5tb2RlbC5oZGFzLm9uKCJjaGFuZ2U6cHVyZ2VkIixmdW5jdGlvbihnKXt0
aGlzLm1vZGVsLmZldGNoPQooKX0sdGhpcyl9LHJlbmRlck1vZGVsOmZ1bmN0aW9uKCl7dmFyIGc9
M0QkKCI8ZGl2Lz4iKTtnLmFwcGVuZChmLnRlbXBsYXRlcy49Cmhpc3RvcnlQYW5lbCh0aGlzLm1v
ZGVsLnRvSlNPTigpKSk7dGhpcy4kZW1wdHlNZXNzYWdlKGcpLnRleHQodGhpcy5lbXB0eU1zZz0K
KTtpZihHYWxheHkmJkdhbGF4eS5jdXJyVXNlciYmR2FsYXh5LmN1cnJVc2VyLmlkJiZHYWxheHku
Y3VyclVzZXIuaWQ9M0Q9M0Q9Cj0zRHRoaXMubW9kZWwuZ2V0KCJ1c2VyX2lkIikpe3RoaXMuX3Jl
bmRlclRhZ3MoZyk7dGhpcy5fcmVuZGVyQW5ub3RhdGlvbihnKT0KfWcuZmluZCgiLmhpc3Rvcnkt
c2Vjb25kYXJ5LWFjdGlvbnMiKS5wcmVwZW5kKHRoaXMuX3JlbmRlclNlbGVjdEJ1dHRvbigpKTtn
PQouZmluZCgiLmhpc3RvcnktZGF0YXNldC1hY3Rpb25zIikudG9nZ2xlKHRoaXMuc2VsZWN0aW5n
KTtnLmZpbmQoIi5oaXN0b3J5LXM9CmVjb25kYXJ5LWFjdGlvbnMiKS5wcmVwZW5kKHRoaXMuX3Jl
bmRlclNlYXJjaEJ1dHRvbigpKTt0aGlzLl9zZXRVcEJlaGF2aW91cj0KcyhnKTt0aGlzLnJlbmRl
ckhkYXMoZyk7cmV0dXJuIGd9LF9yZW5kZXJUYWdzOmZ1bmN0aW9uKGcpe3ZhciBoPTNEdGhpczt0
aGlzPQoudGFnc0VkaXRvcj0zRG5ldyBhLlRhZ3NFZGl0b3Ioe21vZGVsOnRoaXMubW9kZWwsZWw6
Zy5maW5kKCIuaGlzdG9yeS1jb250cm89CmxzIC50YWdzLWRpc3BsYXkiKSxvbnNob3dGaXJzdFRp
bWU6ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcigpfSxvbnNob3c6ZnVuY3Rpbz0Kbigpe2gudG9nZ2xl
SERBVGFnRWRpdG9ycyh0cnVlLGguZnhTcGVlZCl9LG9uaGlkZTpmdW5jdGlvbigpe2gudG9nZ2xl
SERBVGFnPQpFZGl0b3JzKGZhbHNlLGguZnhTcGVlZCl9LCRhY3RpdmF0b3I6ZmFJY29uQnV0dG9u
KHt0aXRsZTpfbCgiRWRpdCBoaXN0b3J5IHQ9CmFncyIpLGNsYXNzZXM6Imhpc3RvcnktdGFnLWJ0
biIsZmFJY29uOiJmYS10YWdzIn0pLmFwcGVuZFRvKGcuZmluZCgiLmhpc3Rvcj0KeS1zZWNvbmRh
cnktYWN0aW9ucyIpKX0pfSxfcmVuZGVyQW5ub3RhdGlvbjpmdW5jdGlvbihnKXt2YXIgaD0zRHRo
aXM7dGhpcy5hPQpubm90YXRpb25FZGl0b3I9M0RuZXcgYy5Bbm5vdGF0aW9uRWRpdG9yKHttb2Rl
bDp0aGlzLm1vZGVsLGVsOmcuZmluZCgiLmhpc3Q9Cm9yeS1jb250cm9scyAuYW5ub3RhdGlvbi1k
aXNwbGF5Iiksb25zaG93Rmlyc3RUaW1lOmZ1bmN0aW9uKCl7dGhpcy5yZW5kZXIoKT0KfSxvbnNo
b3c6ZnVuY3Rpb24oKXtoLnRvZ2dsZUhEQUFubm90YXRpb25FZGl0b3JzKHRydWUsaC5meFNwZWVk
KX0sb25oaWRlOmZ1PQpuY3Rpb24oKXtoLnRvZ2dsZUhEQUFubm90YXRpb25FZGl0b3JzKGZhbHNl
LGguZnhTcGVlZCl9LCRhY3RpdmF0b3I6ZmFJY29uQnU9CnR0b24oe3RpdGxlOl9sKCJFZGl0IGhp
c3RvcnkgQW5ub3RhdGlvbiIpLGNsYXNzZXM6Imhpc3RvcnktYW5ub3RhdGUtYnRuIixmYT0KSWNv
bjoiZmEtY29tbWVudCJ9KS5hcHBlbmRUbyhnLmZpbmQoIi5oaXN0b3J5LXNlY29uZGFyeS1hY3Rp
b25zIikpfSl9LF9yZW5kPQplclNlbGVjdEJ1dHRvbjpmdW5jdGlvbihnKXtyZXR1cm4gZmFJY29u
QnV0dG9uKHt0aXRsZTpfbCgiT3BlcmF0aW9ucyBvbiBtdWw9CnRpcGxlIGRhdGFzZXRzIiksY2xh
c3NlczoiaGlzdG9yeS1zZWxlY3QtYnRuIixmYUljb246ImZhLWNoZWNrLXNxdWFyZS1vIn0pfT0K
LF9zZXRVcEJlaGF2aW91cnM6ZnVuY3Rpb24oZyl7Zz0zRGd8fHRoaXMuJGVsO2QuUmVhZE9ubHlI
aXN0b3J5UGFuZWwucHJvdG90PQp5cGUuX3NldFVwQmVoYXZpb3Vycy5jYWxsKHRoaXMsZyk7aWYo
IXRoaXMubW9kZWwpe3JldHVybn10aGlzLl9zZXRVcERhdGFzZXQ9CkFjdGlvbnNQb3B1cChnKTtp
ZigoIUdhbGF4eS5jdXJyVXNlcnx8R2FsYXh5LmN1cnJVc2VyLmlzQW5vbnltb3VzKCkpfHwoR2Fs
YT0KeHkuY3VyclVzZXIuaWQhPTNEPTNEdGhpcy5tb2RlbC5nZXQoInVzZXJfaWQiKSkpe3JldHVy
bn12YXIgaD0zRHRoaXM7Zy5maW5kPQooIi5oaXN0b3J5LW5hbWUiKS5hdHRyKCJ0aXRsZSIsX2wo
IkNsaWNrIHRvIHJlbmFtZSBoaXN0b3J5IikpLnRvb2x0aXAoe3BsYWM9CmVtZW50OiJib3R0b20i
fSkubWFrZV90ZXh0X2VkaXRhYmxlKHtvbl9maW5pc2g6ZnVuY3Rpb24oaSl7dmFyIGo9M0RoLm1v
ZGVsLj0KZ2V0KCJuYW1lIik7aWYoaSYmaSE9M0Q9M0RqKXtoLiRlbC5maW5kKCIuaGlzdG9yeS1u
YW1lIikudGV4dChpKTtoLm1vZGVsLnNhPQp2ZSh7bmFtZTppfSkuZmFpbChmdW5jdGlvbigpe2gu
JGVsLmZpbmQoIi5oaXN0b3J5LW5hbWUiKS50ZXh0KGgubW9kZWwucHJldmk9Cm91cygibmFtZSIp
KX0pfWVsc2V7aC4kZWwuZmluZCgiLmhpc3RvcnktbmFtZSIpLnRleHQoail9fX0pfSxfc2V0VXBE
YXRhc2V0QT0KY3Rpb25zUG9wdXA6ZnVuY3Rpb24oZyl7dmFyIGg9M0R0aGlzOyhuZXcgUG9wdXBN
ZW51KGcuZmluZCgiLmhpc3RvcnktZGF0YXNlPQp0LWFjdGlvbi1wb3B1cC1idG4iKSxbe2h0bWw6
X2woIkhpZGUgZGF0YXNldHMiKSxmdW5jOmZ1bmN0aW9uKCl7dmFyIGk9M0RlLkg9CmlzdG9yeURh
dGFzZXRBc3NvY2lhdGlvbi5wcm90b3R5cGUuaGlkZTtoLmdldFNlbGVjdGVkSGRhQ29sbGVjdGlv
bigpLmFqYXhRdT0KZXVlKGkpfX0se2h0bWw6X2woIlVuaGlkZSBkYXRhc2V0cyIpLGZ1bmM6ZnVu
Y3Rpb24oKXt2YXIgaT0zRGUuSGlzdG9yeURhdGFzPQpldEFzc29jaWF0aW9uLnByb3RvdHlwZS51
bmhpZGU7aC5nZXRTZWxlY3RlZEhkYUNvbGxlY3Rpb24oKS5hamF4UXVldWUoaSl9fSw9CntodG1s
Ol9sKCJEZWxldGUgZGF0YXNldHMiKSxmdW5jOmZ1bmN0aW9uKCl7dmFyIGk9M0RlLkhpc3RvcnlE
YXRhc2V0QXNzb2NpYT0KdGlvbi5wcm90b3R5cGVbImRlbGV0ZSJdO2guZ2V0U2VsZWN0ZWRIZGFD
b2xsZWN0aW9uKCkuYWpheFF1ZXVlKGkpfX0se2h0bWw6PQpfbCgiVW5kZWxldGUgZGF0YXNldHMi
KSxmdW5jOmZ1bmN0aW9uKCl7dmFyIGk9M0RlLkhpc3RvcnlEYXRhc2V0QXNzb2NpYXRpb249Ci5w
cm90b3R5cGUudW5kZWxldGU7aC5nZXRTZWxlY3RlZEhkYUNvbGxlY3Rpb24oKS5hamF4UXVldWUo
aSl9fSx7aHRtbDpfbCgiUD0KZXJtYW5lbnRseSBkZWxldGUgZGF0YXNldHMiKSxmdW5jOmZ1bmN0
aW9uKCl7aWYoY29uZmlybShfbCgiVGhpcyB3aWxsIHBlcm1hPQpuZW50bHkgcmVtb3ZlIHRoZSBk
YXRhIGluIHlvdXIgZGF0YXNldHMuIEFyZSB5b3Ugc3VyZT8iKSkpe3ZhciBpPTNEZS5IaXN0b3I9
CnlEYXRhc2V0QXNzb2NpYXRpb24ucHJvdG90eXBlLnB1cmdlO2guZ2V0U2VsZWN0ZWRIZGFDb2xs
ZWN0aW9uKCkuYWpheFF1ZXVlKD0KaSl9fX1dKSl9LF9oYW5kbGVIZGFEZWxldGlvbkNoYW5nZTpm
dW5jdGlvbihnKXtpZihnLmdldCgiZGVsZXRlZCIpJiYhdGhpcy5zPQp0b3JhZ2UuZ2V0KCJzaG93
X2RlbGV0ZWQiKSl7dGhpcy5yZW1vdmVIZGFWaWV3KHRoaXMuaGRhVmlld3NbZy5pZF0pfX0sX2hh
bmQ9CmxlSGRhVmlzaWJsZUNoYW5nZTpmdW5jdGlvbihnKXtpZihnLmhpZGRlbigpJiYhdGhpcy5z
dG9yYWdlLmdldCgic2hvd19oaWRkZT0KbiIpKXt0aGlzLnJlbW92ZUhkYVZpZXcodGhpcy5oZGFW
aWV3c1tnLmlkXSl9fSxfY3JlYXRlSGRhVmlldzpmdW5jdGlvbihoKXt2PQphciBnPTNEaC5nZXQo
ImlkIiksaT0zRG5ldyB0aGlzLkhEQVZpZXdDbGFzcyh7bW9kZWw6aCxsaW5rVGFyZ2V0OnRoaXMu
bGlua1Q9CmFyZ2V0LGV4cGFuZGVkOnRoaXMuc3RvcmFnZS5nZXQoImV4cGFuZGVkSGRhcyIpW2dd
LHNlbGVjdGFibGU6dGhpcy5zZWxlY3Rpbj0KZyxoYXNVc2VyOnRoaXMubW9kZWwub3duZWRCeUN1
cnJVc2VyKCksbG9nZ2VyOnRoaXMubG9nZ2VyLHRhZ3NFZGl0b3JTaG93bjooPQp0aGlzLnRhZ3NF
ZGl0b3ImJiF0aGlzLnRhZ3NFZGl0b3IuaGlkZGVuKSxhbm5vdGF0aW9uRWRpdG9yU2hvd246KHRo
aXMuYW5ub3Q9CmF0aW9uRWRpdG9yJiYhdGhpcy5hbm5vdGF0aW9uRWRpdG9yLmhpZGRlbil9KTt0
aGlzLl9zZXRVcEhkYUxpc3RlbmVycyhpKTtyZT0KdHVybiBpfSxfc2V0VXBIZGFMaXN0ZW5lcnM6
ZnVuY3Rpb24oaCl7dmFyIGc9M0R0aGlzO2QuUmVhZE9ubHlIaXN0b3J5UGFuZWwuPQpwcm90b3R5
cGUuX3NldFVwSGRhTGlzdGVuZXJzLmNhbGwodGhpcyxoKTtoLm9uKCJzZWxlY3RlZCIsZnVuY3Rp
b24oaSl7dmFyIGo9Cj0zRGkubW9kZWwuZ2V0KCJpZCIpO2cuc2VsZWN0ZWRIZGFJZHM9M0RfLnVu
aW9uKGcuc2VsZWN0ZWRIZGFJZHMsW2pdKX0pO2gubz0KbigiZGUtc2VsZWN0ZWQiLGZ1bmN0aW9u
KGkpe3ZhciBqPTNEaS5tb2RlbC5nZXQoImlkIik7Zy5zZWxlY3RlZEhkYUlkcz0zRF8uPQp3aXRo
b3V0KGcuc2VsZWN0ZWRIZGFJZHMsail9KX0sdG9nZ2xlSERBVGFnRWRpdG9yczpmdW5jdGlvbihn
KXt2YXIgaD0zRGFyZ3U9Cm1lbnRzO18uZWFjaCh0aGlzLmhkYVZpZXdzLGZ1bmN0aW9uKGkpe2lm
KGkudGFnc0VkaXRvcil7aS50YWdzRWRpdG9yLnRvZ2dsZT0KLmFwcGx5KGkudGFnc0VkaXRvcixo
KX19KX0sdG9nZ2xlSERBQW5ub3RhdGlvbkVkaXRvcnM6ZnVuY3Rpb24oZyl7dmFyIGg9M0RhPQpy
Z3VtZW50cztfLmVhY2godGhpcy5oZGFWaWV3cyxmdW5jdGlvbihpKXtpZihpLmFubm90YXRpb25F
ZGl0b3Ipe2kuYW5ub3RhdGk9Cm9uRWRpdG9yLnRvZ2dsZS5hcHBseShpLmFubm90YXRpb25FZGl0
b3IsaCl9fSl9LHJlbW92ZUhkYVZpZXc6ZnVuY3Rpb24oaCl7aT0KZighaCl7cmV0dXJufXZhciBn
PTNEdGhpcztoLiRlbC5mYWRlT3V0KGcuZnhTcGVlZCxmdW5jdGlvbigpe2gub2ZmKCk7aC5yZW1v
PQp2ZSgpO2RlbGV0ZSBnLmhkYVZpZXdzW2gubW9kZWwuaWRdO2lmKF8uaXNFbXB0eShnLmhkYVZp
ZXdzKSl7Zy4kZW1wdHlNZXNzYWc9CmUoKS5mYWRlSW4oZy5meFNwZWVkLGZ1bmN0aW9uKCl7Zy50
cmlnZ2VyKCJlbXB0eS1oaXN0b3J5IixnKX0pfX0pfSxldmVudHM6Xz0KLmV4dGVuZChfLmNsb25l
KGQuUmVhZE9ubHlIaXN0b3J5UGFuZWwucHJvdG90eXBlLmV2ZW50cykseyJjbGljayAuaGlzdG9y
eS1zPQplbGVjdC1idG4iOiJ0b2dnbGVTZWxlY3RvcnMiLCJjbGljayAuaGlzdG9yeS1zZWxlY3Qt
YWxsLWRhdGFzZXRzLWJ0biI6InNlbGU9CmN0QWxsRGF0YXNldHMiLCJjbGljayAuaGlzdG9yeS1k
ZXNlbGVjdC1hbGwtZGF0YXNldHMtYnRuIjoiZGVzZWxlY3RBbGxEYXRhcz0KZXRzIn0pLHVwZGF0
ZUhpc3RvcnlEaXNrU2l6ZTpmdW5jdGlvbigpe3RoaXMuJGVsLmZpbmQoIi5oaXN0b3J5LXNpemUi
KS50ZXh0PQoodGhpcy5tb2RlbC5nZXQoIm5pY2Vfc2l6ZSIpKX0sc2hvd1NlbGVjdG9yczpmdW5j
dGlvbihnKXtnPTNEKGchPTNEPTNEdW5kZWY9CmluZWQpPyhnKToodGhpcy5meFNwZWVkKTt0aGlz
LnNlbGVjdGluZz0zRHRydWU7dGhpcy4kKCIuaGlzdG9yeS1kYXRhc2V0LWFjdD0KaW9ucyIpLnNs
aWRlRG93bihnKTtfLmVhY2godGhpcy5oZGFWaWV3cyxmdW5jdGlvbihoKXtoLnNob3dTZWxlY3Rv
cigpfSk7dGhpPQpzLnNlbGVjdGVkSGRhSWRzPTNEW119LGhpZGVTZWxlY3RvcnM6ZnVuY3Rpb24o
Zyl7Zz0zRChnIT0zRD0zRHVuZGVmaW5lZCk/KGc9Cik6KHRoaXMuZnhTcGVlZCk7dGhpcy5zZWxl
Y3Rpbmc9M0RmYWxzZTt0aGlzLiQoIi5oaXN0b3J5LWRhdGFzZXQtYWN0aW9ucyIpLj0Kc2xpZGVV
cChnKTtfLmVhY2godGhpcy5oZGFWaWV3cyxmdW5jdGlvbihoKXtoLmhpZGVTZWxlY3RvcigpfSk7
dGhpcy5zZWxlY3RlPQpkSGRhSWRzPTNEW119LHRvZ2dsZVNlbGVjdG9yczpmdW5jdGlvbigpe2lm
KCF0aGlzLnNlbGVjdGluZyl7dGhpcy5zaG93U2VsZWM9CnRvcnMoKX1lbHNle3RoaXMuaGlkZVNl
bGVjdG9ycygpfX0sc2VsZWN0QWxsRGF0YXNldHM6ZnVuY3Rpb24oZyl7Xy5lYWNoKHRoaT0Kcy5o
ZGFWaWV3cyxmdW5jdGlvbihoKXtoLnNlbGVjdChnKX0pfSxkZXNlbGVjdEFsbERhdGFzZXRzOmZ1
bmN0aW9uKGcpe18uZWFjPQpoKHRoaXMuaGRhVmlld3MsZnVuY3Rpb24oaCl7aC5kZXNlbGVjdChn
KX0pfSxnZXRTZWxlY3RlZEhkYVZpZXdzOmZ1bmN0aW9uKCk9CntyZXR1cm4gXy5maWx0ZXIodGhp
cy5oZGFWaWV3cyxmdW5jdGlvbihnKXtyZXR1cm4gZy5zZWxlY3RlZH0pfSxnZXRTZWxlY3RlZD0K
SGRhQ29sbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiBuZXcgZS5IREFDb2xsZWN0aW9uKF8ubWFw
KHRoaXMuZ2V0U2VsZWN0ZWRIPQpkYVZpZXdzKCksZnVuY3Rpb24oZyl7cmV0dXJuIGcubW9kZWx9
KSx7aGlzdG9yeUlkOnRoaXMubW9kZWwuaWR9KX0sdG9TdHJpbmc9CjpmdW5jdGlvbigpe3JldHVy
biJIaXN0b3J5UGFuZWwoIisoKHRoaXMubW9kZWwpPyh0aGlzLm1vZGVsLmdldCgibmFtZSIpKToo
Ij0KIikpKyIpIn19KTtyZXR1cm57SGlzdG9yeVBhbmVsOmZ9fSk7ClwgTm8gbmV3bGluZSBhdCBl
bmQgb2YgZmlsZQorZGVmaW5lKFsibXZjL2RhdGFzZXQvaGRhLW1vZGVsIiwibXZjL2RhdGFzZXQv
aGRhLWVkaXQiLCJtdmMvaGlzdG9yeS9yZWFkb249Cmx5LWhpc3RvcnktcGFuZWwiLCJtdmMvdGFn
cyIsIm12Yy9hbm5vdGF0aW9ucyIsInV0aWxzL2xvY2FsaXphdGlvbiJdLGZ1bmN0aT0Kb24oZixi
LGQsYSxjLGUpe3ZhciBnPTNEZC5SZWFkT25seUhpc3RvcnlQYW5lbC5leHRlbmQoe0hEQVZpZXdD
bGFzczpiLkhEQUVkPQppdFZpZXcsaW5pdGlhbGl6ZTpmdW5jdGlvbihoKXtoPTNEaHx8e307dGhp
cy5zZWxlY3RlZEhkYUlkcz0zRFtdO3RoaXMudGFnc0U9CmRpdG9yPTNEbnVsbDt0aGlzLmFubm90
YXRpb25FZGl0b3I9M0RudWxsO3RoaXMuc2VsZWN0aW5nPTNEaC5zZWxlY3Rpbmd8fGZhbD0Kc2U7
dGhpcy5hbm5vdGF0aW9uRWRpdG9yU2hvd249M0RoLmFubm90YXRpb25FZGl0b3JTaG93bnx8ZmFs
c2U7dGhpcy50YWdzRWRpPQp0b3JTaG93bj0zRGgudGFnc0VkaXRvclNob3dufHxmYWxzZTtkLlJl
YWRPbmx5SGlzdG9yeVBhbmVsLnByb3RvdHlwZS5pbml0aWE9CmxpemUuY2FsbCh0aGlzLGgpfSxf
c2V0VXBNb2RlbEV2ZW50SGFuZGxlcnM6ZnVuY3Rpb24oKXtkLlJlYWRPbmx5SGlzdG9yeVBhbj0K
ZWwucHJvdG90eXBlLl9zZXRVcE1vZGVsRXZlbnRIYW5kbGVycy5jYWxsKHRoaXMpO3RoaXMubW9k
ZWwub24oImNoYW5nZTpuaWNlPQpfc2l6ZSIsdGhpcy51cGRhdGVIaXN0b3J5RGlza1NpemUsdGhp
cyk7dGhpcy5tb2RlbC5oZGFzLm9uKCJjaGFuZ2U6ZGVsZXRlZCI9Cix0aGlzLl9oYW5kbGVIZGFE
ZWxldGlvbkNoYW5nZSx0aGlzKTt0aGlzLm1vZGVsLmhkYXMub24oImNoYW5nZTp2aXNpYmxlIix0
aD0KaXMuX2hhbmRsZUhkYVZpc2libGVDaGFuZ2UsdGhpcyk7dGhpcy5tb2RlbC5oZGFzLm9uKCJj
aGFuZ2U6cHVyZ2VkIixmdW5jdGlvPQpuKGgpe3RoaXMubW9kZWwuZmV0Y2goKX0sdGhpcyl9LHJl
bmRlck1vZGVsOmZ1bmN0aW9uKCl7dmFyIGg9M0QkKCI8ZGl2Lz4iKTs9CmguYXBwZW5kKGcudGVt
cGxhdGVzLmhpc3RvcnlQYW5lbCh0aGlzLm1vZGVsLnRvSlNPTigpKSk7dGhpcy4kZW1wdHlNZXNz
YWdlKD0KaCkudGV4dCh0aGlzLmVtcHR5TXNnKTtpZihHYWxheHkmJkdhbGF4eS5jdXJyVXNlciYm
R2FsYXh5LmN1cnJVc2VyLmlkJiZHYWxhPQp4eS5jdXJyVXNlci5pZD0zRD0zRD0zRHRoaXMubW9k
ZWwuZ2V0KCJ1c2VyX2lkIikpe3RoaXMuX3JlbmRlclRhZ3MoaCk7dGhpcy49Cl9yZW5kZXJBbm5v
dGF0aW9uKGgpfWguZmluZCgiLmhpc3Rvcnktc2Vjb25kYXJ5LWFjdGlvbnMiKS5wcmVwZW5kKHRo
aXMuX3Jlbj0KZGVyU2VsZWN0QnV0dG9uKCkpO2guZmluZCgiLmhpc3RvcnktZGF0YXNldC1hY3Rp
b25zIikudG9nZ2xlKHRoaXMuc2VsZWN0aW5nPQopO2guZmluZCgiLmhpc3Rvcnktc2Vjb25kYXJ5
LWFjdGlvbnMiKS5wcmVwZW5kKHRoaXMuX3JlbmRlclNlYXJjaEJ1dHRvbigpKTs9CnRoaXMuX3Nl
dFVwQmVoYXZpb3VycyhoKTt0aGlzLnJlbmRlckhkYXMoaCk7cmV0dXJuIGh9LF9yZW5kZXJUYWdz
OmZ1bmN0aW9uKD0KaCl7dmFyIGk9M0R0aGlzO3RoaXMudGFnc0VkaXRvcj0zRG5ldyBhLlRhZ3NF
ZGl0b3Ioe21vZGVsOnRoaXMubW9kZWwsZWw6aC5mPQppbmQoIi5oaXN0b3J5LWNvbnRyb2xzIC50
YWdzLWRpc3BsYXkiKSxvbnNob3dGaXJzdFRpbWU6ZnVuY3Rpb24oKXt0aGlzLnJlbmQ9CmVyKCl9
LG9uc2hvdzpmdW5jdGlvbigpe2kudG9nZ2xlSERBVGFnRWRpdG9ycyh0cnVlLGkuZnhTcGVlZCl9
LG9uaGlkZTpmdW5jdD0KaW9uKCl7aS50b2dnbGVIREFUYWdFZGl0b3JzKGZhbHNlLGkuZnhTcGVl
ZCl9LCRhY3RpdmF0b3I6ZmFJY29uQnV0dG9uKHt0aXRsPQplOmUoIkVkaXQgaGlzdG9yeSB0YWdz
IiksY2xhc3NlczoiaGlzdG9yeS10YWctYnRuIixmYUljb246ImZhLXRhZ3MifSkuYXBwZW49CmRU
byhoLmZpbmQoIi5oaXN0b3J5LXNlY29uZGFyeS1hY3Rpb25zIikpfSl9LF9yZW5kZXJBbm5vdGF0
aW9uOmZ1bmN0aW9uKGgpez0KdmFyIGk9M0R0aGlzO3RoaXMuYW5ub3RhdGlvbkVkaXRvcj0zRG5l
dyBjLkFubm90YXRpb25FZGl0b3Ioe21vZGVsOnRoaXMubW9kPQplbCxlbDpoLmZpbmQoIi5oaXN0
b3J5LWNvbnRyb2xzIC5hbm5vdGF0aW9uLWRpc3BsYXkiKSxvbnNob3dGaXJzdFRpbWU6ZnVuY3Q9
Cmlvbigpe3RoaXMucmVuZGVyKCl9LG9uc2hvdzpmdW5jdGlvbigpe2kudG9nZ2xlSERBQW5ub3Rh
dGlvbkVkaXRvcnModHJ1ZSxpLj0KZnhTcGVlZCl9LG9uaGlkZTpmdW5jdGlvbigpe2kudG9nZ2xl
SERBQW5ub3RhdGlvbkVkaXRvcnMoZmFsc2UsaS5meFNwZWVkKX0sPQokYWN0aXZhdG9yOmZhSWNv
bkJ1dHRvbih7dGl0bGU6ZSgiRWRpdCBoaXN0b3J5IEFubm90YXRpb24iKSxjbGFzc2VzOiJoaXN0
b3I9CnktYW5ub3RhdGUtYnRuIixmYUljb246ImZhLWNvbW1lbnQifSkuYXBwZW5kVG8oaC5maW5k
KCIuaGlzdG9yeS1zZWNvbmRhcnktYT0KY3Rpb25zIikpfSl9LF9yZW5kZXJTZWxlY3RCdXR0b246
ZnVuY3Rpb24oaCl7cmV0dXJuIGZhSWNvbkJ1dHRvbih7dGl0bGU6ZSgiPQpPcGVyYXRpb25zIG9u
IG11bHRpcGxlIGRhdGFzZXRzIiksY2xhc3NlczoiaGlzdG9yeS1zZWxlY3QtYnRuIixmYUljb246
ImZhLWM9CmhlY2stc3F1YXJlLW8ifSl9LF9zZXRVcEJlaGF2aW91cnM6ZnVuY3Rpb24oaCl7aD0z
RGh8fHRoaXMuJGVsO2QuUmVhZE9ubHlIaT0Kc3RvcnlQYW5lbC5wcm90b3R5cGUuX3NldFVwQmVo
YXZpb3Vycy5jYWxsKHRoaXMsaCk7aWYoIXRoaXMubW9kZWwpe3JldHVybn10PQpoaXMuX3NldFVw
RGF0YXNldEFjdGlvbnNQb3B1cChoKTtpZigoIUdhbGF4eS5jdXJyVXNlcnx8R2FsYXh5LmN1cnJV
c2VyLmlzQW49Cm9ueW1vdXMoKSl8fChHYWxheHkuY3VyclVzZXIuaWQhPTNEPTNEdGhpcy5tb2Rl
bC5nZXQoInVzZXJfaWQiKSkpe3JldHVybn12YT0KciBpPTNEdGhpcztoLmZpbmQoIi5oaXN0b3J5
LW5hbWUiKS5hdHRyKCJ0aXRsZSIsZSgiQ2xpY2sgdG8gcmVuYW1lIGhpc3RvcnkiPQopKS50b29s
dGlwKHtwbGFjZW1lbnQ6ImJvdHRvbSJ9KS5tYWtlX3RleHRfZWRpdGFibGUoe29uX2ZpbmlzaDpm
dW5jdGlvbihqKXs9CnZhciBrPTNEaS5tb2RlbC5nZXQoIm5hbWUiKTtpZihqJiZqIT0zRD0zRGsp
e2kuJGVsLmZpbmQoIi5oaXN0b3J5LW5hbWUiKS50ZT0KeHQoaik7aS5tb2RlbC5zYXZlKHtuYW1l
Omp9KS5mYWlsKGZ1bmN0aW9uKCl7aS4kZWwuZmluZCgiLmhpc3RvcnktbmFtZSIpLnRlPQp4dChp
Lm1vZGVsLnByZXZpb3VzKCJuYW1lIikpfSl9ZWxzZXtpLiRlbC5maW5kKCIuaGlzdG9yeS1uYW1l
IikudGV4dChrKX19fSk9Cn0sX3NldFVwRGF0YXNldEFjdGlvbnNQb3B1cDpmdW5jdGlvbihoKXt2
YXIgaT0zRHRoaXM7KG5ldyBQb3B1cE1lbnUoaC5maW5kKD0KIi5oaXN0b3J5LWRhdGFzZXQtYWN0
aW9uLXBvcHVwLWJ0biIpLFt7aHRtbDplKCJIaWRlIGRhdGFzZXRzIiksZnVuYzpmdW5jdGlvPQpu
KCl7dmFyIGo9M0RmLkhpc3RvcnlEYXRhc2V0QXNzb2NpYXRpb24ucHJvdG90eXBlLmhpZGU7aS5n
ZXRTZWxlY3RlZEhkYUNvbGw9CmVjdGlvbigpLmFqYXhRdWV1ZShqKX19LHtodG1sOmUoIlVuaGlk
ZSBkYXRhc2V0cyIpLGZ1bmM6ZnVuY3Rpb24oKXt2YXIgaj0zRD0KZi5IaXN0b3J5RGF0YXNldEFz
c29jaWF0aW9uLnByb3RvdHlwZS51bmhpZGU7aS5nZXRTZWxlY3RlZEhkYUNvbGxlY3Rpb24oKS5h
PQpqYXhRdWV1ZShqKX19LHtodG1sOmUoIkRlbGV0ZSBkYXRhc2V0cyIpLGZ1bmM6ZnVuY3Rpb24o
KXt2YXIgaj0zRGYuSGlzdG9yeUQ9CmF0YXNldEFzc29jaWF0aW9uLnByb3RvdHlwZVsiZGVsZXRl
Il07aS5nZXRTZWxlY3RlZEhkYUNvbGxlY3Rpb24oKS5hamF4UXVldT0KZShqKX19LHtodG1sOmUo
IlVuZGVsZXRlIGRhdGFzZXRzIiksZnVuYzpmdW5jdGlvbigpe3ZhciBqPTNEZi5IaXN0b3J5RGF0
YXNlPQp0QXNzb2NpYXRpb24ucHJvdG90eXBlLnVuZGVsZXRlO2kuZ2V0U2VsZWN0ZWRIZGFDb2xs
ZWN0aW9uKCkuYWpheFF1ZXVlKGopfX09Cix7aHRtbDplKCJQZXJtYW5lbnRseSBkZWxldGUgZGF0
YXNldHMiKSxmdW5jOmZ1bmN0aW9uKCl7aWYoY29uZmlybShlKCJUaGlzID0Kd2lsbCBwZXJtYW5l
bnRseSByZW1vdmUgdGhlIGRhdGEgaW4geW91ciBkYXRhc2V0cy4gQXJlIHlvdSBzdXJlPyIpKSl7
dmFyIGo9Cj0zRGYuSGlzdG9yeURhdGFzZXRBc3NvY2lhdGlvbi5wcm90b3R5cGUucHVyZ2U7aS5n
ZXRTZWxlY3RlZEhkYUNvbGxlY3Rpb24oKT0KLmFqYXhRdWV1ZShqKX19fV0pKX0sX2hhbmRsZUhk
YURlbGV0aW9uQ2hhbmdlOmZ1bmN0aW9uKGgpe2lmKGguZ2V0KCJkZWxldGVkPQoiKSYmIXRoaXMu
c3RvcmFnZS5nZXQoInNob3dfZGVsZXRlZCIpKXt0aGlzLnJlbW92ZUhkYVZpZXcodGhpcy5oZGFW
aWV3c1toLmk9CmRdKX19LF9oYW5kbGVIZGFWaXNpYmxlQ2hhbmdlOmZ1bmN0aW9uKGgpe2lmKGgu
aGlkZGVuKCkmJiF0aGlzLnN0b3JhZ2UuZ2V0KD0KInNob3dfaGlkZGVuIikpe3RoaXMucmVtb3Zl
SGRhVmlldyh0aGlzLmhkYVZpZXdzW2guaWRdKX19LF9jcmVhdGVIZGFWaWV3OmZ1PQpuY3Rpb24o
aSl7dmFyIGg9M0RpLmdldCgiaWQiKSxqPTNEbmV3IHRoaXMuSERBVmlld0NsYXNzKHttb2RlbDpp
LGxpbmtUYXJnZXQ9Cjp0aGlzLmxpbmtUYXJnZXQsZXhwYW5kZWQ6dGhpcy5zdG9yYWdlLmdldCgi
ZXhwYW5kZWRIZGFzIilbaF0sc2VsZWN0YWJsZTp0aD0KaXMuc2VsZWN0aW5nLGhhc1VzZXI6dGhp
cy5tb2RlbC5vd25lZEJ5Q3VyclVzZXIoKSxsb2dnZXI6dGhpcy5sb2dnZXIsdGFnc0VkPQppdG9y
U2hvd246KHRoaXMudGFnc0VkaXRvciYmIXRoaXMudGFnc0VkaXRvci5oaWRkZW4pLGFubm90YXRp
b25FZGl0b3JTaG93bjo9Cih0aGlzLmFubm90YXRpb25FZGl0b3ImJiF0aGlzLmFubm90YXRpb25F
ZGl0b3IuaGlkZGVuKX0pO3RoaXMuX3NldFVwSGRhTGlzdD0KZW5lcnMoaik7cmV0dXJuIGp9LF9z
ZXRVcEhkYUxpc3RlbmVyczpmdW5jdGlvbihpKXt2YXIgaD0zRHRoaXM7ZC5SZWFkT25seUhpPQpz
dG9yeVBhbmVsLnByb3RvdHlwZS5fc2V0VXBIZGFMaXN0ZW5lcnMuY2FsbCh0aGlzLGkpO2kub24o
InNlbGVjdGVkIixmdW5jdGk9Cm9uKGope3ZhciBrPTNEai5tb2RlbC5nZXQoImlkIik7aC5zZWxl
Y3RlZEhkYUlkcz0zRF8udW5pb24oaC5zZWxlY3RlZEhkYUlkcz0KLFtrXSl9KTtpLm9uKCJkZS1z
ZWxlY3RlZCIsZnVuY3Rpb24oail7dmFyIGs9M0RqLm1vZGVsLmdldCgiaWQiKTtoLnNlbGVjdGVk
PQpIZGFJZHM9M0RfLndpdGhvdXQoaC5zZWxlY3RlZEhkYUlkcyxrKX0pfSx0b2dnbGVIREFUYWdF
ZGl0b3JzOmZ1bmN0aW9uKGgpe3Y9CmFyIGk9M0Rhcmd1bWVudHM7Xy5lYWNoKHRoaXMuaGRhVmll
d3MsZnVuY3Rpb24oail7aWYoai50YWdzRWRpdG9yKXtqLnRhZ3NFZD0KaXRvci50b2dnbGUuYXBw
bHkoai50YWdzRWRpdG9yLGkpfX0pfSx0b2dnbGVIREFBbm5vdGF0aW9uRWRpdG9yczpmdW5jdGlv
bihoPQope3ZhciBpPTNEYXJndW1lbnRzO18uZWFjaCh0aGlzLmhkYVZpZXdzLGZ1bmN0aW9uKGop
e2lmKGouYW5ub3RhdGlvbkVkaXRvcik9CntqLmFubm90YXRpb25FZGl0b3IudG9nZ2xlLmFwcGx5
KGouYW5ub3RhdGlvbkVkaXRvcixpKX19KX0scmVtb3ZlSGRhVmlldzpmdT0KbmN0aW9uKGkpe2lm
KCFpKXtyZXR1cm59dmFyIGg9M0R0aGlzO2kuJGVsLmZhZGVPdXQoaC5meFNwZWVkLGZ1bmN0aW9u
KCl7aS5vPQpmZigpO2kucmVtb3ZlKCk7ZGVsZXRlIGguaGRhVmlld3NbaS5tb2RlbC5pZF07aWYo
Xy5pc0VtcHR5KGguaGRhVmlld3MpKXtoLiQ9CmVtcHR5TWVzc2FnZSgpLmZhZGVJbihoLmZ4U3Bl
ZWQsZnVuY3Rpb24oKXtoLnRyaWdnZXIoImVtcHR5LWhpc3RvcnkiLGgpfSl9fT0KKX0sZXZlbnRz
Ol8uZXh0ZW5kKF8uY2xvbmUoZC5SZWFkT25seUhpc3RvcnlQYW5lbC5wcm90b3R5cGUuZXZlbnRz
KSx7ImNsaWNrPQogLmhpc3Rvcnktc2VsZWN0LWJ0biI6InRvZ2dsZVNlbGVjdG9ycyIsImNsaWNr
IC5oaXN0b3J5LXNlbGVjdC1hbGwtZGF0YXNldHM9Ci1idG4iOiJzZWxlY3RBbGxEYXRhc2V0cyIs
ImNsaWNrIC5oaXN0b3J5LWRlc2VsZWN0LWFsbC1kYXRhc2V0cy1idG4iOiJkZXNlbD0KZWN0QWxs
RGF0YXNldHMifSksdXBkYXRlSGlzdG9yeURpc2tTaXplOmZ1bmN0aW9uKCl7dGhpcy4kZWwuZmlu
ZCgiLmhpc3RvcnktPQpzaXplIikudGV4dCh0aGlzLm1vZGVsLmdldCgibmljZV9zaXplIikpfSxz
aG93U2VsZWN0b3JzOmZ1bmN0aW9uKGgpe2g9M0QoaCE9Cj0zRD0zRHVuZGVmaW5lZCk/KGgpOih0
aGlzLmZ4U3BlZWQpO3RoaXMuc2VsZWN0aW5nPTNEdHJ1ZTt0aGlzLiQoIi5oaXN0b3J5LT0KZGF0
YXNldC1hY3Rpb25zIikuc2xpZGVEb3duKGgpO18uZWFjaCh0aGlzLmhkYVZpZXdzLGZ1bmN0aW9u
KGkpe2kuc2hvd1NlbGVjPQp0b3IoKX0pO3RoaXMuc2VsZWN0ZWRIZGFJZHM9M0RbXX0saGlkZVNl
bGVjdG9yczpmdW5jdGlvbihoKXtoPTNEKGghPTNEPTNEdW49CmRlZmluZWQpPyhoKToodGhpcy5m
eFNwZWVkKTt0aGlzLnNlbGVjdGluZz0zRGZhbHNlO3RoaXMuJCgiLmhpc3RvcnktZGF0YXNldD0K
LWFjdGlvbnMiKS5zbGlkZVVwKGgpO18uZWFjaCh0aGlzLmhkYVZpZXdzLGZ1bmN0aW9uKGkpe2ku
aGlkZVNlbGVjdG9yKCl9KTt0PQpoaXMuc2VsZWN0ZWRIZGFJZHM9M0RbXX0sdG9nZ2xlU2VsZWN0
b3JzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2VsZWN0aW5nKXt0aGk9CnMuc2hvd1NlbGVjdG9ycygp
fWVsc2V7dGhpcy5oaWRlU2VsZWN0b3JzKCl9fSxzZWxlY3RBbGxEYXRhc2V0czpmdW5jdGlvbiho
KT0Ke18uZWFjaCh0aGlzLmhkYVZpZXdzLGZ1bmN0aW9uKGkpe2kuc2VsZWN0KGgpfSl9LGRlc2Vs
ZWN0QWxsRGF0YXNldHM6ZnVuY3RpPQpvbihoKXtfLmVhY2godGhpcy5oZGFWaWV3cyxmdW5jdGlv
bihpKXtpLmRlc2VsZWN0KGgpfSl9LGdldFNlbGVjdGVkSGRhVmlld3M9CjpmdW5jdGlvbigpe3Jl
dHVybiBfLmZpbHRlcih0aGlzLmhkYVZpZXdzLGZ1bmN0aW9uKGgpe3JldHVybiBoLnNlbGVjdGVk
fSl9LD0KZ2V0U2VsZWN0ZWRIZGFDb2xsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBmLkhE
QUNvbGxlY3Rpb24oXy5tYXAodGhpcy5nPQpldFNlbGVjdGVkSGRhVmlld3MoKSxmdW5jdGlvbiho
KXtyZXR1cm4gaC5tb2RlbH0pLHtoaXN0b3J5SWQ6dGhpcy5tb2RlbC5pZH09Cil9LHRvU3RyaW5n
OmZ1bmN0aW9uKCl7cmV0dXJuIkhpc3RvcnlQYW5lbCgiKygodGhpcy5tb2RlbCk/KHRoaXMubW9k
ZWwuZ2V0KD0KIm5hbWUiKSk6KCIiKSkrIikifX0pO3JldHVybntIaXN0b3J5UGFuZWw6Z319KTsK
XCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCgpkaWZmIC1yIDgzNDZlYzRiYWEzOTkyZjRkYzAx
NjFmMGZjNzlhMGJhODkzYzBhNjMgLXIgZGNjMGMxOTE0N2VhZDg2YzZlMzU3Yzc9CjM5ZTA1MTNh
ZGRmZTAyY2IyIHN0YXRpYy9zY3JpcHRzL3BhY2tlZC9tdmMvaGlzdG9yeS9yZWFkb25seS1oaXN0
b3J5LXBhbmVsLj0KanMKLS0tIGEvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9oaXN0b3J5L3Jl
YWRvbmx5LWhpc3RvcnktcGFuZWwuanMKKysrIGIvc3RhdGljL3NjcmlwdHMvcGFja2VkL212Yy9o
aXN0b3J5L3JlYWRvbmx5LWhpc3RvcnktcGFuZWwuanMKQEAgLTEsMSArMSwxIEBACi1kZWZpbmUo
WyJtdmMvaGlzdG9yeS9oaXN0b3J5LW1vZGVsIiwibXZjL2RhdGFzZXQvaGRhLWJhc2UiLCJtdmMv
dXNlci91c2VyLT0KbW9kZWwiLCJtdmMvYmFzZS1tdmMiXSxmdW5jdGlvbihmLGIsYSxlKXt2YXIg
aD0zRGUuU2Vzc2lvblN0b3JhZ2VNb2RlbC5leHRlPQpuZCh7ZGVmYXVsdHM6e2V4cGFuZGVkSGRh
czp7fSxzaG93X2RlbGV0ZWQ6ZmFsc2Usc2hvd19oaWRkZW46ZmFsc2V9LGFkZEV4cGE9Cm5kZWRI
ZGE6ZnVuY3Rpb24obCl7dmFyIGs9M0QiZXhwYW5kZWRIZGFzIjt0aGlzLnNhdmUoayxfLmV4dGVu
ZCh0aGlzLmdldChrKT0KLF8ub2JqZWN0KFtsXSxbdHJ1ZV0pKSl9LHJlbW92ZUV4cGFuZGVkSGRh
OmZ1bmN0aW9uKGwpe3ZhciBrPTNEImV4cGFuZGVkSGRhPQpzIjt0aGlzLnNhdmUoayxfLm9taXQo
dGhpcy5nZXQoayksbCkpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJIaXN0b3J5UHI9CmVm
cygiK3RoaXMuaWQrIikifX0pO2guc3RvcmFnZUtleVByZWZpeD0zRCJoaXN0b3J5OiI7aC5oaXN0
b3J5U3RvcmFnZUtleT0zRD0KZnVuY3Rpb24gZChrKXtpZighayl7dGhyb3cgbmV3IEVycm9yKCJI
aXN0b3J5UHJlZnMuaGlzdG9yeVN0b3JhZ2VLZXkgbmVlZHMgPQp2YWxpZCBpZDogIitrKX1yZXR1
cm4oaC5zdG9yYWdlS2V5UHJlZml4K2spfTtoLmdldD0zRGZ1bmN0aW9uIGMoayl7cmV0dXJuIG49
CmV3IGgoe2lkOmguaGlzdG9yeVN0b3JhZ2VLZXkoayl9KX07aC5jbGVhckFsbD0zRGZ1bmN0aW9u
IGcobCl7Zm9yKHZhciBrIGluID0Kc2Vzc2lvblN0b3JhZ2Upe2lmKGsuaW5kZXhPZihoLnN0b3Jh
Z2VLZXlQcmVmaXgpPTNEPTNEPTNEMCl7c2Vzc2lvblN0b3JhZ2UuPQpyZW1vdmVJdGVtKGspfX19
O3ZhciBpPTNEQmFja2JvbmUuVmlldy5leHRlbmQoZS5Mb2dnYWJsZU1peGluKS5leHRlbmQoe0hE
QVY9Cmlld0NsYXNzOmIuSERBQmFzZVZpZXcsdGFnTmFtZToiZGl2IixjbGFzc05hbWU6Imhpc3Rv
cnktcGFuZWwiLGZ4U3BlZWQ6ImZhcz0KdCIsZW1wdHlNc2c6X2woIlRoaXMgaGlzdG9yeSBpcyBl
bXB0eSIpLG5vbmVGb3VuZE1zZzpfbCgiTm8gbWF0Y2hpbmcgZGF0YXNlPQp0cyBmb3VuZCIpLGlu
aXRpYWxpemU6ZnVuY3Rpb24oayl7az0zRGt8fHt9O2lmKGsubG9nZ2VyKXt0aGlzLmxvZ2dlcj0z
RGsubG89CmdnZXJ9dGhpcy5sb2codGhpcysiLmluaXRpYWxpemU6IixrKTt0aGlzLmxpbmtUYXJn
ZXQ9M0RrLmxpbmtUYXJnZXR8fCJfYmxhbj0KayI7dGhpcy5meFNwZWVkPTNEXy5oYXMoaywiZnhT
cGVlZCIpPyhrLmZ4U3BlZWQpOih0aGlzLmZ4U3BlZWQpO3RoaXMuZmlsdGVyPQpzPTNEW107dGhp
cy5zZWFyY2hGb3I9M0QiIjt0aGlzLmZpbmRDb250YWluZXJGbj0zRGsuZmluZENvbnRhaW5lckZu
O3RoaXMuaGQ9CmFWaWV3cz0zRHt9O3RoaXMuaW5kaWNhdG9yPTNEbmV3IExvYWRpbmdJbmRpY2F0
b3IodGhpcy4kZWwpO3RoaXMuX3NldFVwTGlzdD0KZW5lcnMoKTt2YXIgbD0zRF8ucGljayhrLCJp
bml0aWFsbHlFeHBhbmRlZCIsInNob3dfZGVsZXRlZCIsInNob3dfaGlkZGVuIik7PQp0aGlzLnNl
dE1vZGVsKHRoaXMubW9kZWwsbCxmYWxzZSk7aWYoay5vbnJlYWR5KXtrLm9ucmVhZHkuY2FsbCh0
aGlzKX19LF9zZXQ9ClVwTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5vbigiZXJyb3IiLGZ1bmN0
aW9uKGwsbyxrLG4sbSl7dGhpcy5lcnJvckhhbmRsZT0KcihsLG8sayxuLG0pfSk7dGhpcy5vbigi
bG9hZGluZy1oaXN0b3J5IixmdW5jdGlvbigpe3RoaXMuX3Nob3dMb2FkaW5nSW5kaWNhPQp0b3Io
ImxvYWRpbmcgaGlzdG9yeS4uLiIsNDApfSk7dGhpcy5vbigibG9hZGluZy1kb25lIixmdW5jdGlv
bigpe3RoaXMuX2hpZGU9CkxvYWRpbmdJbmRpY2F0b3IoNDApO2lmKF8uaXNFbXB0eSh0aGlzLmhk
YVZpZXdzKSl7dGhpcy50cmlnZ2VyKCJlbXB0eS1oaXN0bz0KcnkiLHRoaXMpfX0pO3RoaXMub25j
ZSgicmVuZGVyZWQiLGZ1bmN0aW9uKCl7dGhpcy50cmlnZ2VyKCJyZW5kZXJlZDppbml0aWFsPQoi
LHRoaXMpO3JldHVybiBmYWxzZX0pO2lmKHRoaXMubG9nZ2VyKXt0aGlzLm9uKCJhbGwiLGZ1bmN0
aW9uKGspe3RoaXMubG9nKHQ9CmhpcysiIixhcmd1bWVudHMpfSx0aGlzKX1yZXR1cm4gdGhpc30s
ZXJyb3JIYW5kbGVyOmZ1bmN0aW9uKG0scCxsLG8sbil7Y29ucz0Kb2xlLmVycm9yKG0scCxsLG8s
bik7aWYocCYmcC5zdGF0dXM9M0Q9M0Q9M0QwJiZwLnJlYWR5U3RhdGU9M0Q9M0Q9M0QwKXt9ZWxz
PQple2lmKHAmJnAuc3RhdHVzPTNEPTNEPTNENTAyKXt9ZWxzZXt2YXIgaz0zRHRoaXMuX3BhcnNl
RXJyb3JNZXNzYWdlKG0scCxsLG89CixuKTtpZighdGhpcy4kbWVzc2FnZXMoKS5pcygiOnZpc2li
bGUiKSl7dGhpcy5vbmNlKCJyZW5kZXJlZCIsZnVuY3Rpb24oKXt0aD0KaXMuZGlzcGxheU1lc3Nh
Z2UoImVycm9yIixrLm1lc3NhZ2Usay5kZXRhaWxzKX0pfWVsc2V7dGhpcy5kaXNwbGF5TWVzc2Fn
ZSgiPQplcnJvciIsay5tZXNzYWdlLGsuZGV0YWlscyl9fX19LF9wYXJzZUVycm9yTWVzc2FnZTpm
dW5jdGlvbihuLHIsbSxxLHApe3ZhciA9Cmw9M0RHYWxheHkuY3VyclVzZXIsaz0zRHttZXNzYWdl
OnRoaXMuX2JlUG9saXRlKHEpLGRldGFpbHM6e3VzZXI6KGwgaW5zdGFuYz0KZW9mIGEuVXNlcik/
KGwudG9KU09OKCkpOihsKyIiKSxzb3VyY2U6KG4gaW5zdGFuY2VvZiBCYWNrYm9uZS5Nb2RlbCk/
KG4udG9KPQpTT04oKSk6KG4rIiIpLHhocjpyLG9wdGlvbnM6KHIpPyhfLm9taXQobSwieGhyIikp
OihtKX19O18uZXh0ZW5kKGsuZGV0YWlscyw9CnB8fHt9KTtpZihyJiZfLmlzRnVuY3Rpb24oci5n
ZXRBbGxSZXNwb25zZUhlYWRlcnMpKXt2YXIgbz0zRHIuZ2V0QWxsUmVzcG9ucz0KZUhlYWRlcnMo
KTtvPTNEXy5jb21wYWN0KG8uc3BsaXQoIlxuIikpO289M0RfLm1hcChvLGZ1bmN0aW9uKHMpe3Jl
dHVybiBzLnNwPQpsaXQoIjogIil9KTtrLmRldGFpbHMueGhyLnJlc3BvbnNlSGVhZGVycz0zRF8u
b2JqZWN0KG8pfXJldHVybiBrfSxfYmVQb2xpdGU9CjpmdW5jdGlvbihrKXtrPTNEa3x8X2woIkFu
IGVycm9yIG9jY3VycmVkIHdoaWxlIGdldHRpbmcgdXBkYXRlcyBmcm9tIHRoZSBzZT0KcnZlciIp
O3JldHVybiBrKyIuICIrX2woIlBsZWFzZSBjb250YWN0IGEgR2FsYXh5IGFkbWluaXN0cmF0b3Ig
aWYgdGhlIHByb2JsPQplbSBwZXJzaXN0cy4iKX0sbG9hZEhpc3RvcnlXaXRoSERBRGV0YWlsczpm
dW5jdGlvbihtLGwsayxvKXt2YXIgbj0zRGZ1bmN0aW89Cm4ocCl7cmV0dXJuIF8ua2V5cyhoLmdl
dChwLmlkKS5nZXQoImV4cGFuZGVkSGRhcyIpKX07cmV0dXJuIHRoaXMubG9hZEhpc3Rvcj0KeSht
LGwsayxvLG4pfSxsb2FkSGlzdG9yeTpmdW5jdGlvbihuLG0sbCxxLG8pe3ZhciBrPTNEdGhpcztt
PTNEbXx8e307ay50cmlnPQpnZXIoImxvYWRpbmctaGlzdG9yeSIsayk7dmFyIHA9M0RmLkhpc3Rv
cnkuZ2V0SGlzdG9yeURhdGEobix7aGlzdG9yeUZuOmwsaGQ9CmFGbjpxLGhkYURldGFpbElkczpt
LmluaXRpYWxseUV4cGFuZGVkfHxvfSk7cmV0dXJuIGsuX2xvYWRIaXN0b3J5RnJvbVhIUihwLD0K
bSkuZmFpbChmdW5jdGlvbih0LHIscyl7ay50cmlnZ2VyKCJlcnJvciIsayx0LG0sX2woIkFuIGVy
cm9yIHdhcyBlbmNvdW50ZXJlPQpkIHdoaWxlICIrcikse2hpc3RvcnlJZDpuLGhpc3Rvcnk6c3x8
e319KX0pLmFsd2F5cyhmdW5jdGlvbigpe2sudHJpZ2dlcigibG89CmFkaW5nLWRvbmUiLGspfSl9
LF9sb2FkSGlzdG9yeUZyb21YSFI6ZnVuY3Rpb24obSxsKXt2YXIgaz0zRHRoaXM7bS50aGVuKGZ1
bj0KY3Rpb24obixvKXtrLkpTT05Ub01vZGVsKG4sbyxsKX0pO20uZmFpbChmdW5jdGlvbihvLG4p
e2sucmVuZGVyKCl9KTtyZXR1cm4gPQptfSxKU09OVG9Nb2RlbDpmdW5jdGlvbihuLGssbCl7dGhp
cy5sb2coIkpTT05Ub01vZGVsOiIsbixrLGwpO2w9M0RsfHx7fTt2YXI9CiBtPTNEbmV3IGYuSGlz
dG9yeShuLGssbCk7dGhpcy5zZXRNb2RlbChtKTtyZXR1cm4gdGhpc30sc2V0TW9kZWw6ZnVuY3Rp
b24obD0KLGssbSl7az0zRGt8fHt9O209M0QobSE9M0Q9M0R1bmRlZmluZWQpPyhtKToodHJ1ZSk7
dGhpcy5sb2coInNldE1vZGVsOiIsbCxrPQosbSk7dGhpcy5mcmVlTW9kZWwoKTt0aGlzLnNlbGVj
dGVkSGRhSWRzPTNEW107aWYobCl7dGhpcy5tb2RlbD0zRGw7aWYodGhpcy49CmxvZ2dlcil7dGhp
cy5tb2RlbC5sb2dnZXI9M0R0aGlzLmxvZ2dlcn10aGlzLl9zZXRVcFdlYlN0b3JhZ2Uoay5pbml0
aWFsbHlFeD0KcGFuZGVkLGsuc2hvd19kZWxldGVkLGsuc2hvd19oaWRkZW4pO3RoaXMuX3NldFVw
TW9kZWxFdmVudEhhbmRsZXJzKCk7dGhpcy50PQpyaWdnZXIoIm5ldy1tb2RlbCIsdGhpcyl9aWYo
bSl7dGhpcy5yZW5kZXIoKX1yZXR1cm4gdGhpc30sZnJlZU1vZGVsOmZ1bmN0aW89Cm4oKXtpZih0
aGlzLm1vZGVsKXt0aGlzLm1vZGVsLmNsZWFyVXBkYXRlVGltZW91dCgpO3RoaXMuc3RvcExpc3Rl
bmluZyh0aGlzLj0KbW9kZWwpO3RoaXMuc3RvcExpc3RlbmluZyh0aGlzLm1vZGVsLmhkYXMpfXRo
aXMuZnJlZUhkYVZpZXdzKCk7cmV0dXJuIHRoaXN9PQosZnJlZUhkYVZpZXdzOmZ1bmN0aW9uKCl7
dGhpcy5oZGFWaWV3cz0zRHt9O3JldHVybiB0aGlzfSxfc2V0VXBXZWJTdG9yYWdlOmY9CnVuY3Rp
b24obCxrLG0pe3RoaXMuc3RvcmFnZT0zRG5ldyBoKHtpZDpoLmhpc3RvcnlTdG9yYWdlS2V5KHRo
aXMubW9kZWwuZ2V0KD0KImlkIikpfSk7aWYoXy5pc09iamVjdChsKSl7dGhpcy5zdG9yYWdlLnNl
dCgiZXhhbmRlZEhkYXMiLGwpfWlmKF8uaXNCb29sZWFuPQooaykpe3RoaXMuc3RvcmFnZS5zZXQo
InNob3dfZGVsZXRlZCIsayl9aWYoXy5pc0Jvb2xlYW4obSkpe3RoaXMuc3RvcmFnZS5zZXQ9Cigi
c2hvd19oaWRkZW4iLG0pfXRoaXMudHJpZ2dlcigibmV3LXN0b3JhZ2UiLHRoaXMuc3RvcmFnZSx0
aGlzKTt0aGlzLmxvZyh0aD0KaXMrIiAoaW5pdCdkKSBzdG9yYWdlOiIsdGhpcy5zdG9yYWdlLmdl
dCgpKTtyZXR1cm4gdGhpc30sX3NldFVwTW9kZWxFdmVudEhhPQpuZGxlcnM6ZnVuY3Rpb24oKXt0
aGlzLm1vZGVsLmhkYXMub24oImFkZCIsdGhpcy5hZGRIZGFWaWV3LHRoaXMpO3RoaXMubW9kZWw9
Ci5vbigiZXJyb3IgZXJyb3I6aGRhcyIsZnVuY3Rpb24obCxuLGssbSl7dGhpcy5lcnJvckhhbmRs
ZXIobCxuLGssbSl9LHRoaXMpOz0KcmV0dXJuIHRoaXN9LHJlbmRlcjpmdW5jdGlvbihtLG4pe3Ro
aXMubG9nKCJyZW5kZXI6IixtLG4pO209M0QobT0zRD0zRD0zRHVuPQpkZWZpbmVkKT8odGhpcy5m
eFNwZWVkKToobSk7dmFyIGs9M0R0aGlzLGw7aWYodGhpcy5tb2RlbCl7bD0zRHRoaXMucmVuZGVy
TW89CmRlbCgpfWVsc2V7bD0zRHRoaXMucmVuZGVyV2l0aG91dE1vZGVsKCl9JChrKS5xdWV1ZSgi
ZngiLFtmdW5jdGlvbihvKXtpZihtJj0KJmsuJGVsLmlzKCI6dmlzaWJsZSIpKXtrLiRlbC5mYWRl
T3V0KG0sbyl9ZWxzZXtvKCl9fSxmdW5jdGlvbihvKXtrLiRlbC5lbXB0PQp5KCk7aWYobCl7ay4k
ZWwuYXBwZW5kKGwuY2hpbGRyZW4oKSl9bygpfSxmdW5jdGlvbihvKXtpZihtJiYhay4kZWwuaXMo
Ijp2aXM9CmlibGUiKSl7ay4kZWwuZmFkZUluKG0sbyl9ZWxzZXtvKCl9fSxmdW5jdGlvbihvKXtp
ZihuKXtuLmNhbGwodGhpcyl9ay50cmlnZz0KZXIoInJlbmRlcmVkIix0aGlzKTtvKCl9XSk7cmV0
dXJuIHRoaXN9LHJlbmRlcldpdGhvdXRNb2RlbDpmdW5jdGlvbigpe3ZhciBrPQo9M0QkKCI8ZGl2
Lz4iKSxsPTNEJCgiPGRpdi8+IikuYWRkQ2xhc3MoIm1lc3NhZ2UtY29udGFpbmVyIikuY3NzKHtt
YXJnaW46IjQ9CnB4In0pO3JldHVybiBrLmFwcGVuZChsKX0scmVuZGVyTW9kZWw6ZnVuY3Rpb24o
KXt2YXIgaz0zRCQoIjxkaXYvPiIpO2suYXBwZT0KbmQoaS50ZW1wbGF0ZXMuaGlzdG9yeVBhbmVs
KHRoaXMubW9kZWwudG9KU09OKCkpKTt0aGlzLiRlbXB0eU1lc3NhZ2UoaykudGV4PQp0KHRoaXMu
ZW1wdHlNc2cpO2suZmluZCgiLmhpc3Rvcnktc2Vjb25kYXJ5LWFjdGlvbnMiKS5wcmVwZW5kKHRo
aXMuX3JlbmRlclM9CmVhcmNoQnV0dG9uKCkpO3RoaXMuX3NldFVwQmVoYXZpb3VycyhrKTt0aGlz
LnJlbmRlckhkYXMoayk7cmV0dXJuIGt9LF9yZW5kZT0KckVtcHR5TXNnOmZ1bmN0aW9uKG0pe3Zh
ciBsPTNEdGhpcyxrPTNEbC4kZW1wdHlNZXNzYWdlKG0pO2lmKCFfLmlzRW1wdHkobC5oPQpkYVZp
ZXdzKSl7ay5oaWRlKCl9ZWxzZXtpZihsLnNlYXJjaEZvcil7ay50ZXh0KGwubm9uZUZvdW5kTXNn
KS5zaG93KCl9ZWxzZXs9CmsudGV4dChsLmVtcHR5TXNnKS5zaG93KCl9fXJldHVybiB0aGlzfSxf
cmVuZGVyU2VhcmNoQnV0dG9uOmZ1bmN0aW9uKGspe3JldD0KdXJuIGZhSWNvbkJ1dHRvbih7dGl0
bGU6X2woIlNlYXJjaCBkYXRhc2V0cyIpLGNsYXNzZXM6Imhpc3Rvcnktc2VhcmNoLWJ0biIsPQpm
YUljb246ImZhLXNlYXJjaCJ9KX0sX3NldFVwQmVoYXZpb3VyczpmdW5jdGlvbihrKXtrPTNEa3x8
dGhpcy4kZWw7ay5maW5kKCI9Clt0aXRsZV0iKS50b29sdGlwKHtwbGFjZW1lbnQ6ImJvdHRvbSJ9
KTt0aGlzLl9zZXRVcFNlYXJjaElucHV0KGsuZmluZCgiLmhpcz0KdG9yeS1zZWFyY2gtY29udHJv
bHMgLmhpc3Rvcnktc2VhcmNoLWlucHV0IikpO3JldHVybiB0aGlzfSwkY29udGFpbmVyOmZ1bmN0
PQppb24oKXtyZXR1cm4odGhpcy5maW5kQ29udGFpbmVyRm4pPyh0aGlzLmZpbmRDb250YWluZXJG
bi5jYWxsKHRoaXMpKToodGhpcy49CiRlbC5wYXJlbnQoKSl9LCRkYXRhc2V0c0xpc3Q6ZnVuY3Rp
b24oayl7cmV0dXJuKGt8fHRoaXMuJGVsKS5maW5kKCIuZGF0YXNldD0Kcy1saXN0Iil9LCRtZXNz
YWdlczpmdW5jdGlvbihrKXtyZXR1cm4oa3x8dGhpcy4kZWwpLmZpbmQoIi5tZXNzYWdlLWNvbnRh
aW5lPQpyIil9LCRlbXB0eU1lc3NhZ2U6ZnVuY3Rpb24oayl7cmV0dXJuKGt8fHRoaXMuJGVsKS5m
aW5kKCIuZW1wdHktaGlzdG9yeS1tZXM9CnNhZ2UiKX0scmVuZGVySGRhczpmdW5jdGlvbihsKXts
PTNEbHx8dGhpcy4kZWw7dmFyIGs9M0R0aGlzLG49M0R7fSxtPTNEdGhpcz0KLm1vZGVsLmhkYXMu
Z2V0VmlzaWJsZSh0aGlzLnN0b3JhZ2UuZ2V0KCJzaG93X2RlbGV0ZWQiKSx0aGlzLnN0b3JhZ2Uu
Z2V0KCJzPQpob3dfaGlkZGVuIiksdGhpcy5maWx0ZXJzKTt0aGlzLiRkYXRhc2V0c0xpc3QobCku
ZW1wdHkoKTtpZihtLmxlbmd0aCl7bS5lYWM9CmgoZnVuY3Rpb24ocCl7dmFyIG89M0RwLmdldCgi
aWQiKSxxPTNEay5fY3JlYXRlSGRhVmlldyhwKTtuW29dPTNEcTtpZihfLmNvbj0KdGFpbnMoay5z
ZWxlY3RlZEhkYUlkcyxvKSl7cS5zZWxlY3RlZD0zRHRydWV9ay5hdHRhY2hIZGFWaWV3KHEucmVu
ZGVyKCksbCl9PQopfXRoaXMuaGRhVmlld3M9M0RuO3RoaXMuX3JlbmRlckVtcHR5TXNnKGwpO3Jl
dHVybiB0aGlzLmhkYVZpZXdzfSxfY3JlYXRlSGQ9CmFWaWV3OmZ1bmN0aW9uKGwpe3ZhciBrPTNE
bC5nZXQoImlkIiksbT0zRG5ldyB0aGlzLkhEQVZpZXdDbGFzcyh7bW9kZWw6bCxsaT0KbmtUYXJn
ZXQ6dGhpcy5saW5rVGFyZ2V0LGV4cGFuZGVkOnRoaXMuc3RvcmFnZS5nZXQoImV4cGFuZGVkSGRh
cyIpW2tdLGhhc1VzPQplcjp0aGlzLm1vZGVsLm93bmVkQnlDdXJyVXNlcigpLGxvZ2dlcjp0aGlz
LmxvZ2dlcn0pO3RoaXMuX3NldFVwSGRhTGlzdGVuZXI9CnMobSk7cmV0dXJuIG19LF9zZXRVcEhk
YUxpc3RlbmVyczpmdW5jdGlvbihsKXt2YXIgaz0zRHRoaXM7bC5vbigiZXJyb3IiLGZ1bj0KY3Rp
b24obixwLG0sbyl7ay5lcnJvckhhbmRsZXIobixwLG0sbyl9KTtsLm9uKCJib2R5LWV4cGFuZGVk
IixmdW5jdGlvbihtKXtrPQouc3RvcmFnZS5hZGRFeHBhbmRlZEhkYShtKX0pO2wub24oImJvZHkt
Y29sbGFwc2VkIixmdW5jdGlvbihtKXtrLnN0b3JhZ2UucmU9Cm1vdmVFeHBhbmRlZEhkYShtKX0p
O3JldHVybiB0aGlzfSxhdHRhY2hIZGFWaWV3OmZ1bmN0aW9uKG0sbCl7bD0zRGx8fHRoaXMuJD0K
ZWw7dmFyIGs9M0R0aGlzLiRkYXRhc2V0c0xpc3QobCk7ay5wcmVwZW5kKG0uJGVsKTtyZXR1cm4g
dGhpc30sYWRkSGRhVmlldzpmPQp1bmN0aW9uKG4pe3RoaXMubG9nKCJhZGQuIit0aGlzLG4pO3Zh
ciBsPTNEdGhpcztpZighbi5pc1Zpc2libGUodGhpcy5zdG9yYWc9CmUuZ2V0KCJzaG93X2RlbGV0
ZWQiKSx0aGlzLnN0b3JhZ2UuZ2V0KCJzaG93X2hpZGRlbiIpKSl7cmV0dXJuIGx9JCh7fSkucXVl
dT0KZShbZnVuY3Rpb24gbShwKXt2YXIgbz0zRGwuJGVtcHR5TWVzc2FnZSgpO2lmKG8uaXMoIjp2
aXNpYmxlIikpe28uZmFkZU91dChsPQouZnhTcGVlZCxwKX1lbHNle3AoKX19LGZ1bmN0aW9uIGso
byl7dmFyIHA9M0RsLl9jcmVhdGVIZGFWaWV3KG4pO2wuaGRhVmlld3M9CltuLmlkXT0zRHA7cC5y
ZW5kZXIoKS4kZWwuaGlkZSgpO2wuc2Nyb2xsVG9Ub3AoKTtsLmF0dGFjaEhkYVZpZXcocCk7cC4k
ZWwucz0KbGlkZURvd24obC5meFNwZWVkKX1dKTtyZXR1cm4gbH0scmVmcmVzaEhkYXM6ZnVuY3Rp
b24obCxrKXtpZih0aGlzLm1vZGVsKXtyPQpldHVybiB0aGlzLm1vZGVsLnJlZnJlc2gobCxrKX1y
ZXR1cm4gJC53aGVuKCl9LGV2ZW50czp7ImNsaWNrIC5tZXNzYWdlLWNvbnQ9CmFpbmVyIjoiY2xl
YXJNZXNzYWdlcyIsImNsaWNrIC5oaXN0b3J5LXNlYXJjaC1idG4iOiJ0b2dnbGVTZWFyY2hDb250
cm9scyJ9LD0KY29sbGFwc2VBbGxIZGFCb2RpZXM6ZnVuY3Rpb24oKXtfLmVhY2godGhpcy5oZGFW
aWV3cyxmdW5jdGlvbihrKXtrLnRvZ2dsZUJvPQpkeVZpc2liaWxpdHkobnVsbCxmYWxzZSl9KTt0
aGlzLnN0b3JhZ2Uuc2V0KCJleHBhbmRlZEhkYXMiLHt9KTtyZXR1cm4gdGhpc309Cix0b2dnbGVT
aG93RGVsZXRlZDpmdW5jdGlvbihrKXtrPTNEKGshPTNEPTNEdW5kZWZpbmVkKT8oayk6KCF0aGlz
LnN0b3JhZ2UuZz0KZXQoInNob3dfZGVsZXRlZCIpKTt0aGlzLnN0b3JhZ2Uuc2V0KCJzaG93X2Rl
bGV0ZWQiLGspO3RoaXMucmVuZGVySGRhcygpO3JlPQp0dXJuIHRoaXMuc3RvcmFnZS5nZXQoInNo
b3dfZGVsZXRlZCIpfSx0b2dnbGVTaG93SGlkZGVuOmZ1bmN0aW9uKGspe2s9M0QoayE9Cj0zRD0z
RHVuZGVmaW5lZCk/KGspOighdGhpcy5zdG9yYWdlLmdldCgic2hvd19oaWRkZW4iKSk7dGhpcy5z
dG9yYWdlLnNldCgicz0KaG93X2hpZGRlbiIsayk7dGhpcy5yZW5kZXJIZGFzKCk7cmV0dXJuIHRo
aXMuc3RvcmFnZS5nZXQoInNob3dfaGlkZGVuIil9LF9zPQpldFVwU2VhcmNoSW5wdXQ6ZnVuY3Rp
b24obCl7dmFyIG09M0R0aGlzLG49M0QiLmhpc3Rvcnktc2VhcmNoLWlucHV0IjtmdW5jdGk9Cm9u
IGsobyl7aWYobS5tb2RlbC5oZGFzLmhhdmVEZXRhaWxzKCkpe20uc2VhcmNoSGRhcyhvKTtyZXR1
cm59bS4kZWwuZmluZChuKT0KLnNlYXJjaElucHV0KCJ0b2dnbGUtbG9hZGluZyIpO20ubW9kZWwu
aGRhcy5mZXRjaEFsbERldGFpbHMoe3NpbGVudDp0cnVlfSkuPQphbHdheXMoZnVuY3Rpb24oKXtt
LiRlbC5maW5kKG4pLnNlYXJjaElucHV0KCJ0b2dnbGUtbG9hZGluZyIpfSkuZG9uZShmdW5jdGk9
Cm9uKCl7bS5zZWFyY2hIZGFzKG8pfSl9bC5zZWFyY2hJbnB1dCh7aW5pdGlhbFZhbDptLnNlYXJj
aEZvcixuYW1lOiJoaXN0b3J5LT0Kc2VhcmNoIixwbGFjZWhvbGRlcjoic2VhcmNoIGRhdGFzZXRz
IixjbGFzc2VzOiJoaXN0b3J5LXNlYXJjaCIsb25maXJzdHNlYXJjPQpoOmssb25zZWFyY2g6Xy5i
aW5kKHRoaXMuc2VhcmNoSGRhcyx0aGlzKSxvbmNsZWFyOl8uYmluZCh0aGlzLmNsZWFySGRhU2Vh
cmM9CmgsdGhpcyl9KTtyZXR1cm4gbH0sdG9nZ2xlU2VhcmNoQ29udHJvbHM6ZnVuY3Rpb24obSxr
KXt2YXIgbD0zRHRoaXMuJGVsLmZpbj0KZCgiLmhpc3Rvcnktc2VhcmNoLWNvbnRyb2xzIiksbj0z
RChqUXVlcnkudHlwZShtKT0zRD0zRD0zRCJudW1iZXIiKT8obSk6KHRoPQppcy5meFNwZWVkKTtr
PTNEKGshPTNEPTNEdW5kZWZpbmVkKT8oayk6KCFsLmlzKCI6dmlzaWJsZSIpKTtpZihrKXtsLnNs
aWRlRG89CnduKG4sZnVuY3Rpb24oKXskKHRoaXMpLmZpbmQoImlucHV0IikuZm9jdXMoKX0pfWVs
c2V7bC5zbGlkZVVwKG4pfXJldHVybiBrfT0KLHNlYXJjaEhkYXM6ZnVuY3Rpb24oayl7dmFyIGw9
M0R0aGlzO3RoaXMuc2VhcmNoRm9yPTNEazt0aGlzLmZpbHRlcnM9M0RbZnVuPQpjdGlvbihtKXty
ZXR1cm4gbS5tYXRjaGVzQWxsKGwuc2VhcmNoRm9yKX1dO3RoaXMudHJpZ2dlcigic2VhcmNoOnNl
YXJjaGluZyI9CixrLHRoaXMpO3RoaXMucmVuZGVySGRhcygpO3JldHVybiB0aGlzfSxjbGVhckhk
YVNlYXJjaDpmdW5jdGlvbihrKXt0aGlzLnNlYT0KcmNoRm9yPTNEIiI7dGhpcy5maWx0ZXJzPTNE
W107dGhpcy50cmlnZ2VyKCJzZWFyY2g6Y2xlYXIiLHRoaXMpO3RoaXMucmVuZGVyPQpIZGFzKCk7
cmV0dXJuIHRoaXN9LF9zaG93TG9hZGluZ0luZGljYXRvcjpmdW5jdGlvbihsLGssbSl7az0zRChr
IT0zRD0zRHVuZGU9CmZpbmVkKT8oayk6KHRoaXMuZnhTcGVlZCk7aWYoIXRoaXMuaW5kaWNhdG9y
KXt0aGlzLmluZGljYXRvcj0zRG5ldyBMb2FkaW5nST0KbmRpY2F0b3IodGhpcy4kZWwsdGhpcy4k
ZWwucGFyZW50KCkpfWlmKCF0aGlzLiRlbC5pcygiOnZpc2libGUiKSl7dGhpcy5pbmRpPQpjYXRv
ci5zaG93KDAsbSl9ZWxzZXt0aGlzLiRlbC5mYWRlT3V0KGspO3RoaXMuaW5kaWNhdG9yLnNob3co
bCxrLG0pfX0sX2hpZGU9CkxvYWRpbmdJbmRpY2F0b3I6ZnVuY3Rpb24oayxsKXtrPTNEKGshPTNE
PTNEdW5kZWZpbmVkKT8oayk6KHRoaXMuZnhTcGVlZCk7aT0KZih0aGlzLmluZGljYXRvcil7dGhp
cy5pbmRpY2F0b3IuaGlkZShrLGwpfX0sZGlzcGxheU1lc3NhZ2U6ZnVuY3Rpb24ocCxxLG8pPQp7
dmFyIG09M0R0aGlzO3RoaXMuc2Nyb2xsVG9Ub3AoKTt2YXIgbj0zRHRoaXMuJG1lc3NhZ2VzKCks
az0zRCQoIjxkaXYvPiIpLmE9CmRkQ2xhc3MocCsibWVzc2FnZSIpLmh0bWwocSk7aWYoIV8uaXNF
bXB0eShvKSl7dmFyIGw9M0QkKCc8YSBocmVmPTNEImphdmFzYz0KcmlwdDp2b2lkKDApIj5EZXRh
aWxzPC9hPicpLmNsaWNrKGZ1bmN0aW9uKCl7R2FsYXh5Lm1vZGFsLnNob3cobS5fbWVzc2FnZVRv
PQpNb2RhbE9wdGlvbnMocCxxLG8pKTtyZXR1cm4gZmFsc2V9KTtrLmFwcGVuZCgiICIsbCl9cmV0
dXJuIG4uaHRtbChrKX0sX21lc3M9CmFnZVRvTW9kYWxPcHRpb25zOmZ1bmN0aW9uKG8scSxuKXt2
YXIgaz0zRHRoaXMscD0zRCQoIjxkaXYvPiIpLG09M0R7dGl0bGU6Ij0KRGV0YWlscyJ9O2Z1bmN0
aW9uIGwocil7cj0zRF8ub21pdChyLF8uZnVuY3Rpb25zKHIpKTtyZXR1cm5bIjx0YWJsZT4iLF8u
bWFwPQoocixmdW5jdGlvbih0LHMpe3Q9M0QoXy5pc09iamVjdCh0KSk/KGwodCkpOih0KTtyZXR1
cm4nPHRyPjx0ZCBzdHlsZT0zRCJ2ZXI9CnRpY2FsLWFsaWduOiB0b3A7IGNvbG9yOiBncmV5Ij4n
K3MrJzwvdGQ+PHRkIHN0eWxlPTNEInBhZGRpbmctbGVmdDogOHB4Ij4nKz0KdCsiPC90ZD48L3Ry
PiJ9KS5qb2luKCIiKSwiPC90YWJsZT4iXS5qb2luKCIiKX1pZihfLmlzT2JqZWN0KG4pKXttLmJv
ZHk9M0RwPQouYXBwZW5kKGwobikpfWVsc2V7bS5ib2R5PTNEcC5odG1sKG4pfW0uYnV0dG9ucz0z
RHtPazpmdW5jdGlvbigpe0dhbGF4eS5tb2Q9CmFsLmhpZGUoKTtrLmNsZWFyTWVzc2FnZXMoKX19
O3JldHVybiBtfSxjbGVhck1lc3NhZ2VzOmZ1bmN0aW9uKCl7dGhpcy4kbWVzcz0KYWdlcygpLmVt
cHR5KCk7cmV0dXJuIHRoaXN9LHNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMu
JGNvbnRhaW5lPQpyKCkuc2Nyb2xsVG9wKCl9LHNjcm9sbFRvOmZ1bmN0aW9uKGspe3RoaXMuJGNv
bnRhaW5lcigpLnNjcm9sbFRvcChrKTtyZXR1cm49CiB0aGlzfSxzY3JvbGxUb1RvcDpmdW5jdGlv
bigpe3RoaXMuJGNvbnRhaW5lcigpLnNjcm9sbFRvcCgwKTtyZXR1cm4gdGhpc30scz0KY3JvbGxU
b0lkOmZ1bmN0aW9uKGwpe2lmKCghbCl8fCghdGhpcy5oZGFWaWV3c1tsXSkpe3JldHVybiB0aGlz
fXZhciBrPTNEdGhpPQpzLmhkYVZpZXdzW2xdO3RoaXMuc2Nyb2xsVG8oay5lbC5vZmZzZXRUb3Ap
O3JldHVybiB0aGlzfSxzY3JvbGxUb0hpZDpmdW5jdGk9Cm9uKGspe3ZhciBsPTNEdGhpcy5tb2Rl
bC5oZGFzLmdldEJ5SGlkKGspO2lmKCFsKXtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5zYz0Kcm9s
bFRvSWQobC5pZCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIlJlYWRPbmx5SGlzdG9yeVBh
bmVsKCIrKCh0aGlzLm1vPQpkZWwpPyh0aGlzLm1vZGVsLmdldCgibmFtZSIpKTooIiIpKSsiKSJ9
fSk7dmFyIGo9M0RbJzxkaXYgY2xhc3M9M0QiaGlzdG9yeS09CmNvbnRyb2xzIj4nLCc8ZGl2IGNs
YXNzPTNEImhpc3Rvcnktc2VhcmNoLWNvbnRyb2xzIj4nLCc8ZGl2IGNsYXNzPTNEImhpc3Rvcj0K
eS1zZWFyY2gtaW5wdXQiPjwvZGl2PicsIjwvZGl2PiIsJzxkaXYgY2xhc3M9M0QiaGlzdG9yeS10
aXRsZSI+JywiPCUgaWYoIGhpPQpzdG9yeS5uYW1lICl7ICU+IiwnPGRpdiBjbGFzcz0zRCJoaXN0
b3J5LW5hbWUiPjwlPTNEIGhpc3RvcnkubmFtZSAlPjwvZGl2Pic9CiwiPCUgfSAlPiIsIjwvZGl2
PiIsJzxkaXYgY2xhc3M9M0QiaGlzdG9yeS1zdWJ0aXRsZSBjbGVhciI+JywiPCUgaWYoIGhpc3Rv
cj0KeS5uaWNlX3NpemUgKXsgJT4iLCc8ZGl2IGNsYXNzPTNEImhpc3Rvcnktc2l6ZSI+PCU9M0Qg
aGlzdG9yeS5uaWNlX3NpemUgJT48PQovZGl2PicsIjwlIH0gJT4iLCc8ZGl2IGNsYXNzPTNEImhp
c3Rvcnktc2Vjb25kYXJ5LWFjdGlvbnMiPjwvZGl2PicsIjwvZGl2PiI9CiwiPCUgaWYoIGhpc3Rv
cnkuZGVsZXRlZCApeyAlPiIsJzxkaXYgY2xhc3M9M0Qid2FybmluZ21lc3NhZ2VzbWFsbCI+PHN0
cm9uZz0KPicsX2woIllvdSBhcmUgY3VycmVudGx5IHZpZXdpbmcgYSBkZWxldGVkIGhpc3Rvcnkh
IiksIjwvc3Ryb25nPjwvZGl2PiIsIjwlPQogfSAlPiIsJzxkaXYgY2xhc3M9M0QibWVzc2FnZS1j
b250YWluZXIiPicsIjwlIGlmKCBoaXN0b3J5Lm1lc3NhZ2UgKXsgJT4iLCc9CjxkaXYgY2xhc3M9
M0QiPCU9M0QgaGlzdG9yeS5zdGF0dXMgJT5tZXNzYWdlIj48JT0zRCBoaXN0b3J5Lm1lc3NhZ2Ug
JT48L2Rpdj0KPicsIjwlIH0gJT4iLCI8L2Rpdj4iLCc8ZGl2IGNsYXNzPTNEInF1b3RhLW1lc3Nh
Z2UgZXJyb3JtZXNzYWdlIj4nLF9sKCJZb3UgPQphcmUgb3ZlciB5b3VyIGRpc2sgcXVvdGEuIiks
X2woIlRvb2wgZXhlY3V0aW9uIGlzIG9uIGhvbGQgdW50aWwgeW91ciBkaXNrIHU9CnNhZ2UgZHJv
cHMgYmVsb3cgeW91ciBhbGxvY2F0ZWQgcXVvdGEuIiksIjwvZGl2PiIsJzxkaXYgY2xhc3M9M0Qi
dGFncy1kaXNwbD0KYXkiPjwvZGl2PicsJzxkaXYgY2xhc3M9M0QiYW5ub3RhdGlvbi1kaXNwbGF5
Ij48L2Rpdj4nLCc8ZGl2IGNsYXNzPTNEImhpc3RvPQpyeS1kYXRhc2V0LWFjdGlvbnMiPicsJzxk
aXYgY2xhc3M9M0QiYnRuLWdyb3VwIj4nLCc8YnV0dG9uIGNsYXNzPTNEImhpc3Rvcnk9Ci1zZWxl
Y3QtYWxsLWRhdGFzZXRzLWJ0biBidG4gYnRuLWRlZmF1bHQiJywnZGF0YS1tb2RlPTNEInNlbGVj
dCI+JyxfbCgiQWxsIj0KKSwiPC9idXR0b24+IiwnPGJ1dHRvbiBjbGFzcz0zRCJoaXN0b3J5LWRl
c2VsZWN0LWFsbC1kYXRhc2V0cy1idG4gYnRuIGJ0bi1kPQplZmF1bHQiJywnZGF0YS1tb2RlPTNE
InNlbGVjdCI+JyxfbCgiTm9uZSIpLCI8L2J1dHRvbj4iLCI8L2Rpdj4iLCc8YnV0dG9uIGM9Cmxh
c3M9M0QiaGlzdG9yeS1kYXRhc2V0LWFjdGlvbi1wb3B1cC1idG4gYnRuIGJ0bi1kZWZhdWx0Ij4n
LF9sKCJGb3IgYWxsIHNlbD0KZWN0ZWQiKSwiLi4uPC9idXR0b24+IiwiPC9kaXY+IiwiPC9kaXY+
IiwnPGRpdiBjbGFzcz0zRCJkYXRhc2V0cy1saXN0Ij48L2RpPQp2PicsJzxkaXYgY2xhc3M9M0Qi
ZW1wdHktaGlzdG9yeS1tZXNzYWdlIGluZm9tZXNzYWdlc21hbGwiPicsX2woIllvdXIgaGlzdG89
CnJ5IGlzIGVtcHR5LiBDbGljayAnR2V0IERhdGEnIG9uIHRoZSBsZWZ0IHBhbmUgdG8gc3RhcnQi
KSwiPC9kaXY+Il0uam9pbigiIj0KKTtpLnRlbXBsYXRlcz0zRHtoaXN0b3J5UGFuZWw6ZnVuY3Rp
b24oayl7cmV0dXJuIF8udGVtcGxhdGUoaixrLHt2YXJpYWJsZToiPQpoaXN0b3J5In0pfX07cmV0
dXJue1JlYWRPbmx5SGlzdG9yeVBhbmVsOml9fSk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmls
ZQorZGVmaW5lKFsibXZjL2hpc3RvcnkvaGlzdG9yeS1tb2RlbCIsIm12Yy9kYXRhc2V0L2hkYS1i
YXNlIiwibXZjL3VzZXIvdXNlci09Cm1vZGVsIiwibXZjL2Jhc2UtbXZjIiwidXRpbHMvbG9jYWxp
emF0aW9uIl0sZnVuY3Rpb24oZyxiLGEsZixkKXt2YXIgaT0zRGYuUz0KZXNzaW9uU3RvcmFnZU1v
ZGVsLmV4dGVuZCh7ZGVmYXVsdHM6e2V4cGFuZGVkSGRhczp7fSxzaG93X2RlbGV0ZWQ6ZmFsc2Us
c2hvPQp3X2hpZGRlbjpmYWxzZX0sYWRkRXhwYW5kZWRIZGE6ZnVuY3Rpb24obSl7dmFyIGw9M0Qi
ZXhwYW5kZWRIZGFzIjt0aGlzLnNhdmU9CihsLF8uZXh0ZW5kKHRoaXMuZ2V0KGwpLF8ub2JqZWN0
KFttXSxbdHJ1ZV0pKSl9LHJlbW92ZUV4cGFuZGVkSGRhOmZ1bmN0aW9uKD0KbSl7dmFyIGw9M0Qi
ZXhwYW5kZWRIZGFzIjt0aGlzLnNhdmUobCxfLm9taXQodGhpcy5nZXQobCksbSkpfSx0b1N0cmlu
ZzpmdW5jPQp0aW9uKCl7cmV0dXJuIkhpc3RvcnlQcmVmcygiK3RoaXMuaWQrIikifX0pO2kuc3Rv
cmFnZUtleVByZWZpeD0zRCJoaXN0b3J5OiI9CjtpLmhpc3RvcnlTdG9yYWdlS2V5PTNEZnVuY3Rp
b24gZShsKXtpZighbCl7dGhyb3cgbmV3IEVycm9yKCJIaXN0b3J5UHJlZnMuaD0KaXN0b3J5U3Rv
cmFnZUtleSBuZWVkcyB2YWxpZCBpZDogIitsKX1yZXR1cm4oaS5zdG9yYWdlS2V5UHJlZml4K2wp
fTtpLmdldD0KPTNEZnVuY3Rpb24gYyhsKXtyZXR1cm4gbmV3IGkoe2lkOmkuaGlzdG9yeVN0b3Jh
Z2VLZXkobCl9KX07aS5jbGVhckFsbD0zRGZ1PQpuY3Rpb24gaChtKXtmb3IodmFyIGwgaW4gc2Vz
c2lvblN0b3JhZ2Upe2lmKGwuaW5kZXhPZihpLnN0b3JhZ2VLZXlQcmVmaXgpPQo9M0Q9M0Q9M0Qw
KXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGwpfX19O3ZhciBqPTNEQmFja2JvbmUuVmlldy5l
eHRlbmQoZi49CkxvZ2dhYmxlTWl4aW4pLmV4dGVuZCh7SERBVmlld0NsYXNzOmIuSERBQmFzZVZp
ZXcsdGFnTmFtZToiZGl2IixjbGFzc05hbWU6Ij0KaGlzdG9yeS1wYW5lbCIsZnhTcGVlZDoiZmFz
dCIsZW1wdHlNc2c6ZCgiVGhpcyBoaXN0b3J5IGlzIGVtcHR5Iiksbm9uZUZvdW5kPQpNc2c6ZCgi
Tm8gbWF0Y2hpbmcgZGF0YXNldHMgZm91bmQiKSxpbml0aWFsaXplOmZ1bmN0aW9uKGwpe2w9M0Rs
fHx7fTtpZihsLmw9Cm9nZ2VyKXt0aGlzLmxvZ2dlcj0zRGwubG9nZ2VyfXRoaXMubG9nKHRoaXMr
Ii5pbml0aWFsaXplOiIsbCk7dGhpcy5saW5rVGFyZz0KZXQ9M0RsLmxpbmtUYXJnZXR8fCJfYmxh
bmsiO3RoaXMuZnhTcGVlZD0zRF8uaGFzKGwsImZ4U3BlZWQiKT8obC5meFNwZWVkKTooPQp0aGlz
LmZ4U3BlZWQpO3RoaXMuZmlsdGVycz0zRFtdO3RoaXMuc2VhcmNoRm9yPTNEIiI7dGhpcy5maW5k
Q29udGFpbmVyRm49M0Q9CmwuZmluZENvbnRhaW5lckZuO3RoaXMuaGRhVmlld3M9M0R7fTt0aGlz
LmluZGljYXRvcj0zRG5ldyBMb2FkaW5nSW5kaWNhdG9yKD0KdGhpcy4kZWwpO3RoaXMuX3NldFVw
TGlzdGVuZXJzKCk7dmFyIG09M0RfLnBpY2sobCwiaW5pdGlhbGx5RXhwYW5kZWQiLCJzaG93PQpf
ZGVsZXRlZCIsInNob3dfaGlkZGVuIik7dGhpcy5zZXRNb2RlbCh0aGlzLm1vZGVsLG0sZmFsc2Up
O2lmKGwub25yZWFkeSl7bC49Cm9ucmVhZHkuY2FsbCh0aGlzKX19LF9zZXRVcExpc3RlbmVyczpm
dW5jdGlvbigpe3RoaXMub24oImVycm9yIixmdW5jdGlvbihtLD0KcCxsLG8sbil7dGhpcy5lcnJv
ckhhbmRsZXIobSxwLGwsbyxuKX0pO3RoaXMub24oImxvYWRpbmctaGlzdG9yeSIsZnVuY3Rpb24o
PQope3RoaXMuX3Nob3dMb2FkaW5nSW5kaWNhdG9yKCJsb2FkaW5nIGhpc3RvcnkuLi4iLDQwKX0p
O3RoaXMub24oImxvYWRpbmctZG89Cm5lIixmdW5jdGlvbigpe3RoaXMuX2hpZGVMb2FkaW5nSW5k
aWNhdG9yKDQwKTtpZihfLmlzRW1wdHkodGhpcy5oZGFWaWV3cykpez0KdGhpcy50cmlnZ2VyKCJl
bXB0eS1oaXN0b3J5Iix0aGlzKX19KTt0aGlzLm9uY2UoInJlbmRlcmVkIixmdW5jdGlvbigpe3Ro
aXMuPQp0cmlnZ2VyKCJyZW5kZXJlZDppbml0aWFsIix0aGlzKTtyZXR1cm4gZmFsc2V9KTtpZih0
aGlzLmxvZ2dlcil7dGhpcy5vbigiYWw9CmwiLGZ1bmN0aW9uKGwpe3RoaXMubG9nKHRoaXMrIiIs
YXJndW1lbnRzKX0sdGhpcyl9cmV0dXJuIHRoaXN9LGVycm9ySGFuZGxlcj0KOmZ1bmN0aW9uKG4s
cSxtLHAsbyl7Y29uc29sZS5lcnJvcihuLHEsbSxwLG8pO2lmKHEmJnEuc3RhdHVzPTNEPTNEPTNE
MCYmcS5yPQplYWR5U3RhdGU9M0Q9M0Q9M0QwKXt9ZWxzZXtpZihxJiZxLnN0YXR1cz0zRD0zRD0z
RDUwMil7fWVsc2V7dmFyIGw9M0R0aGlzLl89CnBhcnNlRXJyb3JNZXNzYWdlKG4scSxtLHAsbyk7
aWYoIXRoaXMuJG1lc3NhZ2VzKCkuaXMoIjp2aXNpYmxlIikpe3RoaXMub25jZT0KKCJyZW5kZXJl
ZCIsZnVuY3Rpb24oKXt0aGlzLmRpc3BsYXlNZXNzYWdlKCJlcnJvciIsbC5tZXNzYWdlLGwuZGV0
YWlscyl9KX1lPQpsc2V7dGhpcy5kaXNwbGF5TWVzc2FnZSgiZXJyb3IiLGwubWVzc2FnZSxsLmRl
dGFpbHMpfX19fSxfcGFyc2VFcnJvck1lc3NhZ2U9CjpmdW5jdGlvbihvLHMsbixyLHEpe3ZhciBt
PTNER2FsYXh5LmN1cnJVc2VyLGw9M0R7bWVzc2FnZTp0aGlzLl9iZVBvbGl0ZShyKT0KLGRldGFp
bHM6e3VzZXI6KG0gaW5zdGFuY2VvZiBhLlVzZXIpPyhtLnRvSlNPTigpKToobSsiIiksc291cmNl
OihvIGluc3RhbmNlPQpvZiBCYWNrYm9uZS5Nb2RlbCk/KG8udG9KU09OKCkpOihvKyIiKSx4aHI6
cyxvcHRpb25zOihzKT8oXy5vbWl0KG4sInhociIpKTo9CihuKX19O18uZXh0ZW5kKGwuZGV0YWls
cyxxfHx7fSk7aWYocyYmXy5pc0Z1bmN0aW9uKHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKT0KKXt2
YXIgcD0zRHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7cD0zRF8uY29tcGFjdChwLnNwbGl0KCJc
biIpKTtwPTNEXy5tYXAoPQpwLGZ1bmN0aW9uKHQpe3JldHVybiB0LnNwbGl0KCI6ICIpfSk7bC5k
ZXRhaWxzLnhoci5yZXNwb25zZUhlYWRlcnM9M0RfLm9iamU9CmN0KHApfXJldHVybiBsfSxfYmVQ
b2xpdGU6ZnVuY3Rpb24obCl7bD0zRGx8fGQoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGdldD0K
dGluZyB1cGRhdGVzIGZyb20gdGhlIHNlcnZlciIpO3JldHVybiBsKyIuICIrZCgiUGxlYXNlIGNv
bnRhY3QgYSBHYWxheHkgYWRtPQppbmlzdHJhdG9yIGlmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLiIp
fSxsb2FkSGlzdG9yeVdpdGhIREFEZXRhaWxzOmZ1bmN0aW9uKG49CixtLGwscCl7dmFyIG89M0Rm
dW5jdGlvbihxKXtyZXR1cm4gXy5rZXlzKGkuZ2V0KHEuaWQpLmdldCgiZXhwYW5kZWRIZGFzIikp
fT0KO3JldHVybiB0aGlzLmxvYWRIaXN0b3J5KG4sbSxsLHAsbyl9LGxvYWRIaXN0b3J5OmZ1bmN0
aW9uKG8sbixtLHIscCl7dmFyIGw9Cj0zRHRoaXM7bj0zRG58fHt9O2wudHJpZ2dlcigibG9hZGlu
Zy1oaXN0b3J5IixsKTt2YXIgcT0zRGcuSGlzdG9yeS5nZXRIaXN0bz0KcnlEYXRhKG8se2hpc3Rv
cnlGbjptLGhkYUZuOnIsaGRhRGV0YWlsSWRzOm4uaW5pdGlhbGx5RXhwYW5kZWR8fHB9KTtyZXR1
cm4gPQpsLl9sb2FkSGlzdG9yeUZyb21YSFIocSxuKS5mYWlsKGZ1bmN0aW9uKHUscyx0KXtsLnRy
aWdnZXIoImVycm9yIixsLHUsbixkKCI9CkFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSAi
K3MpLHtoaXN0b3J5SWQ6byxoaXN0b3J5OnR8fHt9fSl9KS5hbHdheXMoZj0KdW5jdGlvbigpe2wu
dHJpZ2dlcigibG9hZGluZy1kb25lIixsKX0pfSxfbG9hZEhpc3RvcnlGcm9tWEhSOmZ1bmN0aW9u
KG4sbSl7PQp2YXIgbD0zRHRoaXM7bi50aGVuKGZ1bmN0aW9uKG8scCl7bC5KU09OVG9Nb2RlbChv
LHAsbSl9KTtuLmZhaWwoZnVuY3Rpb24ocCw9Cm8pe2wucmVuZGVyKCl9KTtyZXR1cm4gbn0sSlNP
TlRvTW9kZWw6ZnVuY3Rpb24obyxsLG0pe3RoaXMubG9nKCJKU09OVG9Nb2RlbD0KOiIsbyxsLG0p
O209M0RtfHx7fTt2YXIgbj0zRG5ldyBnLkhpc3RvcnkobyxsLG0pO3RoaXMuc2V0TW9kZWwobik7
cmV0dXJuIHRoPQppc30sc2V0TW9kZWw6ZnVuY3Rpb24obSxsLG4pe2w9M0RsfHx7fTtuPTNEKG4h
PTNEPTNEdW5kZWZpbmVkKT8obik6KHRydWUpO3Q9Cmhpcy5sb2coInNldE1vZGVsOiIsbSxsLG4p
O3RoaXMuZnJlZU1vZGVsKCk7dGhpcy5zZWxlY3RlZEhkYUlkcz0zRFtdO2lmKG0pez0KdGhpcy5t
b2RlbD0zRG07aWYodGhpcy5sb2dnZXIpe3RoaXMubW9kZWwubG9nZ2VyPTNEdGhpcy5sb2dnZXJ9
dGhpcy5fc2V0VXBXPQplYlN0b3JhZ2UobC5pbml0aWFsbHlFeHBhbmRlZCxsLnNob3dfZGVsZXRl
ZCxsLnNob3dfaGlkZGVuKTt0aGlzLl9zZXRVcE1vZGU9CmxFdmVudEhhbmRsZXJzKCk7dGhpcy50
cmlnZ2VyKCJuZXctbW9kZWwiLHRoaXMpfWlmKG4pe3RoaXMucmVuZGVyKCl9cmV0dXJuID0KdGhp
c30sZnJlZU1vZGVsOmZ1bmN0aW9uKCl7aWYodGhpcy5tb2RlbCl7dGhpcy5tb2RlbC5jbGVhclVw
ZGF0ZVRpbWVvdXQoKTt0PQpoaXMuc3RvcExpc3RlbmluZyh0aGlzLm1vZGVsKTt0aGlzLnN0b3BM
aXN0ZW5pbmcodGhpcy5tb2RlbC5oZGFzKX10aGlzLmZyZWU9CkhkYVZpZXdzKCk7cmV0dXJuIHRo
aXN9LGZyZWVIZGFWaWV3czpmdW5jdGlvbigpe3RoaXMuaGRhVmlld3M9M0R7fTtyZXR1cm4gdD0K
aGlzfSxfc2V0VXBXZWJTdG9yYWdlOmZ1bmN0aW9uKG0sbCxuKXt0aGlzLnN0b3JhZ2U9M0RuZXcg
aSh7aWQ6aS5oaXN0b3J5U3RvPQpyYWdlS2V5KHRoaXMubW9kZWwuZ2V0KCJpZCIpKX0pO2lmKF8u
aXNPYmplY3QobSkpe3RoaXMuc3RvcmFnZS5zZXQoImV4YW5kZWQ9CkhkYXMiLG0pfWlmKF8uaXNC
b29sZWFuKGwpKXt0aGlzLnN0b3JhZ2Uuc2V0KCJzaG93X2RlbGV0ZWQiLGwpfWlmKF8uaXNCb29s
ZT0KYW4obikpe3RoaXMuc3RvcmFnZS5zZXQoInNob3dfaGlkZGVuIixuKX10aGlzLnRyaWdnZXIo
Im5ldy1zdG9yYWdlIix0aGlzLnN0PQpvcmFnZSx0aGlzKTt0aGlzLmxvZyh0aGlzKyIgKGluaXQn
ZCkgc3RvcmFnZToiLHRoaXMuc3RvcmFnZS5nZXQoKSk7cmV0dXJuIHQ9Cmhpc30sX3NldFVwTW9k
ZWxFdmVudEhhbmRsZXJzOmZ1bmN0aW9uKCl7dGhpcy5tb2RlbC5oZGFzLm9uKCJhZGQiLHRoaXMu
YWRkSD0KZGFWaWV3LHRoaXMpO3RoaXMubW9kZWwub24oImVycm9yIGVycm9yOmhkYXMiLGZ1bmN0
aW9uKG0sbyxsLG4pe3RoaXMuZXJyb3JIPQphbmRsZXIobSxvLGwsbil9LHRoaXMpO3JldHVybiB0
aGlzfSxyZW5kZXI6ZnVuY3Rpb24obixvKXt0aGlzLmxvZygicmVuZGVyOiI9CixuLG8pO249M0Qo
bj0zRD0zRD0zRHVuZGVmaW5lZCk/KHRoaXMuZnhTcGVlZCk6KG4pO3ZhciBsPTNEdGhpcyxtO2lm
KHRoaXMubT0Kb2RlbCl7bT0zRHRoaXMucmVuZGVyTW9kZWwoKX1lbHNle209M0R0aGlzLnJlbmRl
cldpdGhvdXRNb2RlbCgpfSQobCkucXVldWUoPQoiZngiLFtmdW5jdGlvbihwKXtpZihuJiZsLiRl
bC5pcygiOnZpc2libGUiKSl7bC4kZWwuZmFkZU91dChuLHApfWVsc2V7cCgpfX09CixmdW5jdGlv
bihwKXtsLiRlbC5lbXB0eSgpO2lmKG0pe2wuJGVsLmFwcGVuZChtLmNoaWxkcmVuKCkpfXAoKX0s
ZnVuY3Rpb24ocD0KKXtpZihuJiYhbC4kZWwuaXMoIjp2aXNpYmxlIikpe2wuJGVsLmZhZGVJbihu
LHApfWVsc2V7cCgpfX0sZnVuY3Rpb24ocCl7aWYoPQpvKXtvLmNhbGwodGhpcyl9bC50cmlnZ2Vy
KCJyZW5kZXJlZCIsdGhpcyk7cCgpfV0pO3JldHVybiB0aGlzfSxyZW5kZXJXaXRob3U9CnRNb2Rl
bDpmdW5jdGlvbigpe3ZhciBsPTNEJCgiPGRpdi8+IiksbT0zRCQoIjxkaXYvPiIpLmFkZENsYXNz
KCJtZXNzYWdlLWNvbj0KdGFpbmVyIikuY3NzKHttYXJnaW46IjRweCJ9KTtyZXR1cm4gbC5hcHBl
bmQobSl9LHJlbmRlck1vZGVsOmZ1bmN0aW9uKCl7dmFyPQogbD0zRCQoIjxkaXYvPiIpO2wuYXBw
ZW5kKGoudGVtcGxhdGVzLmhpc3RvcnlQYW5lbCh0aGlzLm1vZGVsLnRvSlNPTigpKSk7dGg9Cmlz
LiRlbXB0eU1lc3NhZ2UobCkudGV4dCh0aGlzLmVtcHR5TXNnKTtsLmZpbmQoIi5oaXN0b3J5LXNl
Y29uZGFyeS1hY3Rpb25zIj0KKS5wcmVwZW5kKHRoaXMuX3JlbmRlclNlYXJjaEJ1dHRvbigpKTt0
aGlzLl9zZXRVcEJlaGF2aW91cnMobCk7dGhpcy5yZW5kZXJIPQpkYXMobCk7cmV0dXJuIGx9LF9y
ZW5kZXJFbXB0eU1zZzpmdW5jdGlvbihuKXt2YXIgbT0zRHRoaXMsbD0zRG0uJGVtcHR5TWVzc2E9
CmdlKG4pO2lmKCFfLmlzRW1wdHkobS5oZGFWaWV3cykpe2wuaGlkZSgpfWVsc2V7aWYobS5zZWFy
Y2hGb3Ipe2wudGV4dChtLm5vbj0KZUZvdW5kTXNnKS5zaG93KCl9ZWxzZXtsLnRleHQobS5lbXB0
eU1zZykuc2hvdygpfX1yZXR1cm4gdGhpc30sX3JlbmRlclNlYXJjPQpoQnV0dG9uOmZ1bmN0aW9u
KGwpe3JldHVybiBmYUljb25CdXR0b24oe3RpdGxlOmQoIlNlYXJjaCBkYXRhc2V0cyIpLGNsYXNz
ZXM9CjoiaGlzdG9yeS1zZWFyY2gtYnRuIixmYUljb246ImZhLXNlYXJjaCJ9KX0sX3NldFVwQmVo
YXZpb3VyczpmdW5jdGlvbihsKXtsPQo9M0RsfHx0aGlzLiRlbDtsLmZpbmQoIlt0aXRsZV0iKS50
b29sdGlwKHtwbGFjZW1lbnQ6ImJvdHRvbSJ9KTt0aGlzLl9zZXRVcFM9CmVhcmNoSW5wdXQobC5m
aW5kKCIuaGlzdG9yeS1zZWFyY2gtY29udHJvbHMgLmhpc3Rvcnktc2VhcmNoLWlucHV0IikpO3Jl
dHVybj0KIHRoaXN9LCRjb250YWluZXI6ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5maW5kQ29udGFp
bmVyRm4pPyh0aGlzLmZpbmRDb250YWluPQplckZuLmNhbGwodGhpcykpOih0aGlzLiRlbC5wYXJl
bnQoKSl9LCRkYXRhc2V0c0xpc3Q6ZnVuY3Rpb24obCl7cmV0dXJuKGx8fHQ9Cmhpcy4kZWwpLmZp
bmQoIi5kYXRhc2V0cy1saXN0Iil9LCRtZXNzYWdlczpmdW5jdGlvbihsKXtyZXR1cm4obHx8dGhp
cy4kZWwpLj0KZmluZCgiLm1lc3NhZ2UtY29udGFpbmVyIil9LCRlbXB0eU1lc3NhZ2U6ZnVuY3Rp
b24obCl7cmV0dXJuKGx8fHRoaXMuJGVsKS5mPQppbmQoIi5lbXB0eS1oaXN0b3J5LW1lc3NhZ2Ui
KX0scmVuZGVySGRhczpmdW5jdGlvbihtKXttPTNEbXx8dGhpcy4kZWw7dmFyIGw9Cj0zRHRoaXMs
bz0zRHt9LG49M0R0aGlzLm1vZGVsLmhkYXMuZ2V0VmlzaWJsZSh0aGlzLnN0b3JhZ2UuZ2V0KCJz
aG93X2RlbGV0ZT0KZCIpLHRoaXMuc3RvcmFnZS5nZXQoInNob3dfaGlkZGVuIiksdGhpcy5maWx0
ZXJzKTt0aGlzLiRkYXRhc2V0c0xpc3QobSkuZW1wPQp0eSgpO2lmKG4ubGVuZ3RoKXtuLmVhY2go
ZnVuY3Rpb24ocSl7dmFyIHA9M0RxLmdldCgiaWQiKSxyPTNEbC5fY3JlYXRlSGRhVmk9CmV3KHEp
O29bcF09M0RyO2lmKF8uY29udGFpbnMobC5zZWxlY3RlZEhkYUlkcyxwKSl7ci5zZWxlY3RlZD0z
RHRydWV9bC5hdHRhYz0KaEhkYVZpZXcoci5yZW5kZXIoKSxtKX0pfXRoaXMuaGRhVmlld3M9M0Rv
O3RoaXMuX3JlbmRlckVtcHR5TXNnKG0pO3JldHVybiB0PQpoaXMuaGRhVmlld3N9LF9jcmVhdGVI
ZGFWaWV3OmZ1bmN0aW9uKG0pe3ZhciBsPTNEbS5nZXQoImlkIiksbj0zRG5ldyB0aGlzLkg9CkRB
Vmlld0NsYXNzKHttb2RlbDptLGxpbmtUYXJnZXQ6dGhpcy5saW5rVGFyZ2V0LGV4cGFuZGVkOnRo
aXMuc3RvcmFnZS5nZXQoIj0KZXhwYW5kZWRIZGFzIilbbF0saGFzVXNlcjp0aGlzLm1vZGVsLm93
bmVkQnlDdXJyVXNlcigpLGxvZ2dlcjp0aGlzLmxvZ2dlcn0pPQo7dGhpcy5fc2V0VXBIZGFMaXN0
ZW5lcnMobik7cmV0dXJuIG59LF9zZXRVcEhkYUxpc3RlbmVyczpmdW5jdGlvbihtKXt2YXIgbD0K
PTNEdGhpczttLm9uKCJlcnJvciIsZnVuY3Rpb24obyxxLG4scCl7bC5lcnJvckhhbmRsZXIobyxx
LG4scCl9KTttLm9uKCJib2R5PQotZXhwYW5kZWQiLGZ1bmN0aW9uKG4pe2wuc3RvcmFnZS5hZGRF
eHBhbmRlZEhkYShuKX0pO20ub24oImJvZHktY29sbGFwc2VkIiw9CmZ1bmN0aW9uKG4pe2wuc3Rv
cmFnZS5yZW1vdmVFeHBhbmRlZEhkYShuKX0pO3JldHVybiB0aGlzfSxhdHRhY2hIZGFWaWV3OmZ1
bj0KY3Rpb24obixtKXttPTNEbXx8dGhpcy4kZWw7dmFyIGw9M0R0aGlzLiRkYXRhc2V0c0xpc3Qo
bSk7bC5wcmVwZW5kKG4uJGVsKTtyPQpldHVybiB0aGlzfSxhZGRIZGFWaWV3OmZ1bmN0aW9uKG8p
e3RoaXMubG9nKCJhZGQuIit0aGlzLG8pO3ZhciBtPTNEdGhpcztpZig9CiFvLmlzVmlzaWJsZSh0
aGlzLnN0b3JhZ2UuZ2V0KCJzaG93X2RlbGV0ZWQiKSx0aGlzLnN0b3JhZ2UuZ2V0KCJzaG93X2hp
ZGRlbj0KIikpKXtyZXR1cm4gbX0kKHt9KS5xdWV1ZShbZnVuY3Rpb24gbihxKXt2YXIgcD0zRG0u
JGVtcHR5TWVzc2FnZSgpO2lmKHAuaXMoPQoiOnZpc2libGUiKSl7cC5mYWRlT3V0KG0uZnhTcGVl
ZCxxKX1lbHNle3EoKX19LGZ1bmN0aW9uIGwocCl7dmFyIHE9M0RtLl9jcmU9CmF0ZUhkYVZpZXco
byk7bS5oZGFWaWV3c1tvLmlkXT0zRHE7cS5yZW5kZXIoKS4kZWwuaGlkZSgpO20uc2Nyb2xsVG9U
b3AoKTttLj0KYXR0YWNoSGRhVmlldyhxKTtxLiRlbC5zbGlkZURvd24obS5meFNwZWVkKX1dKTty
ZXR1cm4gbX0scmVmcmVzaEhkYXM6ZnVuY3RpPQpvbihtLGwpe2lmKHRoaXMubW9kZWwpe3JldHVy
biB0aGlzLm1vZGVsLnJlZnJlc2gobSxsKX1yZXR1cm4gJC53aGVuKCl9LGV2ZW49CnRzOnsiY2xp
Y2sgLm1lc3NhZ2UtY29udGFpbmVyIjoiY2xlYXJNZXNzYWdlcyIsImNsaWNrIC5oaXN0b3J5LXNl
YXJjaC1idG4iOj0KInRvZ2dsZVNlYXJjaENvbnRyb2xzIn0sY29sbGFwc2VBbGxIZGFCb2RpZXM6
ZnVuY3Rpb24oKXtfLmVhY2godGhpcy5oZGFWaWV3PQpzLGZ1bmN0aW9uKGwpe2wudG9nZ2xlQm9k
eVZpc2liaWxpdHkobnVsbCxmYWxzZSl9KTt0aGlzLnN0b3JhZ2Uuc2V0KCJleHBhbmQ9CmVkSGRh
cyIse30pO3JldHVybiB0aGlzfSx0b2dnbGVTaG93RGVsZXRlZDpmdW5jdGlvbihsKXtsPTNEKGwh
PTNEPTNEdW5kZWZpbj0KZWQpPyhsKTooIXRoaXMuc3RvcmFnZS5nZXQoInNob3dfZGVsZXRlZCIp
KTt0aGlzLnN0b3JhZ2Uuc2V0KCJzaG93X2RlbGV0ZWQiPQosbCk7dGhpcy5yZW5kZXJIZGFzKCk7
cmV0dXJuIHRoaXMuc3RvcmFnZS5nZXQoInNob3dfZGVsZXRlZCIpfSx0b2dnbGVTaG93SGk9CmRk
ZW46ZnVuY3Rpb24obCl7bD0zRChsIT0zRD0zRHVuZGVmaW5lZCk/KGwpOighdGhpcy5zdG9yYWdl
LmdldCgic2hvd19oaWRkZT0KbiIpKTt0aGlzLnN0b3JhZ2Uuc2V0KCJzaG93X2hpZGRlbiIsbCk7
dGhpcy5yZW5kZXJIZGFzKCk7cmV0dXJuIHRoaXMuc3RvcmFnPQplLmdldCgic2hvd19oaWRkZW4i
KX0sX3NldFVwU2VhcmNoSW5wdXQ6ZnVuY3Rpb24obSl7dmFyIG49M0R0aGlzLG89M0QiLmhpc3Q9
Cm9yeS1zZWFyY2gtaW5wdXQiO2Z1bmN0aW9uIGwocCl7aWYobi5tb2RlbC5oZGFzLmhhdmVEZXRh
aWxzKCkpe24uc2VhcmNoSGRhcz0KKHApO3JldHVybn1uLiRlbC5maW5kKG8pLnNlYXJjaElucHV0
KCJ0b2dnbGUtbG9hZGluZyIpO24ubW9kZWwuaGRhcy5mZXRjaEFsPQpsRGV0YWlscyh7c2lsZW50
OnRydWV9KS5hbHdheXMoZnVuY3Rpb24oKXtuLiRlbC5maW5kKG8pLnNlYXJjaElucHV0KCJ0b2dn
bGU9Ci1sb2FkaW5nIil9KS5kb25lKGZ1bmN0aW9uKCl7bi5zZWFyY2hIZGFzKHApfSl9bS5zZWFy
Y2hJbnB1dCh7aW5pdGlhbFZhbDpuLj0Kc2VhcmNoRm9yLG5hbWU6Imhpc3Rvcnktc2VhcmNoIixw
bGFjZWhvbGRlcjoic2VhcmNoIGRhdGFzZXRzIixjbGFzc2VzOiJoaXN0PQpvcnktc2VhcmNoIixv
bmZpcnN0c2VhcmNoOmwsb25zZWFyY2g6Xy5iaW5kKHRoaXMuc2VhcmNoSGRhcyx0aGlzKSxvbmNs
ZWFyOl89Ci5iaW5kKHRoaXMuY2xlYXJIZGFTZWFyY2gsdGhpcyl9KTtyZXR1cm4gbX0sdG9nZ2xl
U2VhcmNoQ29udHJvbHM6ZnVuY3Rpb24obj0KLGwpe3ZhciBtPTNEdGhpcy4kZWwuZmluZCgiLmhp
c3Rvcnktc2VhcmNoLWNvbnRyb2xzIiksbz0zRChqUXVlcnkudHlwZShuKT0KPTNEPTNEPTNEIm51
bWJlciIpPyhuKToodGhpcy5meFNwZWVkKTtsPTNEKGwhPTNEPTNEdW5kZWZpbmVkKT8obCk6KCFt
LmlzKCI6PQp2aXNpYmxlIikpO2lmKGwpe20uc2xpZGVEb3duKG8sZnVuY3Rpb24oKXskKHRoaXMp
LmZpbmQoImlucHV0IikuZm9jdXMoKX0pfWU9CmxzZXttLnNsaWRlVXAobyl9cmV0dXJuIGx9LHNl
YXJjaEhkYXM6ZnVuY3Rpb24obCl7dmFyIG09M0R0aGlzO3RoaXMuc2VhcmNoRj0Kb3I9M0RsO3Ro
aXMuZmlsdGVycz0zRFtmdW5jdGlvbihuKXtyZXR1cm4gbi5tYXRjaGVzQWxsKG0uc2VhcmNoRm9y
KX1dO3RoaXMuPQp0cmlnZ2VyKCJzZWFyY2g6c2VhcmNoaW5nIixsLHRoaXMpO3RoaXMucmVuZGVy
SGRhcygpO3JldHVybiB0aGlzfSxjbGVhckhkYVM9CmVhcmNoOmZ1bmN0aW9uKGwpe3RoaXMuc2Vh
cmNoRm9yPTNEIiI7dGhpcy5maWx0ZXJzPTNEW107dGhpcy50cmlnZ2VyKCJzZWFyYz0KaDpjbGVh
ciIsdGhpcyk7dGhpcy5yZW5kZXJIZGFzKCk7cmV0dXJuIHRoaXN9LF9zaG93TG9hZGluZ0luZGlj
YXRvcjpmdW5jdGlvPQpuKG0sbCxuKXtsPTNEKGwhPTNEPTNEdW5kZWZpbmVkKT8obCk6KHRoaXMu
ZnhTcGVlZCk7aWYoIXRoaXMuaW5kaWNhdG9yKXt0aGk9CnMuaW5kaWNhdG9yPTNEbmV3IExvYWRp
bmdJbmRpY2F0b3IodGhpcy4kZWwsdGhpcy4kZWwucGFyZW50KCkpfWlmKCF0aGlzLiRlbD0KLmlz
KCI6dmlzaWJsZSIpKXt0aGlzLmluZGljYXRvci5zaG93KDAsbil9ZWxzZXt0aGlzLiRlbC5mYWRl
T3V0KGwpO3RoaXMuaW5kPQppY2F0b3Iuc2hvdyhtLGwsbil9fSxfaGlkZUxvYWRpbmdJbmRpY2F0
b3I6ZnVuY3Rpb24obCxtKXtsPTNEKGwhPTNEPTNEdW5kZWY9CmluZWQpPyhsKToodGhpcy5meFNw
ZWVkKTtpZih0aGlzLmluZGljYXRvcil7dGhpcy5pbmRpY2F0b3IuaGlkZShsLG0pfX0sZGlzcD0K
bGF5TWVzc2FnZTpmdW5jdGlvbihxLHIscCl7dmFyIG49M0R0aGlzO3RoaXMuc2Nyb2xsVG9Ub3Ao
KTt2YXIgbz0zRHRoaXMuJG1lPQpzc2FnZXMoKSxsPTNEJCgiPGRpdi8+IikuYWRkQ2xhc3MocSsi
bWVzc2FnZSIpLmh0bWwocik7aWYoIV8uaXNFbXB0eShwKSl7dmE9CnIgbT0zRCQoJzxhIGhyZWY9
M0QiamF2YXNjcmlwdDp2b2lkKDApIj5EZXRhaWxzPC9hPicpLmNsaWNrKGZ1bmN0aW9uKCl7R2Fs
YT0KeHkubW9kYWwuc2hvdyhuLl9tZXNzYWdlVG9Nb2RhbE9wdGlvbnMocSxyLHApKTtyZXR1cm4g
ZmFsc2V9KTtsLmFwcGVuZCgiICIsPQptKX1yZXR1cm4gby5odG1sKGwpfSxfbWVzc2FnZVRvTW9k
YWxPcHRpb25zOmZ1bmN0aW9uKHAscixvKXt2YXIgbD0zRHRoaXMscT0KPTNEJCgiPGRpdi8+Iiks
bj0zRHt0aXRsZToiRGV0YWlscyJ9O2Z1bmN0aW9uIG0ocyl7cz0zRF8ub21pdChzLF8uZnVuY3Rp
b25zPQoocykpO3JldHVyblsiPHRhYmxlPiIsXy5tYXAocyxmdW5jdGlvbih1LHQpe3U9M0QoXy5p
c09iamVjdCh1KSk/KG0odSkpOih1KTs9CnJldHVybic8dHI+PHRkIHN0eWxlPTNEInZlcnRpY2Fs
LWFsaWduOiB0b3A7IGNvbG9yOiBncmV5Ij4nK3QrJzwvdGQ+PHRkIHN0eT0KbGU9M0QicGFkZGlu
Zy1sZWZ0OiA4cHgiPicrdSsiPC90ZD48L3RyPiJ9KS5qb2luKCIiKSwiPC90YWJsZT4iXS5qb2lu
KCIiKX1pPQpmKF8uaXNPYmplY3Qobykpe24uYm9keT0zRHEuYXBwZW5kKG0obykpfWVsc2V7bi5i
b2R5PTNEcS5odG1sKG8pfW4uYnV0dG9ucz0KPTNEe09rOmZ1bmN0aW9uKCl7R2FsYXh5Lm1vZGFs
LmhpZGUoKTtsLmNsZWFyTWVzc2FnZXMoKX19O3JldHVybiBufSxjbGVhck1lPQpzc2FnZXM6ZnVu
Y3Rpb24oKXt0aGlzLiRtZXNzYWdlcygpLmVtcHR5KCk7cmV0dXJuIHRoaXN9LHNjcm9sbFBvc2l0
aW9uOmZ1bmM9CnRpb24oKXtyZXR1cm4gdGhpcy4kY29udGFpbmVyKCkuc2Nyb2xsVG9wKCl9LHNj
cm9sbFRvOmZ1bmN0aW9uKGwpe3RoaXMuJGNvbj0KdGFpbmVyKCkuc2Nyb2xsVG9wKGwpO3JldHVy
biB0aGlzfSxzY3JvbGxUb1RvcDpmdW5jdGlvbigpe3RoaXMuJGNvbnRhaW5lcigpPQouc2Nyb2xs
VG9wKDApO3JldHVybiB0aGlzfSxzY3JvbGxUb0lkOmZ1bmN0aW9uKG0pe2lmKCghbSl8fCghdGhp
cy5oZGFWaWV3c1s9Cm1dKSl7cmV0dXJuIHRoaXN9dmFyIGw9M0R0aGlzLmhkYVZpZXdzW21dO3Ro
aXMuc2Nyb2xsVG8obC5lbC5vZmZzZXRUb3ApO3JldD0KdXJuIHRoaXN9LHNjcm9sbFRvSGlkOmZ1
bmN0aW9uKGwpe3ZhciBtPTNEdGhpcy5tb2RlbC5oZGFzLmdldEJ5SGlkKGwpO2lmKCFtPQope3Jl
dHVybiB0aGlzfXJldHVybiB0aGlzLnNjcm9sbFRvSWQobS5pZCl9LHRvU3RyaW5nOmZ1bmN0aW9u
KCl7cmV0dXJuIlJlYWQ9Ck9ubHlIaXN0b3J5UGFuZWwoIisoKHRoaXMubW9kZWwpPyh0aGlzLm1v
ZGVsLmdldCgibmFtZSIpKTooIiIpKSsiKSJ9fSk7dmFyID0Kaz0zRFsnPGRpdiBjbGFzcz0zRCJo
aXN0b3J5LWNvbnRyb2xzIj4nLCc8ZGl2IGNsYXNzPTNEImhpc3Rvcnktc2VhcmNoLWNvbnRyPQpv
bHMiPicsJzxkaXYgY2xhc3M9M0QiaGlzdG9yeS1zZWFyY2gtaW5wdXQiPjwvZGl2PicsIjwvZGl2
PiIsJzxkaXYgY2xhc3M9M0Q9CiJoaXN0b3J5LXRpdGxlIj4nLCI8JSBpZiggaGlzdG9yeS5uYW1l
ICl7ICU+IiwnPGRpdiBjbGFzcz0zRCJoaXN0b3J5LW5hbWUiPj0KPCU9M0QgaGlzdG9yeS5uYW1l
ICU+PC9kaXY+JywiPCUgfSAlPiIsIjwvZGl2PiIsJzxkaXYgY2xhc3M9M0QiaGlzdG9yeS1zdWJ0
PQppdGxlIGNsZWFyIj4nLCI8JSBpZiggaGlzdG9yeS5uaWNlX3NpemUgKXsgJT4iLCc8ZGl2IGNs
YXNzPTNEImhpc3Rvcnktc2l6ZSI9Cj48JT0zRCBoaXN0b3J5Lm5pY2Vfc2l6ZSAlPjwvZGl2Pics
IjwlIH0gJT4iLCc8ZGl2IGNsYXNzPTNEImhpc3Rvcnktc2Vjb25kYT0KcnktYWN0aW9ucyI+PC9k
aXY+JywiPC9kaXY+IiwiPCUgaWYoIGhpc3RvcnkuZGVsZXRlZCApeyAlPiIsJzxkaXYgY2xhc3M9
M0QiPQp3YXJuaW5nbWVzc2FnZXNtYWxsIj48c3Ryb25nPicsZCgiWW91IGFyZSBjdXJyZW50bHkg
dmlld2luZyBhIGRlbGV0ZWQgaGlzdG89CnJ5ISIpLCI8L3N0cm9uZz48L2Rpdj4iLCI8JSB9ICU+
IiwnPGRpdiBjbGFzcz0zRCJtZXNzYWdlLWNvbnRhaW5lciI+JywiPCUgaT0KZiggaGlzdG9yeS5t
ZXNzYWdlICl7ICU+IiwnPGRpdiBjbGFzcz0zRCI8JT0zRCBoaXN0b3J5LnN0YXR1cyAlPm1lc3Nh
Z2UiPjwlPQo9M0QgaGlzdG9yeS5tZXNzYWdlICU+PC9kaXY+JywiPCUgfSAlPiIsIjwvZGl2PiIs
JzxkaXYgY2xhc3M9M0QicXVvdGEtbWVzc2E9CmdlIGVycm9ybWVzc2FnZSI+JyxkKCJZb3UgYXJl
IG92ZXIgeW91ciBkaXNrIHF1b3RhLiIpLGQoIlRvb2wgZXhlY3V0aW9uIGlzID0Kb24gaG9sZCB1
bnRpbCB5b3VyIGRpc2sgdXNhZ2UgZHJvcHMgYmVsb3cgeW91ciBhbGxvY2F0ZWQgcXVvdGEuIiks
IjwvZGl2PiIsPQonPGRpdiBjbGFzcz0zRCJ0YWdzLWRpc3BsYXkiPjwvZGl2PicsJzxkaXYgY2xh
c3M9M0QiYW5ub3RhdGlvbi1kaXNwbGF5Ij48L2Q9Cml2PicsJzxkaXYgY2xhc3M9M0QiaGlzdG9y
eS1kYXRhc2V0LWFjdGlvbnMiPicsJzxkaXYgY2xhc3M9M0QiYnRuLWdyb3VwIj4nLD0KJzxidXR0
b24gY2xhc3M9M0QiaGlzdG9yeS1zZWxlY3QtYWxsLWRhdGFzZXRzLWJ0biBidG4gYnRuLWRlZmF1
bHQiJywnZGF0YS1tPQpvZGU9M0Qic2VsZWN0Ij4nLGQoIkFsbCIpLCI8L2J1dHRvbj4iLCc8YnV0
dG9uIGNsYXNzPTNEImhpc3RvcnktZGVzZWxlY3QtYWw9CmwtZGF0YXNldHMtYnRuIGJ0biBidG4t
ZGVmYXVsdCInLCdkYXRhLW1vZGU9M0Qic2VsZWN0Ij4nLGQoIk5vbmUiKSwiPC9idXR0bz0Kbj4i
LCI8L2Rpdj4iLCc8YnV0dG9uIGNsYXNzPTNEImhpc3RvcnktZGF0YXNldC1hY3Rpb24tcG9wdXAt
YnRuIGJ0biBidG4tZGVmPQphdWx0Ij4nLGQoIkZvciBhbGwgc2VsZWN0ZWQiKSwiLi4uPC9idXR0
b24+IiwiPC9kaXY+IiwiPC9kaXY+IiwnPGRpdiBjbGFzcz0KPTNEImRhdGFzZXRzLWxpc3QiPjwv
ZGl2PicsJzxkaXYgY2xhc3M9M0QiZW1wdHktaGlzdG9yeS1tZXNzYWdlIGluZm9tZXNzYWdlPQpz
bWFsbCI+JyxkKCJZb3VyIGhpc3RvcnkgaXMgZW1wdHkuIENsaWNrICdHZXQgRGF0YScgb24gdGhl
IGxlZnQgcGFuZSB0byBzdGE9CnJ0IiksIjwvZGl2PiJdLmpvaW4oIiIpO2oudGVtcGxhdGVzPTNE
e2hpc3RvcnlQYW5lbDpmdW5jdGlvbihsKXtyZXR1cm4gXy50ZT0KbXBsYXRlKGssbCx7dmFyaWFi
bGU6Imhpc3RvcnkifSl9fTtyZXR1cm57UmVhZE9ubHlIaXN0b3J5UGFuZWw6an19KTsKXCBObyBu
ZXdsaW5lIGF0IGVuZCBvZiBmaWxlCgpUaGlzIGRpZmYgaXMgc28gYmlnIHRoYXQgd2UgbmVlZGVk
IHRvIHRydW5jYXRlIHRoZSByZW1haW5kZXIuCgpSZXBvc2l0b3J5IFVSTDogaHR0cHM6Ly9iaXRi
dWNrZXQub3JnL2dhbGF4eS9nYWxheHktY2VudHJhbC8KCi0tCgpUaGlzIGlzIGEgY29tbWl0IG5v
dGlmaWNhdGlvbiBmcm9tIGJpdGJ1Y2tldC5vcmcuIFlvdSBhcmUgcmVjZWl2aW5nCnRoaXMgYmVj
YXVzZSB5b3UgaGF2ZSB0aGUgc2VydmljZSBlbmFibGVkLCBhZGRyZXNzaW5nIHRoZSByZWNpcGll
bnQgb2YKdGhpcyBlbWFpbC4K
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c2a0ca50e640/
Changeset: c2a0ca50e640
User: dan
Date: 2014-04-15 17:59:14
Summary: UI, make HDAs in NEW state have delete, info and rerun buttons, as well as disabled view and edit buttons. Move new state to NOT READY STATES.
Affected #: 3 files
diff -r 3b3365a391944f848b403412f226ee9e5499c0d5 -r c2a0ca50e6400bff4b9dc549db3fe14305e4473a static/scripts/mvc/dataset/hda-base.js
--- a/static/scripts/mvc/dataset/hda-base.js
+++ b/static/scripts/mvc/dataset/hda-base.js
@@ -165,7 +165,6 @@
// (do show if in error, running)
if( ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
|| ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.DISCARDED )
- || ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NEW )
|| ( !this.model.get( 'accessible' ) ) ){
return null;
}
@@ -185,6 +184,11 @@
displayBtnData.disabled = true;
displayBtnData.title = _l( 'This dataset must finish uploading before it can be viewed' );
+ // disable if still new
+ } else if( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NEW ){
+ displayBtnData.disabled = true;
+ displayBtnData.title = _l( 'This dataset is not yet viewable' );
+
} else {
displayBtnData.title = _l( 'View data' );
@@ -312,7 +316,8 @@
*/
_render_body_new : function(){
return this._render_stateBodyHelper(
- '<div>' + _l( 'This is a new dataset and not all of its data are available yet' ) + '</div>'
+ '<div>' + _l( 'This is a new dataset and not all of its data are available yet' ) + '</div>',
+ this.defaultPrimaryActionButtonRenderers
);
},
/** Render inaccessible, not-owned by curr user. */
diff -r 3b3365a391944f848b403412f226ee9e5499c0d5 -r c2a0ca50e6400bff4b9dc549db3fe14305e4473a static/scripts/mvc/dataset/hda-edit.js
--- a/static/scripts/mvc/dataset/hda-edit.js
+++ b/static/scripts/mvc/dataset/hda-edit.js
@@ -64,8 +64,7 @@
_render_editButton : function(){
// don't show edit while uploading, in-accessible
// DO show if in error (ala previous history panel)
- if( ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NEW )
- || ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.DISCARDED )
+ if( ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.DISCARDED )
|| ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
|| ( !this.model.get( 'accessible' ) ) ){
return null;
@@ -93,6 +92,11 @@
} else if( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.UPLOAD ){
editBtnData.disabled = true;
editBtnData.title = _l( 'This dataset must finish uploading before it can be edited' );
+
+ // disable if new
+ } else if( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NEW ){
+ editBtnData.disabled = true;
+ editBtnData.title = _l( 'This dataset is not yet editable' );
}
editBtnData.faIcon = 'fa-pencil';
return faIconButton( editBtnData );
@@ -103,8 +107,7 @@
*/
_render_deleteButton : function(){
// don't show delete if...
- if( ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NEW )
- || ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
+ if( ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
|| ( !this.model.get( 'accessible' ) ) ){
return null;
}
diff -r 3b3365a391944f848b403412f226ee9e5499c0d5 -r c2a0ca50e6400bff4b9dc549db3fe14305e4473a static/scripts/mvc/dataset/hda-model.js
--- a/static/scripts/mvc/dataset/hda-model.js
+++ b/static/scripts/mvc/dataset/hda-model.js
@@ -377,7 +377,6 @@
/** states that are in a final state (the underlying job is complete) */
HistoryDatasetAssociation.READY_STATES = [
- HistoryDatasetAssociation.STATES.NEW,
HistoryDatasetAssociation.STATES.OK,
HistoryDatasetAssociation.STATES.EMPTY,
HistoryDatasetAssociation.STATES.PAUSED,
@@ -392,7 +391,8 @@
HistoryDatasetAssociation.STATES.UPLOAD,
HistoryDatasetAssociation.STATES.QUEUED,
HistoryDatasetAssociation.STATES.RUNNING,
- HistoryDatasetAssociation.STATES.SETTING_METADATA
+ HistoryDatasetAssociation.STATES.SETTING_METADATA,
+ HistoryDatasetAssociation.STATES.NEW
];
//==============================================================================
https://bitbucket.org/galaxy/galaxy-central/commits/8346ec4baa39/
Changeset: 8346ec4baa39
User: dan
Date: 2014-04-15 18:00:02
Summary: Update packed scripts
Affected #: 3 files
diff -r c2a0ca50e6400bff4b9dc549db3fe14305e4473a -r 8346ec4baa3992f4dc0161f0fc79a0ba893c0a63 static/scripts/packed/mvc/dataset/hda-base.js
--- a/static/scripts/packed/mvc/dataset/hda-base.js
+++ b/static/scripts/packed/mvc/dataset/hda-base.js
@@ -1,1 +1,1 @@
-define(["mvc/dataset/hda-model","mvc/base-mvc"],function(d,b){var c=Backbone.View.extend(b.LoggableMixin).extend({tagName:"div",className:"dataset hda history-panel-hda",id:function(){return"hda-"+this.model.get("id")},fxSpeed:"fast",initialize:function(f){if(f.logger){this.logger=this.model.logger=f.logger}this.log(this+".initialize:",f);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton];this.linkTarget=f.linkTarget||"_blank";this.selectable=f.selectable||false;this.selected=f.selected||false;this.expanded=f.expanded||false;this.draggable=f.draggable||false;this._setUpListeners()},_setUpListeners:function(){this.model.on("change",function(g,f){if(this.model.changedAttributes().state&&this.model.inReadyState()&&this.expanded&&!this.model.hasDetails()){this.model.fetch()}else{this.render()}},this)},render:function(h){h=(h===undefined)?(true):(h);var f=this;this.$el.find("[title]").tooltip("destroy");this.urls=this.model.urls();var g=this._buildNewRender();if(h){$(f).queue(function(i){this.$el.fadeOut(f.fxSpeed,i)})}$(f).queue(function(i){this.$el.empty().attr("class",f.className).addClass("state-"+f.model.get("state")).append(g.children());if(this.selectable){this.showSelector(0)}i()});if(h){$(f).queue(function(i){this.$el.fadeIn(f.fxSpeed,i)})}$(f).queue(function(i){this.trigger("rendered",f);if(this.model.inReadyState()){this.trigger("rendered:ready",f)}if(this.draggable){this.draggableOn()}i()});return this},_buildNewRender:function(){var f=$(c.templates.skeleton(this.model.toJSON()));f.find(".dataset-primary-actions").append(this._render_titleButtons());f.children(".dataset-body").replaceWith(this._render_body());this._setUpBehaviors(f);return f},_setUpBehaviors:function(f){f=f||this.$el;make_popup_menus(f);f.find("[title]").tooltip({placement:"bottom"})},_render_titleButtons:function(){return[this._render_displayButton()]},_render_displayButton:function(){if((this.model.get("state")===d.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(this.model.get("state")===d.HistoryDatasetAssociation.STATES.DISCARDED)||(this.model.get("state")===d.HistoryDatasetAssociation.STATES.NEW)||(!this.model.get("accessible"))){return null}var g={target:this.linkTarget,classes:"dataset-display"};if(this.model.get("purged")){g.disabled=true;g.title=_l("Cannot display datasets removed from disk")}else{if(this.model.get("state")===d.HistoryDatasetAssociation.STATES.UPLOAD){g.disabled=true;g.title=_l("This dataset must finish uploading before it can be viewed")}else{g.title=_l("View data");g.href=this.urls.display;var f=this;g.onclick=function(h){if(Galaxy.frame&&Galaxy.frame.active){Galaxy.frame.add({title:"Data Viewer: "+f.model.get("name"),type:"url",content:f.urls.display});h.preventDefault()}}}}g.faIcon="fa-eye";return faIconButton(g)},_render_downloadButton:function(){if(this.model.get("purged")||!this.model.hasData()){return null}var g=this.urls,h=this.model.get("meta_files");if(_.isEmpty(h)){return $(['<a href="'+g.download+'" title="'+_l("Download")+'" ','class="icon-btn dataset-download-btn">','<span class="fa fa-floppy-o"></span>',"</a>"].join(""))}var i="dataset-"+this.model.get("id")+"-popup",f=['<div popupmenu="'+i+'">','<a href="'+g.download+'">',_l("Download Dataset"),"</a>","<a>"+_l("Additional Files")+"</a>",_.map(h,function(j){return['<a class="action-button" href="',g.meta_download+j.file_type,'">',_l("Download")," ",j.file_type,"</a>"].join("")}).join("\n"),"</div>",'<div class="icon-btn-group">','<a href="'+g.download+'" title="'+_l("Download")+'" ','class="icon-btn dataset-download-btn">','<span class="fa fa-floppy-o"></span>','</a><a class="icon-btn popup" id="'+i+'">','<span class="fa fa-caret-down"></span>',"</a>","</div>"].join("\n");return $(f)},_render_showParamsButton:function(){return faIconButton({title:_l("View details"),classes:"dataset-params-btn",href:this.urls.show_params,target:this.linkTarget,faIcon:"fa-info-circle"})},_render_body:function(){var g=$('<div>Error: unknown dataset state "'+this.model.get("state")+'".</div>'),f=this["_render_body_"+this.model.get("state")];if(_.isFunction(f)){g=f.call(this)}this._setUpBehaviors(g);if(this.expanded){g.show()}return g},_render_stateBodyHelper:function(f,i){i=i||[];var g=this,h=$(c.templates.body(_.extend(this.model.toJSON(),{body:f})));h.find(".dataset-actions .left").append(_.map(i,function(j){return j.call(g)}));return h},_render_body_new:function(){return this._render_stateBodyHelper("<div>"+_l("This is a new dataset and not all of its data are available yet")+"</div>")},_render_body_noPermission:function(){return this._render_stateBodyHelper("<div>"+_l("You do not have permission to view this dataset")+"</div>")},_render_body_discarded:function(){return this._render_stateBodyHelper("<div>"+_l("The job creating this dataset was cancelled before completion")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_queued:function(){return this._render_stateBodyHelper("<div>"+_l("This job is waiting to run")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_upload:function(){return this._render_stateBodyHelper("<div>"+_l("This dataset is currently uploading")+"</div>")},_render_body_setting_metadata:function(){return this._render_stateBodyHelper("<div>"+_l("Metadata is being auto-detected")+"</div>")},_render_body_running:function(){return this._render_stateBodyHelper("<div>"+_l("This job is currently running")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_paused:function(){return this._render_stateBodyHelper("<div>"+_l('This job is paused. Use the "Resume Paused Jobs" in the history menu to resume')+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_error:function(){var f=['<span class="help-text">',_l("An error occurred with this dataset"),":</span>",'<div class="job-error-text">',$.trim(this.model.get("misc_info")),"</div>"].join("");if(!this.model.get("purged")){f="<div>"+this.model.get("misc_blurb")+"</div>"+f}return this._render_stateBodyHelper(f,[this._render_downloadButton].concat(this.defaultPrimaryActionButtonRenderers))},_render_body_empty:function(){return this._render_stateBodyHelper("<div>"+_l("No data")+": <i>"+this.model.get("misc_blurb")+"</i></div>",this.defaultPrimaryActionButtonRenderers)},_render_body_failed_metadata:function(){var f=$('<div class="warningmessagesmall"></div>').append($("<strong/>").text(_l("An error occurred setting the metadata for this dataset"))),g=this._render_body_ok();g.prepend(f);return g},_render_body_ok:function(){var f=this,h=$(c.templates.body(this.model.toJSON())),g=[this._render_downloadButton].concat(this.defaultPrimaryActionButtonRenderers);h.find(".dataset-actions .left").append(_.map(g,function(i){return i.call(f)}));if(this.model.isDeletedOrPurged()){return h}return h},events:{"click .dataset-title-bar":"toggleBodyVisibility","keydown .dataset-title-bar":"toggleBodyVisibility","click .dataset-selector":"toggleSelect"},toggleBodyVisibility:function(i,g){var f=32,h=13;if(i&&(i.type==="keydown")&&!(i.keyCode===f||i.keyCode===h)){return true}var j=this.$el.find(".dataset-body");g=(g===undefined)?(!j.is(":visible")):(g);if(g){this.expandBody()}else{this.collapseBody()}return false},expandBody:function(){var f=this;function g(){f.$el.children(".dataset-body").replaceWith(f._render_body());f.$el.children(".dataset-body").slideDown(f.fxSpeed,function(){f.expanded=true;f.trigger("body-expanded",f.model.get("id"))})}if(this.model.inReadyState()&&!this.model.hasDetails()){this.model.fetch({silent:true}).always(function(h){f.urls=f.model.urls();g()})}else{g()}},collapseBody:function(){var f=this;this.$el.children(".dataset-body").slideUp(f.fxSpeed,function(){f.expanded=false;f.trigger("body-collapsed",f.model.get("id"))})},showSelector:function(){if(this.selected){this.select(null,true)}this.selectable=true;this.trigger("selectable",true,this);this.$(".dataset-primary-actions").hide();this.$(".dataset-selector").show()},hideSelector:function(){this.selectable=false;this.trigger("selectable",false,this);this.$(".dataset-selector").hide();this.$(".dataset-primary-actions").show()},toggleSelector:function(){if(!this.$el.find(".dataset-selector").is(":visible")){this.showSelector()}else{this.hideSelector()}},select:function(f){this.$el.find(".dataset-selector span").removeClass("fa-square-o").addClass("fa-check-square-o");if(!this.selected){this.trigger("selected",this);this.selected=true}return false},deselect:function(f){this.$el.find(".dataset-selector span").removeClass("fa-check-square-o").addClass("fa-square-o");if(this.selected){this.trigger("de-selected",this);this.selected=false}return false},toggleSelect:function(f){if(this.selected){this.deselect(f)}else{this.select(f)}},draggableOn:function(){this.draggable=true;this.dragStartHandler=_.bind(this._dragStartHandler,this);this.dragEndHandler=_.bind(this._dragEndHandler,this);var f=this.$el.find(".dataset-title-bar").attr("draggable",true).get(0);f.addEventListener("dragstart",this.dragStartHandler,false);f.addEventListener("dragend",this.dragEndHandler,false)},draggableOff:function(){this.draggable=false;var f=this.$el.find(".dataset-title-bar").attr("draggable",false).get(0);f.removeEventListener("dragstart",this.dragStartHandler,false);f.removeEventListener("dragend",this.dragEndHandler,false)},toggleDraggable:function(){if(this.draggable){this.draggableOff()}else{this.draggableOn()}},_dragStartHandler:function(f){this.trigger("dragstart",this);f.dataTransfer.effectAllowed="move";f.dataTransfer.setData("text",JSON.stringify(this.model.toJSON()));return false},_dragEndHandler:function(f){this.trigger("dragend",this);return false},remove:function(g){var f=this;this.$el.fadeOut(f.fxSpeed,function(){f.$el.remove();f.off();if(g){g()}})},toString:function(){var f=(this.model)?(this.model+""):("(no model)");return"HDABaseView("+f+")"}});var a=['<div class="dataset hda">','<div class="dataset-warnings">',"<% if( hda.error ){ %>",'<div class="errormessagesmall">',_l("There was an error getting the data for this dataset"),":<%- hda.error %>","</div>","<% } %>","<% if( hda.deleted ){ %>","<% if( hda.purged ){ %>",'<div class="dataset-purged-msg warningmessagesmall"><strong>',_l("This dataset has been deleted and removed from disk."),"</strong></div>","<% } else { %>",'<div class="dataset-deleted-msg warningmessagesmall"><strong>',_l("This dataset has been deleted."),"</strong></div>","<% } %>","<% } %>","<% if( !hda.visible ){ %>",'<div class="dataset-hidden-msg warningmessagesmall"><strong>',_l("This dataset has been hidden."),"</strong></div>","<% } %>","</div>",'<div class="dataset-selector">','<span class="fa fa-2x fa-square-o"></span>',"</div>",'<div class="dataset-primary-actions"></div>','<div class="dataset-title-bar clear" tabindex="0">','<span class="dataset-state-icon state-icon"></span>','<div class="dataset-title">','<span class="hda-hid"><%- hda.hid %></span> ','<span class="dataset-name"><%- hda.name %></span>',"</div>","</div>",'<div class="dataset-body"></div>',"</div>"].join("");var e=['<div class="dataset-body">',"<% if( hda.body ){ %>",'<div class="dataset-summary">',"<%= hda.body %>","</div>",'<div class="dataset-actions clear">','<div class="left"></div>','<div class="right"></div>',"</div>","<% } else { %>",'<div class="dataset-summary">',"<% if( hda.misc_blurb ){ %>",'<div class="dataset-blurb">','<span class="value"><%- hda.misc_blurb %></span>',"</div>","<% } %>","<% if( hda.data_type ){ %>",'<div class="dataset-datatype">','<label class="prompt">',_l("format"),"</label>",'<span class="value"><%- hda.data_type %></span>',"</div>","<% } %>","<% if( hda.metadata_dbkey ){ %>",'<div class="dataset-dbkey">','<label class="prompt">',_l("database"),"</label>",'<span class="value">',"<%- hda.metadata_dbkey %>","</span>","</div>","<% } %>","<% if( hda.misc_info ){ %>",'<div class="dataset-info">','<span class="value"><%- hda.misc_info %></span>',"</div>","<% } %>","</div>",'<div class="dataset-actions clear">','<div class="left"></div>','<div class="right"></div>',"</div>","<% if( !hda.deleted ){ %>",'<div class="tags-display"></div>','<div class="annotation-display"></div>','<div class="dataset-display-applications">',"<% _.each( hda.display_apps, function( app ){ %>",'<div class="display-application">','<span class="display-application-location"><%- app.label %></span> ','<span class="display-application-links">',"<% _.each( app.links, function( link ){ %>",'<a target="<%= link.target %>" href="<%= link.href %>">',"<% print( _l( link.text ) ); %>","</a> ","<% }); %>","</span>","</div>","<% }); %>","<% _.each( hda.display_types, function( app ){ %>",'<div class="display-application">','<span class="display-application-location"><%- app.label %></span> ','<span class="display-application-links">',"<% _.each( app.links, function( link ){ %>",'<a target="<%= link.target %>" href="<%= link.href %>">',"<% print( _l( link.text ) ); %>","</a> ","<% }); %>","</span>","</div>","<% }); %>","</div>",'<div class="dataset-peek">',"<% if( hda.peek ){ %>",'<pre class="peek"><%= hda.peek %></pre>',"<% } %>","</div>","<% } %>","<% } %>","</div>"].join("");c.templates={skeleton:function(f){return _.template(a,f,{variable:"hda"})},body:function(f){return _.template(e,f,{variable:"hda"})}};return{HDABaseView:c}});
\ No newline at end of file
+define(["mvc/dataset/hda-model","mvc/base-mvc"],function(d,b){var c=Backbone.View.extend(b.LoggableMixin).extend({tagName:"div",className:"dataset hda history-panel-hda",id:function(){return"hda-"+this.model.get("id")},fxSpeed:"fast",initialize:function(f){if(f.logger){this.logger=this.model.logger=f.logger}this.log(this+".initialize:",f);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton];this.linkTarget=f.linkTarget||"_blank";this.selectable=f.selectable||false;this.selected=f.selected||false;this.expanded=f.expanded||false;this.draggable=f.draggable||false;this._setUpListeners()},_setUpListeners:function(){this.model.on("change",function(g,f){if(this.model.changedAttributes().state&&this.model.inReadyState()&&this.expanded&&!this.model.hasDetails()){this.model.fetch()}else{this.render()}},this)},render:function(h){h=(h===undefined)?(true):(h);var f=this;this.$el.find("[title]").tooltip("destroy");this.urls=this.model.urls();var g=this._buildNewRender();if(h){$(f).queue(function(i){this.$el.fadeOut(f.fxSpeed,i)})}$(f).queue(function(i){this.$el.empty().attr("class",f.className).addClass("state-"+f.model.get("state")).append(g.children());if(this.selectable){this.showSelector(0)}i()});if(h){$(f).queue(function(i){this.$el.fadeIn(f.fxSpeed,i)})}$(f).queue(function(i){this.trigger("rendered",f);if(this.model.inReadyState()){this.trigger("rendered:ready",f)}if(this.draggable){this.draggableOn()}i()});return this},_buildNewRender:function(){var f=$(c.templates.skeleton(this.model.toJSON()));f.find(".dataset-primary-actions").append(this._render_titleButtons());f.children(".dataset-body").replaceWith(this._render_body());this._setUpBehaviors(f);return f},_setUpBehaviors:function(f){f=f||this.$el;make_popup_menus(f);f.find("[title]").tooltip({placement:"bottom"})},_render_titleButtons:function(){return[this._render_displayButton()]},_render_displayButton:function(){if((this.model.get("state")===d.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(this.model.get("state")===d.HistoryDatasetAssociation.STATES.DISCARDED)||(!this.model.get("accessible"))){return null}var g={target:this.linkTarget,classes:"dataset-display"};if(this.model.get("purged")){g.disabled=true;g.title=_l("Cannot display datasets removed from disk")}else{if(this.model.get("state")===d.HistoryDatasetAssociation.STATES.UPLOAD){g.disabled=true;g.title=_l("This dataset must finish uploading before it can be viewed")}else{if(this.model.get("state")===d.HistoryDatasetAssociation.STATES.NEW){g.disabled=true;g.title=_l("This dataset is not yet viewable")}else{g.title=_l("View data");g.href=this.urls.display;var f=this;g.onclick=function(h){if(Galaxy.frame&&Galaxy.frame.active){Galaxy.frame.add({title:"Data Viewer: "+f.model.get("name"),type:"url",content:f.urls.display});h.preventDefault()}}}}}g.faIcon="fa-eye";return faIconButton(g)},_render_downloadButton:function(){if(this.model.get("purged")||!this.model.hasData()){return null}var g=this.urls,h=this.model.get("meta_files");if(_.isEmpty(h)){return $(['<a href="'+g.download+'" title="'+_l("Download")+'" ','class="icon-btn dataset-download-btn">','<span class="fa fa-floppy-o"></span>',"</a>"].join(""))}var i="dataset-"+this.model.get("id")+"-popup",f=['<div popupmenu="'+i+'">','<a href="'+g.download+'">',_l("Download Dataset"),"</a>","<a>"+_l("Additional Files")+"</a>",_.map(h,function(j){return['<a class="action-button" href="',g.meta_download+j.file_type,'">',_l("Download")," ",j.file_type,"</a>"].join("")}).join("\n"),"</div>",'<div class="icon-btn-group">','<a href="'+g.download+'" title="'+_l("Download")+'" ','class="icon-btn dataset-download-btn">','<span class="fa fa-floppy-o"></span>','</a><a class="icon-btn popup" id="'+i+'">','<span class="fa fa-caret-down"></span>',"</a>","</div>"].join("\n");return $(f)},_render_showParamsButton:function(){return faIconButton({title:_l("View details"),classes:"dataset-params-btn",href:this.urls.show_params,target:this.linkTarget,faIcon:"fa-info-circle"})},_render_body:function(){var g=$('<div>Error: unknown dataset state "'+this.model.get("state")+'".</div>'),f=this["_render_body_"+this.model.get("state")];if(_.isFunction(f)){g=f.call(this)}this._setUpBehaviors(g);if(this.expanded){g.show()}return g},_render_stateBodyHelper:function(f,i){i=i||[];var g=this,h=$(c.templates.body(_.extend(this.model.toJSON(),{body:f})));h.find(".dataset-actions .left").append(_.map(i,function(j){return j.call(g)}));return h},_render_body_new:function(){return this._render_stateBodyHelper("<div>"+_l("This is a new dataset and not all of its data are available yet")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_noPermission:function(){return this._render_stateBodyHelper("<div>"+_l("You do not have permission to view this dataset")+"</div>")},_render_body_discarded:function(){return this._render_stateBodyHelper("<div>"+_l("The job creating this dataset was cancelled before completion")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_queued:function(){return this._render_stateBodyHelper("<div>"+_l("This job is waiting to run")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_upload:function(){return this._render_stateBodyHelper("<div>"+_l("This dataset is currently uploading")+"</div>")},_render_body_setting_metadata:function(){return this._render_stateBodyHelper("<div>"+_l("Metadata is being auto-detected")+"</div>")},_render_body_running:function(){return this._render_stateBodyHelper("<div>"+_l("This job is currently running")+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_paused:function(){return this._render_stateBodyHelper("<div>"+_l('This job is paused. Use the "Resume Paused Jobs" in the history menu to resume')+"</div>",this.defaultPrimaryActionButtonRenderers)},_render_body_error:function(){var f=['<span class="help-text">',_l("An error occurred with this dataset"),":</span>",'<div class="job-error-text">',$.trim(this.model.get("misc_info")),"</div>"].join("");if(!this.model.get("purged")){f="<div>"+this.model.get("misc_blurb")+"</div>"+f}return this._render_stateBodyHelper(f,[this._render_downloadButton].concat(this.defaultPrimaryActionButtonRenderers))},_render_body_empty:function(){return this._render_stateBodyHelper("<div>"+_l("No data")+": <i>"+this.model.get("misc_blurb")+"</i></div>",this.defaultPrimaryActionButtonRenderers)},_render_body_failed_metadata:function(){var f=$('<div class="warningmessagesmall"></div>').append($("<strong/>").text(_l("An error occurred setting the metadata for this dataset"))),g=this._render_body_ok();g.prepend(f);return g},_render_body_ok:function(){var f=this,h=$(c.templates.body(this.model.toJSON())),g=[this._render_downloadButton].concat(this.defaultPrimaryActionButtonRenderers);h.find(".dataset-actions .left").append(_.map(g,function(i){return i.call(f)}));if(this.model.isDeletedOrPurged()){return h}return h},events:{"click .dataset-title-bar":"toggleBodyVisibility","keydown .dataset-title-bar":"toggleBodyVisibility","click .dataset-selector":"toggleSelect"},toggleBodyVisibility:function(i,g){var f=32,h=13;if(i&&(i.type==="keydown")&&!(i.keyCode===f||i.keyCode===h)){return true}var j=this.$el.find(".dataset-body");g=(g===undefined)?(!j.is(":visible")):(g);if(g){this.expandBody()}else{this.collapseBody()}return false},expandBody:function(){var f=this;function g(){f.$el.children(".dataset-body").replaceWith(f._render_body());f.$el.children(".dataset-body").slideDown(f.fxSpeed,function(){f.expanded=true;f.trigger("body-expanded",f.model.get("id"))})}if(this.model.inReadyState()&&!this.model.hasDetails()){this.model.fetch({silent:true}).always(function(h){f.urls=f.model.urls();g()})}else{g()}},collapseBody:function(){var f=this;this.$el.children(".dataset-body").slideUp(f.fxSpeed,function(){f.expanded=false;f.trigger("body-collapsed",f.model.get("id"))})},showSelector:function(){if(this.selected){this.select(null,true)}this.selectable=true;this.trigger("selectable",true,this);this.$(".dataset-primary-actions").hide();this.$(".dataset-selector").show()},hideSelector:function(){this.selectable=false;this.trigger("selectable",false,this);this.$(".dataset-selector").hide();this.$(".dataset-primary-actions").show()},toggleSelector:function(){if(!this.$el.find(".dataset-selector").is(":visible")){this.showSelector()}else{this.hideSelector()}},select:function(f){this.$el.find(".dataset-selector span").removeClass("fa-square-o").addClass("fa-check-square-o");if(!this.selected){this.trigger("selected",this);this.selected=true}return false},deselect:function(f){this.$el.find(".dataset-selector span").removeClass("fa-check-square-o").addClass("fa-square-o");if(this.selected){this.trigger("de-selected",this);this.selected=false}return false},toggleSelect:function(f){if(this.selected){this.deselect(f)}else{this.select(f)}},draggableOn:function(){this.draggable=true;this.dragStartHandler=_.bind(this._dragStartHandler,this);this.dragEndHandler=_.bind(this._dragEndHandler,this);var f=this.$el.find(".dataset-title-bar").attr("draggable",true).get(0);f.addEventListener("dragstart",this.dragStartHandler,false);f.addEventListener("dragend",this.dragEndHandler,false)},draggableOff:function(){this.draggable=false;var f=this.$el.find(".dataset-title-bar").attr("draggable",false).get(0);f.removeEventListener("dragstart",this.dragStartHandler,false);f.removeEventListener("dragend",this.dragEndHandler,false)},toggleDraggable:function(){if(this.draggable){this.draggableOff()}else{this.draggableOn()}},_dragStartHandler:function(f){this.trigger("dragstart",this);f.dataTransfer.effectAllowed="move";f.dataTransfer.setData("text",JSON.stringify(this.model.toJSON()));return false},_dragEndHandler:function(f){this.trigger("dragend",this);return false},remove:function(g){var f=this;this.$el.fadeOut(f.fxSpeed,function(){f.$el.remove();f.off();if(g){g()}})},toString:function(){var f=(this.model)?(this.model+""):("(no model)");return"HDABaseView("+f+")"}});var a=['<div class="dataset hda">','<div class="dataset-warnings">',"<% if( hda.error ){ %>",'<div class="errormessagesmall">',_l("There was an error getting the data for this dataset"),":<%- hda.error %>","</div>","<% } %>","<% if( hda.deleted ){ %>","<% if( hda.purged ){ %>",'<div class="dataset-purged-msg warningmessagesmall"><strong>',_l("This dataset has been deleted and removed from disk."),"</strong></div>","<% } else { %>",'<div class="dataset-deleted-msg warningmessagesmall"><strong>',_l("This dataset has been deleted."),"</strong></div>","<% } %>","<% } %>","<% if( !hda.visible ){ %>",'<div class="dataset-hidden-msg warningmessagesmall"><strong>',_l("This dataset has been hidden."),"</strong></div>","<% } %>","</div>",'<div class="dataset-selector">','<span class="fa fa-2x fa-square-o"></span>',"</div>",'<div class="dataset-primary-actions"></div>','<div class="dataset-title-bar clear" tabindex="0">','<span class="dataset-state-icon state-icon"></span>','<div class="dataset-title">','<span class="hda-hid"><%- hda.hid %></span> ','<span class="dataset-name"><%- hda.name %></span>',"</div>","</div>",'<div class="dataset-body"></div>',"</div>"].join("");var e=['<div class="dataset-body">',"<% if( hda.body ){ %>",'<div class="dataset-summary">',"<%= hda.body %>","</div>",'<div class="dataset-actions clear">','<div class="left"></div>','<div class="right"></div>',"</div>","<% } else { %>",'<div class="dataset-summary">',"<% if( hda.misc_blurb ){ %>",'<div class="dataset-blurb">','<span class="value"><%- hda.misc_blurb %></span>',"</div>","<% } %>","<% if( hda.data_type ){ %>",'<div class="dataset-datatype">','<label class="prompt">',_l("format"),"</label>",'<span class="value"><%- hda.data_type %></span>',"</div>","<% } %>","<% if( hda.metadata_dbkey ){ %>",'<div class="dataset-dbkey">','<label class="prompt">',_l("database"),"</label>",'<span class="value">',"<%- hda.metadata_dbkey %>","</span>","</div>","<% } %>","<% if( hda.misc_info ){ %>",'<div class="dataset-info">','<span class="value"><%- hda.misc_info %></span>',"</div>","<% } %>","</div>",'<div class="dataset-actions clear">','<div class="left"></div>','<div class="right"></div>',"</div>","<% if( !hda.deleted ){ %>",'<div class="tags-display"></div>','<div class="annotation-display"></div>','<div class="dataset-display-applications">',"<% _.each( hda.display_apps, function( app ){ %>",'<div class="display-application">','<span class="display-application-location"><%- app.label %></span> ','<span class="display-application-links">',"<% _.each( app.links, function( link ){ %>",'<a target="<%= link.target %>" href="<%= link.href %>">',"<% print( _l( link.text ) ); %>","</a> ","<% }); %>","</span>","</div>","<% }); %>","<% _.each( hda.display_types, function( app ){ %>",'<div class="display-application">','<span class="display-application-location"><%- app.label %></span> ','<span class="display-application-links">',"<% _.each( app.links, function( link ){ %>",'<a target="<%= link.target %>" href="<%= link.href %>">',"<% print( _l( link.text ) ); %>","</a> ","<% }); %>","</span>","</div>","<% }); %>","</div>",'<div class="dataset-peek">',"<% if( hda.peek ){ %>",'<pre class="peek"><%= hda.peek %></pre>',"<% } %>","</div>","<% } %>","<% } %>","</div>"].join("");c.templates={skeleton:function(f){return _.template(a,f,{variable:"hda"})},body:function(f){return _.template(e,f,{variable:"hda"})}};return{HDABaseView:c}});
\ No newline at end of file
diff -r c2a0ca50e6400bff4b9dc549db3fe14305e4473a -r 8346ec4baa3992f4dc0161f0fc79a0ba893c0a63 static/scripts/packed/mvc/dataset/hda-edit.js
--- a/static/scripts/packed/mvc/dataset/hda-edit.js
+++ b/static/scripts/packed/mvc/dataset/hda-edit.js
@@ -1,1 +1,1 @@
-define(["mvc/dataset/hda-model","mvc/dataset/hda-base","mvc/tags","mvc/annotations"],function(f,b,a,e){var g=b.HDABaseView.extend({initialize:function(h){b.HDABaseView.prototype.initialize.call(this,h);this.hasUser=h.hasUser;this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton,this._render_rerunButton];this.tagsEditorShown=h.tagsEditorShown||false;this.annotationEditorShown=h.annotationEditorShown||false},_render_titleButtons:function(){return b.HDABaseView.prototype._render_titleButtons.call(this).concat([this._render_editButton(),this._render_deleteButton()])},_render_editButton:function(){if((this.model.get("state")===f.HistoryDatasetAssociation.STATES.NEW)||(this.model.get("state")===f.HistoryDatasetAssociation.STATES.DISCARDED)||(this.model.get("state")===f.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){return null}var j=this.model.get("purged"),h=this.model.get("deleted"),i={title:_l("Edit attributes"),href:this.urls.edit,target:this.linkTarget,classes:"dataset-edit"};if(h||j){i.disabled=true;if(j){i.title=_l("Cannot edit attributes of datasets removed from disk")}else{if(h){i.title=_l("Undelete dataset to edit attributes")}}}else{if(this.model.get("state")===f.HistoryDatasetAssociation.STATES.UPLOAD){i.disabled=true;i.title=_l("This dataset must finish uploading before it can be edited")}}i.faIcon="fa-pencil";return faIconButton(i)},_render_deleteButton:function(){if((this.model.get("state")===f.HistoryDatasetAssociation.STATES.NEW)||(this.model.get("state")===f.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){return null}var h=this,i={title:_l("Delete"),classes:"dataset-delete",onclick:function(){h.$el.find(".icon-btn.dataset-delete").trigger("mouseout");h.model["delete"]()}};if(this.model.get("deleted")||this.model.get("purged")){i={title:_l("Dataset is already deleted"),disabled:true}}i.faIcon="fa-times";return faIconButton(i)},_render_errButton:function(){if(this.model.get("state")!==f.HistoryDatasetAssociation.STATES.ERROR){return null}return faIconButton({title:_l("View or report this error"),href:this.urls.report_error,classes:"dataset-report-error-btn",target:this.linkTarget,faIcon:"fa-bug"})},_render_rerunButton:function(){return faIconButton({title:_l("Run this job again"),href:this.urls.rerun,classes:"dataset-rerun-btn",target:this.linkTarget,faIcon:"fa-refresh"})},_render_visualizationsButton:function(){var h=this.model.get("visualizations");if((!this.hasUser)||(!this.model.hasData())||(_.isEmpty(h))){return null}if(_.isObject(h[0])){return this._render_visualizationsFrameworkButton(h)}if(!this.urls.visualization){return null}var j=this.model.get("dbkey"),n=this.urls.visualization,k={},o={dataset_id:this.model.get("id"),hda_ldda:"hda"};if(j){o.dbkey=j}var i=faIconButton({title:_l("Visualize"),classes:"dataset-visualize-btn",faIcon:"fa-bar-chart-o"});function l(p){if(p==="trackster"){return c(n,o,j)}return function(){Galaxy.frame.add({title:"Visualization",type:"url",content:n+"/"+p+"?"+$.param(o)})}}function m(p){return p.charAt(0).toUpperCase()+p.slice(1)}if(h.length===1){i.attr("data-original-title",_l("Visualize in ")+_l(m(h[0])));i.click(l(h[0]))}else{_.each(h,function(p){k[_l(m(p))]=l(p)});make_popupmenu(i,k)}return i},_render_visualizationsFrameworkButton:function(h){if(!(this.model.hasData())||!(h&&!_.isEmpty(h))){return null}var j=faIconButton({title:_l("Visualize"),classes:"dataset-visualize-btn",faIcon:"fa-bar-chart-o"});if(h.length===1){var i=h[0];j.attr("data-original-title",_l("Visualize in ")+i.html);j.attr("href",i.href)}else{var k=[];_.each(h,function(l){l.func=function(m){if(Galaxy.frame&&Galaxy.frame.active){Galaxy.frame.add({title:"Visualization",type:"url",content:l.href});m.preventDefault();return false}return true};k.push(l);return false});PopupMenu.create(j,k)}return j},_buildNewRender:function(){var h=b.HDABaseView.prototype._buildNewRender.call(this);h.find(".dataset-deleted-msg").append(_l(' Click <a href="javascript:void(0);" class="dataset-undelete">here</a> to undelete it or <a href="javascript:void(0);" class="dataset-purge">here</a> to immediately remove it from disk'));h.find(".dataset-hidden-msg").append(_l(' Click <a href="javascript:void(0);" class="dataset-unhide">here</a> to unhide it'));return h},_render_body_failed_metadata:function(){var i=$("<a/>").attr({href:this.urls.edit,target:this.linkTarget}).text(_l("set it manually or retry auto-detection")),h=$("<span/>").text(". "+_l("You may be able to")+" ").append(i),j=b.HDABaseView.prototype._render_body_failed_metadata.call(this);j.find(".warningmessagesmall strong").append(h);return j},_render_body_error:function(){var h=b.HDABaseView.prototype._render_body_error.call(this);h.find(".dataset-actions .left").prepend(this._render_errButton());return h},_render_body_ok:function(){var h=b.HDABaseView.prototype._render_body_ok.call(this);if(this.model.isDeletedOrPurged()){return h}this.makeDbkeyEditLink(h);if(this.hasUser){h.find(".dataset-actions .left").append(this._render_visualizationsButton());this._renderTags(h);this._renderAnnotation(h)}return h},_renderTags:function(h){var i=this;this.tagsEditor=new a.TagsEditor({model:this.model,el:h.find(".tags-display"),onshowFirstTime:function(){this.render()},onshow:function(){i.tagsEditorShown=true},onhide:function(){i.tagsEditorShown=false},$activator:faIconButton({title:_l("Edit dataset tags"),classes:"dataset-tag-btn",faIcon:"fa-tags"}).appendTo(h.find(".dataset-actions .right"))});if(this.tagsEditorShown){this.tagsEditor.toggle(true)}},_renderAnnotation:function(h){var i=this;this.annotationEditor=new e.AnnotationEditor({model:this.model,el:h.find(".annotation-display"),onshowFirstTime:function(){this.render()},onshow:function(){i.annotationEditorShown=true},onhide:function(){i.annotationEditorShown=false},$activator:faIconButton({title:_l("Edit dataset annotation"),classes:"dataset-annotate-btn",faIcon:"fa-comment"}).appendTo(h.find(".dataset-actions .right"))});if(this.annotationEditorShown){this.annotationEditor.toggle(true)}},makeDbkeyEditLink:function(i){if(this.model.get("metadata_dbkey")==="?"&&!this.model.isDeletedOrPurged()){var h=$('<a class="value">?</a>').attr("href",this.urls.edit).attr("target",this.linkTarget);i.find(".dataset-dbkey .value").replaceWith(h)}},events:_.extend(_.clone(b.HDABaseView.prototype.events),{"click .dataset-undelete":function(h){this.model.undelete();return false},"click .dataset-unhide":function(h){this.model.unhide();return false},"click .dataset-purge":"confirmPurge"}),confirmPurge:function d(h){this.model.purge();return false},toString:function(){var h=(this.model)?(this.model+""):("(no model)");return"HDAView("+h+")"}});function c(h,j,i){return function(){var k={};if(i){k["f-dbkey"]=i}$.ajax({url:h+"/list_tracks?"+$.param(k),dataType:"html",error:function(){alert(("Could not add this dataset to browser")+".")},success:function(l){var m=window.parent;m.Galaxy.modal.show({title:"View Data in a New or Saved Visualization",buttons:{Cancel:function(){m.Galaxy.modal.hide()},"View in saved visualization":function(){m.Galaxy.modal.show({title:"Add Data to Saved Visualization",body:l,buttons:{Cancel:function(){m.Galaxy.modal.hide()},"Add to visualization":function(){$(m.document).find("input[name=id]:checked").each(function(){m.Galaxy.modal.hide();var n=$(this).val();j.id=n;m.Galaxy.frame.add({title:"Trackster",type:"url",content:h+"/trackster?"+$.param(j)})})}}})},"View in new visualization":function(){m.Galaxy.modal.hide();var n=h+"/trackster?"+$.param(j);m.Galaxy.frame.add({title:"Trackster",type:"url",content:n})}}})}});return false}}return{HDAEditView:g}});
\ No newline at end of file
+define(["mvc/dataset/hda-model","mvc/dataset/hda-base","mvc/tags","mvc/annotations"],function(f,b,a,e){var g=b.HDABaseView.extend({initialize:function(h){b.HDABaseView.prototype.initialize.call(this,h);this.hasUser=h.hasUser;this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton,this._render_rerunButton];this.tagsEditorShown=h.tagsEditorShown||false;this.annotationEditorShown=h.annotationEditorShown||false},_render_titleButtons:function(){return b.HDABaseView.prototype._render_titleButtons.call(this).concat([this._render_editButton(),this._render_deleteButton()])},_render_editButton:function(){if((this.model.get("state")===f.HistoryDatasetAssociation.STATES.DISCARDED)||(this.model.get("state")===f.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){return null}var j=this.model.get("purged"),h=this.model.get("deleted"),i={title:_l("Edit attributes"),href:this.urls.edit,target:this.linkTarget,classes:"dataset-edit"};if(h||j){i.disabled=true;if(j){i.title=_l("Cannot edit attributes of datasets removed from disk")}else{if(h){i.title=_l("Undelete dataset to edit attributes")}}}else{if(this.model.get("state")===f.HistoryDatasetAssociation.STATES.UPLOAD){i.disabled=true;i.title=_l("This dataset must finish uploading before it can be edited")}else{if(this.model.get("state")===f.HistoryDatasetAssociation.STATES.NEW){i.disabled=true;i.title=_l("This dataset is not yet editable")}}}i.faIcon="fa-pencil";return faIconButton(i)},_render_deleteButton:function(){if((this.model.get("state")===f.HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){return null}var h=this,i={title:_l("Delete"),classes:"dataset-delete",onclick:function(){h.$el.find(".icon-btn.dataset-delete").trigger("mouseout");h.model["delete"]()}};if(this.model.get("deleted")||this.model.get("purged")){i={title:_l("Dataset is already deleted"),disabled:true}}i.faIcon="fa-times";return faIconButton(i)},_render_errButton:function(){if(this.model.get("state")!==f.HistoryDatasetAssociation.STATES.ERROR){return null}return faIconButton({title:_l("View or report this error"),href:this.urls.report_error,classes:"dataset-report-error-btn",target:this.linkTarget,faIcon:"fa-bug"})},_render_rerunButton:function(){return faIconButton({title:_l("Run this job again"),href:this.urls.rerun,classes:"dataset-rerun-btn",target:this.linkTarget,faIcon:"fa-refresh"})},_render_visualizationsButton:function(){var h=this.model.get("visualizations");if((!this.hasUser)||(!this.model.hasData())||(_.isEmpty(h))){return null}if(_.isObject(h[0])){return this._render_visualizationsFrameworkButton(h)}if(!this.urls.visualization){return null}var j=this.model.get("dbkey"),n=this.urls.visualization,k={},o={dataset_id:this.model.get("id"),hda_ldda:"hda"};if(j){o.dbkey=j}var i=faIconButton({title:_l("Visualize"),classes:"dataset-visualize-btn",faIcon:"fa-bar-chart-o"});function l(p){if(p==="trackster"){return c(n,o,j)}return function(){Galaxy.frame.add({title:"Visualization",type:"url",content:n+"/"+p+"?"+$.param(o)})}}function m(p){return p.charAt(0).toUpperCase()+p.slice(1)}if(h.length===1){i.attr("data-original-title",_l("Visualize in ")+_l(m(h[0])));i.click(l(h[0]))}else{_.each(h,function(p){k[_l(m(p))]=l(p)});make_popupmenu(i,k)}return i},_render_visualizationsFrameworkButton:function(h){if(!(this.model.hasData())||!(h&&!_.isEmpty(h))){return null}var j=faIconButton({title:_l("Visualize"),classes:"dataset-visualize-btn",faIcon:"fa-bar-chart-o"});if(h.length===1){var i=h[0];j.attr("data-original-title",_l("Visualize in ")+i.html);j.attr("href",i.href)}else{var k=[];_.each(h,function(l){l.func=function(m){if(Galaxy.frame&&Galaxy.frame.active){Galaxy.frame.add({title:"Visualization",type:"url",content:l.href});m.preventDefault();return false}return true};k.push(l);return false});PopupMenu.create(j,k)}return j},_buildNewRender:function(){var h=b.HDABaseView.prototype._buildNewRender.call(this);h.find(".dataset-deleted-msg").append(_l(' Click <a href="javascript:void(0);" class="dataset-undelete">here</a> to undelete it or <a href="javascript:void(0);" class="dataset-purge">here</a> to immediately remove it from disk'));h.find(".dataset-hidden-msg").append(_l(' Click <a href="javascript:void(0);" class="dataset-unhide">here</a> to unhide it'));return h},_render_body_failed_metadata:function(){var i=$("<a/>").attr({href:this.urls.edit,target:this.linkTarget}).text(_l("set it manually or retry auto-detection")),h=$("<span/>").text(". "+_l("You may be able to")+" ").append(i),j=b.HDABaseView.prototype._render_body_failed_metadata.call(this);j.find(".warningmessagesmall strong").append(h);return j},_render_body_error:function(){var h=b.HDABaseView.prototype._render_body_error.call(this);h.find(".dataset-actions .left").prepend(this._render_errButton());return h},_render_body_ok:function(){var h=b.HDABaseView.prototype._render_body_ok.call(this);if(this.model.isDeletedOrPurged()){return h}this.makeDbkeyEditLink(h);if(this.hasUser){h.find(".dataset-actions .left").append(this._render_visualizationsButton());this._renderTags(h);this._renderAnnotation(h)}return h},_renderTags:function(h){var i=this;this.tagsEditor=new a.TagsEditor({model:this.model,el:h.find(".tags-display"),onshowFirstTime:function(){this.render()},onshow:function(){i.tagsEditorShown=true},onhide:function(){i.tagsEditorShown=false},$activator:faIconButton({title:_l("Edit dataset tags"),classes:"dataset-tag-btn",faIcon:"fa-tags"}).appendTo(h.find(".dataset-actions .right"))});if(this.tagsEditorShown){this.tagsEditor.toggle(true)}},_renderAnnotation:function(h){var i=this;this.annotationEditor=new e.AnnotationEditor({model:this.model,el:h.find(".annotation-display"),onshowFirstTime:function(){this.render()},onshow:function(){i.annotationEditorShown=true},onhide:function(){i.annotationEditorShown=false},$activator:faIconButton({title:_l("Edit dataset annotation"),classes:"dataset-annotate-btn",faIcon:"fa-comment"}).appendTo(h.find(".dataset-actions .right"))});if(this.annotationEditorShown){this.annotationEditor.toggle(true)}},makeDbkeyEditLink:function(i){if(this.model.get("metadata_dbkey")==="?"&&!this.model.isDeletedOrPurged()){var h=$('<a class="value">?</a>').attr("href",this.urls.edit).attr("target",this.linkTarget);i.find(".dataset-dbkey .value").replaceWith(h)}},events:_.extend(_.clone(b.HDABaseView.prototype.events),{"click .dataset-undelete":function(h){this.model.undelete();return false},"click .dataset-unhide":function(h){this.model.unhide();return false},"click .dataset-purge":"confirmPurge"}),confirmPurge:function d(h){this.model.purge();return false},toString:function(){var h=(this.model)?(this.model+""):("(no model)");return"HDAView("+h+")"}});function c(h,j,i){return function(){var k={};if(i){k["f-dbkey"]=i}$.ajax({url:h+"/list_tracks?"+$.param(k),dataType:"html",error:function(){alert(("Could not add this dataset to browser")+".")},success:function(l){var m=window.parent;m.Galaxy.modal.show({title:"View Data in a New or Saved Visualization",buttons:{Cancel:function(){m.Galaxy.modal.hide()},"View in saved visualization":function(){m.Galaxy.modal.show({title:"Add Data to Saved Visualization",body:l,buttons:{Cancel:function(){m.Galaxy.modal.hide()},"Add to visualization":function(){$(m.document).find("input[name=id]:checked").each(function(){m.Galaxy.modal.hide();var n=$(this).val();j.id=n;m.Galaxy.frame.add({title:"Trackster",type:"url",content:h+"/trackster?"+$.param(j)})})}}})},"View in new visualization":function(){m.Galaxy.modal.hide();var n=h+"/trackster?"+$.param(j);m.Galaxy.frame.add({title:"Trackster",type:"url",content:n})}}})}});return false}}return{HDAEditView:g}});
\ No newline at end of file
diff -r c2a0ca50e6400bff4b9dc549db3fe14305e4473a -r 8346ec4baa3992f4dc0161f0fc79a0ba893c0a63 static/scripts/packed/mvc/dataset/hda-model.js
--- a/static/scripts/packed/mvc/dataset/hda-model.js
+++ b/static/scripts/packed/mvc/dataset/hda-model.js
@@ -1,1 +1,1 @@
-define(["mvc/base-mvc"],function(b){var e=Backbone.Model.extend(b.LoggableMixin).extend({defaults:{history_id:null,model_class:"HistoryDatasetAssociation",hid:0,id:null,name:"(unnamed dataset)",state:"new",deleted:false,visible:true,accessible:true,purged:false,data_type:"",file_size:0,file_ext:"",meta_files:[],misc_blurb:"",misc_info:"",tags:[],annotation:""},urlRoot:galaxy_config.root+"api/histories/",url:function(){return this.urlRoot+this.get("history_id")+"/contents/"+this.get("id")},urls:function(){var j=this.get("id");if(!j){return{}}var i={purge:galaxy_config.root+"datasets/"+j+"/purge_async",display:galaxy_config.root+"datasets/"+j+"/display/?preview=True",edit:galaxy_config.root+"datasets/"+j+"/edit",download:galaxy_config.root+"datasets/"+j+"/display?to_ext="+this.get("file_ext"),report_error:galaxy_config.root+"dataset/errors?id="+j,rerun:galaxy_config.root+"tool_runner/rerun?id="+j,show_params:galaxy_config.root+"datasets/"+j+"/show_params",visualization:galaxy_config.root+"visualization",annotation:{get:galaxy_config.root+"dataset/get_annotation_async?id="+j,set:galaxy_config.root+"dataset/annotate_async?id="+j},meta_download:galaxy_config.root+"dataset/get_metadata_file?hda_id="+j+"&metadata_name="};return i},initialize:function(i){this.log(this+".initialize",this.attributes);this.log("\tparent history_id: "+this.get("history_id"));if(!this.get("accessible")){this.set("state",e.STATES.NOT_VIEWABLE)}this._setUpListeners()},_setUpListeners:function(){this.on("change:state",function(j,i){this.log(this+" has changed state:",j,i);if(this.inReadyState()){this.trigger("state:ready",j,i,this.previous("state"))}})},isDeletedOrPurged:function(){return(this.get("deleted")||this.get("purged"))},isVisible:function(j,k){var i=true;if((!j)&&(this.get("deleted")||this.get("purged"))){i=false}if((!k)&&(!this.get("visible"))){i=false}return i},hidden:function(){return !this.get("visible")},inReadyState:function(){var i=_.contains(e.READY_STATES,this.get("state"));return(this.isDeletedOrPurged()||i)},hasDetails:function(){return _.has(this.attributes,"genome_build")},hasData:function(){return(this.get("file_size")>0)},"delete":function d(i){if(this.get("deleted")){return jQuery.when()}return this.save({deleted:true},i)},undelete:function a(i){if(!this.get("deleted")||this.get("purged")){return jQuery.when()}return this.save({deleted:false},i)},hide:function c(i){if(!this.get("visible")){return jQuery.when()}return this.save({visible:false},i)},unhide:function h(i){if(this.get("visible")){return jQuery.when()}return this.save({visible:true},i)},purge:function g(i){if(this.get("purged")){return jQuery.when()}i=i||{};i.url=galaxy_config.root+"datasets/"+this.get("id")+"/purge_async";var j=this,k=jQuery.ajax(i);k.done(function(n,l,m){j.set({deleted:true,purged:true})});k.fail(function(p,l,o){var m=_l("Unable to purge dataset");var n=("Removal of datasets by users is not allowed in this Galaxy instance");if(p.responseJSON&&p.responseJSON.error){m=p.responseJSON.error}else{if(p.responseText.indexOf(n)!==-1){m=n}}p.responseText=m;j.trigger("error",j,p,i,_l(m),{error:m})});return k},searchAttributes:["name","file_ext","genome_build","misc_blurb","misc_info","annotation","tags"],searchAliases:{title:"name",format:"file_ext",database:"genome_build",blurb:"misc_blurb",description:"misc_blurb",info:"misc_info",tag:"tags"},searchAttribute:function(k,i){var j=this.get(k);if(!i||(j===undefined||j===null)){return false}if(_.isArray(j)){return this._searchArrayAttribute(j,i)}return(j.toString().toLowerCase().indexOf(i.toLowerCase())!==-1)},_searchArrayAttribute:function(j,i){i=i.toLowerCase();return _.any(j,function(k){return(k.toString().toLowerCase().indexOf(i.toLowerCase())!==-1)})},search:function(i){var j=this;return _.filter(this.searchAttributes,function(k){return j.searchAttribute(k,i)})},matches:function(j){var l="=",i=j.split(l);if(i.length>=2){var k=i[0];k=this.searchAliases[k]||k;return this.searchAttribute(k,i[1])}return !!this.search(j).length},matchesAll:function(j){var i=this;j=j.match(/(".*"|\w*=".*"|\S*)/g).filter(function(k){return !!k});return _.all(j,function(k){k=k.replace(/"/g,"");return i.matches(k)})},toString:function(){var i=this.get("id")||"";if(this.get("name")){i=this.get("hid")+' :"'+this.get("name")+'",'+i}return"HDA("+i+")"}});e.STATES={UPLOAD:"upload",QUEUED:"queued",RUNNING:"running",SETTING_METADATA:"setting_metadata",NEW:"new",EMPTY:"empty",OK:"ok",PAUSED:"paused",FAILED_METADATA:"failed_metadata",NOT_VIEWABLE:"noPermission",DISCARDED:"discarded",ERROR:"error"};e.READY_STATES=[e.STATES.NEW,e.STATES.OK,e.STATES.EMPTY,e.STATES.PAUSED,e.STATES.FAILED_METADATA,e.STATES.NOT_VIEWABLE,e.STATES.DISCARDED,e.STATES.ERROR];e.NOT_READY_STATES=[e.STATES.UPLOAD,e.STATES.QUEUED,e.STATES.RUNNING,e.STATES.SETTING_METADATA];var f=Backbone.Collection.extend(b.LoggableMixin).extend({model:e,urlRoot:galaxy_config.root+"api/histories",url:function(){return this.urlRoot+"/"+this.historyId+"/contents"},initialize:function(j,i){i=i||{};this.historyId=i.historyId},ids:function(){return this.map(function(i){return i.id})},notReady:function(){return this.filter(function(i){return !i.inReadyState()})},running:function(){var i=[];this.each(function(j){if(!j.inReadyState()){i.push(j.get("id"))}});return i},getByHid:function(i){return _.first(this.filter(function(j){return j.get("hid")===i}))},getVisible:function(i,l,k){k=k||[];var j=new f(this.filter(function(m){return m.isVisible(i,l)}));_.each(k,function(m){if(!_.isFunction(m)){return}j=new f(j.filter(m))});return j},haveDetails:function(){return this.all(function(i){return i.hasDetails()})},fetchAllDetails:function(j){j=j||{};var i={details:"all"};j.data=(j.data)?(_.extend(j.data,i)):(i);return this.fetch(j)},ajaxQueue:function(l,k){var j=jQuery.Deferred(),i=this.length,n=[];if(!i){j.resolve([]);return j}var m=this.chain().reverse().map(function(p,o){return function(){var q=l.call(p,k);q.done(function(r){j.notify({curr:o,total:i,response:r,model:p})});q.always(function(r){n.push(r);if(m.length){m.shift()()}else{j.resolve(n)}})}}).value();m.shift()();return j},matches:function(i){return this.filter(function(j){return j.matches(i)})},set:function(k,i){var j=this;k=_.map(k,function(m){var n=j.get(m.id);if(!n){return m}var l=n.toJSON();_.extend(l,m);return l});Backbone.Collection.prototype.set.call(this,k,i)},toString:function(){return(["HDACollection(",[this.historyId,this.length].join(),")"].join(""))}});return{HistoryDatasetAssociation:e,HDACollection:f}});
\ No newline at end of file
+define(["mvc/base-mvc"],function(b){var e=Backbone.Model.extend(b.LoggableMixin).extend({defaults:{history_id:null,model_class:"HistoryDatasetAssociation",hid:0,id:null,name:"(unnamed dataset)",state:"new",deleted:false,visible:true,accessible:true,purged:false,data_type:"",file_size:0,file_ext:"",meta_files:[],misc_blurb:"",misc_info:"",tags:[],annotation:""},urlRoot:galaxy_config.root+"api/histories/",url:function(){return this.urlRoot+this.get("history_id")+"/contents/"+this.get("id")},urls:function(){var j=this.get("id");if(!j){return{}}var i={purge:galaxy_config.root+"datasets/"+j+"/purge_async",display:galaxy_config.root+"datasets/"+j+"/display/?preview=True",edit:galaxy_config.root+"datasets/"+j+"/edit",download:galaxy_config.root+"datasets/"+j+"/display?to_ext="+this.get("file_ext"),report_error:galaxy_config.root+"dataset/errors?id="+j,rerun:galaxy_config.root+"tool_runner/rerun?id="+j,show_params:galaxy_config.root+"datasets/"+j+"/show_params",visualization:galaxy_config.root+"visualization",annotation:{get:galaxy_config.root+"dataset/get_annotation_async?id="+j,set:galaxy_config.root+"dataset/annotate_async?id="+j},meta_download:galaxy_config.root+"dataset/get_metadata_file?hda_id="+j+"&metadata_name="};return i},initialize:function(i){this.log(this+".initialize",this.attributes);this.log("\tparent history_id: "+this.get("history_id"));if(!this.get("accessible")){this.set("state",e.STATES.NOT_VIEWABLE)}this._setUpListeners()},_setUpListeners:function(){this.on("change:state",function(j,i){this.log(this+" has changed state:",j,i);if(this.inReadyState()){this.trigger("state:ready",j,i,this.previous("state"))}})},isDeletedOrPurged:function(){return(this.get("deleted")||this.get("purged"))},isVisible:function(j,k){var i=true;if((!j)&&(this.get("deleted")||this.get("purged"))){i=false}if((!k)&&(!this.get("visible"))){i=false}return i},hidden:function(){return !this.get("visible")},inReadyState:function(){var i=_.contains(e.READY_STATES,this.get("state"));return(this.isDeletedOrPurged()||i)},hasDetails:function(){return _.has(this.attributes,"genome_build")},hasData:function(){return(this.get("file_size")>0)},"delete":function d(i){if(this.get("deleted")){return jQuery.when()}return this.save({deleted:true},i)},undelete:function a(i){if(!this.get("deleted")||this.get("purged")){return jQuery.when()}return this.save({deleted:false},i)},hide:function c(i){if(!this.get("visible")){return jQuery.when()}return this.save({visible:false},i)},unhide:function h(i){if(this.get("visible")){return jQuery.when()}return this.save({visible:true},i)},purge:function g(i){if(this.get("purged")){return jQuery.when()}i=i||{};i.url=galaxy_config.root+"datasets/"+this.get("id")+"/purge_async";var j=this,k=jQuery.ajax(i);k.done(function(n,l,m){j.set({deleted:true,purged:true})});k.fail(function(p,l,o){var m=_l("Unable to purge dataset");var n=("Removal of datasets by users is not allowed in this Galaxy instance");if(p.responseJSON&&p.responseJSON.error){m=p.responseJSON.error}else{if(p.responseText.indexOf(n)!==-1){m=n}}p.responseText=m;j.trigger("error",j,p,i,_l(m),{error:m})});return k},searchAttributes:["name","file_ext","genome_build","misc_blurb","misc_info","annotation","tags"],searchAliases:{title:"name",format:"file_ext",database:"genome_build",blurb:"misc_blurb",description:"misc_blurb",info:"misc_info",tag:"tags"},searchAttribute:function(k,i){var j=this.get(k);if(!i||(j===undefined||j===null)){return false}if(_.isArray(j)){return this._searchArrayAttribute(j,i)}return(j.toString().toLowerCase().indexOf(i.toLowerCase())!==-1)},_searchArrayAttribute:function(j,i){i=i.toLowerCase();return _.any(j,function(k){return(k.toString().toLowerCase().indexOf(i.toLowerCase())!==-1)})},search:function(i){var j=this;return _.filter(this.searchAttributes,function(k){return j.searchAttribute(k,i)})},matches:function(j){var l="=",i=j.split(l);if(i.length>=2){var k=i[0];k=this.searchAliases[k]||k;return this.searchAttribute(k,i[1])}return !!this.search(j).length},matchesAll:function(j){var i=this;j=j.match(/(".*"|\w*=".*"|\S*)/g).filter(function(k){return !!k});return _.all(j,function(k){k=k.replace(/"/g,"");return i.matches(k)})},toString:function(){var i=this.get("id")||"";if(this.get("name")){i=this.get("hid")+' :"'+this.get("name")+'",'+i}return"HDA("+i+")"}});e.STATES={UPLOAD:"upload",QUEUED:"queued",RUNNING:"running",SETTING_METADATA:"setting_metadata",NEW:"new",EMPTY:"empty",OK:"ok",PAUSED:"paused",FAILED_METADATA:"failed_metadata",NOT_VIEWABLE:"noPermission",DISCARDED:"discarded",ERROR:"error"};e.READY_STATES=[e.STATES.OK,e.STATES.EMPTY,e.STATES.PAUSED,e.STATES.FAILED_METADATA,e.STATES.NOT_VIEWABLE,e.STATES.DISCARDED,e.STATES.ERROR];e.NOT_READY_STATES=[e.STATES.UPLOAD,e.STATES.QUEUED,e.STATES.RUNNING,e.STATES.SETTING_METADATA,e.STATES.NEW];var f=Backbone.Collection.extend(b.LoggableMixin).extend({model:e,urlRoot:galaxy_config.root+"api/histories",url:function(){return this.urlRoot+"/"+this.historyId+"/contents"},initialize:function(j,i){i=i||{};this.historyId=i.historyId},ids:function(){return this.map(function(i){return i.id})},notReady:function(){return this.filter(function(i){return !i.inReadyState()})},running:function(){var i=[];this.each(function(j){if(!j.inReadyState()){i.push(j.get("id"))}});return i},getByHid:function(i){return _.first(this.filter(function(j){return j.get("hid")===i}))},getVisible:function(i,l,k){k=k||[];var j=new f(this.filter(function(m){return m.isVisible(i,l)}));_.each(k,function(m){if(!_.isFunction(m)){return}j=new f(j.filter(m))});return j},haveDetails:function(){return this.all(function(i){return i.hasDetails()})},fetchAllDetails:function(j){j=j||{};var i={details:"all"};j.data=(j.data)?(_.extend(j.data,i)):(i);return this.fetch(j)},ajaxQueue:function(l,k){var j=jQuery.Deferred(),i=this.length,n=[];if(!i){j.resolve([]);return j}var m=this.chain().reverse().map(function(p,o){return function(){var q=l.call(p,k);q.done(function(r){j.notify({curr:o,total:i,response:r,model:p})});q.always(function(r){n.push(r);if(m.length){m.shift()()}else{j.resolve(n)}})}}).value();m.shift()();return j},matches:function(i){return this.filter(function(j){return j.matches(i)})},set:function(k,i){var j=this;k=_.map(k,function(m){var n=j.get(m.id);if(!n){return m}var l=n.toJSON();_.extend(l,m);return l});Backbone.Collection.prototype.set.call(this,k,i)},toString:function(){return(["HDACollection(",[this.historyId,this.length].join(),")"].join(""))}});return{HistoryDatasetAssociation:e,HDACollection:f}});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
4 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/8c4e3b85aa3b/
Changeset: 8c4e3b85aa3b
Branch: next-stable
User: natefoo
Date: 2014-04-15 01:26:24
Summary: Close next-stable branch.
Affected #: 0 files
https://bitbucket.org/galaxy/galaxy-central/commits/9e53251b0b7e/
Changeset: 9e53251b0b7e
Branch: stable
User: natefoo
Date: 2014-04-15 01:27:21
Summary: Update stable branch from next-stable for release.
Affected #: 749 files
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc .hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -77,6 +77,7 @@
tool-data/shared/ucsc/builds.txt
tool-data/shared/ensembl/builds.txt
tool-data/shared/ucsc/publicbuilds.txt
+tool-data/shared/ucsc/ucsc_build_sites.txt
tool-data/*.loc
tool-data/genome/*
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc README.txt
--- a/README.txt
+++ b/README.txt
@@ -26,6 +26,6 @@
on adding tools can be found on the Galaxy website (linked above).
Not all dependencies are included for the tools provided in the sample
-tool_conf.xml. A full list of external dependencies is available at:
+tool_conf.xml. A full list of external dependencies is available at:
-http://wiki.g2.bx.psu.edu/Admin/Tools/Tool%20Dependencies
+https://wiki.galaxyproject.org/Admin/Tools/ToolDependencies
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/additional_template_paths.xml
--- /dev/null
+++ b/config/plugins/visualizations/additional_template_paths.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- these relative paths can contain common templates importable by all visualization plugins -->
+<paths>
+ <path>common/templates</path>
+</paths>
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/Gruntfile.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/Gruntfile.js
@@ -0,0 +1,24 @@
+// NOTE: use 'sudo npm install .', then 'grunt' to use this file
+module.exports = function(grunt) {
+ grunt.initConfig({
+ pkg: grunt.file.readJSON('package.json'),
+ requirejs: {
+ compile: {
+ options: {
+ baseUrl : "../../../../static/scripts/",
+ paths : {
+ "plugin": "../../config/plugins/visualizations/charts/static"
+ },
+ shim : {
+ "libs/underscore": { exports: "_" },
+ "libs/backbone/backbone": { exports: "Backbone" }
+ },
+ name : "plugin/app",
+ out : "static/build-app.js",
+ }
+ }
+ }
+ });
+ grunt.loadNpmTasks('grunt-contrib-requirejs');
+ grunt.registerTask( 'default', [ 'requirejs' ]);
+};
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/config/charts.xml
--- a/config/plugins/visualizations/charts/config/charts.xml
+++ b/config/plugins/visualizations/charts/config/charts.xml
@@ -7,15 +7,9 @@
<test type="isinstance" test_attr="datatype" result_type="datatype">tabular.Tabular</test><to_param param_attr="id">dataset_id</to_param></data_source>
- <data_source>
- <model_class>Visualization</model_class>
- <test test_attr="type">charts</test>
- <to_param param_attr="id">visualization_id</to_param>
- </data_source></data_sources><params><param type="dataset" var_name_in_template="hda" required="true">dataset_id</param>
- <param type="visualization" var_name_in_template="visualization">visualization_id</param></params><template>charts.mako</template></visualization>
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/package.json
--- /dev/null
+++ b/config/plugins/visualizations/charts/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "galaxy-charts",
+ "version": "0.0.0",
+ "description": "Charts visualization plugin for the Galaxy informatics framework",
+ "main": " ",
+ "keywords": [
+ "galaxy",
+ "visualization",
+ "d3"
+ ],
+ "author": "Aysam Guerler",
+ "license": "BSD",
+ "devDependencies": {
+ "grunt": "~0.4.1",
+ "grunt-cli": "~0.1.9",
+ "grunt-contrib-requirejs": "~0.4.3"
+ }
+}
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/app.js
--- a/config/plugins/visualizations/charts/static/app.js
+++ b/config/plugins/visualizations/charts/static/app.js
@@ -1,10 +1,12 @@
// dependencies
-define(['library/portlet', 'library/ui', 'library/utils',
- 'views/charts', 'views/viewport', 'views/chart', 'views/group',
- 'models/config', 'models/datasets', 'models/chart', 'models/charts', 'models/group', 'models/types'],
- function( Portlet, Ui, Utils,
- ChartsView, ViewportView, ChartView, GroupView,
- Config, Datasets, Chart, Charts, Group, Types
+define(['mvc/ui/ui-modal', 'mvc/ui/ui-portlet', 'plugin/library/ui', 'utils/utils',
+ 'plugin/library/jobs', 'plugin/library/datasets', 'plugin/library/storage',
+ 'plugin/views/viewer', 'plugin/views/editor',
+ 'plugin/models/config', 'plugin/models/chart',
+ 'plugin/charts/types'],
+ function( Modal, Portlet, Ui, Utils, Jobs, Datasets, Storage,
+ ViewerView, EditorView,
+ Config, Chart, Types
) {
// widget
@@ -13,66 +15,75 @@
// initialize
initialize: function(options)
{
+ // deactivate all debugs outputs
+ //window.console.debug = function() {};
+
// link options
this.options = options;
- // link galaxy
- this.modal = parent.Galaxy.modal;
+ // link galaxy modal or create one
+ if (Galaxy && Galaxy.modal) {
+ this.modal = Galaxy.modal;
+ } else {
+ this.modal = new Modal.View();
+ }
- // create configuration model
+ //
+ // models
+ //
this.config = new Config();
-
- // create chart models
this.types = new Types();
this.chart = new Chart();
- this.charts = new Charts();
- this.group = new Group();
- // create dataset handler
+ //
+ // libraries
+ //
+ this.jobs = new Jobs(this);
this.datasets = new Datasets(this);
+ this.storage = new Storage(this);
- // create views
- this.charts_view = new ChartsView(this);
- this.group_view = new GroupView(this);
- this.chart_view = new ChartView(this);
- this.viewport_view = new ViewportView(this);
-
- // append view port to charts viewer
- this.charts_view.append(this.viewport_view.$el);
-
- // create portlet
- if (!this.options.config.widget) {
- this.portlet = new Portlet({icon : 'fa-bar-chart-o', label : 'Charts'});
- } else {
- this.portlet = $('<div></div>');
- }
+ //
+ // views
+ //
+ this.viewer_view = new ViewerView(this);
+ this.editor_view = new EditorView(this);
// append views
- this.portlet.append(this.charts_view.$el);
- this.portlet.append(this.group_view.$el);
- this.portlet.append(this.chart_view.$el);
-
- // set element
- if (!this.options.config.widget) {
- this.setElement(this.portlet.$el);
+ this.$el.append(this.viewer_view.$el);
+ this.$el.append(this.editor_view.$el);
+
+ // pick start screen
+ if (!this.storage.load()) {
+ // show editor
+ this.go('editor');
} else {
- this.setElement(this.portlet);
+ // show viewport
+ this.go('viewer');
+
+ // draw chart
+ var self = this;
+ this.chart.deferred.execute(function() {
+ self.chart.trigger('redraw');
+ });
}
-
- // hide views
- this.group_view.$el.hide();
- this.charts_view.$el.hide();
-
- // events
- var self = this;
- this.config.on('change:current_view', function() {
- self._showCurrent();
- });
},
- // current view
- _showCurrent: function() {
+ // loads a view and makes sure that all others are hidden
+ go: function(view_id) {
+ // hide all tooltips
+ $('.tooltip').hide();
+ // pick view
+ switch (view_id) {
+ case 'editor' :
+ this.editor_view.show();
+ this.viewer_view.hide();
+ break;
+ case 'viewer' :
+ this.editor_view.hide();
+ this.viewer_view.show();
+ break;
+ }
},
// execute command
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/build-app.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/build-app.js
@@ -0,0 +1,6 @@
+// Underscore.js 1.4.4
+// http://underscorejs.org
+// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore may be freely distributed under the MIT license.
+
+(function(){var e=this,t=e._,n={},r=Array.prototype,i=Object.prototype,s=Function.prototype,o=r.push,u=r.slice,a=r.concat,f=i.toString,l=i.hasOwnProperty,c=r.forEach,h=r.map,p=r.reduce,d=r.reduceRight,v=r.filter,m=r.every,g=r.some,y=r.indexOf,b=r.lastIndexOf,w=Array.isArray,E=Object.keys,S=s.bind,x=function(e){if(e instanceof x)return e;if(!(this instanceof x))return new x(e);this._wrapped=e};typeof exports!="undefined"?(typeof module!="undefined"&&module.exports&&(exports=module.exports=x),exports._=x):e._=x,x.VERSION="1.4.4";var T=x.each=x.forEach=function(e,t,r){if(e==null)return;if(c&&e.forEach===c)e.forEach(t,r);else if(e.length===+e.length){for(var i=0,s=e.length;i<s;i++)if(t.call(r,e[i],i,e)===n)return}else for(var o in e)if(x.has(e,o)&&t.call(r,e[o],o,e)===n)return};x.map=x.collect=function(e,t,n){var r=[];return e==null?r:h&&e.map===h?e.map(t,n):(T(e,function(e,i,s){r.push(t.call(n,e,i,s))}),r)};var N="Reduce of empty array with no initial value";x.reduce=x.foldl=x.inject=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(p&&e.reduce===p)return r&&(t=x.bind(t,r)),i?e.reduce(t,n):e.reduce(t);T(e,function(e,s,o){i?n=t.call(r,n,e,s,o):(n=e,i=!0)});if(!i)throw new TypeError(N);return n},x.reduceRight=x.foldr=function(e,t,n,r){var i=arguments.length>2;e==null&&(e=[]);if(d&&e.reduceRight===d)return r&&(t=x.bind(t,r)),i?e.reduceRight(t,n):e.reduceRight(t);var s=e.length;if(s!==+s){var o=x.keys(e);s=o.length}T(e,function(u,a,f){a=o?o[--s]:--s,i?n=t.call(r,n,e[a],a,f):(n=e[a],i=!0)});if(!i)throw new TypeError(N);return n},x.find=x.detect=function(e,t,n){var r;return C(e,function(e,i,s){if(t.call(n,e,i,s))return r=e,!0}),r},x.filter=x.select=function(e,t,n){var r=[];return e==null?r:v&&e.filter===v?e.filter(t,n):(T(e,function(e,i,s){t.call(n,e,i,s)&&r.push(e)}),r)},x.reject=function(e,t,n){return x.filter(e,function(e,r,i){return!t.call(n,e,r,i)},n)},x.every=x.all=function(e,t,r){t||(t=x.identity);var i=!0;return e==null?i:m&&e.every===m?e.every(t,r):(T(e,function(e,s,o){if(!(i=i&&t.call(r,e,s,o)))return n}),!!i)};var C=x.some=x.any=function(e,t,r){t||(t=x.identity);var i=!1;return e==null?i:g&&e.some===g?e.some(t,r):(T(e,function(e,s,o){if(i||(i=t.call(r,e,s,o)))return n}),!!i)};x.contains=x.include=function(e,t){return e==null?!1:y&&e.indexOf===y?e.indexOf(t)!=-1:C(e,function(e){return e===t})},x.invoke=function(e,t){var n=u.call(arguments,2),r=x.isFunction(t);return x.map(e,function(e){return(r?t:e[t]).apply(e,n)})},x.pluck=function(e,t){return x.map(e,function(e){return e[t]})},x.where=function(e,t,n){return x.isEmpty(t)?n?void 0:[]:x[n?"find":"filter"](e,function(e){for(var n in t)if(t[n]!==e[n])return!1;return!0})},x.findWhere=function(e,t){return x.where(e,t,!0)},x.max=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.max.apply(Math,e);if(!t&&x.isEmpty(e))return-Infinity;var r={computed:-Infinity,value:-Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o>=r.computed&&(r={value:e,computed:o})}),r.value},x.min=function(e,t,n){if(!t&&x.isArray(e)&&e[0]===+e[0]&&e.length<65535)return Math.min.apply(Math,e);if(!t&&x.isEmpty(e))return Infinity;var r={computed:Infinity,value:Infinity};return T(e,function(e,i,s){var o=t?t.call(n,e,i,s):e;o<r.computed&&(r={value:e,computed:o})}),r.value},x.shuffle=function(e){var t,n=0,r=[];return T(e,function(e){t=x.random(n++),r[n-1]=r[t],r[t]=e}),r};var k=function(e){return x.isFunction(e)?e:function(t){return t[e]}};x.sortBy=function(e,t,n){var r=k(t);return x.pluck(x.map(e,function(e,t,i){return{value:e,index:t,criteria:r.call(n,e,t,i)}}).sort(function(e,t){var n=e.criteria,r=t.criteria;if(n!==r){if(n>r||n===void 0)return 1;if(n<r||r===void 0)return-1}return e.index<t.index?-1:1}),"value")};var L=function(e,t,n,r){var i={},s=k(t==null?x.identity:t);return T(e,function(t,o){var u=s.call(n,t,o,e);r(i,u,t)}),i};x.groupBy=function(e,t,n){return L(e,t,n,function(e,t,n){(x.has(e,t)?e[t]:e[t]=[]).push(n)})},x.countBy=function(e,t,n){return L(e,t,n,function(e,t){x.has(e,t)||(e[t]=0),e[t]++})},x.sortedIndex=function(e,t,n,r){n=n==null?x.identity:k(n);var i=n.call(r,t),s=0,o=e.length;while(s<o){var u=s+o>>>1;n.call(r,e[u])<i?s=u+1:o=u}return s},x.toArray=function(e){return e?x.isArray(e)?u.call(e):e.length===+e.length?x.map(e,x.identity):x.values(e):[]},x.size=function(e){return e==null?0:e.length===+e.length?e.length:x.keys(e).length},x.first=x.head=x.take=function(e,t,n){return e==null?void 0:t!=null&&!n?u.call(e,0,t):e[0]},x.initial=function(e,t,n){return u.call(e,0,e.length-(t==null||n?1:t))},x.last=function(e,t,n){return e==null?void 0:t!=null&&!n?u.call(e,Math.max(e.length-t,0)):e[e.length-1]},x.rest=x.tail=x.drop=function(e,t,n){return u.call(e,t==null||n?1:t)},x.compact=function(e){return x.filter(e,x.identity)};var A=function(e,t,n){return T(e,function(e){x.isArray(e)?t?o.apply(n,e):A(e,t,n):n.push(e)}),n};x.flatten=function(e,t){return A(e,t,[])},x.without=function(e){return x.difference(e,u.call(arguments,1))},x.uniq=x.unique=function(e,t,n,r){x.isFunction(t)&&(r=n,n=t,t=!1);var i=n?x.map(e,n,r):e,s=[],o=[];return T(i,function(n,r){if(t?!r||o[o.length-1]!==n:!x.contains(o,n))o.push(n),s.push(e[r])}),s},x.union=function(){return x.uniq(a.apply(r,arguments))},x.intersection=function(e){var t=u.call(arguments,1);return x.filter(x.uniq(e),function(e){return x.every(t,function(t){return x.indexOf(t,e)>=0})})},x.difference=function(e){var t=a.apply(r,u.call(arguments,1));return x.filter(e,function(e){return!x.contains(t,e)})},x.zip=function(){var e=u.call(arguments),t=x.max(x.pluck(e,"length")),n=new Array(t);for(var r=0;r<t;r++)n[r]=x.pluck(e,""+r);return n},x.unzip=function(e){var t=[];return x.each(e,function(e,n){x.each(e,function(e,r){t.length<=r&&(t[r]=[]),t[r][n]=e})}),t},x.object=function(e,t){if(e==null)return{};var n={};for(var r=0,i=e.length;r<i;r++)t?n[e[r]]=t[r]:n[e[r][0]]=e[r][1];return n},x.indexOf=function(e,t,n){if(e==null)return-1;var r=0,i=e.length;if(n){if(typeof n!="number")return r=x.sortedIndex(e,t),e[r]===t?r:-1;r=n<0?Math.max(0,i+n):n}if(y&&e.indexOf===y)return e.indexOf(t,n);for(;r<i;r++)if(e[r]===t)return r;return-1},x.lastIndexOf=function(e,t,n){if(e==null)return-1;var r=n!=null;if(b&&e.lastIndexOf===b)return r?e.lastIndexOf(t,n):e.lastIndexOf(t);var i=r?n:e.length;while(i--)if(e[i]===t)return i;return-1},x.range=function(e,t,n){arguments.length<=1&&(t=e||0,e=0),n=arguments[2]||1;var r=Math.max(Math.ceil((t-e)/n),0),i=0,s=new Array(r);while(i<r)s[i++]=e,e+=n;return s};var O=function(){};x.bind=function(e,t){var n,r;if(e.bind===S&&S)return S.apply(e,u.call(arguments,1));if(!x.isFunction(e))throw new TypeError;return n=u.call(arguments,2),r=function(){if(this instanceof r){O.prototype=e.prototype;var i=new O;O.prototype=null;var s=e.apply(i,n.concat(u.call(arguments)));return Object(s)===s?s:i}return e.apply(t,n.concat(u.call(arguments)))}},x.partial=function(e){var t=u.call(arguments,1);return function(){return e.apply(this,t.concat(u.call(arguments)))}},x.bindAll=function(e){var t=u.call(arguments,1);if(t.length===0)throw new Error("bindAll must be passed function names");return T(t,function(t){e[t]=x.bind(e[t],e)}),e},x.memoize=function(e,t){var n={};return t||(t=x.identity),function(){var r=t.apply(this,arguments);return x.has(n,r)?n[r]:n[r]=e.apply(this,arguments)}},x.delay=function(e,t){var n=u.call(arguments,2);return setTimeout(function(){return e.apply(null,n)},t)},x.defer=function(e){return x.delay.apply(x,[e,1].concat(u.call(arguments,1)))},x.throttle=function(e,t,n){var r,i,s,o,u=0,a=function(){u=new Date,s=null,o=e.apply(r,i)};return function(){var f=new Date;!u&&n===!1&&(u=f);var l=t-(f-u);return r=this,i=arguments,l<=0?(clearTimeout(s),s=null,u=f,o=e.apply(r,i)):s||(s=setTimeout(a,l)),o}},x.debounce=function(e,t,n){var r,i;return function(){var s=this,o=arguments,u=function(){r=null,n||(i=e.apply(s,o))},a=n&&!r;return clearTimeout(r),r=setTimeout(u,t),a&&(i=e.apply(s,o)),i}},x.once=function(e){var t=!1,n;return function(){return t?n:(t=!0,n=e.apply(this,arguments),e=null,n)}},x.wrap=function(e,t){return function(){var n=[e];return o.apply(n,arguments),t.apply(this,n)}},x.compose=function(){var e=arguments;return function(){var t=arguments;for(var n=e.length-1;n>=0;n--)t=[e[n].apply(this,t)];return t[0]}},x.after=function(e,t){return e<=0?t():function(){if(--e<1)return t.apply(this,arguments)}},x.keys=E||function(e){if(e!==Object(e))throw new TypeError("Invalid object");var t=[];for(var n in e)x.has(e,n)&&t.push(n);return t},x.values=function(e){var t=[];for(var n in e)x.has(e,n)&&t.push(e[n]);return t},x.pairs=function(e){var t=[];for(var n in e)x.has(e,n)&&t.push([n,e[n]]);return t},x.invert=function(e){var t={};for(var n in e)x.has(e,n)&&(t[e[n]]=n);return t},x.functions=x.methods=function(e){var t=[];for(var n in e)x.isFunction(e[n])&&t.push(n);return t.sort()},x.extend=function(e){return T(u.call(arguments,1),function(t){if(t)for(var n in t)e[n]=t[n]}),e},x.pick=function(e){var t={},n=a.apply(r,u.call(arguments,1));return T(n,function(n){n in e&&(t[n]=e[n])}),t},x.omit=function(e){var t={},n=a.apply(r,u.call(arguments,1));for(var i in e)x.contains(n,i)||(t[i]=e[i]);return t},x.defaults=function(e){return T(u.call(arguments,1),function(t){if(t)for(var n in t)e[n]===void 0&&(e[n]=t[n])}),e},x.clone=function(e){return x.isObject(e)?x.isArray(e)?e.slice():x.extend({},e):e},x.tap=function(e,t){return t(e),e};var M=function(e,t,n,r){if(e===t)return e!==0||1/e==1/t;if(e==null||t==null)return e===t;e instanceof x&&(e=e._wrapped),t instanceof x&&(t=t._wrapped);var i=f.call(e);if(i!=f.call(t))return!1;switch(i){case"[object String]":return e==String(t);case"[object Number]":return e!=+e?t!=+t:e==0?1/e==1/t:e==+t;case"[object Date]":case"[object Boolean]":return+e==+t;case"[object RegExp]":return e.source==t.source&&e.global==t.global&&e.multiline==t.multiline&&e.ignoreCase==t.ignoreCase}if(typeof e!="object"||typeof t!="object")return!1;var s=n.length;while(s--)if(n[s]==e)return r[s]==t;n.push(e),r.push(t);var o=0,u=!0;if(i=="[object Array]"){o=e.length,u=o==t.length;if(u)while(o--)if(!(u=M(e[o],t[o],n,r)))break}else{var a=e.constructor,l=t.constructor;if(a!==l&&!(x.isFunction(a)&&a instanceof a&&x.isFunction(l)&&l instanceof l))return!1;for(var c in e)if(x.has(e,c)){o++;if(!(u=x.has(t,c)&&M(e[c],t[c],n,r)))break}if(u){for(c in t)if(x.has(t,c)&&!(o--))break;u=!o}}return n.pop(),r.pop(),u};x.isEqual=function(e,t){return M(e,t,[],[])},x.isEmpty=function(e){if(e==null)return!0;if(x.isArray(e)||x.isString(e))return e.length===0;for(var t in e)if(x.has(e,t))return!1;return!0},x.isElement=function(e){return!!e&&e.nodeType===1},x.isArray=w||function(e){return f.call(e)=="[object Array]"},x.isObject=function(e){return e===Object(e)},T(["Arguments","Function","String","Number","Date","RegExp"],function(e){x["is"+e]=function(t){return f.call(t)=="[object "+e+"]"}}),x.isArguments(arguments)||(x.isArguments=function(e){return!!e&&!!x.has(e,"callee")}),typeof /./!="function"&&(x.isFunction=function(e){return typeof e=="function"}),x.isFinite=function(e){return isFinite(e)&&!isNaN(parseFloat(e))},x.isNaN=function(e){return x.isNumber(e)&&e!=+e},x.isBoolean=function(e){return e===!0||e===!1||f.call(e)=="[object Boolean]"},x.isNull=function(e){return e===null},x.isUndefined=function(e){return e===void 0},x.has=function(e,t){return l.call(e,t)},x.noConflict=function(){return e._=t,this},x.identity=function(e){return e},x.times=function(e,t,n){var r=Array(e);for(var i=0;i<e;i++)r[i]=t.call(n,i);return r},x.random=function(e,t){return t==null&&(t=e,e=0),e+Math.floor(Math.random()*(t-e+1))};var _={escape:{"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"}};_.unescape=x.invert(_.escape);var D={escape:new RegExp("["+x.keys(_.escape).join("")+"]","g"),unescape:new RegExp("("+x.keys(_.unescape).join("|")+")","g")};x.each(["escape","unescape"],function(e){x[e]=function(t){return t==null?"":(""+t).replace(D[e],function(t){return _[e][t]})}}),x.result=function(e,t){if(e==null)return void 0;var n=e[t];return x.isFunction(n)?n.call(e):n},x.mixin=function(e){T(x.functions(e),function(t){var n=x[t]=e[t];x.prototype[t]=function(){var e=[this._wrapped];return o.apply(e,arguments),F.call(this,n.apply(x,e))}})};var P=0;x.uniqueId=function(e){var t=++P+"";return e?e+t:t},x.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var H=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},j=/\\|'|\r|\n|\t|\u2028|\u2029/g;x.template=function(e,t,n){var r;n=x.defaults({},n,x.templateSettings);var i=new RegExp([(n.escape||H).source,(n.interpolate||H).source,(n.evaluate||H).source].join("|")+"|$","g"),s=0,o="__p+='";e.replace(i,function(t,n,r,i,u){return o+=e.slice(s,u).replace(j,function(e){return"\\"+B[e]}),n&&(o+="'+\n((__t=("+n+"))==null?'':_.escape(__t))+\n'"),r&&(o+="'+\n((__t=("+r+"))==null?'':__t)+\n'"),i&&(o+="';\n"+i+"\n__p+='"),s=u+t.length,t}),o+="';\n",n.variable||(o="with(obj||{}){\n"+o+"}\n"),o="var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};\n"+o+"return __p;\n";try{r=new Function(n.variable||"obj","_",o)}catch(u){throw u.source=o,u}if(t)return r(t,x);var a=function(e){return r.call(this,e,x)};return a.source="function("+(n.variable||"obj")+"){\n"+o+"}",a},x.chain=function(e){return x(e).chain()};var F=function(e){return this._chain?x(e).chain():e};x.mixin(x),T(["pop","push","reverse","shift","sort","splice","unshift"],function(e){var t=r[e];x.prototype[e]=function(){var n=this._wrapped;return t.apply(n,arguments),(e=="shift"||e=="splice")&&n.length===0&&delete n[0],F.call(this,n)}}),T(["concat","join","slice"],function(e){var t=r[e];x.prototype[e]=function(){return F.call(this,t.apply(this._wrapped,arguments))}}),x.extend(x.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this),define("libs/underscore",function(e){return function(){var t,n;return t||e._}}(this)),define("utils/utils",["libs/underscore"],function(e){function t(e,t,r){n("GET",e,{},t,r)}function n(e,t,n,r,i){if(e=="GET"||e=="DELETE")t.indexOf("?")==-1?t+="?":t+="&",t+=$.param(n);var s=new XMLHttpRequest;s.open(e,t,!0),s.setRequestHeader("Accept","application/json"),s.setRequestHeader("Cache-Control","no-cache"),s.setRequestHeader("X-Requested-With","XMLHttpRequest"),s.setRequestHeader("Content-Type","application/json"),s.onloadend=function(){var e=s.status;try{response=jQuery.parseJSON(s.responseText)}catch(t){response=s.responseText}e==200?r&&r(response):i&&i(response)},e=="GET"||e=="DELETE"?s.send():s.send(JSON.stringify(n))}function r(e,t){var n=$('<div class="'+e+'"></div>');n.appendTo(":eq(0)");var r=n.css(t);return n.remove(),r}function i(e){$('link[href^="'+e+'"]').length||$('<link href="'+galaxy_config.root+e+'" rel="stylesheet">').appendTo("head")}function s(t,n){return t?e.defaults(t,n):n}function o(e,t){var n="";if(e>=1e11)e/=1e11,n="TB";else if(e>=1e8)e/=1e8,n="GB";else if(e>=1e5)e/=1e5,n="MB";else if(e>=100)e/=100,n="KB";else{if(!(e>0))return"<strong>-</strong>";e*=10,n="b"}var r=Math.round(e)/10;return t?r+" "+n:"<strong>"+r+"</strong> "+n}function u(){return(new Date).getTime().toString(36)}function a(e){var t=$("<p></p>");return t.append(e),t}function f(){var e=new Date,t=(e.getHours()<10?"0":"")+e.getHours(),n=(e.getMinutes()<10?"0":"")+e.getMinutes(),r=e.getDate()+"/"+(e.getMonth()+1)+"/"+e.getFullYear()+", "+t+":"+n;return r}return{cssLoadFile:i,cssGetAttribute:r,get:t,merge:s,bytesToString:o,uuid:u,time:f,wrap:a,request:n}}),define("mvc/ui/ui-modal",["utils/utils"],function(e){var t=Backbone.View.extend({elMain:"body",optionsDefault:{title:"ui-modal",body:"",backdrop:!0,height:null,width:null,closing_events:!1},buttonList:{},initialize:function(e){e&&this._create(e)},show:function(e){this.initialize(e),this.options.height?(this.$body.css("height",this.options.height),this.$body.css("overflow","hidden")):this.$body.css("max-height",$(window).height()/2),this.options.width&&this.$dialog.css("width",this.options.width),this.visible?this.$el.show():this.$el.fadeIn("fast"),this.visible=!0},hide:function(){this.visible=!1,this.$el.fadeOut("fast")},enableButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).prop("disabled",!1)},disableButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).prop("disabled",!0)},showButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).show()},hideButton:function(e){var t=this.buttonList[e];this.$buttons.find("#"+t).hide()},getButton:function(e){var t=this.buttonList[e];return this.$buttons.find("#"+t)},scrollTop:function(){return this.$body.scrollTop()},_create:function(e){var t=this;this.options=_.defaults(e,this.optionsDefault),this.options.body=="progress"&&(this.options.body=$('<div class="progress progress-striped active"><div class="progress-bar progress-bar-info" style="width:100%"></div></div>')),this.$el&&(this.$el.remove(),$(document).off("keyup.ui-modal")),this.setElement(this._template(this.options.title)),this.$dialog=this.$el.find(".modal-dialog"),this.$body=this.$el.find(".modal-body"),this.$footer=this.$el.find(".modal-footer"),this.$buttons=this.$el.find(".buttons"),this.$backdrop=this.$el.find(".modal-backdrop"),this.$body.html(this.options.body),this.options.backdrop||this.$backdrop.removeClass("in");if(this.options.buttons){this.buttonList={};var n=0;$.each(this.options.buttons,function(e,r){var i="button-"+n++;t.$buttons.append($('<button id="'+i+'"></button>').text(e).click(r)).append(" "),t.buttonList[e]=i})}else this.$footer.hide();$(this.elMain).append($(this.el)),this.options.closing_events&&($(document).on("keyup.ui-modal",function(e){e.keyCode==27&&t.hide()}),this.$el.find(".modal-backdrop").on("click",function(){t.hide()}))},_template:function(e){return'<div class="modal"><div class="modal-backdrop fade in" style="z-index: -1;"></div><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><button type="button" class="close" style="display: none;">×</button><h4 class="title">'+e+"</h4>"+"</div>"+'<div class="modal-body" style="position: static;"></div>'+'<div class="modal-footer">'+'<div class="buttons" style="float: right;"></div>'+"</div>"+"</div"+"</div>"+"</div>"}});return{View:t}}),define("mvc/ui/ui-portlet",["utils/utils"],function(e){var t=Backbone.View.extend({visible:!1,optionsDefault:{title:"",icon:"",buttons:null,body:null,height:null,operations:null,placement:"bottom",overflow:"auto"},$title:null,$content:null,$buttons:null,$operations:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.$content=this.$el.find("#content"),this.$title=this.$el.find("#title-text"),this.options.height&&(this.$el.find("#body").css("height",this.options.height),this.$el.find("#content").css("overflow",this.options.overflow)),this.$buttons=$(this.el).find("#buttons");if(this.options.buttons){var n=this;$.each(this.options.buttons,function(e,t){t.$el.prop("id",e),n.$buttons.append(t.$el)})}else this.$buttons.remove();this.$operations=$(this.el).find("#operations");if(this.options.operations){var n=this;$.each(this.options.operations,function(e,t){t.$el.prop("id",e),n.$operations.append(t.$el)})}this.options.body&&this.append(this.options.body)},append:function(t){this.$content.append(e.wrap(t))},content:function(){return this.$content},show:function(){this.$el.fadeIn("fast"),this.visible=!0},hide:function(){this.$el.fadeOut("fast"),this.visible=!1},enableButton:function(e){this.$buttons.find("#"+e).prop("disabled",!1)},disableButton:function(e){this.$buttons.find("#"+e).prop("disabled",!0)},hideOperation:function(e){this.$operations.find("#"+e).hide()},showOperation:function(e){this.$operations.find("#"+e).show()},setOperation:function(e,t){var n=this.$operations.find("#"+e);n.off("click"),n.on("click",t)},title:function(e){var t=this.$title;return e&&t.html(e),t.html()},_template:function(e){var t='<div class="toolForm portlet-view no-highlight">';if(e.title||e.icon)t+='<div id="title" class="toolFormTitle portlet-title"><div id="operations" class="portlet-operations"/><div style="overflow: hidden;">',e.icon&&(t+='<div class="portlet-title-icon fa '+e.icon+'"> </div>'),t+='<div id="title-text" class="portlet-title-text">'+e.title+"</div>",t+="</div></div>";return t+='<div id="body" class="toolFormBody portlet-body">',e.placement=="top"&&(t+='<div id="buttons" class="portlet-buttons"/>'),t+='<div id="content" class="portlet-content"/>',e.placement=="bottom"&&(t+='<div id="buttons" class="portlet-buttons"/>'),t+="</div></div>",t}});return{View:t}}),define("plugin/library/ui-select",["utils/utils"],function(e){var t=Backbone.View.extend({optionsDefault:{id:"",cls:"",empty:"No data available",visible:!0,wait:!1},selected:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.$select=this.$el.find("#select"),this.$icon=this.$el.find("#icon"),this.selected=this.options.value;var n=this;this.options.onchange&&this.$select.on("change",function(){n.value(n.$select.val())}),this._refresh(),this.options.visible||this.hide(),this.options.wait?this.wait():this.show()},value:function(e){var t=this.selected;e!==undefined&&(this.selected=e,this.$select.val(e));var n=this.selected;return n&&n!=t&&this.options.onchange&&this.options.onchange(n),n},text:function(){return this.$select.find("option:selected").text()},show:function(){this.$icon.removeClass(),this.$icon.addClass("fa fa-caret-down"),this.$select.show(),this.$el.show()},hide:function(){this.$el.hide()},wait:function(){this.$icon.removeClass(),this.$icon.addClass("fa fa-spinner fa-spin"),this.$select.hide()},disabled:function(){return this.$select.is(":disabled")},enable:function(){this.$select.prop("disabled",!1)},disable:function(){this.$select.prop("disabled",!0)},add:function(e){this.$select.append(this._templateOption(e)),this._refresh()},del:function(e){this.$select.find("option[value="+e+"]").remove(),this.$select.trigger("change"),this._refresh()},update:function(e){this.$select.find("option").remove();for(var t in e)this.$select.append(this._templateOption(e[t]));!this.selected&&e.length>0&&this.value(e[0].value),this._refresh()},_refresh:function(){this.$select.find("option[value=null]").remove();var e=this.$select.find("option").length;e==0?(this.$select.append(this._templateOption({value:"null",label:this.options.empty})),this.disable()):(this.enable(),this.selected&&this.$select.val(this.selected))},_exists:function(e){return 0!=this.$select.find("option[value="+e+"]").length},_templateOption:function(e){return'<option value="'+e.value+'">'+e.label+"</option>"},_template:function(e){var t='<div id="'+e.id+'" class="styled-select">'+'<div class="button">'+'<i id="icon"/>'+"</div>"+'<select id="select" class="select '+e.cls+" "+e.id+'">';for(key in e.data){var n=e.data[key],r="";if(n.value==e.value||n.value=="")r="selected";t+='<option value="'+n.value+'" '+r+">"+n.label+"</option>"}return t+="</select></div>",t}});return{View:t}}),define("plugin/library/ui",["utils/utils","plugin/library/ui-select"],function(e,t){var n=Backbone.View.extend({optionsDefault:{title:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options))},title:function(e){this.$el.find("b").html(e)},_template:function(e){return"<label><b>"+e.title+"</b></label>"},value:function(){return options.title}}),r=Backbone.View.extend({optionsDefault:{id:null,title:"","float":"right",cls:"btn-default",icon:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){var t='<button id="'+e.id+'" type="submit" style="margin-right: 5px; float: '+e.float+';" type="button" class="btn '+e.cls+'">';return e.icon&&(t+='<i class="icon fa '+e.icon+'"></i> '),t+=e.title+"</button>",t}}),i=Backbone.View.extend({optionsDefault:{"float":"right",icon:"",tooltip:"",placement:"bottom",title:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){return'<div><span class="fa '+e.icon+'" style="font-size: 1.2em;"/> '+e.title+"</div>"}}),s=Backbone.View.extend({optionsDefault:{title:"",id:null,"float":"right",cls:"icon-btn",icon:"",tooltip:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick),$(this.el).tooltip({title:t.tooltip,placement:"bottom"})},_template:function(e){var t="";e.title&&(t="width: auto;");var n='<div id="'+e.id+'" style="margin-right: 5px; float: '+e.float+"; "+t+'" class="'+e.cls+'">';return e.title?n+='<div style="margin-right: 5px; margin-left: 5px;"><i class="icon fa '+e.icon+'"/> '+'<span style="position: relative; font-size: 0.8em; font-weight: normal; top: -1px;">'+e.title+"</span>"+"</div>":n+='<i class="icon fa '+e.icon+'"/>',n+="</div>",n}}),o=Backbone.View.extend({optionsDefault:{title:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),$(this.el).on("click",t.onclick)},_template:function(e){return'<div><a href="javascript:void(0)">'+e.title+"</a></div>"}}),u=Backbone.View.extend({optionsDefault:{message:"",status:"info",persistent:!1},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement("<div></div>")},update:function(t){this.options=e.merge(t,this.optionsDefault);if(t.message!=""){this.$el.html(this._template(this.options)),this.$el.fadeIn();if(!t.persistent){var n=this;window.setTimeout(function(){n.$el.is(":visible")?n.$el.fadeOut():n.$el.hide()},3e3)}}else this.$el.fadeOut()},_template:function(e){return'<div class="alert alert-'+e.status+'" style="padding: 2px 2px 2px 10px;">'+e.message+"</div>"}}),a=Backbone.View.extend({optionsDefault:{onclick:null,searchword:""},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options));var n=this;this.options.onclick&&this.$el.on("submit",function(e){var t=n.$el.find("#search");n.options.onclick(t.val())})},_template:function(e){return'<div class="search"><form onsubmit="return false;"><input id="search" class="form-control input-sm" type="text" name="search" placeholder="Search..." value="'+e.searchword+'">'+'<button type="submit" class="btn search-btn">'+'<i class="fa fa-search"></i>'+"</button>"+"</form>"+"</div>"}}),f=Backbone.View.extend({optionsDefault:{title:"Unlabeled",body:null},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.body&&this.$el.find(".body").append(this.options.body)},_template:function(e){return'<div id="title" class="title">'+e.title+":"+"</div>"}}),l=Backbone.View.extend({optionsDefault:{id:"",title:"",target:"",href:"",onunload:null,onclick:null,visible:!0,icon:null,tag:""},$menu:null,initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement($(this._template(this.options)));var n=$(this.el).find(".root"),r=this;n.on("click",function(e){e.preventDefault(),r.options.onclick&&r.options.onclick()}),this.options.visible||this.hide()},show:function(){$(this.el).show()},hide:function(){$(this.el).hide()},addMenu:function(t){var n={title:"",target:"",href:"",onclick:null,divider:!1,icon:null};n=e.merge(t,n),this.$menu||($(this.el).append(this._templateMenu()),this.$menu=$(this.el).find(".menu"));var r=$(this._templateMenuItem(n));r.on("click",function(e){e.preventDefault(),n.onclick&&n.onclick()}),this.$menu.append(r),n.divider&&this.$menu.append($(this._templateDivider()))},_templateMenuItem:function(e){var t='<li><a href="'+e.href+'" target="'+e.target+'">';return e.icon&&(t+='<i class="fa '+e.icon+'"></i>'),t+=" "+e.title+"</a>"+"</li>",t},_templateMenu:function(){return'<ul class="menu dropdown-menu pull-right" role="menu"></ul>'},_templateDivider:function(){return'<li class="divider"></li>'},_template:function(e){var t='<div id="'+e.id+'" class="button-menu btn-group">'+'<button type="button" class="root btn btn-default dropdown-toggle" data-toggle="dropdown">';return e.icon&&(t+='<i class="fa '+e.icon+'"></i>'),"</button></div>",t}}),c=Backbone.View.extend({optionsDefault:{value:"",type:"text",placeholder:"",disabled:!1,visible:!0},initialize:function(t){this.options=e.merge(t,this.optionsDefault),this.setElement(this._template(this.options)),this.options.disabled&&this.$el.prop("disabled",!0),this.options.visible||this.$el.hide();var n=this;this.options.onchange&&this.$el.on("input",function(){n.options.onchange()})},value:function(e){return e!==undefined&&this.$el.val(e),this.$el.val()},_template:function(e){return'<input id="'+e.id+'" type="'+e.type+'" value="'+e.value+'" placeholder="'+e.placeholder+'" class="form-control">'}});return{Label:n,Button:r,Icon:i,ButtonIcon:s,Input:c,Anchor:o,Message:u,Searchbox:a,Title:f,Select:t,ButtonMenu:l}}),define("plugin/library/jobs",["utils/utils"],function(e){return Backbone.Model.extend({initialize:function(t,n){this.app=t,this.options=e.merge(n,this.optionsDefault)},cleanup:function(t){var n=t.get("dataset_id_job");if(n!=""){var r=this;e.request("PUT",config.root+"api/histories/none/contents/"+n,{deleted:!0},function(){r._refreshHdas()}),t.set("dataset_id_job","")}},submit:function(t,n,r,i,s){var o=this,u=t.id,a=t.get("type"),f=this.app.types.get(a);data={tool_id:"chartskit",inputs:{input:{id:t.get("dataset_id"),src:"hda"},module:a,columns:r,settings:n}},t.state("wait","Sending job request..."),e.request("POST",config.root+"api/tools",data,function(e){if(!e.outputs||e.outputs.length==0)t.state("failed","Job submission failed. No response."),s&&s();else{o._refreshHdas();var n=e.outputs[0];t.state("wait","Job has been queued..."),t.set("dataset_id_job",n.id),this.app.storage.save(),o._loop(n.id,function(e){switch(e.state){case"ok":return t.state("wait","Job completed successfully..."),i(e),!0;case"error":return t.state("failed","Job has failed. Please check the history for details."),s&&s(),!0;case"running":return t.state("wait","Job is running..."),!1}})}},function(e){var n="";e&&e.message&&e.message.data&&e.message.data.input&&(n=e.message.data.input+"."),t.state("failed","This visualization requires the Charts-Kit. Please make sure it is installed. "+n),s&&s()})},_loop:function(t,n){var r=this;e.request("GET",config.root+"api/datasets/"+t,{},function(e){n(e)||setTimeout(function(){r._loop(t,n)},r.app.config.get("query_timeout"))})},_refreshHdas:function(){Galaxy&&Galaxy.currHistoryPanel&&Galaxy.currHistoryPanel.refreshHdas()}})}),define("plugin/library/datasets",["utils/utils"],function(e){return Backbone.Collection.extend({list:{},initialize:function(t,n){this.app=t,this.options=e.merge(n,this.optionsDefault)},request:function(t,n,r){var i=this;if(t.groups)this._fetch(t,n);else{var s=this.list[t.id];if(s){n(s);return}e.request("GET",config.root+"api/datasets/"+t.id,{},function(e){switch(e.state){case"error":r&&r(e);break;default:i.list[t.id]=e,n(e)}})}},_fetch:function(t,n){var r=t.start?t.start:0,i=Math.abs(t.end-t.start),s=this.app.config.get("query_limit");if(!i||i>s)i=s;var o="",u={},a=0;for(var f in t.groups){var l=t.groups[f];for(var c in l.columns){var h=l.columns[c];o+=h+",",u[h]=a,a++}}if(a==0){n({});return}o=o.substring(0,o.length-1);var p=t.groups.slice(0);for(var f in p)p[f].values=[];var d=this;e.request("GET",config.root+"api/datasets/"+t.id,{data_type:"raw_data",provider:"dataset-column",limit:i,offset:r,indeces:o},function(e){for(var i in e.data){var s=e.data[i];for(var o in t.groups){var a=t.groups[o],f={x:parseInt(i)+r};for(var l in a.columns){var c=a.columns[l],h=u[c],d=s[h];if(isNaN(d)||!d)d=0;f[l]=d}p[o].values.push(f)}}n(p)})}})}),define("plugin/models/group",[],function(){return Backbone.Model.extend({defaults:{key:"Data label",date:""},reset:function(){this.clear({silent:!0}).set(this.defaults),this.trigger("reset",this)}})}),define("plugin/models/groups",["plugin/models/group"],function(e){return Backbone.Collection.extend({model:e})}),define("plugin/library/deferred",["utils/utils"],function(e){return Backbone.Model.extend({queue:[],process:{},counter:0,initialize:function(){this.on("refresh",function(){if(this.counter==0)for(var e in this.queue)this.queue[e](),this.queue.splice(e,1)})},execute:function(e){this.queue.push(e),this.trigger("refresh")},register:function(){var t=e.uuid();return this.process[t]=!0,this.counter++,console.debug("Deferred:register() - Registering "+t),t},done:function(e){delete this.process[e],this.counter--,console.debug("Deferred:done() - Unregistering "+e),this.trigger("refresh")},ready:function(){return this.counter==0?!0:!1}})});var Visualization=Backbone.Model.extend({defaults:{config:{}},urlRoot:function(){var e="/api/visualizations";return window.galaxy_config&&galaxy_config.root?galaxy_config.root+e:e},initialize:function(e){_.isObject(e.config)&&_.isObject(this.defaults.config)&&_.defaults(e.config,this.defaults.config),this._setUpListeners()},_setUpListeners:function(){},set:function(e,t){if(e==="config"){var n=this.get("config");_.isObject(n)&&(t=_.extend(_.clone(n),t))}return Backbone.Model.prototype.set.call(this,e,t),this},toString:function(){var e=this.get("id")||"";return this.get("title")&&(e+=":"+this.get("title")),"Visualization("+e+")"}}),VisualizationCollection=Backbone.Collection.extend({model:Visualization,url:function(){return galaxy_config.root+"api/visualizations"},initialize:function(e,t){t=t||{}},set:function(e,t){var n=this;e=_.map(e,function(e){var t=n.get(e.id);if(!t)return e;var r=t.toJSON();return _.extend(r,e),r}),Backbone.Collection.prototype.set.call(this,e,t)},toString:function(){return["VisualizationCollection(",[this.historyId,this.length].join(),")"].join("")}});define("mvc/visualization/visualization-model",function(){}),define("plugin/models/chart",["plugin/models/groups","plugin/library/deferred","mvc/visualization/visualization-model"],function(e,t){return Backbone.Model.extend({defaults:{id:null,title:"",type:"",date:null,state:"",state_info:"",modified:!1,dataset_id:"",dataset_id_job:""},initialize:function(n){this.groups=new e,this.settings=new Backbone.Model,this.deferred=new t},reset:function(){this.clear({silent:!0}).set(this.defaults),this.groups.reset(),this.settings.clear(),this.trigger("reset",this)},copy:function(e){var t=this;t.clear({silent:!0}).set(this.defaults),t.set(e.attributes),t.settings=e.settings.clone(),t.groups.reset(),e.groups.each(function(e){t.groups.add(e.clone())}),t.trigger("change",t)},state:function(e,t){this.set("state",e),this.set("state_info",t),this.trigger("set:state"),console.debug("Chart:state() - "+t+" ("+e+")")}})}),define("plugin/library/storage",["utils/utils","plugin/models/chart","plugin/models/group"],function(e,t,n){return Backbone.Model.extend({vis:null,initialize:function(e){this.app=e,this.chart=this.app.chart,this.options=this.app.options,this.id=this.options.id,this.vis=new Visualization({type:"charts",config:{dataset_id:this.options.config.dataset_id,chart_dict:{}}}),this.id&&(this.vis.id=this.id);var t=this.options.config.chart_dict;t&&(this.vis.get("config").chart_dict=t)},save:function(){var e=this.app.chart;this.vis.get("config").chart_dict={};var t=e.get("title");t!=""&&this.vis.set("title",t);var n={attributes:e.attributes,settings:e.settings.attributes,groups:[]};e.groups.each(function(e){n.groups.push(e.attributes)}),this.vis.get("config").chart_dict=n;var r=this;this.vis.save().fail(function(e,t,n){console.error(e,t,n)}).then(function(e){e&&e.id&&(r.id=e.id)})},load:function(){var e=this.vis.get("config").chart_dict;if(!e.attributes)return!1;this.chart.set(e.attributes),this.chart.state("ok","Loading saved visualization..."),this.chart.settings.set(e.settings);for(var t in e.groups)this.chart.groups.add(new n(e.groups[t]));return this.chart.set("modified",!1),!0}})}),define("plugin/views/viewport",["mvc/ui/ui-portlet","plugin/library/ui","utils/utils"],function(e,t,n){return Backbone.View.extend({initialize:function(e,t){this.app=e,this.chart=this.app.chart,this.options=n.merge(t,this.optionsDefault),this.setElement($(this._template())),this._create_svg();var r=this;this.chart.on("redraw",function(){r._draw(r.chart)}),this.chart.on("set:state",function(){var e=r.$el.find("#info"),t=e.find("#icon");t.removeClass(),e.show(),e.find("#text").html(r.chart.get("state_info"));var n=r.chart.get("state");switch(n){case"ok":e.hide();break;case"failed":t.addClass("fa fa-warning");break;default:t.addClass("fa fa-spinner fa-spin")}})},show:function(){this.$el.show()},hide:function(){this.$el.hide()},_create_svg:function(){this.svg&&this.svg.remove(),this.$el.append($(this._template_svg())),this.svg_el=this.$el.find("svg"),this.svg=d3.select(this.svg_el[0])},_draw:function(e){var t=this;this._create_svg(),e.state("wait","Please wait...");var n=e.deferred.register(),r=e.get("type"),i=this.app.types.get(r);if(!i.execute||i.execute&&e.get("modified"))this.app.jobs.cleanup(e),e.set("modified",!1);var t=this;require(["plugin/charts/"+r+"/"+r],function(r){var s=new r(t.app,{svg:t.svg});i.execute?e.get("dataset_id_job")==""?t.app.jobs.submit(e,t._defaultSettingsString(e),t._defaultRequestString(e),function(){s.draw(n,e,t._defaultRequestDictionary(e))},function(){e.deferred.done(n)}):s.draw(n,e,t._defaultRequestDictionary(e)):s.draw(n,e,t._defaultRequestDictionary(e))})},_defaultRequestString:function(e){var t=this.app.types.get(e.get("type")),n="",r=0;return e.groups.each(function(e){for(var i in t.columns)n+=i+"_"+ ++r+":"+(parseInt(e.get(i))+1)+", "}),n.substring(0,n.length-2)},_defaultSettingsString:function(e){var t="";for(key in e.settings.attributes)t+=key+":"+e.settings.get(key)+", ";return t.substring(0,t.length-2)},_defaultRequestDictionary:function(e){var t=this.app.types.get(e.get("type")),n={groups:[]};t.execute?n.id=e.get("dataset_id_job"):n.id=e.get("dataset_id");var r=0;return e.groups.each(function(e){var i={};for(var s in t.columns)i[s]=e.get(s);n.groups.push({key:++r+":"+e.get("key"),columns:i})}),n},_template:function(){return'<div style="height: 100%; min-height: 50px;"><div id="info" style="position: absolute; margin-left: 10px; margin-top: 10px; margin-bottom: 50px;"><span id="icon" style="font-size: 1.2em; display: inline-block;"/><span id="text" style="position: relative; margin-left: 5px; top: -1px; font-size: 1.0em;"/></div></div>'},_template_svg:function(){return'<svg style="height: calc(100% - 80px)"/>'}})}),define("plugin/views/viewer",["utils/utils","plugin/library/ui","mvc/ui/ui-portlet","plugin/models/group","plugin/views/viewport"],function(e,t,n,r,i){return Backbone.View.extend({initialize:function(e,r){this.app=e,this.chart=this.app.chart,this.viewport_view=new i(e);var s=this;this.portlet=new n.View({icon:"fa-bar-chart-o",title:"Viewport",operations:{edit_button:new t.ButtonIcon({icon:"fa-edit",tooltip:"Customize this chart",title:"Customize",onclick:function(){s._wait(s.chart,function(){s.app.go("editor")})}})}}),this.portlet.append(this.viewport_view.$el),this.setElement(this.portlet.$el);var s=this;this.chart.on("change:title",function(){s._refreshTitle()})},show:function(){this.$el.show(),$(window).trigger("resize")},hide:function(){this.$el.hide()},_refreshTitle:function(){var e=this.chart.get("title");this.portlet.title(e)},_screenshot:function(){var e=new XMLSerializer,t=e.serializeToString(this.viewport_view.svg.node()),n="data:image/svg+xml;base64,"+btoa(t);window.location.href="data:application/x-download/;charset=utf-8,"+encodeURIComponent(t)},_wait:function(e,t){if(e.deferred.ready())t();else{var n=this;this.app.modal.show({title:"Please wait!",body:"Your chart is currently being processed. Please wait and try again.",buttons:{Close:function(){n.app.modal.hide()},Retry:function(){n.app.modal.hide(),setTimeout(function(){n._wait(e,t)},n.app.config.get("query_timeout"))}}})}}})}),define("mvc/ui/ui-tabs",["utils/utils"],function(e){var t=Backbone.View.extend({visible:!1,list:{},$nav:null,$content:null,first_tab:null,optionsDefault:{title_new:"",operations:null,onnew:null},initialize:function(t){this.options=e.merge(t,this.optionsDefault);var n=$(this._template(this.options));this.$nav=n.find(".tab-navigation"),this.$content=n.find(".tab-content"),this.setElement(n),this.list={};var r=this;this.options.operations&&$.each(this.options.operations,function(e,t){t.$el.prop("id",e),r.$nav.find(".operations").append(t.$el)});if(this.options.onnew){var i=$(this._template_tab_new(this.options));this.$nav.append(i),i.tooltip({title:"Add a new tab",placement:"bottom",container:r.$el}),i.on("click",function(e){i.tooltip("hide"),r.options.onnew()})}},add:function(e){var t=e.id,n={$title:$(this._template_tab(e)),$content:$(this._template_tab_content(e)),removable:e.ondel?!0:!1};this.list[t]=n,this.options.onnew?this.$nav.find("#new-tab").before(n.$title):this.$nav.append(n.$title),n.$content.append(e.$el),this.$content.append(n.$content),_.size(this.list)==1&&(n.$title.addClass("active"),n.$content.addClass("active"),this.first_tab=t);if(e.ondel){var r=this,i=n.$title.find("#delete");i.tooltip({title:"Delete this tab",placement:"bottom",container:r.$el}),i.on("click",function(){return i.tooltip("destroy"),r.$el.find(".tooltip").remove(),e.ondel(),!1})}e.onclick&&n.$title.on("click",function(){e.onclick()})},del:function(e){var t=this.list[e];t.$title.remove(),t.$content.remove(),delete t,this.first_tab==e&&(this.first_tab=null),this.first_tab!=null&&this.show(this.first_tab)},delRemovable:function(){for(var e in this.list){var t=this.list[e];t.removable&&this.del(e)}},show:function(e){this.$el.fadeIn("fast"),this.visible=!0,e&&this.list[e].$title.find("a").tab("show")},hide:function(){this.$el.fadeOut("fast"),this.visible=!1},hideOperation:function(e){this.$nav.find("#"+e).hide()},showOperation:function(e){this.$nav.find("#"+e).show()},setOperation:function(e,t){var n=this.$nav.find("#"+e);n.off("click"),n.on("click",t)},title:function(e,t){var n=this.list[e].$title.find("#text");return t&&n.html(t),n.html()},_template:function(e){return'<div class="tabbable tabs-left"><ul class="tab-navigation nav nav-tabs"><div class="operations" style="float: right; margin-bottom: 4px;"></div></ul><div class="tab-content"/></div>'},_template_tab_new:function(e){return'<li id="new-tab"><a href="javascript:void(0);"><i style="font-size: 0.8em; margin-right: 5px;" class="fa fa-plus-circle"/>'+e.title_new+"</a>"+"</li>"},_template_tab:function(e){var t='<li id="title-'+e.id+'">'+'<a title="" href="#tab-'+e.id+'" data-toggle="tab" data-original-title="">'+'<span id="text">'+e.title+"</span>";return e.ondel&&(t+='<i id="delete" style="font-size: 0.8em; margin-left: 5px; cursor: pointer;" class="fa fa-minus-circle"/>'),t+="</a></li>",t},_template_tab_content:function(e){return'<div id="tab-'+e.id+'" class="tab-pane"/>'}});return{View:t}}),define("plugin/library/ui-table",["utils/utils"],function(e){var t=Backbone.View.extend({row:null,row_count:0,optionsDefault:{content:"No content available.",onchange:null,ondblclick:null,onconfirm:null},events:{click:"_onclick",dblclick:"_ondblclick"},first:!0,initialize:function(t){this.options=e.merge(t,this.optionsDefault);var n=$(this._template(t));this.$thead=n.find("thead"),this.$tbody=n.find("tbody"),this.$tmessage=n.find("tmessage"),this.setElement(n),this.row=$("<tr></tr>")},addHeader:function(e){var t=$("<th></th>");t.append(e),this.row.append(t)},appendHeader:function(){this.$thead.append(this.row),this.row=$("<tr></tr>")},add:function(e,t){var n=$("<td></td>");t&&n.css("width",t),n.append(e),this.row.append(n)},append:function(e){this._commit(e)},prepend:function(e){this._commit(e,!0)},remove:function(e){var t=this.$tbody.find("#"+e);t.length>0&&(t.remove(),this.row_count--,this._refresh())},removeAll:function(){this.$tbody.html(""),this.row_count=0,this._refresh()},value:function(e){this.before=this.$tbody.find(".current").attr("id"),e!==undefined&&(this.$tbody.find("tr").removeClass("current"),e&&this.$tbody.find("#"+e).addClass("current"));var t=this.$tbody.find(".current").attr("id");return t===undefined?null:(t!=this.before&&this.options.onchange&&this.options.onchange(e),t)},size:function(){return this.$tbody.find("tr").length},_commit:function(e,t){this.remove(e),this.row.attr("id",e),t?this.$tbody.prepend(this.row):this.$tbody.append(this.row),this.row=$("<tr></tr>"),this.row_count++,this._refresh()},_onclick:function(e){var t=this.value(),n=$(e.target).closest("tr").attr("id");n&&t!=n&&(this.options.onconfirm?this.options.onconfirm(n):this.value(n))},_ondblclick:function(e){var t=this.value();t&&this.options.ondblclick&&this.options.ondblclick(t)},_refresh:function(){this.row_count==0?this.$tmessage.show():this.$tmessage.hide()},_template:function(e){return'<div><table class="grid"><thead></thead><tbody style="cursor: pointer;"></tbody></table><tmessage>'+e.content+"</tmessage>"+"<div>"}});return{View:t}}),define("plugin/views/group",["plugin/library/ui-table","plugin/library/ui","utils/utils"],function(e,t,n){return Backbone.View.extend({columns:[],initialize:function(r,i){this.app=r;var s=this;this.chart=this.app.chart,this.group=i.group,this.group_key=new t.Input({placeholder:"Data label",onchange:function(){s.group.set("key",s.group_key.value())}}),this.table=new e.View({content:"No data column."});var o=$("<div/>");o.append(n.wrap((new t.Label({title:"Provide a label:"})).$el)),o.append(n.wrap(this.group_key.$el)),o.append(n.wrap((new t.Label({title:"Select columns:"})).$el)),o.append(n.wrap(this.table.$el)),this.setElement(o);var s=this;this.chart.on("change:dataset_id",function(){s._refreshTable()}),this.chart.on("change:type",function(){s._refreshTable()}),this.group.on("change:key",function(){s._refreshGroupKey()}),this.group.on("change",function(){s._refreshGroup()}),this._refreshTable(),this._refreshGroupKey(),this._refreshGroup()},_refreshTable:function(){var e=this.chart.get("dataset_id"),n=this.chart.get("type");if(!e||!n)return;var r=this,i=this.app.types.get(n);this.table.removeAll();var s={};for(var o in i.columns){var u=this.group.get(o);u||this.group.set(o,0);var a=i.columns[o],f=new t.Select.View({id:"select_"+o,gid:o,onchange:function(e){r.group.set(this.gid,e),r.chart.set("modified",!0)},value:u,wait:!0});this.table.add(a.title,"25%"),this.table.add(f.$el),this.table.append(o),s[o]=f}this.chart.state("wait","Loading metadata...");var l=this.chart.deferred.register();this.app.datasets.request({id:e},function(e){r.columns=[];var t=e.metadata_column_types;for(var n in t)(t[n]=="int"||t[n]=="float")&&r.columns.push({label:"Column: "+(parseInt(n)+1)+" ["+t[n]+"]",value:n});for(var n in s)s[n].update(r.columns),s[n].show();r.chart.state("wait","Metadata initialized..."),r.chart.deferred.done(l)})},_refreshGroup:function(){this.group.set("date",n.time())},_refreshGroupKey:function(){var e=this.group.get("key");e===undefined&&(e=""),this.group_key.value(e)}})}),define("plugin/library/ui-table-form",["plugin/library/ui-table","plugin/library/ui","utils/utils"],function(e,t,n){var r=Backbone.View.extend({list:[],initialize:function(r){this.table_title=new t.Label({title:r.title}),this.table=new e.View({content:r.content});var i=$("<div/>");i.append(n.wrap(this.table_title.$el)),i.append(n.wrap(this.table.$el)),this.setElement(i)},title:function(e){this.table_title.title(e)},update:function(e,t){this.table.removeAll(),this.list=[];for(var n in e)this._add(n,e[n],t);for(var n in this.list){var r=this.list[n].options.onchange;r&&r()}},_add:function(e,n,r){var i=this,s=null,o=n.type;switch(o){case"text":s=new t.Input({id:e,placeholder:n.placeholder,onchange:function(){r.set(e,s.value())}});break;case"select":s=new t.Select.View({id:e,data:n.data,onchange:function(){var t=s.value();r.set(e,t);var o=_.findWhere(n.data,{value:t});o&&(o.show&&i.$el.find("#"+o.show).fadeIn("fast"),o.hide&&i.$el.find("#"+o.hide).fadeOut("fast"))}});break;case"separator":s=$("<div/>");break;default:console.log("ui-table-form:_add","Unknown setting type ("+n.type+")");return}if(o!="separator"){r.get(e)||r.set(e,n.init),s.value(r.get(e)),this.list[e]=s;var u=$("<div/>");u.append(s.$el),u.append('<div class="toolParamHelp" style="font-size: 0.9em;">'+n.info+"</div>"),this.table.add('<span style="white-space: nowrap;">'+n.title+"</span>","25%"),this.table.add(u)}else this.table.add('<h6 style="white-space: nowrap;">'+n.title+":<h6/>"),this.table.add($("<div/>"));this.table.append(e)}});return{View:r}}),define("plugin/views/settings",["plugin/library/ui","plugin/library/ui-table-form","utils/utils"],function(e,t,n){return Backbone.View.extend({initialize:function(e,n){this.app=e;var r=this;this.chart=this.app.chart,this.form=new t.View({title:"Chart options:",content:"This chart type does not provide any options."}),this.setElement(this.form.$el);var r=this;this.chart.on("change",function(){r._refreshTable()})},_refreshTable:function(){var e=this.chart.get("type");if(!e)return;var t=this.app.types.get(e);this.form.title(t.title+":"),this.form.update(t.settings,this.chart.settings)}})}),define("plugin/views/editor",["mvc/ui/ui-tabs","plugin/library/ui-table","plugin/library/ui","mvc/ui/ui-portlet","utils/utils","plugin/models/chart","plugin/models/group","plugin/views/group","plugin/views/settings"],function(e,t,n,r,i,s,o,u,a){return Backbone.View.extend({optionsDefault:{header:!0,content:"No content available."},initialize:function(s,o){var u=this;this.app=s,this.chart=this.app.chart,this.options=i.merge(o,this.optionsDefault),this.portlet=new r.View({icon:"fa-bar-chart-o",title:"Editor",operations:{save:new n.ButtonIcon({icon:"fa-save",tooltip:"Draw Chart",title:"Draw",onclick:function(){u.app.go("viewer"),u._saveChart()}}),back:new n.ButtonIcon({icon:"fa-caret-left",tooltip:"Return to Viewer",title:"Return",onclick:function(){u.app.go("viewer"),u.app.storage.load()}})}}),this.table=new t.View({header:!1,onconfirm:function(e){u.chart.groups.length>0?u.app.modal.show({title:"Switching to another chart type?",body:"If you continue your settings and selections will be cleared.",buttons:{Cancel:function(){u.app.modal.hide()},Continue:function(){u.app.modal.hide(),u.table.value(e)}}}):u.table.value(e)},onchange:function(e){u.chart.groups.reset(),u.chart.settings.clear(),u.chart.set({type:e})},ondblclick:function(e){u.tabs.show("settings")},content:"No chart types available"});var f=0,l=s.types.attributes;for(var c in l){var h=l[c];this.table.add(++f+"."),h.execute?this.table.add(h.title+" (requires processing)"):this.table.add(h.title),this.table.append(c)}this.tabs=new e.View({title_new:"Add Data",onnew:function(){var e=u._addGroupModel();u.tabs.show(e.id)}}),this.title=new n.Input({placeholder:"Chart title",onchange:function(){u.chart.set("title",u.title.value())}});var p=$("<div/>");p.append(i.wrap((new n.Label({title:"Provide a chart title:"})).$el)),p.append(i.wrap(this.title.$el)),p.append(i.wrap((new n.Label({title:"Select a chart type:"})).$el)),p.append(i.wrap(this.table.$el)),this.tabs.add({id:"main",title:"Start",$el:p}),this.settings=new a(this.app),this.tabs.add({id:"settings",title:"Configuration",$el:this.settings.$el}),this.portlet.append(this.tabs.$el),this.setElement(this.portlet.$el),this.tabs.hideOperation("back");var u=this;this.chart.on("change:title",function(e){u._refreshTitle()}),this.chart.on("change:type",function(e){u.table.value(e.get("type"))}),this.chart.on("reset",function(e){u._resetChart()}),this.app.chart.on("redraw",function(e){u.portlet.showOperation("back")}),this.app.chart.groups.on("add",function(e){u._addGroup(e)}),this.app.chart.groups.on("remove",function(e){u._removeGroup(e)}),this.app.chart.groups.on("reset",function(e){u._removeAllGroups()}),this.app.chart.groups.on("change:key",function(e){u._refreshGroupKey()}),this._resetChart()},show:function(){this.$el.show()},hide:function(){this.$el.hide()},_refreshTitle:function(){var e=this.chart.get("title");this.portlet.title(e),this.title.value(e)},_refreshGroupKey:function(){var e=this,t=0;this.chart.groups.each(function(n){var r=n.get("key","");r==""&&(r="Chart data"),e.tabs.title(n.id,++t+": "+r)})},_addGroupModel:function(){var e=new o({id:i.uuid()});return this.chart.groups.add(e),e},_addGroup:function(e){var t=this,n=new u(this.app,{group:e}),r=t.chart.groups.length;this.tabs.add({id:e.id,$el:n.$el,ondel:function(){t.chart.groups.remove(e.id)}}),this._refreshGroupKey()},_removeGroup:function(e){this.tabs.del(e.id),this._refreshGroupKey(),this.chart.set("modified",!0)},_removeAllGroups:function(e){this.tabs.delRemovable()},_resetChart:function(){this.chart.set("id",i.uuid()),this.chart.set("type","bardiagram"),this.chart.set("dataset_id",this.app.options.config.dataset_id),this.chart.set("title","New Chart"),this.portlet.hideOperation("back")},_saveChart:function(){this.chart.set({type:this.table.value(),title:this.title.value(),date:i.time()}),this.chart.groups.length==0&&this._addGroupModel();var e=this;this.chart.deferred.execute(function(){e.app.storage.save(),e.chart.trigger("redraw")})}})}),define("plugin/models/config",[],function(){return Backbone.Model.extend({defaults:{query_limit:1e3,query_timeout:500}})}),define("plugin/charts/_nvd3/config",[],function(){return{title:"",columns:{y:{title:"Values for y-axis"}},settings:{separator_label:{title:"X axis",type:"separator"},x_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"X-axis",placeholder:"Axis label"},x_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:"x_axis_tick"},{label:"Auto",value:"auto",hide:"x_axis_tick"},{label:"Float",value:"f",show:"x_axis_tick"},{label:"Exponent",value:"e",show:"x_axis_tick"},{label:"Integer",value:"d",hide:"x_axis_tick"},{label:"Percentage",value:"p",show:"x_axis_tick"},{label:"Rounded",value:"r",show:"x_axis_tick"},{label:"SI-prefix",value:"s",show:"x_axis_tick"}]},x_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},separator_tick:{title:"Y axis",type:"separator"},y_axis_label:{title:"Axis label",info:"Provide a label for the axis.",type:"text",init:"Y-axis",placeholder:"Axis label"},y_axis_type:{title:"Axis value type",info:"Select the value type of the axis.",type:"select",init:"auto",data:[{label:"-- Do not show values --",value:"hide",hide:"y_axis_tick"},{label:"Auto",value:"auto",hide:"y_axis_tick"},{label:"Float",value:"f",show:"y_axis_tick"},{label:"Exponent",value:"e",show:"y_axis_tick"},{label:"Integer",value:"d",hide:"y_axis_tick"},{label:"Percentage",value:"p",show:"y_axis_tick"},{label:"Rounded",value:"r",show:"y_axis_tick"},{label:"SI-prefix",value:"s",show:"y_axis_tick"}]},y_axis_tick:{title:"Axis tick format",info:"Select the tick format for the axis.",type:"select",init:".1",data:[{label:"0.00001",value:".5"},{label:"0.0001",value:".4"},{label:"0.001",value:".3"},{label:"0.01",value:".2"},{label:"0.1",value:".1"},{label:"1",value:"1"}]},separator_legend:{title:"Others",type:"separator"},show_legend:{title:"Show legend",info:"Would you like to add a legend?",type:"select",init:"true",data:[{label:"Yes",value:"true"},{label:"No",value:"false"}]}}}}),define("plugin/charts/bardiagram/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Bar diagram"})}),define("plugin/charts/histogram/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Histogram",execute:!0,columns:{y:{title:"Observations"}},settings:{x_axis_label:{init:"Breaks"},y_axis_label:{init:"Density"}}})}),define("plugin/charts/horizontal/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Bar diagram (horizontal)",settings:{x_axis_type:{init:"hide"}}})}),define("plugin/charts/line/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Line chart"})}),define("plugin/charts/linewithfocus/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Line with focus"})}),define("plugin/charts/piechart/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Pie chart"})}),define("plugin/charts/scatterplot/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Scatter plot",columns:{x:{title:"Values for x-axis"}}})}),define("plugin/charts/stackedarea/config",["plugin/charts/_nvd3/config"],function(e){return $.extend(!0,{},e,{title:"Stacked area"})}),define("plugin/charts/types",["plugin/charts/bardiagram/config","plugin/charts/histogram/config","plugin/charts/horizontal/config","plugin/charts/line/config","plugin/charts/linewithfocus/config","plugin/charts/piechart/config","plugin/charts/scatterplot/config","plugin/charts/stackedarea/config"],function(e,t,n,r,i,s,o,u){return Backbone.Model.extend({defaults:{bardiagram:e,horizontal:n,histogram:t,line:r,linewithfocus:i,piechart:s,scatterplot:o,stackedarea:u}})}),define("plugin/app",["mvc/ui/ui-modal","mvc/ui/ui-portlet","plugin/library/ui","utils/utils","plugin/library/jobs","plugin/library/datasets","plugin/library/storage","plugin/views/viewer","plugin/views/editor","plugin/models/config","plugin/models/chart","plugin/charts/types"],function(e,t,n,r,i,s,o,u,a,f,l,c){return Backbone.View.extend({initialize:function(t){this.options=t,Galaxy&&Galaxy.modal?this.modal=Galaxy.modal:this.modal=new e.View,this.config=new f,this.types=new c,this.chart=new l,this.jobs=new i(this),this.datasets=new s(this),this.storage=new o(this),this.viewer_view=new u(this),this.editor_view=new a(this),this.$el.append(this.viewer_view.$el),this.$el.append(this.editor_view.$el);if(!this.storage.load())this.go("editor");else{this.go("viewer");var n=this;this.chart.deferred.execute(function(){n.chart.trigger("redraw")})}},go:function(e){$(".tooltip").hide();switch(e){case"editor":this.editor_view.show(),this.viewer_view.hide();break;case"viewer":this.editor_view.hide(),this.viewer_view.show()}},execute:function(e){},onunload:function(){},log:function(e,t){console.log(e+" "+t)}})});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/_nvd3/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/_nvd3/config.js
@@ -0,0 +1,218 @@
+define([], function() {
+
+return {
+ title : '',
+ columns : {
+ y : {
+ title : 'Values for y-axis'
+ }
+ },
+ settings : {
+ separator_label : {
+ title : 'X axis',
+ type : 'separator'
+ },
+ x_axis_label : {
+ title : 'Axis label',
+ info : 'Provide a label for the axis.',
+ type : 'text',
+ init : 'X-axis',
+ placeholder : 'Axis label'
+ },
+ x_axis_type : {
+ title : 'Axis value type',
+ info : 'Select the value type of the axis.',
+ type : 'select',
+ init : 'auto',
+ data : [
+ {
+ label : '-- Do not show values --',
+ value : 'hide',
+ hide : 'x_axis_tick'
+ },
+ {
+ label : 'Auto',
+ value : 'auto',
+ hide : 'x_axis_tick'
+ },
+ {
+ label : 'Float',
+ value : 'f',
+ show : 'x_axis_tick'
+ },
+ {
+ label : 'Exponent',
+ value : 'e',
+ show : 'x_axis_tick'
+ },
+ {
+ label : 'Integer',
+ value : 'd',
+ hide : 'x_axis_tick'
+ },
+ {
+ label : 'Percentage',
+ value : 'p',
+ show : 'x_axis_tick'
+ },
+ {
+ label : 'Rounded',
+ value : 'r',
+ show : 'x_axis_tick'
+ },
+ {
+ label : 'SI-prefix',
+ value : 's',
+ show : 'x_axis_tick'
+ }
+ ]
+ },
+ x_axis_tick : {
+ title : 'Axis tick format',
+ info : 'Select the tick format for the axis.',
+ type : 'select',
+ init : '.1',
+ data : [
+ {
+ label : '0.00001',
+ value : '.5'
+ },
+ {
+ label : '0.0001',
+ value : '.4'
+ },
+ {
+ label : '0.001',
+ value : '.3'
+ },
+ {
+ label : '0.01',
+ value : '.2'
+ },
+ {
+ label : '0.1',
+ value : '.1'
+ },
+ {
+ label : '1',
+ value : '1'
+ }
+ ]
+
+ },
+ separator_tick : {
+ title : 'Y axis',
+ type : 'separator'
+ },
+ y_axis_label : {
+ title : 'Axis label',
+ info : 'Provide a label for the axis.',
+ type : 'text',
+ init : 'Y-axis',
+ placeholder : 'Axis label'
+ },
+ y_axis_type : {
+ title : 'Axis value type',
+ info : 'Select the value type of the axis.',
+ type : 'select',
+ init : 'auto',
+ data : [
+ {
+ label : '-- Do not show values --',
+ value : 'hide',
+ hide : 'y_axis_tick'
+ },
+ {
+ label : 'Auto',
+ value : 'auto',
+ hide : 'y_axis_tick'
+ },
+ {
+ label : 'Float',
+ value : 'f',
+ show : 'y_axis_tick'
+ },
+ {
+ label : 'Exponent',
+ value : 'e',
+ show : 'y_axis_tick'
+ },
+ {
+ label : 'Integer',
+ value : 'd',
+ hide : 'y_axis_tick'
+ },
+ {
+ label : 'Percentage',
+ value : 'p',
+ show : 'y_axis_tick'
+ },
+ {
+ label : 'Rounded',
+ value : 'r',
+ show : 'y_axis_tick'
+ },
+ {
+ label : 'SI-prefix',
+ value : 's',
+ show : 'y_axis_tick'
+ }
+ ]
+ },
+ y_axis_tick : {
+ title : 'Axis tick format',
+ info : 'Select the tick format for the axis.',
+ type : 'select',
+ init : '.1',
+ data : [
+ {
+ label : '0.00001',
+ value : '.5'
+ },
+ {
+ label : '0.0001',
+ value : '.4'
+ },
+ {
+ label : '0.001',
+ value : '.3'
+ },
+ {
+ label : '0.01',
+ value : '.2'
+ },
+ {
+ label : '0.1',
+ value : '.1'
+ },
+ {
+ label : '1',
+ value : '1'
+ }
+ ]
+
+ },
+ separator_legend : {
+ title : 'Others',
+ type : 'separator'
+ },
+ show_legend : {
+ title : 'Show legend',
+ info : 'Would you like to add a legend?',
+ type : 'select',
+ init : 'true',
+ data : [
+ {
+ label : 'Yes',
+ value : 'true'
+ },
+ {
+ label : 'No',
+ value : 'false'
+ }
+ ]
+ },
+ }
+};
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/_nvd3/nvd3.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/_nvd3/nvd3.js
@@ -0,0 +1,80 @@
+// dependencies
+define([], function() {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, nvd3_model, chart, request_dictionary, callback)
+ {
+ // request data
+ var self = this;
+ this.app.datasets.request(request_dictionary, function(data) {
+ nv.addGraph(function() {
+ // x axis
+ self._axis(nvd3_model.xAxis, chart.settings.get('x_axis_type'), chart.settings.get('x_axis_tick'));
+
+ // x axis label
+ nvd3_model.xAxis.axisLabel(chart.settings.get('x_axis_label'));
+
+ // y axis
+ self._axis(nvd3_model.yAxis, chart.settings.get('y_axis_type'), chart.settings.get('y_axis_tick'));
+
+ // y axis label
+ nvd3_model.yAxis.axisLabel(chart.settings.get('y_axis_label'))
+ .axisLabelDistance(30);
+
+ // controls
+ if (chart.groups.length == 1) {
+ nvd3_model.options({ showControls: false });
+ }
+
+ // legend
+ var legend_visible = true;
+ if (chart.settings.get('show_legend') == 'false') {
+ legend_visible = false;
+ }
+ nvd3_model.showLegend(legend_visible);
+
+ // custom callback
+ if (callback) {
+ callback(nvd3_model);
+ }
+
+ // parse data to svg
+ self.options.svg.datum(data)
+ .call(nvd3_model);
+
+ // refresh on window resize
+ nv.utils.windowResize(nvd3_model.update);
+
+ // set chart state
+ chart.state('ok', 'Chart has been drawn.');
+
+ // unregister process
+ chart.deferred.done(process_id);
+ });
+ });
+ },
+
+ // make axis
+ _axis: function(axis, type, tick) {
+ switch (type) {
+ case 'hide':
+ axis.tickFormat(function() { return '' });
+ break;
+ case 'auto':
+ break;
+ default:
+ axis.tickFormat(d3.format(tick + type));
+ }
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/bardiagram.js
--- a/config/plugins/visualizations/charts/static/charts/bardiagram.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// dependencies
-define([], function() {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- },
-
- // render
- refresh : function(data)
- {
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- self.d3_chart = nv.models.multiBarChart();
-
- self.d3_chart.xAxis.tickFormat(d3.format('.2f'))
- self.d3_chart.yAxis.tickFormat(d3.format('.1f'))
-
- d3.select(self.options.svg_id)
- .datum(data)
- .call(self.d3_chart);
-
- nv.utils.windowResize(self.d3_chart.update);
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/bardiagram/bardiagram.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/bardiagram/bardiagram.js
@@ -0,0 +1,21 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.multiBarChart(), chart, request_dictionary);
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/bardiagram/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/bardiagram/config.js
@@ -0,0 +1,7 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Bar diagram',
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/histogram/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/histogram/config.js
@@ -0,0 +1,21 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Histogram',
+ execute : true,
+ columns : {
+ y : {
+ title : 'Observations'
+ }
+ },
+ settings : {
+ x_axis_label : {
+ init : 'Breaks'
+ },
+ y_axis_label : {
+ init : 'Density'
+ }
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/histogram/histogram.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/histogram/histogram.js
@@ -0,0 +1,31 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ // configure request
+ var index = 0;
+ for (var i in request_dictionary.groups) {
+ var group = request_dictionary.groups[i];
+ group.columns = {
+ x: index++,
+ y: index++
+ }
+ }
+
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.multiBarChart(), chart, request_dictionary);
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/horizontal.js
--- a/config/plugins/visualizations/charts/static/charts/horizontal.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- this.chart = options.chart;
- },
-
- // render
- refresh : function(data)
- {
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- self.d3_chart = nv.models.multiBarHorizontalChart();
-
- self.d3_chart.xAxis.tickFormat(function() { return ''; });
-
- d3.select(self.options.svg_id)
- .datum(data)
- .call(self.d3_chart);
-
- nv.utils.windowResize(self.d3_chart.update);
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/horizontal/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/horizontal/config.js
@@ -0,0 +1,12 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Bar diagram (horizontal)',
+ settings : {
+ x_axis_type : {
+ init : 'hide'
+ }
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/horizontal/horizontal.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/horizontal/horizontal.js
@@ -0,0 +1,21 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.multiBarHorizontalChart(), chart, request_dictionary);
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/line.js
--- a/config/plugins/visualizations/charts/static/charts/line.js
+++ /dev/null
@@ -1,39 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- this.chart = options.chart;
- },
-
- // render
- refresh : function(data)
- {
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- self.chart_3d = nv.models.lineChart();
-
- self.chart_3d.xAxis
- .tickFormat(d3.format(',f'));
-
- self.chart_3d.yAxis
- .tickFormat(d3.format(',.2f'));
-
- d3.select(self.options.svg_id)
- .datum(data)
- .call(self.chart_3d);
-
- nv.utils.windowResize(self.chart_3d.update);
-
- return self.chart_3d;
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/line/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/line/config.js
@@ -0,0 +1,7 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Line chart',
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/line/line.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/line/line.js
@@ -0,0 +1,21 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.lineChart(), chart, request_dictionary);
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/linewithfocus.js
--- a/config/plugins/visualizations/charts/static/charts/linewithfocus.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- this.chart = options.chart;
- },
-
- // render
- refresh : function(data)
- {
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- self.chart_3d = nv.models.lineWithFocusChart();
-
- self.chart_3d.xAxis
- .tickFormat(d3.format(',f'));
-
- self.chart_3d.yAxis
- .tickFormat(d3.format(',.2f'));
-
- d3.select(self.options.svg_id)
- .datum(data)
- .call(self.chart_3d);
-
- nv.utils.windowResize(self.chart_3d.update);
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/linewithfocus/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/linewithfocus/config.js
@@ -0,0 +1,7 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Line with focus',
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/linewithfocus/linewithfocus.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/linewithfocus/linewithfocus.js
@@ -0,0 +1,21 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.lineWithFocusChart(), chart, request_dictionary);
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/piechart.js
--- a/config/plugins/visualizations/charts/static/charts/piechart.js
+++ /dev/null
@@ -1,51 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- this.chart = options.chart;
- },
-
- // render
- refresh : function(data)
- {
- // loop through data groups
- for (var key in data) {
- // get group
- var group = data[key];
-
- // format chart data
- var pie_data = [];
- for (var key in group.values) {
- var value = group.values[key];
- pie_data.push ({
- key : value.x,
- y : value.y
- });
- }
-
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- self.chart_3d = nv.models.pieChart()
- .donut(true)
- .showLegend(false);
-
- d3.select(self.options.svg_id)
- .datum(pie_data)
- .call(self.chart_3d);
-
- nv.utils.windowResize(self.chart_3d.update);
-
- return self.chart_3d;
- });
- }
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/piechart/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/piechart/config.js
@@ -0,0 +1,7 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Pie chart',
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/piechart/piechart.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/piechart/piechart.js
@@ -0,0 +1,57 @@
+// dependencies
+define(['utils/utils'], function(Utils) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ // request data
+ var self = this;
+ this.app.datasets.request(request_dictionary, function(data) {
+
+ // loop through data groups
+ for (var key in request_dictionary.groups) {
+ // get group
+ var group = request_dictionary.groups[key];
+
+ // format chart data
+ var pie_data = [];
+ for (var key in group.values) {
+ var value = group.values[key];
+ pie_data.push ({
+ key : value.x,
+ y : value.y
+ });
+ }
+
+ // add graph to screen
+ nv.addGraph(function() {
+ self.chart_3d = nv.models.pieChart()
+ .donut(true)
+ .showLegend(false);
+
+ self.options.svg.datum(pie_data)
+ .call(self.chart_3d);
+
+ nv.utils.windowResize(self.chart_3d.update);
+
+ // set chart state
+ chart.state('ok', 'Pie chart drawn.');
+
+ // unregister process
+ chart.deferred.done(process_id);
+ });
+ }
+ });
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/scatterplot.js
--- a/config/plugins/visualizations/charts/static/charts/scatterplot.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- this.chart = options.chart;
- },
-
- // render
- refresh : function(data)
- {
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- self.d3_chart = nv.models.scatterChart()
- .showDistX(true)
- .showDistY(true)
- .color(d3.scale.category10().range());
-
- self.d3_chart.xAxis.tickFormat(d3.format('.02f'))
- self.d3_chart.yAxis.tickFormat(d3.format('.02f'))
-
- d3.select(self.options.svg_id)
- .datum(data)
- .call(self.d3_chart);
-
- nv.utils.windowResize(self.d3_chart.update);
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/scatterplot/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/scatterplot/config.js
@@ -0,0 +1,12 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Scatter plot',
+ columns : {
+ x : {
+ title : 'Values for x-axis'
+ }
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/scatterplot/scatterplot.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/scatterplot/scatterplot.js
@@ -0,0 +1,25 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.scatterChart(), chart, request_dictionary, function(nvd3_model) {
+ nvd3_model.showDistX(true)
+ .showDistY(true)
+ .color(d3.scale.category10().range());
+ });
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/stackedarea.js
--- a/config/plugins/visualizations/charts/static/charts/stackedarea.js
+++ /dev/null
@@ -1,59 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// widget
-return Backbone.View.extend(
-{
- // initialize
- initialize: function(app, options) {
- this.app = app;
- this.options = options;
- this.chart = options.chart;
- },
-
- // render
- refresh : function(data)
- {
- // add graph to screen
- var self = this;
- nv.addGraph(function() {
- // check data
- var valid = true;
- var length = 0;
- for (var key in data) {
- // evalute length
- if (length == 0) {
- length = data[key].values.length;
- } else {
- if (length != data[key].values.length) {
- valid = false;
- break;
- }
- }
- }
- if (!valid) {
- return;
- }
-
- // make plot
- self.d3_chart = nv.models.stackedAreaChart()
- .x(function(d) {
- return d.x
- })
- .y(function(d) {
- return d.y
- })
- .clipEdge(true);
-
- self.d3_chart.xAxis.tickFormat(function() { return ''; });
-
- d3.select(self.options.svg_id)
- .datum(data)
- .call(self.d3_chart);
-
- nv.utils.windowResize(self.d3_chart.update);
- });
- }
-});
-
-});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/stackedarea/config.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/stackedarea/config.js
@@ -0,0 +1,7 @@
+define(['plugin/charts/_nvd3/config'], function(nvd3_config) {
+
+return $.extend(true, {}, nvd3_config, {
+ title : 'Stacked area'
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/stackedarea/stackedarea.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/stackedarea/stackedarea.js
@@ -0,0 +1,26 @@
+// dependencies
+define(['plugin/charts/_nvd3/nvd3'], function(NVD3) {
+
+// widget
+return Backbone.View.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ this.app = app;
+ this.options = options;
+ },
+
+ // render
+ draw : function(process_id, chart, request_dictionary)
+ {
+ var nvd3 = new NVD3(this.app, this.options);
+ nvd3.draw(process_id, nv.models.stackedAreaChart(), chart, request_dictionary, function(nvd3_model) {
+ // make plot
+ nvd3_model.x(function(d) { return d.x })
+ .y(function(d) { return d.y })
+ .clipEdge(true);
+ });
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/charts/types.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/charts/types.js
@@ -0,0 +1,39 @@
+// dependencies
+define(['plugin/charts/bardiagram/config',
+ //'plugin/charts/boxplot/config',
+ 'plugin/charts/histogram/config',
+ 'plugin/charts/horizontal/config',
+ 'plugin/charts/line/config',
+ 'plugin/charts/linewithfocus/config',
+ 'plugin/charts/piechart/config',
+ 'plugin/charts/scatterplot/config',
+ 'plugin/charts/stackedarea/config',
+ ], function(bardiagram,
+ //boxplot,
+ histogram,
+ horizontal,
+ line,
+ linewithfocus,
+ piechart,
+ scatterplot,
+ stackedarea
+ ) {
+
+// widget
+return Backbone.Model.extend(
+{
+ // types
+ defaults: {
+ 'bardiagram' : bardiagram,
+ //'boxplot' : boxplot,
+ 'horizontal' : horizontal,
+ 'histogram' : histogram,
+ 'line' : line,
+ 'linewithfocus' : linewithfocus,
+ 'piechart' : piechart,
+ 'scatterplot' : scatterplot,
+ 'stackedarea' : stackedarea
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/library/datasets.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/library/datasets.js
@@ -0,0 +1,149 @@
+// dependencies
+define(['utils/utils'], function(Utils) {
+
+// widget
+return Backbone.Collection.extend(
+{
+ // list of datasets
+ list: {},
+
+ // initialize
+ initialize: function(app, options)
+ {
+ // link app
+ this.app = app;
+
+ // configure options
+ this.options = Utils.merge(options, this.optionsDefault);
+ },
+
+ // wait
+ request: function(options, success, error) {
+ // link this
+ var self = this;
+
+ // check if column data is requested
+ if (options.groups) {
+ this._fetch(options, success);
+ } else {
+ // check if dataset is available from cache
+ var dataset = this.list[options.id];
+ if (dataset) {
+ success(dataset);
+ return;
+ }
+
+ // request dataset
+ Utils.request('GET', config.root + 'api/datasets/' + options.id, {}, function(dataset) {
+ switch (dataset.state) {
+ case 'error':
+ if (error) {
+ error(dataset);
+ }
+ break;
+ default:
+ self.list[options.id] = dataset;
+ success(dataset);
+ }
+ });
+ }
+ },
+
+ // fetch data columns into dataset object
+ _fetch: function(options, callback) {
+ // set offset
+ var offset = options.start ? options.start : 0;
+
+ // set limit
+ var limit = Math.abs(options.end - options.start);
+ var query_limit = this.app.config.get('query_limit');
+ if (!limit || limit > query_limit) {
+ limit = query_limit;
+ }
+
+ // get column indices
+ var index_string = '';
+ var index_map = {};
+ var index_count = 0;
+ for (var i in options.groups) {
+ var group = options.groups[i];
+ for (var key in group.columns) {
+ var column = group.columns[key];
+
+ // add to index string
+ index_string += column + ',';
+
+ // add to dictionary
+ index_map[column] = index_count;
+
+ // increase counter
+ index_count++;
+ }
+ }
+ if (index_count == 0) {
+ callback({});
+ return;
+ }
+ index_string = index_string.substring(0, index_string.length - 1);
+
+ // initialize result dictionary
+ var result = options.groups.slice(0);
+ for (var i in result) {
+ result[i].values = [];
+ }
+
+ // make request
+ var self = this;
+ Utils.request('GET', config.root + 'api/datasets/' + options.id, {
+ data_type : 'raw_data',
+ provider : 'dataset-column',
+ limit : limit,
+ offset : offset,
+ indeces : index_string
+ }, function(response) {
+
+ // loop through rows
+ for (var i in response.data) {
+ // get row
+ var row = response.data[i];
+
+ // collect all data into the defined groups
+ for (var j in options.groups) {
+ // get group
+ var group = options.groups[j];
+
+ // initialize value
+ var value = {
+ x : parseInt(i) + offset
+ };
+
+ // fill value
+ for (var key in group.columns) {
+ // get column
+ var column = group.columns[key];
+
+ // identify column
+ var index = index_map[column];
+
+ // read value from row
+ var v = row[index];
+ if(isNaN(v) || !v) {
+ v = 0;
+ }
+
+ // add value to dictionary
+ value[key] = v;
+ }
+
+ // add to result
+ result[j].values.push(value);
+ }
+ }
+
+ // callback
+ callback(result);
+ });
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/library/deferred.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/library/deferred.js
@@ -0,0 +1,85 @@
+// dependencies
+define(['utils/utils'], function(Utils) {
+
+// deferred process handler
+return Backbone.Model.extend(
+{
+ // queue
+ queue: [],
+
+ // list of currently registered processes
+ process: {},
+
+ // process counter
+ counter: 0,
+
+ // initialize
+ initialize: function()
+ {
+ // loop through queue and check states
+ this.on('refresh', function() {
+ if (this.counter == 0) {
+ for (var index in this.queue) {
+ // execute callback
+ this.queue[index]();
+
+ // remove callback
+ this.queue.splice(index, 1);
+ }
+ }
+ });
+ },
+
+ // executes callback once all processes are unregistered
+ execute: function(callback) {
+ // add wrapper to queue
+ this.queue.push(callback);
+
+ // trigger change
+ this.trigger('refresh');
+ },
+
+ // register process
+ register: function() {
+ // create unique id
+ var id = Utils.uuid();
+
+ // add process to queue
+ this.process[id] = true;
+
+ // increase process counter
+ this.counter++;
+
+ // log
+ console.debug('Deferred:register() - Registering ' + id);
+
+ // return unique id
+ return id;
+ },
+
+ // unregister process
+ done: function(id) {
+ // delete tag
+ delete this.process[id];
+
+ // decrease process counter
+ this.counter--;
+
+ // log
+ console.debug('Deferred:done() - Unregistering ' + id);
+
+ // trigger change
+ this.trigger('refresh');
+ },
+
+ // ready
+ ready: function() {
+ if (this.counter == 0) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/library/jobs.js
--- /dev/null
+++ b/config/plugins/visualizations/charts/static/library/jobs.js
@@ -0,0 +1,152 @@
+// dependencies
+define(['utils/utils'], function(Utils) {
+
+// widget
+return Backbone.Model.extend(
+{
+ // initialize
+ initialize: function(app, options) {
+ // link app
+ this.app = app;
+
+ // link options
+ this.options = Utils.merge(options, this.optionsDefault);
+ },
+
+ // clean
+ cleanup: function(chart) {
+ // cleanup previous dataset file
+ var previous = chart.get('dataset_id_job');
+ if (previous != '') {
+ var self = this;
+ Utils.request('PUT', config.root + 'api/histories/none/contents/' + previous, { deleted: true }, function() {
+ // update galaxy history
+ self._refreshHdas();
+ });
+
+ // reset id
+ chart.set('dataset_id_job', '');
+ }
+ },
+
+ // create job
+ submit: function(chart, settings_string, columns_string, success, error) {
+ // link this
+ var self = this;
+
+ // backup chart details
+ var chart_id = chart.id;
+ var chart_type = chart.get('type');
+
+ // get chart settings
+ var chart_settings = this.app.types.get(chart_type);
+
+ // configure tool
+ data = {
+ 'tool_id' : 'chartskit',
+ 'inputs' : {
+ 'input' : {
+ 'id' : chart.get('dataset_id'),
+ 'src' : 'hda'
+ },
+ 'module' : chart_type,
+ 'columns' : columns_string,
+ 'settings' : settings_string
+ }
+ }
+
+ // set chart state
+ chart.state('wait', 'Sending job request...');
+
+ // post job
+ Utils.request('POST', config.root + 'api/tools', data,
+ // success handler
+ function(response) {
+ if (!response.outputs || response.outputs.length == 0) {
+ chart.state('failed', 'Job submission failed. No response.');
+
+ // call error
+ error && error();
+ } else {
+ // update galaxy history
+ self._refreshHdas();
+
+ // get dataset
+ var job = response.outputs[0];
+
+ // check dataset
+ chart.state('wait', 'Job has been queued...');
+
+ // backup resulting dataset id
+ chart.set('dataset_id_job', job.id);
+
+ // save
+ this.app.storage.save();
+
+ // wait for job completion
+ self._loop(job.id, function(job) {
+ switch (job.state) {
+ case 'ok':
+ // update state
+ chart.state('wait', 'Job completed successfully...');
+
+ // execute success
+ success(job);
+
+ // stop loop
+ return true;
+ case 'error':
+ // update state
+ chart.state('failed', 'Job has failed. Please check the history for details.');
+
+ // call error
+ error && error();
+
+ // stop loop
+ return true;
+ case 'running':
+ // wait
+ chart.state('wait', 'Job is running...');
+
+ // continue loop
+ return false;
+ }
+ });
+ }
+ },
+ // error handler
+ function(response) {
+ var message = '';
+ if (response && response.message && response.message.data && response.message.data.input) {
+ message = response.message.data.input + '.';
+ }
+ // update state
+ chart.state('failed', 'This visualization requires the Charts-Kit. Please make sure it is installed. ' + message);
+
+ // call error
+ error && error();
+
+ }
+ );
+ },
+
+ // request job details
+ _loop: function(id, callback) {
+ var self = this;
+ Utils.request('GET', config.root + 'api/datasets/' + id, {}, function(job) {
+ if (!callback(job)) {
+ setTimeout(function() { self._loop(id, callback); }, self.app.config.get('query_timeout'));
+ }
+ });
+ },
+
+ // refresh history panel
+ _refreshHdas: function() {
+ // update galaxy history
+ if (Galaxy && Galaxy.currHistoryPanel) {
+ Galaxy.currHistoryPanel.refreshHdas();
+ }
+ }
+});
+
+});
\ No newline at end of file
diff -r 56be13c43a4e8c1ad391eab212982659e4845d94 -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc config/plugins/visualizations/charts/static/library/portlet.js
--- a/config/plugins/visualizations/charts/static/library/portlet.js
+++ /dev/null
@@ -1,171 +0,0 @@
-// dependencies
-define(['library/utils'], function(Utils) {
-
-// return
-return Backbone.View.extend(
-{
- // visibility
- visible: false,
-
- // defaults options
- optionsDefault: {
- label : '',
- icon : 'fa-tasks',
- buttons : null,
- body : null,
- height : null,
- operations : null,
- placement : 'bottom',
- overflow : 'auto'
- },
-
- // content
- $content : null,
-
- // initialize
- initialize : function(options) {
- // configure options
- this.options = Utils.merge(options, this.optionsDefault);
-
- // create new element
- this.setElement(this.template(this.options));
-
- // link content
- this.$content = this.$el.find('#content');
-
- // set content height
- if (this.options.height) {
- this.$el.find('#body').css('height', this.options.height);
- this.$el.find('#content').css('overflow', this.options.overflow);
- }
-
- // append buttons
- this.$buttons = $(this.el).find('#buttons');
- if (this.options.buttons) {
- // link functions
- var self = this;
- $.each(this.options.buttons, function(name, item) {
- item.$el.prop('id', name);
- self.$buttons.append(item.$el);
- });
- } else {
- this.$buttons.remove();
- }
-
- // append operations
- this.$operations = $(this.el).find('#operations');
- if (this.options.operations) {
- // link functions
- var self = this;
- $.each(this.options.operations, function(name, item) {
- item.$el.prop('id', name);
- self.$operations.append(item.$el);
- });
- }
-
- // add body
- if(this.options.body) {
- this.append(this.options.body);
- }
- },
-
- // append
- append: function($el) {
- this.$content.append(Utils.wrap($el));
- },
-
- // content
- content: function() {
- return this.$content;
- },
-
- // hide modal
- show: function(){
- // fade in
- this.$el.fadeIn('fast');
-
- // set flag
- this.visible = true;
- },
-
- // hide modal
- hide: function(){
- // fade out
- this.$el.fadeOut('fast');
-
- // set flag
- this.visible = false;
- },
-
- // enable buttons
- enableButton: function(id) {
- this.$buttons.find('#' + id).prop('disabled', false);
- },
-
- // disable buttons
- disableButton: function(id) {
- this.$buttons.find('#' + id).prop('disabled', true);
- },
-
- // enable operation
- hideOperation: function(id) {
- this.$operations.find('#' + id).hide();
- },
-
- // disable operation
- showOperation: function(id) {
- this.$operations.find('#' + id).show();
- },
-
- // set operation
- setOperation: function(id, callback) {
- var $el = this.$operations.find('#' + id);
- $el.off('click');
- $el.on('click', callback);
- },
-
- // label
- label: function(new_label) {
- var $el = this.$el.find('#label');
- if (new_label) {
- $el.html(new_label);
- }
- return $el.html();
- },
-
- // fill regular modal template
- template: function(options) {
- var tmpl = '<div class="toolForm">';
-
- if (options.label || options.icon) {
- tmpl += '<div id="title" class="toolFormTitle" style="overflow:hidden;">' +
- '<div id="operations" style="float: right;"></div>' +
- '<div style="overflow: hidden">';
-
- if (options.icon)
- tmpl += '<i style="padding-top: 3px; float: left; font-size: 1.2em" class="icon fa ' + options.icon + '"> </i>';
-
- tmpl += '<div id="label" style="padding-top: 2px; float: left;">' + options.label + '</div>';
-
- tmpl += '</div>' +
- '</div>';
- }
- tmpl += '<div id="body" class="toolFormBody">';
-
- if (options.placement == 'top') {
- tmpl += '<div id="buttons" class="buttons" style="height: 50px; padding: 10px;"></div>';
- }
-
- tmpl += '<div id="content" class="content" style="height: inherit; padding: 10px;"></div>';
-
- if (options.placement == 'bottom') {
- tmpl += '<div id="buttons" class="buttons" style="height: 50px; padding: 10px;"></div>';
- }
-
- tmpl += '</div>' +
- '</div>';
- return tmpl;
- }
-});
-
-});
This diff is so big that we needed to truncate the remainder.
https://bitbucket.org/galaxy/galaxy-central/commits/1ad62c772728/
Changeset: 1ad62c772728
Branch: stable
User: natefoo
Date: 2014-04-15 01:28:10
Summary: Added tag release_2014.04.14 for changeset 9e53251b0b7e
Affected #: 1 file
diff -r 9e53251b0b7e93b9563008a2b112f2e815a04bbc -r 1ad62c7727285084e46ee3572835483e34c551a5 .hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -6,3 +6,4 @@
1ae95b3aa98d1ccf15b243ac3ce6a895eb7efc53 release_2013.08.12
26f58e05aa1068761660681583821e21e6cbf7ab release_2013.11.04
5e605ed6069fe4c5ca9875e95e91b2713499e8ca release_2014.02.10
+9e53251b0b7e93b9563008a2b112f2e815a04bbc release_2014.04.14
https://bitbucket.org/galaxy/galaxy-central/commits/3b3365a39194/
Changeset: 3b3365a39194
User: natefoo
Date: 2014-04-15 01:28:45
Summary: Merge stable to default
Affected #: 1 file
diff -r 855b03513ca92f33be6d4da54afffadad294a9cc -r 3b3365a391944f848b403412f226ee9e5499c0d5 .hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -6,3 +6,4 @@
1ae95b3aa98d1ccf15b243ac3ce6a895eb7efc53 release_2013.08.12
26f58e05aa1068761660681583821e21e6cbf7ab release_2013.11.04
5e605ed6069fe4c5ca9875e95e91b2713499e8ca release_2014.02.10
+9e53251b0b7e93b9563008a2b112f2e815a04bbc release_2014.04.14
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Merged in hillrunner2008/galaxy-central (pull request #367)
by commits-noreply@bitbucket.org 14 Apr '14
by commits-noreply@bitbucket.org 14 Apr '14
14 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/855b03513ca9/
Changeset: 855b03513ca9
User: dan
Date: 2014-04-14 22:56:48
Summary: Merged in hillrunner2008/galaxy-central (pull request #367)
added support for the visualization of gtf file format in IGB
Affected #: 2 files
diff -r c2a2ce95501c9e1a3da2550ce963376a49449481 -r 855b03513ca92f33be6d4da54afffadad294a9cc datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample
+++ b/datatypes_conf.xml.sample
@@ -99,6 +99,7 @@
<datatype extension="gtf" type="galaxy.datatypes.interval:Gtf" display_in_upload="true"><converter file="gff_to_interval_index_converter.xml" target_datatype="interval_index"/><converter file="bed_gff_or_vcf_to_bigwig_converter.xml" target_datatype="bigwig"/>
+ <display file="igb/gtf.xml" /></datatype><datatype extension="toolshed.gz" type="galaxy.datatypes.binary:Binary" mimetype="multipart/x-gzip" subclass="True" /><datatype extension="h5" type="galaxy.datatypes.binary:Binary" mimetype="application/octet-stream" subclass="True" />
diff -r c2a2ce95501c9e1a3da2550ce963376a49449481 -r 855b03513ca92f33be6d4da54afffadad294a9cc display_applications/igb/gtf.xml
--- /dev/null
+++ b/display_applications/igb/gtf.xml
@@ -0,0 +1,17 @@
+<display id="igb_gtf" version="1.0.0" name="display in IGB">
+
+ <link id="View" name="View">
+ <url>$bioviz</url>
+ <param type="data" name="gtf_file_for_name" viewable="False"/>
+ <param type="template" name="niceName" viewable="False" strip="True">
+ #import re
+ #set nm=$gtf_file_for_name.name
+ ${re.sub('\W',"_",nm)}
+ </param>
+ <param type="data" name="gtf_file" url="${niceName}.gtf" strip_https="True" />
+
+ <param type="template" name="bioviz" strip="True" >
+ http://bioviz.org/igb/galaxy.html?version=${gtf_file.dbkey}&loadresidue…
+ </param>
+ </link>
+</display>
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/56dee1c67384/
Changeset: 56dee1c67384
User: dcnorris
Date: 2014-04-14 16:05:03
Summary: adding support for the visualization of gtf file format in IGB
Affected #: 2 files
diff -r 6ae3b10ec63e21b0df60f9428ab312ecad0e4e62 -r 56dee1c67384211bf4844a2798bf89dfb2e8cff8 datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample
+++ b/datatypes_conf.xml.sample
@@ -99,6 +99,7 @@
<datatype extension="gtf" type="galaxy.datatypes.interval:Gtf" display_in_upload="true"><converter file="gff_to_interval_index_converter.xml" target_datatype="interval_index"/><converter file="bed_gff_or_vcf_to_bigwig_converter.xml" target_datatype="bigwig"/>
+ <display file="igb/gtf.xml" /></datatype><datatype extension="toolshed.gz" type="galaxy.datatypes.binary:Binary" mimetype="multipart/x-gzip" subclass="True" /><datatype extension="h5" type="galaxy.datatypes.binary:Binary" mimetype="application/octet-stream" subclass="True" />
diff -r 6ae3b10ec63e21b0df60f9428ab312ecad0e4e62 -r 56dee1c67384211bf4844a2798bf89dfb2e8cff8 display_applications/igb/gtf.xml
--- /dev/null
+++ b/display_applications/igb/gtf.xml
@@ -0,0 +1,17 @@
+<display id="igb_gtf" version="1.0.0" name="display in IGB">
+
+ <link id="View" name="View">
+ <url>$bioviz</url>
+ <param type="data" name="gtf_file_for_name" viewable="False"/>
+ <param type="template" name="niceName" viewable="False" strip="True">
+ #import re
+ #set nm=$gtf_file_for_name.name
+ ${re.sub('\W',"_",nm)}
+ </param>
+ <param type="data" name="gtf_file" url="${niceName}.gtf" strip_https="True" />
+
+ <param type="template" name="bioviz" strip="True" >
+ http://bioviz.org/igb/galaxy.html?version=${gtf_file.dbkey}&loadresidue…
+ </param>
+ </link>
+</display>
\ No newline at end of file
https://bitbucket.org/galaxy/galaxy-central/commits/fe0335898665/
Changeset: fe0335898665
User: dcnorris
Date: 2014-04-14 22:43:49
Summary: converted tabs to spaces
Affected #: 2 files
diff -r 56dee1c67384211bf4844a2798bf89dfb2e8cff8 -r fe03358986651d3e4bac287cd69e77a925d05cb3 datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample
+++ b/datatypes_conf.xml.sample
@@ -99,7 +99,7 @@
<datatype extension="gtf" type="galaxy.datatypes.interval:Gtf" display_in_upload="true"><converter file="gff_to_interval_index_converter.xml" target_datatype="interval_index"/><converter file="bed_gff_or_vcf_to_bigwig_converter.xml" target_datatype="bigwig"/>
- <display file="igb/gtf.xml" />
+ <display file="igb/gtf.xml" /></datatype><datatype extension="toolshed.gz" type="galaxy.datatypes.binary:Binary" mimetype="multipart/x-gzip" subclass="True" /><datatype extension="h5" type="galaxy.datatypes.binary:Binary" mimetype="application/octet-stream" subclass="True" />
diff -r 56dee1c67384211bf4844a2798bf89dfb2e8cff8 -r fe03358986651d3e4bac287cd69e77a925d05cb3 display_applications/igb/gtf.xml
--- a/display_applications/igb/gtf.xml
+++ b/display_applications/igb/gtf.xml
@@ -1,17 +1,17 @@
<display id="igb_gtf" version="1.0.0" name="display in IGB">
- <link id="View" name="View">
- <url>$bioviz</url>
- <param type="data" name="gtf_file_for_name" viewable="False"/>
- <param type="template" name="niceName" viewable="False" strip="True">
- #import re
- #set nm=$gtf_file_for_name.name
- ${re.sub('\W',"_",nm)}
- </param>
- <param type="data" name="gtf_file" url="${niceName}.gtf" strip_https="True" />
-
- <param type="template" name="bioviz" strip="True" >
- http://bioviz.org/igb/galaxy.html?version=${gtf_file.dbkey}&loadresidue…
+ <link id="View" name="View">
+ <url>$bioviz</url>
+ <param type="data" name="gtf_file_for_name" viewable="False"/>
+ <param type="template" name="niceName" viewable="False" strip="True">
+ #import re
+ #set nm=$gtf_file_for_name.name
+ ${re.sub('\W',"_",nm)}
</param>
- </link>
+ <param type="data" name="gtf_file" url="${niceName}.gtf" strip_https="True" />
+
+ <param type="template" name="bioviz" strip="True" >
+ http://bioviz.org/igb/galaxy.html?version=${gtf_file.dbkey}&loadresidue…
+ </param>
+ </link></display>
\ No newline at end of file
https://bitbucket.org/galaxy/galaxy-central/commits/855b03513ca9/
Changeset: 855b03513ca9
User: dan
Date: 2014-04-14 22:56:48
Summary: Merged in hillrunner2008/galaxy-central (pull request #367)
added support for the visualization of gtf file format in IGB
Affected #: 2 files
diff -r c2a2ce95501c9e1a3da2550ce963376a49449481 -r 855b03513ca92f33be6d4da54afffadad294a9cc datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample
+++ b/datatypes_conf.xml.sample
@@ -99,6 +99,7 @@
<datatype extension="gtf" type="galaxy.datatypes.interval:Gtf" display_in_upload="true"><converter file="gff_to_interval_index_converter.xml" target_datatype="interval_index"/><converter file="bed_gff_or_vcf_to_bigwig_converter.xml" target_datatype="bigwig"/>
+ <display file="igb/gtf.xml" /></datatype><datatype extension="toolshed.gz" type="galaxy.datatypes.binary:Binary" mimetype="multipart/x-gzip" subclass="True" /><datatype extension="h5" type="galaxy.datatypes.binary:Binary" mimetype="application/octet-stream" subclass="True" />
diff -r c2a2ce95501c9e1a3da2550ce963376a49449481 -r 855b03513ca92f33be6d4da54afffadad294a9cc display_applications/igb/gtf.xml
--- /dev/null
+++ b/display_applications/igb/gtf.xml
@@ -0,0 +1,17 @@
+<display id="igb_gtf" version="1.0.0" name="display in IGB">
+
+ <link id="View" name="View">
+ <url>$bioviz</url>
+ <param type="data" name="gtf_file_for_name" viewable="False"/>
+ <param type="template" name="niceName" viewable="False" strip="True">
+ #import re
+ #set nm=$gtf_file_for_name.name
+ ${re.sub('\W',"_",nm)}
+ </param>
+ <param type="data" name="gtf_file" url="${niceName}.gtf" strip_https="True" />
+
+ <param type="template" name="bioviz" strip="True" >
+ http://bioviz.org/igb/galaxy.html?version=${gtf_file.dbkey}&loadresidue…
+ </param>
+ </link>
+</display>
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
14 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c2a2ce95501c/
Changeset: c2a2ce95501c
User: dan
Date: 2014-04-14 22:34:16
Summary: merge next stable
Affected #: 1 file
diff -r 12265c0cca1f20c5c87c909a4e6faaff089c70ee -r c2a2ce95501c9e1a3da2550ce963376a49449481 universe_wsgi.ini.sample
--- a/universe_wsgi.ini.sample
+++ b/universe_wsgi.ini.sample
@@ -708,14 +708,6 @@
# Enable enforcement of quotas. Quotas can be set from the Admin interface.
#enable_quotas = False
-# Enable a feature when running workflows. When enabled, default datasets
-# are selected for "Set at Runtime" inputs from the history such that the
-# same input will not be selected twice, unless there are more inputs than
-# compatible datasets in the history.
-# When False, the most recently added compatible item in the history will
-# be used for each "Set at Runtime" input, independent of others in the Workflow
-#enable_unique_workflow_defaults = False
-
# This option allows users to see the full path of datasets via the "View
# Details" option in the history. Administrators can always see this.
#expose_dataset_path = False
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Remove duplicated enable_unique_workflow_defaults from universe_wsgi.ini.sample.
by commits-noreply@bitbucket.org 14 Apr '14
by commits-noreply@bitbucket.org 14 Apr '14
14 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/1165a5a1221a/
Changeset: 1165a5a1221a
Branch: next-stable
User: dan
Date: 2014-04-14 22:33:57
Summary: Remove duplicated enable_unique_workflow_defaults from universe_wsgi.ini.sample.
Affected #: 1 file
diff -r 52f8e109315ae84a36999586d333e1758511477f -r 1165a5a1221ac538bcbfd4e046a33e5bbfb1106a universe_wsgi.ini.sample
--- a/universe_wsgi.ini.sample
+++ b/universe_wsgi.ini.sample
@@ -708,14 +708,6 @@
# Enable enforcement of quotas. Quotas can be set from the Admin interface.
#enable_quotas = False
-# Enable a feature when running workflows. When enabled, default datasets
-# are selected for "Set at Runtime" inputs from the history such that the
-# same input will not be selected twice, unless there are more inputs than
-# compatible datasets in the history.
-# When False, the most recently added compatible item in the history will
-# be used for each "Set at Runtime" input, independent of others in the Workflow
-#enable_unique_workflow_defaults = False
-
# This option allows users to see the full path of datasets via the "View
# Details" option in the history. Administrators can always see this.
#expose_dataset_path = False
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
14 Apr '14
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/12265c0cca1f/
Changeset: 12265c0cca1f
User: dan
Date: 2014-04-14 22:30:29
Summary: merge next stable
Affected #: 1 file
diff -r a48baeee4ff4014ea42a65adc73f3e5f6184f9a4 -r 12265c0cca1f20c5c87c909a4e6faaff089c70ee lib/galaxy/webapps/galaxy/controllers/tool_runner.py
--- a/lib/galaxy/webapps/galaxy/controllers/tool_runner.py
+++ b/lib/galaxy/webapps/galaxy/controllers/tool_runner.py
@@ -192,7 +192,12 @@
#This needs to be done recursively through grouping parameters
def rerun_callback( input, value, prefixed_name, prefixed_label ):
if isinstance( value, UnvalidatedValue ):
- return str( value )
+ try:
+ return input.to_html_value( value.value, trans.app )
+ except Exception, e:
+ # Need to determine when (if ever) the to_html_value call could fail.
+ log.debug( "Failed to use input.to_html_value to determine value of unvalidated parameter, defaulting to string: %s" % ( e ) )
+ return str( value )
if isinstance( input, DataToolParameter ):
if isinstance(value,list):
values = []
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0